From ec48a31f23a090ed61579b9c5891bbee9059f2e2 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 29 Jan 2021 18:32:52 +1000 Subject: [PATCH] Decompile osInitialize --- ld/pd.ld | 10 +- src/game/data/data_000000.c | 5 +- src/include/game/data/data_000000.h | 2 +- src/include/gvars/gvars.h | 1 + src/include/libultra_internal.h | 4 +- src/lib/ultra/os/initialize.c | 221 +++++++--------------------- 6 files changed, 68 insertions(+), 175 deletions(-) diff --git a/ld/pd.ld b/ld/pd.ld index 7a7f59442..6fc0b8491 100644 --- a/ld/pd.ld +++ b/ld/pd.ld @@ -134,13 +134,15 @@ SECTIONS osMemSize = 0x80000318; osAppNMIBuffer = 0x8000031c; - var803f50b8 = 0x803f50b8; - vara00002e8 = 0xa00002e8; - vara4500004 = 0xa4500004; - varbc000c02 = 0xbc000c02; /* for ntsc-beta */ var800902e4 = 0x800902e4; /* for ntsc-beta */ var800902e8 = 0x800902e8; /* for ntsc-beta */ + var803f50b8 = 0x803f50b8; + + vara00002e8 = 0xa00002e8; + + varbc000c02 = 0xbc000c02; /* for ntsc-beta */ + /*************************************************************************** * romheader * ------------------------------------------------------------------------- diff --git a/src/game/data/data_000000.c b/src/game/data/data_000000.c index 6fc6d686a..8655a7fd3 100644 --- a/src/game/data/data_000000.c +++ b/src/game/data/data_000000.c @@ -3041,9 +3041,8 @@ u32 var8005cf50 = 0x00000000; u32 var8005cf54 = 0x00000000; u32 var8005cf58 = 0x00000000; u32 var8005cf5c = 0x00000000; -u32 var8005cf60 = 0x00000000; -u32 var8005cf64 = 0x03b9aca0; -u32 osViClock = 0x02e6d354; +OSTime osClockRate = 62500000; +u32 osViClock = VI_NTSC_CLOCK; u32 var8005cf6c = 0x00000000; u32 __osGlobalIntMask = 0x003fff01; u32 var8005cf74 = 0x00000000; diff --git a/src/include/game/data/data_000000.h b/src/include/game/data/data_000000.h index b9fdd5edc..8ade08b94 100644 --- a/src/include/game/data/data_000000.h +++ b/src/include/game/data/data_000000.h @@ -57,7 +57,7 @@ extern u32 __osViDevMgr; extern u32 var8005cefc; extern OSDevMgr __osPiDevMgr; extern u32 var8005cf30; -extern u32 var8005cf60; +extern OSTime osClockRate; extern u32 osViClock; extern u32 var8005cf6c; extern u32 __osGlobalIntMask; diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index 8caf69700..c8430dea5 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -358,6 +358,7 @@ extern u32 piEventQueue; extern u32 piEventBuf; extern u32 var800907f0; extern u32 __osPfsPifRam; +extern u32 __osFinalRom; extern u32 var80090a70; extern u32 var80090ab0; extern u32 var80090ad0; diff --git a/src/include/libultra_internal.h b/src/include/libultra_internal.h index 20946ed65..14c1af293 100644 --- a/src/include/libultra_internal.h +++ b/src/include/libultra_internal.h @@ -29,8 +29,8 @@ void __osPiGetAccess(); void __osSetSR(u32); u32 __osGetSR(); void __osSetFpcCsr(u32); -s32 __osSiRawReadIo(void*, u32*); -s32 __osSiRawWriteIo(void*, u32); +s32 __osSiRawReadIo(u32, u32*); +s32 __osSiRawWriteIo(u32, u32); s32 osPiRawReadIo(u32 a0, u32 *a1); void __osSpSetStatus(u32); u32 __osSpGetStatus(); diff --git a/src/lib/ultra/os/initialize.c b/src/lib/ultra/os/initialize.c index 95705faaa..4ec94a1e5 100644 --- a/src/lib/ultra/os/initialize.c +++ b/src/lib/ultra/os/initialize.c @@ -1,167 +1,58 @@ #include +#include "game/data/data_000000.h" +#include "gvars/gvars.h" -GLOBAL_ASM( -glabel osInitialize -/* 5b60: 27bdffc8 */ addiu $sp,$sp,-56 -/* 5b64: afbf001c */ sw $ra,0x1c($sp) -/* 5b68: 240e0001 */ addiu $t6,$zero,0x1 -/* 5b6c: 3c018009 */ lui $at,%hi(__osFinalRom) -/* 5b70: afb10018 */ sw $s1,0x18($sp) -/* 5b74: afb00014 */ sw $s0,0x14($sp) -/* 5b78: 0c012b34 */ jal __osGetSR -/* 5b7c: ac2e0a60 */ sw $t6,%lo(__osFinalRom)($at) -/* 5b80: 3c012000 */ lui $at,0x2000 -/* 5b84: 0c012b30 */ jal __osSetSR -/* 5b88: 00412025 */ or $a0,$v0,$at -/* 5b8c: 3c040100 */ lui $a0,0x100 -/* 5b90: 0c012078 */ jal __osSetFpcCsr -/* 5b94: 34840800 */ ori $a0,$a0,0x800 -/* 5b98: 3c101fc0 */ lui $s0,0x1fc0 -/* 5b9c: 361007fc */ ori $s0,$s0,0x7fc -/* 5ba0: 27b10034 */ addiu $s1,$sp,0x34 -/* 5ba4: 02202825 */ or $a1,$s1,$zero -/* 5ba8: 0c012b38 */ jal __osSiRawReadIo -/* 5bac: 02002025 */ or $a0,$s0,$zero -/* 5bb0: 10400005 */ beqz $v0,.L00005bc8 -/* 5bb4: 02002025 */ or $a0,$s0,$zero -.L00005bb8: -/* 5bb8: 0c012b38 */ jal __osSiRawReadIo -/* 5bbc: 02202825 */ or $a1,$s1,$zero -/* 5bc0: 5440fffd */ bnezl $v0,.L00005bb8 -/* 5bc4: 02002025 */ or $a0,$s0,$zero -.L00005bc8: -/* 5bc8: 8fa50034 */ lw $a1,0x34($sp) -/* 5bcc: 02002025 */ or $a0,$s0,$zero -/* 5bd0: 34af0008 */ ori $t7,$a1,0x8 -/* 5bd4: 0c012b4c */ jal __osSiRawWriteIo -/* 5bd8: 01e02825 */ or $a1,$t7,$zero -/* 5bdc: 10400008 */ beqz $v0,.L00005c00 -/* 5be0: 00000000 */ nop -/* 5be4: 8fa50034 */ lw $a1,0x34($sp) -.L00005be8: -/* 5be8: 02002025 */ or $a0,$s0,$zero -/* 5bec: 34b80008 */ ori $t8,$a1,0x8 -/* 5bf0: 0c012b4c */ jal __osSiRawWriteIo -/* 5bf4: 03002825 */ or $a1,$t8,$zero -/* 5bf8: 5440fffb */ bnezl $v0,.L00005be8 -/* 5bfc: 8fa50034 */ lw $a1,0x34($sp) -.L00005c00: -/* 5c00: 3c027000 */ lui $v0,%hi(__osExceptionPreamble) -/* 5c04: 244234f0 */ addiu $v0,$v0,%lo(__osExceptionPreamble) -/* 5c08: 8c410000 */ lw $at,0x0($v0) -/* 5c0c: 3c108000 */ lui $s0,0x8000 -/* 5c10: 3c098000 */ lui $t1,0x8000 -/* 5c14: ae010000 */ sw $at,0x0($s0) -/* 5c18: 8c480004 */ lw $t0,0x4($v0) -/* 5c1c: 35290080 */ ori $t1,$t1,0x80 -/* 5c20: 3c0c8000 */ lui $t4,0x8000 -/* 5c24: ae080004 */ sw $t0,0x4($s0) -/* 5c28: 8c410008 */ lw $at,0x8($v0) -/* 5c2c: 358c0100 */ ori $t4,$t4,0x100 -/* 5c30: 3c0f8000 */ lui $t7,0x8000 -/* 5c34: ae010008 */ sw $at,0x8($s0) -/* 5c38: 8c48000c */ lw $t0,0xc($v0) -/* 5c3c: 35ef0180 */ ori $t7,$t7,0x180 -/* 5c40: 02002025 */ or $a0,$s0,$zero -/* 5c44: ae08000c */ sw $t0,0xc($s0) -/* 5c48: 8c410000 */ lw $at,0x0($v0) -/* 5c4c: 24050190 */ addiu $a1,$zero,0x190 -/* 5c50: ad210000 */ sw $at,0x0($t1) -/* 5c54: 8c4b0004 */ lw $t3,0x4($v0) -/* 5c58: ad2b0004 */ sw $t3,0x4($t1) -/* 5c5c: 8c410008 */ lw $at,0x8($v0) -/* 5c60: ad210008 */ sw $at,0x8($t1) -/* 5c64: 8c4b000c */ lw $t3,0xc($v0) -/* 5c68: ad2b000c */ sw $t3,0xc($t1) -/* 5c6c: 8c410000 */ lw $at,0x0($v0) -/* 5c70: ad810000 */ sw $at,0x0($t4) -/* 5c74: 8c4e0004 */ lw $t6,0x4($v0) -/* 5c78: ad8e0004 */ sw $t6,0x4($t4) -/* 5c7c: 8c410008 */ lw $at,0x8($v0) -/* 5c80: ad810008 */ sw $at,0x8($t4) -/* 5c84: 8c4e000c */ lw $t6,0xc($v0) -/* 5c88: ad8e000c */ sw $t6,0xc($t4) -/* 5c8c: 8c410000 */ lw $at,0x0($v0) -/* 5c90: ade10000 */ sw $at,0x0($t7) -/* 5c94: 8c590004 */ lw $t9,0x4($v0) -/* 5c98: adf90004 */ sw $t9,0x4($t7) -/* 5c9c: 8c410008 */ lw $at,0x8($v0) -/* 5ca0: ade10008 */ sw $at,0x8($t7) -/* 5ca4: 8c59000c */ lw $t9,0xc($v0) -/* 5ca8: 0c012b60 */ jal osWritebackDCache -/* 5cac: adf9000c */ sw $t9,0xc($t7) -/* 5cb0: 02002025 */ or $a0,$s0,$zero -/* 5cb4: 0c012054 */ jal osInvalICache -/* 5cb8: 24050190 */ addiu $a1,$zero,0x190 -/* 5cbc: 0c001770 */ jal func00005dc0 -/* 5cc0: 00000000 */ nop -/* 5cc4: 0c000bfc */ jal osMapTLBRdb -/* 5cc8: 00000000 */ nop -/* 5ccc: 3c108006 */ lui $s0,%hi(var8005cf60) -/* 5cd0: 2610cf60 */ addiu $s0,$s0,%lo(var8005cf60) -/* 5cd4: 8e040000 */ lw $a0,0x0($s0) -/* 5cd8: 8e050004 */ lw $a1,0x4($s0) -/* 5cdc: 24060000 */ addiu $a2,$zero,0x0 -/* 5ce0: 0c012bda */ jal __ll_mul -/* 5ce4: 24070003 */ addiu $a3,$zero,0x3 -/* 5ce8: 00402025 */ or $a0,$v0,$zero -/* 5cec: 00602825 */ or $a1,$v1,$zero -/* 5cf0: 24060000 */ addiu $a2,$zero,0x0 -/* 5cf4: 0c012b9a */ jal __ull_div -/* 5cf8: 24070004 */ addiu $a3,$zero,0x4 -/* 5cfc: ae020000 */ sw $v0,0x0($s0) -/* 5d00: ae030004 */ sw $v1,0x4($s0) -/* 5d04: 3c088000 */ lui $t0,0x8000 -/* 5d08: 8d08030c */ lw $t0,0x30c($t0) -/* 5d0c: 3c048000 */ lui $a0,0x8000 -/* 5d10: 2484031c */ addiu $a0,$a0,0x31c -/* 5d14: 15000003 */ bnez $t0,.L00005d24 -/* 5d18: 00000000 */ nop -/* 5d1c: 0c012c30 */ jal bzero -/* 5d20: 24050040 */ addiu $a1,$zero,0x40 -.L00005d24: -/* 5d24: 3c028000 */ lui $v0,0x8000 -/* 5d28: 8c420300 */ lw $v0,0x300($v0) -/* 5d2c: 3c0a02f5 */ lui $t2,0x2f5 -/* 5d30: 354ab2d2 */ ori $t2,$t2,0xb2d2 -/* 5d34: 14400004 */ bnez $v0,.L00005d48 -/* 5d38: 24010002 */ addiu $at,$zero,0x2 -/* 5d3c: 3c018006 */ lui $at,%hi(osViClock) -/* 5d40: 1000000b */ b .L00005d70 -/* 5d44: ac2acf68 */ sw $t2,%lo(osViClock)($at) -.L00005d48: -/* 5d48: 14410006 */ bne $v0,$at,.L00005d64 -/* 5d4c: 3c0b02e6 */ lui $t3,0x2e6 -/* 5d50: 3c0902e6 */ lui $t1,0x2e6 -/* 5d54: 3529d354 */ ori $t1,$t1,0xd354 -/* 5d58: 3c018006 */ lui $at,%hi(osViClock) -/* 5d5c: 10000004 */ b .L00005d70 -/* 5d60: ac29cf68 */ sw $t1,%lo(osViClock)($at) -.L00005d64: -/* 5d64: 356bd354 */ ori $t3,$t3,0xd354 -/* 5d68: 3c018006 */ lui $at,%hi(osViClock) -/* 5d6c: ac2bcf68 */ sw $t3,%lo(osViClock)($at) -.L00005d70: -/* 5d70: 0c012c58 */ jal __osGetCause -/* 5d74: 00000000 */ nop -/* 5d78: 304d1000 */ andi $t5,$v0,0x1000 -/* 5d7c: 11a00003 */ beqz $t5,.L00005d8c -/* 5d80: 240c0001 */ addiu $t4,$zero,0x1 -.L00005d84: -/* 5d84: 1000ffff */ b .L00005d84 -/* 5d88: 00000000 */ nop -.L00005d8c: -/* 5d8c: 3c0ea450 */ lui $t6,0xa450 -/* 5d90: adcc0008 */ sw $t4,0x8($t6) -/* 5d94: 24183fff */ addiu $t8,$zero,0x3fff -/* 5d98: 3c0fa450 */ lui $t7,0xa450 -/* 5d9c: adf80010 */ sw $t8,0x10($t7) -/* 5da0: 2419000f */ addiu $t9,$zero,0xf -/* 5da4: 3c08a450 */ lui $t0,0xa450 -/* 5da8: ad190014 */ sw $t9,0x14($t0) -/* 5dac: 8fbf001c */ lw $ra,0x1c($sp) -/* 5db0: 8fb10018 */ lw $s1,0x18($sp) -/* 5db4: 8fb00014 */ lw $s0,0x14($sp) -/* 5db8: 03e00008 */ jr $ra -/* 5dbc: 27bd0038 */ addiu $sp,$sp,0x38 -); +typedef struct { + unsigned int inst1; + unsigned int inst2; + unsigned int inst3; + unsigned int inst4; +} __osExceptionVector; + +extern __osExceptionVector __osExceptionPreamble; +extern u32 osAppNMIBuffer; + +void osInitialize() +{ + u32 pifdata; + + __osFinalRom = TRUE; + __osSetSR(__osGetSR() | SR_CU1); + __osSetFpcCsr(FPCSR_FS | FPCSR_EV); + + while (__osSiRawReadIo(PIF_RAM_END - 3, &pifdata)); + + while (__osSiRawWriteIo(PIF_RAM_END - 3, pifdata | 8)); + + *(__osExceptionVector *)UT_VEC = __osExceptionPreamble; + *(__osExceptionVector *)XUT_VEC = __osExceptionPreamble; + *(__osExceptionVector *)ECC_VEC = __osExceptionPreamble; + *(__osExceptionVector *)E_VEC = __osExceptionPreamble; + + osWritebackDCache((void *)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); + osInvalICache((void *)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector)); + func00005dc0(); + osMapTLBRdb(); + + osClockRate = osClockRate * 3 / 4; + + if (osResetType == RESET_TYPE_COLD_RESET) { + bzero(&osAppNMIBuffer, 0x40); + } + + if (osTvType == OS_TV_PAL) { + osViClock = VI_PAL_CLOCK; + } else if (osTvType == OS_TV_MPAL) { + osViClock = VI_NTSC_CLOCK; + } else { + osViClock = VI_NTSC_CLOCK; + } + + if (__osGetCause() & CAUSE_IP5) { + while (1); + } + + *(u32 *)PHYS_TO_K1(AI_CONTROL_REG) = 1; + *(u32 *)PHYS_TO_K1(AI_DACRATE_REG) = 0x3fff; + *(u32 *)PHYS_TO_K1(AI_BITRATE_REG) = 0xf; +}