mirror of
https://github.com/zeldaret/oot.git
synced 2024-11-14 05:19:36 +00:00
Disassemble the rom header and entrypoint function (#87)
The actual boot code (ipl3) is still only incbin'd. If someone else wants to disassemble it properly, go ahead. I might do it eventually, but for now it doesn't seem required for shiftability or anything interesting.
This commit is contained in:
parent
26b8e77f99
commit
0a59863457
6 changed files with 76 additions and 12 deletions
35
asm/entry.s
Normal file
35
asm/entry.s
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
.include "macro.inc"
|
||||||
|
|
||||||
|
# assembler directives
|
||||||
|
.set noat # allow manual use of $at
|
||||||
|
.set noreorder # don't insert nops after branches
|
||||||
|
.set gp=64 # allow use of 64-bit general purposee registers
|
||||||
|
|
||||||
|
.section .text
|
||||||
|
|
||||||
|
glabel entrypoint # 0x80000400
|
||||||
|
lui $t0, %hi(_bootSegmentBssStart) # $t0, 0x8001
|
||||||
|
addiu $t0, %lo(_bootSegmentBssStart) # addiu $t0, $t0, 0x2370
|
||||||
|
li $t1, %lo(_bootSegmentBssSize) # li $t1, 0x4A30
|
||||||
|
.L8000040C:
|
||||||
|
addi $t1, $t1, -8
|
||||||
|
sw $zero, ($t0)
|
||||||
|
sw $zero, 4($t0)
|
||||||
|
bnez $t1, .L8000040C
|
||||||
|
addi $t0, $t0, 8
|
||||||
|
lui $t2, %hi(bootproc) # $t2, 0x8000
|
||||||
|
lui $sp, %hi(gMainThread) # $sp, 0x8001
|
||||||
|
addiu $t2, %lo(bootproc) # addiu $t2, $t2, 0x0498
|
||||||
|
jr $t2
|
||||||
|
addiu $sp, %lo(gMainThread) # addiu $sp, $sp, 0x2D60
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
10
asm/ipl3.s
Normal file
10
asm/ipl3.s
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
.include "macro.inc"
|
||||||
|
|
||||||
|
# assembler directives
|
||||||
|
.set noat # allow manual use of $at
|
||||||
|
.set noreorder # don't insert nops after branches
|
||||||
|
.set gp=64 # allow use of 64-bit general purposee registers
|
||||||
|
|
||||||
|
.section .text
|
||||||
|
|
||||||
|
.incbin "baserom.z64", 0x40, 0xFC0
|
18
asm/rom_header.s
Normal file
18
asm/rom_header.s
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
* The Legend of Zelda: Ocarina of Time ROM header
|
||||||
|
*/
|
||||||
|
|
||||||
|
.byte 0x80, 0x37, 0x12, 0x40 /* PI BSD Domain 1 register */
|
||||||
|
.word 0x0000000F /* Clockrate setting */
|
||||||
|
.word 0x80000400 /* Entrypoint function (`entrypoint`) */
|
||||||
|
.word 0x0000144C /* Revision */
|
||||||
|
.word 0x917D18F6 /* Checksum 1 */
|
||||||
|
.word 0x69BC5453 /* Checksum 2 */
|
||||||
|
.word 0x00000000 /* Unknown */
|
||||||
|
.word 0x00000000 /* Unknown */
|
||||||
|
.ascii "THE LEGEND OF ZELDA " /* Internal ROM name */
|
||||||
|
.word 0x00000000 /* Unknown */
|
||||||
|
.word 0x0000004E /* Cartridge */
|
||||||
|
.ascii "ZL" /* Cartridge ID */
|
||||||
|
.ascii "P" /* Region */
|
||||||
|
.byte 0x0F /* Version */
|
|
@ -51,6 +51,7 @@ DECLARE_ROM_SEGMENT(map_grand_static)
|
||||||
DECLARE_ROM_SEGMENT(map_i_static)
|
DECLARE_ROM_SEGMENT(map_i_static)
|
||||||
DECLARE_ROM_SEGMENT(map_48x85_static)
|
DECLARE_ROM_SEGMENT(map_48x85_static)
|
||||||
|
|
||||||
|
DECLARE_SEGMENT(code)
|
||||||
DECLARE_ROM_SEGMENT(code)
|
DECLARE_ROM_SEGMENT(code)
|
||||||
DECLARE_BSS_SEGMENT(code)
|
DECLARE_BSS_SEGMENT(code)
|
||||||
|
|
||||||
|
|
12
spec
12
spec
|
@ -4,12 +4,14 @@
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
name "makerom"
|
name "makerom"
|
||||||
include "build/baserom/makerom.o"
|
include "build/asm/rom_header.o"
|
||||||
address 0x80000000
|
include "build/asm/ipl3.o"
|
||||||
|
include "build/asm/entry.o"
|
||||||
endseg
|
endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
name "boot"
|
name "boot"
|
||||||
|
address 0x80000460
|
||||||
include "build/src/boot/boot_main.o"
|
include "build/src/boot/boot_main.o"
|
||||||
include "build/src/boot/idle.o"
|
include "build/src/boot/idle.o"
|
||||||
include "build/src/boot/viconfig.o"
|
include "build/src/boot/viconfig.o"
|
||||||
|
@ -107,13 +109,11 @@ beginseg
|
||||||
include "build/src/libultra_boot_O1/__osGetHWIntrRoutine.o"
|
include "build/src/libultra_boot_O1/__osGetHWIntrRoutine.o"
|
||||||
include "build/asm/__osSetWatchLo.o"
|
include "build/asm/__osSetWatchLo.o"
|
||||||
include "build/data/rsp_boot.text.o"
|
include "build/data/rsp_boot.text.o"
|
||||||
address 0x80000460
|
|
||||||
endseg
|
endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
name "dmadata"
|
name "dmadata"
|
||||||
include "build/asm/dmadata.o"
|
include "build/asm/dmadata.o"
|
||||||
address 0x80016DA0
|
|
||||||
endseg
|
endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
|
@ -269,6 +269,7 @@ endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
name "code"
|
name "code"
|
||||||
|
address 0x8001CE60
|
||||||
include "build/src/code/z_en_a_keep.o"
|
include "build/src/code/z_en_a_keep.o"
|
||||||
include "build/data/z_en_a_keep.data.o"
|
include "build/data/z_en_a_keep.data.o"
|
||||||
include "build/src/code/z_en_item00.o"
|
include "build/src/code/z_en_item00.o"
|
||||||
|
@ -574,7 +575,6 @@ beginseg
|
||||||
include "build/src/code/z_construct.o"
|
include "build/src/code/z_construct.o"
|
||||||
include "build/data/rsp.text.o"
|
include "build/data/rsp.text.o"
|
||||||
include "build/data/rsp.rodata.o"
|
include "build/data/rsp.rodata.o"
|
||||||
address 0x8001CE60
|
|
||||||
endseg
|
endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
|
@ -586,9 +586,9 @@ endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
name "ovl_title"
|
name "ovl_title"
|
||||||
|
address 0x80800000
|
||||||
include "build/src/overlays/gamestates/ovl_title/z_title.o"
|
include "build/src/overlays/gamestates/ovl_title/z_title.o"
|
||||||
include "build/src/overlays/gamestates/ovl_title/z_title_reloc.o"
|
include "build/src/overlays/gamestates/ovl_title/z_title_reloc.o"
|
||||||
address 0x80800000
|
|
||||||
endseg
|
endseg
|
||||||
|
|
||||||
beginseg
|
beginseg
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include <global.h>
|
#include <global.h>
|
||||||
#include <vt.h>
|
#include <vt.h>
|
||||||
|
|
||||||
OSThread sMainThread;
|
OSThread gMainThread;
|
||||||
u8 sMainStack[0x900];
|
u8 sMainStack[0x900];
|
||||||
StackEntry sMainStackInfo;
|
StackEntry sMainStackInfo;
|
||||||
OSMesg sPiMgrCmdBuff[50];
|
OSMesg sPiMgrCmdBuff[50];
|
||||||
|
@ -24,7 +24,7 @@ void Main_ThreadEntry(void* arg0) {
|
||||||
DmaMgr_Start();
|
DmaMgr_Start();
|
||||||
osSyncPrintf("codeセグメントロード中...");
|
osSyncPrintf("codeセグメントロード中...");
|
||||||
var1 = osGetTime();
|
var1 = osGetTime();
|
||||||
DmaMgr_SendRequest1((u32)_dmadataSegmentEnd, (u32)_codeSegmentRomStart, _codeSegmentRomEnd - _codeSegmentRomStart,
|
DmaMgr_SendRequest1(_codeSegmentStart, (u32)_codeSegmentRomStart, _codeSegmentRomEnd - _codeSegmentRomStart,
|
||||||
"../idle.c", 238);
|
"../idle.c", 238);
|
||||||
var1 -= osGetTime();
|
var1 -= osGetTime();
|
||||||
osSyncPrintf("\rcodeセグメントロード中...完了\n");
|
osSyncPrintf("\rcodeセグメントロード中...完了\n");
|
||||||
|
@ -78,11 +78,11 @@ void Idle_ThreadEntry(void* a0) {
|
||||||
osViSetMode(&gViConfigMode);
|
osViSetMode(&gViConfigMode);
|
||||||
ViConfig_UpdateVi(1);
|
ViConfig_UpdateVi(1);
|
||||||
osViBlack(1);
|
osViBlack(1);
|
||||||
osViSwapBuffer(0x803da80);
|
osViSwapBuffer(0x803DA80); //! @bug Invalid vram address (probably intended to be 0x803DA800)
|
||||||
osCreatePiManager(0x96, &gPiMgrCmdQ, sPiMgrCmdBuff, 0x32);
|
osCreatePiManager(150, &gPiMgrCmdQ, sPiMgrCmdBuff, 50);
|
||||||
StackCheck_Init(&sMainStackInfo, sMainStack, sMainStack + sizeof(sMainStack), 0, 0x400, "main");
|
StackCheck_Init(&sMainStackInfo, sMainStack, sMainStack + sizeof(sMainStack), 0, 0x400, "main");
|
||||||
osCreateThread(&sMainThread, 3, Main_ThreadEntry, a0, sMainStack + sizeof(sMainStack), 10);
|
osCreateThread(&gMainThread, 3, Main_ThreadEntry, a0, sMainStack + sizeof(sMainStack), 10);
|
||||||
osStartThread(&sMainThread);
|
osStartThread(&gMainThread);
|
||||||
osSetThreadPri(NULL, 0);
|
osSetThreadPri(NULL, 0);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
Loading…
Reference in a new issue