--- trunk/src/cpus/cpu_sh_instr.c 2007/10/08 16:21:26 35 +++ trunk/src/cpus/cpu_sh_instr.c 2007/10/08 16:21:34 36 @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * - * $Id: cpu_sh_instr.c,v 1.49 2007/01/28 16:59:06 debug Exp $ + * $Id: cpu_sh_instr.c,v 1.51 2007/03/08 19:04:09 debug Exp $ * * SH instructions. * @@ -285,10 +285,10 @@ /* - * mov_b_rm_predec_rn: mov.b reg,@-Rn - * mov_w_rm_predec_rn: mov.w reg,@-Rn - * mov_l_rm_predec_rn: mov.l reg,@-Rn - * stc_l_rm_predec_rn: mov.l reg,@-Rn, with MD status bit check + * mov_b_rm_predec_rn: mov.b reg,@-Rn + * mov_w_rm_predec_rn: mov.w reg,@-Rn + * mov_l_rm_predec_rn: mov.l reg,@-Rn + * stc_l_rm_predec_rn_md: mov.l reg,@-Rn, with MD status bit check * * arg[0] = ptr to rm (or other register) * arg[1] = ptr to rn @@ -362,7 +362,7 @@ reg(ic->arg[1]) = addr; } } -X(stc_l_rm_predec_rn) +X(stc_l_rm_predec_rn_md) { uint32_t addr = reg(ic->arg[1]) - sizeof(uint32_t); uint32_t *p = (uint32_t *) cpu->cd.sh.host_store[addr >> 12]; @@ -2632,15 +2632,25 @@ /* - * prom_emul_dreamcast: + * prom_emul: */ -X(prom_emul_dreamcast) +X(prom_emul) { uint32_t old_pc; SYNCH_PC; old_pc = cpu->pc; - dreamcast_emul(cpu); + switch (cpu->machine->machine_type) { + case MACHINE_DREAMCAST: + dreamcast_emul(cpu); + break; + case MACHINE_LANDISK: + sh_ipl_g_emul(cpu); + break; + default: + fatal("SH prom_emul: unimplemented machine type.\n"); + exit(1); + } if (!cpu->running) { cpu->n_translated_instrs --; @@ -2891,8 +2901,8 @@ ic->f = instr(copy_privileged_register); ic->arg[0] = (size_t)&cpu->cd.sh.r_bank[(lo8 >> 4) & 7]; } else if (iword == SH_INVALID_INSTR) { - /* PROM emulation specifically for Dreamcast */ - ic->f = instr(prom_emul_dreamcast); + /* PROM emulation (GXemul specific) */ + ic->f = instr(prom_emul); } else { switch (lo8) { case 0x02: /* STC SR,Rn */ @@ -3102,7 +3112,7 @@ ic->f = instr(shld); } else if ((lo8 & 0x8f) == 0x83) { /* STC.L Rm_BANK,@-Rn */ - ic->f = instr(stc_l_rm_predec_rn); + ic->f = instr(stc_l_rm_predec_rn_md); ic->arg[0] = (size_t)&cpu->cd.sh.r_bank[ (lo8 >> 4) & 7]; /* m */ } else if ((lo8 & 0x8f) == 0x87) { @@ -3127,7 +3137,7 @@ ic->arg[0] = (size_t)&cpu->cd.sh.mach; break; case 0x03: /* STC.L SR,@-Rn */ - ic->f = instr(stc_l_rm_predec_rn); + ic->f = instr(stc_l_rm_predec_rn_md); ic->arg[0] = (size_t)&cpu->cd.sh.sr; break; case 0x04: /* ROTL Rn */ @@ -3172,7 +3182,7 @@ ic->arg[0] = (size_t)&cpu->cd.sh.macl; break; case 0x13: /* STC.L GBR,@-Rn */ - ic->f = instr(stc_l_rm_predec_rn); + ic->f = instr(mov_l_rm_predec_rn); ic->arg[0] = (size_t)&cpu->cd.sh.gbr; break; case 0x15: /* CMP/PL Rn */ @@ -3183,7 +3193,7 @@ ic->arg[0] = (size_t)&cpu->cd.sh.macl; break; case 0x17: /* LDC.L @Rm+,GBR */ - ic->f = instr(mov_l_arg1_postinc_to_arg0_md); + ic->f = instr(mov_l_arg1_postinc_to_arg0); ic->arg[0] = (size_t)&cpu->cd.sh.gbr; break; case 0x18: /* SHLL8 Rn */ @@ -3212,7 +3222,7 @@ ic->arg[1] = (size_t)&cpu->cd.sh.r[r8]; /* n */ break; case 0x23: /* STC.L VBR,@-Rn */ - ic->f = instr(stc_l_rm_predec_rn); + ic->f = instr(stc_l_rm_predec_rn_md); ic->arg[0] = (size_t)&cpu->cd.sh.vbr; break; case 0x24: /* ROTCL Rn */ @@ -3254,7 +3264,7 @@ ic->arg[1] = (size_t)&cpu->cd.sh.vbr; break; case 0x33: /* STC.L SSR,@-Rn */ - ic->f = instr(stc_l_rm_predec_rn); + ic->f = instr(stc_l_rm_predec_rn_md); ic->arg[0] = (size_t)&cpu->cd.sh.ssr; break; case 0x37: /* LDC.L @Rm+,SSR */ @@ -3267,7 +3277,7 @@ ic->arg[1] = (size_t)&cpu->cd.sh.ssr; break; case 0x43: /* STC.L SPC,@-Rn */ - ic->f = instr(stc_l_rm_predec_rn); + ic->f = instr(stc_l_rm_predec_rn_md); ic->arg[0] = (size_t)&cpu->cd.sh.spc; break; case 0x47: /* LDC.L @Rm+,SPC */