trunk/src/mame/machine/n64.c
| r18447 | r18448 | |
| 553 | 553 | } |
| 554 | 554 | } |
| 555 | 555 | |
| 556 | | static void sp_set_status(device_t *device, UINT32 status) |
| 556 | static WRITE32_DEVICE_HANDLER(sp_set_status) |
| 557 | 557 | { |
| 558 | | device->machine().device<n64_periphs>("rcp")->sp_set_status(status); |
| 558 | device->machine().device<n64_periphs>("rcp")->sp_set_status(data); |
| 559 | 559 | } |
| 560 | 560 | |
| 561 | 561 | void n64_periphs::sp_set_status(UINT32 status) |
| r18447 | r18448 | |
| 991 | 991 | |
| 992 | 992 | const rsp_config n64_rsp_config = |
| 993 | 993 | { |
| 994 | | n64_dp_reg_r, |
| 995 | | n64_dp_reg_w, |
| 996 | | n64_sp_reg_r, |
| 997 | | n64_sp_reg_w, |
| 998 | | sp_set_status |
| 994 | DEVCB_DEVICE_HANDLER("rcp",n64_dp_reg_r), |
| 995 | DEVCB_DEVICE_HANDLER("rcp",n64_dp_reg_w), |
| 996 | DEVCB_DEVICE_HANDLER("rcp",n64_sp_reg_r), |
| 997 | DEVCB_DEVICE_HANDLER("rcp",n64_sp_reg_w), |
| 998 | DEVCB_DEVICE_HANDLER("rcp",sp_set_status) |
| 999 | 999 | }; |
| 1000 | 1000 | |
| 1001 | 1001 | TIMER_CALLBACK_MEMBER(n64_periphs::vi_scanline_callback) |
trunk/src/emu/cpu/rsp/rsp.h
| r18447 | r18448 | |
| 68 | 68 | STRUCTURES |
| 69 | 69 | ***************************************************************************/ |
| 70 | 70 | |
| 71 | | typedef void (*rsp_set_status_func)(device_t *device, UINT32 status); |
| 72 | | |
| 73 | 71 | struct rsp_config |
| 74 | 72 | { |
| 75 | | read32_device_func dp_reg_r; |
| 76 | | write32_device_func dp_reg_w; |
| 77 | | read32_device_func sp_reg_r; |
| 78 | | write32_device_func sp_reg_w; |
| 79 | | rsp_set_status_func sp_set_status; |
| 73 | devcb_read32 dp_reg_r_cb; |
| 74 | devcb_write32 dp_reg_w_cb; |
| 75 | devcb_read32 sp_reg_r_cb; |
| 76 | devcb_write32 sp_reg_w_cb; |
| 77 | devcb_write32 sp_set_status_cb; |
| 80 | 78 | }; |
| 81 | 79 | |
| 82 | 80 | |
| r18447 | r18448 | |
| 156 | 154 | struct rspimp_state; |
| 157 | 155 | struct rsp_state |
| 158 | 156 | { |
| 159 | | const rsp_config *config; |
| 160 | 157 | FILE *exec_output; |
| 161 | 158 | |
| 162 | 159 | UINT32 pc; |
| r18447 | r18448 | |
| 191 | 188 | UINT8 *imem8; |
| 192 | 189 | |
| 193 | 190 | rspimp_state* impstate; |
| 191 | |
| 192 | devcb_resolved_read32 dp_reg_r_func; |
| 193 | devcb_resolved_write32 dp_reg_w_func; |
| 194 | devcb_resolved_read32 sp_reg_r_func; |
| 195 | devcb_resolved_write32 sp_reg_w_func; |
| 196 | devcb_resolved_write32 sp_set_status_func; |
| 194 | 197 | }; |
| 195 | 198 | |
| 196 | 199 | DECLARE_LEGACY_CPU_DEVICE(RSP, rsp); |
trunk/src/emu/cpu/rsp/rspdrc.c
| r18447 | r18448 | |
| 472 | 472 | { |
| 473 | 473 | if(dest) |
| 474 | 474 | { |
| 475 | | rsp->r[dest] = (rsp->config->sp_reg_r)(rsp->device, *rsp->program, reg, 0x00000000); |
| 475 | rsp->r[dest] = (rsp->sp_reg_r_func)(reg, 0x00000000); |
| 476 | 476 | } |
| 477 | 477 | } |
| 478 | 478 | else if (reg >= 8 && reg < 16) |
| 479 | 479 | { |
| 480 | 480 | if(dest) |
| 481 | 481 | { |
| 482 | | rsp->r[dest] = (rsp->config->dp_reg_r)(rsp->device, *rsp->program, reg - 8, 0x00000000); |
| 482 | rsp->r[dest] = (rsp->dp_reg_r_func)(reg - 8, 0x00000000); |
| 483 | 483 | } |
| 484 | 484 | } |
| 485 | 485 | else |
| r18447 | r18448 | |
| 496 | 496 | |
| 497 | 497 | if (reg >= 0 && reg < 8) |
| 498 | 498 | { |
| 499 | | (rsp->config->sp_reg_w)(rsp->device, *rsp->program, reg, data, 0x00000000); |
| 499 | (rsp->sp_reg_w_func)(reg, data, 0x00000000); |
| 500 | 500 | } |
| 501 | 501 | else if (reg >= 8 && reg < 16) |
| 502 | 502 | { |
| 503 | | (rsp->config->dp_reg_w)(rsp->device, *rsp->program, reg - 8, data, 0x00000000); |
| 503 | (rsp->dp_reg_w_func)(reg - 8, data, 0x00000000); |
| 504 | 504 | } |
| 505 | 505 | else |
| 506 | 506 | { |
| r18447 | r18448 | |
| 585 | 585 | |
| 586 | 586 | memset(rsp, 0, sizeof(*rsp)); |
| 587 | 587 | |
| 588 | | rsp->config = (const rsp_config *)device->static_config(); |
| 588 | const rsp_config *config = (const rsp_config *)device->static_config(); |
| 589 | // resolve callbacks |
| 590 | rsp->dp_reg_r_func.resolve(config->dp_reg_r_cb, *device); |
| 591 | rsp->dp_reg_w_func.resolve(config->dp_reg_w_cb, *device); |
| 592 | rsp->sp_reg_r_func.resolve(config->sp_reg_r_cb, *device); |
| 593 | rsp->sp_reg_w_func.resolve(config->sp_reg_w_cb, *device); |
| 594 | rsp->sp_set_status_func.resolve(config->sp_set_status_cb, *device); |
| 595 | |
| 589 | 596 | rsp->irq_callback = irqcallback; |
| 590 | 597 | rsp->device = device; |
| 591 | 598 | rsp->program = &device->space(AS_PROGRAM); |
| r18447 | r18448 | |
| 3371 | 3378 | static void cfunc_sp_set_status_cb(void *param) |
| 3372 | 3379 | { |
| 3373 | 3380 | rsp_state *rsp = (rsp_state*)param; |
| 3374 | | (rsp->config->sp_set_status)(rsp->device, rsp->impstate->arg0); |
| 3381 | (rsp->sp_set_status_func)(0, rsp->impstate->arg0); |
| 3375 | 3382 | } |
| 3376 | 3383 | |
| 3377 | 3384 | static CPU_EXECUTE( rsp ) |
trunk/src/emu/cpu/rsp/rsp.c
| r18447 | r18448 | |
| 182 | 182 | reg &= 0xf; |
| 183 | 183 | if (reg < 8) |
| 184 | 184 | { |
| 185 | | return (rsp->config->sp_reg_r)(rsp->device, reg, 0x00000000); |
| 185 | return (rsp->sp_reg_r_func)(reg, 0x00000000); |
| 186 | 186 | } |
| 187 | 187 | else if (reg >= 8 && reg < 16) |
| 188 | 188 | { |
| 189 | | return (rsp->config->dp_reg_r)(rsp->device, reg - 8, 0x00000000); |
| 189 | return (rsp->dp_reg_r_func)(reg - 8, 0x00000000); |
| 190 | 190 | } |
| 191 | 191 | |
| 192 | 192 | return 0; |
| r18447 | r18448 | |
| 197 | 197 | reg &= 0xf; |
| 198 | 198 | if (reg < 8) |
| 199 | 199 | { |
| 200 | | (rsp->config->sp_reg_w)(rsp->device, reg, data, 0x00000000); |
| 200 | (rsp->sp_reg_w_func)(reg, data, 0x00000000); |
| 201 | 201 | } |
| 202 | 202 | else if (reg >= 8 && reg < 16) |
| 203 | 203 | { |
| 204 | | (rsp->config->dp_reg_w)(rsp->device, reg - 8, data, 0x00000000); |
| 204 | (rsp->dp_reg_w_func)(reg - 8, data, 0x00000000); |
| 205 | 205 | } |
| 206 | 206 | } |
| 207 | 207 | |
| r18447 | r18448 | |
| 274 | 274 | rsp_state *rsp = get_safe_token(device); |
| 275 | 275 | int regIdx; |
| 276 | 276 | int accumIdx; |
| 277 | | rsp->config = (const rsp_config *)device->static_config(); |
| 277 | const rsp_config *config = (const rsp_config *)device->static_config(); |
| 278 | // resolve callbacks |
| 279 | rsp->dp_reg_r_func.resolve(config->dp_reg_r_cb, *device); |
| 280 | rsp->dp_reg_w_func.resolve(config->dp_reg_w_cb, *device); |
| 281 | rsp->sp_reg_r_func.resolve(config->sp_reg_r_cb, *device); |
| 282 | rsp->sp_reg_w_func.resolve(config->sp_reg_w_cb, *device); |
| 283 | rsp->sp_set_status_func.resolve(config->sp_set_status_cb, *device); |
| 278 | 284 | |
| 279 | 285 | if (LOG_INSTRUCTION_EXECUTION) |
| 280 | 286 | rsp->exec_output = fopen("rsp_execute.txt", "wt"); |
| r18447 | r18448 | |
| 2715 | 2721 | case 0x09: /* JALR */ JUMP_PC_L(RSVAL, RDREG); break; |
| 2716 | 2722 | case 0x0d: /* BREAK */ |
| 2717 | 2723 | { |
| 2718 | | (rsp->config->sp_set_status)(rsp->device, 0x3); |
| 2724 | (rsp->sp_set_status_func)(0, 0x3); |
| 2719 | 2725 | rsp->icount = MIN(rsp->icount, 1); |
| 2720 | 2726 | |
| 2721 | 2727 | if (LOG_INSTRUCTION_EXECUTION) fprintf(rsp->exec_output, "\n---------- break ----------\n\n"); |