psxbios: experimental vsync HLE
[pcsx_rearmed.git] / libpcsxcore / new_dynarec / events.c
index 5d981f8..2bc9332 100644 (file)
@@ -12,7 +12,7 @@ extern int pending_exception;
 
 u32 event_cycles[PSXINT_COUNT];
 
-void schedule_timeslice(void)
+u32 schedule_timeslice(void)
 {
        u32 i, c = psxRegs.cycle;
        u32 irqs = psxRegs.interrupt;
@@ -28,10 +28,7 @@ void schedule_timeslice(void)
                        min = dif;
        }
        next_interupt = c + min;
-}
-
-static void unusedInterrupt()
-{
+       return next_interupt;
 }
 
 typedef void (irq_func)();
@@ -47,7 +44,7 @@ static irq_func * const irq_funcs[] = {
        [PSXINT_GPUOTCDMA] = gpuotcInterrupt,
        [PSXINT_CDRDMA] = cdrDmaInterrupt,
        [PSXINT_CDRLID] = cdrLidSeekInterrupt,
-       [PSXINT_CDRPLAY_OLD] = unusedInterrupt,
+       [PSXINT_IRQ10] = irq10Interrupt,
        [PSXINT_SPU_UPDATE] = spuUpdate,
        [PSXINT_RCNT] = psxRcntUpdate,
 };
@@ -68,8 +65,11 @@ static void irq_test(psxCP0Regs *cp0)
                }
        }
 
-       if ((psxHu32(0x1070) & psxHu32(0x1074)) && (cp0->n.Status & 0x401) == 0x401) {
-               psxException(0x400, 0, cp0);
+       cp0->n.Cause &= ~0x400;
+       if (psxHu32(0x1070) & psxHu32(0x1074))
+               cp0->n.Cause |= 0x400;
+       if (((cp0->n.Cause | 1) & cp0->n.SR & 0x401) == 0x401) {
+               psxException(0, 0, cp0);
                pending_exception = 1;
        }
 }