made rsp core use callbacks (no whatsnew)

This commit is contained in:
Miodrag Milanovic 2012-10-11 14:19:58 +00:00
parent a90283d6cc
commit 24fe8c73fa
4 changed files with 43 additions and 27 deletions

View File

@ -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");

View File

@ -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);

View File

@ -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 )

View File

@ -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<n64_periphs>("rcp")->sp_set_status(status);
device->machine().device<n64_periphs>("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)