diff options
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 |
commit | 8e291797f286d0f3c6b2618eabe27418105682e2 (patch) | |
tree | fdf2732223764d672d42faf7a2612a6c10b36fb3 /src/emu | |
parent | 16dd0d9df0f5e98ffeec6e6b1b298b0af9dffdff (diff) |
moved rsp to use devcb2 (nw)
Diffstat (limited to 'src/emu')
-rw-r--r-- | src/emu/cpu/rsp/rsp.c | 50 | ||||
-rw-r--r-- | src/emu/cpu/rsp/rsp.h | 82 | ||||
-rw-r--r-- | src/emu/cpu/rsp/rspdrc.c | 28 |
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>; |