diff --git a/include/arm9/interrupt.h b/include/arm9/interrupt.h index 1767aca..f119352 100644 --- a/include/arm9/interrupt.h +++ b/include/arm9/interrupt.h @@ -46,16 +46,17 @@ void IRQ_registerHandler(Interrupt num, void (*irqHandler)(void)); void IRQ_unregisterHandler(Interrupt num); -static void enableIrq(void) -{ - u32 tmp; - __asm__ __volatile__("mrs %0, cpsr\n\t" : "=r" (tmp) : ); - __asm__ __volatile__("msr cpsr_c, %0\n\t" : : "r" (tmp & ~(0x80u))); -} - -static void disableIrq(void) +static u32 enterCriticalSection(void) { u32 tmp; __asm__ __volatile__("mrs %0, cpsr\n\t" : "=r" (tmp) : ); __asm__ __volatile__("msr cpsr_c, %0\n\t" : : "r" (tmp | 0x80u)); + return tmp & 0x80u; +} + +static void leaveCriticalSection(u32 oldState) +{ + u32 tmp; + __asm__ __volatile__("mrs %0, cpsr\n\t" : "=r" (tmp) : ); + __asm__ __volatile__("msr cpsr_c, %0\n\t" : : "r" (tmp | oldState)); } diff --git a/source/arm9/interrupt.c b/source/arm9/interrupt.c index 0fb3ad6..a7f86b7 100644 --- a/source/arm9/interrupt.c +++ b/source/arm9/interrupt.c @@ -16,7 +16,7 @@ irqHandlerTable[i] = (void (*)(void))NULL; } - enableIrq(); + leaveCriticalSection(0x80u); // Abuse it to enable IRQ } void IRQ_registerHandler(Interrupt num, void (*irqHandler)(void))