mirror of
https://github.com/devkitPro/buildscripts.git
synced 2026-03-22 01:54:32 -05:00
moved scripts to toolchain dirs
This commit is contained in:
parent
08304b3279
commit
07ecbd7c92
|
|
@ -1,11 +0,0 @@
|
|||
PREFIX := arm-elf-
|
||||
export CC := $(PREFIX)gcc
|
||||
export CXX := $(PREFIX)g++
|
||||
export AR := $(PREFIX)ar
|
||||
export OBJCOPY := $(PREFIX)objcopy
|
||||
|
||||
all:
|
||||
$(CC) -x assembler-with-cpp -marm -c $(CRT)_crt0.s -o$(CRT)_crt0.o
|
||||
$(CC) -x assembler-with-cpp -marm -mthumb-interwork -c $(CRT)_crt0.s -o interwork/$(CRT)_crt0.o
|
||||
$(CC) -x assembler-with-cpp -mthumb -c $(CRT)_crt0.s -o thumb/$(CRT)_crt0.o
|
||||
$(CC) -x assembler-with-cpp -mthumb -mthumb-interwork -c $(CRT)_crt0.s -o thumb/interwork/$(CRT)_crt0.o
|
||||
|
|
@ -1,172 +0,0 @@
|
|||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||
OUTPUT_ARCH(arm)
|
||||
ENTRY(_start)
|
||||
|
||||
MEMORY {
|
||||
|
||||
rom : ORIGIN = 0x08000000, LENGTH = 32M
|
||||
iwram : ORIGIN = 0x03800000, LENGTH = 64K
|
||||
ewram : ORIGIN = 0x02040000, LENGTH = 4M
|
||||
}
|
||||
__iwram_start = 0x03800000;
|
||||
__iwram_end = 0x03810000;
|
||||
|
||||
__sp_irq = __iwram_end - 0x60;
|
||||
__sp_svc = __sp_irq - 0x100;
|
||||
__sp_usr = __sp_svc - 0x100;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.init :
|
||||
{
|
||||
__text_start = . ;
|
||||
KEEP (*(.init))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >iwram = 0xff
|
||||
.plt : { *(.plt) } >iwram = 0xff
|
||||
|
||||
.text : /* ALIGN (4): */
|
||||
{
|
||||
|
||||
*(.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. */
|
||||
} >iwram = 0xff
|
||||
|
||||
.fini :
|
||||
{
|
||||
KEEP (*(.fini))
|
||||
} >iwram =0xff
|
||||
|
||||
__text_end = . ;
|
||||
|
||||
.rodata :
|
||||
{
|
||||
*(.rodata)
|
||||
*all.rodata*(*)
|
||||
*(.roda)
|
||||
*(.rodata.*)
|
||||
*(.gnu.linkonce.r*)
|
||||
SORT(CONSTRUCTORS)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >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. */
|
||||
} >iwram = 0xff
|
||||
|
||||
.dtors :
|
||||
{
|
||||
KEEP (*crtbegin.o(.dtors))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
|
||||
KEEP (*(SORT(.dtors.*)))
|
||||
KEEP (*(.dtors))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >iwram = 0xff
|
||||
|
||||
.eh_frame :
|
||||
{
|
||||
KEEP (*(.eh_frame))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >iwram = 0xff
|
||||
|
||||
.gcc_except_table :
|
||||
{
|
||||
*(.gcc_except_table)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >iwram = 0xff
|
||||
.jcr : { KEEP (*(.jcr)) } >iwram = 0
|
||||
.got : { *(.got.plt) *(.got) } >iwram = 0
|
||||
|
||||
|
||||
.iwram ALIGN(4) :
|
||||
{
|
||||
__iwram_start = ABSOLUTE(.) ;
|
||||
*(.iwram)
|
||||
*iwram.*(.text)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >iwram = 0xff
|
||||
|
||||
__iwram_end = . ;
|
||||
|
||||
.data ALIGN(4) : {
|
||||
__data_start = ABSOLUTE(.);
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.gnu.linkonce.d*)
|
||||
CONSTRUCTORS
|
||||
. = ALIGN(4);
|
||||
} >iwram = 0xff
|
||||
|
||||
__data_end = . ;
|
||||
|
||||
|
||||
.bss ALIGN(4) :
|
||||
{
|
||||
__bss_start = ABSOLUTE(.);
|
||||
__bss_start__ = ABSOLUTE(.);
|
||||
*(.dynbss)
|
||||
*(.gnu.linkonce.b*)
|
||||
*(COMMON)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >iwram
|
||||
|
||||
__bss_end = . ;
|
||||
__bss_end__ = . ;
|
||||
|
||||
_end = . ;
|
||||
__end__ = . ;
|
||||
PROVIDE (end = _end);
|
||||
|
||||
/* 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 . */
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
%rename link old_link
|
||||
|
||||
*link:
|
||||
%(old_link) -T ds_arm7.ld%s
|
||||
|
||||
*startfile:
|
||||
ds_arm7_crt0%O%s crti%O%s crtbegin%O%s
|
||||
|
||||
|
|
@ -1,94 +0,0 @@
|
|||
@---------------------------------------------------------------------------------
|
||||
.section ".init"
|
||||
.global _start
|
||||
@---------------------------------------------------------------------------------
|
||||
.align 4
|
||||
.arm
|
||||
@---------------------------------------------------------------------------------
|
||||
_start:
|
||||
@---------------------------------------------------------------------------------
|
||||
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, #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 r0, =__bss_start @ Clear BSS section to 0x00
|
||||
ldr r1, =__bss_end
|
||||
sub r1, r1, r0
|
||||
bl ClearMem
|
||||
|
||||
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
|
||||
|
||||
@ If the user ever returns, return to flash cartridge
|
||||
mov r0, #0x08000000
|
||||
bx r0
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ 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
|
||||
|
||||
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
|
||||
@---------------------------------------------------------------------------------
|
||||
CopyMemCheck:
|
||||
@---------------------------------------------------------------------------------
|
||||
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
|
||||
CIDLoop:
|
||||
ldmia r1!, {r0}
|
||||
stmia r2!, {r0}
|
||||
subs r3, r3, #4
|
||||
bne CIDLoop
|
||||
bx lr
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
.align
|
||||
.pool
|
||||
.end
|
||||
@---------------------------------------------------------------------------------
|
||||
|
|
@ -1,228 +0,0 @@
|
|||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||
OUTPUT_ARCH(arm)
|
||||
ENTRY(_start)
|
||||
|
||||
MEMORY {
|
||||
|
||||
rom : ORIGIN = 0x08000000, LENGTH = 32M
|
||||
iwram : ORIGIN = 0x037f8000, LENGTH = 32K
|
||||
ewram : ORIGIN = 0x02000000, LENGTH = 4M - 4k
|
||||
dtcm : ORIGIN = 0x00800000, LENGTH = 16K
|
||||
itcm : ORIGIN = 0x00000000, LENGTH = 32K
|
||||
}
|
||||
|
||||
__itcm_start = 0x00000000;
|
||||
__iwram_start = 0x037f8000;
|
||||
__iwram_end = 0x03800000;
|
||||
__ewram_end = 0x02400000;
|
||||
__eheap_end = 0x023ff000;
|
||||
__dtcm_start = 0x00800000;
|
||||
__dtcm_end = 0x00804000;
|
||||
|
||||
__sp_svc = __dtcm_end - 0x100;
|
||||
__sp_irq = __sp_svc - 0x100;
|
||||
__sp_usr = __sp_irq - 0x100;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.init :
|
||||
{
|
||||
__text_start = . ;
|
||||
KEEP (*(.init))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ewram = 0xff
|
||||
.plt : { *(.plt) } >ewram = 0xff
|
||||
|
||||
.text : /* ALIGN (4): */
|
||||
{
|
||||
|
||||
*(.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
|
||||
|
||||
.fini :
|
||||
{
|
||||
KEEP (*(.fini))
|
||||
} >ewram =0xff
|
||||
|
||||
__text_end = . ;
|
||||
|
||||
.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 = 0xff
|
||||
|
||||
.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 = 0xff
|
||||
|
||||
.eh_frame :
|
||||
{
|
||||
KEEP (*(.eh_frame))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ewram = 0xff
|
||||
|
||||
.gcc_except_table :
|
||||
{
|
||||
*(.gcc_except_table)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ewram = 0xff
|
||||
.jcr : { KEEP (*(.jcr)) } >ewram = 0
|
||||
.got : { *(.got.plt) *(.got) } >ewram = 0
|
||||
|
||||
.ewram ALIGN(4) :
|
||||
{
|
||||
__ewram_start = ABSOLUTE(.) ;
|
||||
*(.ewram)
|
||||
*ewram.*(.text)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ewram = 0xff
|
||||
|
||||
__iwram_lma = . ;
|
||||
|
||||
.iwram __iwram_start : AT (__iwram_lma)
|
||||
{
|
||||
__iwram_start = ABSOLUTE(.) ;
|
||||
*(.iwram)
|
||||
*iwram.*(.text)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >iwram = 0xff
|
||||
|
||||
__iwram_end = . ;
|
||||
|
||||
__dtcm_lma = __iwram_lma + SIZEOF(.iwram);
|
||||
|
||||
.dtcm __dtcm_start : AT (__dtcm_lma)
|
||||
{
|
||||
__dtcm_start = ABSOLUTE(.);
|
||||
*(.dtcm)
|
||||
*(.dtcm.*)
|
||||
. = ALIGN(4);
|
||||
} >dtcm = 0xff
|
||||
__dtcm_end = . ;
|
||||
|
||||
__data_lma = __dtcm_lma + SIZEOF(.dtcm) ;
|
||||
|
||||
.data ALIGN(4) : AT (__data_lma)
|
||||
{
|
||||
__data_start = ABSOLUTE(.);
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.gnu.linkonce.d*)
|
||||
CONSTRUCTORS
|
||||
. = ALIGN(4);
|
||||
} >dtcm = 0xff
|
||||
|
||||
__data_end = . ;
|
||||
|
||||
|
||||
.bss ALIGN(4) :
|
||||
{
|
||||
__bss_start = ABSOLUTE(.);
|
||||
__bss_start__ = ABSOLUTE(.);
|
||||
*(.dynbss)
|
||||
*(.gnu.linkonce.b*)
|
||||
*(COMMON)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >dtcm
|
||||
|
||||
__bss_end = . ;
|
||||
__bss_end__ = . ;
|
||||
|
||||
__itcm_lma = __data_lma + SIZEOF(.data);
|
||||
|
||||
.itcm __itcm_start : AT (__itcm_lma)
|
||||
{
|
||||
__itcm_start = ABSOLUTE(.);
|
||||
*(.itcm)
|
||||
*(.itcm.*)
|
||||
. = ALIGN(4);
|
||||
} >itcm = 0xff
|
||||
__itcm_end = . ;
|
||||
|
||||
|
||||
__sbss_lma = __itcm_lma + SIZEOF(.itcm) ;
|
||||
__appended_data = __itcm_lma + SIZEOF(.itcm) ;
|
||||
|
||||
.sbss __sbss_lma : AT (__sbss_lma)
|
||||
{
|
||||
__sbss_start = ABSOLUTE(.);
|
||||
*(.sbss)
|
||||
. = ALIGN(4);
|
||||
} >ewram
|
||||
__sbss_end = . ;
|
||||
|
||||
_end = . ;
|
||||
__end__ = . ;
|
||||
PROVIDE (end = _end);
|
||||
|
||||
|
||||
|
||||
/* 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 . */
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
%rename link old_link
|
||||
|
||||
*link:
|
||||
%(old_link) -T ds_arm9.ld%s
|
||||
|
||||
*startfile:
|
||||
ds_arm9_crt0%O%s crti%O%s crtbegin%O%s
|
||||
|
||||
|
|
@ -1,258 +0,0 @@
|
|||
#define PAGE_4K (0b01011 << 1)
|
||||
#define PAGE_8K (0b01100 << 1)
|
||||
#define PAGE_16K (0b01101 << 1)
|
||||
#define PAGE_32K (0b01110 << 1)
|
||||
#define PAGE_64K (0b00111 << 1)
|
||||
#define PAGE_128K (0b10000 << 1)
|
||||
#define PAGE_256K (0b10001 << 1)
|
||||
#define PAGE_512K (0b10010 << 1)
|
||||
#define PAGE_1M (0b10011 << 1)
|
||||
#define PAGE_2M (0b10100 << 1)
|
||||
#define PAGE_4M (0b10101 << 1)
|
||||
#define PAGE_8M (0b10110 << 1)
|
||||
#define PAGE_16M (0b10111 << 1)
|
||||
#define PAGE_32M (0b11000 << 1)
|
||||
#define PAGE_64M (0b11001 << 1)
|
||||
#define PAGE_128M (0b11010 << 1)
|
||||
#define PAGE_256M (0b11011 << 1)
|
||||
#define PAGE_512M (0b11100 << 1)
|
||||
#define PAGE_1G (0b11101 << 1)
|
||||
#define PAGE_2G (0b11110 << 1)
|
||||
#define PAGE_4G (0b11111 << 1)
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
.section ".init"
|
||||
.global _start
|
||||
@---------------------------------------------------------------------------------
|
||||
.align 4
|
||||
.arm
|
||||
@---------------------------------------------------------------------------------
|
||||
_start:
|
||||
@---------------------------------------------------------------------------------
|
||||
mov r0, #0x04000000 @ IME = 0;
|
||||
add r0, r0, #0x208
|
||||
strh r0, [r0]
|
||||
|
||||
mov r1,#0 @ enable arm9 iwram
|
||||
strb r1,[r0, #(0x247 - 0x208)]
|
||||
|
||||
ldr r1, =0x00002078 @ disable DTCM and protection unit
|
||||
mcr p15, 0, r1, c1, c0
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ Protection Unit Setup added by Sasq
|
||||
@---------------------------------------------------------------------------------
|
||||
@ Disable cache
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c5, 0 @ Instruction cache
|
||||
mcr p15, 0, r0, c7, c6, 0 @ Data cache
|
||||
|
||||
@ Wait for write buffer to empty
|
||||
mcr p15, 0, r0, c7, c10, 4
|
||||
|
||||
ldr r0, =0x0080000A
|
||||
mcr p15, 0, r0, c9, c1 @ TCM base = 0x00800*4096, size = 16 KB
|
||||
@---------------------------------------------------------------------------------
|
||||
@ Setup memory regions similar to Release Version
|
||||
@ this code currently breaks dualis
|
||||
@---------------------------------------------------------------------------------
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Region 0 - IO registers
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_64M | 0x04000000 | 1)
|
||||
mcr p15, 0, r0, c6, c0, 0
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Region 1 - Main Memory
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_4M | 0x02000000 | 1)
|
||||
mcr p15, 0, r0, c6, c1, 0
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Region 2 - iwram
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_32K | 0x037F8000 | 1)
|
||||
mcr p15, 0, r0, c6, c2, 0
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Region 3 - DS Accessory (GBA Cart)
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_128M | 0x08000000 | 1)
|
||||
mcr p15, 0, r0, c6, c3, 0
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Region 4 - DTCM
|
||||
@-------------------------------------------------------------------------
|
||||
@ldr r0,=( PAGE_16K | 0x027C0000 | 1)
|
||||
ldr r0,=( PAGE_16K | 0x00800000 | 1)
|
||||
mcr p15, 0, r0, c6, c4, 0
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Region 5 - ITCM
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_32K | 0x00000000 | 1)
|
||||
mcr p15, 0, r0, c6, c5, 0
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Region 6 - System ROM
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_32K | 0xFFFF0000 | 1)
|
||||
mcr p15, 0, r0, c6, c6, 0
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Region 7 - IPC
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=( PAGE_4K | 0x027FF000 | 1)
|
||||
mcr p15, 0, r0, c6, c7, 0
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Write buffer enable
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=0b00000110
|
||||
mcr p15, 0, r0, c3, c0, 0
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ DCache & ICache enable
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=0b01000110
|
||||
ldr r0,=0x42
|
||||
mcr p15, 0, r0, c2, c0, 0
|
||||
mcr p15, 0, r0, c2, c0, 1
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ IAccess
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=0x06606333
|
||||
mcr p15, 0, r0, c5, c0, 3
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ DAccess
|
||||
@-------------------------------------------------------------------------
|
||||
ldr r0,=0x36033333
|
||||
mcr p15, 0, r0, c5, c0, 2
|
||||
|
||||
@-------------------------------------------------------------------------
|
||||
@ Enable ICache, DCache, ITCM & DTCM
|
||||
@-------------------------------------------------------------------------
|
||||
mrc p15, 0, r0, c1, c0, 0
|
||||
ldr r1,=0x55005
|
||||
orr r0,r0,r1
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
|
||||
mov r0, #0x12 @ Switch to IRQ Mode
|
||||
msr cpsr, r0
|
||||
ldr sp, =__sp_irq @ Set IRQ stack
|
||||
|
||||
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 r1, =__data_lma @ Copy initialized data (data section) from LMA to VMA (ROM to RAM)
|
||||
ldr r2, =__data_start
|
||||
ldr r4, =__data_end
|
||||
bl CopyMemCheck
|
||||
|
||||
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 CopyMemCheck
|
||||
|
||||
ldr r1, =__itcm_lma @ Copy instruction tightly coupled memory (itcm section) from LMA to VMA (ROM to RAM)
|
||||
ldr r2, =__itcm_start
|
||||
ldr r4, =__itcm_end
|
||||
bl CopyMemCheck
|
||||
|
||||
ldr r1, =__dtcm_lma @ Copy data tightly coupled memory (dtcm section) from LMA to VMA (ROM to RAM)
|
||||
ldr r2, =__dtcm_start
|
||||
ldr r4, =__dtcm_end
|
||||
bl CopyMemCheck
|
||||
|
||||
ldr r0, =__bss_start @ Clear BSS section
|
||||
ldr r1, =__bss_end
|
||||
sub r1, r1, r0
|
||||
bl ClearMem
|
||||
|
||||
ldr r0, =__sbss_start @ Clear SBSS section
|
||||
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
|
||||
|
||||
mov r0, #0 @ int argc
|
||||
mov r1, #0 @ char *argv[]
|
||||
ldr r3, =main
|
||||
bl _call_via_r3 @ jump to user code
|
||||
|
||||
@ If the user ever returns, go to an infinte loop
|
||||
ldr r0, =ILoop
|
||||
ldr r0, [r0]
|
||||
ldr r1, =0x027FFE78
|
||||
str r0, [r1]
|
||||
bx r1
|
||||
ILoop:
|
||||
b ILoop
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ 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
|
||||
|
||||
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
|
||||
@---------------------------------------------------------------------------------
|
||||
CopyMemCheck:
|
||||
@---------------------------------------------------------------------------------
|
||||
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
|
||||
CIDLoop:
|
||||
ldmia r1!, {r0}
|
||||
stmia r2!, {r0}
|
||||
subs r3, r3, #4
|
||||
bne CIDLoop
|
||||
|
||||
bx lr
|
||||
@---------------------------------------------------------------------------------
|
||||
.align
|
||||
.pool
|
||||
.end
|
||||
@---------------------------------------------------------------------------------
|
||||
|
|
@ -1,197 +0,0 @@
|
|||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||
OUTPUT_ARCH(arm)
|
||||
ENTRY(_start)
|
||||
|
||||
MEMORY {
|
||||
|
||||
rom : ORIGIN = 0x08000000, LENGTH = 32M
|
||||
iwram : ORIGIN = 0x03800000, LENGTH = 64K
|
||||
ewram : ORIGIN = 0x02000000, LENGTH = 4M
|
||||
}
|
||||
__iwram_start = 0x03800000;
|
||||
|
||||
__ewram_start = 0x02000000;
|
||||
__eheap_end = 0x02040000;
|
||||
__sp_irq = 0x03810000 - 0x60;
|
||||
__sp_svc = __sp_irq - 0x100;
|
||||
__sp_usr = __sp_svc - 0x100;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.init :
|
||||
{
|
||||
__text_start = . ;
|
||||
KEEP (*(.init))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >rom = 0xff
|
||||
.plt : { *(.plt) } >rom = 0xff
|
||||
|
||||
.text : /* ALIGN (4): */
|
||||
{
|
||||
|
||||
*(EXCLUDE_FILE (*text.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
|
||||
|
||||
.fini :
|
||||
{
|
||||
KEEP (*(.fini))
|
||||
} >rom =0xff
|
||||
|
||||
__text_end = . ;
|
||||
|
||||
.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 = 0xff
|
||||
|
||||
.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 = 0xff
|
||||
|
||||
.eh_frame :
|
||||
{
|
||||
KEEP (*(.eh_frame))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >rom = 0xff
|
||||
|
||||
.gcc_except_table :
|
||||
{
|
||||
*(.gcc_except_table)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >rom = 0xff
|
||||
.jcr : { KEEP (*(.jcr)) } >rom = 0
|
||||
.got : { *(.got.plt) *(.got) } >rom = 0
|
||||
|
||||
__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);
|
||||
} >ewram
|
||||
__sbss_end = . ;
|
||||
|
||||
_end = . ;
|
||||
__end__ = . ;
|
||||
PROVIDE (end = _end);
|
||||
|
||||
__iwram_lma = __ewram_lma + SIZEOF(.ewram) + SIZEOF(.sbss);
|
||||
|
||||
.iwram __iwram_start : AT (__iwram_lma)
|
||||
{
|
||||
__iwram_start = ABSOLUTE(.) ;
|
||||
*(.iwram)
|
||||
*iwram.*(.text)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >iwram = 0xff
|
||||
|
||||
__iwram_end = . ;
|
||||
__data_lma = __iwram_lma + SIZEOF(.iwram) ;
|
||||
|
||||
|
||||
.data ALIGN(4) : AT (__data_lma)
|
||||
{
|
||||
__data_start = ABSOLUTE(.);
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.gnu.linkonce.d*)
|
||||
CONSTRUCTORS
|
||||
. = ALIGN(4);
|
||||
} >iwram = 0xff
|
||||
|
||||
__data_end = . ;
|
||||
__appended_data = __data_lma + SIZEOF(.data) ;
|
||||
|
||||
|
||||
.bss ALIGN(4) :
|
||||
{
|
||||
__bss_start = ABSOLUTE(.);
|
||||
__bss_start__ = ABSOLUTE(.);
|
||||
*(.dynbss)
|
||||
*(.gnu.linkonce.b*)
|
||||
*(COMMON)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >iwram
|
||||
|
||||
__bss_end = . ;
|
||||
__bss_end__ = . ;
|
||||
|
||||
/* 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 . */
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
%rename link old_link
|
||||
|
||||
*link:
|
||||
%(old_link) -T ds_cart.ld%s
|
||||
|
||||
*startfile:
|
||||
ds_cart_crt0%O%s crti%O%s crtbegin%O%s
|
||||
|
||||
|
|
@ -1,161 +0,0 @@
|
|||
@---------------------------------------------------------------------------------
|
||||
.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)
|
||||
|
||||
rom_header_end:
|
||||
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)
|
||||
__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
|
||||
@---------------------------------------------------------------------------------
|
||||
start_vector:
|
||||
@---------------------------------------------------------------------------------
|
||||
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, #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
|
||||
|
||||
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, =__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
|
||||
|
||||
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
|
||||
|
||||
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?
|
||||
@---------------------------------------------------------------------------------
|
||||
@ 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
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
CIDLoop:
|
||||
@---------------------------------------------------------------------------------
|
||||
ldmia r1!, {r0}
|
||||
stmia r2!, {r0}
|
||||
subs r3, r3, #4
|
||||
bne CIDLoop
|
||||
bx lr
|
||||
@---------------------------------------------------------------------------------
|
||||
.align
|
||||
.pool
|
||||
@---------------------------------------------------------------------------------
|
||||
.end
|
||||
@---------------------------------------------------------------------------------
|
||||
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
@---------------------------------------------------------------------------------
|
||||
@ nintendo e-reader startup code
|
||||
@---------------------------------------------------------------------------------
|
||||
@ author : tim schuerewegen
|
||||
@ version : 1.0
|
||||
@---------------------------------------------------------------------------------
|
||||
.section ".init"
|
||||
.global _start
|
||||
.align
|
||||
.arm
|
||||
@---------------------------------------------------------------------------------
|
||||
_start:
|
||||
@---------------------------------------------------------------------------------
|
||||
b start_vector
|
||||
.long 0
|
||||
.long 0x02000000
|
||||
|
||||
start_vector:
|
||||
@ enter thumb mode
|
||||
adr r0, _start_thumb + 1
|
||||
bx r0
|
||||
|
||||
.thumb
|
||||
|
||||
_start_thumb:
|
||||
|
||||
@ save return address (rom)
|
||||
mov r3, lr
|
||||
|
||||
@ clear bss section
|
||||
ldr r0, =__bss_start
|
||||
ldr r1, =__bss_end
|
||||
mov r2, #0
|
||||
_loop_bss_clear:
|
||||
strb r2, [r0]
|
||||
add r0, #1
|
||||
cmp r0, r1
|
||||
blt _loop_bss_clear
|
||||
|
||||
@ set return address (rom)
|
||||
mov lr, r3
|
||||
|
||||
@ jump to main
|
||||
ldr r3, =main
|
||||
bx r3
|
||||
|
||||
.align
|
||||
|
||||
.pool
|
||||
|
||||
.end
|
||||
|
||||
.align
|
||||
.pool
|
||||
.end
|
||||
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
%rename link old_link
|
||||
|
||||
*link:
|
||||
%(old_link) -T gba_cart.ld%s
|
||||
|
||||
*startfile:
|
||||
gba_crt0%O%s crti%O%s crtbegin%O%s
|
||||
|
||||
|
|
@ -1,298 +0,0 @@
|
|||
/* Linker Script Original v1.3 by Jeff Frohwein */
|
||||
/* v1.0 - Original release */
|
||||
/* v1.1 - Added proper .data section support */
|
||||
/* v1.2 - Added support for c++ & iwram overlays */
|
||||
/* - Major contributions by Jason Wilkins. */
|
||||
/* v1.3 - .ewram section now can be used when */
|
||||
/* compiling for MULTIBOOT mode. This fixes */
|
||||
/* malloc() in DevKitAdvance which depends */
|
||||
/* on __eheap_start instead of end to define*/
|
||||
/* the starting location of heap space. */
|
||||
/* External global variable __gba_iwram_heap*/
|
||||
/* support added to allow labels end, _end, */
|
||||
/* & __end__ to point to end of iwram or */
|
||||
/* the end of ewram. */
|
||||
/* Additions by WinterMute */
|
||||
/* v1.4 - .sbss section added for unitialised */
|
||||
/* data in ewram */
|
||||
/* v1.5 - padding section added to stop EZF */
|
||||
/* stripping important data */
|
||||
|
||||
/* This file is released into the public domain */
|
||||
/* for commercial or non-commercial use with no */
|
||||
/* restrictions placed upon it. */
|
||||
|
||||
/* NOTE!!!: This linker script defines the RAM & */
|
||||
/* ROM start addresses. In order for it to work */
|
||||
/* properly, remove -Ttext and -Tbss linker */
|
||||
/* options from your makefile if they are */
|
||||
/* present. */
|
||||
|
||||
/* You can use the following to view section */
|
||||
/* addresses in your .elf file: */
|
||||
/* objdump -h file.elf */
|
||||
/* Please note that empty sections may incorrectly*/
|
||||
/* list the lma address as the vma address for */
|
||||
/* some versions of objdump. */
|
||||
|
||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||
OUTPUT_ARCH(arm)
|
||||
ENTRY(_start)
|
||||
/* SEARCH_DIR(/bin/arm); */
|
||||
|
||||
/* 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. */
|
||||
|
||||
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;
|
||||
__iwram_end = 0x3008000;
|
||||
|
||||
__sp_irq = __iwram_end - 0x100;
|
||||
__sp_usr = __sp_irq - 0x100;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = __text_start;
|
||||
.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. */
|
||||
} >iwram
|
||||
|
||||
__bss_end = . ;
|
||||
__bss_end__ = . ;
|
||||
|
||||
.data ALIGN(4) : AT (__data_lma)
|
||||
{
|
||||
__data_start = ABSOLUTE(.);
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.gnu.linkonce.d*)
|
||||
CONSTRUCTORS
|
||||
. = ALIGN(4);
|
||||
} >iwram = 0xff
|
||||
|
||||
__iwram_overlay_lma = __data_lma + SIZEOF(.data);
|
||||
|
||||
__data_end = .;
|
||||
__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
|
||||
|
||||
__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 = . ;
|
||||
|
||||
__ewram_start = 0x2000000;
|
||||
.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);
|
||||
} >ewram
|
||||
|
||||
__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);}
|
||||
}>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);
|
||||
|
||||
/* EZF Advance strips trailing 0xff bytes, add a pad section so nothing important is removed */
|
||||
.pad ALIGN(4) : AT (__pad_lma)
|
||||
{
|
||||
LONG(0x52416b64)
|
||||
LONG(0x4d)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} = 0xff
|
||||
|
||||
__ewram_overlay_end = . ;
|
||||
__eheap_start = . ;
|
||||
|
||||
_end = .;
|
||||
__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 . */
|
||||
}
|
||||
|
|
@ -1,248 +0,0 @@
|
|||
.section ".init"
|
||||
.global _start
|
||||
.align
|
||||
.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)
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
rom_header_end:
|
||||
@---------------------------------------------------------------------------------
|
||||
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)
|
||||
@---------------------------------------------------------------------------------
|
||||
__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
|
||||
|
||||
.global start_vector
|
||||
.align
|
||||
@---------------------------------------------------------------------------------
|
||||
start_vector:
|
||||
@---------------------------------------------------------------------------------
|
||||
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
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ Enter Thumb mode
|
||||
@---------------------------------------------------------------------------------
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
bl CopyMem
|
||||
|
||||
bx r6 @ Jump to the code to execute
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
DoEWRAMClear: @ Clear External WRAM to 0x00
|
||||
@---------------------------------------------------------------------------------
|
||||
mov r1, #0x40
|
||||
lsl r1, #12 @ r1 = 0x40000
|
||||
lsl r0, r1, #7 @ r0 = 0x2000000
|
||||
bl ClearMem
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
SkipEWRAMClear: @ Clear Internal WRAM to 0x00
|
||||
@---------------------------------------------------------------------------------
|
||||
mov r0, #3
|
||||
lsl r0, #24 @ r0 = 0x3000000
|
||||
ldr r1, =__iwram_end
|
||||
sub r1,r0
|
||||
bl ClearMem
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ Clear SBSS section to 0x00
|
||||
@---------------------------------------------------------------------------------
|
||||
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
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ 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
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ 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,= __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
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ 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, =__ewram_overlay_start
|
||||
bl CopyMem
|
||||
@---------------------------------------------------------------------------------
|
||||
CEW0Skip:
|
||||
@---------------------------------------------------------------------------------
|
||||
@ set heap end
|
||||
@---------------------------------------------------------------------------------
|
||||
ldr r1, =fake_heap_end
|
||||
ldr r0, =__eheap_end
|
||||
str r0, [r1]
|
||||
@---------------------------------------------------------------------------------
|
||||
@ global constructors
|
||||
@---------------------------------------------------------------------------------
|
||||
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
|
||||
@---------------------------------------------------------------------------------
|
||||
@ Clear memory to 0x00 if length != 0
|
||||
@---------------------------------------------------------------------------------
|
||||
@ r0 = Start Address
|
||||
@ r1 = Length
|
||||
@---------------------------------------------------------------------------------
|
||||
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.
|
||||
|
||||
beq ClearMX @ Length is zero so exit
|
||||
|
||||
mov r2,#0
|
||||
@---------------------------------------------------------------------------------
|
||||
ClrLoop:
|
||||
@---------------------------------------------------------------------------------
|
||||
stmia r0!, {r2}
|
||||
sub r1,#4
|
||||
bne ClrLoop
|
||||
@---------------------------------------------------------------------------------
|
||||
ClearMX:
|
||||
@---------------------------------------------------------------------------------
|
||||
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?
|
||||
@---------------------------------------------------------------------------------
|
||||
@ Copy memory
|
||||
@---------------------------------------------------------------------------------
|
||||
@ r1 = Source 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
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
CIDLoop:
|
||||
@---------------------------------------------------------------------------------
|
||||
ldmia r1!, {r0}
|
||||
stmia r2!, {r0}
|
||||
sub r3, #4
|
||||
bne CIDLoop
|
||||
@---------------------------------------------------------------------------------
|
||||
CIDExit:
|
||||
@---------------------------------------------------------------------------------
|
||||
bx lr
|
||||
|
||||
.align
|
||||
.pool
|
||||
.end
|
||||
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
/***********************************/
|
||||
/* NINTENDO E-READER LINKER SCRIPT */
|
||||
/***********************************/
|
||||
/* Author : Tim Schuerewegen */
|
||||
/* Version : 1.0 */
|
||||
/***********************************/
|
||||
|
||||
OUTPUT_FORMAT( "elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||
OUTPUT_ARCH( arm)
|
||||
ENTRY( _start)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x02000000;
|
||||
|
||||
.init :
|
||||
{
|
||||
*(.init)
|
||||
. = ALIGN(4);
|
||||
} = 0xff
|
||||
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
. = ALIGN(4);
|
||||
} = 0xff
|
||||
|
||||
.rodata :
|
||||
{
|
||||
*(.rodata)
|
||||
. = ALIGN(4);
|
||||
} = 0xff
|
||||
|
||||
.data :
|
||||
{
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
} = 0xff
|
||||
|
||||
.bss :
|
||||
{
|
||||
__bss_start = .;
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
}
|
||||
__bss_end = .;
|
||||
|
||||
__end = .;
|
||||
}
|
||||
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
%rename link old_link
|
||||
%rename endfile old_endfile
|
||||
|
||||
*link:
|
||||
-T gba_er.ld%s %(old_link)
|
||||
|
||||
*startfile:
|
||||
er_crt0%O%s
|
||||
|
|
@ -1,284 +0,0 @@
|
|||
/* Linker Script Original v1.3 by Jeff Frohwein */
|
||||
/* v1.0 - Original release */
|
||||
/* v1.1 - Added proper .data section support */
|
||||
/* v1.2 - Added support for c++ & iwram overlays */
|
||||
/* - Major contributions by Jason Wilkins. */
|
||||
/* v1.3 - .ewram section now can be used when */
|
||||
/* compiling for MULTIBOOT mode. This fixes */
|
||||
/* malloc() in DevKitAdvance which depends */
|
||||
/* on __eheap_start instead of end to define*/
|
||||
/* the starting location of heap space. */
|
||||
/* External global variable __gba_iwram_heap*/
|
||||
/* support added to allow labels end, _end, */
|
||||
/* & __end__ to point to end of iwram or */
|
||||
/* the end of ewram. */
|
||||
/* Additions by WinterMute */
|
||||
/* v1.4 - .sbss section added for unitialised */
|
||||
/* 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 */
|
||||
/* restrictions placed upon it. */
|
||||
|
||||
/* NOTE!!!: This linker script defines the RAM & */
|
||||
/* ROM start addresses. In order for it to work */
|
||||
/* properly, remove -Ttext and -Tbss linker */
|
||||
/* options from your makefile if they are */
|
||||
/* present. */
|
||||
|
||||
/* You can use the following to view section */
|
||||
/* addresses in your .elf file: */
|
||||
/* objdump -h file.elf */
|
||||
/* Please note that empty sections may incorrectly*/
|
||||
/* list the lma address as the vma address for */
|
||||
/* some versions of objdump. */
|
||||
|
||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||
OUTPUT_ARCH(arm)
|
||||
ENTRY(_start)
|
||||
|
||||
MEMORY {
|
||||
|
||||
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);
|
||||
} >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
|
||||
|
||||
__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 = .;
|
||||
|
||||
__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);}
|
||||
} >ewram = 0xff
|
||||
|
||||
__ewram_overlay_end = . ;
|
||||
|
||||
__eheap_start = . ;
|
||||
|
||||
_end = .;
|
||||
__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 . */
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
%rename link old_link
|
||||
|
||||
*link:
|
||||
-T gba_mb.ld%s %(old_link)
|
||||
|
||||
*startfile:
|
||||
gba_crt0%O%s crti%O%s crtbegin%O%s
|
||||
|
||||
|
|
@ -1,152 +0,0 @@
|
|||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||
OUTPUT_ARCH(arm)
|
||||
ENTRY(_start)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
ram : ORIGIN = 0xc000000, LENGTH = 8M
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.init :
|
||||
{
|
||||
__text_start = . ;
|
||||
KEEP (*(.init))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ram = 0xff
|
||||
.plt : { *(.plt) } >ram = 0xff
|
||||
|
||||
.text : /* ALIGN (4): */
|
||||
{
|
||||
|
||||
*(EXCLUDE_FILE (*text.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. */
|
||||
} >ram = 0xff
|
||||
.fini :
|
||||
{
|
||||
KEEP (*(.fini))
|
||||
} >ram =0xff
|
||||
|
||||
__text_end = . ;
|
||||
|
||||
.rodata :
|
||||
{
|
||||
*(.rodata)
|
||||
*all.rodata*(*)
|
||||
*(.roda)
|
||||
*(.rodata.*)
|
||||
*(.gnu.linkonce.r*)
|
||||
SORT(CONSTRUCTORS)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ram = 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. */
|
||||
} >ram = 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. */
|
||||
} >ram = 0
|
||||
|
||||
.eh_frame :
|
||||
{
|
||||
KEEP (*(.eh_frame))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ram = 0
|
||||
|
||||
.gcc_except_table :
|
||||
{
|
||||
*(.gcc_except_table)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ram = 0
|
||||
.jcr : { KEEP (*(.jcr)) } >ram = 0
|
||||
.got : { *(.got.plt) *(.got) } >ram = 0
|
||||
__ro_end = . ;
|
||||
|
||||
.data ALIGN(4) :
|
||||
{
|
||||
__data_start = ABSOLUTE(.);
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.gnu.linkonce.d*)
|
||||
CONSTRUCTORS
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ram = 0xff
|
||||
|
||||
__data_end = . ;
|
||||
|
||||
.bss ALIGN(4) :
|
||||
{
|
||||
__bss_start = ABSOLUTE(.);
|
||||
/* __bss_start__ = ABSOLUTE(.); */
|
||||
*(.dynbss)
|
||||
*(.gnu.linkonce.b*)
|
||||
*(COMMON)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} > ram
|
||||
__bss_end = . ;
|
||||
|
||||
_end = . ;
|
||||
__end__ = . ;
|
||||
PROVIDE (end = _end);
|
||||
|
||||
/* 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 . */
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
%rename link old_link
|
||||
|
||||
*link:
|
||||
%(old_link) -T gp32.ld%s
|
||||
|
||||
*startfile:
|
||||
gp32_crt0%O%s crti%O%s crtbegin%O%s
|
||||
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
.section ".init"
|
||||
.code 32
|
||||
.align
|
||||
.global _start
|
||||
@---------------------------------------------------------------------------------
|
||||
_start:
|
||||
@---------------------------------------------------------------------------------
|
||||
b _start2
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ AXF addresses
|
||||
@---------------------------------------------------------------------------------
|
||||
_text_start:
|
||||
.word __text_start
|
||||
_ro_end:
|
||||
.word __ro_end
|
||||
_data_start:
|
||||
.word __data_start
|
||||
.word __bss_end
|
||||
_bss_start:
|
||||
.word __bss_start
|
||||
_bss_end:
|
||||
.word __bss_end
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ GamePark magic sequence
|
||||
@---------------------------------------------------------------------------------
|
||||
.word 0x44450011
|
||||
.word 0x44450011
|
||||
.word 0x01234567
|
||||
.word 0x12345678
|
||||
.word 0x23456789
|
||||
.word 0x34567890
|
||||
.word 0x45678901
|
||||
.word 0x56789012
|
||||
.word 0x23456789
|
||||
.word 0x34567890
|
||||
.word 0x45678901
|
||||
.word 0x56789012
|
||||
.word 0x23456789
|
||||
.word 0x34567890
|
||||
.word 0x45678901
|
||||
.word 0x56789012
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
_start2:
|
||||
@---------------------------------------------------------------------------------
|
||||
mrs r0, CPSR
|
||||
orr r0, r0, #0xC0
|
||||
msr CPSR_ctl, r0
|
||||
|
||||
mrs r0, CPSR
|
||||
bic r0, r0, #0xC0
|
||||
orr r0, r0, #0x40
|
||||
msr CPSR_ctl,r0
|
||||
|
||||
@---------------------------------------------------------------------------------
|
||||
@ global constructors
|
||||
@---------------------------------------------------------------------------------
|
||||
ldr r3,=_call_main
|
||||
mov lr,r3
|
||||
ldr r3,=_init
|
||||
bx r3
|
||||
@---------------------------------------------------------------------------------
|
||||
@ Jump to user code
|
||||
@---------------------------------------------------------------------------------
|
||||
_call_main:
|
||||
@---------------------------------------------------------------------------------
|
||||
mov lr, #0
|
||||
ldr r3, =main
|
||||
bx r3
|
||||
|
||||
.pool
|
||||
.end
|
||||
|
|
@ -1,197 +0,0 @@
|
|||
/* GP32 Linker Script v1.2 by Jeff F */
|
||||
/* v1.0 - Original release */
|
||||
/* v1.1 - Cleaned up and added MEMORY command */
|
||||
/* v1.2 - DJWillis - Added propper .init and */
|
||||
/* .fini for GCC 3.3.2 and above */
|
||||
/* */
|
||||
/* This file is released into the public domain */
|
||||
/* for commercial or non-commercial use with no */
|
||||
/* restrictions placed upon it. */
|
||||
/* */
|
||||
/* NOTE!!!: This linker script defines the RAM */
|
||||
/* start addresses. In order for it to work */
|
||||
/* properly, remove -Ttext and -Tbss linker */
|
||||
/* options from your makefile if they are */
|
||||
/* present. */
|
||||
/* */
|
||||
/* You can use the following to view section */
|
||||
/* addresses in your .elf file: */
|
||||
/* objdump -h file.elf */
|
||||
/* */
|
||||
/* Please note that empty sections may incorrectly*/
|
||||
/* list the lma address as the vma address for */
|
||||
/* some versions of objdump. */
|
||||
|
||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||
OUTPUT_ARCH(arm)
|
||||
ENTRY(_start)
|
||||
/* SEARCH_DIR(/bin/arm); */
|
||||
|
||||
/* Then use it like this: IWRAMHEAP */
|
||||
/* 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. */
|
||||
|
||||
/* The linker script MEMORY directive is not used here due */
|
||||
/* to the fact that __text_start is not always a fixed value. */
|
||||
|
||||
MEMORY
|
||||
{
|
||||
ram : ORIGIN = 0xc000000, LENGTH = 8M
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text : /* ALIGN (4): */
|
||||
{
|
||||
__text_start = . ;
|
||||
|
||||
*(EXCLUDE_FILE (*text.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. */
|
||||
} >ram = 0xff
|
||||
|
||||
__text_end = . ;
|
||||
|
||||
|
||||
.init :
|
||||
{
|
||||
*(.init)
|
||||
} > ram = 0xff
|
||||
|
||||
.jcr :
|
||||
{
|
||||
*(.jcr)
|
||||
} > ram = 0xff
|
||||
|
||||
.fini :
|
||||
{
|
||||
*(.fini)
|
||||
} > ram = 0xff
|
||||
|
||||
.rodata :
|
||||
{
|
||||
*(.rodata)
|
||||
*all.rodata*(*)
|
||||
*(.roda)
|
||||
*(.rodata.*)
|
||||
*(.gnu.linkonce.r*)
|
||||
SORT(CONSTRUCTORS)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ram = 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. */
|
||||
} >ram = 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. */
|
||||
} >ram = 0
|
||||
|
||||
.eh_frame :
|
||||
{
|
||||
KEEP (*(.eh_frame))
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ram = 0
|
||||
|
||||
.gcc_except_table :
|
||||
{
|
||||
*(.gcc_except_table)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ram = 0
|
||||
__ro_end = . ;
|
||||
|
||||
.data ALIGN(4) :
|
||||
{
|
||||
__data_start = ABSOLUTE(.);
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.gnu.linkonce.d*)
|
||||
CONSTRUCTORS
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} >ram = 0xff
|
||||
|
||||
__data_end = . ;
|
||||
|
||||
.bss ALIGN(4) :
|
||||
{
|
||||
__bss_start = ABSOLUTE(.);
|
||||
/* __bss_start__ = ABSOLUTE(.); */
|
||||
*(.dynbss)
|
||||
*(.gnu.linkonce.b*)
|
||||
*(COMMON)
|
||||
. = ALIGN(4); /* REQUIRED. LD is flaky without it. */
|
||||
} > ram
|
||||
__bss_end = . ;
|
||||
|
||||
__eheap_start = . ; /* Needed by DevKitAdvance. Start of malloc() heap for DKA. */
|
||||
|
||||
_end = . ;
|
||||
__end__ = . ;
|
||||
PROVIDE (end = _end);
|
||||
|
||||
__eheap_end = . ;
|
||||
|
||||
/* 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 . */
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
%rename link old_link
|
||||
|
||||
*link:
|
||||
%(old_link) -T gp32_gpsdk.ld%s
|
||||
|
||||
*startfile:
|
||||
gp32_gpsdk_crt0%O%s crti%O%s crtbegin%O%s
|
||||
|
||||
|
|
@ -1,246 +0,0 @@
|
|||
@****************************************************
|
||||
@* gp32 crt0.S v1.0 by Jeff F *
|
||||
@****************************************************
|
||||
|
||||
@ v1.0 - Original release
|
||||
@
|
||||
@ This file is released into the public domain for commercial
|
||||
@ or non-commercial usage with no restrictions placed upon it.
|
||||
|
||||
.TEXT
|
||||
|
||||
@ Note: Normally it is the job of crt0.S to clear the BSS
|
||||
@ (Zero Initialized) section to 0x00, but in the case of
|
||||
@ the gp32 we do not have to do this because it is done
|
||||
@ by the gp32 bios after it loads the app.
|
||||
|
||||
@ The official sdt dev kit uses 'Main ()' as the entry
|
||||
@ point. If you would rather use 'main ()' instead then
|
||||
@ comment out the next line.
|
||||
@
|
||||
@ You have to use 'main ()' at some point in your program
|
||||
@ if you want to do c++ code. GCC will do a call to constructor
|
||||
@ setup before executing 'main ()'. Using 'main ()' also increases
|
||||
@ your program size by ~5500 bytes.
|
||||
|
||||
@ .equ __OfficialEntry, 1
|
||||
|
||||
@ The official sdt dev kit initializes various things in init.o
|
||||
@ Crt0.S performs similar tasks for compatibility. If you don't
|
||||
@ wish to use the official libs, or those that are compatible,
|
||||
@ then you need to comment out the next line to prevent link errors.
|
||||
|
||||
.equ __OfficialInits, 1
|
||||
|
||||
|
||||
.GLOBAL _start
|
||||
_start:
|
||||
.ALIGN
|
||||
.CODE 32
|
||||
|
||||
@ Start Vector
|
||||
|
||||
b _GpInit
|
||||
|
||||
.word __text_start @ Start of text (Read Only) section
|
||||
_roe: .word __ro_end @ End "
|
||||
_rws: .word __data_start @ Start of data (Read/Write) section
|
||||
.word __bss_end @ End of bss (this is the way sdt does it for some reason)
|
||||
_zis: .word __bss_start @ Start of bss (Zero Initialized) section
|
||||
_zie: .word __bss_end @ End "
|
||||
|
||||
.word 0x44450011
|
||||
.word 0x44450011
|
||||
|
||||
.word 0x01234567
|
||||
.word 0x12345678
|
||||
.word 0x23456789
|
||||
.word 0x34567890
|
||||
.word 0x45678901
|
||||
.word 0x56789012
|
||||
.word 0x23456789
|
||||
.word 0x34567890
|
||||
.word 0x45678901
|
||||
.word 0x56789012
|
||||
.word 0x23456789
|
||||
.word 0x34567890
|
||||
.word 0x45678901
|
||||
.word 0x56789012
|
||||
|
||||
_GpInit:
|
||||
mrs r0,CPSR
|
||||
orr r0,r0,#0xc0
|
||||
msr CPSR_fsxc,r0
|
||||
|
||||
.ifdef __OfficialInits
|
||||
|
||||
@ Call function in user_init.s
|
||||
@ bl asm_user_entry
|
||||
|
||||
@ Get pointer to GpSurfaceSet routine
|
||||
mov r0,#0
|
||||
swi 0xb
|
||||
ldr r1,=GpSurfaceSet
|
||||
ldr r2,=GpSurfaceFlip
|
||||
str r0,[r1]
|
||||
str r0,[r2]
|
||||
|
||||
@ Get time passed
|
||||
mov r0,#6
|
||||
swi 0xb
|
||||
ldr r1,=_timepassed
|
||||
str r0,[r1]
|
||||
|
||||
@ Get button stuff
|
||||
mov r0,#0
|
||||
swi 0x10
|
||||
ldr r2,=_reg_io_key_a
|
||||
ldr r3,=_reg_io_key_b
|
||||
str r0,[r2]
|
||||
str r1,[r3]
|
||||
|
||||
@ Set heap start location
|
||||
ldr r0,_zie
|
||||
ldr r1,=HEAPSTART
|
||||
str r0,[r1]
|
||||
|
||||
@ Set heap end location
|
||||
mov r0,#5
|
||||
swi 0xb
|
||||
ldr r1,=HEAPEND
|
||||
sub r0,r0,#255
|
||||
bic r0,r0,#3
|
||||
str r0,[r1]
|
||||
|
||||
@ Set App Argument
|
||||
swi 0x15
|
||||
|
||||
mov r10,r0
|
||||
mov r11,r1 @ possibly not needed but left in anyway
|
||||
|
||||
mrs r0,CPSR
|
||||
bic r0,r0,#192
|
||||
orr r0,r0,#64
|
||||
msr CPSR_fsxc,r0
|
||||
|
||||
mov r0,r10
|
||||
mov r1,r11 @ possibly not needed but left in anyway
|
||||
.endif
|
||||
|
||||
@ Jump to Main ()
|
||||
|
||||
.ifdef __OfficialEntry
|
||||
ldr r3,=Main
|
||||
.else
|
||||
ldr r3,=main
|
||||
.endif
|
||||
bx r3 @ Init.o uses 'mov pc,r3' but
|
||||
@ 'bx r3' is used here instead. This way
|
||||
@ the main function can be ARM or Thumb.
|
||||
|
||||
.ifdef __OfficialInits
|
||||
|
||||
swi 0x12
|
||||
orr r1,r1,r2
|
||||
and r1,r1,r3
|
||||
eor r1,r1,r4
|
||||
mov r5,r1,lsr #4
|
||||
add r1,r1,r7
|
||||
sub r7,r7,r1
|
||||
mov r8,#0
|
||||
mov pc,r8
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
b .
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
|
||||
.GLOBAL _fw_init_for_dbg
|
||||
_fw_init_for_dbg:
|
||||
stmdb sp!,{r0-r12}
|
||||
|
||||
mov r10,lr
|
||||
mov r11,sp
|
||||
|
||||
bic r0,r0,#31 @ 0x1f
|
||||
orr r1,r0,#17 @ 0x11
|
||||
orr r2,r0,#19 @ 0x13
|
||||
msr cpsr_cxsf,r1
|
||||
mov r12,#4
|
||||
add r12,r12,pc
|
||||
msr cpsr_cxsf,r2
|
||||
swi 0x1ff
|
||||
|
||||
@ bl asm_user_entry_path
|
||||
|
||||
mov r0,r11
|
||||
mov r1,r10
|
||||
add r0,r0,#52
|
||||
ldr r2,[r0]
|
||||
mov lr,r1
|
||||
stmdb sp!,{r2}
|
||||
stmdb sp!,{r0-r12,lr}
|
||||
|
||||
@ Copy RW Base - ZI Base
|
||||
ldr r0,=_roe @ |Image$$RO$$Limit|
|
||||
ldr r3,=_zis @ |Image$$ZI$$Base|
|
||||
ldr r2,=_rws @ |Image$$RW$$Base|
|
||||
sub r3,r3,r2
|
||||
CopyRWData:
|
||||
cmp r3,#36
|
||||
blt CopyRWData2
|
||||
ldmia r0!,{r4-r12}
|
||||
stmia r2!,{r4-r12}
|
||||
sub r3,r3,#36
|
||||
b CopyRWData
|
||||
CopyRWData2:
|
||||
cmp r3,#0
|
||||
ble CopyRWData3
|
||||
ldr r4,[r0],#4
|
||||
str r4,[r2],#4
|
||||
sub r3,r3,#4
|
||||
b CopyRWData2
|
||||
CopyRWData3:
|
||||
|
||||
@ Clear ZI section
|
||||
ldr r1,=_zie @ |Image$$ZI$$Limit|
|
||||
ldr r0,=_zis @ |Image$$ZI$$Base|
|
||||
mov r2,#0
|
||||
mov r3,r2
|
||||
mov r4,r2
|
||||
mov r5,r2
|
||||
mov r6,r2
|
||||
mov r7,r2
|
||||
mov r8,r2
|
||||
mov r9,r2
|
||||
mov r10,r2
|
||||
mov r11,r2
|
||||
mov r12,r2
|
||||
CopyZIData:
|
||||
stmia r0!,{r2-r12}
|
||||
cmp r0,r1
|
||||
blt CopyZIData
|
||||
|
||||
ldmia sp!,{r0-r12,pc}
|
||||
|
||||
.endif
|
||||
|
||||
.ALIGN
|
||||
.POOL
|
||||
|
||||
|
||||
.END
|
||||
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
#---------------------------------------------------------------------------------
|
||||
# path to tools - this can be deleted if you set the path in windows
|
||||
#---------------------------------------------------------------------------------
|
||||
export PATH := $(DEVKITARM)/bin:$(PATH)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# the prefix on the compiler executables
|
||||
#---------------------------------------------------------------------------------
|
||||
PREFIX := arm-elf-
|
||||
|
||||
export CC := $(PREFIX)gcc
|
||||
export CXX := $(PREFIX)g++
|
||||
export AR := $(PREFIX)ar
|
||||
export OBJCOPY := $(PREFIX)objcopy
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.a:
|
||||
#---------------------------------------------------------------------------------
|
||||
@echo $(notdir $@)
|
||||
@$(AR) -rc $@ $^
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.o: %.cpp
|
||||
@echo $(notdir $<)
|
||||
@$(CXX) -MMD -MF $(DEPSDIR)/$*.d $(CXXFLAGS) -c $< -o $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.o: %.c
|
||||
@echo $(notdir $<)
|
||||
@$(CC) -MMD -MF $(DEPSDIR)/$*.d $(CFLAGS) -c $< -o $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.o: %.s
|
||||
@echo $(notdir $<)
|
||||
@$(CC) -MMD -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(ASFLAGS) -c $< -o $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.o: %.S
|
||||
@echo $(notdir $<)
|
||||
@$(CC) -MMD -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(ASFLAGS) -c $< -o $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# canned command sequence for binary data
|
||||
#---------------------------------------------------------------------------------
|
||||
define bin2o
|
||||
padbin 4 $(<)
|
||||
$(OBJCOPY) -I binary -O elf32-littlearm -B arm \
|
||||
--rename-section .data=.rodata,readonly,data,contents,alloc \
|
||||
--redefine-sym _binary_`(echo $(<) | sed -e 's/^\/\([a-zA-Z]\/\)/\1_/' | tr . _ | tr / _)`_start=`(echo $(<F) | tr . _)`\
|
||||
--redefine-sym _binary_`(echo $(<) | sed -e 's/^\/\([a-zA-Z]\/\)/\1_/' | tr . _ | tr / _)`_end=`(echo $(<F) | tr . _)`_end\
|
||||
--redefine-sym _binary_`(echo $(<) | sed -e 's/^\/\([a-zA-Z]\/\)/\1_/' | tr . _ | tr / _)`_size=`(echo $(<F) | tr . _)`_size\
|
||||
$(<) $(@)
|
||||
echo "extern const u32" `(echo $(<F) | tr . _)`"_end[];" > `(echo $(<F) | tr . _)`.h
|
||||
echo "extern const u8" `(echo $(<F) | tr . _)`"[];" >> `(echo $(<F) | tr . _)`.h
|
||||
echo "extern const u32" `(echo $(<F) | tr . _)`_size[]";" >> `(echo $(<F) | tr . _)`.h
|
||||
endef
|
||||
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
-include $(DEVKITARM)/base_rules
|
||||
|
||||
LIBNDS := $(DEVKITPRO)/libnds
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.ds.gba: %.nds
|
||||
@dsbuild $<
|
||||
@echo built ... $(notdir $@)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.nds: %.bin
|
||||
@ndstool -c $@ -9 $<
|
||||
@echo built ... $(notdir $@)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.bin: %.elf
|
||||
@$(OBJCOPY) -O binary $< $@
|
||||
@echo built ... $(notdir $@)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.elf:
|
||||
@echo linking binary
|
||||
@$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
-include $(DEVKITARM)/base_rules
|
||||
|
||||
LIBGBA := $(DEVKITPRO)/libgba
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.gba: %.elf
|
||||
@$(OBJCOPY) -O binary $< $@
|
||||
@echo built ... $(notdir $@)
|
||||
@gbafix $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%_mb.elf:
|
||||
@echo linking multiboot
|
||||
@$(LD) -specs=gba_mb.specs $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.elf:
|
||||
@echo linking cartridge
|
||||
@$(LD) $(LDFLAGS) -specs=gba.specs $(OFILES) $(LIBPATHS) $(LIBS) -o $@
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
-include $(DEVKITARM)/base_rules
|
||||
|
||||
LIBMIRKO := $(DEVKITPRO)/libmirko
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.fxe: %.bin
|
||||
@b2fxec -a "$(AUTHOR)" -t "$(TITLE)" $< $@
|
||||
@echo built ... $(notdir $@)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.bin: %.elf
|
||||
@$(OBJCOPY) -O binary $< $@
|
||||
@echo built ... $(notdir $@)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.elf:
|
||||
@echo linking binary
|
||||
@$(LD) $(LDFLAGS) -specs=gp32.specs $(OFILES) $(LIBPATHS) $(LIBS) -o $@
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
export DEVKITARM=$TOOLPATH/devkitARM
|
||||
export DEVKITPRO=$TOOLPATH
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Install and build the gba crt
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
cp $(pwd)/dka-crtls/* $DEVKITARM/arm-elf/lib/
|
||||
cd $DEVKITARM/arm-elf/lib/
|
||||
$MAKE CRT=gba
|
||||
$MAKE CRT=gp32
|
||||
$MAKE CRT=er
|
||||
$MAKE CRT=gp32_gpsdk
|
||||
$MAKE CRT=ds_arm7
|
||||
$MAKE CRT=ds_arm9
|
||||
$MAKE CRT=ds_cart
|
||||
|
||||
cd $BUILDSCRIPTDIR
|
||||
|
||||
$MAKE -C tools/general
|
||||
$MAKE -C tools/general install PREFIX=$DEVKITARM/bin
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# copy base rulesets
|
||||
#---------------------------------------------------------------------------------
|
||||
cp dka-rules/* $DEVKITARM
|
||||
|
||||
cd $LIBNDS_SRCDIR
|
||||
echo "building libnds ..."
|
||||
$MAKE install INSTALLDIR=$TOOLPATH
|
||||
|
||||
echo "building libgba ..."
|
||||
cd $BUILDSCRIPTDIR
|
||||
cd $LIBGBA_SRCDIR
|
||||
$MAKE install INSTALLDIR=$TOOLPATH
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
#!/bin/sh
|
||||
#---------------------------------------------------------------------------------
|
||||
# Check Parameters
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
prefix=$INSTALLDIR/devkitARM
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build and install binutils
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
mkdir -p $target/binutils
|
||||
cd $target/binutils
|
||||
|
||||
../../$BINUTILS_SRCDIR/configure \
|
||||
--prefix=$prefix --target=$target --disable-nls --disable-shared --disable-debug \
|
||||
--disable-threads --with-gcc --with-gnu-as --with-gnu-ld --with-stabs \
|
||||
2>&1 | tee $BUILDSCRIPTDIR/binutils_configure.log
|
||||
|
||||
|
||||
$MAKE 2>&1 | tee binutils_make.log
|
||||
$MAKE install 2>&1 | tee $BUILDSCRIPTDIR/binutils_install.log
|
||||
|
||||
cd $BUILDSCRIPTDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# remove temp stuff to conserve disc space
|
||||
#---------------------------------------------------------------------------------
|
||||
rm -fr $target/binutils
|
||||
rm -fr $BINUTILS_SRCDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build and install just the c compiler
|
||||
#---------------------------------------------------------------------------------
|
||||
mkdir -p $target/gcc
|
||||
cd $target/gcc
|
||||
|
||||
|
||||
../../$GCC_SRCDIR/configure \
|
||||
--enable-languages=c,c++ \
|
||||
--with-cpu=arm7tdmi\
|
||||
--enable-interwork --enable-multilib\
|
||||
--with-gcc --with-gnu-ld --with-gnu-as --with-stabs \
|
||||
--disable-shared --disable-threads --disable-win32-registry --disable-nls\
|
||||
--target=$target \
|
||||
--with-newlib \
|
||||
--prefix=$prefix -v\
|
||||
2>&1 | tee $BUILDSCRIPTDIR/gcc_configure.log
|
||||
|
||||
$MAKE all-gcc 2>&1| tee $BUILDSCRIPTDIR/gcc_make.log
|
||||
$MAKE install-gcc 2>&1 | tee $BUILDSCRIPTDIR/gcc_install.log
|
||||
|
||||
cd $BUILDSCRIPTDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build and install newlib
|
||||
#---------------------------------------------------------------------------------
|
||||
mkdir -p $target/newlib
|
||||
cd $target/newlib
|
||||
|
||||
$BUILDSCRIPTDIR/$NEWLIB_SRCDIR/configure \
|
||||
--enable-serial-configure \
|
||||
--target=$target \
|
||||
--prefix=$prefix \
|
||||
--enable-newlib-mb \
|
||||
| tee $BUILDSCRIPTDIR/newlib_configure.log
|
||||
|
||||
mkdir -p etc
|
||||
|
||||
$MAKE | tee $BUILDSCRIPTDIR/newlib_make.log
|
||||
$MAKE install | tee $BUILDSCRIPTDIR/newlib_install.log
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# remove temp stuff to conserve disc space
|
||||
#---------------------------------------------------------------------------------
|
||||
rm -fr $target/newlib
|
||||
rm -fr $NEWLIB_SRCDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build and install the final compiler
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
cd $BUILDSCRIPTDIR
|
||||
cd $target/gcc
|
||||
|
||||
$MAKE | tee $BUILDSCRIPTDIR/gcc_final_make.log 2>&1
|
||||
$MAKE install | tee $BUILDSCRIPTDIR/gcc_final_install.log 2>&1
|
||||
|
||||
cd $BUILDSCRIPTDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# remove temp stuff to conserve disc space
|
||||
#---------------------------------------------------------------------------------
|
||||
rm -fr $target/gcc
|
||||
rm -fr $GCC_SRCDIR
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
|
||||
export DEVKITARM=$TOOLPATH/devkitARM
|
||||
export DEVKITPRO=$TOOLPATH
|
||||
|
||||
$MAKE -C tools/gba
|
||||
$MAKE -C tools/gba install PREFIX=$DEVKITARM/bin
|
||||
|
||||
$MAKE -C tools/gp32
|
||||
$MAKE -C tools/gp32 install PREFIX=$DEVKITARM/bin
|
||||
|
||||
$MAKE -C tools/nds/
|
||||
$MAKE -C tools/nds/ install PREFIX=$DEVKITARM/bin
|
||||
|
||||
$MAKE -C tools clean
|
||||
302
dkp-crtls/gcn.ld
302
dkp-crtls/gcn.ld
|
|
@ -1,302 +0,0 @@
|
|||
/* Default linker script, for normal executables */
|
||||
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc",
|
||||
"elf32-powerpc")
|
||||
OUTPUT_ARCH(powerpc:common)
|
||||
ENTRY(_start)
|
||||
SEARCH_DIR("/powerpc/powerpc-eabi-elf/lib");
|
||||
/* Do we need any of these for elf?
|
||||
__DYNAMIC = 0; */
|
||||
PROVIDE (__stack = 0x817F0000);
|
||||
SECTIONS
|
||||
{
|
||||
/* Read-only sections, merged into text segment: */
|
||||
. = 0x80003100;
|
||||
.interp : { *(.interp) }
|
||||
.hash : { *(.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
.gnu.version_d : { *(.gnu.version_d) }
|
||||
.gnu.version_r : { *(.gnu.version_r) }
|
||||
.rel.init : { *(.rel.init) }
|
||||
.rela.init : { *(.rela.init) }
|
||||
.rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
|
||||
.rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
|
||||
.rel.fini : { *(.rel.fini) }
|
||||
.rela.fini : { *(.rela.fini) }
|
||||
.rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
|
||||
.rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
|
||||
.rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
|
||||
.rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
|
||||
.rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
|
||||
.rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
|
||||
.rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
|
||||
.rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
|
||||
.rel.ctors : { *(.rel.ctors) }
|
||||
.rela.ctors : { *(.rela.ctors) }
|
||||
.rel.dtors : { *(.rel.dtors) }
|
||||
.rela.dtors : { *(.rela.dtors) }
|
||||
.rel.got : { *(.rel.got) }
|
||||
.rela.got : { *(.rela.got) }
|
||||
.rela.got1 : { *(.rela.got1) }
|
||||
.rela.got2 : { *(.rela.got2) }
|
||||
.rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) }
|
||||
.rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) }
|
||||
.rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) }
|
||||
.rela.sbss : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) }
|
||||
.rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) }
|
||||
.rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) }
|
||||
.rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) }
|
||||
.rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) }
|
||||
.rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
|
||||
.rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
|
||||
.rel.plt : { *(.rel.plt) }
|
||||
.rela.plt : { *(.rela.plt) }
|
||||
|
||||
/* DOL header (from TITANIK's GC docs)
|
||||
*/
|
||||
file_start = 0x80003000;
|
||||
. = file_start;
|
||||
|
||||
.header :
|
||||
{
|
||||
/* 0000-001B Text[0..6] sections File Positions */
|
||||
LONG(text_file_start);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 001C-0047 Data[0..10] sections File Positions */
|
||||
LONG(data_file_start);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 0048-0063 Text[0..6] sections Mem Address */
|
||||
LONG(text_mem_start);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 0064-008F Data[0..10] sections Mem Address */
|
||||
LONG(data_mem_start);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 0090-00AB Text[0..6] sections Sizes */
|
||||
LONG(text_mem_size);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 00AC-00D7 Data[0..10] sections Sizes */
|
||||
LONG(data_mem_size);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 00D8 BSS Mem address
|
||||
* 00DC BSS Size */
|
||||
LONG(bss_mem_start);
|
||||
LONG(bss_mem_size);
|
||||
|
||||
/* 00E0 Entry Point */
|
||||
LONG(ABSOLUTE(_start));
|
||||
}
|
||||
|
||||
|
||||
. = 0x80003100;
|
||||
text_mem_start = .;
|
||||
|
||||
.init :
|
||||
{
|
||||
KEEP (*(.init))
|
||||
} =0
|
||||
.text :
|
||||
{
|
||||
*(.text .stub .text.* .gnu.linkonce.t.*)
|
||||
/* .gnu.warning sections are handled specially by elf32.em. */
|
||||
*(.gnu.warning)
|
||||
} =0
|
||||
.fini :
|
||||
{
|
||||
KEEP (*(.fini))
|
||||
} =0
|
||||
PROVIDE (__etext = .);
|
||||
PROVIDE (_etext = .);
|
||||
PROVIDE (etext = .);
|
||||
. = ALIGN(32);
|
||||
text_mem_size = . - text_mem_start;
|
||||
data_mem_start = .;
|
||||
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
|
||||
.rodata1 : { *(.rodata1) }
|
||||
.sdata2 : { *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) }
|
||||
.sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
|
||||
.eh_frame_hdr : { *(.eh_frame_hdr) }
|
||||
. = ALIGN(32);
|
||||
/* Ensure the __preinit_array_start label is properly aligned. We
|
||||
could instead move the label definition inside the section, but
|
||||
the linker would then create the section even if it turns out to
|
||||
be empty, which isn't pretty. */
|
||||
. = ALIGN(32 / 8);
|
||||
PROVIDE (__preinit_array_start = .);
|
||||
.preinit_array : { *(.preinit_array) }
|
||||
PROVIDE (__preinit_array_end = .);
|
||||
PROVIDE (__init_array_start = .);
|
||||
.init_array : { *(.init_array) }
|
||||
PROVIDE (__init_array_end = .);
|
||||
PROVIDE (__fini_array_start = .);
|
||||
.fini_array : { *(.fini_array) }
|
||||
PROVIDE (__fini_array_end = .);
|
||||
.data :
|
||||
{
|
||||
*(.data .data.* .gnu.linkonce.d.*)
|
||||
SORT(CONSTRUCTORS)
|
||||
}
|
||||
.data1 : { *(.data1) }
|
||||
.tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
|
||||
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
|
||||
.eh_frame : { KEEP (*(.eh_frame)) }
|
||||
.gcc_except_table : { *(.gcc_except_table) }
|
||||
.fixup : { *(.fixup) }
|
||||
.got1 : { *(.got1) }
|
||||
.got2 : { *(.got2) }
|
||||
.dynamic : { *(.dynamic) }
|
||||
.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))
|
||||
/* We don't want to include the .ctor section from
|
||||
from the crtend.o file until after the sorted ctors.
|
||||
The .ctor section from the crtend file contains the
|
||||
end of ctors marker and it must be last */
|
||||
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
|
||||
KEEP (*(SORT(.ctors.*)))
|
||||
KEEP (*(.ctors))
|
||||
}
|
||||
.dtors :
|
||||
{
|
||||
KEEP (*crtbegin*.o(.dtors))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
|
||||
KEEP (*(SORT(.dtors.*)))
|
||||
KEEP (*(.dtors))
|
||||
}
|
||||
.jcr : { KEEP (*(.jcr)) }
|
||||
.got : { *(.got.plt) *(.got) }
|
||||
/* We want the small data sections together, so single-instruction offsets
|
||||
can access them all, and initialized data all before uninitialized, so
|
||||
we can shorten the on-disk segment size. */
|
||||
.sdata :
|
||||
{
|
||||
*(.sdata .sdata.* .gnu.linkonce.s.*)
|
||||
}
|
||||
_edata = .;
|
||||
PROVIDE (edata = .);
|
||||
|
||||
data_mem_size = . - data_mem_start;
|
||||
bss_mem_start = .;
|
||||
|
||||
__bss_start = .;
|
||||
.sbss :
|
||||
{
|
||||
PROVIDE (__sbss_start = .);
|
||||
PROVIDE (___sbss_start = .);
|
||||
*(.dynsbss)
|
||||
*(.sbss .sbss.* .gnu.linkonce.sb.*)
|
||||
*(.scommon)
|
||||
PROVIDE (__sbss_end = .);
|
||||
PROVIDE (___sbss_end = .);
|
||||
}
|
||||
.plt : { *(.plt) }
|
||||
.bss :
|
||||
{
|
||||
*(.dynbss)
|
||||
*(.bss .bss.* .gnu.linkonce.b.*)
|
||||
*(COMMON)
|
||||
/* Align here to ensure that the .bss section occupies space up to
|
||||
_end. Align after .bss to ensure correct alignment even if the
|
||||
.bss section disappears because there are no input sections. */
|
||||
. = ALIGN(32 / 8);
|
||||
}
|
||||
. = ALIGN(32 / 8);
|
||||
bss_mem_size = . - bss_mem_start;
|
||||
text_file_start = text_mem_start - file_start;
|
||||
data_file_start = data_mem_start - file_start;
|
||||
|
||||
|
||||
_end = .;
|
||||
__end = .;
|
||||
PROVIDE (end = .);
|
||||
/* 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 .gnu.linkonce.wi.*) }
|
||||
.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) }
|
||||
}
|
||||
Binary file not shown.
|
|
@ -1,483 +0,0 @@
|
|||
#---------------------------------------------------------------------------------
|
||||
# crt0.s file for the GameCube V1.0 by Costis (costis@gbaemu.com)!
|
||||
#
|
||||
# some little modifications by Groepaz/Hitmen and WinterMute
|
||||
#
|
||||
# This is start-up code for initializing the GameCube system and hardware
|
||||
# before executing the actual user program code. It clears the GPR's,
|
||||
# initializes the FPR's, initializes the Data, Code, and L2 caches, clears
|
||||
# and initializes SPR's, and disables exceptions (interrupts).
|
||||
#
|
||||
# Have fun!!! Please e-mail any suggestions or bugs to costis@gbaemu.com.
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
.section ".init"
|
||||
|
||||
.globl _start
|
||||
.extern __bss_start, _end
|
||||
.extern __init, __fini
|
||||
.extern main
|
||||
|
||||
_start:
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Initialize the General Purpose Registers
|
||||
#---------------------------------------------------------------------------------
|
||||
bl InitGPRS
|
||||
#---------------------------------------------------------------------------------
|
||||
# Initialize the GameCube Hardware (Floating Point Registers, Caches, etc.)
|
||||
#---------------------------------------------------------------------------------
|
||||
bl InitHardware
|
||||
#---------------------------------------------------------------------------------
|
||||
# Initialize more cache aspects, clear a few SPR's, and disable interrupts.
|
||||
#---------------------------------------------------------------------------------
|
||||
bl SystemInit
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# clear the bss section
|
||||
#---------------------------------------------------------------------------------
|
||||
lis 3, __bss_start@h
|
||||
ori 3, 3, __bss_start@l
|
||||
li 4, 0
|
||||
lis 5, _end@h
|
||||
ori 5, 5, _end@l
|
||||
sub 5, 5, 3
|
||||
#subi 3, 3, 4
|
||||
mtctr 5
|
||||
BSSCLoop:
|
||||
#stwu 4, 4(3)
|
||||
stbu 4,0(3)
|
||||
bdnz BSSCLoop
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# push args for main() and generate first stackframe
|
||||
#---------------------------------------------------------------------------------
|
||||
addi 1,1,-4
|
||||
lis 0,0
|
||||
stw 0,0(1)
|
||||
stwu 1,-64(1)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Initialise global constructors!
|
||||
#---------------------------------------------------------------------------------
|
||||
bl __init
|
||||
#---------------------------------------------------------------------------------
|
||||
# Branch to the user code!
|
||||
#---------------------------------------------------------------------------------
|
||||
bl main
|
||||
#---------------------------------------------------------------------------------
|
||||
# global destructors!
|
||||
#---------------------------------------------------------------------------------
|
||||
bl __fini
|
||||
|
||||
|
||||
# call functions registered by atexit()
|
||||
# .globl _exit
|
||||
# bl exit
|
||||
#_exit:
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# if the main function returns, reset the gc
|
||||
#
|
||||
# notice that restarting the program may fail since the
|
||||
# .data section may have been changed by previous run.
|
||||
#---------------------------------------------------------------------------------
|
||||
# disable irqs
|
||||
#---------------------------------------------------------------------------------
|
||||
mfmsr 3
|
||||
rlwinm 4,3,0,17,15
|
||||
mtmsr 4
|
||||
extrwi 3,3,1,16
|
||||
#---------------------------------------------------------------------------------
|
||||
eloop:
|
||||
#---------------------------------------------------------------------------------
|
||||
# hot reset
|
||||
#---------------------------------------------------------------------------------
|
||||
lis 9,0xcc00
|
||||
li 0,0x00
|
||||
ori 9,9,0x3024
|
||||
stw 0,0x00(9)
|
||||
|
||||
b eloop # try again if we really come here :=P
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# General Purpose Register init
|
||||
#---------------------------------------------------------------------------------
|
||||
InitGPRS:
|
||||
#---------------------------------------------------------------------------------
|
||||
# Clear all of the GPR's to 0
|
||||
#---------------------------------------------------------------------------------
|
||||
li 0,0
|
||||
li 3,0
|
||||
li 4,0
|
||||
li 5,0
|
||||
li 6,0
|
||||
li 7,0
|
||||
li 8,0
|
||||
li 9,0
|
||||
li 10,0
|
||||
li 11,0
|
||||
li 12,0
|
||||
li 14,0
|
||||
li 15,0
|
||||
li 16,0
|
||||
li 17,0
|
||||
li 18,0
|
||||
li 19,0
|
||||
li 20,0
|
||||
li 21,0
|
||||
li 22,0
|
||||
li 23,0
|
||||
li 24,0
|
||||
li 25,0
|
||||
li 26,0
|
||||
li 27,0
|
||||
li 28,0
|
||||
li 29,0
|
||||
li 30,0
|
||||
li 31,0
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Set the Stack Pointer - set in linkscript
|
||||
#---------------------------------------------------------------------------------
|
||||
lis 1,__stack@h
|
||||
ori 1,1,__stack@l
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Set the Small Data 2 (Read Only) base register.
|
||||
#---------------------------------------------------------------------------------
|
||||
lis 2,_SDA2_BASE_@h
|
||||
ori 2,2,_SDA2_BASE_@l
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Set the Small Data (Read\Write) base register.
|
||||
#---------------------------------------------------------------------------------
|
||||
lis 13,_SDA_BASE_@h
|
||||
ori 13,13,_SDA_BASE_@l
|
||||
|
||||
blr
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Hardware Init
|
||||
#---------------------------------------------------------------------------------
|
||||
InitHardware:
|
||||
#---------------------------------------------------------------------------------
|
||||
mflr 31 # Store the link register in r31
|
||||
|
||||
bl PSInit # Initialize Paired Singles
|
||||
bl FPRInit # Initialize the FPR's
|
||||
bl CacheInit # Initialize the system caches
|
||||
|
||||
mtlr 31 # Retreive the link register from r31
|
||||
blr
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
PSInit:
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 920 # (HID2)
|
||||
oris 3, 3, 0xA000
|
||||
mtspr 920, 3 # (HID2)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Set the Instruction Cache invalidation bit in HID0
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3,1008
|
||||
ori 3,3,0x0800
|
||||
mtspr 1008,3
|
||||
|
||||
sync
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Clear various Special Purpose Registers
|
||||
#---------------------------------------------------------------------------------
|
||||
li 3,0
|
||||
mtspr 912,3
|
||||
mtspr 913,3
|
||||
mtspr 914,3
|
||||
mtspr 915,3
|
||||
mtspr 916,3
|
||||
mtspr 917,3
|
||||
mtspr 918,3
|
||||
mtspr 919,3
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Return
|
||||
#---------------------------------------------------------------------------------
|
||||
blr
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
FPRInit:
|
||||
#---------------------------------------------------------------------------------
|
||||
# Enable the Floating Point Registers
|
||||
#---------------------------------------------------------------------------------
|
||||
mfmsr 3
|
||||
ori 3,3,0x2000
|
||||
mtmsr 3
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Clear all of the FPR's to 0
|
||||
#---------------------------------------------------------------------------------
|
||||
lis 3, zfloat@h
|
||||
ori 3, 3, zfloat@l
|
||||
lfd 0, 0(3)
|
||||
fmr 1,0
|
||||
fmr 2,0
|
||||
fmr 3,0
|
||||
fmr 4,0
|
||||
fmr 5,0
|
||||
fmr 6,0
|
||||
fmr 7,0
|
||||
fmr 8,0
|
||||
fmr 9,0
|
||||
fmr 10,0
|
||||
fmr 11,0
|
||||
fmr 12,0
|
||||
fmr 13,0
|
||||
fmr 14,0
|
||||
fmr 15,0
|
||||
fmr 16,0
|
||||
fmr 17,0
|
||||
fmr 18,0
|
||||
fmr 19,0
|
||||
fmr 20,0
|
||||
fmr 21,0
|
||||
fmr 22,0
|
||||
fmr 23,0
|
||||
fmr 24,0
|
||||
fmr 25,0
|
||||
fmr 26,0
|
||||
fmr 27,0
|
||||
fmr 28,0
|
||||
fmr 29,0
|
||||
fmr 30,0
|
||||
fmr 31,0
|
||||
mtfsf 255,0
|
||||
|
||||
|
||||
blr
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
CacheInit:
|
||||
#---------------------------------------------------------------------------------
|
||||
mflr 0
|
||||
stw 0, 4(1)
|
||||
stwu 1, -16(1)
|
||||
stw 31, 12(1)
|
||||
stw 30, 8(1)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Check if the Instruction Cache has been enabled.
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3,1008 # (HID0)
|
||||
rlwinm 0, 3, 0, 16, 16
|
||||
cmplwi 0, 0x0000
|
||||
bne ICEnabled
|
||||
|
||||
isync
|
||||
mfspr 3, 1008
|
||||
ori 3, 3, 0x8000
|
||||
mtspr 1008, 3
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
ICEnabled:
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 1008 # bl PPCMfhid0
|
||||
rlwinm 0, 3, 0, 17, 17
|
||||
cmplwi 0, 0x0000 # Check if the Data Cache has been enabled or not.
|
||||
bne DCEnabled
|
||||
|
||||
# If not, then enable it.
|
||||
sync
|
||||
mfspr 3, 1008
|
||||
ori 3, 3, 0x4000
|
||||
mtspr 1008, 3
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
DCEnabled:
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
mfspr 3, 1017 # (L2CR)
|
||||
clrrwi 0, 3, 31 # Clear all of the bits except 31
|
||||
cmplwi 0, 0x0000
|
||||
bne L2GISkip # Skip the L2 Global Cache Invalidation process
|
||||
# if it has already been done before.
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Store the current state of the MSR in r30
|
||||
#---------------------------------------------------------------------------------
|
||||
mfmsr 3
|
||||
mr 30,3
|
||||
|
||||
sync
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Enable Instruction and Data Address Translation
|
||||
#---------------------------------------------------------------------------------
|
||||
li 3, 48
|
||||
mtmsr 3
|
||||
|
||||
sync
|
||||
sync
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Disable the L2 Global Cache.
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 1017 # (L2CR
|
||||
clrlwi 3, 3, 1
|
||||
mtspr 1017, 3 # (L2CR)
|
||||
sync
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Invalidate the L2 Global Cache.
|
||||
#---------------------------------------------------------------------------------
|
||||
bl L2GlobalInvalidate
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Restore the previous state of the MSR from r30
|
||||
#---------------------------------------------------------------------------------
|
||||
mr 3, 30
|
||||
mtmsr 3
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Enable the L2 Global Cache
|
||||
# disable the L2 Data Only bit and the L2 Global Invalidate Bit.
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 1017 # (L2CR)
|
||||
oris 0, 3, 0x8000
|
||||
rlwinm 3, 0, 0, 11, 9
|
||||
mtspr 1017, 3 # (L2CR)
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
L2GISkip:
|
||||
#---------------------------------------------------------------------------------
|
||||
# Restore the non-volatile registers to their previous values and return.
|
||||
#---------------------------------------------------------------------------------
|
||||
lwz 0, 20(1)
|
||||
lwz 31, 12(1)
|
||||
lwz 30, 8(1)
|
||||
addi 1, 1, 16
|
||||
mtlr 0
|
||||
blr
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
L2GlobalInvalidate:
|
||||
#---------------------------------------------------------------------------------
|
||||
mflr 0
|
||||
stw 0, 4(1)
|
||||
stwu 1, -16(1)
|
||||
stw 31, 12(1)
|
||||
sync
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Disable the L2 Cache.
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 1017 # bl PPCMf1017
|
||||
clrlwi 3, 3, 1
|
||||
mtspr 1017, 3 # bl PPCMt1017
|
||||
|
||||
sync
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Initiate the L2 Cache Global Invalidation process.
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 1017 # (L2CR)
|
||||
oris 3, 3, 0x0020
|
||||
mtspr 1017, 3 # (L2CR)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Wait until the L2 Cache Global Invalidation has been completed.
|
||||
#---------------------------------------------------------------------------------
|
||||
L2GICheckComplete:
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 1017 # (L2CR)
|
||||
clrlwi 0, 3, 31
|
||||
cmplwi 0, 0x0000
|
||||
bne L2GICheckComplete
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Clear the L2 Data Only bit and the L2 Global Invalidate Bit.
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 1017 # (L2CR)
|
||||
rlwinm 3, 3, 0, 11, 9
|
||||
mtspr 1017, 3 # (L2CR)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Wait until the L2 Cache Global Invalidation status bit signifies that it is ready.
|
||||
#---------------------------------------------------------------------------------
|
||||
L2GDICheckComplete:
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 1017 # (L2CR)
|
||||
clrlwi 0, 3, 31
|
||||
cmplwi 0, 0x0000
|
||||
bne L2GDICheckComplete
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Restore the non-volatile registers to their previous values and return.
|
||||
#---------------------------------------------------------------------------------
|
||||
lwz 0, 20(1)
|
||||
lwz 31, 12(1)
|
||||
addi 1, 1, 16
|
||||
mtlr 0
|
||||
blr
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
SystemInit:
|
||||
#---------------------------------------------------------------------------------
|
||||
mflr 0
|
||||
stw 0, 4(1)
|
||||
stwu 1, -0x18(1)
|
||||
stw 31, 0x14(1)
|
||||
stw 30, 0x10(1)
|
||||
stw 29, 0xC(1)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Disable interrupts!
|
||||
#---------------------------------------------------------------------------------
|
||||
mfmsr 3
|
||||
rlwinm 4,3,0,17,15
|
||||
mtmsr 4
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Clear various SPR's
|
||||
#---------------------------------------------------------------------------------
|
||||
li 3,0
|
||||
mtspr 952, 3
|
||||
mtspr 956, 3
|
||||
mtspr 953, 3
|
||||
mtspr 954, 3
|
||||
mtspr 957, 3
|
||||
mtspr 958, 3
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Disable Speculative Bus Accesses to non-guarded space from both caches.
|
||||
#---------------------------------------------------------------------------------
|
||||
mfspr 3, 1008 # (HID0)
|
||||
ori 3, 3, 0x0200
|
||||
mtspr 1008, 3
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Set the Non-IEEE mode in the FPSCR
|
||||
#---------------------------------------------------------------------------------
|
||||
mtfsb1 29
|
||||
|
||||
mfspr 3,920 # (HID2)
|
||||
rlwinm 3, 3, 0, 2, 0
|
||||
mtspr 920,3 # (HID2)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Restore the non-volatile registers to their previous values and return.
|
||||
#---------------------------------------------------------------------------------
|
||||
lwz 0, 0x1C(1)
|
||||
lwz 31, 0x14(1)
|
||||
lwz 30, 0x10(1)
|
||||
lwz 29, 0xC(1)
|
||||
addi 1, 1, 0x18
|
||||
mtlr 0
|
||||
blr
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
zfloat:
|
||||
#---------------------------------------------------------------------------------
|
||||
.float 0
|
||||
.align 4
|
||||
348
dkp-crtls/ogc.ld
348
dkp-crtls/ogc.ld
|
|
@ -1,348 +0,0 @@
|
|||
/*
|
||||
* Linkscript for GC, automatically sets up DOL structures,
|
||||
* generate ELF file and use objdump, or generate binary
|
||||
* directly.
|
||||
*
|
||||
* PSUL doesn't seem to handle separate text and data sections correctly,
|
||||
* that is why the text and data sections are merged in the header.
|
||||
*
|
||||
* If you want to experiment, it should be quite obvious how to
|
||||
* change the header to list the data separately.
|
||||
*/
|
||||
|
||||
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc");
|
||||
OUTPUT_ARCH(powerpc:common);
|
||||
EXTERN(_start);
|
||||
ENTRY(_start);
|
||||
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
|
||||
/* DOL header (from TITANIK's GC docs)
|
||||
*/
|
||||
file_start = 0x80003000;
|
||||
. = file_start;
|
||||
|
||||
.header :
|
||||
{
|
||||
/* 0000-001B Text[0..6] sections File Positions */
|
||||
LONG(text_file_start);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 001C-0047 Data[0..10] sections File Positions */
|
||||
LONG(data_file_start);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 0048-0063 Text[0..6] sections Mem Address */
|
||||
LONG(text_mem_start);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 0064-008F Data[0..10] sections Mem Address */
|
||||
LONG(data_mem_start);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 0090-00AB Text[0..6] sections Sizes */
|
||||
LONG(text_mem_size);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 00AC-00D7 Data[0..10] sections Sizes */
|
||||
LONG(data_mem_size);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
LONG(0);
|
||||
|
||||
/* 00D8 BSS Mem address
|
||||
* 00DC BSS Size */
|
||||
LONG(bss_mem_start);
|
||||
LONG(bss_mem_size);
|
||||
|
||||
/* 00E0 Entry Point */
|
||||
LONG(ABSOLUTE(_start));
|
||||
}
|
||||
|
||||
/* Program
|
||||
*/
|
||||
. = 0x80003100;
|
||||
text_mem_start = .;
|
||||
|
||||
.init :
|
||||
{
|
||||
KEEP (*crt0.o(*.init))
|
||||
KEEP (*(.init))
|
||||
} = 0
|
||||
.plt : { *(.plt) }
|
||||
.interp : { *(.interp) }
|
||||
.hash : { *(.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.gnu.version : { *(.gnu.version) }
|
||||
.gnu.version_d : { *(.gnu.version_d) }
|
||||
.gnu.version_r : { *(.gnu.version_r) }
|
||||
.rel.init : { *(.rel.init) }
|
||||
.rela.init : { *(.rela.init) }
|
||||
.rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
|
||||
.rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
|
||||
.rel.fini : { *(.rel.fini) }
|
||||
.rela.fini : { *(.rela.fini) }
|
||||
.rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
|
||||
.rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
|
||||
.rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
|
||||
.rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
|
||||
.rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
|
||||
.rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
|
||||
.rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
|
||||
.rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
|
||||
.rel.ctors : { *(.rel.ctors) }
|
||||
.rela.ctors : { *(.rela.ctors) }
|
||||
.rel.dtors : { *(.rel.dtors) }
|
||||
.rela.dtors : { *(.rela.dtors) }
|
||||
.rel.got : { *(.rel.got) }
|
||||
.rela.got : { *(.rela.got) }
|
||||
.rela.got1 : { *(.rela.got1) }
|
||||
.rela.got2 : { *(.rela.got2) }
|
||||
.rel.sdata : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) }
|
||||
.rela.sdata : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) }
|
||||
.rel.sbss : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) }
|
||||
.rela.sbss : { *(.rela.sbss .rela.sbss.* .rel.gnu.linkonce.sb.*) }
|
||||
.rel.sdata2 : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) }
|
||||
.rela.sdata2 : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) }
|
||||
.rel.sbss2 : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) }
|
||||
.rela.sbss2 : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) }
|
||||
.rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
|
||||
.rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
|
||||
.rel.plt : { *(.rel.plt) }
|
||||
.rela.plt : { *(.rela.plt) }
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.stub)
|
||||
/* .gnu.warning sections are handled specially by elf32.em. */
|
||||
*(.gnu.warning)
|
||||
*(.gnu.linkonce.t.*)
|
||||
} = 0
|
||||
.fini :
|
||||
{
|
||||
KEEP (*(.fini))
|
||||
} = 0
|
||||
PROVIDE (__etext = .);
|
||||
PROVIDE (_etext = .);
|
||||
PROVIDE (etext = .);
|
||||
text_mem_size = . - text_mem_start;
|
||||
data_mem_start = .;
|
||||
.rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) }
|
||||
.rodata1 : { *(.rodata1) }
|
||||
.sdata2 : { *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) }
|
||||
.sbss2 : { *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) }
|
||||
/* Adjust the address for the data segment. We want to adjust up to
|
||||
the same address within the page on the next page up. */
|
||||
/* Ensure the __preinit_array_start label is properly aligned. We
|
||||
could instead move the label definition inside the section, but
|
||||
the linker would then create the section even if it turns out to
|
||||
be empty, which isn't pretty. */
|
||||
. = ALIGN(32 / 8);
|
||||
PROVIDE (__preinit_array_start = .);
|
||||
.preinit_array : { *(.preinit_array) }
|
||||
PROVIDE (__preinit_array_end = .);
|
||||
PROVIDE (__init_array_start = .);
|
||||
.init_array : { *(.init_array) }
|
||||
PROVIDE (__init_array_end = .);
|
||||
PROVIDE (__fini_array_start = .);
|
||||
.fini_array : { *(.fini_array) }
|
||||
PROVIDE (__fini_array_end = .);
|
||||
.data :
|
||||
{
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
*(.gnu.linkonce.d.*)
|
||||
SORT(CONSTRUCTORS)
|
||||
}
|
||||
.data1 : { *(.data1) }
|
||||
.tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
|
||||
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
|
||||
.eh_frame : { KEEP (*(.eh_frame)) }
|
||||
.gcc_except_table : { *(.gcc_except_table) }
|
||||
.fixup : { *(.fixup) }
|
||||
.got1 : { *(.got1) }
|
||||
.got2 : { *(.got2) }
|
||||
.dynamic : { *(.dynamic) }
|
||||
.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))
|
||||
/* We don't want to include the .ctor section from
|
||||
from the crtend.o file until after the sorted ctors.
|
||||
The .ctor section from the crtend file contains the
|
||||
end of ctors marker and it must be last */
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors))
|
||||
KEEP (*(SORT(.ctors.*)))
|
||||
KEEP (*(.ctors))
|
||||
}
|
||||
.dtors :
|
||||
{
|
||||
KEEP (*crtbegin.o(.dtors))
|
||||
KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
|
||||
KEEP (*(SORT(.dtors.*)))
|
||||
KEEP (*(.dtors))
|
||||
}
|
||||
.jcr : { KEEP (*(.jcr)) }
|
||||
.got : { *(.got.plt) *(.got) }
|
||||
/* We want the small data sections together, so single-instruction offsets
|
||||
can access them all, and initialized data all before uninitialized, so
|
||||
we can shorten the on-disk segment size. */
|
||||
.sdata :
|
||||
{
|
||||
*(.sdata)
|
||||
*(.sdata.*)
|
||||
*(.gnu.linkonce.s.*)
|
||||
}
|
||||
_edata = .;
|
||||
PROVIDE (edata = .);
|
||||
data_mem_size = . - data_mem_start;
|
||||
|
||||
bss_mem_start = .;
|
||||
.sbss :
|
||||
{
|
||||
__sbss_start = .;
|
||||
PROVIDE (__sbss_start = .);
|
||||
PROVIDE (___sbss_start = .);
|
||||
*(.dynsbss)
|
||||
*(.sbss)
|
||||
*(.sbss.*)
|
||||
*(.gnu.linkonce.sb.*)
|
||||
*(.scommon)
|
||||
PROVIDE (__sbss_end = .);
|
||||
PROVIDE (___sbss_end = .);
|
||||
__sbss_end = .;
|
||||
}
|
||||
.bss :
|
||||
{
|
||||
__bss_start = .;
|
||||
PROVIDE (__bss_start = .);
|
||||
*(.dynbss)
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(.gnu.linkonce.b.*)
|
||||
*(COMMON)
|
||||
/* Align here to ensure that the .bss section occupies space up to
|
||||
_end. Align after .bss to ensure correct alignment even if the
|
||||
.bss section disappears because there are no input sections. */
|
||||
. = ALIGN(32 / 8);
|
||||
PROVIDE (__bss_end = .);
|
||||
__bss_end = .;
|
||||
}
|
||||
. = ALIGN(32 / 8);
|
||||
bss_mem_size = . - bss_mem_start;
|
||||
|
||||
/* calculate file addresses */
|
||||
text_file_start = text_mem_start - file_start;
|
||||
data_file_start = data_mem_start - file_start;
|
||||
|
||||
_end = .;
|
||||
PROVIDE(end = .);
|
||||
/* 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) }
|
||||
/* These must appear regardless of . */
|
||||
}
|
||||
|
||||
__stack_addr = (__bss_start + SIZEOF(.bss) + 0x2000 + 7) & (-8);
|
||||
__stack_end = (__bss_start + SIZEOF(.bss));
|
||||
__intrstack_addr = (__stack_addr + 0x2000);
|
||||
__intrstack_end = (__stack_addr);
|
||||
__ArenaLo = (__intrstack_addr + 31) & (-32);
|
||||
__ArenaHi = (0x81700000);
|
||||
__gxregs = (__ArenaHi + 31) & (-32);
|
||||
|
||||
/* for backward compatibility with old crt0 */
|
||||
__stack = (0x81700000);
|
||||
|
||||
PROVIDE (text_mem_start = text_mem_start);
|
||||
PROVIDE (data_mem_start = data_mem_start);
|
||||
PROVIDE (bss_mem_start = bss_mem_start);
|
||||
PROVIDE(__stack_addr = __stack_addr);
|
||||
PROVIDE(__stack_end = __stack_end);
|
||||
PROVIDE(__intrstack_addr = __intrstack_addr);
|
||||
PROVIDE(__intrstack_end = __intrstack_end);
|
||||
PROVIDE(__ArenaLo = __ArenaLo);
|
||||
PROVIDE(__ArenaHi = __ArenaHi);
|
||||
PROVIDE(__gxregs = __gxregs);
|
||||
355
dkp-crtls/specs
355
dkp-crtls/specs
|
|
@ -1,355 +0,0 @@
|
|||
*asm:
|
||||
--traditional-format %(asm_cpu) %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} %{mrelocatable} %{mrelocatable-lib} %{fpic|fpie|fPIC|fPIE:-K PIC} %{memb|msdata|msdata=eabi: -memb} %{mlittle|mlittle-endian:-mlittle; mbig|mbig-endian :-mbig; mcall-aixdesc | mcall-freebsd | mcall-netbsd | mcall-openbsd | mcall-linux | mcall-gnu :-mbig; mcall-i960-old :-mlittle}
|
||||
|
||||
*asm_debug:
|
||||
%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}}
|
||||
|
||||
*asm_final:
|
||||
|
||||
|
||||
*asm_options:
|
||||
%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}
|
||||
|
||||
*invoke_as:
|
||||
%{!S:-o %|.s |
|
||||
as %(asm_options) %|.s %A }
|
||||
|
||||
*cpp:
|
||||
%{posix: -D_POSIX_SOURCE} %{mads : %(cpp_os_ads) ; myellowknife : %(cpp_os_yellowknife) ; mmvme : %(cpp_os_mvme) ; msim : %(cpp_os_sim) ; mwindiss : %(cpp_os_windiss) ; mcall-freebsd: %(cpp_os_freebsd) ; mcall-linux : %(cpp_os_linux) ; mcall-gnu : %(cpp_os_gnu) ; mcall-netbsd : %(cpp_os_netbsd) ; mcall-openbsd: %(cpp_os_openbsd) ; : %(cpp_os_default) }
|
||||
|
||||
*cpp_options:
|
||||
%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{g*:%{!g0:%{!fno-working-directory:-fworking-directory}}} %{O*} %{undef}
|
||||
|
||||
*cpp_debug_options:
|
||||
%{d*}
|
||||
|
||||
*cpp_unique_options:
|
||||
%{C|CC:%{!E:%eGCC does not support -C or -CC without -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}}
|
||||
|
||||
*trad_capable_cpp:
|
||||
cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp}
|
||||
|
||||
*cc1:
|
||||
%{G*} %{mlittle|mlittle-endian: %(cc1_endian_little); mbig |mbig-endian : %(cc1_endian_big); mcall-aixdesc | mcall-freebsd | mcall-netbsd | mcall-openbsd | mcall-linux | mcall-gnu : -mbig %(cc1_endian_big); mcall-i960-old : -mlittle %(cc1_endian_little); : %(cc1_endian_default)} %{mno-sdata: -msdata=none } %{meabi: %{!mcall-*: -mcall-sysv }} %{!meabi: %{!mno-eabi: %{mrelocatable: -meabi } %{mcall-freebsd: -mno-eabi } %{mcall-i960-old: -meabi } %{mcall-linux: -mno-eabi } %{mcall-gnu: -mno-eabi } %{mcall-netbsd: -mno-eabi } %{mcall-openbsd: -mno-eabi }}} %{msdata: -msdata=default} %{mno-sdata: -msdata=none} %{profile: -p}
|
||||
|
||||
*cc1_options:
|
||||
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*}
|
||||
|
||||
*cc1plus:
|
||||
|
||||
|
||||
*link_gcc_c_sequence:
|
||||
%G %L %G
|
||||
|
||||
*endfile:
|
||||
%{mgcn : crtsavres.o%s %(endfile_gcn); mogc : crtsavres.o%s %(endfile_gcn); myellowknife : crtsavres.o%s %(endfile_yellowknife) ; mmvme : crtsavres.o%s %(endfile_mvme) ; msim : crtsavres.o%s %(endfile_sim) ; mwindiss : %(endfile_windiss) ; mcall-freebsd: crtsavres.o%s %(endfile_freebsd) ; mcall-linux : crtsavres.o%s %(endfile_linux) ; mcall-gnu : crtsavres.o%s %(endfile_gnu) ; mcall-netbsd : crtsavres.o%s %(endfile_netbsd) ; mcall-openbsd: crtsavres.o%s %(endfile_openbsd) ; : %(crtsavres_default) %(endfile_default) }
|
||||
|
||||
*link:
|
||||
%{h*} %{v:-V} %{!msdata=none:%{G*}} %{msdata=none:-G0} %{YP,*} %{R*} %{Qy:} %{!Qn:-Qy} %(link_shlib) %{!Wl,-T*: %{!T*: %(link_start) }} %(link_target) %(link_os)
|
||||
|
||||
*lib:
|
||||
%{mgcn : %(lib_gcn); mogc : %(lib_ogc); myellowknife : %(lib_yellowknife) ; mmvme : %(lib_mvme) ; msim : %(lib_sim) ; mwindiss : %(lib_windiss) ; mcall-freebsd: %(lib_freebsd) ; mcall-linux : %(lib_linux) ; mcall-gnu : %(lib_gnu) ; mcall-netbsd : %(lib_netbsd) ; mcall-openbsd: %(lib_openbsd) ; : %(lib_default) }
|
||||
|
||||
*libgcc:
|
||||
-lgcc
|
||||
|
||||
*startfile:
|
||||
%{mgcn : %(startfile_gcn) ; mogc : %(startfile_ogc) ; myellowknife : %(startfile_yellowknife) ; mmvme : %(startfile_mvme) ; msim : %(startfile_sim) ; mwindiss : %(startfile_windiss) ; mcall-freebsd: %(startfile_freebsd) ; mcall-linux : %(startfile_linux) ; mcall-gnu : %(startfile_gnu) ; mcall-netbsd : %(startfile_netbsd) ; mcall-openbsd: %(startfile_openbsd) ; : %(startfile_default) }
|
||||
|
||||
*switches_need_spaces:
|
||||
|
||||
|
||||
*cross_compile:
|
||||
1
|
||||
|
||||
*version:
|
||||
3.4.3
|
||||
|
||||
*multilib:
|
||||
. ;
|
||||
|
||||
*multilib_defaults:
|
||||
mbig mcall-sysv
|
||||
|
||||
*multilib_extra:
|
||||
|
||||
|
||||
*multilib_matches:
|
||||
|
||||
|
||||
*multilib_exclusions:
|
||||
|
||||
|
||||
*multilib_options:
|
||||
|
||||
|
||||
*linker:
|
||||
collect2
|
||||
|
||||
*link_libgcc:
|
||||
%D
|
||||
|
||||
*md_exec_prefix:
|
||||
|
||||
|
||||
*md_startfile_prefix:
|
||||
|
||||
|
||||
*md_startfile_prefix_1:
|
||||
|
||||
|
||||
*startfile_prefix_spec:
|
||||
|
||||
|
||||
*sysroot_suffix_spec:
|
||||
|
||||
|
||||
*sysroot_hdrs_suffix_spec:
|
||||
|
||||
|
||||
*cpp_default:
|
||||
|
||||
|
||||
*asm_cpu:
|
||||
%{!mcpu*: %{mpower: %{!mpower2: -mpwr}} %{mpower2: -mpwrx} %{mpowerpc*: -mppc} %{mno-power: %{!mpowerpc*: -mcom}} %{!mno-power: %{!mpower2: %(asm_default)}}} %{mcpu=common: -mcom} %{mcpu=power: -mpwr} %{mcpu=power2: -mpwrx} %{mcpu=power3: -m604} %{mcpu=power4: -mpower4} %{mcpu=powerpc: -mppc} %{mcpu=rios: -mpwr} %{mcpu=rios1: -mpwr} %{mcpu=rios2: -mpwrx} %{mcpu=rsc: -mpwr} %{mcpu=rsc1: -mpwr} %{mcpu=401: -mppc} %{mcpu=403: -m403} %{mcpu=405: -m405} %{mcpu=405fp: -m405} %{mcpu=440: -m440} %{mcpu=440fp: -m440} %{mcpu=505: -mppc} %{mcpu=601: -m601} %{mcpu=602: -mppc} %{mcpu=603: -mppc} %{mcpu=603e: -mppc} %{mcpu=ec603e: -mppc} %{mcpu=604: -mppc} %{mcpu=604e: -mppc} %{mcpu=620: -mppc} %{mcpu=630: -m604} %{mcpu=740: -mppc} %{mcpu=7400: -mppc} %{mcpu=7450: -mppc} %{mcpu=G4: -mppc} %{mcpu=750: -mppc} %{mcpu=G3: -mppc} %{mcpu=801: -mppc} %{mcpu=821: -mppc} %{mcpu=823: -mppc} %{mcpu=860: -mppc} %{mcpu=970: -mpower4} %{mcpu=G5: -mpower4} %{mcpu=8540: -me500} %{maltivec: -maltivec}
|
||||
|
||||
*asm_default:
|
||||
-mppc
|
||||
|
||||
*crtsavres_default:
|
||||
crtsavres.o%s
|
||||
|
||||
*lib_ogc:
|
||||
--start-group -logcsys -lc --end-group -logc
|
||||
|
||||
*lib_gcn:
|
||||
--start-group -lads -lc -lstubs --end-group
|
||||
|
||||
*lib_yellowknife:
|
||||
--start-group -lyk -lc --end-group
|
||||
|
||||
*lib_mvme:
|
||||
--start-group -lmvme -lc --end-group
|
||||
|
||||
*lib_sim:
|
||||
--start-group -lsim -lc --end-group
|
||||
|
||||
*lib_freebsd:
|
||||
%{!shared: %{!pg: %{!pthread:-lc} %{pthread:-lc_r}} %{pg: %{!pthread:-lc_p} %{pthread:-lc_r_p}} }
|
||||
|
||||
*lib_gnu:
|
||||
%{mnewlib: --start-group -lgnu -lc --end-group } %{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } %{profile:-lc_p} %{!profile:-lc}}}
|
||||
|
||||
*lib_linux:
|
||||
%{mnewlib: --start-group -llinux -lc --end-group } %{!mnewlib: %{pthread:-lpthread} %{shared:-lc} %{!shared: %{profile:-lc_p} %{!profile:-lc}}}
|
||||
|
||||
*lib_netbsd:
|
||||
%{profile:-lgmon -lc_p} %{!profile:-lc}
|
||||
|
||||
*lib_openbsd:
|
||||
%{!shared:%{pthread:-lpthread%{p:_p}%{!p:%{pg:_p}}}} %{!shared:-lc%{p:_p}%{!p:%{pg:_p}}}
|
||||
|
||||
*lib_windiss:
|
||||
--start-group -li -lcfp -lwindiss -lram -limpl -limpfp --end-group
|
||||
|
||||
*lib_default:
|
||||
|
||||
|
||||
*startfile_gcn:
|
||||
gcn_crt0.o%s ecrti.o%s crtbegin.o%s
|
||||
|
||||
*startfile_ogc:
|
||||
ecrti.o%s crtbegin.o%s
|
||||
|
||||
*startfile_yellowknife:
|
||||
ecrti.o%s crt0.o%s crtbegin.o%s
|
||||
|
||||
*startfile_mvme:
|
||||
ecrti.o%s crt0.o%s crtbegin.o%s
|
||||
|
||||
*startfile_sim:
|
||||
ecrti.o%s sim-crt0.o%s crtbegin.o%s
|
||||
|
||||
*startfile_freebsd:
|
||||
%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}
|
||||
|
||||
*startfile_gnu:
|
||||
%{!shared: %{!static: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}} %{static: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}
|
||||
|
||||
*startfile_linux:
|
||||
%{!shared: %{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} %{mnewlib:ecrti.o%s;:crti.o%s} %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}
|
||||
|
||||
*startfile_netbsd:
|
||||
ncrti.o%s crt0.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}
|
||||
|
||||
*startfile_openbsd:
|
||||
%{!shared: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}
|
||||
|
||||
*startfile_windiss:
|
||||
crt0.o%s crtbegin.o%s
|
||||
|
||||
*startfile_default:
|
||||
|
||||
|
||||
*endfile_gcn:
|
||||
crtend.o%s ecrtn.o%s
|
||||
|
||||
*endfile_yellowknife:
|
||||
crtend.o%s ecrtn.o%s
|
||||
|
||||
*endfile_mvme:
|
||||
crtend.o%s ecrtn.o%s
|
||||
|
||||
*endfile_sim:
|
||||
crtend.o%s ecrtn.o%s
|
||||
|
||||
*endfile_freebsd:
|
||||
%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s
|
||||
|
||||
*endfile_gnu:
|
||||
%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s}
|
||||
|
||||
*endfile_linux:
|
||||
%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s}
|
||||
|
||||
*endfile_netbsd:
|
||||
%{!shared:crtend.o%s} %{shared:crtendS.o%s} ncrtn.o%s
|
||||
|
||||
*endfile_openbsd:
|
||||
%{!shared:crtend.o%s} %{shared:crtendS.o%s}
|
||||
|
||||
*endfile_windiss:
|
||||
crtend.o%s
|
||||
|
||||
*endfile_default:
|
||||
|
||||
|
||||
*link_path:
|
||||
|
||||
|
||||
*link_shlib:
|
||||
%{mshlib: %(link_path) } %{!mshlib: %{!shared: %{!symbolic: -dn -Bstatic}}} %{static: } %{shared:-G -dy -z text %(link_path) } %{symbolic:-Bsymbolic -G -dy -z text %(link_path) }
|
||||
|
||||
*link_target:
|
||||
%{mlittle: --oformat elf32-powerpcle } %{mlittle-endian: --oformat elf32-powerpcle } %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-i960-old: --oformat elf32-powerpcle} }}}}
|
||||
|
||||
*link_start:
|
||||
%{mgcn : %(link_start_gcn); mogc : %(link_start_gcn); myellowknife : %(link_start_yellowknife) ; mmvme : %(link_start_mvme) ; msim : %(link_start_sim) ; mwindiss : %(link_start_windiss) ; mcall-freebsd: %(link_start_freebsd) ; mcall-linux : %(link_start_linux) ; mcall-gnu : %(link_start_gnu) ; mcall-netbsd : %(link_start_netbsd) ; mcall-openbsd: %(link_start_openbsd) ; : %(link_start_default) }
|
||||
|
||||
*link_start_gcn:
|
||||
-T ogc.ld%s
|
||||
|
||||
*link_start_yellowknife:
|
||||
-T yellowknife.ld%s
|
||||
|
||||
*link_start_mvme:
|
||||
-Ttext 0x40000
|
||||
|
||||
*link_start_sim:
|
||||
|
||||
|
||||
*link_start_freebsd:
|
||||
|
||||
|
||||
*link_start_gnu:
|
||||
|
||||
|
||||
*link_start_linux:
|
||||
|
||||
|
||||
*link_start_netbsd:
|
||||
|
||||
|
||||
*link_start_openbsd:
|
||||
-Ttext 0x400074
|
||||
|
||||
*link_start_windiss:
|
||||
|
||||
|
||||
*link_start_default:
|
||||
|
||||
|
||||
*link_os:
|
||||
%{mads : %(link_os_ads) ; myellowknife : %(link_os_yellowknife) ; mmvme : %(link_os_mvme) ; msim : %(link_os_sim) ; mwindiss : %(link_os_windiss) ; mcall-freebsd: %(link_os_freebsd) ; mcall-linux : %(link_os_linux) ; mcall-gnu : %(link_os_gnu) ; mcall-netbsd : %(link_os_netbsd) ; mcall-openbsd: %(link_os_openbsd) ; : %(link_os_default) }
|
||||
|
||||
*link_os_ads:
|
||||
|
||||
|
||||
*link_os_yellowknife:
|
||||
|
||||
|
||||
*link_os_mvme:
|
||||
|
||||
|
||||
*link_os_sim:
|
||||
-m elf32ppcsim
|
||||
|
||||
*link_os_freebsd:
|
||||
%{p:%e`-p' not supported; use `-pg' and gprof(1)} %{Wl,*:%*} %{v:-V} %{assert*} %{R*} %{rpath*} %{defsym*} %{shared:-Bshareable %{h*} %{soname*}} %{!shared: %{!static: %{rdynamic: -export-dynamic} %{!dynamic-linker:-dynamic-linker %(fbsd_dynamic_linker) }} %{static:-Bstatic}} %{symbolic:-Bsymbolic}
|
||||
|
||||
*link_os_linux:
|
||||
-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}
|
||||
|
||||
*link_os_gnu:
|
||||
-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}
|
||||
|
||||
*link_os_netbsd:
|
||||
%{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}
|
||||
|
||||
*link_os_openbsd:
|
||||
|
||||
|
||||
*link_os_windiss:
|
||||
|
||||
|
||||
*link_os_default:
|
||||
|
||||
|
||||
*cc1_endian_big:
|
||||
|
||||
|
||||
*cc1_endian_little:
|
||||
%{!mstrict-align: %{!mno-strict-align: %{!mcall-i960-old: -mstrict-align } }}
|
||||
|
||||
*cc1_endian_default:
|
||||
%(cc1_endian_big)
|
||||
|
||||
*cpp_os_ads:
|
||||
|
||||
|
||||
*cpp_os_yellowknife:
|
||||
|
||||
|
||||
*cpp_os_mvme:
|
||||
|
||||
|
||||
*cpp_os_sim:
|
||||
|
||||
|
||||
*cpp_os_freebsd:
|
||||
-D__PPC__ -D__ppc__ -D__PowerPC__ -D__powerpc__ -Acpu=powerpc -Amachine=powerpc
|
||||
|
||||
*cpp_os_gnu:
|
||||
-D__unix__ -D__gnu_hurd__ -D__GNU__ %{!undef: %{!ansi: -Dunix -D__unix}} -Asystem=gnu -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}
|
||||
|
||||
*cpp_os_linux:
|
||||
-D__unix__ -D__gnu_linux__ -D__linux__ %{!undef: %{!ansi: %{!std=*:-Dunix -D__unix -Dlinux -D__linux} %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} -Asystem=linux -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT}
|
||||
|
||||
*cpp_os_netbsd:
|
||||
-D__powerpc__ -D__NetBSD__ -D__KPRINTF_ATTRIBUTE__
|
||||
|
||||
*cpp_os_openbsd:
|
||||
%{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}
|
||||
|
||||
*cpp_os_windiss:
|
||||
-D__rtasim -D__EABI__ -D__ppc %{!msoft-float: -D__hardfp}
|
||||
|
||||
*cpp_os_default:
|
||||
|
||||
|
||||
*fbsd_dynamic_linker:
|
||||
/usr/libexec/ld-elf.so.1
|
||||
|
||||
*link_command:
|
||||
%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %{pie:-pie} %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{fprofile-arcs|fprofile-generate:-lgcov} %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}}
|
||||
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
#---------------------------------------------------------------------------------
|
||||
# the prefix on the compiler executables
|
||||
#---------------------------------------------------------------------------------
|
||||
PREFIX := powerpc-gekko-
|
||||
|
||||
export CC := $(PREFIX)gcc
|
||||
export CXX := $(PREFIX)g++
|
||||
export AR := $(PREFIX)ar
|
||||
export OBJCOPY := $(PREFIX)objcopy
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.a:
|
||||
#---------------------------------------------------------------------------------
|
||||
@echo $(notdir $@)
|
||||
@$(AR) -rc $@ $^
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.o: %.cpp
|
||||
@echo $(notdir $<)
|
||||
@$(CXX) -MMD -MF $(DEPSDIR)/$*.d $(CXXFLAGS) -c $< -o $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.o: %.c
|
||||
@echo $(notdir $<)
|
||||
@$(CC) -MMD -MF $(DEPSDIR)/$*.d $(CFLAGS) -c $< -o $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.o: %.s
|
||||
@echo $(notdir $<)
|
||||
@$(CC) -MMD -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(ASFLAGS) -c $< -o $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.o: %.S
|
||||
@echo $(notdir $<)
|
||||
@$(CC) -MMD -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(ASFLAGS) -c $< -o $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# canned command sequence for binary data
|
||||
#---------------------------------------------------------------------------------
|
||||
define bin2o
|
||||
cp $(<) $(*).tmp
|
||||
alignbin $(*).tmp
|
||||
$(OBJCOPY) -I binary -O elf32-powerpc -B powerpc \
|
||||
--rename-section .data=.rodata,readonly,data,contents,alloc \
|
||||
--redefine-sym _binary_`(echo $(*) | tr . _)`_tmp_start=`(echo $(*) | tr . _)`\
|
||||
--redefine-sym _binary_`(echo $(*) | tr . _)`_tmp_end=`(echo $(*) | tr . _)`_end\
|
||||
--redefine-sym _binary_`(echo $(*) | tr . _)`_tmp_size=`(echo $(*) | tr . _)`_size\
|
||||
$(*).tmp $(@)
|
||||
echo "extern const u32" `(echo $(*) | tr . _)`"_end[];" >> $(*).h
|
||||
echo "extern const u8" `(echo $(*) | tr . _)`"[];" >> $(*).h
|
||||
echo "extern const u32" `(echo $(*) | tr . _)`_size[]";" >> $(*).h
|
||||
rm $(*).tmp
|
||||
endef
|
||||
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
-include $(DEVKITPPC)/base_rules
|
||||
|
||||
%.dol: %.elf
|
||||
@echo output ... $(notdir $@)
|
||||
@$(OBJCOPY) -O binary $< $@
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
%.elf:
|
||||
@echo linking ... $(notdir $@)
|
||||
@$(LD) $^ $(LDFLAGS) $(LIBPATHS) $(LIBS) -o $@
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
DEVKITPPC=$INSTALLDIR/devkitPPC
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# Install and build the gamecube crt and libogc
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
echo "installing specs ..."
|
||||
cp `pwd`/dkp-crtls/gcn* $DEVKITPPC/$target/lib/
|
||||
cp `pwd`/dkp-crtls/ogc.ld $DEVKITPPC/$target/lib/
|
||||
cp `pwd`/dkp-crtls/specs $DEVKITPPC/lib/gcc/$target/$GCC_VER/specs
|
||||
|
||||
echo "building libogc ..."
|
||||
cd $LIBOGC_SRCDIR
|
||||
$MAKE
|
||||
echo "installing libogc ..."
|
||||
$MAKE install
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# copy base rulesets
|
||||
#---------------------------------------------------------------------------------
|
||||
cd $BUILDSCRIPTDIR
|
||||
cp dkp-rules/* $DEVKITPPC
|
||||
|
||||
|
||||
|
|
@ -1,94 +0,0 @@
|
|||
#!/bin/sh
|
||||
#---------------------------------------------------------------------------------
|
||||
# Check Parameters
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
prefix=$INSTALLDIR/devkitPPC
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build and install binutils
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
mkdir -p $target/binutils
|
||||
cd $target/binutils
|
||||
|
||||
../../$BINUTILS_SRCDIR/configure \
|
||||
--prefix=$prefix --target=$target --disable-nls --disable-shared --disable-debug \
|
||||
--with-gcc --with-gnu-as --with-gnu-ld --with-stabs \
|
||||
2>&1 | tee binutils_configure.log
|
||||
|
||||
|
||||
$MAKE | tee binutils_make.log 2>&1
|
||||
$MAKE install | tee binutils_install.log 2>&1
|
||||
|
||||
cd $BUILDSCRIPTDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# remove temp stuff to conserve disc space
|
||||
#---------------------------------------------------------------------------------
|
||||
rm -fr $target/binutils
|
||||
rm -fr $BINUTILS_SRCDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build and install just the c compiler
|
||||
#---------------------------------------------------------------------------------
|
||||
mkdir -p $target/gcc
|
||||
cd $target/gcc
|
||||
|
||||
|
||||
../../$GCC_SRCDIR/configure \
|
||||
--enable-languages=c,c++ \
|
||||
--with-cpu=750\
|
||||
--with-gcc --with-gnu-ld --with-gnu-as --with-stabs \
|
||||
--with-included-gettext --without-headers\
|
||||
--disable-nls --disable-shared --enable-threads --disable-multilib\
|
||||
--disable-win32-registry\
|
||||
--target=$target \
|
||||
--with-newlib \
|
||||
--prefix=$prefix -v\
|
||||
2>&1 | tee gcc_configure.log
|
||||
|
||||
$MAKE all-gcc | tee gcc_make.log 2>&1
|
||||
$MAKE install-gcc | tee gcc_install.log 2>&1
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build and install newlib
|
||||
#---------------------------------------------------------------------------------
|
||||
cd $BUILDSCRIPTDIR
|
||||
mkdir -p $target/newlib
|
||||
cd $target/newlib
|
||||
mkdir -p etc
|
||||
|
||||
$BUILDSCRIPTDIR/$NEWLIB_SRCDIR/configure --target=$target \
|
||||
--prefix=$prefix \
|
||||
--enable-serial-configure \
|
||||
--enable-newlib-mb \
|
||||
| tee newlib_configure.log 2>&1
|
||||
|
||||
$MAKE all | tee newlib_make.log 2>&1
|
||||
$MAKE install | tee newlib_install.log 2>&1
|
||||
|
||||
cd $BUILDSCRIPTDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# remove temp stuff to conserve disc space
|
||||
#---------------------------------------------------------------------------------
|
||||
rm -fr $target/newlib
|
||||
rm -fr $NEWLIB_SRCDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# build and install the final compiler
|
||||
#---------------------------------------------------------------------------------
|
||||
|
||||
cd $target/gcc
|
||||
|
||||
$MAKE | tee gcc_final_make.log 2>&1
|
||||
$MAKE install | tee gcc_final_install.log 2>&1
|
||||
|
||||
cd $BUILDSCRIPTDIR
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# remove temp stuff to conserve disc space
|
||||
#---------------------------------------------------------------------------------
|
||||
rm -fr $target/gcc
|
||||
rm -fr $GCC_SRCDIR
|
||||
Loading…
Reference in New Issue
Block a user