From 469a009aefbbb7d459864440e8cdfb416fed9610 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Wed, 4 May 2005 22:35:39 +0000 Subject: [PATCH] updated gba crtls --- dka-crtls/gba_cart.ld | 327 +++++++++++++++---------------- dka-crtls/gba_crt0.s | 232 +++++++++++----------- dka-crtls/gba_mb.ld | 436 +++++++++++++++++++++--------------------- 3 files changed, 498 insertions(+), 497 deletions(-) diff --git a/dka-crtls/gba_cart.ld b/dka-crtls/gba_cart.ld index dc56502..0852a75 100644 --- a/dka-crtls/gba_cart.ld +++ b/dka-crtls/gba_cart.ld @@ -40,9 +40,6 @@ OUTPUT_ARCH(arm) ENTRY(_start) /* SEARCH_DIR(/bin/arm); */ -/* By default this linker script will generate code */ -/* for flash carts located at 0x8000000. */ - /* The linker script function "var1 += var2;" sometimes */ /* reports incorrect values in the *.map file but the */ /* actual value it calculates is usually, if not always, */ @@ -52,195 +49,201 @@ ENTRY(_start) /* not work as well. "var1 += var2" style functions are */ /* avoided below as a result. */ -/* The linker script MEMORY directive is not used here due */ -/* to the fact that __text_start is not always a fixed value. */ +MEMORY { + + rom : ORIGIN = 0x08000000, LENGTH = 32M + iwram : ORIGIN = 0x03000000, LENGTH = 32K + ewram : ORIGIN = 0x02000000, LENGTH = 256K +} __text_start = 0x8000000; __eheap_end = 0x2040000; __iwram_start = 0x3000000; -__iheap_end = 0x3008000 - 0x400; -__sp_usr = 0x3008000 - 0x100; -__sp_irq = 0x3008000 - 0x60; -__intr_vector_buf = 0x3008000 - 4; -__sp_usr_offset = __sp_usr - __iwram_start; -__intr_vect_offset = __intr_vector_buf - __sp_usr; +__iwram_end = 0x3008000; + +__sp_irq = __iwram_end - 0x100; +__sp_usr = __sp_irq - 0x100; + SECTIONS { . = __text_start; - .init : - { - KEEP (*(.init)) - . = ALIGN(4); - } =0xff + .init : + { + KEEP (*(.init)) + . = ALIGN(4); + } >rom =0xff .plt : - { + { *(.plt) . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >rom + + .text : /* ALIGN (4): */ + { + *(EXCLUDE_FILE (*.iwram*) .text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7) + *(.glue_7t) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >rom = 0xff + + __text_end = .; + .fini : + { + KEEP (*(.fini)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >rom =0 + + .rodata : + { + *(.rodata) + *all.rodata*(*) + *(.roda) + *(.rodata.*) + *(.gnu.linkonce.r*) + SORT(CONSTRUCTORS) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >rom = 0xff + + .ctors : + { + /* gcc uses crtbegin.o to find the start of the constructors, so + we make sure it is first. Because this is a wildcard, it + doesn't matter if the user does not actually link against + crtbegin.o; the linker won't look for a file to match a + wildcard. The wildcard also means that it doesn't matter which + directory crtbegin.o is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >rom = 0 + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >rom = 0 + + .jcr : { KEEP (*(.jcr)) } >rom + + .eh_frame : + { + KEEP (*(.eh_frame)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >rom = 0 + + .gcc_except_table : + { + *(.gcc_except_table) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >rom = 0 + + __iwram_lma = .; + + .iwram __iwram_start : AT (__iwram_lma) + { + __iwram_start = ABSOLUTE(.) ; + *(.iwram) + *iwram.*(.text) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >iwram = 0xff + + __data_lma = __iwram_lma + SIZEOF(.iwram) ; + __iwram_end = . ; + + .bss ALIGN(4) : + { + __bss_start = ABSOLUTE(.); + __bss_start__ = ABSOLUTE(.); + *(.dynbss) + *(.gnu.linkonce.b*) + *(COMMON) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } - .text : /* ALIGN (4): */ - { - *(EXCLUDE_FILE (*.iwram*) .text) - *(.text.*) - *(.stub) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.gnu.linkonce.t*) - *(.glue_7) - *(.glue_7t) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0xff - __text_end = .; - .fini : - { - KEEP (*(.fini)) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } =0 + __bss_end = . ; + __bss_end__ = . ; - .rodata : - { - *(.rodata) - *all.rodata*(*) - *(.roda) - *(.rodata.*) - *(.gnu.linkonce.r*) - SORT(CONSTRUCTORS) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0xff + .data ALIGN(4) : AT (__data_lma) + { + __data_start = ABSOLUTE(.); + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + CONSTRUCTORS + . = ALIGN(4); + } >iwram = 0xff - .ctors : - { - /* gcc uses crtbegin.o to find the start of the constructors, so - we make sure it is first. Because this is a wildcard, it - doesn't matter if the user does not actually link against - crtbegin.o; the linker won't look for a file to match a - wildcard. The wildcard also means that it doesn't matter which - directory crtbegin.o is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0 + __iwram_overlay_lma = __data_lma + SIZEOF(.data); - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0 - .jcr : { KEEP (*(.jcr)) } + __data_end = .; + __iwram_overlay_start = . ; -/* laddr = ADDR(.init) + SIZEOF(.init) + SIZEOF(.text) + SIZEOF(.fini) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors); -*/ - .eh_frame : - { - KEEP (*(.eh_frame)) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0 + OVERLAY ALIGN(4) : NOCROSSREFS AT (__iwram_overlay_lma) + { + .iwram0 { *(.iwram0) . = ALIGN(4);} + .iwram1 { *(.iwram1) . = ALIGN(4);} + .iwram2 { *(.iwram2) . = ALIGN(4);} + .iwram3 { *(.iwram3) . = ALIGN(4);} + .iwram4 { *(.iwram4) . = ALIGN(4);} + .iwram5 { *(.iwram5) . = ALIGN(4);} + .iwram6 { *(.iwram6) . = ALIGN(4);} + .iwram7 { *(.iwram7) . = ALIGN(4);} + .iwram8 { *(.iwram8) . = ALIGN(4);} + .iwram9 { *(.iwram9) . = ALIGN(4);} + }>iwram = 0xff - .gcc_except_table : - { - *(.gcc_except_table) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0 - __iwram_lma = .; + __ewram_lma = LOADADDR(.iwram0) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9); - .iwram __iwram_start : AT (__iwram_lma) - { - __iwram_start = ABSOLUTE(.) ; - *(.iwram) - *iwram.*(.text) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0xff - - __data_lma = __iwram_lma + SIZEOF(.iwram) ; - __iwram_end = . ; - - .bss ALIGN(4) : - { - __bss_start = ABSOLUTE(.); - __bss_start__ = ABSOLUTE(.); - *(.dynbss) - *(.gnu.linkonce.b*) - *(COMMON) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } - - __bss_end = . ; - __bss_end__ = . ; - - .data ALIGN(4) : AT (__data_lma) - { - __data_start = ABSOLUTE(.); - *(.data) - *(.data.*) - *(.gnu.linkonce.d*) - CONSTRUCTORS - . = ALIGN(4); - } = 0xff - - __iwram_overlay_lma = __data_lma + SIZEOF(.data); - - __data_end = .; - PROVIDE (edata = .); - __iwram_overlay_start = . ; - - OVERLAY ALIGN(4) : NOCROSSREFS AT (__iwram_overlay_lma) - { - .iwram0 { *(.iwram0) . = ALIGN(4);} - .iwram1 { *(.iwram1) . = ALIGN(4);} - .iwram2 { *(.iwram2) . = ALIGN(4);} - .iwram3 { *(.iwram3) . = ALIGN(4);} - .iwram4 { *(.iwram4) . = ALIGN(4);} - .iwram5 { *(.iwram5) . = ALIGN(4);} - .iwram6 { *(.iwram6) . = ALIGN(4);} - .iwram7 { *(.iwram7) . = ALIGN(4);} - .iwram8 { *(.iwram8) . = ALIGN(4);} - .iwram9 { *(.iwram9) . = ALIGN(4);} - } = 0xff - __ewram_lma = LOADADDR(.iwram0) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9); - - __iwram_overlay_end = . ; - __iheap_start = . ; + __iwram_overlay_end = . ; + __iheap_start = . ; __ewram_start = 0x2000000; - .ewram __ewram_start : AT (__ewram_lma) - { - *(.ewram) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0xff - __ewram_overlay_lma = __ewram_lma + SIZEOF(.ewram); + .ewram __ewram_start : AT (__ewram_lma) + { + *(.ewram) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + }>ewram = 0xff + + __ewram_overlay_lma = __ewram_lma + SIZEOF(.ewram); .sbss ALIGN(4): { - __sbss_start = ABSOLUTE(.); + __sbss_start = ABSOLUTE(.); *(.sbss) . = ALIGN(4); } - __sbss_end = .; + + __sbss_end = .; - __ewram_end = . ; - __ewram_overlay_start = . ; + __ewram_end = . ; + __ewram_overlay_start = . ; - OVERLAY ALIGN(4): NOCROSSREFS AT (__ewram_overlay_lma) - { - .ewram0 { *(.ewram0) . = ALIGN(4);} - .ewram1 { *(.ewram1) . = ALIGN(4);} - .ewram2 { *(.ewram2) . = ALIGN(4);} - .ewram3 { *(.ewram3) . = ALIGN(4);} - .ewram4 { *(.ewram4) . = ALIGN(4);} - .ewram5 { *(.ewram5) . = ALIGN(4);} - .ewram6 { *(.ewram6) . = ALIGN(4);} - .ewram7 { *(.ewram7) . = ALIGN(4);} - .ewram8 { *(.ewram8) . = ALIGN(4);} - .ewram9 { *(.ewram9) . = ALIGN(4);} - } = 0xff + OVERLAY ALIGN(4): NOCROSSREFS AT (__ewram_overlay_lma) + { + .ewram0 { *(.ewram0) . = ALIGN(4);} + .ewram1 { *(.ewram1) . = ALIGN(4);} + .ewram2 { *(.ewram2) . = ALIGN(4);} + .ewram3 { *(.ewram3) . = ALIGN(4);} + .ewram4 { *(.ewram4) . = ALIGN(4);} + .ewram5 { *(.ewram5) . = ALIGN(4);} + .ewram6 { *(.ewram6) . = ALIGN(4);} + .ewram7 { *(.ewram7) . = ALIGN(4);} + .ewram8 { *(.ewram8) . = ALIGN(4);} + .ewram9 { *(.ewram9) . = ALIGN(4);} + }>ewram = 0xff - __pad_lma = LOADADDR(.ewram0) + SIZEOF(.ewram0)+SIZEOF(.ewram1)+SIZEOF(.ewram2)+SIZEOF(.ewram3)+SIZEOF(.ewram4)+SIZEOF(.ewram5)+SIZEOF(.ewram6)+SIZEOF(.ewram7)+SIZEOF(.ewram8)+SIZEOF(.ewram9); + __pad_lma = LOADADDR(.ewram0) + SIZEOF(.ewram0)+SIZEOF(.ewram1)+SIZEOF(.ewram2)+SIZEOF(.ewram3)+SIZEOF(.ewram4)+SIZEOF(.ewram5)+SIZEOF(.ewram6)+SIZEOF(.ewram7)+SIZEOF(.ewram8)+SIZEOF(.ewram9); /* EZF Advance strips trailing 0xff bytes, add a pad section so nothing important is removed */ .pad ALIGN(4) : AT (__pad_lma) diff --git a/dka-crtls/gba_crt0.s b/dka-crtls/gba_crt0.s index a267473..db42fc7 100644 --- a/dka-crtls/gba_crt0.s +++ b/dka-crtls/gba_crt0.s @@ -7,178 +7,178 @@ _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 @ 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 + .byte 0 @ reserved + .byte 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved + .word 0 @ reserved .global start_vector .align @--------------------------------------------------------------------------------- start_vector: @--------------------------------------------------------------------------------- - mov r0, #0x4000000 @ REG_BASE - add r0,r0,#0x208 @ REG_IME - strh r0,[r0] + mov r0, #0x4000000 @ REG_BASE + add r0, r0, #0x208 @ REG_IME + 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 r0, #0x1f @ Switch to System Mode + msr cpsr, r0 + ldr sp, =__sp_usr @ Set user stack @--------------------------------------------------------------------------------- @ Enter Thumb mode @--------------------------------------------------------------------------------- - add r0,pc,#1 - bx r0 + add r0, pc, #1 + bx r0 .thumb - ldr r0,=__text_start - lsl r0,#5 @ Was code compiled at 0x08000000 or higher? - bcs DoEWRAMClear @ yes, you can not run it in external WRAM + ldr r0, =__text_start + lsl r0, #5 @ Was code compiled at 0x08000000 or higher? + bcs DoEWRAMClear @ yes, you can not run it in external WRAM - mov r0,pc - lsl r0,#5 @ Are we running from ROM (0x8000000 or higher) ? - bcc SkipEWRAMClear @ No, so no need to do a copy. + mov r0, pc + lsl r0, #5 @ Are we running from ROM (0x8000000 or higher) ? + bcc SkipEWRAMClear @ No, so no need to do a copy. @--------------------------------------------------------------------------------- @ We were started in ROM, silly emulators. :P @ So we need to copy to ExWRAM. @--------------------------------------------------------------------------------- - mov r3,#0x40 - lsl r3,#12 @ r3 = 0x40000 - lsl r2,r3,#7 @ r2 = 0x2000000 - mov r6,r2 @ r6 = 0x2000000 - lsl r1,r2,#2 @ r1 = 0x8000000 + mov r3, #0x40 + lsl r3, #12 @ r3 = 0x40000 + lsl r2, r3, #7 @ r2 = 0x2000000 + mov r6, r2 @ r6 = 0x2000000 + lsl r1, r2, #2 @ r1 = 0x8000000 - bl CopyMem + bl CopyMem - bx r6 @ Jump to the code to execute + bx r6 @ Jump to the code to execute @--------------------------------------------------------------------------------- -DoEWRAMClear: @ Clear External WRAM to 0x00 +DoEWRAMClear: @ Clear External WRAM to 0x00 @--------------------------------------------------------------------------------- - mov r1,#0x40 - lsl r1,#12 @ r1 = 0x40000 - lsl r0,r1,#7 @ r0 = 0x2000000 - bl ClearMem + mov r1, #0x40 + lsl r1, #12 @ r1 = 0x40000 + lsl r0, r1, #7 @ r0 = 0x2000000 + bl ClearMem @--------------------------------------------------------------------------------- -SkipEWRAMClear: @ Clear Internal WRAM to 0x00 +SkipEWRAMClear: @ Clear Internal WRAM to 0x00 @--------------------------------------------------------------------------------- - mov r0,#3 - lsl r0,#24 @ r0 = 0x3000000 - ldr r1,=__sp_usr_offset - 16 - bl ClearMem + mov r0, #3 + lsl r0, #24 @ r0 = 0x3000000 + ldr r1, =__iwram_end + bl ClearMem @--------------------------------------------------------------------------------- -@ Clear BSS section to 0x00 +@ Clear SBSS section to 0x00 @--------------------------------------------------------------------------------- - ldr r0,=__sbss_start - ldr r1,=__sbss_end - sub r1,r0 - bl ClearMem + ldr r0, =__sbss_start + ldr r1, =__sbss_end + sub r1, r0 + bl ClearMem @--------------------------------------------------------------------------------- @ Copy initialized data (data section) from LMA to VMA (ROM to RAM) @--------------------------------------------------------------------------------- - ldr r1,=__data_lma - ldr r2,=__data_start - ldr r4,=__data_end - bl CopyMemChk + ldr r1, =__data_lma + ldr r2, =__data_start + ldr r4, =__data_end + bl CopyMemChk @--------------------------------------------------------------------------------- @ Copy internal work ram (iwram section) from LMA to VMA (ROM to RAM) @--------------------------------------------------------------------------------- - ldr r1,=__iwram_lma - ldr r2,=__iwram_start - ldr r4,=__iwram_end - bl CopyMemChk + ldr r1,= __iwram_lma + ldr r2,= __iwram_start + ldr r4,= __iwram_end + bl CopyMemChk @--------------------------------------------------------------------------------- @ Copy internal work ram overlay 0 (iwram0 section) from LMA to VMA (ROM to RAM) @--------------------------------------------------------------------------------- - ldr r2,=__load_stop_iwram0 - ldr r1,=__load_start_iwram0 - sub r3,r2,r1 @ Is there any data to copy? - beq CIW0Skip @ no + ldr r2,= __load_stop_iwram0 + ldr r1,= __load_start_iwram0 + sub r3, r2, r1 @ Is there any data to copy? + beq CIW0Skip @ no - ldr r2,=__iwram_overlay_start - bl CopyMem + ldr r2,= __iwram_overlay_start + bl CopyMem @--------------------------------------------------------------------------------- CIW0Skip: @--------------------------------------------------------------------------------- @ Copy external work ram (ewram section) from LMA to VMA (ROM to RAM) @--------------------------------------------------------------------------------- - ldr r1,=__ewram_lma - ldr r2,=__ewram_start - ldr r4,=__ewram_end - bl CopyMemChk + ldr r1, =__ewram_lma + ldr r2, =__ewram_start + ldr r4, =__ewram_end + bl CopyMemChk @--------------------------------------------------------------------------------- @ Copy external work ram overlay 0 (ewram0 section) from LMA to VMA (ROM to RAM) @--------------------------------------------------------------------------------- - ldr r2,=__load_stop_ewram0 - ldr r1,=__load_start_ewram0 - sub r3,r2,r1 @ Is there any data to copy? - beq CEW0Skip @ no + ldr r2, =__load_stop_ewram0 + ldr r1, =__load_start_ewram0 + sub r3, r2, r1 @ Is there any data to copy? + beq CEW0Skip @ no - ldr r2,=__ewram_overlay_start - bl CopyMem + ldr r2, =__ewram_overlay_start + bl CopyMem @--------------------------------------------------------------------------------- CEW0Skip: @--------------------------------------------------------------------------------- @ set heap end @--------------------------------------------------------------------------------- - ldr r1,=fake_heap_end - ldr r0,=__eheap_end - str r0,[r1] + ldr r1, =fake_heap_end + ldr r0, =__eheap_end + str r0, [r1] @--------------------------------------------------------------------------------- @ global constructors @--------------------------------------------------------------------------------- - ldr r3,=_init - bl _call_via_r3 + ldr r3, =_init + 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 + mov r0, #0 @ int argc + mov r1, #0 @ char *argv[] + ldr r3, =main + bl _call_via_r3 @--------------------------------------------------------------------------------- @ Clear memory to 0x00 if length != 0 @--------------------------------------------------------------------------------- @@ -187,59 +187,59 @@ CEW0Skip: @--------------------------------------------------------------------------------- ClearMem: @--------------------------------------------------------------------------------- - mov r2,#3 @ These commands are used in cases where - add r1,r2 @ the length is not a multiple of 4, - bic r1,r2 @ even though it should be. + mov r2,#3 @ These commands are used in cases where + add r1,r2 @ the length is not a multiple of 4, + bic r1,r2 @ even though it should be. - beq ClearMX @ Length is zero so exit + beq ClearMX @ Length is zero so exit - mov r2,#0 + mov r2,#0 @--------------------------------------------------------------------------------- ClrLoop: @--------------------------------------------------------------------------------- - stmia r0!,{r2} - sub r1,#4 - bne ClrLoop + stmia r0!, {r2} + sub r1,#4 + bne ClrLoop @--------------------------------------------------------------------------------- ClearMX: @--------------------------------------------------------------------------------- - bx lr + bx lr @--------------------------------------------------------------------------------- @ Copy memory if length != 0 @--------------------------------------------------------------------------------- @ r1 = Source Address -@ r2 = Dest Address -@ r4 = Dest Address + Length +@ r2 = Dest Address +@ r4 = Dest Address + Length @--------------------------------------------------------------------------------- CopyMemChk: @--------------------------------------------------------------------------------- - sub r3,r4,r2 @ Is there any data to copy? + sub r3, r4, r2 @ Is there any data to copy? @--------------------------------------------------------------------------------- @ Copy memory @--------------------------------------------------------------------------------- @ r1 = Source Address -@ r2 = Dest Address +@ r2 = Dest Address @ r3 = Length @--------------------------------------------------------------------------------- CopyMem: @--------------------------------------------------------------------------------- - mov r0,#3 @ These commands are used in cases where - add r3,r0 @ the length is not a multiple of 4, - bic r3,r0 @ even though it should be. - beq CIDExit @ Length is zero so exit + mov r0, #3 @ These commands are used in cases where + add r3, r0 @ the length is not a multiple of 4, + bic r3, r0 @ even though it should be. + beq CIDExit @ Length is zero so exit @--------------------------------------------------------------------------------- CIDLoop: @--------------------------------------------------------------------------------- - ldmia r1!,{r0} - stmia r2!,{r0} - sub r3,#4 - bne CIDLoop + ldmia r1!, {r0} + stmia r2!, {r0} + sub r3, #4 + bne CIDLoop @--------------------------------------------------------------------------------- CIDExit: @--------------------------------------------------------------------------------- - bx lr + bx lr .align .pool diff --git a/dka-crtls/gba_mb.ld b/dka-crtls/gba_mb.ld index 66b6113..8159bc0 100644 --- a/dka-crtls/gba_mb.ld +++ b/dka-crtls/gba_mb.ld @@ -17,6 +17,7 @@ /* data in ewram */ /* v1.5 - padding section added to stop EZF */ /* stripping important data */ +/* v1.6 - added memory sections */ /* This file is released into the public domain */ /* for commercial or non-commercial use with no */ @@ -38,249 +39,246 @@ OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) -/* SEARCH_DIR(/bin/arm); */ -/* By default this linker script will generate code */ -/* for flash carts located at 0x8000000. */ +MEMORY { -/* The linker script function "var1 += var2;" sometimes */ -/* reports incorrect values in the *.map file but the */ -/* actual value it calculates is usually, if not always, */ -/* correct. If you leave out the ". = ALIGN(4);" at the */ -/* end of each section then the return value of SIZEOF() */ -/* is sometimes incorrect and "var1 += var2;" appears to */ -/* not work as well. "var1 += var2" style functions are */ -/* avoided below as a result. */ -__text_start = 0x2000000 ; -__eheap_end = 0x2040000; -__iwram_start = 0x3000000; -__iheap_end = 0x3008000 - 0x400; -__sp_usr = 0x3008000 - 0x100; -__sp_irq = 0x3008000 - 0x60; -__intr_vector_buf = 0x3008000 - 4; -__sp_usr_offset = __sp_usr - __iwram_start; -__intr_vect_offset = __intr_vector_buf - __sp_usr; + rom : ORIGIN = 0x08000000, LENGTH = 32M + iwram : ORIGIN = 0x03000000, LENGTH = 32K + ewram : ORIGIN = 0x02000000, LENGTH = 256K +} + + + +__text_start = 0x2000000 ; +__eheap_end = 0x2040000; +__iwram_start = 0x3000000; +__iwram_end = 0x3008000; +__sp_irq = __iwram_end - 0x100; +__sp_usr = __sp_irq - 0x100; SECTIONS { . = __text_start; - .init : - { - KEEP (*(.init)) - . = ALIGN(4); - } =0xff + .init : + { + KEEP (*(.init)) + . = ALIGN(4); + } >ewram =0xff .plt : { *(.plt) . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram + + .text ALIGN (4): + { + *(EXCLUDE_FILE (*.iwram*) .text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + *(.glue_7) + *(.glue_7t) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram = 0xff + + __text_end = .; + .fini : + { + KEEP (*(.fini)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram =0 + + .rodata : + { + *(.rodata) + *all.rodata*(*) + *(.roda) + *(.rodata.*) + *(.gnu.linkonce.r*) + SORT(CONSTRUCTORS) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram = 0xff + + .ctors : + { + /* gcc uses crtbegin.o to find the start of the constructors, so + we make sure it is first. Because this is a wildcard, it + doesn't matter if the user does not actually link against + crtbegin.o; the linker won't look for a file to match a + wildcard. The wildcard also means that it doesn't matter which + directory crtbegin.o is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram = 0 + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram = 0 + + .jcr : { KEEP (*(.jcr)) } >ewram + .eh_frame : + { + KEEP (*(.eh_frame)) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram = 0 + + .gcc_except_table : + { + *(.gcc_except_table) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram = 0 + + __iwram_lma = .; + + .iwram __iwram_start : AT (__iwram_lma) + { + __iwram_start = ABSOLUTE(.) ; + *(.iwram) + *iwram.*(.text) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >iwram = 0xff + + __data_lma = __iwram_lma + SIZEOF(.iwram) ; + __iwram_end = . ; + + .bss ALIGN(4) : + { + __bss_start = ABSOLUTE(.); + __bss_start__ = ABSOLUTE(.); + *(.dynbss) + *(.gnu.linkonce.b*) + *(COMMON) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ } + + __bss_end = . ; + __bss_end__ = . ; + + .data ALIGN(4) : AT (__data_lma) + { + __data_start = ABSOLUTE(.); + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + CONSTRUCTORS + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >iwram = 0xff + + __iwram_overlay_lma = __data_lma + SIZEOF(.data); + + __data_end = .; + PROVIDE (edata = .); + __iwram_overlay_start = . ; + + OVERLAY ALIGN(4) : NOCROSSREFS AT (__iwram_overlay_lma) + { + .iwram0 { *(.iwram0) . = ALIGN(4);} + .iwram1 { *(.iwram1) . = ALIGN(4);} + .iwram2 { *(.iwram2) . = ALIGN(4);} + .iwram3 { *(.iwram3) . = ALIGN(4);} + .iwram4 { *(.iwram4) . = ALIGN(4);} + .iwram5 { *(.iwram5) . = ALIGN(4);} + .iwram6 { *(.iwram6) . = ALIGN(4);} + .iwram7 { *(.iwram7) . = ALIGN(4);} + .iwram8 { *(.iwram8) . = ALIGN(4);} + .iwram9 { *(.iwram9) . = ALIGN(4);} + } >iwram = 0xff - .text : /* ALIGN (4): */ - { - *(EXCLUDE_FILE (*.iwram*) .text) - *(.text.*) - *(.stub) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.gnu.linkonce.t*) - *(.glue_7) - *(.glue_7t) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0xff - __text_end = .; - .fini : - { - KEEP (*(.fini)) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } =0 - - .rodata : - { - *(.rodata) - *all.rodata*(*) - *(.roda) - *(.rodata.*) - *(.gnu.linkonce.r*) - SORT(CONSTRUCTORS) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0xff - - .ctors : - { - /* gcc uses crtbegin.o to find the start of the constructors, so - we make sure it is first. Because this is a wildcard, it - doesn't matter if the user does not actually link against - crtbegin.o; the linker won't look for a file to match a - wildcard. The wildcard also means that it doesn't matter which - directory crtbegin.o is in. */ - KEEP (*crtbegin.o(.ctors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) - KEEP (*(SORT(.ctors.*))) - KEEP (*(.ctors)) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0 - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0 - .jcr : { KEEP (*(.jcr)) } - -/* laddr = ADDR(.init) + SIZEOF(.init) + SIZEOF(.text) + SIZEOF(.fini) + SIZEOF(.rodata) + SIZEOF(.ctors) + SIZEOF(.dtors); -*/ - .eh_frame : - { - KEEP (*(.eh_frame)) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0 - - .gcc_except_table : - { - *(.gcc_except_table) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0 - __iwram_lma = .; - - .iwram __iwram_start : AT (__iwram_lma) - { - __iwram_start = ABSOLUTE(.) ; - *(.iwram) - *iwram.*(.text) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0xff - - __data_lma = __iwram_lma + SIZEOF(.iwram) ; - __iwram_end = . ; - - .bss ALIGN(4) : - { - __bss_start = ABSOLUTE(.); - __bss_start__ = ABSOLUTE(.); - *(.dynbss) - *(.gnu.linkonce.b*) - *(COMMON) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } - - __bss_end = . ; - __bss_end__ = . ; - - .data ALIGN(4) : AT (__data_lma) - { - __data_start = ABSOLUTE(.); - *(.data) - *(.data.*) - *(.gnu.linkonce.d*) - CONSTRUCTORS - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0xff - - __iwram_overlay_lma = __data_lma + SIZEOF(.data); - - __data_end = .; - PROVIDE (edata = .); - __iwram_overlay_start = . ; - - OVERLAY ALIGN(4) : NOCROSSREFS AT (__iwram_overlay_lma) - { - .iwram0 { *(.iwram0) . = ALIGN(4);} - .iwram1 { *(.iwram1) . = ALIGN(4);} - .iwram2 { *(.iwram2) . = ALIGN(4);} - .iwram3 { *(.iwram3) . = ALIGN(4);} - .iwram4 { *(.iwram4) . = ALIGN(4);} - .iwram5 { *(.iwram5) . = ALIGN(4);} - .iwram6 { *(.iwram6) . = ALIGN(4);} - .iwram7 { *(.iwram7) . = ALIGN(4);} - .iwram8 { *(.iwram8) . = ALIGN(4);} - .iwram9 { *(.iwram9) . = ALIGN(4);} - } = 0xff - __ewram_lma = LOADADDR(.iwram0) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9); - - __iwram_overlay_end = . ; - __iheap_start = . ; - - /* v1.3 */ - __ewram_start = __ewram_lma ; - .ewram __ewram_start : AT (__ewram_lma) - { - *(.ewram) - . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ - } = 0xff - - __ewram_overlay_lma = __ewram_lma + SIZEOF(.ewram); + __ewram_lma = LOADADDR(.iwram0) + SIZEOF(.iwram0)+SIZEOF(.iwram1)+SIZEOF(.iwram2)+SIZEOF(.iwram3)+SIZEOF(.iwram4)+SIZEOF(.iwram5)+SIZEOF(.iwram6)+SIZEOF(.iwram7)+SIZEOF(.iwram8)+SIZEOF(.iwram9); + + __iwram_overlay_end = . ; + __iheap_start = . ; + + /* v1.3 */ + __ewram_start = __ewram_lma ; + .ewram __ewram_start : AT (__ewram_lma) + { + *(.ewram) + . = ALIGN(4); /* REQUIRED. LD is flaky without it. */ + } >ewram = 0xff + + __ewram_overlay_lma = __ewram_lma + SIZEOF(.ewram); + .sbss ALIGN(4): { - __sbss_start = ABSOLUTE(.); - *(.sbss) - . = ALIGN(4); - } - __sbss_end = .; + __sbss_start = ABSOLUTE(.); + *(.sbss) + . = ALIGN(4); + } + + __sbss_end = .; __ewram_end = . ; __ewram_overlay_start = . ; - OVERLAY ALIGN(4): NOCROSSREFS AT (__ewram_overlay_lma) - { - .ewram0 { *(.ewram0) . = ALIGN(4);} - .ewram1 { *(.ewram1) . = ALIGN(4);} - .ewram2 { *(.ewram2) . = ALIGN(4);} - .ewram3 { *(.ewram3) . = ALIGN(4);} - .ewram4 { *(.ewram4) . = ALIGN(4);} - .ewram5 { *(.ewram5) . = ALIGN(4);} - .ewram6 { *(.ewram6) . = ALIGN(4);} - .ewram7 { *(.ewram7) . = ALIGN(4);} - .ewram8 { *(.ewram8) . = ALIGN(4);} - .ewram9 { *(.ewram9) . = ALIGN(4);} - } = 0xff + OVERLAY ALIGN(4): NOCROSSREFS AT (__ewram_overlay_lma) + { + .ewram0 { *(.ewram0) . = ALIGN(4);} + .ewram1 { *(.ewram1) . = ALIGN(4);} + .ewram2 { *(.ewram2) . = ALIGN(4);} + .ewram3 { *(.ewram3) . = ALIGN(4);} + .ewram4 { *(.ewram4) . = ALIGN(4);} + .ewram5 { *(.ewram5) . = ALIGN(4);} + .ewram6 { *(.ewram6) . = ALIGN(4);} + .ewram7 { *(.ewram7) . = ALIGN(4);} + .ewram8 { *(.ewram8) . = ALIGN(4);} + .ewram9 { *(.ewram9) . = ALIGN(4);} + } >ewram = 0xff - __ewram_overlay_end = . ; + __ewram_overlay_end = . ; - __eheap_start = . ; + __eheap_start = . ; _end = .; - __end__ = _end ; /* v1.3 */ - PROVIDE (end = _end); /* v1.3 */ + __end__ = _end ; /* v1.3 */ + PROVIDE (end = _end); /* v1.3 */ - /* Stabs debugging sections. */ - .stab 0 : { *(.stab) } - .stabstr 0 : { *(.stabstr) } - .stab.excl 0 : { *(.stab.excl) } - .stab.exclstr 0 : { *(.stab.exclstr) } - .stab.index 0 : { *(.stab.index) } - .stab.indexstr 0 : { *(.stab.indexstr) } - .comment 0 : { *(.comment) } - /* DWARF debug sections. - Symbols in the DWARF debugging sections are relative to the beginning - of the section so we begin them at 0. */ - /* DWARF 1 */ - .debug 0 : { *(.debug) } - .line 0 : { *(.line) } - /* GNU DWARF 1 extensions */ - .debug_srcinfo 0 : { *(.debug_srcinfo) } - .debug_sfnames 0 : { *(.debug_sfnames) } - /* DWARF 1.1 and DWARF 2 */ - .debug_aranges 0 : { *(.debug_aranges) } - .debug_pubnames 0 : { *(.debug_pubnames) } - /* DWARF 2 */ - .debug_info 0 : { *(.debug_info) } - .debug_abbrev 0 : { *(.debug_abbrev) } - .debug_line 0 : { *(.debug_line) } - .debug_frame 0 : { *(.debug_frame) } - .debug_str 0 : { *(.debug_str) } - .debug_loc 0 : { *(.debug_loc) } - .debug_macinfo 0 : { *(.debug_macinfo) } - /* SGI/MIPS DWARF 2 extensions */ - .debug_weaknames 0 : { *(.debug_weaknames) } - .debug_funcnames 0 : { *(.debug_funcnames) } - .debug_typenames 0 : { *(.debug_typenames) } - .debug_varnames 0 : { *(.debug_varnames) } - .stack 0x80000 : { _stack = .; *(.stack) } - /* These must appear regardless of . */ + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .stack 0x80000 : { _stack = .; *(.stack) } + /* These must appear regardless of . */ }