aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/psxetc
diff options
context:
space:
mode:
authorspicyjpeg <thatspicyjpeg@gmail.com>2022-08-21 10:55:33 +0200
committerspicyjpeg <thatspicyjpeg@gmail.com>2022-08-21 10:55:33 +0200
commitc845878cb43da4f7470914a064109db2270fd7e6 (patch)
tree0e3c917f59b4b57c36609cc1d8f0e289a5d77f79 /libpsn00b/psxetc
parentec3ed1574dac08b1c07a8126f6090adce0e7efb8 (diff)
downloadpsn00bsdk-c845878cb43da4f7470914a064109db2270fd7e6.tar.gz
Fix psxgpu and psxetc bugs, add VSyncHaltFunction()
Diffstat (limited to 'libpsn00b/psxetc')
-rw-r--r--libpsn00b/psxetc/interrupts.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/libpsn00b/psxetc/interrupts.c b/libpsn00b/psxetc/interrupts.c
index e5c4705..32e91f0 100644
--- a/libpsn00b/psxetc/interrupts.c
+++ b/libpsn00b/psxetc/interrupts.c
@@ -14,8 +14,8 @@
/* Internal globals */
-static void (*_irq_handlers[NUM_IRQ_CHANNELS])(void) = { (void *) 0 };
-static void (*_dma_handlers[NUM_DMA_CHANNELS])(void) = { (void *) 0 };
+static void (*_irq_handlers[NUM_IRQ_CHANNELS])(void);
+static void (*_dma_handlers[NUM_DMA_CHANNELS])(void);
static int _num_dma_handlers = 0;
static uint32_t _saved_irq_mask, _saved_dma_dpcr, _saved_dma_dicr;
@@ -156,10 +156,20 @@ int ResetCallback(void) {
if (_isr_installed)
return -1;
- _saved_irq_mask = 0;
+ EnterCriticalSection();
+ _saved_irq_mask = 1 << 3; // Enable DMA IRQ by default
_saved_dma_dpcr = 0x03333333;
_saved_dma_dicr = 0;
+ for (int i = 0; i < NUM_IRQ_CHANNELS; i++)
+ _irq_handlers[i] = (void *) 0;
+ for (int i = 0; i < NUM_DMA_CHANNELS; i++)
+ _dma_handlers[i] = (void *) 0;
+
+ // Set up the DMA IRQ handler. This handler shall *not* be overridden using
+ // InterruptCallback().
+ _irq_handlers[3] = &_global_dma_handler;
+
_96_remove();
RestartCallback();
return 0;