summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@users.noreply.github.com>2020-08-01 19:46:28 -0400
committerGitHub <noreply@github.com>2020-08-01 19:46:28 -0400
commit5beb002bb50ee5aec156c24352e28c66c46f0474 (patch)
treece7500bf47a4ec829f0c06cf617034d339d04f8f
parentf7208c80c780bb666630a343cfe5912009dd5eaa (diff)
parenteb4007dce800281754d17e989eab1cf51708f164 (diff)
Merge pull request #253 from red031000/master
arm9 OS_vramExclusive
-rw-r--r--arm9/asm/OS_vramExclusive.s138
-rw-r--r--arm9/lib/include/OS_init.h1
-rw-r--r--arm9/lib/include/OS_vramExclusive.h10
-rw-r--r--arm9/lib/include/gx.h2
-rw-r--r--arm9/lib/src/OS_init.c1
-rw-r--r--arm9/lib/src/OS_vramExclusive.c88
6 files changed, 100 insertions, 140 deletions
diff --git a/arm9/asm/OS_vramExclusive.s b/arm9/asm/OS_vramExclusive.s
deleted file mode 100644
index ca2caade..00000000
--- a/arm9/asm/OS_vramExclusive.s
+++ /dev/null
@@ -1,138 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global OSi_vramExclusive
-OSi_vramExclusive: ; 0x021D37E4
- .space 0x4
-
- .global OSi_vramLockId
-OSi_vramLockId: ; 0x021D37E8
- .space 0x14
-
- .text
-
- arm_func_start OsCountZeroBits
-OsCountZeroBits: ; 0x020CD5BC
- clz r0, r0
- bx lr
-
- arm_func_start OSi_UnlockVram
-OSi_UnlockVram: ; 0x020CD5C4
- stmdb sp!, {r4-r10,lr}
- mov r5, r0
- mov r10, r1
- bl OS_DisableInterrupts
- ldr r4, _020CD640 ; =OSi_vramExclusive
- ldr r1, _020CD644 ; =0x000001FF
- ldr r2, [r4, #0x0]
- mov r8, r0
- and r0, r5, r2
- and r9, r0, r1
- ldr r6, _020CD648 ; =OSi_vramLockId
- mov r7, #0x1
- mov r5, #0x0
-_020CD5F8:
- mov r0, r9
- bl OsCountZeroBits
- rsbs r2, r0, #0x1f
- bmi _020CD630
- mov r1, r2, lsl #0x1
- ldrh r0, [r6, r1]
- mvn r2, r7, lsl r2
- cmp r10, r0
- ldreq r0, [r4, #0x0]
- and r9, r9, r2
- andeq r0, r0, r2
- streqh r5, [r6, r1]
- streq r0, [r4, #0x0]
- b _020CD5F8
-_020CD630:
- mov r0, r8
- bl OS_RestoreInterrupts
- ldmia sp!, {r4-r10,lr}
- bx lr
- .balign 4
-_020CD640: .word OSi_vramExclusive
-_020CD644: .word 0x000001FF
-_020CD648: .word OSi_vramLockId
-
- arm_func_start OSi_TryLockVram
-OSi_TryLockVram: ; 0x020CD64C
- stmdb sp!, {r4-r9,lr}
- sub sp, sp, #0x4
- mov r6, r0
- mov r8, r1
- bl OS_DisableInterrupts
- ldr r1, _020CD714 ; =OSi_vramExclusive
- mov r7, r0
- ldr r0, [r1, #0x0]
- and r5, r6, r0
- ldr sb, _020CD718 ; =OSi_vramLockId
- mov r4, #0x1
-_020CD678:
- mov r0, r5
- bl OsCountZeroBits
- rsbs r1, r0, #0x1f
- bmi _020CD6B8
- mov r0, r1, lsl #0x1
- ldrh r0, [r9, r0]
- mvn r1, r4, lsl r1
- cmp r8, r0
- and r5, r5, r1
- beq _020CD678
- mov r0, r7
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- mov r0, #0x0
- ldmia sp!, {r4-r9,lr}
- bx lr
-_020CD6B8:
- ldr r0, _020CD71C ; =0x000001FF
- and r6, r6, r0
- ldr r4, _020CD718 ; =OSi_vramLockId
- ldr sb, _020CD714 ; =OSi_vramExclusive
- mov r5, #0x1
-_020CD6CC:
- mov r0, r6
- bl OsCountZeroBits
- rsbs r1, r0, #0x1f
- bmi _020CD6FC
- ldr r0, [r9, #0x0]
- mvn r2, r5, lsl r1
- orr r0, r0, r5, lsl r1
- mov r1, r1, lsl #0x1
- strh r8, [r4, r1]
- str r0, [r9, #0x0]
- and r6, r6, r2
- b _020CD6CC
-_020CD6FC:
- mov r0, r7
- bl OS_RestoreInterrupts
- mov r0, #0x1
- add sp, sp, #0x4
- ldmia sp!, {r4-r9,lr}
- bx lr
- .balign 4
-_020CD714: .word OSi_vramExclusive
-_020CD718: .word OSi_vramLockId
-_020CD71C: .word 0x000001FF
-
- arm_func_start OSi_InitVramExclusive
-OSi_InitVramExclusive: ; 0x020CD720
- ldr r0, _020CD74C ; =OSi_vramExclusive
- mov r3, #0x0
- str r3, [r0, #0x0]
- ldr r0, _020CD750 ; =OSi_vramLockId
- mov r2, r3
-_020CD734:
- mov r1, r3, lsl #0x1
- add r3, r3, #0x1
- strh r2, [r0, r1]
- cmp r3, #0x9
- blt _020CD734
- bx lr
- .balign 4
-_020CD74C: .word OSi_vramExclusive
-_020CD750: .word OSi_vramLockId
diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h
index 7427fed8..f0b80220 100644
--- a/arm9/lib/include/OS_init.h
+++ b/arm9/lib/include/OS_init.h
@@ -26,6 +26,7 @@
#include "OS_exception.h"
#include "OS_message.h"
#include "OS_valarm.h"
+#include "OS_vramExclusive.h"
void OS_Init(void);
diff --git a/arm9/lib/include/OS_vramExclusive.h b/arm9/lib/include/OS_vramExclusive.h
new file mode 100644
index 00000000..d7c3ef92
--- /dev/null
+++ b/arm9/lib/include/OS_vramExclusive.h
@@ -0,0 +1,10 @@
+#ifndef POKEDIAMOND_OS_VRAMEXCLUSIVE_H
+#define POKEDIAMOND_OS_VRAMEXCLUSIVE_H
+
+#include "nitro/types.h"
+
+void OSi_InitVramExclusive(void);
+BOOL OSi_TryLockVram(u16 bank, u16 lockId);
+void OSi_UnlockVram(u16 bank, u16 lockId);
+
+#endif //POKEDIAMOND_OS_VRAMEXCLUSIVE_H
diff --git a/arm9/lib/include/gx.h b/arm9/lib/include/gx.h
index bc89aa04..f9478851 100644
--- a/arm9/lib/include/gx.h
+++ b/arm9/lib/include/gx.h
@@ -4,6 +4,7 @@
#include "fx.h"
#include "MI_memory.h"
#include "MI_dma.h"
+#include "OS_vramExclusive.h"
//temporary while other files aren't decompiled
@@ -11,7 +12,6 @@ void GXi_NopClearFifo128_(void *);
void MI_Copy16B(const void *, void *);
void MI_Copy64B(void *src, void *dst);
void MIi_CpuCopy32(const void *src, void *dst, u32 size);
-void OSi_UnlockVram(u16, u16);
#include "GXcommon.h"
#include "GX_struct_2d.h"
diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c
index 152a5534..5bd435e7 100644
--- a/arm9/lib/src/OS_init.c
+++ b/arm9/lib/src/OS_init.c
@@ -3,7 +3,6 @@
extern void PXI_Init(void);
extern void MI_Init(void);
-extern void OSi_InitVramExclusive(void);
extern void CTRDG_Init(void);
extern void CARD_Init(void);
extern void PM_Init(void);
diff --git a/arm9/lib/src/OS_vramExclusive.c b/arm9/lib/src/OS_vramExclusive.c
new file mode 100644
index 00000000..5ce10f4a
--- /dev/null
+++ b/arm9/lib/src/OS_vramExclusive.c
@@ -0,0 +1,88 @@
+#include "OS_vramExclusive.h"
+#include "function_target.h"
+#include "OS_system.h"
+
+static u32 OSi_vramExclusive;
+static u16 OSi_vramLockId[9];
+
+static u32 OsCountZeroBits(register u32 bitmap);
+
+ARM_FUNC static asm u32 OsCountZeroBits(register u32 bitmap)
+{
+ clz r0, r0
+ bx lr
+}
+
+ARM_FUNC void OSi_InitVramExclusive(void)
+{
+ OSi_vramExclusive = 0x0000;
+
+ for (s32 i = 0; i < 9; i++)
+ {
+ OSi_vramLockId[i] = 0;
+ }
+}
+
+ARM_FUNC BOOL OSi_TryLockVram(u16 bank, u16 lockId)
+{
+ u32 workMap;
+ s32 zeroBits;
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ workMap = (u32)(bank & OSi_vramExclusive);
+ while (TRUE)
+ {
+ zeroBits = (s32)(31 - OsCountZeroBits(workMap));
+ if (zeroBits < 0)
+ {
+ break;
+ }
+ workMap &= ~(0x00000001 << zeroBits);
+ if (OSi_vramLockId[zeroBits] != lockId)
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return FALSE;
+ }
+ }
+
+ workMap = (u32)(bank & 0x01ff);
+ while (TRUE)
+ {
+ zeroBits = (s32)(31 - OsCountZeroBits(workMap));
+ if (zeroBits < 0)
+ {
+ break;
+ }
+ workMap &= ~(0x00000001 << zeroBits);
+ OSi_vramLockId[zeroBits] = lockId;
+ OSi_vramExclusive |= (0x00000001 << zeroBits);
+ }
+
+ (void)OS_RestoreInterrupts(enabled);
+ return TRUE;
+}
+
+ARM_FUNC void OSi_UnlockVram(u16 bank, u16 lockId)
+{
+ u32 workMap;
+ s32 zeroBits;
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ workMap = (u32)(bank & OSi_vramExclusive & 0x01ff);
+ while (TRUE)
+ {
+ zeroBits = (s32)(31- OsCountZeroBits((u32)workMap));
+ if (zeroBits < 0)
+ {
+ break;
+ }
+ workMap &= ~(0x00000001 << zeroBits);
+ if (OSi_vramLockId[zeroBits] == lockId)
+ {
+ OSi_vramLockId[zeroBits] = 0;
+ OSi_vramExclusive &= ~(0x00000001 << zeroBits);
+ }
+ }
+
+ (void)OS_RestoreInterrupts(enabled);
+}