Set remaining header fields from linker output

This commit is contained in:
Aetias
2023-10-21 13:07:44 +02:00
parent 8e19eaee88
commit 1221e6188d
6 changed files with 35 additions and 27 deletions
+1 -1
View File
@@ -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
+1 -2
View File
@@ -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
+4 -4
View File
@@ -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
+3
View File
@@ -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:
+25 -19
View File
@@ -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));
+1 -1
View File
@@ -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;