Previous 199869 Revisions Next

r20481 Saturday 26th January, 2013 at 11:00:21 UTC by Curt Coder
(MESS) c64: Cleaned up input handling. Controllers are now connected using the slot interface, and by default a joystick in port 2 is present. [Curt Coder]
[src/mess/drivers]c64.c
[src/mess/includes]c64.h

trunk/src/mess/includes/c64.h
r20480r20481
66#include "emu.h"
77#include "cpu/m6502/m6510.h"
88#include "formats/cbm_snqk.h"
9#include "includes/cbm.h"
109#include "machine/c64exp.h"
1110#include "machine/c64user.h"
1211#include "machine/cbmiec.h"
r20480r20481
4948         m_user(*this, C64_USER_PORT_TAG),
5049         m_ram(*this, RAM_TAG),
5150         m_cassette(*this, PET_DATASSETTE_PORT_TAG),
52         m_special(*this, "SPECIAL"),
51         m_row0(*this, "ROW0"),
52         m_row1(*this, "ROW1"),
53         m_row2(*this, "ROW2"),
54         m_row3(*this, "ROW3"),
55         m_row4(*this, "ROW4"),
56         m_row5(*this, "ROW5"),
57         m_row6(*this, "ROW6"),
58         m_row7(*this, "ROW7"),
59         m_restore(*this, "RESTORE"),
60         m_lock(*this, "LOCK"),
5361         m_loram(1),
5462         m_hiram(1),
5563         m_charen(1),
r20480r20481
7886   required_device<c64_user_port_device> m_user;
7987   required_device<ram_device> m_ram;
8088   optional_device<pet_datassette_port_device> m_cassette;
81   required_ioport m_special;
89   optional_ioport m_row0;
90   optional_ioport m_row1;
91   optional_ioport m_row2;
92   optional_ioport m_row3;
93   optional_ioport m_row4;
94   optional_ioport m_row5;
95   optional_ioport m_row6;
96   optional_ioport m_row7;
97   optional_ioport m_restore;
98   optional_ioport m_lock;
8299
83100   virtual void machine_start();
84101   virtual void machine_reset();
r20480r20481
91108   DECLARE_READ8_MEMBER( read );
92109   DECLARE_WRITE8_MEMBER( write );
93110
94   INTERRUPT_GEN_MEMBER( frame_interrupt );
95111   DECLARE_READ8_MEMBER( vic_videoram_r );
96112   DECLARE_READ8_MEMBER( vic_colorram_r );
97113   DECLARE_WRITE_LINE_MEMBER( vic_irq_w );
r20480r20481
181197
182198   DECLARE_READ8_MEMBER( cpu_r );
183199   DECLARE_WRITE8_MEMBER( cpu_w );
200
201   DECLARE_READ8_MEMBER( cia1_pa_r );
202   DECLARE_READ8_MEMBER( cia1_pb_r );
184203};
185204
186205
trunk/src/mess/drivers/c64.c
r20480r20481
1010        - some CIA tests
1111
1212    - 64C PLA dump
13    - clean up inputs
1413    - Multiscreen crashes on boot
1514
1615        805A: lda  $01
r20480r20481
4746
4847void c64_state::check_interrupts()
4948{
50   int restore = BIT(m_special->read(), 7);
49   int restore = !BIT(m_restore->read_safe(0xff), 0);
5150
5251   int irq = m_cia1_irq || m_vic_irq || m_exp_irq;
5352   int nmi = m_cia2_irq || restore || m_exp_nmi;
r20480r20481
356355//-------------------------------------------------
357356
358357static INPUT_PORTS_START( c64 )
359   PORT_INCLUDE( common_cbm_keyboard )     // ROW0 -> ROW7
358   PORT_START( "ROW0" )
359   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Down Up") PORT_CODE(KEYCODE_RALT)        PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR(UCHAR_MAMEKEY(UP))
360   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3)                                    PORT_CHAR(UCHAR_MAMEKEY(F5))
361   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2)                                    PORT_CHAR(UCHAR_MAMEKEY(F3))
362   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1)                                    PORT_CHAR(UCHAR_MAMEKEY(F1))
363   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4)                                    PORT_CHAR(UCHAR_MAMEKEY(F7))
364   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Crsr Right Left") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
365   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER)             PORT_CHAR(13)
366   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("INST DEL") PORT_CODE(KEYCODE_BACKSPACE)       PORT_CHAR(8) PORT_CHAR(UCHAR_MAMEKEY(INSERT))
360367
361   PORT_INCLUDE( c64_special )             // SPECIAL
368   PORT_START( "ROW1" )
369   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Left)") PORT_CODE(KEYCODE_LSHIFT)      PORT_CHAR(UCHAR_SHIFT_1)
370   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E)         PORT_CHAR('E')
371   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S)         PORT_CHAR('S')
372   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z)         PORT_CHAR('Z')
373   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4)         PORT_CHAR('4') PORT_CHAR('$')
374   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A)         PORT_CHAR('A')
375   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W)         PORT_CHAR('W')
376   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3)         PORT_CHAR('3') PORT_CHAR('#')
362377
363   PORT_INCLUDE( c64_controls )            // CTRLSEL, JOY0, JOY1, PADDLE0 -> PADDLE3, TRACKX, TRACKY, LIGHTX, LIGHTY, OTHER
378   PORT_START( "ROW2" )
379   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X)         PORT_CHAR('X')
380   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T)         PORT_CHAR('T')
381   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F)         PORT_CHAR('F')
382   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C)         PORT_CHAR('C')
383   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6)         PORT_CHAR('6') PORT_CHAR('&')
384   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D)         PORT_CHAR('D')
385   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R)         PORT_CHAR('R')
386   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5)         PORT_CHAR('5') PORT_CHAR('%')
387
388   PORT_START( "ROW3" )
389   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V)         PORT_CHAR('V')
390   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U)         PORT_CHAR('U')
391   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H)         PORT_CHAR('H')
392   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B)         PORT_CHAR('B')
393   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8)         PORT_CHAR('8') PORT_CHAR('(')
394   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G)         PORT_CHAR('G')
395   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y)         PORT_CHAR('Y')
396   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7)         PORT_CHAR('7') PORT_CHAR('\'')
397
398   PORT_START( "ROW4" )
399   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N)         PORT_CHAR('N')
400   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O)         PORT_CHAR('O')
401   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K)         PORT_CHAR('K')
402   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M)         PORT_CHAR('M')
403   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0)         PORT_CHAR('0')
404   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J)         PORT_CHAR('J')
405   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I)         PORT_CHAR('I')
406   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9)         PORT_CHAR('9') PORT_CHAR(')')
407
408   PORT_START( "ROW5" )
409   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA)     PORT_CHAR(',') PORT_CHAR('<')
410   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@')
411   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON)     PORT_CHAR(':') PORT_CHAR('[')
412   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP)      PORT_CHAR('.') PORT_CHAR('>')
413   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS)    PORT_CHAR('-')
414   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L)         PORT_CHAR('L')
415   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P)         PORT_CHAR('P')
416   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS)     PORT_CHAR('+')
417
418   PORT_START( "ROW6" )
419   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH)                             PORT_CHAR('/') PORT_CHAR('?')
420   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x91  Pi") PORT_CODE(KEYCODE_DEL) PORT_CHAR(0x2191) PORT_CHAR(0x03C0)
421   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH)                         PORT_CHAR('=')
422   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Shift (Right)") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
423   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CLR HOME") PORT_CODE(KEYCODE_INSERT)      PORT_CHAR(UCHAR_MAMEKEY(HOME))
424   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE)                             PORT_CHAR(';') PORT_CHAR(']')
425   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE)                        PORT_CHAR('*')
426   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2)                        PORT_CHAR('\xA3')
427
428   PORT_START( "ROW7" )
429   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RUN STOP") PORT_CODE(KEYCODE_HOME)
430   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q)                                 PORT_CHAR('Q')
431   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CBM") PORT_CODE(KEYCODE_LALT)
432   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE)                             PORT_CHAR(' ')
433   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2)                                 PORT_CHAR('2') PORT_CHAR('"')
434   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB)                               PORT_CHAR(UCHAR_SHIFT_2)
435   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xE2\x86\x90") PORT_CODE(KEYCODE_TILDE)   PORT_CHAR(0x2190)
436   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1)                                 PORT_CHAR('1') PORT_CHAR('!')
437
438   PORT_START( "RESTORE" )
439   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESTORE") PORT_CODE(KEYCODE_PRTSCR)
440
441   PORT_START( "LOCK" )
442   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
364443INPUT_PORTS_END
365444
366445
r20480r20481
372451   PORT_INCLUDE( c64 )
373452
374453   PORT_MODIFY( "ROW5" )
375   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00E5) PORT_CHAR(0x00C5)
376   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON)                             PORT_CHAR(';') PORT_CHAR(']')
377   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS)                            PORT_CHAR('=')
378   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS)                             PORT_CHAR('-')
454   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00E5) PORT_CHAR(0x00C5)
455   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON)                             PORT_CHAR(';') PORT_CHAR(']')
456   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS)                            PORT_CHAR('=')
457   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS)                             PORT_CHAR('-')
379458
380459   PORT_MODIFY( "ROW6" )
381   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(0x00E4) PORT_CHAR(0x00C4)
382   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE)     PORT_CHAR(0x00F6) PORT_CHAR(0x00D6)
383   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE)                        PORT_CHAR('@')
384   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2)                        PORT_CHAR(':') PORT_CHAR('*')
460   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(0x00E4) PORT_CHAR(0x00C4)
461   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE)     PORT_CHAR(0x00F6) PORT_CHAR(0x00D6)
462   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE)                        PORT_CHAR('@')
463   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2)                        PORT_CHAR(':') PORT_CHAR('*')
385464INPUT_PORTS_END
386465
387466
r20480r20481
390469//-------------------------------------------------
391470
392471static INPUT_PORTS_START( c64gs )
393   PORT_INCLUDE( c64 )
394
395   // 2008 FP: This has to be cleaned up later
396   // C64gs should simply not scan these inputs
397   // as a temporary solution, we keep PeT IPT_UNUSED shortcut
398
399   PORT_MODIFY( "ROW0" ) // no keyboard
400   PORT_BIT (0xff, 0x00, IPT_UNUSED )
401   PORT_MODIFY( "ROW1" ) // no keyboard
402   PORT_BIT (0xff, 0x00, IPT_UNUSED )
403   PORT_MODIFY( "ROW2" ) // no keyboard
404   PORT_BIT (0xff, 0x00, IPT_UNUSED )
405   PORT_MODIFY( "ROW3" ) // no keyboard
406   PORT_BIT (0xff, 0x00, IPT_UNUSED )
407   PORT_MODIFY( "ROW4" ) // no keyboard
408   PORT_BIT (0xff, 0x00, IPT_UNUSED )
409   PORT_MODIFY( "ROW5" ) // no keyboard
410   PORT_BIT (0xff, 0x00, IPT_UNUSED )
411   PORT_MODIFY( "ROW6" ) // no keyboard
412   PORT_BIT (0xff, 0x00, IPT_UNUSED )
413   PORT_MODIFY( "ROW7" ) // no keyboard
414   PORT_BIT (0xff, 0x00, IPT_UNUSED )
415   PORT_MODIFY( "SPECIAL" ) // no keyboard
416   PORT_BIT (0xff, 0x00, IPT_UNUSED )
417472INPUT_PORTS_END
418473
419474
r20480r20481
426481//  vic2_interface vic_intf
427482//-------------------------------------------------
428483
429INTERRUPT_GEN_MEMBER( c64_state::frame_interrupt )
430{
431   check_interrupts();
432   cbm_common_interrupt(&device);
433}
434
435484WRITE_LINE_MEMBER( c64_state::vic_irq_w )
436485{
437486   m_vic_irq = state;
r20480r20481
517566
518567   */
519568
520   UINT8 cia0portb = m_cia1->pb_r();
569   UINT8 data = 0xff;
521570
522   return cbm_common_cia0_port_a_r(m_cia1, cia0portb);
571   // joystick
572   UINT8 joy_b = m_joy2->joy_r();
573
574   data &= (0xf0 | (joy_b & 0x0f));
575   data &= ~(!BIT(joy_b, 5) << 4);
576
577   // keyboard
578   UINT8 cia1_pb = m_cia1->pb_r();
579   UINT8 row[8] = { m_row0->read(), m_row1->read(), m_row2->read(), m_row3->read(),
580                m_row4->read(), m_row5->read(), m_row6->read(), m_row7->read() };
581   int lock = BIT(m_lock->read(), 0);
582   row[1] &= (lock << 7 | 0x7f);
583
584   for (int i = 0; i < 8; i++)
585   {
586      if (!BIT(cia1_pb, i))
587      {
588         if (!BIT(row[7], i)) data &= ~0x80;
589         if (!BIT(row[6], i)) data &= ~0x40;
590         if (!BIT(row[5], i)) data &= ~0x20;
591         if (!BIT(row[4], i)) data &= ~0x10;
592         if (!BIT(row[3], i)) data &= ~0x08;
593         if (!BIT(row[2], i)) data &= ~0x04;
594         if (!BIT(row[1], i)) data &= ~0x02;
595         if (!BIT(row[0], i)) data &= ~0x01;
596      }
597   }
598
599   return data;
523600}
524601
525602READ8_MEMBER( c64_state::cia1_pb_r )
r20480r20481
539616
540617   */
541618
542   UINT8 cia0porta = m_cia1->pa_r();
619   UINT8 data = 0xff;
543620
544   return cbm_common_cia0_port_b_r(m_cia1, cia0porta);
621   // joystick
622   UINT8 joy_a = m_joy1->joy_r();
623   
624   data &= (0xf0 | (joy_a & 0x0f));
625   data &= ~(!BIT(joy_a, 5) << 4);
626
627   // keyboard
628   UINT8 cia1_pa = m_cia1->pa_r();
629   UINT8 row[8] = { m_row0->read(), m_row1->read(), m_row2->read(), m_row3->read(),
630                m_row4->read(), m_row5->read(), m_row6->read(), m_row7->read() };
631   int lock = BIT(m_lock->read(), 0);
632   row[1] &= (lock << 7 | 0x7f);
633
634   if (!BIT(cia1_pa, 7)) data &= row[7];
635   if (!BIT(cia1_pa, 6)) data &= row[6];
636   if (!BIT(cia1_pa, 5)) data &= row[5];
637   if (!BIT(cia1_pa, 4)) data &= row[4];
638   if (!BIT(cia1_pa, 3)) data &= row[3];
639   if (!BIT(cia1_pa, 2)) data &= row[2];
640   if (!BIT(cia1_pa, 1)) data &= row[1];
641   if (!BIT(cia1_pa, 0)) data &= row[0];
642
643   return data;
545644}
546645
547646WRITE8_MEMBER( c64_state::cia1_pb_w )
r20480r20481
576675   DEVCB_DRIVER_MEMBER(c64_state, cia1_pb_w)
577676};
578677
678READ8_MEMBER( c64gs_state::cia1_pa_r )
679{
680   /*
579681
682       bit     description
683
684       PA0     JOY B0
685       PA1     JOY B1
686       PA2     JOY B2
687       PA3     JOY B3
688       PA4     BTNB
689       PA5     
690       PA6     
691       PA7     
692
693   */
694
695   UINT8 data = 0xff;
696
697   // joystick
698   UINT8 joy_b = m_joy2->joy_r();
699
700   data &= (0xf0 | (joy_b & 0x0f));
701   data &= ~(!BIT(joy_b, 5) << 4);
702
703   return data;
704}
705
706READ8_MEMBER( c64gs_state::cia1_pb_r )
707{
708   /*
709
710       bit     description
711
712       PB0     JOY A0
713       PB1     JOY A1
714       PB2     JOY A2
715       PB3     JOY A3
716       PB4     BTNA/_LP
717       PB5
718       PB6
719       PB7
720
721   */
722
723   UINT8 data = 0xff;
724
725   // joystick
726   UINT8 joy_a = m_joy1->joy_r();
727   
728   data &= (0xf0 | (joy_a & 0x0f));
729   data &= ~(!BIT(joy_a, 5) << 4);
730
731   return data;
732}
733
734static MOS6526_INTERFACE( c64gs_cia1_intf )
735{
736   DEVCB_DRIVER_LINE_MEMBER(c64_state, cia1_irq_w),
737   DEVCB_NULL,
738   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, sp1_w),
739   DEVCB_DEVICE_LINE_MEMBER(C64_USER_PORT_TAG, c64_user_port_device, cnt1_w),
740   DEVCB_DRIVER_MEMBER(c64gs_state, cia1_pa_r),
741   DEVCB_NULL,
742   DEVCB_DRIVER_MEMBER(c64gs_state, cia1_pb_r),
743   DEVCB_DRIVER_MEMBER(c64_state, cia1_pb_w)
744};
745
746
580747//-------------------------------------------------
581748//  MOS6526_INTERFACE( cia2_intf )
582749//-------------------------------------------------
r20480r20481
9201087
9211088void c64_state::machine_start()
9221089{
923   cbm_common_init();
924
9251090   // find memory regions
9261091   m_basic = memregion("basic")->base();
9271092   m_kernal = memregion("kernal")->base();
r20480r20481
10111176   MCFG_CPU_PROGRAM_MAP(c64_mem)
10121177   MCFG_M6510_PORT_CALLBACKS(READ8(c64_state, cpu_r), WRITE8(c64_state, cpu_w))
10131178   MCFG_M6510_PORT_PULLS(0x17, 0xc8)
1014   MCFG_CPU_VBLANK_INT_DRIVER(SCREEN_TAG, c64_state, frame_interrupt)
10151179   MCFG_QUANTUM_PERFECT_CPU(M6510_TAG)
10161180
10171181   // video hardware
r20480r20481
11121276   MCFG_CPU_PROGRAM_MAP(c64_mem)
11131277   MCFG_M6510_PORT_CALLBACKS(READ8(c64_state, cpu_r), WRITE8(c64_state, cpu_w))
11141278   MCFG_M6510_PORT_PULLS(0x17, 0xc8)
1115   MCFG_CPU_VBLANK_INT_DRIVER(SCREEN_TAG, c64_state, frame_interrupt)
11161279   MCFG_QUANTUM_PERFECT_CPU(M6510_TAG)
11171280
11181281   // video hardware
r20480r20481
11341297   MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
11351298   MCFG_CBM_IEC_ADD(iec_intf, "c1541")
11361299   MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
1137   MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL)
1300   MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL)
11381301   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6569_CLOCK, expansion_intf, c64_expansion_cards, NULL, NULL)
11391302   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
11401303
r20480r20481
11911354   MCFG_CPU_PROGRAM_MAP(c64_mem)
11921355   MCFG_M6510_PORT_CALLBACKS(READ8(c64gs_state, cpu_r), WRITE8(c64gs_state, cpu_w))
11931356   MCFG_M6510_PORT_PULLS(0x07, 0xc0)
1194
1195   MCFG_CPU_VBLANK_INT_DRIVER(SCREEN_TAG, c64_state, frame_interrupt)
11961357   MCFG_QUANTUM_PERFECT_CPU(M6510_TAG)
11971358
11981359   // video hardware
r20480r20481
12081369
12091370   // devices
12101371   MCFG_PLS100_ADD(PLA_TAG)
1211   MCFG_MOS6526_ADD(MOS6526_1_TAG, VIC6569_CLOCK, 50, cia1_intf)
1372   MCFG_MOS6526_ADD(MOS6526_1_TAG, VIC6569_CLOCK, 50, c64gs_cia1_intf)
12121373   MCFG_MOS6526_ADD(MOS6526_2_TAG, VIC6569_CLOCK, 50, cia2_intf)
12131374   MCFG_CBM_IEC_BUS_ADD(iec_intf)
12141375   MCFG_VCS_CONTROL_PORT_ADD(CONTROL1_TAG, vcs_control_port_devices, NULL, NULL)
1215   MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, NULL, NULL)
1376   MCFG_VCS_CONTROL_PORT_ADD(CONTROL2_TAG, vcs_control_port_devices, "joy", NULL)
12161377   MCFG_C64_EXPANSION_SLOT_ADD(C64_EXPANSION_SLOT_TAG, VIC6569_CLOCK, expansion_intf, c64_expansion_cards, NULL, NULL)
12171378   MCFG_C64_USER_PORT_ADD(C64_USER_PORT_TAG, user_intf, c64_user_port_cards, NULL, NULL)
12181379

Previous 199869 Revisions Next


© 1997-2024 The MAME Team