drc: handle regs-not-in-psxRegs case better
[pcsx_rearmed.git] / libpcsxcore / new_dynarec / emu_if.c
index c1dab56..50819e4 100644 (file)
@@ -9,12 +9,10 @@
 
 #include "emu_if.h"
 #include "pcsxmem.h"
+#include "events.h"
 #include "../psxhle.h"
 #include "../psxinterpreter.h"
 #include "../r3000a.h"
-#include "../cdrom.h"
-#include "../psxdma.h"
-#include "../mdec.h"
 #include "../gte_arm.h"
 #include "../gte_neon.h"
 #define FLAGLESS
 //#define evprintf printf
 #define evprintf(...)
 
-char invalid_code[0x100000];
-u32 event_cycles[PSXINT_COUNT];
-
-static void schedule_timeslice(void)
-{
-       u32 i, c = psxRegs.cycle;
-       u32 irqs = psxRegs.interrupt;
-       s32 min, dif;
-
-       min = PSXCLK;
-       for (i = 0; irqs != 0; i++, irqs >>= 1) {
-               if (!(irqs & 1))
-                       continue;
-               dif = event_cycles[i] - c;
-               //evprintf("  ev %d\n", dif);
-               if (0 < dif && dif < min)
-                       min = dif;
-       }
-       next_interupt = c + min;
-}
-
-static void unusedInterrupt()
-{
-}
-
-typedef void (irq_func)();
-
-static irq_func * const irq_funcs[] = {
-       [PSXINT_SIO]    = sioInterrupt,
-       [PSXINT_CDR]    = cdrInterrupt,
-       [PSXINT_CDREAD] = cdrPlayReadInterrupt,
-       [PSXINT_GPUDMA] = gpuInterrupt,
-       [PSXINT_MDECOUTDMA] = mdec1Interrupt,
-       [PSXINT_SPUDMA] = spuInterrupt,
-       [PSXINT_MDECINDMA] = mdec0Interrupt,
-       [PSXINT_GPUOTCDMA] = gpuotcInterrupt,
-       [PSXINT_CDRDMA] = cdrDmaInterrupt,
-       [PSXINT_CDRLID] = cdrLidSeekInterrupt,
-       [PSXINT_CDRPLAY_OLD] = unusedInterrupt,
-       [PSXINT_SPU_UPDATE] = spuUpdate,
-       [PSXINT_RCNT] = psxRcntUpdate,
-};
-
-/* local dupe of psxBranchTest, using event_cycles */
-static void irq_test(void)
-{
-       u32 cycle = psxRegs.cycle;
-       u32 irq, irq_bits;
-
-       for (irq = 0, irq_bits = psxRegs.interrupt; irq_bits != 0; irq++, irq_bits >>= 1) {
-               if (!(irq_bits & 1))
-                       continue;
-               if ((s32)(cycle - event_cycles[irq]) >= 0) {
-                       // note: irq_funcs() also modify psxRegs.interrupt
-                       psxRegs.interrupt &= ~(1u << irq);
-                       irq_funcs[irq]();
-               }
-       }
-
-       if ((psxHu32(0x1070) & psxHu32(0x1074)) && (psxRegs.CP0.n.Status & 0x401) == 0x401) {
-               psxException(0x400, 0);
-               pending_exception = 1;
-       }
-}
-
-void gen_interupt()
-{
-       evprintf("  +ge %08x, %u->%u (%d)\n", psxRegs.pc, psxRegs.cycle,
-               next_interupt, next_interupt - psxRegs.cycle);
-
-       irq_test();
-       //psxBranchTest();
-       //pending_exception = 1;
-
-       schedule_timeslice();
-
-       evprintf("  -ge %08x, %u->%u (%d)\n", psxRegs.pc, psxRegs.cycle,
-               next_interupt, next_interupt - psxRegs.cycle);
-}
-
 void pcsx_mtc0(u32 reg, u32 val)
 {
        evprintf("MTC0 %d #%x @%08x %u\n", reg, val, psxRegs.pc, psxRegs.cycle);
        MTC0(&psxRegs, reg, val);
-       gen_interupt();
+       gen_interupt(&psxRegs.CP0);
        if (psxRegs.CP0.n.Cause & psxRegs.CP0.n.Status & 0x0300) // possible sw irq
                pending_exception = 1;
 }