#include "r3000a.h"
#include "psxhw.h"
#include "psxmem.h"
-
-#define GPUDMA_INT(eCycle) { \
- psxRegs.interrupt |= 0x01000000; \
- psxRegs.intCycle[3 + 24 + 1] = eCycle; \
- psxRegs.intCycle[3 + 24] = psxRegs.cycle; \
- new_dyna_set_event(3, psxRegs.cycle + eCycle); \
-}
-
-#define SPUDMA_INT(eCycle) { \
- psxRegs.interrupt |= 0x04000000; \
- psxRegs.intCycle[1 + 24 + 1] = eCycle; \
- psxRegs.intCycle[1 + 24] = psxRegs.cycle; \
- new_dyna_set_event(5, psxRegs.cycle + eCycle); \
-}
-
-#define MDECOUTDMA_INT(eCycle) { \
- psxRegs.interrupt |= 0x02000000; \
- psxRegs.intCycle[5 + 24 + 1] = eCycle; \
- psxRegs.intCycle[5 + 24] = psxRegs.cycle; \
- new_dyna_set_event(4, psxRegs.cycle + eCycle); \
-}
+#include "psxevents.h"
void psxDma2(u32 madr, u32 bcr, u32 chcr);
void psxDma3(u32 madr, u32 bcr, u32 chcr);
void psxDma6(u32 madr, u32 bcr, u32 chcr);
void gpuInterrupt();
void spuInterrupt();
+void gpuotcInterrupt();
+
+static inline void *getDmaRam(u32 madr, u32 *max_words)
+{
+ // this should wrap instead of limit
+ if (!(madr & 0x800000)) {
+ madr &= 0x1ffffc;
+ *max_words = (0x200000 - madr) / 4;
+ return psxM + madr;
+ }
+ return INVALID_PTR;
+}
#ifdef __cplusplus
}