]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Another attempt of fully thread safe interrupt activation.
authorToni Wilen <twilen@winuae.net>
Wed, 14 Feb 2018 15:39:42 +0000 (17:39 +0200)
committerToni Wilen <twilen@winuae.net>
Wed, 14 Feb 2018 15:39:42 +0000 (17:39 +0200)
29 files changed:
a2065.cpp
a2091.cpp
akiko.cpp
cd32_fmv.cpp
cdtv.cpp
cdtvcr.cpp
cia.cpp
cpuboard.cpp
custom.cpp
devices.cpp
gayle.cpp
idecontrollers.cpp
include/a2091.h
include/cpuboard.h
include/devices.h
include/ncr_scsi.h
include/newcpu.h
include/sysdeps.h
include/uae.h
ncr9x_scsi.cpp
ncr_scsi.cpp
newcpu.cpp
od-win32/posixemu.cpp
od-win32/win32.cpp
pci.cpp
qemuvga/ne2000.cpp
scsi.cpp
sndboard.cpp
x86.cpp

index 2438f87c3d8c8c58a761f8fdd6a9f79faf90dda4..053d50fda6d8c6231338b014819d676612a2b898 100644 (file)
--- a/a2065.cpp
+++ b/a2065.cpp
@@ -581,7 +581,7 @@ void rethink_a2065 (void)
        if (mask & (CSR0_BABL | CSR0_MISS | CSR0_MERR | CSR0_RINT | CSR0_TINT | CSR0_IDON))
                csr[0] |= CSR0_INTR;
        if ((csr[0] & (CSR0_INTR | CSR0_INEA)) == (CSR0_INTR | CSR0_INEA)) {
-               safe_interrupt_set(0x0008);
+               safe_interrupt_set(IRQ_SOURCE_A2065, 0, false);
                if (log_a2065 > 2)
                        write_log(_T("7990 +IRQ\n"));
        }
index 343f6a508acfcdfce666a8413307d2aca9ada85c..fd15d4b60007bc281f68f35d9f0f4e256262e752 100644 (file)
--- a/a2091.cpp
+++ b/a2091.cpp
@@ -322,6 +322,7 @@ static struct wd_state *allocscsi(struct wd_state **wd, struct romconfig *rc, in
                                        rc->unitdata = scsi;
                                scsi->rc = rc;
                                scsi->self_ptr = wd;
+                               scsi->id = i;
                                *wd = scsi;
                                return scsi;
                        }
@@ -466,9 +467,9 @@ void rethink_a2091 (void)
                if (scsi_units[i]) {
                        int irq = isirq(scsi_units[i]);
                        if (irq & 1)
-                               safe_interrupt_set(0x0008);
+                               safe_interrupt_set(IRQ_SOURCE_WD, i, false);
                        if (irq & 2)
-                               safe_interrupt_set(0x2000);
+                               safe_interrupt_set(IRQ_SOURCE_WD, i, true);
 #if DEBUG > 2 || A3000_DEBUG > 2
                        write_log (_T("Interrupt_RETHINK:%d\n"), irq);
 #endif
@@ -1411,7 +1412,7 @@ static void wd_check_interrupt(struct wd_state *wds, bool checkonly)
 {
        struct wd_chip_state *wd = &wds->wc;
        if (wd->intmask) {
-               safe_interrupt_set(wd->intmask);
+               safe_interrupt_set(IRQ_SOURCE_WD, wds->id, (wd->intmask & 0x2000) != 0);
                wd->intmask = 0;
        }
        if (wd->auxstatus & ASR_INT)
index febf60fbc9d091968c1b400cd603fff9a06be863..b68f99faec6bf36ff5fde671c72f1681af81ebf8 100644 (file)
--- a/akiko.cpp
+++ b/akiko.cpp
@@ -30,6 +30,7 @@
 #include "flashrom.h"
 #include "debug.h"
 #include "rommgr.h"
+#include "devices.h"
 
 #define AKIKO_DEBUG_IO 1
 #define AKIKO_DEBUG_IO_CMD 1
@@ -41,9 +42,7 @@ int log_cd32 = 0;
 
 static void irq (void)
 {
-       if (!(intreq & 8)) {
-               safe_interrupt_set(0x0008);
-       }
+       safe_interrupt_set(IRQ_SOURCE_CD32CDTV, 0, false);
 }
 
 /*
index b73772dc5ef998a974c21bafc470cd7a643a828f..c8253ef996eff946adbdd1aaf7be8f38dc4c44f5 100644 (file)
@@ -21,6 +21,7 @@
 #include "debug.h"
 #include "custom.h"
 #include "audio.h"
+#include "devices.h"
 #include "threaddep/thread.h"
 
 #include "cda_play.h"
@@ -287,9 +288,7 @@ static int isdebug(uaecptr addr)
 
 static void do_irq(void)
 {
-       if (!(intreq & 8)) {
-               safe_interrupt_set(0x0008);
-       }
+       safe_interrupt_set(IRQ_SOURCE_CD32CDTV, 1, false);
 }
 
 static bool l64111_checkint(bool enabled)
index d38ee9cf75cf69316bf4d7b8de3e71cccf8ebba7..49ce211d3349173ad6ee390a00e53a6b26699bd9 100644 (file)
--- a/cdtv.cpp
+++ b/cdtv.cpp
@@ -31,6 +31,7 @@
 #include "uae.h"
 #include "savestate.h"
 #include "scsi.h"
+#include "devices.h"
 
 /* DMAC CNTR bits. */
 #define CNTR_TCEN               (1<<7)
@@ -97,9 +98,7 @@ static void do_stch (void);
 
 static void INT2 (void)
 {
-       if (!(intreq & 8)) {
-               safe_interrupt_set(0x0008);
-       }
+       safe_interrupt_set(IRQ_SOURCE_CD32CDTV, 0, false);
        cd_led ^= LED_CD_ACTIVE2;
 }
 
index a1e17bb44123b39aa2f382beff91baad257c78fb..819d7738ddce924214d4b7c6146a21c311c7ecef 100644 (file)
@@ -28,6 +28,7 @@
 #include "uae.h"
 #include "custom.h"
 #include "rommgr.h"
+#include "devices.h"
 
 #if CDTVCR_4510_EMULATION
 static void init_65c02(void);
@@ -250,7 +251,7 @@ static void cdtvcr_4510_reset(uae_u8 v)
 void rethink_cdtvcr(void)
 {
        if ((cdtvcr_4510_ram[CDTVCR_INTREQ] & cdtvcr_4510_ram[CDTVCR_INTENA]) && !cdtvcr_4510_ram[CDTVCR_INTDISABLE]) {
-               safe_interrupt_set(0x0008);
+               safe_interrupt_set(IRQ_SOURCE_CD32CDTV, 0, false);
                cd_led ^= LED_CD_ACTIVE2;
        }
 }
diff --git a/cia.cpp b/cia.cpp
index 581ea80f1cdaa3814c2c0fa4e2dbb76011855461..391cd8739196b7da0693022603baf7e6d221e1b1 100644 (file)
--- a/cia.cpp
+++ b/cia.cpp
@@ -44,6 +44,7 @@
 #include "rommgr.h"
 #include "scsi.h"
 #include "rtc.h"
+#include "devices.h"
 
 #define CIAA_DEBUG_R 0
 #define CIAA_DEBUG_W 0
@@ -124,7 +125,7 @@ static int cia_interrupt_delay;
 
 static void ICR (uae_u32 data)
 {
-       safe_interrupt_set(data);
+       safe_interrupt_set(IRQ_SOURCE_CIA, 0, (data & 0x2000) != 0);
 }
 
 static void ICRA (uae_u32 data)
index 9967c637516fa842387a17c724869b31ed448d15..1108981814e0b28cfca964c81e4da9aca111799f 100644 (file)
@@ -984,12 +984,12 @@ void cpuboard_rethink(void)
 {
        if (is_csmk3(&currprefs) || is_blizzardppc(&currprefs)) {
                if (!(io_reg[CSIII_REG_IRQ] & (P5_IRQ_SCSI_EN | P5_IRQ_SCSI))) {
-                       safe_interrupt_set(0x0008);
+                       safe_interrupt_set(IRQ_SOURCE_CPUBOARD, 0, false);
                        if (currprefs.cachesize)
                                atomic_or(&uae_int_requested, 0x010000);
                        uae_ppc_wakeup_main();
                } else if (!(io_reg[CSIII_REG_IRQ] & (P5_IRQ_PPC_1 | P5_IRQ_PPC_2))) {
-                       safe_interrupt_set(0x0008);
+                       safe_interrupt_set(IRQ_SOURCE_CPUBOARD, 1, false);
                        if (currprefs.cachesize)
                                atomic_or(&uae_int_requested, 0x010000);
                        uae_ppc_wakeup_main();
@@ -1079,16 +1079,16 @@ static void cyberstormmk2_maprom(void)
                map_banks_nojitdirect(&blizzardmaprom_bank, blizzardmaprom_bank.start >> 16, 524288 >> 16, 0);
 }
 
-void cyberstorm_mk3_ppc_irq_setonly(int level)
+void cyberstorm_mk3_ppc_irq_setonly(int id, int level)
 {
        if (level)
                io_reg[CSIII_REG_IRQ] &= ~P5_IRQ_SCSI;
        else
                io_reg[CSIII_REG_IRQ] |= P5_IRQ_SCSI;
 }
-void cyberstorm_mk3_ppc_irq(int level)
+void cyberstorm_mk3_ppc_irq(int id, int level)
 {
-       cyberstorm_mk3_ppc_irq_setonly(level);
+       cyberstorm_mk3_ppc_irq_setonly(id, level);
        devices_rethink_all(cpuboard_rethink);
 }
 
@@ -1099,7 +1099,7 @@ void blizzardppc_irq_setonly(int level)
        else
                io_reg[CSIII_REG_IRQ] |= P5_IRQ_SCSI;
 }
-void blizzardppc_irq(int level)
+void blizzardppc_irq(int id, int level)
 {
        blizzardppc_irq_setonly(level);
        devices_rethink_all(cpuboard_rethink);
index 1aea16083d995a904b7f8507ddd47ef0974ef165..949e807b8ca8e6e4802bd837dd2ca48fff4a3c68 100644 (file)
@@ -5232,10 +5232,10 @@ void rethink_uae_int(void)
                if (bsd_int_requested)
                        bsdsock_fake_int_handler();
        }
-
-       uae_u16 mask = (irq6 ? 0x2000 : 0) | (irq2 ? 0x0008 : 0);
-       if (mask)
-               safe_interrupt_set(mask);
+       if (irq6)
+               safe_interrupt_set(IRQ_SOURCE_UAE, 0, true);
+       if (irq2)
+               safe_interrupt_set(IRQ_SOURCE_UAE, 0, false);
 }
 
 static void rethink_intreq (void)
index ef13a385abbc1473a6b9d225b6095cb57ccc2838..5e442fd7a20784df78a64c6b65b5791c2660fca1 100644 (file)
@@ -216,17 +216,12 @@ void devices_hsync(void)
 
 void devices_rethink_all(void func(void))
 {
-       if (ppc_state || 0) {
-               devices_rethink();
-       } else {
-               func();
-       }
+       func();
 }
 
 // these really should be dynamically allocated..
 void devices_rethink(void)
 {
-       safe_interrupt_clear_all();
        rethink_cias ();
 #ifdef A2065
        rethink_a2065 ();
index f1a07631db634a5a90a9783e2bbe86c5bd2528f6..aca361cedfee26e68502580568982d91c703e457 100644 (file)
--- a/gayle.cpp
+++ b/gayle.cpp
@@ -228,8 +228,8 @@ void rethink_gayle (void)
 
        if (currprefs.cs_ide == IDE_A4000) {
                gayle_irq |= checkgayleideirq ();
-               if ((gayle_irq & GAYLE_IRQ_IDE) && !(intreq & 0x0008))
-                       safe_interrupt_set(0x0008);
+               if ((gayle_irq & GAYLE_IRQ_IDE))
+                       safe_interrupt_set(IRQ_SOURCE_GAYLE, 0, false);
                return;
        }
 
@@ -255,10 +255,10 @@ void rethink_gayle (void)
                else
                        lev2 = 1;
        }
-       if (lev2 && !(intreq & 0x0008))
-               safe_interrupt_set(0x0008);
-       if (lev6 && !(intreq & 0x2000))
-               safe_interrupt_set(0x2000);
+       if (lev2)
+               safe_interrupt_set(IRQ_SOURCE_GAYLE, 0, false);
+       if (lev6)
+               safe_interrupt_set(IRQ_SOURCE_GAYLE, 0, true);
 }
 
 static void gayle_cs_change (uae_u8 mask, int onoff)
index 9299680172d13affe64d32722dea6684ecb2572a..3a5546228fad84383deaf57bf33da59a2221c373 100644 (file)
@@ -260,12 +260,10 @@ void idecontroller_rethink(void)
                                x86_doirq(ide_boards[i] == x86_at_ide_board[0] ? 14 : 15);
                        }
                } else {
-                       irq |= ide_rethink(ide_boards[i], false);
+                       if (ide_rethink(ide_boards[i], false))
+                               safe_interrupt_set(IRQ_SOURCE_IDE, i, false);
                }
        }
-       if (irq) {
-               safe_interrupt_set(0x0008);
-       }
 }
 
 void idecontroller_hsync(void)
index bf509a7f5a9060f3ae25bc785e392483bcecbf7f..74b8824633a15d8b91a81dc72d4de68f3b29fdb9 100644 (file)
@@ -83,6 +83,7 @@ struct comspec_chip
 };
 
 struct wd_state {
+       int id;
        bool enabled;
        int configured;
        bool autoconfig;
index 40f76b51b3341c665372ac97078805aa60903479..ac043da074d963695f0f582f03d5d04b6e6cb47c 100644 (file)
@@ -32,10 +32,10 @@ extern uae_u32 cyberstorm_scsi_ram_get(uaecptr addr);
 extern int REGPARAM3 cyberstorm_scsi_ram_check(uaecptr addr, uae_u32 size) REGPARAM;
 extern uae_u8 *REGPARAM3 cyberstorm_scsi_ram_xlate(uaecptr addr) REGPARAM;
 
-void cyberstorm_mk3_ppc_irq(int level);
-void blizzardppc_irq(int level);
-void cyberstorm_mk3_ppc_irq_setonly(int level);
-void blizzardppc_irq_setonly(int level);
+void cyberstorm_mk3_ppc_irq(int id, int level);
+void blizzardppc_irq(int id, int level);
+void cyberstorm_mk3_ppc_irq_setonly(int id, int level);
+void blizzardppc_irq_setonly(int id, int level);
 
 #define BOARD_MEMORY_Z2 1
 #define BOARD_MEMORY_Z3 2
index ed12324e8791a0231dd624f91120d70198d23dbc..bb149b36287ef983da0aee2589582d7030803250 100644 (file)
@@ -18,5 +18,22 @@ void device_check_config(void);
 void devices_pause(void);
 void devices_unpause(void);
 
+#define IRQ_SOURCE_PCI 0
+#define IRQ_SOURCE_SOUND 1
+#define IRQ_SOURCE_NE2000 2
+#define IRQ_SOURCE_A2065 3
+#define IRQ_SOURCE_NCR 4
+#define IRQ_SOURCE_NCR9X 5
+#define IRQ_SOURCE_CPUBOARD 6
+#define IRQ_SOURCE_UAE 7
+#define IRQ_SOURCE_SCSI 8
+#define IRQ_SOURCE_WD 9
+#define IRQ_SOURCE_X86 10
+#define IRQ_SOURCE_GAYLE 11
+#define IRQ_SOURCE_CIA 12
+#define IRQ_SOURCE_CD32CDTV 13
+#define IRQ_SOURCE_IDE 14
+#define IRQ_SOURCE_MAX 15
+
 
 #endif /* UAE_DEVICES_H */
index 258f7a3d9be9739428018575a4e006511f3b38ed..88a81794837868e969237a1ba6e60d5810a30e04 100644 (file)
@@ -8,7 +8,7 @@ uae_u32 ncr710_io_bget_a4000t(uaecptr);
 
 void ncr815_io_bput_wildfire(uaecptr addr, uae_u32 v);
 uae_u32 ncr815_io_bget_wildfire(uaecptr addr);
-void wildfire_ncr815_irq(int v);
+void wildfire_ncr815_irq(int id, int v);
 
 extern addrbank ncr_bank_cyberstorm;
 extern addrbank ncr_bank_generic;
index 8448ed231963646d67041a7d25dff398e78ea982..3d709bd625102c2a55a0cd89ac00076294214fc7 100644 (file)
@@ -285,8 +285,7 @@ extern int cpu_cycles;
 extern int cpucycleunit;
 extern int m68k_pc_indirect;
 
-extern void safe_interrupt_set(uae_u32 v);
-extern void safe_interrupt_clear_all(void);
+extern void safe_interrupt_set(int, int, bool);
 
 STATIC_INLINE void set_special_exter(uae_u32 x)
 {
index 887b1733b5b58873d65ca8398ddd1e358ec60a01..a4507e2a94b6ca09c39c6d3ba3c9027caa4f13c9 100644 (file)
@@ -207,8 +207,8 @@ typedef uae_u32 uaecptr;
 #define UVAL64(a) (a ## ul)
 #endif
 
-void atomic_and(volatile uae_atomic *p, uae_u32 v);
-void atomic_or(volatile uae_atomic *p, uae_u32 v);
+uae_atomic atomic_and(volatile uae_atomic *p, uae_u32 v);
+uae_atomic atomic_or(volatile uae_atomic *p, uae_u32 v);
 uae_atomic atomic_inc(volatile uae_atomic *p);
 uae_atomic atomic_dec(volatile uae_atomic *p);
 uae_u32 atomic_bit_test_and_reset(volatile uae_atomic *p, uae_u32 v);
index 9b45cca6d8d5507d8c901a5f19fa829835812355..13264e89c242ca764a816adf24b1b55bd6d0626c 100644 (file)
@@ -43,6 +43,7 @@ extern void getpathpart (TCHAR *outpath, int size, const TCHAR *inpath);
 extern void getfilepart (TCHAR *out, int size, const TCHAR *path);
 extern uae_u32 getlocaltime (void);
 extern bool isguiactive(void);
+extern bool is_mainthread(void);
 
 extern int quit_program;
 extern bool console_emulation;
index fcf970b28e5d4780836244e62e7404265d7701fd..1362f3eac6b263cb60b8f53b835f1ce9a9e72209 100644 (file)
@@ -248,11 +248,7 @@ void ncr9x_rethink(void)
 {
        for (int i = 0; ncr_units[i]; i++) {
                if (ncr_units[i]->boardirq) {
-                       if (ncr_units[i]->irq6)
-                               safe_interrupt_set(0x2000);
-                       else
-                               safe_interrupt_set(0x0008);
-                       return;
+                       safe_interrupt_set(IRQ_SOURCE_NCR9X, i, ncr_units[i]->irq6);
                }
        }
 }
index ccee1fcf10777fe27aa69b2500656c16a2570fd0..c29575f7864898192397f53ed7262b58a45ac495 100644 (file)
@@ -30,6 +30,7 @@
 #include "qemuvga/scsi/scsi.h"
 #include "autoconf.h"
 #include "gui.h"
+#include "devices.h"
 
 #define BOARD_SIZE 16777216
 #define IO_MASK 0xff
@@ -54,6 +55,7 @@
 
 struct ncr_state
 {
+       int id;
        bool newncr;
        DeviceState devobject;
        SCSIDevice *scsid[8];
@@ -71,7 +73,7 @@ struct ncr_state
        int io_start, io_end;
        addrbank *bank;
        bool irq;
-       void (*irq_func)(int);
+       void (*irq_func)(int, int);
        struct romconfig *rc;
        struct ncr_state **self_ptr;
 };
@@ -162,20 +164,20 @@ static struct ncr_state *ncr_a4000t;
 static struct ncr_state *ncra4091[MAX_DUPLICATE_EXPANSION_BOARDS];
 static struct ncr_state *ncr_wildfire;
 
-static void set_irq2(int level)
+static void set_irq2(int id, int level)
 {
        if (level)
-               safe_interrupt_set(0x0008);
+               safe_interrupt_set(IRQ_SOURCE_NCR, 0, false);
 }
 
 void ncr_rethink(void)
 {
        for (int i = 0; ncr_units[i]; i++) {
                if (ncr_units[i] != ncr_cs && ncr_units[i]->irq)
-                       safe_interrupt_set(0x0008);
+                       safe_interrupt_set(IRQ_SOURCE_NCR, i + 1, false);
        }
        if (ncr_cs && ncr_cs->irq)
-               cyberstorm_mk3_ppc_irq_setonly(1);
+               cyberstorm_mk3_ppc_irq_setonly(0, 1);
 }
 
 /* 720+ */
@@ -184,7 +186,7 @@ void pci_set_irq(PCIDevice *pci_dev, int level)
 {
        struct ncr_state *ncr = (struct ncr_state*)pci_dev;
        ncr->irq = level != 0;
-       ncr->irq_func(ncr->irq);
+       ncr->irq_func(ncr->id, ncr->irq);
 }
 
 void scsi_req_continue(SCSIRequest *req)
@@ -278,7 +280,7 @@ void pci710_set_irq(PCIDevice *pci_dev, int level)
 {
        struct ncr_state *ncr = (struct ncr_state*)pci_dev;
        ncr->irq = level != 0;
-       ncr->irq_func(ncr->irq);
+       ncr->irq_func(ncr->id, ncr->irq);
 }
 
 void scsi710_req_continue(SCSIRequest *req)
index 8d29122af8c402530bc1bbd466000cfc69cc23f8..ddc78c90342c8cdbabc6a7711e9a421e022569dd 100644 (file)
@@ -48,6 +48,7 @@
 #include "threaddep/thread.h"
 #include "x86.h"
 #include "bsdsocket.h"
+#include "devices.h"
 #ifdef JIT
 #include "jit/compemu.h"
 #include <signal.h>
@@ -81,6 +82,10 @@ int m68k_pc_indirect;
 bool m68k_interrupt_delay;
 static bool m68k_reset_delay;
 
+static volatile uae_atomic uae_interrupt;
+static volatile uae_atomic uae_interrupts2[IRQ_SOURCE_MAX];
+static volatile uae_atomic uae_interrupts6[IRQ_SOURCE_MAX];
+
 static int cacheisets04060, cacheisets04060mask, cacheitag04060mask;
 static int cachedsets04060, cachedsets04060mask, cachedtag04060mask;
 
@@ -3741,6 +3746,11 @@ static void m68k_reset2(bool hardreset)
        regs.spcflags = 0;
        m68k_reset_delay = 0;
        regs.ipl = regs.ipl_pin = 0;
+       for (int i = 0; i < IRQ_SOURCE_MAX; i++) {
+               uae_interrupts2[i] = 0;
+               uae_interrupts6[i] = 0;
+               uae_interrupt = 0;
+       }
 
 #ifdef SAVESTATE
        if (isrestore ()) {
@@ -4351,44 +4361,59 @@ static void do_trace (void)
 
 static void check_uae_int_request(void)
 {
+       bool irq2 = false;
+       bool irq6 = false;
+       if (atomic_and(&uae_interrupt, 0)) {
+               for (int i = 0; i < IRQ_SOURCE_MAX; i++) {
+                       if (!irq2 && uae_interrupts2[i]) {
+                               uae_atomic v = atomic_and(&uae_interrupts2[i], 0);
+                               if (v) {
+                                       INTREQ_f(0x8000 | 0x0008);
+                                       irq2 = true;
+                               }
+                       }
+                       if (!irq6 && uae_interrupts6[i]) {
+                               uae_atomic v = atomic_and(&uae_interrupts6[i], 0);
+                               if (v) {
+                                       INTREQ_f(0x8000 | 0x2000);
+                                       irq6 = true;
+                               }
+                       }
+               }
+       }
        if (uae_int_requested) {
-               bool irq = false;
-               if (uae_int_requested & 0x00ff) {
+               if (!irq2 && (uae_int_requested & 0x00ff)) {
                        INTREQ_f(0x8000 | 0x0008);
-                       irq = true;
+                       irq2 = true;
                }
-               if (uae_int_requested & 0xff00) {
+               if (!irq6 && (uae_int_requested & 0xff00)) {
                        INTREQ_f(0x8000 | 0x2000);
-                       irq = true;
+                       irq6 = true;
                }
                if (uae_int_requested & 0xff0000) {
                        if (!cpuboard_is_ppcboard_irq()) {
                                atomic_and(&uae_int_requested, ~0x010000);
                        }
                }
-               if (irq) {
-                       doint();
-               }
+       }
+       if (irq2 || irq6) {
+               doint();
        }
 }
 
-/* 0x0010 = generic expansion level 2
- * 0x1000 = generic expansion level 6
- */
-void safe_interrupt_clear_all(void)
-{
-       atomic_and(&uae_int_requested, ~(0x0010 | 0x1000));
-}
-
-void safe_interrupt_set(uae_u32 v)
+void safe_interrupt_set(int num, int id, bool i6)
 {
-       if (ppc_state || 0) {
+       if (!is_mainthread()) {
                set_special_exter(SPCFLAG_UAEINT);
-               if (v & 0x0008)
-                       atomic_or(&uae_int_requested, 0x0010);
-               if (v & 0x2000)
-                       atomic_or(&uae_int_requested, 0x1000);
+               volatile uae_atomic *p;
+               if (i6)
+                       p = &uae_interrupts6[num];
+               else
+                       p = &uae_interrupts2[num];
+               atomic_or(p, 1 << id);
+               atomic_or(&uae_interrupt, 1);
        } else {
+               uae_u16 v = i6 ? 0x2000 : 0x0008;
                if (currprefs.cpu_cycle_exact || (!(intreq & v) && !currprefs.cpu_cycle_exact)) {
                        INTREQ_0(0x8000 | v);
                }
@@ -6799,7 +6824,6 @@ static int asm_parse_mode(TCHAR *s, uae_u8 *reg, uae_u32 *v, uae_u16 *ext)
                if (s[1] == '!') {
                        *v = _tstol(s + 2);
                } else {
-                       TCHAR *endptr;
                        *v = asmgetval(s + 1);
                }
                return imm;
index a788ea93dc0f7d4cfa109e016e356c9341858d4b..db9380def4ba705eba44b6eb99eeb0ff6591b646 100644 (file)
@@ -260,13 +260,13 @@ void uae_set_thread_priority (uae_thread_id *tid, int pri)
        }
 }
 
-void atomic_and(volatile uae_atomic *p, uae_u32 v)
+uae_atomic atomic_and(volatile uae_atomic *p, uae_u32 v)
 {
-       _InterlockedAnd(p, v);
+       return _InterlockedAnd(p, v);
 }
-void atomic_or(volatile uae_atomic *p, uae_u32 v)
+uae_atomic atomic_or(volatile uae_atomic *p, uae_u32 v)
 {
-       _InterlockedOr(p, v);
+       return _InterlockedOr(p, v);
 }
 void atomic_set(volatile uae_atomic *p, uae_u32 v)
 {
index ccd6a6bd713bb6884c673f78dd5a269a1911ae4d..573cec1a1183fc8b25ef7537456540d50331a3a0 100644 (file)
@@ -162,6 +162,7 @@ HCURSOR normalcursor;
 static HWND hwndNextViewer;
 HANDLE AVTask;
 static int all_events_disabled;
+static int mainthreadid;
 
 TCHAR VersionStr[256];
 TCHAR BetaStr[64];
@@ -7283,6 +7284,11 @@ const TCHAR **uaenative_get_library_dirs (void)
        return nats;
 }
 
+bool is_mainthread(void)
+{
+       return GetCurrentThreadId() == mainthreadid;
+}
+
 typedef BOOL (CALLBACK* CHANGEWINDOWMESSAGEFILTER)(UINT, DWORD);
 
 #ifndef NDEBUG
@@ -7334,6 +7340,7 @@ int PASCAL wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdL
        GetProcessAffinityMask (GetCurrentProcess (), &original_affinity, &sys_aff);
 
        thread = GetCurrentThread ();
+       mainthreadid = GetCurrentThreadId();
        //original_affinity = SetThreadAffinityMask(thread, 1);
        fpucontrol = _controlfp (0, 0) & (_MCW_IC | _MCW_RC | _MCW_PC);
        _tzset ();
diff --git a/pci.cpp b/pci.cpp
index 9203fbb1589b8a82d56ff065edbf0647cb06199f..141e59a48612c328f8cf1de8a711177e730310fe 100644 (file)
--- a/pci.cpp
+++ b/pci.cpp
@@ -140,7 +140,6 @@ void pci_free(void)
        for (int i = 0; i < MAX_PCI_BOARDS; i++) {
                hsyncs[i] = NULL;
        }
-       atomic_and(&uae_int_requested, ~(0x10 | 0x100));
 }
 void pci_reset(void)
 {
@@ -168,14 +167,15 @@ void pci_rethink(void)
                                const struct pci_config *c = pcibs->board->config;
                                if (c->interruptpin) {
                                        if ((pcibs->config_data[5] & (1 << 3)) && !(pcibs->config_data[6] & (1 << (10 - 8)))) {
-                                               pcib->irq |= 1 << (c->interruptpin - 1);
+                                               uae_u8 irq = 1 << (c->interruptpin - 1);;
+                                               pcib->irq |= irq;
+                                               if (irq & pcib->intena) {
+                                                       safe_interrupt_set(IRQ_SOURCE_PCI, i, (pcib->intreq_mask & 0x2000) != 0);
+                                               }
                                        }
                                }
                        }
                }
-               if (pcib->irq & pcib->intena) {
-                       safe_interrupt_set(pcib->intreq_mask);
-               }
        }
 }
 
@@ -1486,7 +1486,7 @@ static void add_pci_devices(struct pci_bridge *pcib, struct autoconfig_info *aci
 
 // Wildfire
 
-void wildfire_ncr815_irq(int v)
+void wildfire_ncr815_irq(int id, int v)
 {
        struct pci_board_state *pcibs = &bridges[PCI_BRIDGE_WILDFIRE]->boards[0];
        set_pci_irq(bridges[PCI_BRIDGE_WILDFIRE], pcibs, v != 0);
index 7fbba6aadb1a7d23fbc52da6e1a36bb29b74ef90..7c42dbf3ed039f0285f5e6216cce5425195ba2d4 100644 (file)
@@ -1856,10 +1856,7 @@ void rethink_ne2000(void)
        if (!ne->ariadne2_board_state)
                return;
        if (ne->ariadne2_irq) {
-               if (ne->level6)
-                       safe_interrupt_set(0x2000);
-               else
-                       safe_interrupt_set(0x0008);
+               safe_interrupt_set(IRQ_SOURCE_NE2000, 0, ne->level6);
        }
 }
 
index 6046491ce8ac6621ea4e81910df791de054fd1ce..0ec871221bf5d4d8d559d3bb72ce4e6f91164dbb 100644 (file)
--- a/scsi.cpp
+++ b/scsi.cpp
@@ -1709,11 +1709,7 @@ void ncr80_rethink(void)
                        if (soft_scsi_devices[i] == x86_hd_data) {
                                x86_doirq(5);
                        } else {
-                               if (soft_scsi_devices[i]->level6)
-                                       safe_interrupt_set(0x2000);
-                               else
-                                       safe_interrupt_set(0x0008);
-                               return;
+                               safe_interrupt_set(IRQ_SOURCE_SCSI, i, soft_scsi_devices[i]->level6);
                        }
                }
        }
index 5e24a8a98cb0a2a1e1b762290af48f7c7f2a0106..ae369db2b72e06c064a77025c508774286d81866 100644 (file)
@@ -1415,20 +1415,18 @@ static void codec_stop(void)
 
 void sndboard_rethink(void)
 {
-       bool irq = false;
        if (toccata[0].enabled) {
                struct toccata_data *data = &toccata[0];
-               irq = data->toccata_irq != 0;
+               bool irq = data->toccata_irq != 0;
+               if (irq) {
+                       safe_interrupt_set(IRQ_SOURCE_SOUND, 0, true);
+               }
        }
        if (uaesndboard[0].enabled) {
-               irq |= uaesnd_rethink();
-       }
-       if (irq) {
-               safe_interrupt_set(0x2000);
-               //atomic_or(&uae_int_requested, 0x200);
-               //set_special_exter(SPCFLAG_UAEINT);
-       } else {
-               //atomic_and(&uae_int_requested, ~0x200);
+               bool irq = uaesnd_rethink();
+               if (irq) {
+                       safe_interrupt_set(IRQ_SOURCE_SOUND, 1, true);
+               }
        }
 }
 
diff --git a/x86.cpp b/x86.cpp
index 812e288e4af4b60c01e9c452a19ea87fc9d457d9..626bb8fd1805b067ade8464179e3ebfebfa8eeca 100644 (file)
--- a/x86.cpp
+++ b/x86.cpp
@@ -2969,7 +2969,7 @@ void x86_bridge_rethink(void)
                uae_u8 intena = xb->amiga_io[IO_INTERRUPT_MASK];
                uae_u8 status = intreq & ~intena;
                if (status)
-                       safe_interrupt_set(0x0008);
+                       safe_interrupt_set(IRQ_SOURCE_X86, 0, false);
        }
 }