summaryrefslogtreecommitdiff
path: root/arm9/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib')
-rw-r--r--arm9/lib/include/OS_alloc.h (renamed from arm9/lib/include/os_alloc.h)2
-rw-r--r--arm9/lib/include/OS_arena.h (renamed from arm9/lib/include/os_arena.h)0
-rw-r--r--arm9/lib/include/OS_entropy.h27
-rw-r--r--arm9/lib/include/OS_init.h20
-rw-r--r--arm9/lib/include/OS_protectionRegion.h (renamed from arm9/lib/include/os_protectionRegion.h)1
-rw-r--r--arm9/lib/include/OS_spinLock.h14
-rw-r--r--arm9/lib/include/OS_system.h (renamed from arm9/lib/include/os_system.h)9
-rw-r--r--arm9/lib/include/OS_thread.h23
-rw-r--r--arm9/lib/include/consts.h21
-rw-r--r--arm9/lib/include/mmap.h51
-rw-r--r--arm9/lib/include/nitro.h2
-rw-r--r--arm9/lib/include/os.h17
-rw-r--r--arm9/lib/include/types.h10
-rw-r--r--arm9/lib/src/OS_alloc.c4
-rw-r--r--arm9/lib/src/OS_arena.c4
-rw-r--r--arm9/lib/src/OS_entropy.c22
-rw-r--r--arm9/lib/src/OS_init.c38
-rw-r--r--arm9/lib/src/OS_protectionRegion.c27
-rw-r--r--arm9/lib/src/OS_system.c71
19 files changed, 335 insertions, 28 deletions
diff --git a/arm9/lib/include/os_alloc.h b/arm9/lib/include/OS_alloc.h
index 1c4b6122..08fb3224 100644
--- a/arm9/lib/include/os_alloc.h
+++ b/arm9/lib/include/OS_alloc.h
@@ -6,7 +6,7 @@
#define POKEDIAMOND_OS_ALLOC_H
#include "types.h"
-#include "os_arena.h"
+#include "OS_arena.h"
typedef int OSHeapHandle;
diff --git a/arm9/lib/include/os_arena.h b/arm9/lib/include/OS_arena.h
index f1893a3d..f1893a3d 100644
--- a/arm9/lib/include/os_arena.h
+++ b/arm9/lib/include/OS_arena.h
diff --git a/arm9/lib/include/OS_entropy.h b/arm9/lib/include/OS_entropy.h
new file mode 100644
index 00000000..b4695a72
--- /dev/null
+++ b/arm9/lib/include/OS_entropy.h
@@ -0,0 +1,27 @@
+//
+// Created by red031000 on 2020-05-03.
+//
+
+#ifndef POKEDIAMOND_OS_ENTROPY_H
+#define POKEDIAMOND_OS_ENTROPY_H
+
+#include "consts.h"
+
+void OS_GetLowEntropyData(u32 * arr);
+
+typedef struct NVRAMConfig{
+ u8 ncd[110]; // todo: typeof NVRAMConfigData
+ u16 saveCount;
+ u16 rc16;
+} NVRAMConfig;
+
+extern vu64 OSi_TickCounter;
+
+extern u16 OS_GetTickLo();
+
+static inline s32 GX_GetVCount()
+{
+ return reg_GX_VCOUNT;
+}
+
+#endif //POKEDIAMOND_OS_ENTROPY_H
diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h
new file mode 100644
index 00000000..1ff2837c
--- /dev/null
+++ b/arm9/lib/include/OS_init.h
@@ -0,0 +1,20 @@
+//
+// Created by mart on 4/12/20.
+//
+
+#ifndef POKEDIAMOND_OS_INIT_H
+#define POKEDIAMOND_OS_INIT_H
+
+#include "types.h"
+#include "consts.h"
+#include "OS_spinLock.h"
+#include "OS_thread.h"
+#include "OS_protectionRegion.h"
+#include "OS_entropy.h"
+#include "OS_arena.h"
+#include "OS_alloc.h"
+#include "OS_system.h"
+
+void OS_Init();
+
+#endif //POKEDIAMOND_OS_INIT_H
diff --git a/arm9/lib/include/os_protectionRegion.h b/arm9/lib/include/OS_protectionRegion.h
index 7b212934..8e25420a 100644
--- a/arm9/lib/include/os_protectionRegion.h
+++ b/arm9/lib/include/OS_protectionRegion.h
@@ -8,6 +8,7 @@
#include "types.h"
#include "consts.h"
+void OS_SetDPermissionsForProtectionRegion(register u32 setMask, register u32 flags);
void OS_SetProtectionRegion1(u32 param);
void OS_SetProtectionRegion2(u32 param);
diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h
new file mode 100644
index 00000000..b7f0a571
--- /dev/null
+++ b/arm9/lib/include/OS_spinLock.h
@@ -0,0 +1,14 @@
+//
+// Created by red031000 on 2020-05-03.
+//
+
+#ifndef POKEDIAMOND_OS_SPINLOCK_H
+#define POKEDIAMOND_OS_SPINLOCK_H
+
+typedef volatile struct OSLockWord {
+ u32 lockFlag;
+ u16 ownerID;
+ u16 extension;
+} OSLockWord;
+
+#endif //POKEDIAMOND_OS_SPINLOCK_H
diff --git a/arm9/lib/include/os_system.h b/arm9/lib/include/OS_system.h
index c7f121bd..93903315 100644
--- a/arm9/lib/include/os_system.h
+++ b/arm9/lib/include/OS_system.h
@@ -17,17 +17,22 @@ typedef enum {
OS_PROCMODE_SYS=31
} OSProcMode;
+ENUMS_ALWAYS_INT_ON
typedef enum {
- OS_INTRMODE_DISABLE = HW_PSR_IRQ_DISABLE,
+ OS_INTRMODE_DISABLE_IRQ = HW_PSR_DISABLE_IRQ,
+ OS_INTRMODE_DISABLE_FIQ = HW_PSR_DISABLE_FIQ,
OS_INTRMODE_ENABLE = 0
} OSIntrMode;
+ENUMS_ALWAYS_INT_RESET
OSIntrMode OS_EnableInterrupts();
OSIntrMode OS_DisableInterrupts();
OSIntrMode OS_RestoreInterrupts(OSIntrMode state);
OSIntrMode OS_DisableInterrupts_IrqAndFiq();
OSIntrMode OS_RestoreInterrupts_IrqAndFiq(OSIntrMode state);
+OSIntrMode OS_GetCpsrIrq();
OSProcMode OS_GetProcMode();
-
+void OS_SpinWait();
+void OS_WaitVBlankIntr();
#endif //POKEDIAMOND_OS_SYSTEM_H
diff --git a/arm9/lib/include/OS_thread.h b/arm9/lib/include/OS_thread.h
new file mode 100644
index 00000000..4fb70bf7
--- /dev/null
+++ b/arm9/lib/include/OS_thread.h
@@ -0,0 +1,23 @@
+//
+// Created by red031000 on 2020-05-03.
+//
+
+#ifndef POKEDIAMOND_OS_THREAD_H
+#define POKEDIAMOND_OS_THREAD_H
+
+typedef struct _OSThread OSThread;
+
+typedef struct OSThreadInfo {
+ u16 isNeedRescheduling;
+ u16 irqDepth;
+ OSThread* current;
+ OSThread* list;
+ void* switchCallback; // type: OSSwitchThreadCallback
+} OSThreadInfo;
+
+struct _OSThread
+{
+ u8 padding[0x80]; //todo: not the correct size but idfk
+};
+
+#endif //POKEDIAMOND_OS_THREAD_H
diff --git a/arm9/lib/include/consts.h b/arm9/lib/include/consts.h
index 6fc71be2..e07fe323 100644
--- a/arm9/lib/include/consts.h
+++ b/arm9/lib/include/consts.h
@@ -9,9 +9,22 @@
#define HW_PSR_CPU_MODE_MASK 0x1f // CPU mode
-#define HW_PSR_FIQ_DISABLE 0x40 // Disable FIQ
-#define HW_PSR_IRQ_DISABLE 0x80 // Disable IRQ
-#define HW_PSR_IRQ_FIQ_DISABLE 0xc0 // Disable FIQ and IRQ
+#define HW_PSR_DISABLE_FIQ 0x40 // Disable FIQ
+#define HW_PSR_DISABLE_IRQ 0x80 // Disable IRQ
+#define HW_PSR_DISABLE_IRQ_FIQ 0xc0 // Disable FIQ and IRQ
+
+#define HW_REG_BASE 0x04000000
+#define REG_VCOUNT_OFFSET 0x006
+#define REG_VCOUNT_ADDR (HW_REG_BASE + REG_VCOUNT_OFFSET)
+#define reg_GX_VCOUNT (*(REGType16v *)REG_VCOUNT_ADDR)
+
+#define REG_KEYINPUT_OFFSET 0x130
+#define REG_KEYINPUT_ADDR (HW_REG_BASE + REG_KEYINPUT_OFFSET)
+#define reg_PAD_KEYINPUT (*(REGType16v *)REG_KEYINPUT_ADDR)
+
+#define REG_GXSTAT_OFFSET 0x600
+#define REG_GXSTAT_ADDR (HW_REG_BASE + REG_GXSTAT_OFFSET)
+#define reg_G3X_GXSTAT (*(REGType32v *)REG_GXSTAT_ADDR)
#define HW_C6_PR_4KB 0x16
#define HW_C6_PR_8KB 0x18
@@ -42,4 +55,6 @@
#define OSi_TRUNC(n, a) (((u32) (n)) & ~((a) - 1))
#define OSi_ROUND(n, a) (((u32) (n) + (a) - 1) & ~((a) - 1))
+#define OS_IE_V_BLANK (1UL << 0)
+
#endif //POKEDIAMOND_CONSTS_H
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index 14820c39..d94df843 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -26,6 +26,7 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_ARENA_INFO_BUF (HW_MAIN_MEM + 0x007ffda0) // Arena data structure
#define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer
#define HW_RED_RESERVED (HW_MAIN_MEM + 0x007ff800) // Some kind of reserved data for shared memory
+#define HW_MAIN_MEM_SYSTEM (HW_MAIN_MEM + 0x007ffc00)
#define HW_MAIN_MEM_MAIN_END (HW_MAIN_MEM + HW_MAIN_MEM_MAIN_SIZE)
#define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE)
#define HW_MAIN_MEM_SHARED (HW_MAIN_MEM_EX_END - HW_MAIN_MEM_SHARED_SIZE)
@@ -34,6 +35,8 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_DTCM_SVC_STACK (HW_DTCM_SVC_STACK_END - HW_SVC_STACK_SIZE)
#define HW_DTCM_IRQ_STACK_END (HW_DTCM_SVC_STACK)
+#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007fffa8)
+
#define OSi_MAIN_ARENA_HI_DEFAULT (HW_MAIN_MEM_MAIN_END)
#define OSi_MAINEX_ARENA_HI_DEFAULT (HW_MAIN_MEM + HW_MAIN_MEM_DEBUGGER_OFFSET)
#define HW_ITCM_ARENA_HI_DEFAULT (HW_ITCM + HW_ITCM_SIZE)
@@ -42,4 +45,52 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define OSi_WRAM_MAIN_ARENA_HI_DEFAULT (HW_WRAM)
#define OSi_WRAM_MAIN_ARENA_LO_DEFAULT (HW_WRAM)
+#include "OS_thread.h" //not ideal but it's necessary
+#include "OS_spinLock.h"
+
+typedef struct {
+ u8 bootCheckInfo[0x20]; // 000-01f: 32byte boot check info
+ u32 resetParameter; // 020-023: 4byte reset parameter
+ u8 padding5[0x8]; // 024-02c: (8byte)
+ u32 romBaseOffset; // 02c-02f: 4byte ROM offset of own program
+ u8 cartridgeModuleInfo[12]; // 030-03b: 12byte cartridge module info
+ u32 vblankCount; // 03c-03f: 4byte V-Blank Count
+ u8 wmBootBuf[0x40]; // 040-07f: 64byte WM multiboot buffer
+ u8 nvramUserInfo[0x100]; // 080-17f: 256bytes NVRAM user info
+ u8 isd_reserved1[0x20]; // 180-19f: 32bytes ISDebugger reserved
+ u8 arenaInfo[0x48]; // 1a0-1e7: 72byte Arena information
+ u8 real_time_clock[8]; // 1e8-1ef: 8bytes RTC
+ u32 dmaClearBuf[4]; // 1f0-1ff: 16bytes DMA clear information buffer (for ARM9-TEG)
+ u8 rom_header[0x160]; // 200-35f: 352bytes ROM registration area info storage buffer
+ u8 isd_reserved2[32]; // 360-37f: 32bytes ISDebugger reserved
+ u32 pxiSignalParam[2]; // 380-387: 8bytes Param for PXI Signal
+ u32 pxiHandleChecker[2]; // 388-38f: 8bytes Flag for PXI Command Handler Installed
+ u32 mic_last_address; // 390-393: 4bytes MIC latest sampling result storage address
+ u16 mic_sampling_data; // 394-395: 2bytes MIC sampling result
+ u16 wm_callback_control; // 396-397: 2bytes Parameter for WM callback synchronization
+ u16 wm_rssi_pool; // 398-399: 2bytes Random number source depends on WM received signal intensity
+ u8 padding3[2]; // 39a-39b: (2bytes)
+ u32 component_param; // 39c-39f: 4bytes Parameter for Component synchronization
+ OSThreadInfo *threadinfo_mainp; // 3a0-3a3: 4bytes Verify that the pointer to ARM9 thread information is initial value 0
+ OSThreadInfo *threadinfo_subp; // 3a4-3a7: 4bytes Verify that the pointer to ARM7 thread information is initial value 0
+ u16 button_XY; // 3a8-3a9: 2bytes XY button information storage location
+ u8 touch_panel[4]; // 3aa-3ad: 4bytes Touch Screen information storage location
+ u16 autoloadSync; // 3ae-3af: 2bytes autoload sync between processors
+ u32 lockIDFlag_mainp[2]; // 3b0-3b7: 8bytes lockID management flag (ARM9)
+ u32 lockIDFlag_subp[2]; // 3b8-3bf: 8bytes lockID management flag (ARM7)
+ struct OSLockWord lock_VRAM_C; // 3c0-3c7: 8bytes C - lock buffer
+ struct OSLockWord lock_VRAM_D; // 3c8-3cf: 8bytes VRAM-D - lock buffer
+ struct OSLockWord lock_WRAM_BLOCK0; // 3d0-3d7: 8bytes Block0 - lock buffer
+ struct OSLockWord lock_WRAM_BLOCK1; // 3d8-3df: 8bytes CPU internal work RAM - Block1 - lock buffer
+ struct OSLockWord lock_CARD; // 3e0-3e7: 8bytes Game Card - lock buffer
+ struct OSLockWord lock_CARTRIDGE; // 3e8-3ef: 8bytes DS Pak - lock buffer
+ struct OSLockWord lock_INIT; // 3f0-3f7: 8bytes Initialization lock buffer
+ u16 mmem_checker_mainp; // 3f8-3f9: 2bytes MainMomory Size Checker for Main processor
+ u16 mmem_checker_subp; // 3fa-3fb: 2bytes MainMomory Size Checker for Sub processor
+ u8 padding4[2]; // 3fc-3fd: (2bytes)
+ u16 command_area; // 3fe-3ff: 2bytes Command Area
+} OSSystemWork;
+
+#define OS_GetSystemWork() ((OSSystemWork *)HW_MAIN_MEM_SYSTEM)
+
#endif \ No newline at end of file
diff --git a/arm9/lib/include/nitro.h b/arm9/lib/include/nitro.h
index 8cf603f5..f7397fb0 100644
--- a/arm9/lib/include/nitro.h
+++ b/arm9/lib/include/nitro.h
@@ -8,7 +8,7 @@ extern "C" {
// Include all nitro files
#include "types.h"
#include "consts.h"
-#include "os.h"
+#include "OS_init.h"
#include "mmap.h"
#ifdef __cplusplus
diff --git a/arm9/lib/include/os.h b/arm9/lib/include/os.h
deleted file mode 100644
index 591d8db0..00000000
--- a/arm9/lib/include/os.h
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// Created by mart on 4/12/20.
-//
-
-#ifndef POKEDIAMOND_OS_H
-#define POKEDIAMOND_OS_H
-
-#include "types.h"
-#include "consts.h"
-#include "os_protectionRegion.h"
-#include "os_arena.h"
-#include "os_alloc.h"
-#include "os_system.h"
-
-void OS_Init();
-
-#endif //POKEDIAMOND_OS_H
diff --git a/arm9/lib/include/types.h b/arm9/lib/include/types.h
index 5ad2c75e..40f8207d 100644
--- a/arm9/lib/include/types.h
+++ b/arm9/lib/include/types.h
@@ -25,6 +25,16 @@ typedef volatile s64 vs64;
typedef float f32;
typedef volatile f32 vf32;
+typedef u8 REGType8;
+typedef u16 REGType16;
+typedef u32 REGType32;
+typedef u64 REGType64;
+
+typedef vu8 REGType8v;
+typedef vu16 REGType16v;
+typedef vu32 REGType32v;
+typedef vu64 REGType64v;
+
typedef int BOOL;
#define TRUE 1
#define FALSE 0
diff --git a/arm9/lib/src/OS_alloc.c b/arm9/lib/src/OS_alloc.c
index 242c5571..e883656e 100644
--- a/arm9/lib/src/OS_alloc.c
+++ b/arm9/lib/src/OS_alloc.c
@@ -2,9 +2,9 @@
// Created by mart on 4/23/20.
//
#include "function_target.h"
-#include "os_alloc.h"
+#include "OS_alloc.h"
#include "consts.h"
-#include "os_system.h"
+#include "OS_system.h"
void* OSiHeapInfo[OS_ARENA_MAX];
diff --git a/arm9/lib/src/OS_arena.c b/arm9/lib/src/OS_arena.c
index 58b338f1..eb04e60b 100644
--- a/arm9/lib/src/OS_arena.c
+++ b/arm9/lib/src/OS_arena.c
@@ -3,8 +3,8 @@
//
#include "function_target.h"
#include "consts.h"
-#include "os_arena.h"
-#include "os_protectionRegion.h"
+#include "OS_arena.h"
+#include "OS_protectionRegion.h"
extern u32 OS_GetConsoleType();
extern BOOL OSi_MainExArenaEnabled;
diff --git a/arm9/lib/src/OS_entropy.c b/arm9/lib/src/OS_entropy.c
new file mode 100644
index 00000000..b33781cc
--- /dev/null
+++ b/arm9/lib/src/OS_entropy.c
@@ -0,0 +1,22 @@
+//
+// Created by red031000 on 2020-05-03.
+//
+
+#include "function_target.h"
+#include "consts.h"
+#include "OS_entropy.h"
+
+ARM_FUNC void OS_GetLowEntropyData(u32 * arr)
+{
+ const OSSystemWork* work = OS_GetSystemWork();
+ const u8 * macAddress = (u8 *)((u32)(work->nvramUserInfo) + ((sizeof(NVRAMConfig) + 3) & ~3));
+ arr[0] = (u32)((GX_GetVCount() << 16) | OS_GetTickLo());
+ arr[1] = (u32)(*(u16 *)(macAddress + 4) << 16) ^ (u32)(OSi_TickCounter);
+ arr[2] = (u32)(OSi_TickCounter >> 32) ^ *(u32 *)macAddress ^ work->vblankCount;
+ arr[2] ^= reg_G3X_GXSTAT;
+ arr[3] = *(u32 *)(&work->real_time_clock[0]);
+ arr[4] = *(u32 *)(&work->real_time_clock[4]);
+ arr[5] = (((u32)work->mic_sampling_data) << 16) ^ work->mic_last_address;
+ arr[6] = (u32) ((*(u16 *)(&work->touch_panel[0]) << 16) | *(u16 *)(&work->touch_panel[2]));
+ arr[7] = (u32)((work->wm_rssi_pool << 16) | (reg_PAD_KEYINPUT | *(vu16 *)HW_BUTTON_XY_BUF));
+}
diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c
new file mode 100644
index 00000000..90b01ffa
--- /dev/null
+++ b/arm9/lib/src/OS_init.c
@@ -0,0 +1,38 @@
+//
+// Created by mart on 4/12/20.
+//
+
+#include "function_target.h"
+#include "OS_init.h"
+
+extern void PXI_Init();
+extern void OS_InitLock();
+extern void OS_InitIrqTable();
+extern void OS_SetIrqStackChecker();
+extern void OS_InitException();
+extern void MI_Init();
+extern void OS_InitVAlarm();
+extern void OSi_InitVramExclusive();
+extern void OS_InitThread();
+extern void OS_InitReset();
+extern void CTRDG_Init();
+extern void CARD_Init();
+extern void PM_Init();
+
+ARM_FUNC void OS_Init(void) {
+ OS_InitArena();
+ PXI_Init();
+ OS_InitLock();
+ OS_InitArenaEx();
+ OS_InitIrqTable();
+ OS_SetIrqStackChecker();
+ OS_InitException();
+ MI_Init();
+ OS_InitVAlarm();
+ OSi_InitVramExclusive();
+ OS_InitThread();
+ OS_InitReset();
+ CTRDG_Init();
+ CARD_Init();
+ PM_Init();
+}
diff --git a/arm9/lib/src/OS_protectionRegion.c b/arm9/lib/src/OS_protectionRegion.c
new file mode 100644
index 00000000..4d6cf974
--- /dev/null
+++ b/arm9/lib/src/OS_protectionRegion.c
@@ -0,0 +1,27 @@
+//
+// Created by red031000 on 2020-04-24.
+//
+
+#include "function_target.h"
+#include "OS_protectionRegion.h"
+
+ARM_FUNC asm void OS_SetDPermissionsForProtectionRegion(register u32 setMask, register u32 flags)
+{
+ mrc p15, 0x0, r2, c5, c0, 0x2
+ bic r2, r2, r0
+ orr r2, r2, r1
+ mcr p15, 0x0, r2, c5, c0, 0x2
+ bx lr
+}
+
+ARM_FUNC asm void OS_SetProtectionRegion1(u32 param)
+{
+ mcr p15, 0x0, r0, c6, c1, 0x0
+ bx lr
+}
+
+ARM_FUNC asm void OS_SetProtectionRegion2(u32 param)
+{
+ mcr p15, 0x0, r0, c6, c2, 0x0
+ bx lr
+}
diff --git a/arm9/lib/src/OS_system.c b/arm9/lib/src/OS_system.c
new file mode 100644
index 00000000..c2b08681
--- /dev/null
+++ b/arm9/lib/src/OS_system.c
@@ -0,0 +1,71 @@
+//
+// Created by mart on 4/23/20.
+//
+
+#include "function_target.h"
+#include "OS_system.h"
+
+ARM_FUNC asm OSIntrMode OS_EnableInterrupts() {
+ mrs r0, cpsr
+ bic r1, r0, #HW_PSR_DISABLE_IRQ
+ msr cpsr_c, r1
+ and r0, r0, #HW_PSR_DISABLE_IRQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_DisableInterrupts() {
+ mrs r0, cpsr
+ orr r1, r0, #HW_PSR_DISABLE_IRQ
+ msr cpsr_c, r1
+ and r0, r0, #HW_PSR_DISABLE_IRQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_RestoreInterrupts(OSIntrMode state) {
+ mrs r1, cpsr
+ bic r2, r1, #HW_PSR_DISABLE_IRQ
+ orr r2, r2, r0
+ msr cpsr_c, r2
+ and r0, r1, #HW_PSR_DISABLE_IRQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_DisableInterrupts_IrqAndFiq() {
+ mrs r0, cpsr
+ orr r1, r0, #HW_PSR_DISABLE_IRQ_FIQ
+ msr cpsr_c, r1
+ and r0, r0, #HW_PSR_DISABLE_IRQ_FIQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_RestoreInterrupts_IrqAndFiq(OSIntrMode state) {
+ mrs r1, cpsr
+ bic r2, r1, #HW_PSR_DISABLE_IRQ_FIQ
+ orr r2, r2, r0
+ msr cpsr_c, r2
+ and r0, r1, #HW_PSR_DISABLE_IRQ_FIQ
+ bx lr
+}
+
+ARM_FUNC asm OSIntrMode OS_GetCpsrIrq() {
+ mrs r0, cpsr
+ and r0, r0, #HW_PSR_DISABLE_IRQ
+ bx lr
+}
+
+ARM_FUNC asm OSProcMode OS_GetProcMode() {
+ mrs r0, cpsr
+ and r0, r0, #HW_PSR_CPU_MODE_MASK
+ bx lr
+}
+
+ARM_FUNC asm void OS_SpinWait() {
+ subs r0, r0, #0x4
+ bhs OS_SpinWait
+ bx lr
+}
+
+ARM_FUNC void OS_WaitVBlankIntr() {
+ SVC_WaitByLoop(0x1);
+ OS_WaitIrq(TRUE, OS_IE_V_BLANK);
+}