543f8fc4621f03f7aed2fca8030cf46700f9a0a2
[pcsx_rearmed.git] / libpcsxcore / psxevents.h
1 #ifndef __PSXEVENTS_H__
2 #define __PSXEVENTS_H__
3
4 #include "psxcommon.h"
5
6 enum {
7         PSXINT_SIO = 0,      // sioInterrupt
8         PSXINT_CDR,          // cdrInterrupt
9         PSXINT_CDREAD,       // cdrPlayReadInterrupt
10         PSXINT_GPUDMA,       // gpuInterrupt
11         PSXINT_MDECOUTDMA,   // mdec1Interrupt
12         PSXINT_SPUDMA,       // spuInterrupt
13         PSXINT_SPU_IRQ,      // spuDelayedIrq
14         PSXINT_MDECINDMA,    // mdec0Interrupt
15         PSXINT_GPUOTCDMA,    // gpuotcInterrupt
16         PSXINT_CDRDMA,       // cdrDmaInterrupt
17         PSXINT_NEWDRC_CHECK, // (none)
18         PSXINT_RCNT,         // psxRcntUpdate
19         PSXINT_CDRLID,       // cdrLidSeekInterrupt
20         PSXINT_IRQ10,        // irq10Interrupt
21         PSXINT_SPU_UPDATE,   // spuUpdate
22         PSXINT_COUNT
23 };
24
25 #define set_event_raw_abs(e, abs) { \
26         u32 abs_ = abs; \
27         s32 di_ = psxRegs.next_interupt - abs_; \
28         psxRegs.event_cycles[e] = abs_; \
29         if (di_ > 0) { \
30                 /*printf("%u: next_interupt %u -> %u\n", psxRegs.cycle, psxRegs.next_interupt, abs_);*/ \
31                 psxRegs.next_interupt = abs_; \
32         } \
33 }
34
35 #define set_event(e, c) do { \
36         psxRegs.interrupt |= (1 << (e)); \
37         psxRegs.intCycle[e].cycle = c; \
38         psxRegs.intCycle[e].sCycle = psxRegs.cycle; \
39         set_event_raw_abs(e, psxRegs.cycle + (c)) \
40 } while (0)
41
42 union psxCP0Regs_;
43 struct psxRegisters;
44
45 u32  schedule_timeslice(struct psxRegisters *regs);
46 void irq_test(union psxCP0Regs_ *cp0);
47 void gen_interupt(union psxCP0Regs_ *cp0);
48 void events_restore(void);
49
50 #endif // __PSXEVENTS_H__