mirror of
https://github.com/zeldaret/ph
synced 2026-07-06 21:13:02 -04:00
Set remaining header fields from linker output
This commit is contained in:
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user