From 24fe8c73fa3bf52c829d53ab0a0cbe1552fe6551 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 11 Oct 2012 14:19:58 +0000 Subject: [PATCH] made rsp core use callbacks (no whatsnew) --- src/emu/cpu/rsp/rsp.c | 18 ++++++++++++------ src/emu/cpu/rsp/rsp.h | 19 +++++++++++-------- src/emu/cpu/rsp/rspdrc.c | 19 +++++++++++++------ src/mame/machine/n64.c | 14 +++++++------- 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/emu/cpu/rsp/rsp.c b/src/emu/cpu/rsp/rsp.c index 6edd8693c84..7b3beb580bb 100644 --- a/src/emu/cpu/rsp/rsp.c +++ b/src/emu/cpu/rsp/rsp.c @@ -182,11 +182,11 @@ static UINT32 get_cop0_reg(rsp_state *rsp, int reg) reg &= 0xf; if (reg < 8) { - return (rsp->config->sp_reg_r)(rsp->device, reg, 0x00000000); + return (rsp->sp_reg_r_func)(reg, 0x00000000); } else if (reg >= 8 && reg < 16) { - return (rsp->config->dp_reg_r)(rsp->device, reg - 8, 0x00000000); + return (rsp->dp_reg_r_func)(reg - 8, 0x00000000); } return 0; @@ -197,11 +197,11 @@ static void set_cop0_reg(rsp_state *rsp, int reg, UINT32 data) reg &= 0xf; if (reg < 8) { - (rsp->config->sp_reg_w)(rsp->device, reg, data, 0x00000000); + (rsp->sp_reg_w_func)(reg, data, 0x00000000); } else if (reg >= 8 && reg < 16) { - (rsp->config->dp_reg_w)(rsp->device, reg - 8, data, 0x00000000); + (rsp->dp_reg_w_func)(reg - 8, data, 0x00000000); } } @@ -274,7 +274,13 @@ static CPU_INIT( rsp ) rsp_state *rsp = get_safe_token(device); int regIdx; int accumIdx; - rsp->config = (const rsp_config *)device->static_config(); + 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); if (LOG_INSTRUCTION_EXECUTION) rsp->exec_output = fopen("rsp_execute.txt", "wt"); @@ -2715,7 +2721,7 @@ static CPU_EXECUTE( rsp ) case 0x09: /* JALR */ JUMP_PC_L(RSVAL, RDREG); break; case 0x0d: /* BREAK */ { - (rsp->config->sp_set_status)(rsp->device, 0x3); + (rsp->sp_set_status_func)(0, 0x3); rsp->icount = MIN(rsp->icount, 1); if (LOG_INSTRUCTION_EXECUTION) fprintf(rsp->exec_output, "\n---------- break ----------\n\n"); diff --git a/src/emu/cpu/rsp/rsp.h b/src/emu/cpu/rsp/rsp.h index 91a8577fb0b..d997094402f 100644 --- a/src/emu/cpu/rsp/rsp.h +++ b/src/emu/cpu/rsp/rsp.h @@ -68,15 +68,13 @@ enum STRUCTURES ***************************************************************************/ -typedef void (*rsp_set_status_func)(device_t *device, UINT32 status); - struct rsp_config { - read32_device_func dp_reg_r; - write32_device_func dp_reg_w; - read32_device_func sp_reg_r; - write32_device_func sp_reg_w; - rsp_set_status_func sp_set_status; + 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; }; @@ -156,7 +154,6 @@ union ACCUMULATOR_REG struct rspimp_state; struct rsp_state { - const rsp_config *config; FILE *exec_output; UINT32 pc; @@ -191,6 +188,12 @@ struct rsp_state UINT8 *imem8; rspimp_state* impstate; + + 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; }; DECLARE_LEGACY_CPU_DEVICE(RSP, rsp); diff --git a/src/emu/cpu/rsp/rspdrc.c b/src/emu/cpu/rsp/rspdrc.c index 3b7a7208134..4421313cfbd 100644 --- a/src/emu/cpu/rsp/rspdrc.c +++ b/src/emu/cpu/rsp/rspdrc.c @@ -472,14 +472,14 @@ static void cfunc_get_cop0_reg(void *param) { if(dest) { - rsp->r[dest] = (rsp->config->sp_reg_r)(rsp->device, *rsp->program, reg, 0x00000000); + rsp->r[dest] = (rsp->sp_reg_r_func)(reg, 0x00000000); } } else if (reg >= 8 && reg < 16) { if(dest) { - rsp->r[dest] = (rsp->config->dp_reg_r)(rsp->device, *rsp->program, reg - 8, 0x00000000); + rsp->r[dest] = (rsp->dp_reg_r_func)(reg - 8, 0x00000000); } } else @@ -496,11 +496,11 @@ static void cfunc_set_cop0_reg(void *param) if (reg >= 0 && reg < 8) { - (rsp->config->sp_reg_w)(rsp->device, *rsp->program, reg, data, 0x00000000); + (rsp->sp_reg_w_func)(reg, data, 0x00000000); } else if (reg >= 8 && reg < 16) { - (rsp->config->dp_reg_w)(rsp->device, *rsp->program, reg - 8, data, 0x00000000); + (rsp->dp_reg_w_func)(reg - 8, data, 0x00000000); } else { @@ -585,7 +585,14 @@ static void rspcom_init(rsp_state *rsp, legacy_cpu_device *device, device_irq_ac memset(rsp, 0, sizeof(*rsp)); - rsp->config = (const rsp_config *)device->static_config(); + 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->program = &device->space(AS_PROGRAM); @@ -3371,7 +3378,7 @@ INLINE void cfunc_rsp_vrsqh(void *param) static void cfunc_sp_set_status_cb(void *param) { rsp_state *rsp = (rsp_state*)param; - (rsp->config->sp_set_status)(rsp->device, rsp->impstate->arg0); + (rsp->sp_set_status_func)(0, rsp->impstate->arg0); } static CPU_EXECUTE( rsp ) diff --git a/src/mame/machine/n64.c b/src/mame/machine/n64.c index dd377272257..43b3672c233 100644 --- a/src/mame/machine/n64.c +++ b/src/mame/machine/n64.c @@ -553,9 +553,9 @@ void n64_periphs::sp_dma(int direction) } } -static void sp_set_status(device_t *device, UINT32 status) +static WRITE32_DEVICE_HANDLER(sp_set_status) { - device->machine().device("rcp")->sp_set_status(status); + device->machine().device("rcp")->sp_set_status(data); } void n64_periphs::sp_set_status(UINT32 status) @@ -991,11 +991,11 @@ WRITE32_DEVICE_HANDLER( n64_dp_reg_w ) const rsp_config n64_rsp_config = { - n64_dp_reg_r, - n64_dp_reg_w, - n64_sp_reg_r, - n64_sp_reg_w, - sp_set_status + DEVCB_DEVICE_HANDLER("rcp",n64_dp_reg_r), + DEVCB_DEVICE_HANDLER("rcp",n64_dp_reg_w), + DEVCB_DEVICE_HANDLER("rcp",n64_sp_reg_r), + DEVCB_DEVICE_HANDLER("rcp",n64_sp_reg_w), + DEVCB_DEVICE_HANDLER("rcp",sp_set_status) }; TIMER_CALLBACK_MEMBER(n64_periphs::vi_scanline_callback)