This reverts commit f24deb9301
.
This commit is contained in:
parent
f24deb9301
commit
d1ab525552
9 changed files with 26 additions and 175 deletions
2
Makefile
2
Makefile
|
@ -473,7 +473,7 @@ endif
|
||||||
$(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
|
$(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
|
||||||
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld
|
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld
|
||||||
|
|
||||||
LDFLAGS = -Map ../../$(MAP) --no-warn-rwx-segments
|
LDFLAGS = -Map ../../$(MAP)
|
||||||
$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall
|
$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall
|
||||||
@echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ <objects> <lib>"
|
@echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ <objects> <lib>"
|
||||||
@cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat
|
@cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld --print-memory-usage -o ../../$@ $(OBJS_REL) $(LIB) | cat
|
||||||
|
|
|
@ -3,6 +3,4 @@
|
||||||
|
|
||||||
extern u32 IntrMain[];
|
extern u32 IntrMain[];
|
||||||
|
|
||||||
extern void ReInitializeEWRAM();
|
|
||||||
|
|
||||||
#endif //GUARD_CRT0_H
|
#endif //GUARD_CRT0_H
|
||||||
|
|
|
@ -6,10 +6,8 @@
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
|
|
||||||
#define IWRAM_DATA __attribute__((section(".bss")))
|
#define IWRAM_DATA __attribute__((section("iwram_data")))
|
||||||
#define EWRAM_DATA __attribute__((section(".sbss")))
|
#define EWRAM_DATA __attribute__((section("ewram_data")))
|
||||||
#define IWRAM_INIT __attribute__((section(".iwram")))
|
|
||||||
#define EWRAM_INIT __attribute__((section(".ewram")))
|
|
||||||
#define UNUSED __attribute__((unused))
|
#define UNUSED __attribute__((unused))
|
||||||
|
|
||||||
#if MODERN
|
#if MODERN
|
||||||
|
|
38
ld_script.ld
38
ld_script.ld
|
@ -13,35 +13,19 @@ MEMORY
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
|
|
||||||
.ewram ORIGIN(EWRAM) : AT (__ewram_lma)
|
ewram 0x2000000 (NOLOAD) :
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__ewram_start = .;
|
|
||||||
*(.ewram*)
|
|
||||||
__ewram_end = .;
|
|
||||||
} > EWRAM
|
|
||||||
|
|
||||||
.ewram.sbss (NOLOAD) :
|
|
||||||
ALIGN(4)
|
ALIGN(4)
|
||||||
{
|
{
|
||||||
INCLUDE "sym_ewram.ld"
|
INCLUDE "sym_ewram.ld"
|
||||||
src/*.o(.sbss);
|
src/*.o(ewram_data);
|
||||||
gflib/*.o(.sbss);
|
gflib/*.o(ewram_data);
|
||||||
|
|
||||||
*libc.a:impure.o(.data);
|
*libc.a:impure.o(.data);
|
||||||
*libc.a:locale.o(.data);
|
*libc.a:locale.o(.data);
|
||||||
*libc.a:mallocr.o(.data);
|
*libc.a:mallocr.o(.data);
|
||||||
} > EWRAM
|
} > EWRAM
|
||||||
|
|
||||||
.iwram ORIGIN(IWRAM) : AT (__iwram_lma)
|
iwram 0x3000000 (NOLOAD) :
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__iwram_start = .;
|
|
||||||
*(.iwram*);
|
|
||||||
__iwram_end = .;
|
|
||||||
} > IWRAM
|
|
||||||
|
|
||||||
.iwram.bss (NOLOAD) :
|
|
||||||
ALIGN(4)
|
ALIGN(4)
|
||||||
{
|
{
|
||||||
/* .bss starts at 0x3000000 */
|
/* .bss starts at 0x3000000 */
|
||||||
|
@ -1340,20 +1324,6 @@ SECTIONS {
|
||||||
data/*.o(.rodata);
|
data/*.o(.rodata);
|
||||||
} > ROM = 0
|
} > ROM = 0
|
||||||
|
|
||||||
.data.iwram :
|
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__iwram_lma = .;
|
|
||||||
. = . + (__iwram_end - __iwram_start);
|
|
||||||
} > ROM = 0
|
|
||||||
|
|
||||||
.data.ewram :
|
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__ewram_lma = .;
|
|
||||||
. = . + (__ewram_end - __ewram_start);
|
|
||||||
} > ROM = 0
|
|
||||||
|
|
||||||
__rom_end = .;
|
__rom_end = .;
|
||||||
|
|
||||||
/* DWARF debug sections.
|
/* DWARF debug sections.
|
||||||
|
|
|
@ -12,32 +12,15 @@ MEMORY
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
|
ewram 0x2000000 (NOLOAD) :
|
||||||
|
|
||||||
.ewram ORIGIN(EWRAM) : AT (__ewram_lma)
|
|
||||||
ALIGN(4)
|
ALIGN(4)
|
||||||
{
|
{
|
||||||
__ewram_start = .;
|
src/*.o(ewram_data);
|
||||||
*(.ewram*)
|
gflib/*.o(ewram_data);
|
||||||
__ewram_end = .;
|
|
||||||
} > EWRAM
|
} > EWRAM
|
||||||
|
|
||||||
.ewram.sbss (NOLOAD) :
|
iwram 0x3000000 (NOLOAD) :
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
src/*.o(.sbss);
|
|
||||||
gflib/*.o(.sbss);
|
|
||||||
} > EWRAM
|
|
||||||
|
|
||||||
.iwram ORIGIN(IWRAM) : AT (__iwram_lma)
|
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__iwram_start = .;
|
|
||||||
*(.iwram*);
|
|
||||||
__iwram_end = .;
|
|
||||||
} > IWRAM
|
|
||||||
|
|
||||||
.iwram.bss (NOLOAD) :
|
|
||||||
ALIGN(4)
|
ALIGN(4)
|
||||||
{
|
{
|
||||||
src/*.o(.bss);
|
src/*.o(.bss);
|
||||||
|
@ -55,8 +38,9 @@ SECTIONS {
|
||||||
} > IWRAM
|
} > IWRAM
|
||||||
|
|
||||||
/* BEGIN ROM DATA */
|
/* BEGIN ROM DATA */
|
||||||
|
. = 0x8000000;
|
||||||
|
|
||||||
.text ORIGIN(ROM) :
|
.text :
|
||||||
ALIGN(4)
|
ALIGN(4)
|
||||||
{
|
{
|
||||||
src/rom_header.o(.text*);
|
src/rom_header.o(.text*);
|
||||||
|
@ -141,20 +125,6 @@ SECTIONS {
|
||||||
src/graphics.o(.rodata);
|
src/graphics.o(.rodata);
|
||||||
} > ROM =0
|
} > ROM =0
|
||||||
|
|
||||||
.data.iwram :
|
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__iwram_lma = .;
|
|
||||||
. = . + (__iwram_end - __iwram_start);
|
|
||||||
} > ROM = 0
|
|
||||||
|
|
||||||
.data.ewram :
|
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__ewram_lma = .;
|
|
||||||
. = . + (__ewram_end - __ewram_start);
|
|
||||||
} > ROM = 0
|
|
||||||
|
|
||||||
__rom_end = .;
|
__rom_end = .;
|
||||||
|
|
||||||
/* DWARF debug sections.
|
/* DWARF debug sections.
|
||||||
|
|
|
@ -12,32 +12,15 @@ MEMORY
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
|
ewram 0x2000000 (NOLOAD) :
|
||||||
.ewram ORIGIN(EWRAM) : AT (__ewram_lma)
|
|
||||||
ALIGN(4)
|
ALIGN(4)
|
||||||
{
|
{
|
||||||
__ewram_start = .;
|
src/*.o(ewram_data);
|
||||||
*(.ewram*)
|
gflib/*.o(ewram_data);
|
||||||
__ewram_end = .;
|
test/*.o(ewram_data);
|
||||||
} > EWRAM
|
} > EWRAM
|
||||||
|
|
||||||
.ewram.sbss (NOLOAD) :
|
iwram 0x3000000 (NOLOAD) :
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
src/*.o(.sbss);
|
|
||||||
gflib/*.o(.sbss);
|
|
||||||
test/*.o(.sbss);
|
|
||||||
} > EWRAM
|
|
||||||
|
|
||||||
.iwram ORIGIN(IWRAM) : AT (__iwram_lma)
|
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__iwram_start = .;
|
|
||||||
*(.iwram*);
|
|
||||||
__iwram_end = .;
|
|
||||||
} > IWRAM
|
|
||||||
|
|
||||||
.iwram.sbss (NOLOAD) :
|
|
||||||
ALIGN(4)
|
ALIGN(4)
|
||||||
{
|
{
|
||||||
src/*.o(.bss);
|
src/*.o(.bss);
|
||||||
|
@ -114,20 +97,6 @@ SECTIONS {
|
||||||
src/libisagbprn.o(.rodata);
|
src/libisagbprn.o(.rodata);
|
||||||
} > ROM =0
|
} > ROM =0
|
||||||
|
|
||||||
.data.iwram :
|
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__iwram_lma = .;
|
|
||||||
. = . + (__iwram_end - __iwram_start);
|
|
||||||
} > ROM = 0
|
|
||||||
|
|
||||||
.data.ewram :
|
|
||||||
ALIGN(4)
|
|
||||||
{
|
|
||||||
__ewram_lma = .;
|
|
||||||
. = . + (__ewram_end - __ewram_start);
|
|
||||||
} > ROM = 0
|
|
||||||
|
|
||||||
tests :
|
tests :
|
||||||
ALIGN(4)
|
ALIGN(4)
|
||||||
{
|
{
|
||||||
|
|
61
src/crt0.s
61
src/crt0.s
|
@ -6,28 +6,22 @@
|
||||||
|
|
||||||
.align 2, 0
|
.align 2, 0
|
||||||
Init::
|
Init::
|
||||||
@ Set up location for IRQ stack
|
|
||||||
mov r0, #PSR_IRQ_MODE
|
mov r0, #PSR_IRQ_MODE
|
||||||
msr cpsr_cf, r0
|
msr cpsr_cf, r0
|
||||||
ldr sp, sp_irq
|
ldr sp, sp_irq
|
||||||
@ Set up location for system stack
|
|
||||||
mov r0, #PSR_SYS_MODE
|
mov r0, #PSR_SYS_MODE
|
||||||
msr cpsr_cf, r0
|
msr cpsr_cf, r0
|
||||||
ldr sp, sp_sys
|
ldr sp, sp_sys
|
||||||
@ Prepare for interrupt handling
|
|
||||||
ldr r1, =INTR_VECTOR
|
ldr r1, =INTR_VECTOR
|
||||||
adr r0, IntrMain
|
adr r0, IntrMain
|
||||||
str r0, [r1]
|
str r0, [r1]
|
||||||
@ Dispatch memory reset request to hardware
|
.if MODERN
|
||||||
mov r0, #255 @ RESET_ALL
|
mov r0, #255 @ RESET_ALL
|
||||||
svc #1 << 16
|
svc #1 << 16
|
||||||
@ Fill RAM areas with appropriate data
|
.endif @ MODERN
|
||||||
bl InitializeWorkingMemory
|
|
||||||
@ Jump to AgbMain
|
|
||||||
ldr r1, =AgbMain + 1
|
ldr r1, =AgbMain + 1
|
||||||
mov lr, pc
|
mov lr, pc
|
||||||
bx r1
|
bx r1
|
||||||
@ Re-init if AgbMain exits
|
|
||||||
b Init
|
b Init
|
||||||
|
|
||||||
.align 2, 0
|
.align 2, 0
|
||||||
|
@ -130,54 +124,3 @@ IntrMain_RetAddr:
|
||||||
.pool
|
.pool
|
||||||
|
|
||||||
.align 2, 0 @ Don't pad with nop.
|
.align 2, 0 @ Don't pad with nop.
|
||||||
|
|
||||||
@ Fills initialized IWRAM and EWRAM sections in RAM from LMA areas in ROM
|
|
||||||
InitializeWorkingMemory:
|
|
||||||
push {r0-r3,lr}
|
|
||||||
ldr r0, =__iwram_lma
|
|
||||||
ldr r1, =__iwram_start
|
|
||||||
ldr r2, =__iwram_end
|
|
||||||
cmp r1, r2
|
|
||||||
beq skip_iwram_copy
|
|
||||||
bl CopyMemory_DMA
|
|
||||||
skip_iwram_copy:
|
|
||||||
ldr r0, =__ewram_lma
|
|
||||||
ldr r1, =__ewram_start
|
|
||||||
ldr r2, =__ewram_end
|
|
||||||
cmp r1, r2
|
|
||||||
beq skip_ewram_copy
|
|
||||||
bl CopyMemory_DMA
|
|
||||||
skip_ewram_copy:
|
|
||||||
pop {r0-r3,lr}
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
@ Uses a DMA transfer to load from r0 into r1 until r2
|
|
||||||
CopyMemory_DMA:
|
|
||||||
subs r2, r2, r1
|
|
||||||
lsr r2, r2, #2
|
|
||||||
mov r4, #0x80000000
|
|
||||||
orr r4, r4, #(1 << 26)
|
|
||||||
orr r2, r2, r4
|
|
||||||
ldr r3, =REG_DMA3
|
|
||||||
stmia r3, {r0, r1, r2}
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
.thumb
|
|
||||||
@ Called from C code to reinitialize working memory after a link connection failure
|
|
||||||
ReInitializeEWRAM::
|
|
||||||
ldr r0, =__ewram_lma
|
|
||||||
ldr r1, =__ewram_start
|
|
||||||
ldr r2, =__ewram_end
|
|
||||||
cmp r1, r2
|
|
||||||
beq EndReinitializeEWRAM
|
|
||||||
subs r2, r1
|
|
||||||
movs r3, #1
|
|
||||||
lsls r3, r3, #26
|
|
||||||
orrs r2, r2, r3
|
|
||||||
swi 0x0B
|
|
||||||
EndReinitializeEWRAM:
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
.pool
|
|
||||||
|
|
||||||
.align 2, 0 @ Don't pad with nop.
|
|
||||||
|
|
|
@ -93,6 +93,11 @@ void EnableVCountIntrAtLine150(void);
|
||||||
|
|
||||||
void AgbMain()
|
void AgbMain()
|
||||||
{
|
{
|
||||||
|
// Modern compilers are liberal with the stack on entry to this function,
|
||||||
|
// so RegisterRamReset may crash if it resets IWRAM.
|
||||||
|
#if !MODERN
|
||||||
|
RegisterRamReset(RESET_ALL);
|
||||||
|
#endif //MODERN
|
||||||
*(vu16 *)BG_PLTT = RGB_WHITE; // Set the backdrop to white on startup
|
*(vu16 *)BG_PLTT = RGB_WHITE; // Set the backdrop to white on startup
|
||||||
InitGpuRegManager();
|
InitGpuRegManager();
|
||||||
REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3;
|
REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "crt0.h"
|
|
||||||
#include "gpu_regs.h"
|
#include "gpu_regs.h"
|
||||||
#include "m4a.h"
|
#include "m4a.h"
|
||||||
#include "load_save.h"
|
#include "load_save.h"
|
||||||
|
@ -16,7 +15,6 @@ void ReloadSave(void)
|
||||||
u16 imeBackup = REG_IME;
|
u16 imeBackup = REG_IME;
|
||||||
REG_IME = 0;
|
REG_IME = 0;
|
||||||
RegisterRamReset(RESET_EWRAM);
|
RegisterRamReset(RESET_EWRAM);
|
||||||
ReInitializeEWRAM();
|
|
||||||
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);
|
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);
|
||||||
REG_IME = imeBackup;
|
REG_IME = imeBackup;
|
||||||
gMain.inBattle = FALSE;
|
gMain.inBattle = FALSE;
|
||||||
|
|
Loading…
Reference in a new issue