if (!regs.s) {
regs.usp = m68k_areg (regs, 7);
- if (currprefs.cpu_model == 68060) {
- m68k_areg (regs, 7) = regs.isp;
- if (interrupt)
- regs.m = 0;
- } else if (currprefs.cpu_model >= 68020) {
+ if (currprefs.cpu_model >= 68020 && currprefs.cpu_model < 68060) {
m68k_areg (regs, 7) = regs.m ? regs.msp : regs.isp;
} else {
m68k_areg (regs, 7) = regs.isp;
regs.s = 1;
mmu_set_super (1);
}
-
+
newpc = x_get_long (regs.vbr + 4 * nr);
#if 0
write_log (_T("Exception %d: %08x -> %08x\n"), nr, currpc, newpc);
} else if (nr == 5 || nr == 6 || nr == 7 || nr == 9) {
Exception_build_stack_frame(oldpc, currpc, regs.mmu_ssw, nr, 0x2);
} else if (regs.m && interrupt) { /* M + Interrupt */
- Exception_build_stack_frame(oldpc, currpc, regs.mmu_ssw, nr, 0x1);
+ Exception_build_stack_frame(oldpc, currpc, regs.mmu_ssw, nr, 0x0);
+ MakeSR();
+ regs.m = 0;
+ if (currprefs.cpu_model < 68060) {
+ regs.msp = m68k_areg(regs, 7);
+ Exception_build_stack_frame(oldpc, currpc, regs.mmu_ssw, nr, 0x1);
+ }
} else if (nr == 61) {
Exception_build_stack_frame(oldpc, regs.instruction_pc, regs.mmu_ssw, nr, 0x0);
} else {
if (!regs.s) {
regs.usp = m68k_areg (regs, 7);
- if (currprefs.cpu_model == 68060) {
- m68k_areg (regs, 7) = regs.isp;
- if (interrupt)
- regs.m = 0;
- } else if (currprefs.cpu_model >= 68020) {
+ if (currprefs.cpu_model >= 68020 && currprefs.cpu_model < 68060) {
m68k_areg (regs, 7) = regs.m ? regs.msp : regs.isp;
} else {
m68k_areg (regs, 7) = regs.isp;
} else if (regs.m && interrupt) { /* M + Interrupt */
m68k_areg (regs, 7) -= 2;
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;
- x_put_word (m68k_areg (regs, 7), regs.sr);
- regs.sr |= (1 << 13);
- regs.msp = m68k_areg (regs, 7);
- regs.m = 0;
- m68k_areg (regs, 7) = regs.isp;
- m68k_areg (regs, 7) -= 2;
- x_put_word (m68k_areg (regs, 7), 0x1000 + vector_nr * 4);
+ if (currprefs.cpu_model < 68060) {
+ m68k_areg (regs, 7) -= 4;
+ x_put_long (m68k_areg (regs, 7), currpc);
+ m68k_areg (regs, 7) -= 2;
+ x_put_word (m68k_areg (regs, 7), regs.sr);
+ regs.sr |= (1 << 13);
+ regs.msp = m68k_areg(regs, 7);
+ regs.m = 0;
+ m68k_areg(regs, 7) = regs.isp;
+ m68k_areg (regs, 7) -= 2;
+ x_put_word (m68k_areg (regs, 7), 0x1000 + vector_nr * 4);
+ }
} else {
m68k_areg (regs, 7) -= 2;
x_put_word (m68k_areg (regs, 7), vector_nr * 4);
x_put_long (m68k_areg (regs, 7), currpc);
m68k_areg (regs, 7) -= 2;
x_put_word (m68k_areg (regs, 7), regs.sr);
+ if (currprefs.cpu_model == 68060 && interrupt) {
+ regs.m = 0;
+ }
kludge_me_do:
newpc = x_get_long (regs.vbr + 4 * vector_nr);
exception_in_exception = 0;
for (;;) {
Exception (nr + 24);
regs.intmask = nr;
- if (!currprefs.cpu_compatible)
+ if (!currprefs.cpu_compatible || currprefs.cpu_model == 68060)
break;
if (m68k_interrupt_delay)
nr = regs.ipl;