void Sh4_int_Reset(bool Manual) { if (sh4_int_bCpuRun) { printf("Sh4 Is running, can't Reset\n"); } else { next_pc = 0xA0000000; memset(r,0,sizeof(r)); memset(r_bank,0,sizeof(r_bank)); gbr=ssr=spc=sgr=dbr=vbr=0; mac.full=pr=fpul=0; sr.SetFull(0x700000F0); old_sr.status=sr.status; UpdateSR(); fpscr.full = 0x0004001; old_fpscr=fpscr; UpdateFPSCR(); //Any more registers have default value ? printf("Sh4 Reset\n"); } }
static bool Do_Interrupt(u32 intEvn) { CCN_INTEVT = intEvn; ssr = sh4_sr_GetFull(); spc = next_pc; sgr = r[15]; sr.BL = 1; sr.MD = 1; sr.RB = 1; UpdateSR(); next_pc = vbr + 0x600; return true; }
bool Do_Exeption(u32 epc, u32 expEvn, u32 CallVect) { CCN_EXPEVT = expEvn; ssr = sr.GetFull(); spc = epc; sgr = r[15]; sr.BL = 1; sr.MD = 1; sr.RB = 1; UpdateSR(); next_pc = vbr + CallVect; return true; }
bool Do_Exception(u32 epc, u32 expEvn, u32 CallVect) { verify(sr.BL == 0); CCN_EXPEVT = expEvn; ssr = sh4_sr_GetFull(); spc = epc; sgr = r[15]; sr.BL = 1; sr.MD = 1; sr.RB = 1; UpdateSR(); next_pc = vbr + CallVect; #ifndef NDEBUG printf("RaiseException: from %08X , pc errh %08X, %08X vect\n", spc, epc, next_pc); #endif return true; }