summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/arm9.lcf5
-rw-r--r--arm9/asm/OS_irqHandler.s63
-rw-r--r--arm9/asm/OS_irqTable.s12
-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
-rw-r--r--arm9/src/main.c1
11 files changed, 62 insertions, 72 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index 57c4e18a..0fa7baa4 100644
--- a/arm9/arm9.lcf
+++ b/arm9/arm9.lcf
@@ -815,7 +815,7 @@ SECTIONS {
libVCT.o (.data)
unk_020ADA84.o (.data)
GX.o (.data)
- OS_irqHandler.o (.data)
+ OS_irqTable.o (.data)
OS_emulator.o (.data)
FS_command.o (.data)
FS_command_default.o (.data)
@@ -983,7 +983,6 @@ SECTIONS {
.DTCM : {
. = ALIGN(32);
SDK_AUTOLOAD.DTCM.START = .;
- OS_irqHandler.o (.dtcm)
OS_irqTable.o (.dtcm)
. = ALIGN(32);
SDK_AUTOLOAD.DTCM.END = .;
@@ -995,7 +994,7 @@ SECTIONS {
{
. = ALIGN(32);
SDK_AUTOLOAD.DTCM.BSS_START = .;
- OS_irqHandler.o (.bss)
+ OS_irqHandler.o (.dtcm.bss)
. = ALIGN(32);
SDK_AUTOLOAD.DTCM.BSS_END = .;
SDK_AUTOLOAD.DTCM.BSS_SIZE = SDK_AUTOLOAD.DTCM.BSS_END - SDK_AUTOLOAD.DTCM.BSS_START;
diff --git a/arm9/asm/OS_irqHandler.s b/arm9/asm/OS_irqHandler.s
deleted file mode 100644
index d0e563fb..00000000
--- a/arm9/asm/OS_irqHandler.s
+++ /dev/null
@@ -1,63 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .data
-
- .global OSi_IrqCallbackInfoIndex
-OSi_IrqCallbackInfoIndex: ; 0x02106818
- .short 8
- .short 9
- .short 10
- .short 11
- .short 3
- .short 4
- .short 5
- .short 6
-
- ; pragma section DTCM begin
- .section .bss
- .balign 16, 0
- .global OSi_IrqThreadQueue
-OSi_IrqThreadQueue: ; 027E0060
- .space 4
- ; pragma section DTCM end
-
- .section .text
-
- arm_func_start OS_WaitIrq
-OS_WaitIrq:
- stmdb sp!, {r4-r6,lr}
- mov r5, r0
- mov r4, r1
- bl OS_DisableInterrupts
- cmp r5, #0x0
- beq _020C9C3C
- ldr r1, _020C9C80 ; =0x027E0000
- mvn r2, r4
- add r1, r1, #0x3000
- ldr r3, [r1, #0xff8]
- and r2, r3, r2
- str r2, [r1, #0xff8]
-_020C9C3C:
- bl OS_RestoreInterrupts
- ldr r1, _020C9C80 ; =0x027E0000
- add r0, r1, #0x3000
- ldr r0, [r0, #0xff8]
- ands r0, r4, r0
- ldmneia sp!, {r4-r6,lr}
- bxne lr
- ldr r0, _020C9C84 ; =0x00003FF8
- add r6, r1, r0
- ldr r5, _020C9C88 ; =0x027E0060
-_020C9C64:
- mov r0, r5
- bl OS_SleepThread
- ldr r0, [r6, #0x0]
- ands r0, r4, r0
- beq _020C9C64
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020C9C80: .word 0x027E0000
-_020C9C84: .word 0x00003FF8
-_020C9C88: .word 0x027E0060
diff --git a/arm9/asm/OS_irqTable.s b/arm9/asm/OS_irqTable.s
index 6c106c92..e42d600b 100644
--- a/arm9/asm/OS_irqTable.s
+++ b/arm9/asm/OS_irqTable.s
@@ -36,6 +36,18 @@ OS_IRQTable: ; 027E0000 ;10b6a0
OSi_IrqCallbackInfo: ; 0x021D341C
.space 0x60
+ .section .data
+ .global OSi_IrqCallbackInfoIndex
+OSi_IrqCallbackInfoIndex: ; 0x02106818
+ .short 8
+ .short 9
+ .short 10
+ .short 11
+ .short 3
+ .short 4
+ .short 5
+ .short 6
+
.section .text
arm_func_start OSi_IrqTimer3
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) {
diff --git a/arm9/src/main.c b/arm9/src/main.c
index a038cd9a..ae3961cd 100644
--- a/arm9/src/main.c
+++ b/arm9/src/main.c
@@ -1,6 +1,5 @@
#include "global.h"
#include "SPI_pm.h"
-#include "OS_system.h"
#include "CARD_backup.h"
#include "CARD_pullOut.h"
#include "CTRDG_common.h"