From: Toni Wilen Date: Wed, 14 Feb 2018 15:39:42 +0000 (+0200) Subject: Another attempt of fully thread safe interrupt activation. X-Git-Tag: 4000~186 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=f1df6c7545a3d99fe6d726756c17e5049f75b5f0;p=francis%2Fwinuae.git Another attempt of fully thread safe interrupt activation. --- diff --git a/a2065.cpp b/a2065.cpp index 2438f87c..053d50fd 100644 --- 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")); } diff --git a/a2091.cpp b/a2091.cpp index 343f6a50..fd15d4b6 100644 --- 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) diff --git a/akiko.cpp b/akiko.cpp index febf60fb..b68f99fa 100644 --- 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); } /* diff --git a/cd32_fmv.cpp b/cd32_fmv.cpp index b73772dc..c8253ef9 100644 --- a/cd32_fmv.cpp +++ b/cd32_fmv.cpp @@ -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) diff --git a/cdtv.cpp b/cdtv.cpp index d38ee9cf..49ce211d 100644 --- 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; } diff --git a/cdtvcr.cpp b/cdtvcr.cpp index a1e17bb4..819d7738 100644 --- a/cdtvcr.cpp +++ b/cdtvcr.cpp @@ -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 581ea80f..391cd873 100644 --- 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) diff --git a/cpuboard.cpp b/cpuboard.cpp index 9967c637..11089818 100644 --- a/cpuboard.cpp +++ b/cpuboard.cpp @@ -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); diff --git a/custom.cpp b/custom.cpp index 1aea1608..949e807b 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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) diff --git a/devices.cpp b/devices.cpp index ef13a385..5e442fd7 100644 --- a/devices.cpp +++ b/devices.cpp @@ -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 (); diff --git a/gayle.cpp b/gayle.cpp index f1a07631..aca361ce 100644 --- 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) diff --git a/idecontrollers.cpp b/idecontrollers.cpp index 92996801..3a554622 100644 --- a/idecontrollers.cpp +++ b/idecontrollers.cpp @@ -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) diff --git a/include/a2091.h b/include/a2091.h index bf509a7f..74b88246 100644 --- a/include/a2091.h +++ b/include/a2091.h @@ -83,6 +83,7 @@ struct comspec_chip }; struct wd_state { + int id; bool enabled; int configured; bool autoconfig; diff --git a/include/cpuboard.h b/include/cpuboard.h index 40f76b51..ac043da0 100644 --- a/include/cpuboard.h +++ b/include/cpuboard.h @@ -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 diff --git a/include/devices.h b/include/devices.h index ed12324e..bb149b36 100644 --- a/include/devices.h +++ b/include/devices.h @@ -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 */ diff --git a/include/ncr_scsi.h b/include/ncr_scsi.h index 258f7a3d..88a81794 100644 --- a/include/ncr_scsi.h +++ b/include/ncr_scsi.h @@ -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; diff --git a/include/newcpu.h b/include/newcpu.h index 8448ed23..3d709bd6 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -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) { diff --git a/include/sysdeps.h b/include/sysdeps.h index 887b1733..a4507e2a 100644 --- a/include/sysdeps.h +++ b/include/sysdeps.h @@ -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); diff --git a/include/uae.h b/include/uae.h index 9b45cca6..13264e89 100644 --- a/include/uae.h +++ b/include/uae.h @@ -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; diff --git a/ncr9x_scsi.cpp b/ncr9x_scsi.cpp index fcf970b2..1362f3ea 100644 --- a/ncr9x_scsi.cpp +++ b/ncr9x_scsi.cpp @@ -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); } } } diff --git a/ncr_scsi.cpp b/ncr_scsi.cpp index ccee1fcf..c29575f7 100644 --- a/ncr_scsi.cpp +++ b/ncr_scsi.cpp @@ -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) diff --git a/newcpu.cpp b/newcpu.cpp index 8d29122a..ddc78c90 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -48,6 +48,7 @@ #include "threaddep/thread.h" #include "x86.h" #include "bsdsocket.h" +#include "devices.h" #ifdef JIT #include "jit/compemu.h" #include @@ -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; diff --git a/od-win32/posixemu.cpp b/od-win32/posixemu.cpp index a788ea93..db9380de 100644 --- a/od-win32/posixemu.cpp +++ b/od-win32/posixemu.cpp @@ -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) { diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index ccd6a6bd..573cec1a 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -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 9203fbb1..141e59a4 100644 --- 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); diff --git a/qemuvga/ne2000.cpp b/qemuvga/ne2000.cpp index 7fbba6aa..7c42dbf3 100644 --- a/qemuvga/ne2000.cpp +++ b/qemuvga/ne2000.cpp @@ -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); } } diff --git a/scsi.cpp b/scsi.cpp index 6046491c..0ec87122 100644 --- 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); } } } diff --git a/sndboard.cpp b/sndboard.cpp index 5e24a8a9..ae369db2 100644 --- a/sndboard.cpp +++ b/sndboard.cpp @@ -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 812e288e..626bb8fd 100644 --- 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); } }