Previous 199869 Revisions Next

r17631 Tuesday 4th September, 2012 at 12:23:59 UTC by Curt Coder
m6502: Refactored the indexed read/write to use devcb, and fixed the peripheral port for plus4. (nw)
(MESS) apple3: Fixed the CPU interface. (nw)
(MESS) vic10: Refactored to use datassette slot interface. (nw)
[src/emu/cpu/m6502]m4510.c m6502.c m6502.h m6509.c m65ce02.c ops02.h ops4510.h
[src/mess/drivers]apple3.c c128.c c64.c plus4.c sbc6510.c vic10.c
[src/mess/includes]vic10.h
[src/mess/machine]c1551.c

trunk/src/emu/cpu/m6502/m4510.c
r17630r17631
148148   direct_read_data *direct;
149149   int    icount;
150150
151   read8_space_func rdmem_id;               /* readmem callback for indexed instructions */
152   write8_space_func wrmem_id;               /* writemem callback for indexed instructions */
151   devcb_resolved_read8 rdmem_id;               /* readmem callback for indexed instructions */
152   devcb_resolved_write8 wrmem_id;               /* writemem callback for indexed instructions */
153153
154154   UINT8    ddr;
155155   UINT8    port;
r17630r17631
184184#define M4510
185185#include "t65ce02.c"
186186
187static UINT8 default_rdmem_id(address_space *space, offs_t address)
188{
189   m4510_Regs *cpustate = get_safe_token(&space->device());
190   return space->read_byte(M4510_MEM(address));
191}
192static void default_wrmem_id(address_space *space, offs_t address, UINT8 data)
193{
194   m4510_Regs *cpustate = get_safe_token(&space->device());
195   space->write_byte(M4510_MEM(address), data);
196}
197
198187static CPU_INIT( m4510 )
199188{
200189   m4510_Regs *cpustate = get_safe_token(device);
201190   const m6502_interface *intf = (const m6502_interface *)device->static_config();
202191
203192   cpustate->interrupt_inhibit = 0;
204   cpustate->rdmem_id = default_rdmem_id;
205   cpustate->wrmem_id = default_wrmem_id;
206193   cpustate->irq_callback = irqcallback;
207194   cpustate->device = device;
208195   cpustate->space = device->space(AS_PROGRAM);
r17630r17631
210197
211198   if ( intf )
212199   {
213      if ( intf->read_indexed_func )
214         cpustate->rdmem_id = intf->read_indexed_func;
215
216      if ( intf->write_indexed_func )
217         cpustate->wrmem_id = intf->write_indexed_func;
218
200      cpustate->rdmem_id.resolve(intf->read_indexed_func, *device);
201      cpustate->wrmem_id.resolve(intf->write_indexed_func, *device);
219202      cpustate->in_port_func.resolve(intf->in_port_func, *device);
220203      cpustate->out_port_func.resolve(intf->out_port_func, *device);
221204   }
r17630r17631
223206   {
224207      devcb_read8 nullrcb = DEVCB_NULL;
225208      devcb_write8 nullwcb = DEVCB_NULL;
209
210      cpustate->rdmem_id.resolve(nullrcb, *device);
211      cpustate->wrmem_id.resolve(nullwcb, *device);
226212      cpustate->in_port_func.resolve(nullrcb, *device);
227213      cpustate->out_port_func.resolve(nullwcb, *device);
228214   }
trunk/src/emu/cpu/m6502/ops02.h
r17630r17631
6464
6565#define PPC cpustate->ppc.d
6666
67#define RDMEM_ID(a)      cpustate->rdmem_id(cpustate->space,a)
68#define WRMEM_ID(a,d)   cpustate->wrmem_id(cpustate->space,a,d)
67#define RDMEM_ID(a)      (cpustate->rdmem_id.isnull() ? cpustate->space->read_byte(a) : cpustate->rdmem_id(a))
68#define WRMEM_ID(a,d)   (cpustate->wrmem_id.isnull() ? cpustate->space->write_byte(a,d) : cpustate->wrmem_id(a,d))
6969
7070/***************************************************************
7171 *  RDOP    read an opcode
trunk/src/emu/cpu/m6502/m6502.c
r17630r17631
7676   int      int_occured;
7777   int      icount;
7878
79   read8_space_func rdmem_id;               /* readmem callback for indexed instructions */
80   write8_space_func wrmem_id;               /* writemem callback for indexed instructions */
79   devcb_resolved_read8 rdmem_id;               /* readmem callback for indexed instructions */
80   devcb_resolved_write8 wrmem_id;               /* writemem callback for indexed instructions */
8181
8282   UINT8    ddr;
8383   UINT8    port;
r17630r17631
105105   return (m6502_Regs *)downcast<legacy_cpu_device *>(device)->token();
106106}
107107
108static UINT8 default_rdmem_id(address_space *space, offs_t offset) { return space->read_byte(offset); }
109static void default_wdmem_id(address_space *space, offs_t offset, UINT8 data) { space->write_byte(offset, data); }
110
111108/***************************************************************
112109 * include the opcode macros, functions and tables
113110 ***************************************************************/
r17630r17631
144141   cpustate->direct = &cpustate->space->direct();
145142   cpustate->subtype = subtype;
146143   cpustate->insn = insn;
147   cpustate->rdmem_id = default_rdmem_id;
148   cpustate->wrmem_id = default_wdmem_id;
149144
150145   if ( intf )
151146   {
152      if ( intf->read_indexed_func )
153         cpustate->rdmem_id = intf->read_indexed_func;
154
155      if ( intf->write_indexed_func )
156         cpustate->wrmem_id = intf->write_indexed_func;
157
147      cpustate->rdmem_id.resolve(intf->read_indexed_func, *device);
148      cpustate->wrmem_id.resolve(intf->write_indexed_func, *device);
158149      cpustate->in_port_func.resolve(intf->in_port_func, *device);
159150      cpustate->out_port_func.resolve(intf->out_port_func, *device);
151     
160152      cpustate->pullup = intf->external_port_pullup;
161153      cpustate->pulldown = intf->external_port_pulldown;
162154   }
163155   else
164156   {
165      devcb_write8 nullcb = DEVCB_NULL;
166      cpustate->out_port_func.resolve(nullcb, *device);
157      devcb_read8 nullrcb = DEVCB_NULL;
158      devcb_write8 nullwcb = DEVCB_NULL;
159
160      cpustate->rdmem_id.resolve(nullrcb, *device);
161      cpustate->wrmem_id.resolve(nullwcb, *device);
162      cpustate->in_port_func.resolve(nullrcb, *device);
163      cpustate->out_port_func.resolve(nullwcb, *device);
164
167165      cpustate->pullup = 0;
168166      cpustate->pulldown = 0;
169167   }
r17630r17631
393391            UINT8 output = cpustate->port & cpustate->ddr;
394392            UINT8 pulldown = ~(cpustate->pulldown & ~cpustate->ddr);
395393
396            result = (input | mask | output) & pulldown;
394            result = (input | mask | output) & (input | pulldown);
397395         }
398396         break;
399397   }
trunk/src/emu/cpu/m6502/m6502.h
r17630r17631
5959typedef struct _m6502_interface m6502_interface;
6060struct _m6502_interface
6161{
62   read8_space_func      read_indexed_func;
63   write8_space_func      write_indexed_func;
62   devcb_read8            read_indexed_func;
63   devcb_write8         write_indexed_func;
6464   devcb_read8            in_port_func;
6565   devcb_write8         out_port_func;
6666   UINT8               external_port_pullup;
trunk/src/emu/cpu/m6502/ops4510.h
r17630r17631
5959            UINT8 op = RDOP();                        \
6060            (*cpustate->insn[op])(cpustate);                     \
6161  }
62
63#undef RDMEM_ID
64#undef WRMEM_ID
65#define RDMEM_ID(a)   (cpustate->rdmem_id.isnull() ? cpustate->space->read_byte(M4510_MEM(a)) : cpustate->rdmem_id(M4510_MEM(a)))
66#define WRMEM_ID(a,d) (cpustate->wrmem_id.isnull() ? cpustate->space->write_byte(M4510_MEM(a),d) : cpustate->wrmem_id(M4510_MEM(a),d))
trunk/src/emu/cpu/m6502/m6509.c
r17630r17631
8484
8585   int    icount;
8686
87   read8_space_func rdmem_id;               /* readmem callback for indexed instructions */
88   write8_space_func wrmem_id;               /* writemem callback for indexed instructions */
87   devcb_resolved_read8 rdmem_id;               /* readmem callback for indexed instructions */
88   devcb_resolved_write8 wrmem_id;               /* writemem callback for indexed instructions */
8989};
9090
9191INLINE m6509_Regs *get_safe_token(device_t *device)
r17630r17631
135135   AM_RANGE(0x00001, 0x00001) AM_MIRROR(0xF0000) AM_READWRITE_LEGACY(m6509_read_00001, m6509_write_00001)
136136ADDRESS_MAP_END
137137
138static UINT8 default_rdmem_id(address_space *space, offs_t address) { return space->read_byte(address); }
139static void default_wdmem_id(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); }
140
141138static CPU_INIT( m6509 )
142139{
143140   m6509_Regs *cpustate = get_safe_token(device);
144141   const m6502_interface *intf = (const m6502_interface *)device->static_config();
145142
146   cpustate->rdmem_id = default_rdmem_id;
147   cpustate->wrmem_id = default_wdmem_id;
148143   cpustate->irq_callback = irqcallback;
149144   cpustate->device = device;
150145   cpustate->space = device->space(AS_PROGRAM);
r17630r17631
152147
153148   if ( intf )
154149   {
155      if ( intf->read_indexed_func )
156         cpustate->rdmem_id = intf->read_indexed_func;
150      cpustate->rdmem_id.resolve(intf->read_indexed_func, *device);
151      cpustate->wrmem_id.resolve(intf->write_indexed_func, *device);
152   }
153   else
154   {
155      devcb_read8 nullrcb = DEVCB_NULL;
156      devcb_write8 nullwcb = DEVCB_NULL;
157157
158      if ( intf->write_indexed_func )
159         cpustate->wrmem_id = intf->write_indexed_func;
158      cpustate->rdmem_id.resolve(nullrcb, *device);
159      cpustate->wrmem_id.resolve(nullwcb, *device);     
160160   }
161161}
162162
trunk/src/emu/cpu/m6502/m65ce02.c
r17630r17631
7878   legacy_cpu_device *device;
7979   address_space *space;
8080   direct_read_data *direct;
81   read8_space_func rdmem_id;               /* readmem callback for indexed instructions */
82   write8_space_func wrmem_id;               /* writemem callback for indexed instructions */
81   devcb_resolved_read8 rdmem_id;               /* readmem callback for indexed instructions */
82   devcb_resolved_write8 wrmem_id;               /* writemem callback for indexed instructions */
8383};
8484
8585INLINE m65ce02_Regs *get_safe_token(device_t *device)
r17630r17631
9595
9696#include "t65ce02.c"
9797
98static UINT8 default_rdmem_id(address_space *space, offs_t address) { return space->read_byte(address); }
99static void default_wdmem_id(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); }
100
10198static CPU_INIT( m65ce02 )
10299{
103100   m65ce02_Regs *cpustate = get_safe_token(device);
104101   const m6502_interface *intf = (const m6502_interface *)device->static_config();
105102
106   cpustate->rdmem_id = default_rdmem_id;
107   cpustate->wrmem_id = default_wdmem_id;
108103   cpustate->irq_callback = irqcallback;
109104   cpustate->device = device;
110105   cpustate->space = device->space(AS_PROGRAM);
r17630r17631
112107
113108   if ( intf )
114109   {
115      if ( intf->read_indexed_func )
116         cpustate->rdmem_id = intf->read_indexed_func;
110      cpustate->rdmem_id.resolve(intf->read_indexed_func, *device);
111      cpustate->wrmem_id.resolve(intf->write_indexed_func, *device);
112   }
113   else
114   {
115      devcb_read8 nullrcb = DEVCB_NULL;
116      devcb_write8 nullwcb = DEVCB_NULL;
117117
118      if ( intf->write_indexed_func )
119         cpustate->wrmem_id = intf->write_indexed_func;
118      cpustate->rdmem_id.resolve(nullrcb, *device);
119      cpustate->wrmem_id.resolve(nullwcb, *device);
120120   }
121121}
122122
trunk/src/mess/machine/c1551.c
r17630r17631
7070
7171
7272//-------------------------------------------------
73//  m6502_interface m6510t_intf
73//  M6510_INTERFACE( cpu_intf )
7474//-------------------------------------------------
7575
7676READ8_MEMBER( c1551_device::port_r )
r17630r17631
131131   m_ga->ds_w((data >> 5) & 0x03);
132132}
133133
134static const m6502_interface m6510t_intf =
134static M6510_INTERFACE( cpu_intf )
135135{
136   NULL,         // read_indexed_func
137   NULL,         // write_indexed_func
136   DEVCB_NULL,         // read_indexed_func
137   DEVCB_NULL,         // write_indexed_func
138138   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c1551_device, port_r),
139   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c1551_device, port_w)
139   DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c1551_device, port_w),
140   0x00,
141   0x00
140142};
141143
142144
r17630r17631
406408static MACHINE_CONFIG_FRAGMENT( c1551 )
407409   MCFG_CPU_ADD(M6510T_TAG, M6510T, XTAL_16MHz/8)
408410   MCFG_CPU_PROGRAM_MAP(c1551_mem)
409   MCFG_CPU_CONFIG(m6510t_intf)
411   MCFG_CPU_CONFIG(cpu_intf)
410412   MCFG_QUANTUM_PERFECT_CPU(M6510T_TAG)
411413
412414   MCFG_PLS100_ADD(PLA_TAG)
trunk/src/mess/includes/vic10.h
r17630r17631
88#include "includes/cbm.h"
99#include "machine/6526cia.h"
1010#include "machine/cbmipt.h"
11#include "machine/petcass.h"
1112#include "machine/ram.h"
1213#include "sound/dac.h"
1314#include "sound/sid6581.h"
r17630r17631
3132        m_cia(*this, MOS6526_TAG),
3233        m_exp(*this, VIC10_EXPANSION_SLOT_TAG),
3334        m_ram(*this, RAM_TAG),
34        m_cassette(*this, CASSETTE_TAG),
35        m_cassette_timer(*this, TIMER_C1531_TAG),
35        m_cassette(*this, PET_DATASSETTE_PORT_TAG),
3636        m_cia_irq(CLEAR_LINE),
3737        m_vic_irq(CLEAR_LINE),
3838        m_exp_irq(CLEAR_LINE)
r17630r17631
4444   required_device<mos6526_device> m_cia;
4545   required_device<vic10_expansion_slot_device> m_exp;
4646   required_device<ram_device> m_ram;
47   optional_device<cassette_image_device> m_cassette;
48   optional_device<timer_device> m_cassette_timer;
47   optional_device<pet_datassette_port_device> m_cassette;
4948
5049   virtual void machine_start();
5150   virtual void machine_reset();
trunk/src/mess/drivers/apple3.c
r17630r17631
3636 * different memory locations */
3737static const m6502_interface apple3_m6502_interface =
3838{
39   NULL,   /* read_indexed_func */
40   NULL,   /* write_indexed_func */
41   DEVCB_DRIVER_MEMBER(apple3_state, apple3_indexed_read),            /* port_read_func */
42   DEVCB_DRIVER_MEMBER(apple3_state, apple3_indexed_write)            /* port_write_func */
39   DEVCB_DRIVER_MEMBER(apple3_state, apple3_indexed_read),   /* read_indexed_func */
40   DEVCB_DRIVER_MEMBER(apple3_state, apple3_indexed_write),   /* write_indexed_func */
41    DEVCB_NULL, /* port_read_func */
42    DEVCB_NULL, /* port_write_func */
43    0x00,
44    0x00
4345};
4446
4547static const floppy_interface apple3_floppy_interface =
trunk/src/mess/drivers/plus4.c
r17630r17631
438438//**************************************************************************
439439
440440//-------------------------------------------------
441//  m6502_interface cpu_intf
441//  M6510_INTERFACE( cpu_intf )
442442//-------------------------------------------------
443443
444444READ8_MEMBER( plus4_state::cpu_r )
r17630r17631
489489
490490    */
491491
492    UINT8 data = 0x2f;
492    UINT8 data = 0;
493493
494494    // cassette read
495495    data |= m_cassette->read() << 4;
r17630r17631
538538   m_cassette->write(!BIT(data, 1));
539539}
540540
541static const m6502_interface cpu_intf =
541static M6510_INTERFACE( cpu_intf )
542542{
543   NULL,
544   NULL,
543   DEVCB_NULL,
544   DEVCB_NULL,
545545   DEVCB_DRIVER_MEMBER(plus4_state, cpu_r),
546   DEVCB_DRIVER_MEMBER(plus4_state, cpu_w)
546   DEVCB_DRIVER_MEMBER(plus4_state, cpu_w),
547   0x00,
548   0xc0
547549};
548550
549static const m6502_interface c16_cpu_intf =
551static M6510_INTERFACE( c16_cpu_intf )
550552{
551   NULL,
552   NULL,
553   DEVCB_NULL,
554   DEVCB_NULL,
553555   DEVCB_DRIVER_MEMBER(plus4_state, c16_cpu_r),
554   DEVCB_DRIVER_MEMBER(plus4_state, cpu_w)
556   DEVCB_DRIVER_MEMBER(plus4_state, cpu_w),
557   0x00,
558   0xc0
555559};
556560
557561//-------------------------------------------------
trunk/src/mess/drivers/c128.c
r17630r17631
663663};
664664
665665
666static const m6502_interface c128_m8502_interface =
666static M6510_INTERFACE( c128_m8502_interface )
667667{
668   NULL,               /* read_indexed_func */
669   NULL,               /* write_indexed_func */
668   DEVCB_NULL,               /* read_indexed_func */
669   DEVCB_NULL,               /* write_indexed_func */
670670   DEVCB_HANDLER(c128_m6510_port_read),   /* port_read_func */
671   DEVCB_HANDLER(c128_m6510_port_write)   /* port_write_func */
671   DEVCB_HANDLER(c128_m6510_port_write),   /* port_write_func */
672   0x00,
673   0x00
672674};
673675
674676static CBM_IEC_INTERFACE( cbm_iec_intf )
trunk/src/mess/drivers/c64.c
r17630r17631
651651
652652
653653//-------------------------------------------------
654//  m6502_interface cpu_intf
654//  M6510_INTERFACE( cpu_intf )
655655//-------------------------------------------------
656656
657657READ8_MEMBER( c64_state::cpu_r )
r17630r17631
705705
706706static M6510_INTERFACE( cpu_intf )
707707{
708   NULL,
709   NULL,
708   DEVCB_NULL,
709   DEVCB_NULL,
710710   DEVCB_DRIVER_MEMBER(c64_state, cpu_r),
711711   DEVCB_DRIVER_MEMBER(c64_state, cpu_w),
712712   0x17,
r17630r17631
715715
716716
717717//-------------------------------------------------
718//  m6502_interface sx64_cpu_intf
718//  M6510_INTERFACE( sx64_cpu_intf )
719719//-------------------------------------------------
720720
721721READ8_MEMBER( sx64_state::cpu_r )
r17630r17631
759759
760760static M6510_INTERFACE( sx64_cpu_intf )
761761{
762   NULL,
763   NULL,
762   DEVCB_NULL,
763   DEVCB_NULL,
764764   DEVCB_DRIVER_MEMBER(sx64_state, cpu_r),
765765   DEVCB_DRIVER_MEMBER(sx64_state, cpu_w),
766766   0x07,
r17630r17631
769769
770770
771771//-------------------------------------------------
772//  m6502_interface c64gs_cpu_intf
772//  M6510_INTERFACE( c64gs_cpu_intf )
773773//-------------------------------------------------
774774
775775READ8_MEMBER( c64gs_state::cpu_r )
r17630r17631
811811   m_charen = BIT(data, 2);
812812}
813813
814static const m6502_interface c64gs_cpu_intf =
814static M6510_INTERFACE( c64gs_cpu_intf )
815815{
816   NULL,
817   NULL,
816   DEVCB_NULL,
817   DEVCB_NULL,
818818   DEVCB_DRIVER_MEMBER(c64gs_state, cpu_r),
819819   DEVCB_DRIVER_MEMBER(c64gs_state, cpu_w),
820820   0x07,
trunk/src/mess/drivers/vic10.c
r17630r17631
471471
472472
473473//-------------------------------------------------
474//  m6502_interface cpu_intf
474//  M6510_INTERFACE( cpu_intf )
475475//-------------------------------------------------
476476
477477READ8_MEMBER( vic10_state::cpu_r )
r17630r17631
481481        bit     description
482482
483483        P0      EXPANSION PORT
484        P1      1
485        P2      1
484        P1     
485        P2     
486486        P3
487487        P4      CASS SENS
488        P5
488        P5      0
489489
490490    */
491491
492   UINT8 data = 0x06;
492   UINT8 data = 0;
493493
494   // expansion port
494495   data |= m_exp->p0_r();
495496
496   data |= ((m_cassette->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED) << 4;
497   // cassette sense
498   data |= m_cassette->sense_r() << 4;
497499
498500   return data;
499501}
r17630r17631
519521   }
520522
521523   // cassette write
522   m_cassette->output(BIT(data, 3) ? -(0x5a9e >> 1) : +(0x5a9e >> 1));
524   m_cassette->write(BIT(data, 3));
523525
524526   // cassette motor
525   if (!BIT(data, 5))
526   {
527      m_cassette->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
528      m_cassette_timer->adjust(attotime::zero, 0, attotime::from_hz(44100));
529   }
530   else
531   {
532      m_cassette->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
533      m_cassette_timer->reset();
534   }
527   m_cassette->motor_w(BIT(data, 5));
535528}
536529
537static const m6502_interface cpu_intf =
530static M6510_INTERFACE( cpu_intf )
538531{
539   NULL,
540   NULL,
532   DEVCB_NULL,
533   DEVCB_NULL,
541534   DEVCB_DRIVER_MEMBER(vic10_state, cpu_r),
542   DEVCB_DRIVER_MEMBER(vic10_state, cpu_w)
535   DEVCB_DRIVER_MEMBER(vic10_state, cpu_w),
536   0x10,
537   0x20
543538};
544539
545540
546541//-------------------------------------------------
547//  TIMER_DEVICE_CALLBACK( cassette_tick )
542//  PET_DATASSETTE_PORT_INTERFACE( datassette_intf )
548543//-------------------------------------------------
549544
550static TIMER_DEVICE_CALLBACK( cassette_tick )
545static PET_DATASSETTE_PORT_INTERFACE( datassette_intf )
551546{
552   vic10_state *state = timer.machine().driver_data<vic10_state>();
547   DEVCB_DEVICE_LINE(MOS6526_TAG, mos6526_flag_w)
548};
553549
554   mos6526_flag_w(state->m_cia, state->m_cassette->input() > +0.0);
555}
556550
557
558551//-------------------------------------------------
559552//  C64_EXPANSION_INTERFACE( expansion_intf )
560553//-------------------------------------------------
r17630r17631
638631
639632   // devices
640633   MCFG_MOS6526R1_ADD(MOS6526_TAG, VIC6566_CLOCK, cia_intf)
641   MCFG_CASSETTE_ADD(CASSETTE_TAG, cbm_cassette_interface)
642   MCFG_TIMER_ADD(TIMER_C1531_TAG, cassette_tick)
634   MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, NULL, NULL)
643635   MCFG_VIC10_EXPANSION_SLOT_ADD(VIC10_EXPANSION_SLOT_TAG, VIC6566_CLOCK, expansion_intf, vic10_expansion_cards, NULL, NULL)
644636
645637   // software list
trunk/src/mess/drivers/sbc6510.c
r17630r17631
197197{
198198}
199199
200static const m6502_interface sbc6510_m6510_interface =
200static M6510_INTERFACE( sbc6510_m6510_interface )
201201{
202   NULL,
203   NULL,
204202   DEVCB_NULL,
205   DEVCB_NULL
203   DEVCB_NULL,
204   DEVCB_NULL,
205   DEVCB_NULL,
206   0x00,
207   0x00
206208};
207209
208210READ8_MEMBER( sbc6510_state::psg_a_r )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team