static void doexcstack(void)
{
+ bool g1 = generates_group1_exception(regs.ir);
+
doexcstack2();
if (cpu_lvl >= 2)
return;
flags |= 0x10000 | 0x20000;
}
+ // set I/N if original exception was group 1 exception.
+ flags |= 0x20000;
+ if (g1) {
+ flags |= 0x10000;
+ }
+
exception3_read(regs.ir | flags, test_exception_addr, 1, 2);
}
[test=ODD_EXC]
enabled=0
feature_exception_vectors=0x000123
-mode=chk,trap,trapv,divu,divs,orsr
+mode=mv2sr.w,mvusp2r,mvr2usp,illegal,chk,trap,trapv,divu,divs,orsr.w
; interrupt exception with odd interrupt vectors
[test=ODD_IRQ]
exception_debug (nr);
MakeSR ();
+ bool g1 = generates_group1_exception(regs.ir);
if (!regs.s) {
regs.usp = m68k_areg (regs, 7);
m68k_areg (regs, 7) = regs.isp;
regs.ir = nr;
exception3_read(regs.ir | 0x20000 | 0x10000, newpc, sz_word, 2);
} else {
- exception3_read(regs.ir | 0x40000, newpc, sz_word, 2);
+ exception3_read(regs.ir | 0x40000 | 0x20000 | (g1 ? 0x10000 : 0), newpc, sz_word, 2);
}
} else if (currprefs.cpu_model == 68010) {
// offset, not vbr + offset
int sv = regs.s;
int interrupt;
int vector_nr = nr;
+ bool g1 = false;
cache_default_data |= CACHE_DISABLE_ALLOCATE;
interrupt = nr >= 24 && nr < 24 + 8;
- if (interrupt && currprefs.cpu_model <= 68010)
- vector_nr = iack_cycle(nr);
+ if (currprefs.cpu_model <= 68010) {
+ g1 = generates_group1_exception(regs.ir);
+ if (interrupt)
+ vector_nr = iack_cycle(nr);
+ }
exception_debug (nr);
MakeSR ();
regs.ir = nr;
exception3_read(regs.ir | 0x20000 | 0x10000, newpc, sz_word, 2);
} else {
- exception3_read(regs.ir | 0x40000, newpc, sz_word, 2);
+ exception3_read(regs.ir | 0x40000 | 0x20000 | (g1 ? 0x10000 : 0), newpc, sz_word, 2);
}
} else if (currprefs.cpu_model == 68010) {
regs.t1 = 0;