mirror of
https://github.com/holub/mame
synced 2025-06-30 16:00:01 +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 ddr;
|
||||||
UINT8 port;
|
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)
|
INLINE m4510_Regs *get_safe_token(device_t *device)
|
||||||
@ -202,8 +203,6 @@ static CPU_INIT( m4510 )
|
|||||||
cpustate->interrupt_inhibit = 0;
|
cpustate->interrupt_inhibit = 0;
|
||||||
cpustate->rdmem_id = default_rdmem_id;
|
cpustate->rdmem_id = default_rdmem_id;
|
||||||
cpustate->wrmem_id = default_wrmem_id;
|
cpustate->wrmem_id = default_wrmem_id;
|
||||||
cpustate->port_read = NULL;
|
|
||||||
cpustate->port_write = NULL;
|
|
||||||
cpustate->irq_callback = irqcallback;
|
cpustate->irq_callback = irqcallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
cpustate->space = device->space(AS_PROGRAM);
|
cpustate->space = device->space(AS_PROGRAM);
|
||||||
@ -217,11 +216,8 @@ static CPU_INIT( m4510 )
|
|||||||
if ( intf->write_indexed_func )
|
if ( intf->write_indexed_func )
|
||||||
cpustate->wrmem_id = intf->write_indexed_func;
|
cpustate->wrmem_id = intf->write_indexed_func;
|
||||||
|
|
||||||
if ( intf->port_read_func )
|
devcb_resolve_read8(&cpustate->in_port_func, &intf->in_port_func, device);
|
||||||
cpustate->port_read = intf->port_read_func;
|
devcb_resolve_write8(&cpustate->out_port_func, &intf->out_port_func, device);
|
||||||
|
|
||||||
if ( intf->port_write_func )
|
|
||||||
cpustate->port_write = intf->port_write_func;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,8 +362,7 @@ static READ8_HANDLER( m4510_read_0000 )
|
|||||||
result = cpustate->ddr;
|
result = cpustate->ddr;
|
||||||
break;
|
break;
|
||||||
case 0x0001: /* Data Port */
|
case 0x0001: /* Data Port */
|
||||||
if (cpustate->port_read)
|
result = devcb_call_read8(&cpustate->in_port_func, 0);
|
||||||
result = cpustate->port_read(cpustate->device, 0);
|
|
||||||
result = (cpustate->ddr & cpustate->port) | (~cpustate->ddr & result);
|
result = (cpustate->ddr & cpustate->port) | (~cpustate->ddr & result);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -388,8 +383,7 @@ static WRITE8_HANDLER( m4510_write_0000 )
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpustate->port_write)
|
devcb_call_write8(&cpustate->out_port_func, 0, m4510_get_port(downcast<legacy_cpu_device *>(&space->device())));
|
||||||
cpustate->port_write(cpustate->device, 0, m4510_get_port(downcast<legacy_cpu_device *>(&space->device())));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ADDRESS_MAP_START(m4510_mem, AS_PROGRAM, 8)
|
static ADDRESS_MAP_START(m4510_mem, AS_PROGRAM, 8)
|
||||||
|
@ -81,8 +81,9 @@ struct _m6502_Regs
|
|||||||
|
|
||||||
UINT8 ddr;
|
UINT8 ddr;
|
||||||
UINT8 port;
|
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)
|
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->insn = insn;
|
||||||
cpustate->rdmem_id = default_rdmem_id;
|
cpustate->rdmem_id = default_rdmem_id;
|
||||||
cpustate->wrmem_id = default_wdmem_id;
|
cpustate->wrmem_id = default_wdmem_id;
|
||||||
cpustate->port_read = NULL;
|
|
||||||
cpustate->port_write = NULL;
|
|
||||||
|
|
||||||
if ( intf )
|
if ( intf )
|
||||||
{
|
{
|
||||||
@ -153,11 +152,8 @@ static void m6502_common_init(legacy_cpu_device *device, device_irq_callback irq
|
|||||||
if ( intf->write_indexed_func )
|
if ( intf->write_indexed_func )
|
||||||
cpustate->wrmem_id = intf->write_indexed_func;
|
cpustate->wrmem_id = intf->write_indexed_func;
|
||||||
|
|
||||||
if ( intf->port_read_func )
|
devcb_resolve_read8(&cpustate->in_port_func, &intf->in_port_func, device);
|
||||||
cpustate->port_read = intf->port_read_func;
|
devcb_resolve_write8(&cpustate->out_port_func, &intf->out_port_func, device);
|
||||||
|
|
||||||
if ( intf->port_write_func )
|
|
||||||
cpustate->port_write = intf->port_write_func;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
device->save_item(NAME(cpustate->pc.w.l));
|
device->save_item(NAME(cpustate->pc.w.l));
|
||||||
@ -374,8 +370,7 @@ static READ8_HANDLER( m6510_read_0000 )
|
|||||||
result = cpustate->ddr;
|
result = cpustate->ddr;
|
||||||
break;
|
break;
|
||||||
case 0x0001: /* Data Port */
|
case 0x0001: /* Data Port */
|
||||||
if (cpustate->port_read)
|
result = devcb_call_read8(&cpustate->in_port_func, cpustate->ddr);
|
||||||
result = cpustate->port_read( cpustate->device, cpustate->ddr );
|
|
||||||
result = (cpustate->ddr & cpustate->port) | (~cpustate->ddr & result);
|
result = (cpustate->ddr & cpustate->port) | (~cpustate->ddr & result);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -396,8 +391,7 @@ static WRITE8_HANDLER( m6510_write_0000 )
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpustate->port_write)
|
devcb_call_write8(&cpustate->out_port_func, cpustate->ddr, cpustate->port & cpustate->ddr);
|
||||||
cpustate->port_write( cpustate->device, cpustate->ddr, cpustate->port & cpustate->ddr );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ADDRESS_MAP_START(m6510_mem, AS_PROGRAM, 8)
|
static ADDRESS_MAP_START(m6510_mem, AS_PROGRAM, 8)
|
||||||
|
@ -51,9 +51,6 @@ enum
|
|||||||
positiv edge sets overflow flag */
|
positiv edge sets overflow flag */
|
||||||
#define M6502_SET_OVERFLOW 1
|
#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 */
|
/* Optional interface to set callbacks */
|
||||||
typedef struct _m6502_interface m6502_interface;
|
typedef struct _m6502_interface m6502_interface;
|
||||||
@ -61,8 +58,8 @@ struct _m6502_interface
|
|||||||
{
|
{
|
||||||
read8_space_func read_indexed_func;
|
read8_space_func read_indexed_func;
|
||||||
write8_space_func write_indexed_func;
|
write8_space_func write_indexed_func;
|
||||||
m6510_port_read_func port_read_func;
|
devcb_read8 in_port_func;
|
||||||
m6510_port_write_func port_write_func;
|
devcb_write8 out_port_func;
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_LEGACY_CPU_DEVICE(M6502, m6502);
|
DECLARE_LEGACY_CPU_DEVICE(M6502, m6502);
|
||||||
|
Loading…
Reference in New Issue
Block a user