summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2014-05-13 07:23:59 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2014-05-13 07:23:59 +0000
commit8e291797f286d0f3c6b2618eabe27418105682e2 (patch)
treefdf2732223764d672d42faf7a2612a6c10b36fb3 /src/emu
parent16dd0d9df0f5e98ffeec6e6b1b298b0af9dffdff (diff)
moved rsp to use devcb2 (nw)
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/cpu/rsp/rsp.c50
-rw-r--r--src/emu/cpu/rsp/rsp.h82
-rw-r--r--src/emu/cpu/rsp/rspdrc.c28
3 files changed, 104 insertions, 56 deletions
diff --git a/src/emu/cpu/rsp/rsp.c b/src/emu/cpu/rsp/rsp.c
index 7e0ae05f5ca..1c370d401b4 100644
--- a/src/emu/cpu/rsp/rsp.c
+++ b/src/emu/cpu/rsp/rsp.c
@@ -193,11 +193,11 @@ static UINT32 get_cop0_reg(rsp_state *rsp, int reg)
reg &= 0xf;
if (reg < 8)
{
- return (rsp->sp_reg_r_func)(reg, 0x00000000);
+ return (rsp->device->sp_reg_r_func)(reg, 0xffffffff);
}
else if (reg >= 8 && reg < 16)
{
- return (rsp->dp_reg_r_func)(reg - 8, 0x00000000);
+ return (rsp->device->dp_reg_r_func)(reg - 8, 0xffffffff);
}
return 0;
@@ -208,11 +208,11 @@ static void set_cop0_reg(rsp_state *rsp, int reg, UINT32 data)
reg &= 0xf;
if (reg < 8)
{
- (rsp->sp_reg_w_func)(reg, data, 0x00000000);
+ (rsp->device->sp_reg_w_func)(reg, data, 0xffffffff);
}
else if (reg >= 8 && reg < 16)
{
- (rsp->dp_reg_w_func)(reg - 8, data, 0x00000000);
+ (rsp->device->dp_reg_w_func)(reg - 8, data, 0xffffffff);
}
}
@@ -280,26 +280,29 @@ static const int vector_elements[16][8] =
{ 7, 7, 7, 7, 7, 7, 7, 7 }, // 7
};
+void rsp_cpu_device::resolve_cb()
+{
+ dp_reg_r_func.resolve();
+ dp_reg_w_func.resolve();
+ sp_reg_r_func.resolve();
+ sp_reg_w_func.resolve();
+ sp_set_status_func.resolve();
+}
+
static CPU_INIT( rsp )
{
rsp_state *rsp = get_safe_token(device);
int regIdx;
- int accumIdx;
- const rsp_config *config = (const rsp_config *)device->static_config();
- // resolve callbacks
- rsp->dp_reg_r_func.resolve(config->dp_reg_r_cb, *device);
- rsp->dp_reg_w_func.resolve(config->dp_reg_w_cb, *device);
- rsp->sp_reg_r_func.resolve(config->sp_reg_r_cb, *device);
- rsp->sp_reg_w_func.resolve(config->sp_reg_w_cb, *device);
- rsp->sp_set_status_func.resolve(config->sp_set_status_cb, *device);
-
+ int accumIdx;
+
if (LOG_INSTRUCTION_EXECUTION)
rsp->exec_output = fopen("rsp_execute.txt", "wt");
rsp->irq_callback = irqcallback;
- rsp->device = device;
+ rsp->device = downcast<rsp_cpu_device *>(device);
rsp->program = &device->space(AS_PROGRAM);
rsp->direct = &rsp->program->direct();
+ rsp->device->resolve_cb();
#if 1
// Inaccurate. RSP registers power on to a random state...
@@ -2742,7 +2745,7 @@ static CPU_EXECUTE( rsp )
case 0x09: /* JALR */ JUMP_PC_L(RSVAL, RDREG); break;
case 0x0d: /* BREAK */
{
- (rsp->sp_set_status_func)(0, 0x3);
+ (rsp->device->sp_set_status_func)(0, 0x3, 0xffffffff);
rsp->icount = MIN(rsp->icount, 1);
if (LOG_INSTRUCTION_EXECUTION) fprintf(rsp->exec_output, "\n---------- break ----------\n\n");
@@ -3254,6 +3257,21 @@ CPU_GET_INFO( rsp_int )
}
}
-DEFINE_LEGACY_CPU_DEVICE(RSP_INT, rsp_int);
+rsp_cpu_device::rsp_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, cpu_get_info_func get_info)
+ : legacy_cpu_device(mconfig, type, tag, owner, clock, get_info),
+ dp_reg_r_func(*this),
+ dp_reg_w_func(*this),
+ sp_reg_r_func(*this),
+ sp_reg_w_func(*this),
+ sp_set_status_func(*this)
+{
+}
+
+rsp_int_device::rsp_int_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock)
+ : rsp_cpu_device(mconfig, type, tag, owner, clock, CPU_GET_INFO_NAME(rsp_int))
+{
+}
+
+const device_type RSP_INT = &legacy_device_creator<rsp_drc_device>;
const device_type RSP = &legacy_device_creator_drc<rsp_int_device, rsp_drc_device>;
diff --git a/src/emu/cpu/rsp/rsp.h b/src/emu/cpu/rsp/rsp.h
index e19461f791e..9aef17f85fc 100644
--- a/src/emu/cpu/rsp/rsp.h
+++ b/src/emu/cpu/rsp/rsp.h
@@ -71,23 +71,6 @@ enum
RSP_V24, RSP_V25, RSP_V26, RSP_V27, RSP_V28, RSP_V29, RSP_V30, RSP_V31
};
-
-
-/***************************************************************************
- STRUCTURES
-***************************************************************************/
-
-struct rsp_config
-{
- devcb_read32 dp_reg_r_cb;
- devcb_write32 dp_reg_w_cb;
- devcb_read32 sp_reg_r_cb;
- devcb_write32 sp_reg_w_cb;
- devcb_write32 sp_set_status_cb;
-};
-
-
-
/***************************************************************************
PUBLIC FUNCTIONS
***************************************************************************/
@@ -160,6 +143,44 @@ union ACCUMULATOR_REG
INT16 w[4];
};
+#define MCFG_RSP_DP_REG_R_CB(_devcb) \
+ devcb = &rsp_cpu_device::static_set_dp_reg_r_callback(*device, DEVCB2_##_devcb);
+
+#define MCFG_RSP_DP_REG_W_CB(_devcb) \
+ devcb = &rsp_cpu_device::static_set_dp_reg_w_callback(*device, DEVCB2_##_devcb);
+
+#define MCFG_RSP_SP_REG_R_CB(_devcb) \
+ devcb = &rsp_cpu_device::static_set_sp_reg_r_callback(*device, DEVCB2_##_devcb);
+
+#define MCFG_RSP_SP_REG_W_CB(_devcb) \
+ devcb = &rsp_cpu_device::static_set_sp_reg_w_callback(*device, DEVCB2_##_devcb);
+
+#define MCFG_RSP_SP_SET_STATUS_CB(_devcb) \
+ devcb = &rsp_cpu_device::static_set_status_callback(*device, DEVCB2_##_devcb);
+
+class rsp_cpu_device : public legacy_cpu_device
+{
+protected:
+ // construction/destruction
+ rsp_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, cpu_get_info_func info);
+
+public:
+ void resolve_cb();
+ template<class _Object> static devcb2_base &static_set_dp_reg_r_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).dp_reg_r_func.set_callback(object); }
+ template<class _Object> static devcb2_base &static_set_dp_reg_w_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).dp_reg_w_func.set_callback(object); }
+ template<class _Object> static devcb2_base &static_set_sp_reg_r_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).sp_reg_r_func.set_callback(object); }
+ template<class _Object> static devcb2_base &static_set_sp_reg_w_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).sp_reg_w_func.set_callback(object); }
+ template<class _Object> static devcb2_base &static_set_status_callback(device_t &device, _Object object) { return downcast<rsp_cpu_device &>(device).sp_set_status_func.set_callback(object); }
+
+
+ devcb2_read32 dp_reg_r_func;
+ devcb2_write32 dp_reg_w_func;
+ devcb2_read32 sp_reg_r_func;
+ devcb2_write32 sp_reg_w_func;
+ devcb2_write32 sp_set_status_func;
+};
+
+
struct rspimp_state;
struct rsp_state
{
@@ -214,7 +235,7 @@ struct rsp_state
UINT32 nextpc;
device_irq_acknowledge_delegate irq_callback;
- legacy_cpu_device *device;
+ rsp_cpu_device *device;
address_space *program;
direct_read_data *direct;
int icount;
@@ -228,16 +249,27 @@ struct rsp_state
UINT8 *imem8;
rspimp_state* impstate;
+};
+
+CPU_GET_INFO( rsp_int );
- devcb_resolved_read32 dp_reg_r_func;
- devcb_resolved_write32 dp_reg_w_func;
- devcb_resolved_read32 sp_reg_r_func;
- devcb_resolved_write32 sp_reg_w_func;
- devcb_resolved_write32 sp_set_status_func;
+class rsp_int_device : public rsp_cpu_device
+{
+public:
+ rsp_int_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock);
+};
+
+extern const device_type RSP_INT;
+
+CPU_GET_INFO( rsp_drc );
+
+class rsp_drc_device : public rsp_cpu_device
+{
+public:
+ rsp_drc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock);
};
-DECLARE_LEGACY_CPU_DEVICE(RSP_INT, rsp_int);
-DECLARE_LEGACY_CPU_DEVICE(RSP_DRC, rsp_drc);
+extern const device_type RSP_DRC;
extern const device_type RSP;
diff --git a/src/emu/cpu/rsp/rspdrc.c b/src/emu/cpu/rsp/rspdrc.c
index 4b440ebd70b..183e059643e 100644
--- a/src/emu/cpu/rsp/rspdrc.c
+++ b/src/emu/cpu/rsp/rspdrc.c
@@ -655,14 +655,14 @@ static void cfunc_get_cop0_reg(void *param)
{
if(dest)
{
- rsp->r[dest] = (rsp->sp_reg_r_func)(reg, 0x00000000);
+ rsp->r[dest] = (rsp->device->sp_reg_r_func)(reg, 0xffffffff);
}
}
else if (reg >= 8 && reg < 16)
{
if(dest)
{
- rsp->r[dest] = (rsp->dp_reg_r_func)(reg - 8, 0x00000000);
+ rsp->r[dest] = (rsp->device->dp_reg_r_func)(reg - 8, 0xffffffff);
}
}
else
@@ -679,11 +679,11 @@ static void cfunc_set_cop0_reg(void *param)
if (reg >= 0 && reg < 8)
{
- (rsp->sp_reg_w_func)(reg, data, 0x00000000);
+ (rsp->device->sp_reg_w_func)(reg, data, 0xffffffff);
}
else if (reg >= 8 && reg < 16)
{
- (rsp->dp_reg_w_func)(reg - 8, data, 0x00000000);
+ (rsp->device->dp_reg_w_func)(reg - 8, data, 0xffffffff);
}
else
{
@@ -764,18 +764,11 @@ static void rspcom_init(rsp_state *rsp, legacy_cpu_device *device, device_irq_ac
memset(rsp, 0, sizeof(*rsp));
- const rsp_config *config = (const rsp_config *)device->static_config();
- // resolve callbacks
- rsp->dp_reg_r_func.resolve(config->dp_reg_r_cb, *device);
- rsp->dp_reg_w_func.resolve(config->dp_reg_w_cb, *device);
- rsp->sp_reg_r_func.resolve(config->sp_reg_r_cb, *device);
- rsp->sp_reg_w_func.resolve(config->sp_reg_w_cb, *device);
- rsp->sp_set_status_func.resolve(config->sp_set_status_cb, *device);
-
rsp->irq_callback = irqcallback;
- rsp->device = device;
+ rsp->device = downcast<rsp_cpu_device *>(device);
rsp->program = &device->space(AS_PROGRAM);
rsp->direct = &rsp->program->direct();
+ rsp->device->resolve_cb();
// Inaccurate. RSP registers power on to a random state...
for(regIdx = 0; regIdx < 32; regIdx++ )
@@ -6679,7 +6672,7 @@ INLINE void cfunc_rsp_vrsqh_scalar(void *param)
static void cfunc_sp_set_status_cb(void *param)
{
rsp_state *rsp = (rsp_state*)param;
- (rsp->sp_set_status_func)(0, rsp->impstate->arg0);
+ (rsp->device->sp_set_status_func)(0, rsp->impstate->arg0, 0xffffffff);
}
static CPU_EXECUTE( rsp )
@@ -9079,4 +9072,9 @@ CPU_GET_INFO( rsp_drc )
}
}
-DEFINE_LEGACY_CPU_DEVICE(RSP_DRC, rsp_drc);
+rsp_drc_device::rsp_drc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock)
+ : rsp_cpu_device(mconfig, type, tag, owner, clock, CPU_GET_INFO_NAME(rsp_drc))
+{
+}
+
+const device_type RSP_DRC = &legacy_device_creator<rsp_drc_device>;