summaryrefslogtreecommitdiff
path: root/arm9/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib')
-rw-r--r--arm9/lib/include/OS_init.h1
-rw-r--r--arm9/lib/include/OS_irqHandler.h19
-rw-r--r--arm9/lib/include/OS_system.h1
-rw-r--r--arm9/lib/include/mmap.h3
-rw-r--r--arm9/lib/src/OS_interrupt.c4
-rw-r--r--arm9/lib/src/OS_irqHandler.c24
-rw-r--r--arm9/lib/src/OS_system.c1
7 files changed, 48 insertions, 5 deletions
diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h
index 40685513..88c696cd 100644
--- a/arm9/lib/include/OS_init.h
+++ b/arm9/lib/include/OS_init.h
@@ -22,6 +22,7 @@
#include "OS_alloc.h"
#include "OS_system.h"
#include "OS_terminate_proc.h"
+#include "OS_irqHandler.h"
#include "OS_interrupt.h"
#include "OS_reset.h"
#include "OS_spinLock.h"
diff --git a/arm9/lib/include/OS_irqHandler.h b/arm9/lib/include/OS_irqHandler.h
new file mode 100644
index 00000000..17bde1c9
--- /dev/null
+++ b/arm9/lib/include/OS_irqHandler.h
@@ -0,0 +1,19 @@
+#ifndef POKEDIAMOND_OS_IRQHANDLER_H
+#define POKEDIAMOND_OS_IRQHANDLER_H
+
+#include "consts.h"
+#include "OS_interrupt.h"
+
+static inline void OS_ClearIrqCheckFlag(OSIrqMask intr)
+{
+ *(vu32 *)HW_INTR_CHECK_BUF &= (u32)~intr;
+}
+
+static inline OSIrqMask OS_GetIrqCheckFlag(void)
+{
+ return *(OSIrqMask *)HW_INTR_CHECK_BUF;
+}
+
+void OS_WaitIrq(BOOL param1, u32 param2);
+
+#endif //POKEDIAMOND_OS_IRQHANDLER_H
diff --git a/arm9/lib/include/OS_system.h b/arm9/lib/include/OS_system.h
index f71c6f98..6e156f9d 100644
--- a/arm9/lib/include/OS_system.h
+++ b/arm9/lib/include/OS_system.h
@@ -35,6 +35,5 @@ OSIntrMode OS_GetCpsrIrq(void);
OSProcMode OS_GetProcMode(void);
void OS_SpinWait(void);
void OS_WaitVBlankIntr(void);
-void OS_WaitIrq(BOOL, u32);
#endif //POKEDIAMOND_OS_SYSTEM_H
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index 65b93e1e..8eb3f623 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -22,6 +22,9 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_DTCM ((u32)SDK_AUTOLOAD_DTCM_START)
#define HW_DTCM_SIZE 0x00004000
+#define HW_DTCM_SYSRV (HW_DTCM + 0x00003fc0)
+#define HW_INTR_CHECK_BUF (HW_DTCM_SYSRV + 0x38)
+
#define HW_CARD_ROM_HEADER_SIZE 0x00000160
#define HW_DOWNLOAD_PARAMETER_SIZE 0x00000020
diff --git a/arm9/lib/src/OS_interrupt.c b/arm9/lib/src/OS_interrupt.c
index 4692fd54..c7c0704d 100644
--- a/arm9/lib/src/OS_interrupt.c
+++ b/arm9/lib/src/OS_interrupt.c
@@ -1,7 +1,3 @@
-//
-// Created by red031000 on 2020-05-07.
-//
-
#include "consts.h"
#include "function_target.h"
#include "OS_interrupt.h"
diff --git a/arm9/lib/src/OS_irqHandler.c b/arm9/lib/src/OS_irqHandler.c
new file mode 100644
index 00000000..31f4453e
--- /dev/null
+++ b/arm9/lib/src/OS_irqHandler.c
@@ -0,0 +1,24 @@
+#include "function_target.h"
+#include "OS_irqHandler.h"
+#include "OS_system.h"
+#include "OS_thread.h"
+#include "sections.h"
+
+#pragma section DTCM begin
+OSThreadQueue OSi_IrqThreadQueue = { NULL, NULL };
+#pragma section DTCM end
+
+ARM_FUNC void OS_WaitIrq(BOOL clear, OSIrqMask irqFlags)
+{
+ OSIntrMode lastIntrMode = OS_DisableInterrupts();
+ if (clear)
+ {
+ OS_ClearIrqCheckFlag(irqFlags);
+ }
+ (void)OS_RestoreInterrupts(lastIntrMode);
+
+ while (!(OS_GetIrqCheckFlag() & irqFlags))
+ {
+ OS_SleepThread(&OSi_IrqThreadQueue);
+ }
+}
diff --git a/arm9/lib/src/OS_system.c b/arm9/lib/src/OS_system.c
index 1d257679..b703fc38 100644
--- a/arm9/lib/src/OS_system.c
+++ b/arm9/lib/src/OS_system.c
@@ -3,6 +3,7 @@
//
#include "OS_system.h"
+#include "OS_irqHandler.h"
#include "syscall.h"
ARM_FUNC asm OSIntrMode OS_EnableInterrupts(void) {