diff --git a/dka-crtls/ds_arm7.ld b/dka-crtls/ds_arm7.ld index 0ba5a99..62bf254 100644 --- a/dka-crtls/ds_arm7.ld +++ b/dka-crtls/ds_arm7.ld @@ -12,7 +12,8 @@ __iwram_start = 0x03800000; __iwram_end = 0x03810000; __sp_irq = __iwram_end - 0x60; -__sp_usr = __sp_irq - 0x100; +__sp_svc = __sp_irq - 0x100; +__sp_usr = __sp_svc - 0x100; SECTIONS { diff --git a/dka-crtls/ds_arm7_crt0.s b/dka-crtls/ds_arm7_crt0.s index 9a05e90..239729a 100644 --- a/dka-crtls/ds_arm7_crt0.s +++ b/dka-crtls/ds_arm7_crt0.s @@ -7,30 +7,34 @@ @--------------------------------------------------------------------------------- _start: @--------------------------------------------------------------------------------- - mov r0, #0x04000000 @ IME = 0; + mov r0, #0x04000000 @ IME = 0; add r0, r0, #0x208 strh r0, [r0] - mov r0, #0x12 @ Switch to IRQ Mode + mov r0, #0x12 @ Switch to IRQ Mode msr cpsr, r0 - ldr sp, =__sp_irq @ Set IRQ stack + ldr sp, =__sp_irq @ Set IRQ stack - mov r0, #0x1F @ Switch to System Mode + mov r0, #0x13 @ Switch to SVC Mode + msr cpsr, r0 + ldr sp, =__sp_svc @ Set SVC stack + + mov r0, #0x1F @ Switch to System Mode msr cpsr, r0 - ldr sp, =__sp_usr @ Set user stack + ldr sp, =__sp_usr @ Set user stack - ldr r0, =__bss_start @ Clear BSS section to 0x00 + ldr r0, =__bss_start @ Clear BSS section to 0x00 ldr r1, =__bss_end sub r1, r1, r0 bl ClearMem - ldr r3, =_init @ global constructors + ldr r3, =_init @ global constructors bl _call_via_r3 - mov r0, #0 @ int argc - mov r1, #0 @ char *argv[] + mov r0, #0 @ int argc + mov r1, #0 @ char *argv[] ldr r3, =main - bl _call_via_r3 @ jump to user code + bl _call_via_r3 @ jump to user code @ If the user ever returns, return to flash cartridge mov r0, #0x08000000 diff --git a/dka-crtls/ds_cart.ld b/dka-crtls/ds_cart.ld index 0e7536e..a209e34 100644 --- a/dka-crtls/ds_cart.ld +++ b/dka-crtls/ds_cart.ld @@ -10,9 +10,11 @@ MEMORY { } __iwram_start = 0x03800000; -__eheap_end = 0x2040000; -__sp_irq = 0x3810000 - 0x60; -__sp_usr = __sp_irq - 0x100; +__ewram_start = 0x02000000; +__eheap_end = 0x02040000; +__sp_irq = 0x03810000 - 0x60; +__sp_svc = __sp_irq - 0x100; +__sp_usr = __sp_svc - 0x100; SECTIONS { @@ -94,7 +96,29 @@ SECTIONS .jcr : { KEEP (*(.jcr)) } >rom = 0 .got : { *(.got.plt) *(.got) } >rom = 0 - __iwram_lma = . ; + __ewram_lma = . ; + + .ewram __ewram_start : AT (__ewram_lma) + { + __ewram_start = ABSOLUTE(.) ; + *(.ewram) + *ewram.*(.text) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram = 0xff + + .sbss ALIGN(4): + { + __sbss_start = ABSOLUTE(.); + *(.sbss) + . = ALIGN(4); + } + __sbss_end = . ; + + _end = . ; + __end__ = . ; + PROVIDE (end = _end); + + __iwram_lma = __ewram_lma + SIZEOF(.ewram) + SIZEOF(.sbss); .iwram __iwram_start : AT (__iwram_lma) { @@ -107,6 +131,7 @@ SECTIONS __iwram_end = . ; __data_lma = __iwram_lma + SIZEOF(.iwram) ; + .data ALIGN(4) : AT (__data_lma) { __data_start = ABSOLUTE(.); @@ -134,10 +159,6 @@ SECTIONS __bss_end = . ; __bss_end__ = . ; - _end = . ; - __end__ = . ; - PROVIDE (end = _end); - /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } diff --git a/dka-crtls/ds_cart_crt0.s b/dka-crtls/ds_cart_crt0.s index 955a197..fa9997a 100644 --- a/dka-crtls/ds_cart_crt0.s +++ b/dka-crtls/ds_cart_crt0.s @@ -1,154 +1,161 @@ -.section ".init" -.global _start -.align - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -.arm - +@--------------------------------------------------------------------------------- + .section ".init" + .global _start + .arm +@--------------------------------------------------------------------------------- _start: +@--------------------------------------------------------------------------------- b rom_header_end - .fill 156,1,0 @ Nintendo Logo Character Data (8000004h) - .fill 16,1,0 @ Game Title - .byte 0x30,0x31 @ Maker Code (80000B0h) - .byte 0x96 @ Fixed Value (80000B2h) - .byte 0x00 @ Main Unit Code (80000B3h) - .byte 0x00 @ Device Type (80000B4h) - .fill 7,1,0 @ unused - .byte 0x00 @ Software Version No (80000BCh) - .byte 0xf0 @ Complement Check (80000BDh) - .byte 0x00,0x00 @ Checksum (80000BEh) +@--------------------------------------------------------------------------------- + .fill 156,1,0 @ Nintendo Logo Character Data (8000004h) + .fill 16,1,0 @ Game Title + .byte 0x30,0x31 @ Maker Code (80000B0h) + .byte 0x96 @ Fixed Value (80000B2h) + .byte 0x00 @ Main Unit Code (80000B3h) + .byte 0x00 @ Device Type (80000B4h) + .fill 7,1,0 @ unused + .byte 0x00 @ Software Version No (80000BCh) + .byte 0xf0 @ Complement Check (80000BDh) + .byte 0x00,0x00 @ Checksum (80000BEh) rom_header_end: - b start_vector @ This branch must be here for proper - @ positioning of the following header. + b start_vector @ This branch must be here for proper + @ positioning of the following header. .GLOBAL __boot_method, __slave_number __boot_method: - .byte 0 @ boot method (0=ROM boot, 3=Multiplay boot) + .byte 0 @ boot method (0=ROM boot, 3=Multiplay boot) __slave_number: - .byte 0 @ slave # (1=slave#1, 2=slave#2, 3=slave#3) - - .byte 0 @ reserved - .byte 0 @ reserved - .word 0 @ reserved - .word 0 @ reserved - .word 0 @ reserved - .word 0 @ reserved - .word 0 @ reserved - .word 0 @ reserved - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -.align 4 -.arm + .byte 0 @ slave # (1=slave#1, 2=slave#2, 3=slave#3) + .byte 0 @ reserved + .byte 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved +@--------------------------------------------------------------------------------- + .align 4 + .arm +@--------------------------------------------------------------------------------- start_vector: - mov r0, #0x04000000 @ IME = 0; - add r0, r0, #0x208 - strh r0, [r0] +@--------------------------------------------------------------------------------- + mov r0, #0x04000000 @ IME = 0; + add r0, r0, #0x208 + strh r0, [r0] - mov r0, #0x12 @ Switch to IRQ Mode - msr cpsr, r0 - ldr sp, =__sp_irq @ Set IRQ stack - mov r0, #0x1F @ Switch to System Mode - msr cpsr, r0 - ldr sp, =__sp_usr @ Set user stack + mov r0, #0x12 @ Switch to IRQ Mode + msr cpsr, r0 + ldr sp, =__sp_irq @ Set IRQ stack - mov r1, #0x42 - strb r1, [r7], #1 - mov r1, #0x35 - strb r1, [r7], #1 - mov r1, #0x2B - strb r1, [r7], #1 - mov r1, #0x2B - strb r1, [r7], #1 + mov r0, #0x13 @ Switch to SVC Mode + msr cpsr, r0 + ldr sp, =__sp_svc @ Set SVC stack - ldr r0, =__bss_start @ Clear BSS section to 0x00 - ldr r1, =__bss_end - sub r1, r1, r0 - bl ClearMem - ldr r1, =__data_lma @ Copy initialized data (data section) from LMA to VMA (ROM to RAM) - ldr r2, =__data_start - ldr r4, =__data_end - bl CopyMemChk + mov r0, #0x1F @ Switch to System Mode + msr cpsr, r0 + ldr sp, =__sp_usr @ Set user stack - ldr r1, =__iwram_lma @ Copy internal work ram (iwram section) from LMA to VMA (ROM to RAM) - ldr r2, =__iwram_start - ldr r4, =__iwram_end - bl CopyMemChk + mov r1, #0x42 + strb r1, [r7], #1 + mov r1, #0x35 + strb r1, [r7], #1 + mov r1, #0x2B + strb r1, [r7], #1 + mov r1, #0x2B + strb r1, [r7], #1 - ldr r1, =fake_heap_end @ set heap end - ldr r0, =__eheap_end - str r0, [r1] + ldr r1, =__data_lma @ Copy initialized data (data section) from LMA to VMA (ROM to RAM) + ldr r2, =__data_start + ldr r4, =__data_end + bl CopyMemChk + + ldr r1, =__iwram_lma @ Copy internal work ram (iwram section) from LMA to VMA (ROM to RAM) + ldr r2, =__iwram_start + ldr r4, =__iwram_end + bl CopyMemChk + + ldr r0, =__bss_start @ Clear BSS section to 0x00 + ldr r1, =__bss_end + sub r1, r1, r0 + bl ClearMem + + ldr r0, =__sbss_start @ Clear SBSS section to 0x00 + ldr r1, =__sbss_end + sub r1, r1, r0 + bl ClearMem + + ldr r1, =fake_heap_end @ set heap end + ldr r0, =__eheap_end + str r0, [r1] - ldr r3, =_init @ global constructors - bl _call_via_r3 + ldr r3, =_init @ global constructors + bl _call_via_r3 - mov r0, #0 @ int argc - mov r1, #0 @ char *argv[] - ldr r3, =main - bl _call_via_r3 @ jump to user code + mov r0, #0 @ int argc + mov r1, #0 @ char *argv[] + ldr r3, =main + bl _call_via_r3 @ jump to user code -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ +@--------------------------------------------------------------------------------- @ Clear memory to 0x00 if length != 0 @ r0 = Start Address @ r1 = Length -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@--------------------------------------------------------------------------------- +ClearMem: + mov r2, #3 @ Round down to nearest word boundary + add r1, r1, r2 @ Shouldn't be needed + bics r1, r1, r2 @ Clear 2 LSB (and set Z) + bxeq lr @ Quit if copy size is 0 -ClearMem: mov r2, #3 @ Round down to nearest word boundary - add r1, r1, r2 @ Shouldn't be needed - bics r1, r1, r2 @ Clear 2 LSB (and set Z) - bxeq lr @ Quit if copy size is 0 + mov r2, #0 +@--------------------------------------------------------------------------------- +ClrLoop: +@--------------------------------------------------------------------------------- + stmia r0!, {r2} + subs r1, r1, #4 + bne ClrLoop + bx lr - mov r2, #0 -ClrLoop: stmia r0!, {r2} - subs r1, r1, #4 - bne ClrLoop - - bx lr - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ +@--------------------------------------------------------------------------------- @ Copy memory if length != 0 @ r1 = Source Address @ r2 = Dest Address @ r4 = Dest Address + Length -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -CopyMemChk: sub r3, r4, r2 @ Is there any data to copy? - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ +@--------------------------------------------------------------------------------- +CopyMemChk: +@--------------------------------------------------------------------------------- + sub r3, r4, r2 @ Is there any data to copy? +@--------------------------------------------------------------------------------- @ Copy memory @ r1 = Source Address @ r2 = Dest Address @ r3 = Length -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@--------------------------------------------------------------------------------- +CopyMem: +@--------------------------------------------------------------------------------- + mov r0, #3 @ These commands are used in cases where + add r3, r3, r0 @ the length is not a multiple of 4, + bics r3, r3, r0 @ even though it should be. + bxeq lr @ Length is zero so exit -CopyMem: mov r0, #3 @ These commands are used in cases where - add r3, r3, r0 @ the length is not a multiple of 4, - bics r3, r3, r0 @ even though it should be. - bxeq lr @ Length is zero so exit - -CIDLoop: ldmia r1!, {r0} - stmia r2!, {r0} - subs r3, r3, #4 - bne CIDLoop - - bx lr - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -.align -.pool - -.end +@--------------------------------------------------------------------------------- +CIDLoop: +@--------------------------------------------------------------------------------- + ldmia r1!, {r0} + stmia r2!, {r0} + subs r3, r3, #4 + bne CIDLoop + bx lr +@--------------------------------------------------------------------------------- + .align + .pool +@--------------------------------------------------------------------------------- + .end +@---------------------------------------------------------------------------------