mirror of
https://github.com/holub/mame
synced 2025-05-29 09:03:08 +03:00
Refactored the M6510 CPU to use device callbacks for port read/write. [Curt Coder]
This commit is contained in:
parent
486fbfa555
commit
5879fdf496
@ -153,8 +153,9 @@ struct _m4510_Regs {
|
||||
|
||||
UINT8 ddr;
|
||||
UINT8 port;
|
||||
m6510_port_read_func port_read;
|
||||
m6510_port_write_func port_write;
|
||||
|
||||
devcb_resolved_read8 in_port_func;
|
||||
devcb_resolved_write8 out_port_func;
|
||||
};
|
||||
|
||||
INLINE m4510_Regs *get_safe_token(device_t *device)
|
||||
@ -202,8 +203,6 @@ static CPU_INIT( m4510 )
|
||||
cpustate->interrupt_inhibit = 0;
|
||||
cpustate->rdmem_id = default_rdmem_id;
|
||||
cpustate->wrmem_id = default_wrmem_id;
|
||||
cpustate->port_read = NULL;
|
||||
cpustate->port_write = NULL;
|
||||
cpustate->irq_callback = irqcallback;
|
||||
cpustate->device = device;
|
||||
cpustate->space = device->space(AS_PROGRAM);
|
||||
@ -217,11 +216,8 @@ static CPU_INIT( m4510 )
|
||||
if ( intf->write_indexed_func )
|
||||
cpustate->wrmem_id = intf->write_indexed_func;
|
||||
|
||||
if ( intf->port_read_func )
|
||||
cpustate->port_read = intf->port_read_func;
|
||||
|
||||
if ( intf->port_write_func )
|
||||
cpustate->port_write = intf->port_write_func;
|
||||
devcb_resolve_read8(&cpustate->in_port_func, &intf->in_port_func, device);
|
||||
devcb_resolve_write8(&cpustate->out_port_func, &intf->out_port_func, device);
|
||||
}
|
||||
}
|
||||
|
||||
@ -366,8 +362,7 @@ static READ8_HANDLER( m4510_read_0000 )
|
||||
result = cpustate->ddr;
|
||||
break;
|
||||
case 0x0001: /* Data Port */
|
||||
if (cpustate->port_read)
|
||||
result = cpustate->port_read(cpustate->device, 0);
|
||||
result = devcb_call_read8(&cpustate->in_port_func, 0);
|
||||
result = (cpustate->ddr & cpustate->port) | (~cpustate->ddr & result);
|
||||
break;
|
||||
}
|
||||
@ -388,8 +383,7 @@ static WRITE8_HANDLER( m4510_write_0000 )
|
||||
break;
|
||||
}
|
||||
|
||||
if (cpustate->port_write)
|
||||
cpustate->port_write(cpustate->device, 0, m4510_get_port(downcast<legacy_cpu_device *>(&space->device())));
|
||||
devcb_call_write8(&cpustate->out_port_func, 0, m4510_get_port(downcast<legacy_cpu_device *>(&space->device())));
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START(m4510_mem, AS_PROGRAM, 8)
|
||||
|
@ -81,8 +81,9 @@ struct _m6502_Regs
|
||||
|
||||
UINT8 ddr;
|
||||
UINT8 port;
|
||||
m6510_port_read_func port_read;
|
||||
m6510_port_write_func port_write;
|
||||
|
||||
devcb_resolved_read8 in_port_func;
|
||||
devcb_resolved_write8 out_port_func;
|
||||
};
|
||||
|
||||
INLINE m6502_Regs *get_safe_token(device_t *device)
|
||||
@ -142,8 +143,6 @@ static void m6502_common_init(legacy_cpu_device *device, device_irq_callback irq
|
||||
cpustate->insn = insn;
|
||||
cpustate->rdmem_id = default_rdmem_id;
|
||||
cpustate->wrmem_id = default_wdmem_id;
|
||||
cpustate->port_read = NULL;
|
||||
cpustate->port_write = NULL;
|
||||
|
||||
if ( intf )
|
||||
{
|
||||
@ -153,11 +152,8 @@ static void m6502_common_init(legacy_cpu_device *device, device_irq_callback irq
|
||||
if ( intf->write_indexed_func )
|
||||
cpustate->wrmem_id = intf->write_indexed_func;
|
||||
|
||||
if ( intf->port_read_func )
|
||||
cpustate->port_read = intf->port_read_func;
|
||||
|
||||
if ( intf->port_write_func )
|
||||
cpustate->port_write = intf->port_write_func;
|
||||
devcb_resolve_read8(&cpustate->in_port_func, &intf->in_port_func, device);
|
||||
devcb_resolve_write8(&cpustate->out_port_func, &intf->out_port_func, device);
|
||||
}
|
||||
|
||||
device->save_item(NAME(cpustate->pc.w.l));
|
||||
@ -374,8 +370,7 @@ static READ8_HANDLER( m6510_read_0000 )
|
||||
result = cpustate->ddr;
|
||||
break;
|
||||
case 0x0001: /* Data Port */
|
||||
if (cpustate->port_read)
|
||||
result = cpustate->port_read( cpustate->device, cpustate->ddr );
|
||||
result = devcb_call_read8(&cpustate->in_port_func, cpustate->ddr);
|
||||
result = (cpustate->ddr & cpustate->port) | (~cpustate->ddr & result);
|
||||
break;
|
||||
}
|
||||
@ -396,8 +391,7 @@ static WRITE8_HANDLER( m6510_write_0000 )
|
||||
break;
|
||||
}
|
||||
|
||||
if (cpustate->port_write)
|
||||
cpustate->port_write( cpustate->device, cpustate->ddr, cpustate->port & cpustate->ddr );
|
||||
devcb_call_write8(&cpustate->out_port_func, cpustate->ddr, cpustate->port & cpustate->ddr);
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START(m6510_mem, AS_PROGRAM, 8)
|
||||
|
@ -51,9 +51,6 @@ enum
|
||||
positiv edge sets overflow flag */
|
||||
#define M6502_SET_OVERFLOW 1
|
||||
|
||||
typedef UINT8 (*m6510_port_read_func)(device_t *device, UINT8 direction);
|
||||
typedef void (*m6510_port_write_func)(device_t *device, UINT8 direction, UINT8 data);
|
||||
|
||||
|
||||
/* Optional interface to set callbacks */
|
||||
typedef struct _m6502_interface m6502_interface;
|
||||
@ -61,8 +58,8 @@ struct _m6502_interface
|
||||
{
|
||||
read8_space_func read_indexed_func;
|
||||
write8_space_func write_indexed_func;
|
||||
m6510_port_read_func port_read_func;
|
||||
m6510_port_write_func port_write_func;
|
||||
devcb_read8 in_port_func;
|
||||
devcb_write8 out_port_func;
|
||||
};
|
||||
|
||||
DECLARE_LEGACY_CPU_DEVICE(M6502, m6502);
|
||||
|
Loading…
Reference in New Issue
Block a user