diff options
author | Egor Ananyin <ananinegor@gmail.com> | 2020-06-20 09:18:43 +0300 |
---|---|---|
committer | Egor Ananyin <ananinegor@gmail.com> | 2020-06-20 09:18:43 +0300 |
commit | abd2d1e16494867989e710e5235c6425fa4e8c34 (patch) | |
tree | 7eff3e1db566801104a8fc2672bbe57e06f7009e /arm9/lib | |
parent | 70556fc300ba85dad248d20b3c79c415e2ef88e5 (diff) | |
parent | 12c17948602bf14535c91c530f214b99863e038e (diff) |
conflicts
Diffstat (limited to 'arm9/lib')
-rw-r--r-- | arm9/lib/include/MI_dma.h | 8 | ||||
-rw-r--r-- | arm9/lib/include/MI_memory.h | 2 | ||||
-rw-r--r-- | arm9/lib/include/OS_alarm.h | 23 | ||||
-rw-r--r-- | arm9/lib/include/OS_init.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_interrupt.h | 11 | ||||
-rw-r--r-- | arm9/lib/include/OS_mutex.h | 16 | ||||
-rw-r--r-- | arm9/lib/include/OS_spinLock.h | 13 | ||||
-rw-r--r-- | arm9/lib/include/OS_terminate_proc.h | 10 | ||||
-rw-r--r-- | arm9/lib/include/OS_thread.h | 117 | ||||
-rw-r--r-- | arm9/lib/include/OS_tick.h | 18 | ||||
-rw-r--r-- | arm9/lib/include/OS_timer.h | 32 | ||||
-rw-r--r-- | arm9/lib/include/consts.h | 9 | ||||
-rw-r--r-- | arm9/lib/include/fx.h | 5 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 52 | ||||
-rw-r--r-- | arm9/lib/include/registers.h | 16 | ||||
-rw-r--r-- | arm9/lib/include/syscall.h | 6 | ||||
-rw-r--r-- | arm9/lib/include/systemWork.h | 7 | ||||
-rw-r--r-- | arm9/lib/src/OS_printf.c | 815 | ||||
-rw-r--r-- | arm9/lib/src/OS_reset.c | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_spinLock.c | 4 | ||||
-rw-r--r-- | arm9/lib/src/OS_tick.c | 70 | ||||
-rw-r--r-- | arm9/lib/syscall/_svc_mw.s | 76 |
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)®_OS_TM0CNT_L + id * 4)) = count; +} + +static inline void OS_SetTimerControl(OSTimer id, u16 control) +{ + *((REGType16 *)((u32)®_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)®_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 |