--- uae/src/newcpu.c 2018/04/24 17:10:48 1.1.1.20 +++ uae/src/newcpu.c 2018/04/24 17:14:19 1.1.1.22 @@ -117,11 +117,10 @@ static void build_cpufunctbl (void) : currprefs.cpu_level == 3 ? op_smalltbl_1_ff : currprefs.cpu_level == 2 ? op_smalltbl_2_ff : currprefs.cpu_level == 1 ? op_smalltbl_3_ff - : ! currprefs.cpu_compatible ? op_smalltbl_4_ff : op_smalltbl_5_ff); - write_log ("Building CPU function table (%d %d %d).\n", - currprefs.cpu_level, currprefs.cpu_compatible, currprefs.address_space_24); + write_log ("Building CPU function table (%d %d).\n", + currprefs.cpu_level, currprefs.address_space_24); for (opcode = 0; opcode < 65536; opcode++) cpufunctbl[opcode] = op_illg_1; @@ -177,16 +176,6 @@ static void update_68k_cycles (void) void check_prefs_changed_cpu (void) { - if (currprefs.cpu_level != changed_prefs.cpu_level - || currprefs.cpu_compatible != changed_prefs.cpu_compatible) - { - if (!currprefs.cpu_compatible && changed_prefs.cpu_compatible) - fill_prefetch_slow (); - - currprefs.cpu_level = changed_prefs.cpu_level; - currprefs.cpu_compatible = changed_prefs.cpu_compatible; - build_cpufunctbl (); - } if (currprefs.m68k_speed != changed_prefs.m68k_speed) { currprefs.m68k_speed = changed_prefs.m68k_speed; reset_frame_rate_hack (); @@ -237,33 +226,31 @@ void init_m68k (void) write_log ("Building CPU table for configuration: 68"); regs.address_space_mask = 0xffffffff; if (currprefs.address_space_24 && currprefs.cpu_level > 1) - write_log ("EC"); + write_log ("EC"); switch (currprefs.cpu_level) { case 1: - write_log ("010"); - break; + write_log ("010"); + break; case 2: - write_log ("020"); - break; + write_log ("020"); + break; case 3: - write_log ("020/881"); - break; + write_log ("020/881"); + break; case 4: - /* Who is going to miss the MMU anyway...? :-) */ - write_log ("040"); - break; + /* Who is going to miss the MMU anyway...? :-) */ + write_log ("040"); + break; default: - write_log ("000"); - break; + write_log ("000"); + break; } - if (currprefs.cpu_compatible) - write_log (" (compatible mode)"); if (currprefs.address_space_24) { regs.address_space_mask = 0x00ffffff; write_log (" 24-bit addressing"); } write_log ("\n"); - + read_table68k (); do_merges (); @@ -705,7 +692,7 @@ void MakeFromSR (void) if (regs.t1 || regs.t0) set_special (SPCFLAG_TRACE); else - /* Keep SPCFLAG_DOTRACE, we still want a trace exception for + /* Keep SPCFLAG_DOTRACE, we still want a trace exception for SR-modifying instructions (including STOP). */ unset_special (SPCFLAG_TRACE); } @@ -728,7 +715,7 @@ static void exception_debug (int nr) #ifdef DEBUGGER if (!exception_debugging) return; - console_out ("Exception %d, PC=%08.8X\n", nr, m68k_getpc()); + console_out ("Exception %d, PC=%08.8X\n", nr, m68k_getpc()); #endif } @@ -785,8 +772,8 @@ void Exception_normal (int nr, uaecptr o m68k_areg(regs, 7) -= 2; put_word (m68k_areg(regs, 7), 0); } - m68k_areg(regs, 7) -= 4; - put_long (m68k_areg(regs, 7), last_fault_for_exception_3); + m68k_areg(regs, 7) -= 4; + put_long (m68k_areg(regs, 7), last_fault_for_exception_3); m68k_areg(regs, 7) -= 2; put_word (m68k_areg(regs, 7), 0); m68k_areg(regs, 7) -= 2; @@ -798,7 +785,10 @@ void Exception_normal (int nr, uaecptr o m68k_areg(regs, 7) -= 2; put_word (m68k_areg(regs, 7), 0xb000 + nr * 4); } +#if 0 write_log ("Exception %d (%x) at %x -> %x!\n", nr, oldpc, currpc, get_long (regs.vbr + 4*nr)); +#endif + } else if (nr ==5 || nr == 6 || nr == 7 || nr == 9) { m68k_areg(regs, 7) -= 4; put_long (m68k_areg(regs, 7), oldpc); @@ -822,7 +812,7 @@ void Exception_normal (int nr, uaecptr o } } else if (nr == 2 || nr == 3) { uae_u16 mode = (sv ? 4 : 0) | (last_instructionaccess_for_exception_3 ? 2 : 1); - mode |= last_writeaccess_for_exception_3 ? 0 : 16; + mode |= last_writeaccess_for_exception_3 ? 0 : 16; m68k_areg(regs, 7) -= 14; /* fixme: bit3=I/N */ put_word (m68k_areg(regs, 7) + 0, mode); @@ -830,7 +820,7 @@ void Exception_normal (int nr, uaecptr o put_word (m68k_areg(regs, 7) + 6, last_op_for_exception_3); put_word (m68k_areg(regs, 7) + 8, regs.sr); put_long (m68k_areg(regs, 7) + 10, last_addr_for_exception_3); - write_log ("Exception %d (%x) at %x -> %x!\n", nr, oldpc, currpc, get_long (regs.vbr + 4*nr)); + write_log ("Exception %d (%x) at %x -> %x!\n", nr, oldpc, currpc, get_long (regs.vbr + 4*nr)); goto kludge_me_do; } m68k_areg(regs, 7) -= 4; @@ -841,7 +831,7 @@ kludge_me_do: newpc = get_long (regs.vbr + 4 * nr); if (newpc & 1) { if (nr == 2 || nr == 3) - uae_reset (); /* there is nothing else we can do.. */ + uae_reset (1); /* there is nothing else we can do.. */ else exception3 (regs.ir, m68k_getpc(), newpc); return; @@ -890,7 +880,7 @@ int m68k_move2c (int regno, uae_u32 *reg case 5: itt1 = *regp & 0xffffe364; break; case 6: dtt0 = *regp & 0xffffe364; break; case 7: dtt1 = *regp & 0xffffe364; break; - + case 0x800: regs.usp = *regp; break; case 0x801: regs.vbr = *regp; break; case 0x802: caar = *regp & 0xfc; break; @@ -1198,10 +1188,18 @@ static char* ccnames[] = void m68k_reset (void) { + if (currprefs.cpu_level != changed_prefs.cpu_level + || currprefs.address_space_24 != changed_prefs.address_space_24) + { + currprefs.address_space_24 = changed_prefs.address_space_24; + currprefs.cpu_level = changed_prefs.cpu_level; + build_cpufunctbl (); + } + regs.kick_mask = 0x00F80000; regs.spcflags = 0; if (savestate_state == STATE_RESTORE) { - m68k_setpc (regs.pc); + m68k_setpc (regs.pc); /* MakeFromSR() must not swap stack pointer */ regs.s = (regs.sr >> 13) & 1; MakeFromSR(); @@ -1235,7 +1233,7 @@ void m68k_reset (void) unsigned long REGPARAM2 op_illg (uae_u32 opcode) { uaecptr pc = m68k_getpc (); - + if (cloanto_rom && (opcode & 0xF100) == 0x7100) { m68k_dreg (regs, (opcode >> 9) & 7) = (uae_s8)(opcode & 0xFF); m68k_incpc (2); @@ -1362,14 +1360,14 @@ static int do_specialties (int cycles) do_copper (); } - if (regs.spcflags & SPCFLAG_DOTRACE) { + if (regs.spcflags & SPCFLAG_DOTRACE) Exception (9,last_trace_ad); - } + while (regs.spcflags & SPCFLAG_STOP) { do_cycles (4 * CYCLE_UNIT); if (regs.spcflags & SPCFLAG_COPPER) do_copper (); - if (regs.spcflags & (SPCFLAG_INT | SPCFLAG_DOINT)){ + if (regs.spcflags & (SPCFLAG_INT | SPCFLAG_DOINT)) { int intr = intlev (); unset_special (SPCFLAG_INT | SPCFLAG_DOINT); if (intr != -1 && intr > regs.intmask) { @@ -1451,7 +1449,7 @@ static void m68k_run_2 (void) /*n_insns++;*/ cycles &= cycles_mask; cycles |= cycles_val; - do_cycles (cycles); + do_cycles (cycles); if (regs.spcflags) { if (do_specialties (cycles)) return; @@ -1520,10 +1518,10 @@ void m68k_go (int may_quit) /* system is very badly confused */ write_log ("double bus error or corrupted stack, forcing reboot..\n"); regs.panic = 0; - uae_reset (); + uae_reset (1); } } - m68k_run1 (currprefs.cpu_compatible ? m68k_run_1 : m68k_run_2); + m68k_run1 (currprefs.cpu_level == 0 ? m68k_run_1 : m68k_run_2); } in_m68k_go--; } @@ -1712,12 +1710,15 @@ uae_u8 *restore_cpu (uae_u8 *src) static int cpumodel[] = { 68000, 68010, 68020, 68020 }; -uae_u8 *save_cpu (int *len) +uae_u8 *save_cpu (int *len, uae_u8 *dstptr) { uae_u8 *dstbak,*dst; int model,i; - dstbak = dst = malloc(4+4+15*4+4+4+4+4+2+4+4+4+4+4+4+4); + if (dstptr) + dstbak = dst = dstptr; + else + dstbak = dst = malloc(4+4+15*4+4+4+4+4+2+4+4+4+4+4+4+4); model = cpumodel[currprefs.cpu_level]; save_u32 (model); /* MODEL */ save_u32 (currprefs.address_space_24 ? 1 : 0); /* FLAGS */