summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2011-04-18 14:23:09 +0000
committer Curt Coder <curtcoder@mail.com>2011-04-18 14:23:09 +0000
commit5879fdf49643556620d295bfaa4f817b6e056f40 (patch)
treeb5ae4be03f25eda007cb232395e9e4c2c92dd72e
parent486fbfa5554e9bf464b5702c603e54cf290be8dd (diff)
Refactored the M6510 CPU to use device callbacks for port read/write. [Curt Coder]
-rw-r--r--src/emu/cpu/m6502/m4510.c20
-rw-r--r--src/emu/cpu/m6502/m6502.c20
-rw-r--r--src/emu/cpu/m6502/m6502.h7
3 files changed, 16 insertions, 31 deletions
diff --git a/src/emu/cpu/m6502/m4510.c b/src/emu/cpu/m6502/m4510.c
index 733b53ae91c..3c5ae08ff94 100644
--- a/src/emu/cpu/m6502/m4510.c
+++ b/src/emu/cpu/m6502/m4510.c
@@ -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)
diff --git a/src/emu/cpu/m6502/m6502.c b/src/emu/cpu/m6502/m6502.c
index e3928dfad68..a34833243cb 100644
--- a/src/emu/cpu/m6502/m6502.c
+++ b/src/emu/cpu/m6502/m6502.c
@@ -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)
diff --git a/src/emu/cpu/m6502/m6502.h b/src/emu/cpu/m6502/m6502.h
index b478fefdb0c..c9ebf634dc7 100644
--- a/src/emu/cpu/m6502/m6502.h
+++ b/src/emu/cpu/m6502/m6502.h
@@ -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);