8 extern int pending_exception;
10 //#define evprintf printf
13 u32 event_cycles[PSXINT_COUNT];
15 void schedule_timeslice(void)
17 u32 i, c = psxRegs.cycle;
18 u32 irqs = psxRegs.interrupt;
22 for (i = 0; irqs != 0; i++, irqs >>= 1) {
25 dif = event_cycles[i] - c;
26 //evprintf(" ev %d\n", dif);
27 if (0 < dif && dif < min)
30 next_interupt = c + min;
33 static void unusedInterrupt()
37 typedef void (irq_func)();
39 static irq_func * const irq_funcs[] = {
40 [PSXINT_SIO] = sioInterrupt,
41 [PSXINT_CDR] = cdrInterrupt,
42 [PSXINT_CDREAD] = cdrPlayReadInterrupt,
43 [PSXINT_GPUDMA] = gpuInterrupt,
44 [PSXINT_MDECOUTDMA] = mdec1Interrupt,
45 [PSXINT_SPUDMA] = spuInterrupt,
46 [PSXINT_MDECINDMA] = mdec0Interrupt,
47 [PSXINT_GPUOTCDMA] = gpuotcInterrupt,
48 [PSXINT_CDRDMA] = cdrDmaInterrupt,
49 [PSXINT_CDRLID] = cdrLidSeekInterrupt,
50 [PSXINT_CDRPLAY_OLD] = unusedInterrupt,
51 [PSXINT_SPU_UPDATE] = spuUpdate,
52 [PSXINT_RCNT] = psxRcntUpdate,
55 /* local dupe of psxBranchTest, using event_cycles */
56 static void irq_test(psxCP0Regs *cp0)
58 u32 cycle = psxRegs.cycle;
61 for (irq = 0, irq_bits = psxRegs.interrupt; irq_bits != 0; irq++, irq_bits >>= 1) {
64 if ((s32)(cycle - event_cycles[irq]) >= 0) {
65 // note: irq_funcs() also modify psxRegs.interrupt
66 psxRegs.interrupt &= ~(1u << irq);
71 cp0->n.Cause &= ~0x400;
72 if (psxHu32(0x1070) & psxHu32(0x1074))
73 cp0->n.Cause |= 0x400;
74 if (((cp0->n.Cause | 1) & cp0->n.SR & 0x401) == 0x401) {
75 psxException(0, 0, cp0);
76 pending_exception = 1;
80 void gen_interupt(psxCP0Regs *cp0)
82 evprintf(" +ge %08x, %u->%u (%d)\n", psxRegs.pc, psxRegs.cycle,
83 next_interupt, next_interupt - psxRegs.cycle);
86 //pending_exception = 1;
90 evprintf(" -ge %08x, %u->%u (%d)\n", psxRegs.pc, psxRegs.cycle,
91 next_interupt, next_interupt - psxRegs.cycle);