diff --git a/Makefile b/Makefile index 6af70c03..8f97777f 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ MW_LICENSE := $(TOOLS_DIR)/mwccarm/license.dat ASM_FLAGS := -proc arm5te -d $(REGION) -i asm -msgstyle gcc CC_FLAGS := -O1 -thumb -d $(REGION) -LD_FLAGS := -proc arm946e -nostdlib -nointerworking -nodead -m func_02000800 -map closure,unused -o main.bin -msgstyle gcc +LD_FLAGS := -proc arm946e -nostdlib -nointerworking -nodead -m Entry -map closure,unused -o main.bin -msgstyle gcc .PHONY: all all: tools rom diff --git a/asm/global.inc b/asm/global.inc index 285958c1..9aac9dab 100644 --- a/asm/global.inc +++ b/asm/global.inc @@ -206,7 +206,6 @@ .extern data_02000230 .extern data_02000750 .extern data_020007a2 -.extern data_02000800 .extern data_02000918 .extern data_0200091c .extern data_02000920 @@ -251094,7 +251093,7 @@ .extern func_0200022e .extern func_0200074c .extern func_020007a0 -.extern func_02000800 +.extern Entry .extern func_02000808 .extern func_020008b4 .extern func_020008c4 diff --git a/asm/main.s b/asm/main.s index 17b9effe..2c50af14 100644 --- a/asm/main.s +++ b/asm/main.s @@ -4,9 +4,9 @@ .text .include "main/header.s" - .global func_02000800 - arm_func_start func_02000800 -func_02000800: ; 0x02000800 + .global Entry + arm_func_start Entry +Entry: ; 0x02000800 mov ip, #0x4000000 str ip, [ip, #0x208] _02000808: @@ -81,7 +81,7 @@ _020008c4: subne sp, sp, #4 bx r1 .align 2, 0 - arm_func_end func_02000800 + arm_func_end Entry _02000918: .word data_027e0000 _0200091c: .word 0x00000500 _02000920: .word 0x05000000 diff --git a/tools/lcf.py b/tools/lcf.py index 6aaf6a50..9e188d3a 100644 --- a/tools/lcf.py +++ b/tools/lcf.py @@ -282,6 +282,9 @@ with open(f'{BUILD}arm9_linker_script.lcf', 'w') as file: file.write('\n') file.write(' .metadata : {\n') file.write(' WRITEW AutoloadDoneCallback;\n') + file.write(' WRITEW spAutoloadBlockInfosStart - ADDR(ARM9);\n') + file.write(' WRITEW Entry;\n') + file.write(' WRITEW ADDR(ARM9);\n') file.write(' } > METADATA\n') file.write('\n') for ov in OVERLAYS: diff --git a/tools/rom/build.c b/tools/rom/build.c index 42840108..205ef821 100644 --- a/tools/rom/build.c +++ b/tools/rom/build.c @@ -130,42 +130,42 @@ void InitHeader(Header *pHeader, const BuildInfo *info) { pHeader->unitcode = 0; pHeader->encSeedSelect = 0; - pHeader->capacity = 0; // will be set + pHeader->capacity = 0; memset(&pHeader->reserved0, 0, sizeof(pHeader->reserved0)); pHeader->dsRegion = 0; pHeader->romVersion = 0; pHeader->autostart = 0; - pHeader->arm9.offset = 0; // will be set after header - pHeader->arm9.entry = 0x2000800; // TODO: Get from linker - pHeader->arm9.baseAddr = 0x2000000; // TODO: Get from linker - pHeader->arm9.size = 0; // TODO: Get from arm9.lz + pHeader->arm9.offset = 0; + pHeader->arm9.entry = 0; + pHeader->arm9.baseAddr = 0; + pHeader->arm9.size = 0; - pHeader->arm7.offset = 0; // will be 256-aligned after ARM9 overlay files + pHeader->arm7.offset = 0; pHeader->arm7.entry = 0x2380000; pHeader->arm7.baseAddr = 0x2380000; - pHeader->arm7.size = 0; // TODO: Get from arm7.bin + pHeader->arm7.size = 0; - pHeader->fileNames.offset = 0; // will be 256-aligned after ARM7 program - pHeader->fileNames.size = 0; // will be set - pHeader->fileAllocs.offset = 0; // will be 256-aligned after file name table - pHeader->fileAllocs.size = 0; // will be set - pHeader->arm9Overlays.offset = 0; // will be 256-aligned after ARM9 program - pHeader->arm9Overlays.size = 0; // will be set + pHeader->fileNames.offset = 0; + pHeader->fileNames.size = 0; + pHeader->fileAllocs.offset = 0; + pHeader->fileAllocs.size = 0; + pHeader->arm9Overlays.offset = 0; + pHeader->arm9Overlays.size = 0; pHeader->arm7Overlays.offset = 0; pHeader->arm7Overlays.size = 0; pHeader->normalCmdSetting = 0x00416657; pHeader->key1CmdSetting = 0x081808f8; - pHeader->bannerOffset = 0; // will be 256-aligned after file alloc table - pHeader->secureAreaCrc = 0; // TODO: Calculate + pHeader->bannerOffset = 0; + pHeader->secureAreaCrc = 0; pHeader->secureAreaDelay = 0x0d7e; - pHeader->arm9AutoloadCallback = 0; // TODO: Get from linker (always 2000a74) + pHeader->arm9AutoloadCallback = 0; pHeader->arm7AutoloadCallback = 0x2380158; pHeader->secureAreaDisable = 0; - pHeader->romSize = 0; // Will be set + pHeader->romSize = 0; pHeader->headerSize = sizeof(Header); - pHeader->autoloadParamsOffset = 0; // TODO: Get from linker (always 4b64, see 2000b64) + pHeader->autoloadBlockInfosOffset = 0; memset(&pHeader->reserved1, 0, sizeof(pHeader->reserved1)); pHeader->romEnd = 0; pHeader->rwEnd = 0; @@ -173,7 +173,7 @@ void InitHeader(Header *pHeader, const BuildInfo *info) { memset(&pHeader->reserved3, 0, sizeof(pHeader->reserved3)); memcpy(&pHeader->logo, logo, sizeof(pHeader->logo)); pHeader->logoCrc = 0xcf56; - pHeader->headerCrc = 0; // Will be set + pHeader->headerCrc = 0; pHeader->debugRomOffset = 0; pHeader->debugSize = 0; pHeader->debugRamAddr = 0; @@ -533,6 +533,9 @@ bool RewriteFat(FILE *fpRom, size_t fatStart, const FatEntry *entries, size_t nu typedef struct { uint32_t autoloadCallback; + uint32_t autoloadBlockInfos; + uint32_t entryAddr; + uint32_t baseAddr; } Arm9Metadata; bool FinalizeHeader(FILE *fpRom, Header *pHeader, const char *arm7bios) { @@ -569,7 +572,10 @@ bool FinalizeHeader(FILE *fpRom, Header *pHeader, const char *arm7bios) { Arm9Metadata metadata; if (fread(&metadata, sizeof(metadata), 1, fp) != 1) FATAL("Failed to read ARM9 metadata '" ARM9_METADATA_FILE "'\n"); fclose(fp); + header.arm9.entry = metadata.entryAddr; + header.arm9.baseAddr = metadata.baseAddr; header.arm9AutoloadCallback = metadata.autoloadCallback; + header.autoloadBlockInfosOffset = header.arm9.offset + metadata.autoloadBlockInfos; header.headerCrc = Crc(&header, offsetof(Header, headerCrc)); diff --git a/tools/rom/rom.h b/tools/rom/rom.h index f8423adf..165e8107 100644 --- a/tools/rom/rom.h +++ b/tools/rom/rom.h @@ -45,7 +45,7 @@ typedef struct { /* 0078 */ uint64_t secureAreaDisable; /* 0080 */ uint32_t romSize; /* 0084 */ uint32_t headerSize; - /* 0088 */ uint32_t autoloadParamsOffset; + /* 0088 */ uint32_t autoloadBlockInfosOffset; /* 008c */ uint8_t reserved1[0x8]; /* 0094 */ uint16_t romEnd; /* 0096 */ uint16_t rwEnd;