diff options
| -rw-r--r-- | asm/OS_arm9.s | 216 | ||||
| -rw-r--r-- | asm/SDK_AUTOLOAD_LIST.s | 20 | ||||
| -rw-r--r-- | asm/arm7_rom.s | 83 | ||||
| -rw-r--r-- | asm/crt0.s | 5 | ||||
| -rw-r--r-- | asm/rom2_2.s | 28 | ||||
| -rw-r--r-- | global.inc | 14 | ||||
| -rw-r--r-- | pokediamond.lcf | 29 | ||||
| -rw-r--r-- | undefined_syms.txt | 14 | 
8 files changed, 366 insertions, 43 deletions
| diff --git a/asm/OS_arm9.s b/asm/OS_arm9.s new file mode 100644 index 00000000..f7cbb69f --- /dev/null +++ b/asm/OS_arm9.s @@ -0,0 +1,216 @@ +	.include "asm/macros.inc" +	.include "global.inc" +	.section .text + +	.section .itcm +	; Used in autoload +	arm_func_start OS_IrqHandler +OS_IrqHandler: +	stmfd sp!, {lr} +	mov ip, #0x04000000 +	add ip, ip, #0x210 +	ldr r1, [ip, #-8] +	cmp r1, #0 +	ldmeqfd sp!, {pc} +	ldmia ip, {r1, r2} +	ands r1, r1, r2 +	ldmeqfd sp!, {pc} +	mov r3, #0x80000000 +_02106FC8: +	clz r0, r1 +	bics r1, r1, r3, lsr r0 +	bne _02106FC8 +	mov r1, r3, lsr r0 +	str r1, [ip, #0x4] +	rsbs r0, r0, #0x1f +	ldr r1, _02106FF0 ; =0x027E0000 +	ldr r0, [r1, r0, lsl #2] +	ldr lr, _02106FF4 ; =0x01FF8058 +	bx r0 +_02106FF0: .word OS_IRQTable +_02106FF4: .word OS_IrqHandler_ThreadSwitch + +	arm_func_start OS_IrqHandler_ThreadSwitch +OS_IrqHandler_ThreadSwitch: ; +	ldr ip, _02107144 +	mov r3, #0x0 +	ldr ip, [ip] +	mov r2, #0x1 +	cmp ip, #0x0 +	beq _02107048 +_02107010: +	str r2, [ip, #0x64] +	str r3, [ip, #0x78] +	str r3, [ip, #0x7c] +	ldr r0, [ip, #0x80] +	str r3, [ip, #0x80] +	mov ip, r0 +	cmp ip, #0x0 +	bne _02107010 +	ldr ip, _02107144 +	str r3, [ip] +	str r3, [ip, #0x4] +	ldr ip, _02107148 +	mov r1, #0x1 +	strh r1, [ip] +_02107048: +	ldr ip, _02107148 +	ldrh r1, [ip] +	cmp r1, #0x0 +	ldreq pc, [sp], #0x4 +	mov r1, #0x0 +	strh r1, [ip] +	mov r3, #0xd2 +	msr CPSR_c, r3 +	add r2, ip, #0x8 +	ldr r1, [r2] +_02107070: +	cmp r1, #0x0 +	ldrneh r0, [r1, #0x64] +	cmpne r0, #0x1 +	ldrne r1, [r1, #0x68] +	bne _02107070 +	cmp r1, #0x0 +	bne _02107098 +_0210708C: +	mov r3, #0x92 +	msr CPSR_c, r3 +	ldr pc, [sp], #0x4 +_02107098: +	ldr r0, [ip, #0x4] +	cmp r1, r0 +	beq _0210708C +	ldr r3, [ip, #0xC] +	cmp r3, #0x0 +	beq _021070C0 +	stmdb sp!, {r0, r1, ip} +	mov lr, pc +	bx r3 +	ldmia sp!, {r0, r1, ip} +_021070C0: +	str r1, [ip, #0x4] +	mrs r2, SPSR +	str r2, [r0, #0x0]! +	stmdb sp!, {r0, r1} +	add r0, r0, #0x0 +	add r0, r0, #0x48 +	ldr r1, _0210714C +	blx r1 +	ldmia sp!, {r0, r1} +	ldmib sp!, {r2, r3} +	stmib r0!, {r2, r3} +	ldmib sp!, {r2, r3, ip, lr} +	stmib r0!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ +	stmib r0!, {lr} +	mov r3, #0xd3 +	msr CPSR_c, r3 +	stmib r0!, {sp} +	stmfd sp!, {r1} +	add r0, r1, #0x0 +	add r0, r0, #0x48 +	ldr r1, _02107150 +	blx r1 +	ldmfd sp!, {r1} +	ldr sp, [r1, #0x44] +	mov r3, #0xd2 +	msr CPSR_c, r3 +	ldr r2, [r1, #0x0]! +	msr SPSR_fc, r2 +	ldr lr, [r1, #0x40] +	ldmib r1!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^ +	nop +	stmda sp!, {r0, r1, r2, r3, ip, lr} +	ldmfd sp!, {pc} +_02107144: .word OSi_IrqThreadQueue +_02107148: .word OSi_ThreadInfo +_0210714C: .word CP_SaveContext +_02107150: .word CP_RestoreContext + +	.section .itcm +	arm_func_start OSi_DoBoot +OSi_DoBoot: ; 02107154 +	mov ip, #0x04000000 +	str ip, [ip, #0x208] +	ldr r1, _02107200 +	add r1, r1, #0x3fc0 +	add r1, r1, #0x3c +	mov r0, #0x0 +	str r0, [r1] +	ldr r1, _02107204 +_02107174: +	ldrh r0, [r1] +	and r0, r0, #0xf +	cmp r0, #0x1 +	bne _02107174 +	mov r0, #0x100 +	strh r0, [r1] +	mov r0, #0x0 +	ldr r3, _02107208 +	ldr r4, [r3] +	ldr r1, _0210720C +	mov r2, #0x80 +	bl OSi_CpuClear32 +	str r4, [r3] +	ldr r1, _02107210 +	mov r2, #0x18 +	bl OSi_CpuClear32 +	ldr r1, _02107214 +	strh r0, [r1] +	ldr r1, _02107218 +	mov r2, #0x64 +	bl OSi_CpuClear32 +	ldr r1, _02107204 +_021071CC: +	ldrh r0, [r1] +	and r0, r0, #0xf +	cmp r0, #0x1 +	beq _021071CC +	mov r0, #0x0 +	strh r0, [r1] +	ldr r3, _0210721C +	ldr ip, [r3, #0x24] +	mov lr, ip +	ldr fp, _02107210 +	ldmia fp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl} +	mov fp, #0x0 +	bx ip +_02107200: .word SDK_AUTOLOAD_DTCM_START +_02107204: .word 0x04000180 +_02107208: .word 0x027FFD9C +_0210720C: .word 0x027FFD80 +_02107210: .word 0x027FFF80 +_02107214: .word 0x027FFF98 +_02107218: .word 0x027FFF9C +_0210721C: .word 0x027FFE00 + +	arm_func_start OSi_CpuClear32 +OSi_CpuClear32: +	.incbin "baserom.nds", 0x10B220, 0x480 + +	.section .dtcm +	.global OS_IRQTable +OS_IRQTable: ; 10b6a0 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OSi_IrqTimer0 ; 020c9cbc +	.word OSi_IrqTimer1 ; 020c9cac +	.word OSi_IrqTimer2 ; 020c9c9c +	.word OSi_IrqTimer3 ; 020c9c8c +	.word OS_IrqDummy ; 020c9da8 +	.word OSi_IrqDma0 ; 020c9cfc +	.word OSi_IrqDma1 ; 020c9cec +	.word OSi_IrqDma2 ; 020c9cdc +	.word OSi_IrqDma3 ; 020c9ccc +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.word OS_IrqDummy ; 020c9da8 +	.balign 16, 0 +OSi_IrqThreadQueue: diff --git a/asm/SDK_AUTOLOAD_LIST.s b/asm/SDK_AUTOLOAD_LIST.s new file mode 100644 index 00000000..8043d616 --- /dev/null +++ b/asm/SDK_AUTOLOAD_LIST.s @@ -0,0 +1,20 @@ +	.include "asm/macros.inc" +	.section .data + +	.global SDK_AUTOLOAD_LIST +SDK_AUTOLOAD_LIST: ; 0x02107700 +	.word 0x01FF8000 +	.word 0x00000700 +	.word 0x00000000 + +	.word 0x027e0000 +	.word 0x00000060 +	.word 0x00000020 + +	.word 0x02400000 +	.word 0x00000000 +	.word 0x00000000 + +	.global SDK_AUTOLOAD_LIST_END +SDK_AUTOLOAD_LIST_END: + diff --git a/asm/arm7_rom.s b/asm/arm7_rom.s index a18e8565..9dcd3224 100644 --- a/asm/arm7_rom.s +++ b/asm/arm7_rom.s @@ -61,7 +61,7 @@ _023800a4:  	ldr	r1, _23800f8  	ldr	lr, _23800fc  	bx	r1 -_23800cc:	.word UNK_23801B0 +_23800cc:	.word FUN_023801B0  _23800d0:	.word 0x0380ff00  _23800d4:	.word 0x0380ffc0  _23800d8:	.word 0x0380ff80 @@ -129,17 +129,84 @@ _0238018c:  _2380194:	.word 0x027ffffa  _2380198:  	.word UNK_23A92F8 -	.word UNK_23A92FC -	.word UNK_23801B0 -	.word UNK_23801B0 -	.word UNK_23801B0 +	.word UNK_23A931C +	.word FUN_023801B0 +	.word FUN_023801B0 +	.word FUN_023801B0  	.word 0x00000000  	arm_func_end FUN_238015C -UNK_23801B0: -	.incbin "baserom.nds", 0x30D1B0, 0x29148 +	arm_func_start FUN_023801B0 +FUN_023801B0: +	.incbin "baserom.nds", 0x30D1B0, 0x91B0 + +	thumb_func_start SVC_SoftReset +SVC_SoftReset: ; 0x02389360 +	swi 0 +	bx lr + +	thumb_func_start SVC_WaitByLoop +SVC_WaitByLoop: ; 0x02389364 +	swi 3 +	bx lr + +	thumb_func_start SVC_WaitIntr +SVC_WaitIntr: ; 0x02389368 +	ldr r2, =0x04000000 +	mov ip, r2 +	mov r2, #0x0 +	swi 4 +	bx lr +	.pool + +	thumb_func_start SVC_WaitVBlankIntr +SVC_WaitVBlankIntr: +	mov r2, #0x0 +	swi 5 +	bx lr + +	non_word_aligned_thumb_func_start SVC_Halt +SVC_Halt: +	swi 6 +	bx lr + +	non_word_aligned_thumb_func_start SVC_Stop +SVC_Stop: +	swi 7 +	bx lr + +	non_word_aligned_thumb_func_start SVC_SoundBias +SVC_SoundBias: +	swi 8 +	bx lr + +	non_word_aligned_thumb_func_start SVC_SoundBiasSet +SVC_SoundBiasSet: +	add r1, r0, #0x0 +	mov r0, #0x1 +	swi 8 +	bx lr + +	non_word_aligned_thumb_func_start SVC_SoundBiasReset +SVC_SoundBiasReset: +	add r1, r0, #0x0 +	mov r0, #0x0 +	swi 8 +	bx lr + +	non_word_aligned_thumb_func_start SVC_Div +SVC_Div: +	swi 9 +	bx lr + +	non_word_aligned_thumb_func_start SVC_DivRem +SVC_DivRem: +	swi 9 +	add r0, r1, #0x0 +	bx lr +	.incbin "baserom.nds", 0x3163a4, 0x1ff54  UNK_23A92F8:  	.incbin "baserom.nds", 0x3362F8, 0x24 -UNK_23A92FC: +UNK_23A931C: @@ -264,7 +264,10 @@ _start_ModuleParams:  	.word SDK_STATIC_BSS_END  	.word 0x00000000 -	.byte 0x31, 0x75, 0x02, 0x03, 0x21, 0x06, 0xC0, 0xDE, 0xDE, 0xC0, 0x06, 0x21 +	.ascii "1u" ; 31 75 +	.byte 0x02, 0x03 +	.word 0xdec00621 +	.byte 0xde, 0xc0, 0x06, 0x21  	# strings  	.balign 4 diff --git a/asm/rom2_2.s b/asm/rom2_2.s index 0682a6b0..d5055773 100644 --- a/asm/rom2_2.s +++ b/asm/rom2_2.s @@ -732,31 +732,3 @@ gScriptCmdTable: ; 0x020F355C      .word FUN_0203AFA4  .incbin "baserom.nds",  0xF80A0, 0x12F00 - -	; Used in autoload -	.global SDK_AUTOLOAD_START -	.global SDK_STATIC_BSS_START -SDK_AUTOLOAD_START: -SDK_STATIC_BSS_START: ; 0x02106FA0 -.incbin "baserom.nds", 0x10AFA0, 0x700 - -	.global UNK_021076A0 -UNK_021076A0: -.incbin "baserom.nds", 0x10B6A0, 0x60 - -	.global SDK_AUTOLOAD_LIST -SDK_AUTOLOAD_LIST: ; 0x02107700 -	.word 0x01FF8000 -	.word 0x00000700 -	.word 0x00000000 - -	.word 0x027e0000 -	.word 0x00000060 -	.word 0x00000020 - -	.word 0x02400000 -	.word 0x00000000 -	.word 0x00000000 - -	.global SDK_AUTOLOAD_LIST_END -SDK_AUTOLOAD_LIST_END: @@ -3302,3 +3302,17 @@  .extern SDK_STATIC_BSS_START
  .extern SDK_STATIC_BSS_END
  .extern OS_IrqHandler
 +.extern OS_IRQTable
 +.extern OSi_IrqThreadQueue
 +.extern OSi_ThreadInfo
 +.extern CP_SaveContext
 +.extern CP_RestoreContext
 +.extern OS_IrqDummy
 +.extern OSi_IrqDma0
 +.extern OSi_IrqDma1
 +.extern OSi_IrqDma2
 +.extern OSi_IrqDma3
 +.extern OSi_IrqTimer0
 +.extern OSi_IrqTimer1
 +.extern OSi_IrqTimer2
 +.extern OSi_IrqTimer3
 diff --git a/pokediamond.lcf b/pokediamond.lcf index 19b80331..0f32038f 100644 --- a/pokediamond.lcf +++ b/pokediamond.lcf @@ -1,8 +1,11 @@  /* TEST */  MEMORY {      header (RWX) : ORIGIN=0, LENGTH=0 -    arm9 (RWX) : ORIGIN=0x2000000, LENGTH=0 -    unk_10b724 (RWX) : ORIGIN=0, LENGTH=0 +    arm9.text (RWX) : ORIGIN=0x02000000, LENGTH=0 +    arm9.data (RWX) : ORIGIN=0x020EC710, LENGTH=0 +    arm9.itcm (RWX) : ORIGIN=0x01FF8000, LENGTH=0 +    arm9.dtcm (RWX) : ORIGIN=0x027E0000, LENGTH=0 +    arm9.autoload (RWX) : ORIGIN=0x02107700, LENGTH=0      arm9overlay (RWX) : ORIGIN=0, LENGTH=0      arm7 (RWX) : ORIGIN=0x2380000, LENGTH=0      filenametable (RWX) : ORIGIN=0, LENGTH=0 @@ -388,6 +391,7 @@ SECTIONS {          scrcmd.o (.text)          unk_02046030.o (.text)          rom1.5.o (.text) +        OS_arm9.o (.text)          unk_020C9C0C.o (.text)          PM_arm9.o (.text)          RTC_arm9.o (.text) @@ -396,14 +400,29 @@ SECTIONS {          CTRDG_arm9.o (.text)          MATH_arm9.o (.text)          STD_arm9.o (.text) +	} > arm9.text +	.arm9.data : AT (0xF0710) {          rom2.o (.data)          string_util.o (.data)          rom2_2.o (.data) -    } > arm9 +	} > arm9.data -    .unk_10b724 : AT (0x10B724) { +	SDK_AUTOLOAD_START = .; +	SDK_STATIC_BSS_START = .; + +	.arm9.itcm : AT (0x10AFA0) { +        OS_arm9.o (.itcm) +    } > arm9.itcm + +    .arm9.dtcm : AT (0x10B6A0) { +    	SDK_AUTOLOAD_DTCM_START = .; +    	OS_arm9.o (.dtcm) +    } > arm9.dtcm + +    .arm9.autoload : AT (0x10B700) { +		SDK_AUTOLOAD_LIST.o (.data)          unk_10b724.o (.text) -    } > unk_10b724 +    } > arm9.autoload      .arm9overlay : AT (0x10B800) {          arm9overlay.o (.text) diff --git a/undefined_syms.txt b/undefined_syms.txt index 9282ff4a..f707c199 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -1,6 +1,5 @@  CONST_34 = 0x00000034;  CONST_3F = 0x0000003F; -OS_IrqHandler = 0x01FF8000;  FUN_01FF84A4 = 0x01FF84A4;  FUN_01FF84E4 = 0x01FF84E4;  FUN_01FF8544 = 0x01FF8544; @@ -734,6 +733,19 @@ FUN_02252534 = 0x02252534;  FUN_02252538 = 0x02252538;  FUN_022567E0 = 0x022567E0;  SDK_AUTOLOAD_DTCM_START = 0x027E0000; +OSi_IrqThreadQueue = 0x027E0060; +OSi_ThreadInfo = 0x021D3498; +CP_SaveContext = 0x020D3648; +CP_RestoreContext = 0x020D3688;  SDK_STATIC_BSS_END = 0x021D74E0;  gUnk027FFC20 = 0x027FFC20;  FUN_02000B60 = 0x02000B60; +OS_IrqDummy = 0x020c9da8; +OSi_IrqDma0 = 0x020c9cfc; +OSi_IrqDma1 = 0x020c9cec; +OSi_IrqDma2 = 0x020c9cdc; +OSi_IrqDma3 = 0x020c9ccc; +OSi_IrqTimer0 = 0x020c9cbc; +OSi_IrqTimer1 = 0x020c9cac; +OSi_IrqTimer2 = 0x020c9c9c; +OSi_IrqTimer3 = 0x020c9c8c; | 
