]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
NMI handling fix
authorToni Wilen <twilen@winuae.net>
Sat, 6 Jan 2024 08:39:56 +0000 (10:39 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 6 Jan 2024 08:39:56 +0000 (10:39 +0200)
custom.cpp
include/newcpu.h
newcpu.cpp

index cd1b401acda3faf57f1459abc6b7115ea3a69bf1..f5a60b7c7ca76ca57a4039768367eed63606eaa5 100644 (file)
@@ -8690,7 +8690,7 @@ int intlev(void)
        }
        uae_u16 imask = intreq2 & intena2;
        if (!(imask && (intena2 & 0x4000)))
-               return -1;
+               return 0;
        if (imask & (0x4000 | 0x2000))                                          // 13 14
                return 6;
        if (imask & (0x1000 | 0x0800))                                          // 11 12
@@ -8703,7 +8703,7 @@ int intlev(void)
                return 2;
        if (imask & (0x0001 | 0x0002 | 0x0004))                         // 0 1 2
                return 1;
-       return -1;
+       return 0;
 }
 
 void rethink_uae_int(void)
index 6eac8ff17621b6c086fca23092e09efc97ad1fb5..6f9793f167c4e4bd8ece5fda86d3283be8e21804 100644 (file)
@@ -207,6 +207,7 @@ struct regstruct
        int exception;
        int intmask;
        int ipl[2], ipl_pin, ipl_pin_p;
+       int lastipl;
        evt_t ipl_pin_change_evt, ipl_pin_change_evt_p;
        evt_t ipl_evt, ipl_evt_pre;
        int ipl_evt_pre_mode;
index dde2bbfaf0d4c979846cb230594452335c8bff0f..31e88ee976b4270bdb27ad9133da16ceaa9b795a 100644 (file)
@@ -3607,6 +3607,7 @@ static void m68k_reset2(bool hardreset)
        SET_VFLG(0);
        SET_NFLG(0);
        regs.intmask = 7;
+       regs.lastipl = 0;
        regs.vbr = regs.sfc = regs.dfc = 0;
        regs.irc = 0xffff;
 #ifdef FPUEMU
@@ -4767,8 +4768,10 @@ static int do_specialties (int cycles)
                        if (spcflags & SPCFLAG_INT) {
                                int intr = intlev();
                                unset_special (SPCFLAG_INT | SPCFLAG_DOINT);
-                               if (intr > regs.intmask || intr == 7)
+                               if (intr > regs.intmask || (intr == 7 && intr > regs.lastipl)) {
                                        do_interrupt(intr);
+                               }
+                               regs.lastipl = intr;
                        }
                }