summaryrefslogtreecommitdiff
path: root/arm9/lib
diff options
context:
space:
mode:
authorEgor Ananyin <ananinegor@gmail.com>2020-06-20 09:18:43 +0300
committerEgor Ananyin <ananinegor@gmail.com>2020-06-20 09:18:43 +0300
commitabd2d1e16494867989e710e5235c6425fa4e8c34 (patch)
tree7eff3e1db566801104a8fc2672bbe57e06f7009e /arm9/lib
parent70556fc300ba85dad248d20b3c79c415e2ef88e5 (diff)
parent12c17948602bf14535c91c530f214b99863e038e (diff)
conflicts
Diffstat (limited to 'arm9/lib')
-rw-r--r--arm9/lib/include/MI_dma.h8
-rw-r--r--arm9/lib/include/MI_memory.h2
-rw-r--r--arm9/lib/include/OS_alarm.h23
-rw-r--r--arm9/lib/include/OS_init.h1
-rw-r--r--arm9/lib/include/OS_interrupt.h11
-rw-r--r--arm9/lib/include/OS_mutex.h16
-rw-r--r--arm9/lib/include/OS_spinLock.h13
-rw-r--r--arm9/lib/include/OS_terminate_proc.h10
-rw-r--r--arm9/lib/include/OS_thread.h117
-rw-r--r--arm9/lib/include/OS_tick.h18
-rw-r--r--arm9/lib/include/OS_timer.h32
-rw-r--r--arm9/lib/include/consts.h9
-rw-r--r--arm9/lib/include/fx.h5
-rw-r--r--arm9/lib/include/mmap.h52
-rw-r--r--arm9/lib/include/registers.h16
-rw-r--r--arm9/lib/include/syscall.h6
-rw-r--r--arm9/lib/include/systemWork.h7
-rw-r--r--arm9/lib/src/OS_printf.c815
-rw-r--r--arm9/lib/src/OS_reset.c1
-rw-r--r--arm9/lib/src/OS_spinLock.c4
-rw-r--r--arm9/lib/src/OS_tick.c70
-rw-r--r--arm9/lib/syscall/_svc_mw.s76
22 files changed, 291 insertions, 1021 deletions
diff --git a/arm9/lib/include/MI_dma.h b/arm9/lib/include/MI_dma.h
index eddcedbb..15dc2c06 100644
--- a/arm9/lib/include/MI_dma.h
+++ b/arm9/lib/include/MI_dma.h
@@ -1,6 +1,8 @@
-#ifndef NITRO_MI_DMA_H_
-#define NITRO_MI_DMA_H_
+#ifndef POKEDIAMOND_ARM9_MI_DMA_H
+#define POKEDIAMOND_ARM9_MI_DMA_H
+
+#include "nitro/MI_dma_shared.h"
typedef void (*MIDmaCallback)(void *);
-#endif //NITRO_MI_DMA_H_
+#endif //POKEDIAMOND_ARM9_MI_DMA_H
diff --git a/arm9/lib/include/MI_memory.h b/arm9/lib/include/MI_memory.h
index bf6c0ca5..e1e5fe11 100644
--- a/arm9/lib/include/MI_memory.h
+++ b/arm9/lib/include/MI_memory.h
@@ -22,4 +22,6 @@ static inline void MI_CpuClear32(void *dest, u32 size)
MI_CpuFill32(dest, 0, size);
}
+void MIi_CpuClearFast(u32 data, void *destp, u32 size);
+
#endif //NITRO_MI_MEMORY_H_
diff --git a/arm9/lib/include/OS_alarm.h b/arm9/lib/include/OS_alarm.h
index a9734d1b..ebdf01ba 100644
--- a/arm9/lib/include/OS_alarm.h
+++ b/arm9/lib/include/OS_alarm.h
@@ -1,28 +1,13 @@
-#ifndef POKEDIAMOND_OS_ALARM_H
-#define POKEDIAMOND_OS_ALARM_H
+#ifndef POKEDIAMOND_ARM9_OS_ALARM_H
+#define POKEDIAMOND_ARM9_OS_ALARM_H
#include "nitro/types.h"
#include "OS_thread.h"
#include "OS_tick.h"
-
-typedef void (*OSAlarmHandler) (void *);
-
-struct OSiAlarm
-{
- OSAlarmHandler handler;
- void *arg;
-
- u32 tag;
- OSTick fire;
- OSAlarm *prev;
- OSAlarm *next;
-
- OSTick period;
- OSTick start;
-};
+#include "nitro/OS_alarm_shared.h"
void OS_CancelAlarm(OSAlarm *alarm);
void OS_CreateAlarm(OSAlarm *alarm);
void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg);
-#endif //POKEDIAMOND_OS_ALARM_H
+#endif //POKEDIAMOND_ARM9_OS_ALARM_H
diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h
index 3c8aea24..03ff26d2 100644
--- a/arm9/lib/include/OS_init.h
+++ b/arm9/lib/include/OS_init.h
@@ -23,6 +23,7 @@
#include "OS_interrupt.h"
#include "OS_reset.h"
#include "OS_spinLock.h"
+#include "OS_tick.h"
void OS_Init(void);
diff --git a/arm9/lib/include/OS_interrupt.h b/arm9/lib/include/OS_interrupt.h
index ec58a636..a828c62e 100644
--- a/arm9/lib/include/OS_interrupt.h
+++ b/arm9/lib/include/OS_interrupt.h
@@ -1,17 +1,10 @@
#ifndef POKEDIAMOND_ARM9_OS_INTERRUPT_H
#define POKEDIAMOND_ARM9_OS_INTERRUPT_H
-#include "nitro/types.h"
+#include "consts.h"
#include "nitro/OS_interrupt_shared.h"
-typedef void (*OSIrqFunction) (void);
-
-typedef struct
-{
- void (*func) (void *);
- u32 enable;
- void* arg;
-} OSIrqCallbackInfo;
+#define OS_IE_TIMER0 (1UL << REG_OS_IE_T0_SHIFT)
extern OSIrqFunction OS_IRQTable[];
extern OSIrqCallbackInfo OSi_IrqCallbackInfo[8];
diff --git a/arm9/lib/include/OS_mutex.h b/arm9/lib/include/OS_mutex.h
index 0fc261a4..9da89c69 100644
--- a/arm9/lib/include/OS_mutex.h
+++ b/arm9/lib/include/OS_mutex.h
@@ -1,16 +1,10 @@
-#ifndef POKEDIAMOND_OS_MUTEX_H
-#define POKEDIAMOND_OS_MUTEX_H
+#ifndef POKEDIAMOND_ARM9_OS_MUTEX_H
+#define POKEDIAMOND_ARM9_OS_MUTEX_H
-#include "nitro/types.h"
#include "OS_thread.h"
-
-struct OSMutex {
- OSThreadQueue queue;
- OSThread *thread;
- s32 count;
- OSMutexLink link;
-};
+#include "OS_context.h"
+#include "nitro/OS_mutex_shared.h"
void OSi_UnlockAllMutex(OSThread * thread);
-#endif //POKEDIAMOND_OS_MUTEX_H
+#endif //POKEDIAMOND_ARM9_OS_MUTEX_H
diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h
index 5dc47522..a5d27585 100644
--- a/arm9/lib/include/OS_spinLock.h
+++ b/arm9/lib/include/OS_spinLock.h
@@ -1,15 +1,10 @@
-#ifndef POKEDIAMOND_OS_SPINLOCK_H
-#define POKEDIAMOND_OS_SPINLOCK_H
+#ifndef POKEDIAMOND_ARM9_OS_SPINLOCK_H
+#define POKEDIAMOND_ARM9_OS_SPINLOCK_H
#include "nitro/types.h"
+#include "nitro/OS_spinLock_shared.h"
#include "syscall.h"
-typedef volatile struct OSLockWord {
- u32 lockFlag;
- u16 ownerID;
- u16 extension;
-} OSLockWord;
-
static inline void OSi_WaitByLoop(void)
{
SVC_WaitByLoop(0x1000 / 4);
@@ -38,4 +33,4 @@ s32 OS_UnLockCartridge(u16 lockID);
s32 OS_GetLockID(void);
void OS_ReleaseLockID(register u16 lockID);
-#endif //POKEDIAMOND_OS_SPINLOCK_H
+#endif //POKEDIAMOND_ARM9_OS_SPINLOCK_H
diff --git a/arm9/lib/include/OS_terminate_proc.h b/arm9/lib/include/OS_terminate_proc.h
index 1d3ac27e..b4553fb4 100644
--- a/arm9/lib/include/OS_terminate_proc.h
+++ b/arm9/lib/include/OS_terminate_proc.h
@@ -1,13 +1,9 @@
-//
-// Created by red031000 on 2020-05-07.
-//
-
-#ifndef POKEDIAMOND_OS_TERMINATE_PROC_H
-#define POKEDIAMOND_OS_TERMINATE_PROC_H
+#ifndef POKEDIAMOND_ARM9_OS_TERMINATE_PROC_H
+#define POKEDIAMOND_ARM9_OS_TERMINATE_PROC_H
#include "nitro/types.h"
void OS_Terminate(void);
void OS_Halt(void);
-#endif //POKEDIAMOND_OS_TERMINATE_PROC_H
+#endif //POKEDIAMOND_ARM9_OS_TERMINATE_PROC_H
diff --git a/arm9/lib/include/OS_thread.h b/arm9/lib/include/OS_thread.h
index a80a3b96..8afc0b78 100644
--- a/arm9/lib/include/OS_thread.h
+++ b/arm9/lib/include/OS_thread.h
@@ -1,89 +1,9 @@
-#ifndef POKEDIAMOND_OS_THREAD_H
-#define POKEDIAMOND_OS_THREAD_H
+#ifndef POKEDIAMOND_ARM9_OS_THREAD_H
+#define POKEDIAMOND_ARM9_OS_THREAD_H
#include "nitro/types.h"
#include "OS_context.h"
-
-typedef struct OSiAlarm OSAlarm;
-
-typedef struct _OSThread OSThread;
-
-typedef struct _OSThreadQueue OSThreadQueue;
-typedef struct _OSThreadLink OSThreadLink;
-typedef struct _OSMutexQueue OSMutexQueue;
-typedef struct _OSMutexLink OSMutexLink;
-typedef struct OSMutex OSMutex;
-
-struct _OSThreadQueue
-{
- OSThread *head;
- OSThread *tail;
-};
-
-struct _OSThreadLink
-{
- OSThread *prev;
- OSThread *next;
-};
-
-struct _OSMutexQueue
-{
- OSMutex *head;
- OSMutex *tail;
-};
-
-struct _OSMutexLink
-{
- OSMutex *next;
- OSMutex *prev;
-};
-
-typedef struct OSThreadInfo {
- u16 isNeedRescheduling;
- u16 irqDepth;
- OSThread* current;
- OSThread* list;
- void* switchCallback; // type: OSSwitchThreadCallback
-} OSThreadInfo;
-
-typedef enum {
- OS_THREAD_STATE_WAITING = 0,
- OS_THREAD_STATE_READY = 1,
- OS_THREAD_STATE_TERMINATED = 2
-} OSThreadState;
-
-typedef void (*OSSwitchThreadCallback) (OSThread *from, OSThread *to);
-
-typedef void (*OSThreadDestructor) (void *);
-
-struct _OSThread
-{
- OSContext context;
- OSThreadState state;
- OSThread *next;
- u32 id;
- u32 priority;
- void *profiler;
-
- OSThreadQueue *queue;
- OSThreadLink link;
-
- OSMutex *mutex;
- OSMutexQueue mutexQueue;
-
- u32 stackTop;
- u32 stackBottom;
- u32 stackWarningOffset;
-
- OSThreadQueue joinQueue;
-
- void *specific[3];
- OSAlarm *alarmForSleep;
- OSThreadDestructor destructor;
- void *userParameter;
-
- u32 systemErrno;
-};
+#include "nitro/OS_thread_shared.h"
static s32 OSi_GetUnusedThreadId(void);
static void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread);
@@ -119,33 +39,4 @@ u32 OS_DisableScheduler(void);
u32 OS_EnableScheduler(void);
void OS_SetThreadDestructor(OSThread *thread, OSThreadDestructor dtor);
-extern OSThreadInfo OSi_ThreadInfo;
-
-static inline OSThreadInfo *OS_GetThreadInfo(void)
-{
- return &OSi_ThreadInfo;
-}
-
-static inline BOOL OS_IsThreadRunnable(const OSThread *thread)
-{
- return thread->state == OS_THREAD_STATE_READY;
-}
-
-static inline void OS_InitThreadQueue(OSThreadQueue * queue)
-{
- queue->head = queue->tail = NULL;
-}
-
-static inline OSThread *OS_GetCurrentThread(void)
-{
- return OS_GetThreadInfo()->current;
-}
-
-static inline void OS_SetCurrentThread(OSThread *thread)
-{
- OS_GetThreadInfo()->current = thread;
-}
-
-#define OSi_GetCurrentThread() (*OSi_CurrentThreadPtr)
-
-#endif //POKEDIAMOND_OS_THREAD_H
+#endif //POKEDIAMOND_ARM9_OS_THREAD_H
diff --git a/arm9/lib/include/OS_tick.h b/arm9/lib/include/OS_tick.h
index f1c7145d..59c43b10 100644
--- a/arm9/lib/include/OS_tick.h
+++ b/arm9/lib/include/OS_tick.h
@@ -1,12 +1,16 @@
-#ifndef POKEDIAMOND_OS_TICK_H
-#define POKEDIAMOND_OS_TICK_H
+#ifndef POKEDIAMOND_ARM9_OS_TICK_H
+#define POKEDIAMOND_ARM9_OS_TICK_H
#include "consts.h"
+#include "OS_timer.h"
+#include "nitro/OS_tick_shared.h"
-typedef u64 OSTick;
+#define OSi_TICK_TIMERCONTROL (REG_OS_TM0CNT_H_E_MASK | REG_OS_TM0CNT_H_I_MASK | OS_TIMER_PRESCALER_64)
-#define OS_SYSTEM_CLOCK HW_SYSTEM_CLOCK
+void OS_InitTick(void);
+BOOL OS_IsTickAvailable(void);
+static void OSi_CountUpTick(void);
+OSTick OS_GetTick(void);
+u16 OS_GetTickLo(void);
-#define OS_MilliSecondsToTicks(msec) ((OSTick)(((OS_SYSTEM_CLOCK/1000) * (u64)(msec)) / 64))
-
-#endif //POKEDIAMOND_OS_TICK_H
+#endif //POKEDIAMOND_ARM9_OS_TICK_H
diff --git a/arm9/lib/include/OS_timer.h b/arm9/lib/include/OS_timer.h
new file mode 100644
index 00000000..8b2a97a9
--- /dev/null
+++ b/arm9/lib/include/OS_timer.h
@@ -0,0 +1,32 @@
+#ifndef POKEDIAMOND_OS_TIMER_H
+#define POKEDIAMOND_OS_TIMER_H
+
+#include "consts.h"
+
+typedef enum
+{
+ OS_TIMER_PRESCALER_1 = (0UL << REG_OS_TM0CNT_H_PS_SHIFT),
+ OS_TIMER_PRESCALER_64 = (1UL << REG_OS_TM0CNT_H_PS_SHIFT),
+ OS_TIMER_PRESCALER_256 = (2UL << REG_OS_TM0CNT_H_PS_SHIFT),
+ OS_TIMER_PRESCALER_1024 = (3UL << REG_OS_TM0CNT_H_PS_SHIFT)
+} OSTimerPrescaler;
+
+typedef enum
+{
+ OS_TIMER_0 = 0,
+ OS_TIMER_1 = 1,
+ OS_TIMER_2 = 2,
+ OS_TIMER_3 = 3
+} OSTimer;
+
+static inline void OS_SetTimerCount(OSTimer id, u16 count)
+{
+ *((REGType16 *)((u32)&reg_OS_TM0CNT_L + id * 4)) = count;
+}
+
+static inline void OS_SetTimerControl(OSTimer id, u16 control)
+{
+ *((REGType16 *)((u32)&reg_OS_TM0CNT_H + id * 4)) = control;
+}
+
+#endif //POKEDIAMOND_OS_TIMER_H
diff --git a/arm9/lib/include/consts.h b/arm9/lib/include/consts.h
index a24e9d89..5dd0b150 100644
--- a/arm9/lib/include/consts.h
+++ b/arm9/lib/include/consts.h
@@ -4,6 +4,7 @@
#include "nitro/consts_shared.h"
#include "mmap.h"
#include "registers.h"
+#include "systemWork.h"
#define HW_C6_PR_4KB 0x16
#define HW_C6_PR_8KB 0x18
@@ -27,8 +28,6 @@
#define HW_C6_PR_2GB 0x3c
#define HW_C6_PR_4GB 0x3e
-#define HW_SYSTEM_CLOCK 33514000
-
#define PXI_PROC_ARM7 0x01
#define OSi_CONSOLE_NOT_DETECT 0xffffffff
@@ -38,12 +37,6 @@
#define OS_CONSOLE_SIZE_MASK 0x00000003
#define OS_CONSOLE_SIZE_4MB 0x00000001
-#define OS_THREAD_LAUNCHER_PRIORITY 0x10
-#define OS_THREAD_PRIORITY_MIN 0x00
-#define OS_THREAD_PRIORITY_MAX 0x1F
-
-#define OS_THREAD_SPECIFIC_MAX 0x03
-
#define OSi_TCM_REGION_BASE_MASK 0xfffff000
#define OS_IE_V_BLANK (1UL << 0)
diff --git a/arm9/lib/include/fx.h b/arm9/lib/include/fx.h
index c09b24ae..4a844872 100644
--- a/arm9/lib/include/fx.h
+++ b/arm9/lib/include/fx.h
@@ -59,8 +59,11 @@ typedef s64 fx64c;
#define FX_F32_TO_FX16(x) ((fx16)(((x) > 0) ? \
(fx16)((x) * (1 << FX16_INT_SHIFT) + 0.5f ) : \
(fx16)((x) * (1 << FX16_INT_SHIFT) - 0.5f )))
-
+#define FX_F32_TO_FX32(x) ((fx32)(((x) > 0) ? \
+ (fx32)((x) * (1 << FX32_INT_SHIFT) + 0.5f ) : \
+ (fx32)((x) * (1 << FX32_INT_SHIFT) - 0.5f )))
#define FX16_CONST(x) FX_F32_TO_FX16(x)
+#define FX32_CONST(x) FX_F32_TO_FX32(x)
struct Vecx32
{
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index 6a5f23c5..12823fa0 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -14,8 +14,6 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_ITCM_SIZE 0x00008000
#define HW_ITCM_END (HW_ITCM + HW_ITCM_SIZE)
-#define HW_WRAM 0x037F8000
-
#define HW_DTCM ((u32)SDK_AUTOLOAD_DTCM_START)
#define HW_DTCM_SIZE 0x00004000
@@ -29,7 +27,6 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_ROM_BASE_OFFSET_BUF (HW_MAIN_MEM + 0x007ffc2c)
#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_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)
#define HW_DTCM_SVC_STACK_END (HW_DTCM + 0x00003fc0)
@@ -49,7 +46,6 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_LOCK_ID_FLAG_MAIN (HW_MAIN_MEM + 0x007fffb0)
#define HW_SHARED_LOCK_BUF (HW_MAIN_MEM + 0x007fffc0)
#define HW_CARD_LOCK_BUF (HW_MAIN_MEM + 0x007fffe0)
-#define HW_CTRDG_LOCK_BUF (HW_MAIN_MEM + 0x007fffe8)
#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007fffa8)
@@ -61,52 +57,4 @@ 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; //0x027FFC00
-
-#define OS_GetSystemWork() ((OSSystemWork *)HW_MAIN_MEM_SYSTEM)
-
#endif //POKEDIAMOND_ARM9_MMAP_H \ No newline at end of file
diff --git a/arm9/lib/include/registers.h b/arm9/lib/include/registers.h
index 4781ba1b..a5355322 100644
--- a/arm9/lib/include/registers.h
+++ b/arm9/lib/include/registers.h
@@ -1,7 +1,8 @@
-#ifndef POKEDIAMOND_REGISTERS_H
-#define POKEDIAMOND_REGISTERS_H
+#ifndef POKEDIAMOND_ARM9_REGISTERS_H
+#define POKEDIAMOND_ARM9_REGISTERS_H
#include "nitro/types.h"
+#include "nitro/registers_shared.h"
#define reg_GX_DISPCNT (*(REGType32v *)0x4000000)
#define reg_GX_DISPSTAT (*(REGType16v *)0x4000004)
@@ -103,9 +104,6 @@
#define reg_MI_MCCMD1 (*(REGType32v *)0x40001ac)
#define reg_MI_EXMEMCNT (*(REGType16v *)0x4000204)
-#define reg_OS_IME (*(REGType16v *)0x4000208)
-#define reg_OS_IE (*(REGType32v *)0x4000210)
-#define reg_OS_IF (*(REGType32v *)0x4000214)
#define reg_OS_PAUSE (*(REGType16v *)0x4000300)
#define reg_GX_VRAMCNT (*(REGType32v *)0x4000240)
@@ -356,6 +354,12 @@
#define reg_MI_MCD1 (*(REGType32v *)0x4100010)
#define reg_CARD_DATA (*(REGType32v *)0x4100010) //?
+#define REG_OS_TM0CNT_H_PS_SHIFT 0
+#define REG_OS_IE_T0_SHIFT 3
+
+#define REG_OS_TM0CNT_H_I_MASK 0x0040
+#define REG_OS_TM0CNT_H_E_MASK 0x0080
+
#define REG_PAD_KEYINPUT_L_SHIFT 9
#define REG_PAD_KEYINPUT_L_SIZE 1
#define REG_PAD_KEYINPUT_L_MASK 0x0200
@@ -476,4 +480,4 @@
((u32)(a) << REG_PAD_KEYCNT_A_SHIFT))
#endif
-#endif //POKEDIAMOND_REGISTERS_H
+#endif //POKEDIAMOND_ARM9_REGISTERS_H
diff --git a/arm9/lib/include/syscall.h b/arm9/lib/include/syscall.h
index 8561cabe..427134a7 100644
--- a/arm9/lib/include/syscall.h
+++ b/arm9/lib/include/syscall.h
@@ -1,6 +1,6 @@
-#ifndef NITRO_SYSCALL_H_
-#define NITRO_SYSCALL_H_
+#ifndef POKEDIAMOND_ARM9_SYSCALL_H
+#define POKEDIAMOND_ARM9_SYSCALL_H
void SVC_WaitByLoop(u32 ct);
-#endif //NITRO_SYSCALL_H_
+#endif //POKEDIAMOND_ARM9_SYSCALL_H
diff --git a/arm9/lib/include/systemWork.h b/arm9/lib/include/systemWork.h
new file mode 100644
index 00000000..b7660985
--- /dev/null
+++ b/arm9/lib/include/systemWork.h
@@ -0,0 +1,7 @@
+#ifndef POKEDIAMOND_ARM9_SYSTEMWORK_H
+#define POKEDIAMOND_ARM9_SYSTEMWORK_H
+
+#include "OS_context.h"
+#include "nitro/OS_systemWork_shared.h"
+
+#endif //POKEDIAMOND_ARM9_SYSTEMWORK_H
diff --git a/arm9/lib/src/OS_printf.c b/arm9/lib/src/OS_printf.c
index 026bc2d7..414f0db9 100644
--- a/arm9/lib/src/OS_printf.c
+++ b/arm9/lib/src/OS_printf.c
@@ -12,649 +12,6 @@ void string_put_char(struct printfStr *dest, s8 value);
void string_fill_char(struct printfStr *dest, s8 value, s32 count);
void string_put_string(struct printfStr *dest, const s8 *src, s32 count);
-
-#ifndef NONMATCHING
-// c definition is at the bottom of the file
-u64 _ll_udiv(u64 a, u64 b);
-
-ARM_FUNC asm s32 OS_VSNPrintf(s8 *buffer, s32 bufsz, const s8 *format, void *args)
-{
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x64
- mov r9, r2
- str r1, [sp, #0x54]
- str r0, [sp, #0x5c]
- str r0, [sp, #0x58]
- ldrsb r0, [r9, #0x0]
- str r1, [sp, #0x0]
- mov r11, r3
- cmp r0, #0x0
- beq _020CAD18
- mov r0, #0xa
- str r0, [sp, #0xc]
- mov r0, #0x0
- str r0, [sp, #0x4]
- mov r0, #0x20
- str r0, [sp, #0x1c]
- mov r0, #0x30
- str r0, [sp, #0x20]
- mvn r0, #0x0
- str r0, [sp, #0x8]
- mov r0, #0x57
- str r0, [sp, #0x10]
- mov r0, #0x8
- str r0, [sp, #0x14]
- mov r0, #0x37
- str r0, [sp, #0x18]
- mov r0, #0x10
- str r0, [sp, #0x24]
- mov r0, #0x1
- str r0, [sp, #0x28]
- mov r0, #0x2b
- str r0, [sp, #0x34]
- mov r0, #0x2d
- str r0, [sp, #0x30]
- mov r0, #0x2
- str r0, [sp, #0x2c]
-_020CA530:
- ldrsb r1, [r9, #0x0]
- and r0, r1, #0xff
- eor r0, r0, #0x20
- sub r0, r0, #0xa1
- cmp r0, #0x3c
- bhs _020CA56C
- add r0, sp, #0x54
- bl string_put_char
- ldrsb r1, [r9, #0x1]!
- cmp r1, #0x0
- beq _020CAD0C
- add r0, sp, #0x54
- add r9, r9, #0x1
- bl string_put_char
- b _020CAD0C
-_020CA56C:
- cmp r1, #0x25
- beq _020CA584
- add r0, sp, #0x54
- add r9, r9, #0x1
- bl string_put_char
- b _020CAD0C
-_020CA584:
- ldr r6, [sp, #0x4]
- ldr r5, [sp, #0x8]
- ldr r2, [sp, #0xc]
- ldr r0, [sp, #0x10]
- mov r10, r6
- mov r3, r9
-_020CA59C:
- ldrsb r4, [r9, #0x1]!
- cmp r4, #0x20
- bgt _020CA5B4
- cmp r4, #0x20
- beq _020CA5F4
- b _020CA60C
-_020CA5B4:
- cmp r4, #0x30
- bgt _020CA60C
- cmp r4, #0x2b
- blt _020CA60C
- cmp r4, #0x2b
- beq _020CA5E0
- cmp r4, #0x2d
- beq _020CA5FC
- cmp r4, #0x30
- beq _020CA604
- b _020CA60C
-_020CA5E0:
- ldrsb r1, [r9, #-0x1]
- cmp r1, #0x20
- bne _020CA60C
- orr r6, r6, #0x2
- b _020CA59C
-_020CA5F4:
- orr r6, r6, #0x1
- b _020CA59C
-_020CA5FC:
- orr r6, r6, #0x8
- b _020CA59C
-_020CA604:
- orr r6, r6, #0x10
- b _020CA59C
-_020CA60C:
- cmp r4, #0x2a
- bne _020CA640
- add r11, r11, #0x4
- ldr r10, [r11, #-0x4]
- add r9, r9, #0x1
- cmp r10, #0x0
- rsblt r10, r10, #0x0
- orrlt r6, r6, #0x8
- b _020CA654
-_020CA630:
- ldrsb r4, [r9], #0x1
- mov r1, #0xa
- mla r1, r10, r1, r4
- sub r10, r1, #0x30
-_020CA640:
- ldrsb r1, [r9, #0x0]
- cmp r1, #0x30
- blt _020CA654
- cmp r1, #0x39
- ble _020CA630
-_020CA654:
- ldrsb r1, [r9, #0x0]
- cmp r1, #0x2e
- bne _020CA6AC
- ldrsb r1, [r9, #0x1]!
- ldr r5, [sp, #0x4]
- cmp r1, #0x2a
- bne _020CA698
- add r11, r11, #0x4
- ldr r5, [r11, #-0x4]
- add r9, r9, #0x1
- cmp r5, #0x0
- ldrlt r5, [sp, #0x8]
- b _020CA6AC
-_020CA688:
- ldrsb r4, [r9], #0x1
- mov r1, #0xa
- mla r1, r5, r1, r4
- sub r5, r1, #0x30
-_020CA698:
- ldrsb r1, [r9, #0x0]
- cmp r1, #0x30
- blt _020CA6AC
- cmp r1, #0x39
- ble _020CA688
-_020CA6AC:
- ldrsb r1, [r9, #0x0]
- cmp r1, #0x68
- beq _020CA6C4
- cmp r1, #0x6c
- beq _020CA6DC
- b _020CA6F0
-_020CA6C4: // h
- ldrsb r1, [r9, #0x1]!
- cmp r1, #0x68
- orrne r6, r6, #0x40
- addeq r9, r9, #0x1
- orreq r6, r6, #0x100
- b _020CA6F0
-_020CA6DC: // l
- ldrsb r1, [r9, #0x1]!
- cmp r1, #0x6c
- orrne r6, r6, #0x20
- addeq r9, r9, #0x1
- orreq r6, r6, #0x80
-_020CA6F0:
- ldrsb r1, [r9, #0x0]
- cmp r1, #0x69
- bgt _020CA740
- cmp r1, #0x63
- blt _020CA720
- cmp r1, #0x63
- beq _020CA7B4
- cmp r1, #0x64
- beq _020CA96C
- cmp r1, #0x69
- beq _020CA96C
- b _020CA950
-_020CA720:
- cmp r1, #0x25
- bgt _020CA734
- cmp r1, #0x25
- beq _020CA934
- b _020CA950
-_020CA734:
- cmp r1, #0x58
- beq _020CA7A0
- b _020CA950
-_020CA740:
- cmp r1, #0x6e
- bgt _020CA754
- cmp r1, #0x6e
- beq _020CA8DC
- b _020CA950
-_020CA754:
- sub r1, r1, #0x6f
- cmp r1, #0x9
- addls pc, pc, r1, lsl #0x2
- b _020CA950
-_020CA764:
- b _020CA78C
- b _020CA7A8
- b _020CA950
- b _020CA950
- b _020CA828
- b _020CA950
- b _020CA798
- b _020CA950
- b _020CA950
- b _020CA964
-_020CA78C:
- ldr r2, [sp, #0x14]
- orr r6, r6, #0x1000
- b _020CA96C
-_020CA798:
- orr r6, r6, #0x1000
- b _020CA96C
-_020CA7A0:
- ldr r0, [sp, #0x18]
- b _020CA964
-_020CA7A8:
- orr r6, r6, #0x4
- ldr r5, [sp, #0x14]
- b _020CA964
-_020CA7B4:
- cmp r5, #0x0
- bge _020CA950
- ands r0, r6, #0x8
- add r11, r11, #0x4
- ldr r4, [r11, #-0x4]
- beq _020CA7F0
- mov r0, r4, lsl #0x18
- mov r1, r0, asr #0x18
- add r0, sp, #0x54
- bl string_put_char
- ldr r1, [sp, #0x1c]
- sub r2, r10, #0x1
- add r0, sp, #0x54
- bl string_fill_char
- b _020CA820
-_020CA7F0:
- ands r0, r6, #0x10
- ldrne r0, [sp, #0x20]
- sub r2, r10, #0x1
- ldreq r0, [sp, #0x1c]
- mov r0, r0, lsl #0x18
- mov r1, r0, asr #0x18
- add r0, sp, #0x54
- bl string_fill_char
- mov r0, r4, lsl #0x18
- mov r1, r0, asr #0x18
- add r0, sp, #0x54
- bl string_put_char
-_020CA820:
- add r9, r9, #0x1
- b _020CAD0C
-_020CA828:
- add r11, r11, #0x4
- cmp r5, #0x0
- ldr r7, [sp, #0x4]
- ldr r4, [r11, #-0x4]
- bge _020CA860
- ldrsb r0, [r4]
- cmp r0, #0x0
- beq _020CA874
-_020CA848:
- add r7, r7, #0x1
- ldrsb r0, [r4, r7]
- cmp r0, #0x0
- bne _020CA848
- b _020CA874
-_020CA85C:
- add r7, r7, #0x1
-_020CA860:
- cmp r7, r5
- bge _020CA874
- ldrsb r0, [r4, r7]
- cmp r0, #0x0
- bne _020CA85C
-_020CA874:
- ands r0, r6, #0x8
- sub r10, r10, r7
- beq _020CA8A4
- mov r1, r4
- mov r2, r7
- add r0, sp, #0x54
- bl string_put_string
- ldr r1, [sp, #0x1C]
- mov r2, r10
- add r0, sp, #0x54
- bl string_fill_char
- b _020CA8D4
-_020CA8A4:
- ands r0, r6, #0x10
- ldrne r0, [sp, #0x20]
- mov r2, r10
- ldreq r0, [sp, #0x1C]
- mov r0, r0, lsl #0x18
- mov r1, r0, asr #0x18
- add r0, sp, #0x54
- bl string_fill_char
- mov r1, r4
- mov r2, r7
- add r0, sp, #0x54
- bl string_put_string
-_020CA8D4:
- add r9, r9, #0x1
- b _020CAD0C
-_020CA8DC:
- ands r0, r6, #0x100
- ldr r1, [sp, #0x58]
- ldr r0, [sp, #0x5c]
- sub r2, r1, r0
- bne _020CA92C
- ands r0, r6, #0x40
- addne r11, r11, #0x4
- ldrne r0, [r11, #-0x4]
- strneh r2, [r0, #0x0]
- bne _020CA92C
- ands r0, r6, #0x80
- addeq r11, r11, #0x4
- ldreq r0, [r11, #-0x4]
- streq r2, [r0, #0x0]
- beq _020CA92C
- add r11, r11, #0x4
- ldr r0, [r11, #-0x4]
- mov r1, r2, asr #0x1f
- str r2, [r0, #0x0]
- str r1, [r0, #0x4]
-_020CA92C:
- add r9, r9, #0x1
- b _020CAD0C
-_020CA934:
- add r0, r3, #0x1
- cmp r0, r9
- bne _020CA950
- add r0, sp, #0x54
- add r9, r9, #0x1
- bl string_put_char
- b _020CAD0C
-_020CA950:
- add r0, sp, #0x54
- mov r1, r3
- sub r2, r9, r3
- bl string_put_string
- b _020CAD0C
-_020CA964:
- ldr r2, [sp, #0x24]
- orr r6, r6, #0x1000
-_020CA96C:
- ands r1, r6, #0x8
- bicne r6, r6, #0x10
- cmp r5, #0x0
- bicge r6, r6, #0x10
- ldrlt r5, [sp, #0x28]
- ldr r7, [sp, #0x4]
- ands r1, r6, #0x1000
- beq _020CAA20
- ands r1, r6, #0x100
- addne r11, r11, #0x4
- ldrneb r4, [r11, #-0x4]
- movne r1, #0x0
- bne _020CA9D0
- ands r1, r6, #0x40
- addne r11, r11, #0x4
- ldrneh r4, [r11, #-0x4]
- movne r1, #0x0
- bne _020CA9D0
- ands r1, r6, #0x80
- addne r11, r11, #0x8
- ldrne r1, [r11, #-0x4]
- ldrne r4, [r11, #-0x8]
- addeq r11, r11, #0x4
- ldreq r4, [r11, #-0x4]
- moveq r1, #0x0
-_020CA9D0:
- bic r6, r6, #0x3
- ands r3, r6, #0x4
- beq _020CAAD8
- cmp r2, #0x10
- bne _020CAA0C
- mov r3, #0x0
- cmp r1, r3
- cmpeq r4, r3
- beq _020CAAD8
- ldr r3, [sp, #0x20]
- ldr r7, [sp, #0x2c]
- strb r3, [sp, #0x39]
- add r3, r0, #0x21
- strb r3, [sp, #0x38]
- b _020CAAD8
-_020CAA0C:
- cmp r2, #0x8
- ldreq r3, [sp, #0x20]
- ldreq r7, [sp, #0x28]
- streqb r3, [sp, #0x38]
- b _020CAAD8
-_020CAA20:
- ands r1, r6, #0x100
- addne r11, r11, #0x4
- ldrnesb r4, [r11, #-0x4]
- movne r1, r4, asr #0x1f
- bne _020CAA64
- ands r1, r6, #0x40
- addne r11, r11, #0x4
- ldrnesh r4, [r11, #-0x4]
- movne r1, r4, asr #0x1f
- bne _020CAA64
- ands r1, r6, #0x80
- addne r11, r11, #0x8
- ldrne r4, [r11, #-0x8]
- ldrne r1, [r11, #-0x4]
- addeq r11, r11, #0x4
- ldreq r4, [r11, #-0x4]
- moveq r1, r4, asr #0x1f
-_020CAA64:
- mov r3, #0x0
- and r8, r3, #0x0
- cmp r8, r3
- and r8, r1, #0x80000000
- cmpeq r8, r3
- beq _020CAAA0
- ldr r7, [sp, #0x30]
- mvn r4, r4
- strb r7, [sp, #0x38]
- mvn r7, r1
- mov r1, #0x1
- adds r4, r4, r1
- adc r1, r7, r3
- ldr r7, [sp, #0x28]
- b _020CAAD8
-_020CAAA0:
- cmp r1, r3
- cmpeq r4, r3
- bne _020CAAB4
- cmp r5, #0x0
- beq _020CAAD8
-_020CAAB4:
- ands r3, r6, #0x2
- ldrne r3, [sp, #0x34]
- ldrne r7, [sp, #0x28]
- strneb r3, [sp, #0x38]
- bne _020CAAD8
- ands r3, r6, #0x1
- ldrne r3, [sp, #0x1c]
- ldrne r7, [sp, #0x28]
- strneb r3, [sp, #0x38]
-_020CAAD8:
- cmp r2, #0x8
- ldr r8, [sp, #0x4]
- beq _020CAAF8
- cmp r2, #0xa
- beq _020CAB40
- cmp r2, #0x10
- beq _020CABDC
- b _020CAC28
-_020CAAF8:
- mov r0, #0x0
- cmp r1, r0
- cmpeq r4, r0
- beq _020CAC28
-_020CAB08:
- and r0, r4, #0x7
- add r3, r0, #0x30
- add r0, sp, #0x3a
- strb r3, [r0, r8]
- mov r4, r4, lsr #0x3
- mov r2, #0x0
- mov r0, r1, lsr #0x3
- orr r4, r4, r1, lsl #0x1d
- cmp r0, r2
- cmpeq r4, r2
- mov r1, r0
- add r8, r8, #0x1
- bne _020CAB08
- b _020CAC28
-_020CAB40:
- mov r0, #0x0
- cmp r0, r0
- cmpeq r1, r0
- bne _020CAB8C
- cmp r4, #0x0
- beq _020CAC28
-_020CAB58:
- ldr r0, =0xCCCCCCCD
- umull r1, r0, r4, r0
- movs r0, r0, lsr #0x3
- mov r1, #0xa
- mul r1, r0, r1
- sub r1, r4, r1
- mov r4, r0
- add r1, r1, #0x30
- add r0, sp, #0x3a
- strb r1, [r0, r8]
- add r8, r8, #0x1
- bne _020CAB58
- b _020CAC28
-_020CAB8C:
- cmp r1, r0
- cmpeq r4, r0
- beq _020CAC28
-_020CAB98:
- ldr r2, [sp, #0xc]
- ldr r3, [sp, #0x4]
- mov r0, r4
- bl _ll_udiv
- mov r3, #0xa
- umull r3, r12, r0, r3
- subs r3, r4, r3
- mov r2, #0x0
- add r4, r3, #0x30
- add r3, sp, #0x3a
- strb r4, [r3, r8]
- cmp r1, r2
- cmpeq r0, r2
- mov r4, r0
- add r8, r8, #0x1
- bne _020CAB98
- b _020CAC28
-_020CABDC:
- mov r2, #0x0
- cmp r1, r2
- cmpeq r4, r2
- beq _020CAC28
-_020CABEC:
- and r3, r4, #0xf
- cmp r3, #0xa
- mov r4, r4, lsr #0x4
- addlt r3, r3, #0x30
- mov r2, r1, lsr #0x4
- orr r4, r4, r1, lsl #0x1c
- mov r1, r2
- addge r3, r3, r0
- add r2, sp, #0x3a
- strb r3, [r2, r8]
- mov r2, #0x0
- cmp r1, r2
- add r8, r8, #0x1
- cmpeq r4, r2
- bne _020CABEC
-_020CAC28:
- cmp r7, #0x0
- ble _020CAC4C
- ldrsb r0, [sp, #0x38]
- cmp r0, #0x30
- ldreq r1, [sp, #0x20]
- addeq r0, sp, #0x3a
- streqb r1, [r0, r8]
- ldreq r7, [sp, #0x4]
- addeq r8, r8, #0x1
-_020CAC4C:
- sub r5, r5, r8
- ands r0, r6, #0x10
- beq _020CAC68
- sub r0, r10, r8
- sub r0, r0, r7
- cmp r5, r0
- movlt r5, r0
-_020CAC68:
- cmp r5, #0x0
- subgt r10, r10, r5
- add r0, r7, r8
- ands r6, r6, #0x8
- sub r10, r10, r0
- bne _020CAC90
- ldr r1, [sp, #0x1c]
- add r0, sp, #0x54
- mov r2, r10
- bl string_fill_char
-_020CAC90:
- cmp r7, #0x0
- ble _020CACB8
- add r0, sp, #0x38
- add r4, r0, r7
-_020CACA0:
- ldrsb r1, [r4, #-0x1]!
- sub r7, r7, #0x1
- add r0, sp, #0x54
- bl string_put_char
-_020CACB0:
- cmp r7, #0x0
- bgt _020CACA0
-_020CACB8:
- ldr r1, [sp, #0x20]
- mov r2, r5
- add r0, sp, #0x54
- bl string_fill_char
- cmp r8, #0x0
- ble _020CACF0
- add r0, sp, #0x3A
- add r4, r0, r8
-_020CACD8:
- ldrsb r1, [r4, #-0x1]!
- sub r8, r8, #0x1
- add r0, sp, #0x54
- bl string_put_char
- cmp r8, #0x0
- bgt _020CACD8
-_020CACF0:
- cmp r6, #0x0
- beq _020CAD08
- ldr r1, [sp, #0x1C]
- mov r2, r10
- add r0, sp, #0x54
- bl string_fill_char
-_020CAD08:
- add r9, r9, #0x1
-_020CAD0C:
- ldrsb r0, [r9, #0x0]
- cmp r0, #0x0
- bne _020CA530
-_020CAD18:
- ldr r0, [sp, #0x54]
- cmp r0, #0x0
- ldrne r0, [sp, #0x58]
- movne r1, #0x0
- strneb r1, [r0, #0x0]
- bne _020CAD48
- ldr r0, [sp, #0x0]
- cmp r0, #0x0
- ldrne r1, [sp, #0x5c]
- movne r2, #0x0
- addne r0, r1, r0
- strneb r2, [r0, #-0x1]
-_020CAD48:
- ldr r1, [sp, #0x58]
- ldr r0, [sp, #0x5c]
- sub r0, r1, r0
- add sp, sp, #0x64
- ldmia sp!, {r4-r11,lr}
- bx lr
-}
-#endif
-
ARM_FUNC void string_put_char(struct printfStr *dest, s8 value)
{
if (dest->spaceLeft != 0)
@@ -720,8 +77,6 @@ ARM_FUNC s32 OS_SNPrintf(s8 *buffer, s32 bufsz, const s8 *format, ...)
return OS_VSNPrintf(buffer, bufsz, format, args);
}
-#ifdef NONMATCHING
-
#define va_arg(list, ty) *(ty *)((u32 *)(list = (void *)((u32 *)(list) + 1)) - 1)
#define va_arg_64(list, sgn) *((sgn##64 *)(list = (void *)((sgn##64 *)(list) + 1)) - 1)
@@ -944,8 +299,9 @@ ARM_FUNC s32 OS_VSNPrintf(s8 *buffer, s32 bufsz, const s8 *format, void *args)
*va_arg(args, s32 *) = count;
}
}
- ++format;
}
+ ++s;
+ break;
case '%':
if (p_start + 1 != s)
goto put_invalid;
@@ -970,13 +326,13 @@ ARM_FUNC s32 OS_VSNPrintf(s8 *buffer, s32 bufsz, const s8 *format, void *args)
{
flag &= ~zero;
}
- if (precision >= 0)
+ if (precision < 0)
{
- flag &= ~zero;
+ precision = 1;
}
else
{
- precision = 1;
+ flag &= ~zero;
}
if (flag & usigned)
{
@@ -1003,18 +359,15 @@ ARM_FUNC s32 OS_VSNPrintf(s8 *buffer, s32 bufsz, const s8 *format, void *args)
{
if (value != 0)
{
- prefix[0] = (s8)(hex + (10 - 'x' - 'a'));
+ prefix[0] = (s8)(hex + (10 + 'x' - 'a'));
prefix[1] = '0';
n_prefix = 2;
}
}
- else
+ else if (radix == 8)
{
- if (radix == 8)
- {
- prefix[0] = '0';
- n_prefix = 1;
- }
+ prefix[0] = '0';
+ n_prefix = 1;
}
}
}
@@ -1044,100 +397,96 @@ ARM_FUNC s32 OS_VSNPrintf(s8 *buffer, s32 bufsz, const s8 *format, void *args)
}
}
}
- n_buf = 0;
- switch (radix) {
- case 8:
- while (value != 0) {
- s32 octDig = (s32) (value & 0x7);
- value >>= 3;
- buf[n_buf++] = (s8) (octDig + '0');
- }
- break;
- case 10:
- if (value >> 32 == 0) {
- u32 v = (u32) value;
- while (v) {
- u32 div10 = v / 10;
- s32 dig = (s32) (v - (div10 * 10));
- v = div10;
- buf[n_buf++] = (s8) (dig + '0');
- }
- } else {
- while (value) {
- u64 div10 = value / 10;
- s32 dig = (s32) (value - (div10 * 10));
- value = div10;
- buf[n_buf++] = (s8) (dig + '0');
- }
+ }
+ n_buf = 0;
+ switch (radix) {
+ case 8:
+ while (value != 0) {
+ s32 octDig = (s32) (value & 0x7);
+ value >>= 3;
+ buf[n_buf++] = (s8) (octDig + '0');
+ }
+ break;
+ case 10:
+ if ((value >> 32) == 0) {
+ u32 v = (u32) value;
+ while (v) {
+ u32 div10 = v / 10;
+ s32 dig = (s32) (v - (div10 * 10));
+ v = div10;
+ buf[n_buf++] = (s8) (dig + '0');
}
- break;
- case 16:
- while (value != 0) {
- s32 hexDig = (s32) (value & 0xf);
- value >>= 4;
- buf[n_buf++] = (s8) ((hexDig < 10) ? (hexDig + '0') : (hexDig + hex));
+ } else {
+ while (value) {
+ u64 div10 = value / 10;
+ s32 dig = (s32) (value - (div10 * 10));
+ value = div10;
+ buf[n_buf++] = (s8) (dig + '0');
}
- break;
- }
- if (n_prefix > 0) {
- if (prefix[0] == '0') {
- n_prefix = 0;
- buf[n_buf++] = '0';
}
- }
+ break;
+ case 16:
+ while (value != 0) {
+ s32 hexDig = (s32) (value & 0xf);
+ value >>= 4;
+ buf[n_buf++] = (s8) ((hexDig < 10) ? (hexDig + '0') : (hexDig + hex));
+ }
+ break;
+ }
+ if (n_prefix > 0 && prefix[0] == '0') {
+ n_prefix = 0;
+ buf[n_buf++] = '0';
}
- goto put_to_stream;
+ }
+ goto put_to_stream;
- put_to_stream:
+ put_to_stream:
+ {
+ s32 n_pad = (s32)(precision - n_buf);
+ if (flag & zero)
+ {
+ if (n_pad < width - n_buf - n_prefix)
{
- s32 n_pad = (s32)(precision - n_buf);
- if (flag & zero)
- {
- if (n_pad < width - n_buf - n_prefix)
- {
- n_pad = (s32)(width - n_buf - n_prefix);
- }
- }
- if (n_pad > 0)
- {
- width -= n_pad;
- }
-
- width -= n_prefix + n_buf;
- if (!(flag & minus))
- {
- string_fill_char(&str, ' ', width);
- }
- while (n_prefix > 0)
- {
- string_put_char(&str, prefix[--n_prefix]);
- }
- string_fill_char(&str, '0', n_pad);
- while (n_buf > 0)
- {
- string_put_char(&str, buf[--n_buf]);
- }
- if (flag & minus)
- {
- string_fill_char(&str, ' ', width);
- }
- ++s;
+ n_pad = (s32)(width - n_buf - n_prefix);
}
}
- break;
+ if (n_pad > 0)
+ {
+ width -= n_pad;
+ }
+
+ width -= n_prefix + n_buf;
+ if (!(flag & minus))
+ {
+ string_fill_char(&str, ' ', width);
+ }
+ while (n_prefix > 0)
+ {
+ string_put_char(&str, prefix[--n_prefix]);
+ }
+ string_fill_char(&str, '0', n_pad);
+ while (n_buf > 0)
+ {
+ string_put_char(&str, buf[--n_buf]);
+ }
+ if (flag & minus)
+ {
+ string_fill_char(&str, ' ', width);
+ }
+ ++s;
+ }
+ break;
}
}
}
- if (str.spaceLeft > 0)
+ if (str.spaceLeft != 0)
{
*str.stringEnd = '\0';
}
- else if (bufsz > 0)
+ else if (bufsz != 0)
{
str.stringStart[bufsz - 1] = '\0';
}
return str.stringEnd - str.stringStart;
}
-
-#endif
diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c
index f22b0e3c..95238f46 100644
--- a/arm9/lib/src/OS_reset.c
+++ b/arm9/lib/src/OS_reset.c
@@ -4,6 +4,7 @@
#include "OS_terminate_proc.h"
#include "OS_interrupt.h"
#include "OS_system.h"
+#include "OS_spinLock.h"
#include "sections.h"
static u16 OSi_IsInitReset = 0;
diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c
index 5050a7bd..c0398be9 100644
--- a/arm9/lib/src/OS_spinLock.c
+++ b/arm9/lib/src/OS_spinLock.c
@@ -21,7 +21,7 @@ ARM_FUNC void OS_InitLock(void)
}
isInitialized = TRUE;
- OSLockWord* lockp = (OSLockWord *)0x027FFFF0;
+ OSLockWord* lockp = (OSLockWord *)HW_INIT_LOCK_BUF;
lockp->lockFlag = 0;
@@ -45,7 +45,7 @@ ARM_FUNC void OS_InitLock(void)
(void)OS_TryLockByWord(0x7f, lockp, NULL);
}
-ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), //should be static
+ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void),
BOOL disableFiq)
{
s32 lastLockFlag;
diff --git a/arm9/lib/src/OS_tick.c b/arm9/lib/src/OS_tick.c
new file mode 100644
index 00000000..f5f2df30
--- /dev/null
+++ b/arm9/lib/src/OS_tick.c
@@ -0,0 +1,70 @@
+#include "function_target.h"
+#include "OS_tick.h"
+#include "OS_interrupt.h"
+#include "OS_timer.h"
+#include "OS_system.h"
+
+static u16 OSi_UseTick = FALSE;
+vu64 OSi_TickCounter;
+BOOL OSi_NeedResetTimer = FALSE;
+
+extern void OSi_SetTimerReserved(u32 param1);
+
+ARM_FUNC void OS_InitTick(void)
+{
+ if (OSi_UseTick)
+ {
+ return;
+ }
+ OSi_UseTick = 1;
+ OSi_SetTimerReserved(0);
+ OSi_TickCounter = 0;
+ reg_OS_TM0CNT_H = 0;
+ reg_OS_TM0CNT_L = 0;
+ reg_OS_TM0CNT_H = 0xc1;
+ OS_SetIrqFunction(8, OSi_CountUpTick);
+ (void)OS_EnableIrqMask(8);
+ OSi_NeedResetTimer = FALSE;
+}
+
+ARM_FUNC BOOL OS_IsTickAvailable(void)
+{
+ return OSi_UseTick;
+}
+
+ARM_FUNC static void OSi_CountUpTick(void)
+{
+ OSi_TickCounter++;
+
+ if (OSi_NeedResetTimer)
+ {
+ OS_SetTimerControl(OS_TIMER_0, 0);
+ OS_SetTimerCount(OS_TIMER_0, 0);
+ OS_SetTimerControl(OS_TIMER_0, OSi_TICK_TIMERCONTROL);
+
+ OSi_NeedResetTimer = FALSE;
+ }
+
+ OSi_EnterTimerCallback(OS_TIMER_0, (void (*)(void *))OSi_CountUpTick, 0);
+}
+
+ARM_FUNC OSTick OS_GetTick(void)
+{
+ OSIntrMode prev = OS_DisableInterrupts();
+ vu16 countL = *(REGType16 *)((u32)&reg_OS_TM0CNT_L + OS_TIMER_0 * 4);
+ vu64 countH = OSi_TickCounter & 0xffffffffffffULL;
+
+ if (reg_OS_IF & OS_IE_TIMER0 && !(countL & 0x8000))
+ {
+ countH++;
+ }
+
+ (void)OS_RestoreInterrupts(prev);
+
+ return (countH << 16) | countL;
+}
+
+ARM_FUNC u16 OS_GetTickLo(void)
+{
+ return reg_OS_TM0CNT_L;
+}
diff --git a/arm9/lib/syscall/_svc_mw.s b/arm9/lib/syscall/_svc_mw.s
index c1e36b4b..d449ee58 100644
--- a/arm9/lib/syscall/_svc_mw.s
+++ b/arm9/lib/syscall/_svc_mw.s
@@ -7,115 +7,115 @@
; Secure area
.space 0x800
- non_word_aligned_thumb_func_start SVC_SoftReset
+ .global SVC_SoftReset
+ .thumb
SVC_SoftReset:
swi 0
bx lr
- thumb_func_end SVC_SoftReset
- non_word_aligned_thumb_func_start SVC_WaitByLoop
+ .global SVC_WaitByLoop
+ .thumb
SVC_WaitByLoop:
swi 3
bx lr
- thumb_func_end SVC_WaitByLoop
- non_word_aligned_thumb_func_start SVC_WaitIntr
+ .global SVC_WaitIntr
+ .thumb
SVC_WaitIntr:
mov r2, #0
swi 4
bx lr
- thumb_func_end SVC_WaitIntr
- non_word_aligned_thumb_func_start SVC_WaitVBlankIntr
+ .global SVC_WaitVBlankIntr
+ .thumb
SVC_WaitVBlankIntr:
mov r2, #0
swi 5
bx lr
- thumb_func_end SVC_WaitVBlankIntr
- non_word_aligned_thumb_func_start SVC_Halt
+ .global SVC_Halt
+ .thumb
SVC_Halt:
swi 6
bx lr
- thumb_func_end SVC_Halt
- non_word_aligned_thumb_func_start SVC_Div
+ .global SVC_Div
+ .thumb
SVC_Div:
swi 9
bx lr
- thumb_func_end SVC_Div
- non_word_aligned_thumb_func_start SVC_DimRem
+ .global SVC_DivRem
+ .thumb
SVC_DivRem:
swi 9
add r0, r1, #0
bx lr
- thumb_func_end SVC_DivRem
- non_word_aligned_thumb_func_start SVC_CpuSet
+ .global SVC_CpuSet
+ .thumb
SVC_CpuSet:
swi 11
bx lr
- thumb_func_end SVC_CpuSet
- non_word_aligned_thumb_func_start SVC_CpuFastSet
-SVC_CpuFastSet:
+ .global SVC_CpuSetFast
+ .thumb
+SVC_CpuSetFast:
swi 12
bx lr
- thumb_func_end SVC_CpuFastSet
- non_word_aligned_thumb_func_start SVC_Sqrt
+ .global SVC_Sqrt
+ .thumb
SVC_Sqrt:
swi 13
bx lr
- thumb_func_end SVC_Sqrt
- non_word_aligned_thumb_func_start SVC_GetCRC16
+ .global SVC_GetCRC16
+ .thumb
SVC_GetCRC16:
swi 14
bx lr
- thumb_func_end SVC_GetCRC16
- non_word_aligned_thumb_func_start IsMemExpanded
-IsMemExpanded:
+ .global IsMmemExpanded
+ .thumb
+IsMmemExpanded:
swi 15
bx lr
- thumb_func_end IsMemExpanded
- non_word_aligned_thumb_func_start SVC_UnpackBits
+ .global SVC_UnpackBits
+ .thumb
SVC_UnpackBits:
swi 16
bx lr
- thumb_func_end SVC_UnpackBits
- non_word_aligned_thumb_func_start SVC_UncompressLZ8
+ .global SVC_UncompressLZ8
+ .thumb
SVC_UncompressLZ8:
swi 17
bx lr
- thumb_func_end SVC_UncompressLZ8
- non_word_aligned_thumb_func_start SVC_UncompressLZ16FromDevice
+ .global SVC_UncompressLZ16FromDevice
+ .thumb
SVC_UncompressLZ16FromDevice:
swi 18
bx lr
- thumb_func_end SVC_UncompressLZ16FromDevice
- non_word_aligned_thumb_func_start SVC_UncompressHuffmanFromDevice
+ .global SVC_UncompressHuffmanFromDevice
+ .thumb
SVC_UncompressHuffmanFromDevice:
swi 19
bx lr
- thumb_func_end SVC_UncompressHuffmanFromDevice
- non_word_aligned_thumb_func_start SVC_UncompressRL8
+ .global SVC_UncompressRL8
+ .thumb
SVC_UncompressRL8:
swi 20
bx lr
- thumb_func_end SVC_UncompressRL8
- non_word_aligned_thumb_func_start SVC_UncompressRL16FromDevice
+ .global SVC_UncompressRL16FromDevice
+ .thumb
SVC_UncompressRL16FromDevice:
swi 21
bx lr
- thumb_func_end SVC_UncompressRL16FromDevice
.balign 4, 0 ; Don't pad with nop