void m68000_execute2(UINT32 start, UINT32 break_point) { int nest_counter = 0; UINT32 pc, old_pc, opcode; c68k_struc C68K_temp; old_pc = C68k_Get_Reg(&C68K, M68K_PC); memcpy(&C68K_temp, &C68K, sizeof(c68k_struc)); C68k_Set_Reg(&C68K_temp, C68K_PC, start); C68K_temp.A[5] = 0x108000; C68K_temp.A[7] -= 4 * 8 * 2; while ((pc = C68k_Get_Reg(&C68K_temp, M68K_PC)) != break_point) { opcode = Memory_ReadW(pc); if (opcode == 0x4e75) { // rts nest_counter--; if (nest_counter < 0) break; } else if (opcode == 0x6100) { // bsr 16 nest_counter++; } else if ((opcode & 0xff00) == 0x6100) { // bsr 8 nest_counter++; } else if ((opcode & 0xffc0) == 0x4e80) { // jsr nest_counter++; } C68k_Exec(&C68K_temp, 1); } C68k_Set_Reg(&C68K, C68K_PC, old_pc); }
void C68k_Reset(c68k_struc *CPU) { UINT32 PC; memset(CPU, 0, (UINT32)&CPU->BasePC - (UINT32)CPU); CPU->flag_I = 7; CPU->flag_S = C68K_SR_S; CPU->A[7] = READ_PCREL_32(0); PC = READ_PCREL_32(4); C68k_Set_Reg(CPU, C68K_PC, PC); }
void m68000_set_reg(int regnum, UINT32 val) { switch (regnum) { case M68K_PC: C68k_Set_Reg(&C68K, C68K_PC, val); break; case M68K_USP: C68k_Set_Reg(&C68K, C68K_USP, val); break; case M68K_MSP: C68k_Set_Reg(&C68K, C68K_MSP, val); break; case M68K_SR: C68k_Set_Reg(&C68K, C68K_SR, val); break; case M68K_D0: C68k_Set_Reg(&C68K, C68K_D0, val); break; case M68K_D1: C68k_Set_Reg(&C68K, C68K_D1, val); break; case M68K_D2: C68k_Set_Reg(&C68K, C68K_D2, val); break; case M68K_D3: C68k_Set_Reg(&C68K, C68K_D3, val); break; case M68K_D4: C68k_Set_Reg(&C68K, C68K_D4, val); break; case M68K_D5: C68k_Set_Reg(&C68K, C68K_D5, val); break; case M68K_D6: C68k_Set_Reg(&C68K, C68K_D6, val); break; case M68K_D7: C68k_Set_Reg(&C68K, C68K_D7, val); break; case M68K_A0: C68k_Set_Reg(&C68K, C68K_A0, val); break; case M68K_A1: C68k_Set_Reg(&C68K, C68K_A1, val); break; case M68K_A2: C68k_Set_Reg(&C68K, C68K_A2, val); break; case M68K_A3: C68k_Set_Reg(&C68K, C68K_A3, val); break; case M68K_A4: C68k_Set_Reg(&C68K, C68K_A4, val); break; case M68K_A5: C68k_Set_Reg(&C68K, C68K_A5, val); break; case M68K_A6: C68k_Set_Reg(&C68K, C68K_A6, val); break; case M68K_A7: C68k_Set_Reg(&C68K, C68K_A7, val); break; default: break; } }