From: Toni Wilen Date: Sun, 18 Jan 2015 12:54:38 +0000 (+0200) Subject: Autovector interrupt update (not used in Amiga), clear HALT status when loading state... X-Git-Tag: 3100~127 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=4f57261221df120e77d9f26147a985930d7c642d;p=francis%2Fwinuae.git Autovector interrupt update (not used in Amiga), clear HALT status when loading state file. --- diff --git a/newcpu.cpp b/newcpu.cpp index 1eb5196f..346a956d 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -2114,6 +2114,7 @@ static void Exception_ce000 (int nr) uae_u32 currpc = m68k_getpc (), newpc; int sv = regs.s; int start, interrupt; + int vector_nr = nr; start = 6; interrupt = nr >= 24 && nr < 24 + 8; @@ -2161,21 +2162,21 @@ static void Exception_ce000 (int nr) m68k_areg (regs, 7) -= 8; x_put_word (m68k_areg (regs, 7) + 4, currpc); // write low address if (interrupt) - nr = iack_cycle(nr); + vector_nr = iack_cycle(nr); x_put_word (m68k_areg (regs, 7) + 0, regs.sr); // write SR x_put_word (m68k_areg (regs, 7) + 2, currpc >> 16); // write high address - x_put_word (m68k_areg (regs, 7) + 6, nr * 4); + x_put_word (m68k_areg (regs, 7) + 6, vector_nr * 4); } else { m68k_areg (regs, 7) -= 6; x_put_word (m68k_areg (regs, 7) + 4, currpc); // write low address if (interrupt) - nr = iack_cycle(nr); + vector_nr = iack_cycle(nr); x_put_word (m68k_areg (regs, 7) + 0, regs.sr); // write SR x_put_word (m68k_areg (regs, 7) + 2, currpc >> 16); // write high address } kludge_me_do: - newpc = x_get_word (regs.vbr + 4 * nr) << 16; // read high address - newpc |= x_get_word (regs.vbr + 4 * nr + 2); // read low address + newpc = x_get_word (regs.vbr + 4 * vector_nr) << 16; // read high address + newpc |= x_get_word (regs.vbr + 4 * vector_nr + 2); // read low address if (newpc & 1) { if (nr == 2 || nr == 3) cpu_halt (2); @@ -2525,11 +2526,12 @@ static void Exception_normal (int nr) uae_u32 currpc, newpc; int sv = regs.s; int interrupt; + int vector_nr = nr; interrupt = nr >= 24 && nr < 24 + 8; if (interrupt && currprefs.cpu_model <= 68010) - nr = iack_cycle(nr); + vector_nr = iack_cycle(nr); exception_debug (nr); MakeSR (); @@ -2580,12 +2582,12 @@ static void Exception_normal (int nr) x_put_long (m68k_areg (regs, 7), regs.mmu_fault_addr); m68k_areg (regs, 7) -= 2; - x_put_word (m68k_areg (regs, 7), 0x7000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x7000 + vector_nr * 4); m68k_areg (regs, 7) -= 4; x_put_long (m68k_areg (regs, 7), regs.instruction_pc); m68k_areg (regs, 7) -= 2; x_put_word (m68k_areg (regs, 7), regs.sr); - newpc = x_get_long (regs.vbr + 4 * nr); + newpc = x_get_long (regs.vbr + 4 * vector_nr); if (newpc & 1) { if (nr == 2 || nr == 3) cpu_halt (2); @@ -2620,7 +2622,7 @@ static void Exception_normal (int nr) m68k_areg (regs, 7) -= 4; x_put_long (m68k_areg (regs, 7), last_addr_for_exception_3); m68k_areg (regs, 7) -= 2; - x_put_word (m68k_areg (regs, 7), 0x7000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x7000 + vector_nr * 4); m68k_areg (regs, 7) -= 4; x_put_long (m68k_areg (regs, 7), regs.instruction_pc); m68k_areg (regs, 7) -= 2; @@ -2633,7 +2635,7 @@ static void Exception_normal (int nr) m68k_areg (regs, 7) -= 4; x_put_long (m68k_areg (regs, 7), last_fault_for_exception_3); m68k_areg (regs, 7) -= 2; - x_put_word (m68k_areg (regs, 7), 0x2000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x2000 + vector_nr * 4); } } else { // 68020 address error @@ -2655,17 +2657,17 @@ static void Exception_normal (int nr) m68k_areg (regs, 7) -= 2; x_put_word (m68k_areg (regs, 7), ssw); m68k_areg (regs, 7) -= 2; - x_put_word (m68k_areg (regs, 7), 0xb000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0xb000 + vector_nr * 4); } - write_log (_T("Exception %d (%x) at %x -> %x!\n"), nr, regs.instruction_pc, currpc, get_long_debug (regs.vbr + 4*nr)); + write_log (_T("Exception %d (%x) at %x -> %x!\n"), nr, regs.instruction_pc, currpc, get_long_debug (regs.vbr + 4 * vector_nr)); } else if (nr ==5 || nr == 6 || nr == 7 || nr == 9) { m68k_areg (regs, 7) -= 4; x_put_long (m68k_areg (regs, 7), regs.instruction_pc); m68k_areg (regs, 7) -= 2; - x_put_word (m68k_areg (regs, 7), 0x2000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x2000 + vector_nr * 4); } else if (regs.m && interrupt) { /* M + Interrupt */ m68k_areg (regs, 7) -= 2; - x_put_word (m68k_areg (regs, 7), nr * 4); + x_put_word (m68k_areg (regs, 7), vector_nr * 4); m68k_areg (regs, 7) -= 4; x_put_long (m68k_areg (regs, 7), currpc); m68k_areg (regs, 7) -= 2; @@ -2675,10 +2677,10 @@ static void Exception_normal (int nr) regs.m = 0; m68k_areg (regs, 7) = regs.isp; m68k_areg (regs, 7) -= 2; - x_put_word (m68k_areg (regs, 7), 0x1000 + nr * 4); + x_put_word (m68k_areg (regs, 7), 0x1000 + vector_nr * 4); } else { m68k_areg (regs, 7) -= 2; - x_put_word (m68k_areg (regs, 7), nr * 4); + x_put_word (m68k_areg (regs, 7), vector_nr * 4); } } else { add_approximate_exception_cycles(nr); @@ -2694,7 +2696,7 @@ static void Exception_normal (int nr) x_put_word (m68k_areg (regs, 7) + 6, last_op_for_exception_3); x_put_word (m68k_areg (regs, 7) + 8, regs.sr); x_put_long (m68k_areg (regs, 7) + 10, last_addr_for_exception_3); - write_log (_T("Exception %d (%x) at %x -> %x!\n"), nr, last_fault_for_exception_3, currpc, get_long_debug (regs.vbr + 4*nr)); + write_log (_T("Exception %d (%x) at %x -> %x!\n"), nr, last_fault_for_exception_3, currpc, get_long_debug (regs.vbr + 4 * vector_nr)); goto kludge_me_do; } } @@ -2703,7 +2705,7 @@ static void Exception_normal (int nr) m68k_areg (regs, 7) -= 2; x_put_word (m68k_areg (regs, 7), regs.sr); kludge_me_do: - newpc = x_get_long (regs.vbr + 4 * nr); + newpc = x_get_long (regs.vbr + 4 * vector_nr); if (newpc & 1) { if (nr == 2 || nr == 3) cpu_halt (2); @@ -2816,9 +2818,14 @@ static void m68k_reset2(bool hardreset) { uae_u32 v; + regs.halted = 0; + gui_data.cpu_halted = 0; + gui_led (LED_CPU, 0); + regs.spcflags = 0; m68k_reset_delay = 0; regs.ipl = regs.ipl_pin = 0; + #ifdef SAVESTATE if (isrestore ()) { m68k_reset_sr(); @@ -2878,10 +2885,6 @@ static void m68k_reset2(bool hardreset) fake_mmusr_030 = 0; } - regs.halted = 0; - gui_data.cpu_halted = 0; - gui_led (LED_CPU, 0); - /* 68060 FPU is not compatible with 68040, * 68060 accelerators' boot ROM disables the FPU */