summaryrefslogtreecommitdiff
path: root/arm9/lib
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-08-01 21:28:47 +0100
committerred031000 <rubenru09@aol.com>2020-08-01 21:28:59 +0100
commiteb4007dce800281754d17e989eab1cf51708f164 (patch)
treece7500bf47a4ec829f0c06cf617034d339d04f8f /arm9/lib
parentf7208c80c780bb666630a343cfe5912009dd5eaa (diff)
arm9 OS_vramExclusive
Diffstat (limited to 'arm9/lib')
-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
5 files changed, 100 insertions, 2 deletions
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);
+}