/* Read the initial stack pointer and program counter */
m68ki_jump(0);
+ REG_SP = m68ki_read_imm_32();
+ REG_PC = m68ki_read_imm_32();
+ m68ki_jump(REG_PC);
CPU_RUN_MODE = RUN_MODE_NORMAL;
#endif
-uint m68ki_read_imm6_addr_slowpath(uint32_t address, address_translation_cache *cache)
+uint m68ki_read_imm6_addr_slowpath(uint32_t pc, address_translation_cache *cache)
{
+ uint32_t address = ADDRESS_68K(pc);
+ uint32_t pc_address_diff = pc - address;
for (int i = 0; i < read_ranges; i++) {
if(address >= read_addr[i] && address < read_upper[i]) {
- cache->lower = read_addr[i];
- cache->upper = read_upper[i];
+ cache->lower = read_addr[i] + pc_address_diff;
+ cache->upper = read_upper[i] + pc_address_diff;
cache->data = read_data[i];
REG_PC += 2;
return be16toh(((unsigned short *)(read_data[i] + (address - read_addr[i])))[0]);
}
}
+void m68k_clear_ranges()
+{
+ printf("[MUSASHI] Clearing all reads/write memory ranges.\n");
+ for (int i = 0; i < 8; i++) {
+ read_upper[i] = 0;
+ read_addr[i] = 0;
+ read_data[i] = NULL;
+ write_upper[i] = 0;
+ write_addr[i] = 0;
+ write_data[i] = NULL;
+ }
+ write_ranges = 0;
+ read_ranges = 0;
+}
+
/* ======================================================================== */
/* ============================== MAME STUFF ============================== */
/* ======================================================================== */