From 979c112064ba3f58b2489517c1e10ab5ded714bb Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 4 Oct 2021 18:53:39 +1000 Subject: [PATCH] Decompile osGbpakInit --- src/lib/ultra/io/gbpakcheckconnector.c | 4 +- src/lib/ultra/io/gbpakinit.c | 240 +++++++++---------------- 2 files changed, 87 insertions(+), 157 deletions(-) diff --git a/src/lib/ultra/io/gbpakcheckconnector.c b/src/lib/ultra/io/gbpakcheckconnector.c index 491ecb0eb..06cd0b569 100644 --- a/src/lib/ultra/io/gbpakcheckconnector.c +++ b/src/lib/ultra/io/gbpakcheckconnector.c @@ -153,7 +153,7 @@ s32 osGbpakCheckConnector(OSPfs *pfs, u8 *status) // Compare them and bail out if different if (bcmp(blocks[thisslot][blocknum], blocks[0][blocknum], 32) != 0) { stilllooking = false; - goto foo; + goto end; } stilllooking = blocknum < 3; @@ -163,7 +163,7 @@ s32 osGbpakCheckConnector(OSPfs *pfs, u8 *status) stilllooking = blocknum; } -foo: +end: if (stilllooking) { return PFS_ERR_CONTRFAIL; } diff --git a/src/lib/ultra/io/gbpakinit.c b/src/lib/ultra/io/gbpakinit.c index d3de951e3..078aaeebd 100644 --- a/src/lib/ultra/io/gbpakinit.c +++ b/src/lib/ultra/io/gbpakinit.c @@ -1,4 +1,5 @@ #include +#include "libultra_internal.h" #include "constants.h" #include "bss.h" #include "data.h" @@ -8,158 +9,87 @@ OSTimer var80090ab0; OSMesgQueue var80090ad0; OSMesg var80090ae8; -GLOBAL_ASM( -glabel osGbpakInit -/* 6100: 27bdffa8 */ addiu $sp,$sp,-88 -/* 6104: afa40058 */ sw $a0,0x58($sp) -/* 6108: afbf0024 */ sw $ra,0x24($sp) -/* 610c: afa5005c */ sw $a1,0x5c($sp) -/* 6110: afa60060 */ sw $a2,0x60($sp) -/* 6114: aca00000 */ sw $zero,0x0($a1) -/* 6118: 27a40050 */ addiu $a0,$sp,0x50 -/* 611c: 27a20030 */ addiu $v0,$sp,0x30 -/* 6120: 240300fe */ addiu $v1,$zero,0xfe -.L00006124: -/* 6124: 24420001 */ addiu $v0,$v0,0x1 -/* 6128: 0044082b */ sltu $at,$v0,$a0 -/* 612c: 1420fffd */ bnez $at,.L00006124 -/* 6130: a043ffff */ sb $v1,-0x1($v0) -/* 6134: 8fa40058 */ lw $a0,0x58($sp) -/* 6138: 8fa50060 */ lw $a1,0x60($sp) -/* 613c: 24060400 */ addiu $a2,$zero,0x400 -/* 6140: 27a70030 */ addiu $a3,$sp,0x30 -/* 6144: 0c012d84 */ jal __osContRamWrite -/* 6148: afa00010 */ sw $zero,0x10($sp) -/* 614c: 24010002 */ addiu $at,$zero,0x2 -/* 6150: 14410008 */ bne $v0,$at,.L00006174 -/* 6154: 00401825 */ or $v1,$v0,$zero -/* 6158: 8fa40058 */ lw $a0,0x58($sp) -/* 615c: 8fa50060 */ lw $a1,0x60($sp) -/* 6160: 24060400 */ addiu $a2,$zero,0x400 -/* 6164: 27a70030 */ addiu $a3,$sp,0x30 -/* 6168: 0c012d84 */ jal __osContRamWrite -/* 616c: afa00010 */ sw $zero,0x10($sp) -/* 6170: 00401825 */ or $v1,$v0,$zero -.L00006174: -/* 6174: 10400003 */ beqz $v0,.L00006184 -/* 6178: 8fa40058 */ lw $a0,0x58($sp) -/* 617c: 10000065 */ b .L00006314 -/* 6180: 00601025 */ or $v0,$v1,$zero -.L00006184: -/* 6184: 8fa50060 */ lw $a1,0x60($sp) -/* 6188: 24060400 */ addiu $a2,$zero,0x400 -/* 618c: 0c012e18 */ jal __osContRamRead -/* 6190: 27a70030 */ addiu $a3,$sp,0x30 -/* 6194: 24010002 */ addiu $at,$zero,0x2 -/* 6198: 14410002 */ bne $v0,$at,.L000061a4 -/* 619c: 00401825 */ or $v1,$v0,$zero -/* 61a0: 24030004 */ addiu $v1,$zero,0x4 -.L000061a4: -/* 61a4: 10600003 */ beqz $v1,.L000061b4 -/* 61a8: 93af004f */ lbu $t7,0x4f($sp) -/* 61ac: 10000059 */ b .L00006314 -/* 61b0: 00601025 */ or $v0,$v1,$zero -.L000061b4: -/* 61b4: 240100fe */ addiu $at,$zero,0xfe -/* 61b8: 15e10003 */ bne $t7,$at,.L000061c8 -/* 61bc: 27a20030 */ addiu $v0,$sp,0x30 -/* 61c0: 10000054 */ b .L00006314 -/* 61c4: 2402000b */ addiu $v0,$zero,0xb -.L000061c8: -/* 61c8: 24080084 */ addiu $t0,$zero,0x84 -/* 61cc: 27a30050 */ addiu $v1,$sp,0x50 -.L000061d0: -/* 61d0: 24420001 */ addiu $v0,$v0,0x1 -/* 61d4: 1443fffe */ bne $v0,$v1,.L000061d0 -/* 61d8: a048ffff */ sb $t0,-0x1($v0) -/* 61dc: 8fa40058 */ lw $a0,0x58($sp) -/* 61e0: 8fa50060 */ lw $a1,0x60($sp) -/* 61e4: 24060400 */ addiu $a2,$zero,0x400 -/* 61e8: 27a70030 */ addiu $a3,$sp,0x30 -/* 61ec: 0c012d84 */ jal __osContRamWrite -/* 61f0: afa00010 */ sw $zero,0x10($sp) -/* 61f4: 24010002 */ addiu $at,$zero,0x2 -/* 61f8: 14410002 */ bne $v0,$at,.L00006204 -/* 61fc: 00401825 */ or $v1,$v0,$zero -/* 6200: 24030004 */ addiu $v1,$zero,0x4 -.L00006204: -/* 6204: 10600003 */ beqz $v1,.L00006214 -/* 6208: 8fa40058 */ lw $a0,0x58($sp) -/* 620c: 10000041 */ b .L00006314 -/* 6210: 00601025 */ or $v0,$v1,$zero -.L00006214: -/* 6214: 8fa50060 */ lw $a1,0x60($sp) -/* 6218: 24060400 */ addiu $a2,$zero,0x400 -/* 621c: 0c012e18 */ jal __osContRamRead -/* 6220: 27a70030 */ addiu $a3,$sp,0x30 -/* 6224: 24010002 */ addiu $at,$zero,0x2 -/* 6228: 14410002 */ bne $v0,$at,.L00006234 -/* 622c: 00401825 */ or $v1,$v0,$zero -/* 6230: 24030004 */ addiu $v1,$zero,0x4 -.L00006234: -/* 6234: 10600003 */ beqz $v1,.L00006244 -/* 6238: 93b8004f */ lbu $t8,0x4f($sp) -/* 623c: 10000035 */ b .L00006314 -/* 6240: 00601025 */ or $v0,$v1,$zero -.L00006244: -/* 6244: 24010084 */ addiu $at,$zero,0x84 -/* 6248: 13010003 */ beq $t8,$at,.L00006258 -/* 624c: 8fa40058 */ lw $a0,0x58($sp) -/* 6250: 10000030 */ b .L00006314 -/* 6254: 2402000b */ addiu $v0,$zero,0xb -.L00006258: -/* 6258: 0c012ea4 */ jal __osPfsGetStatus -/* 625c: 8fa50060 */ lw $a1,0x60($sp) -/* 6260: 10400003 */ beqz $v0,.L00006270 -/* 6264: 3c048009 */ lui $a0,%hi(var80090ad0) -/* 6268: 1000002b */ b .L00006318 -/* 626c: 8fbf0024 */ lw $ra,0x24($sp) -.L00006270: -/* 6270: 3c058009 */ lui $a1,%hi(var80090ae8) -/* 6274: 24a50ae8 */ addiu $a1,$a1,%lo(var80090ae8) -/* 6278: 24840ad0 */ addiu $a0,$a0,%lo(var80090ad0) -/* 627c: 0c0120d0 */ jal osCreateMesgQueue -/* 6280: 24060001 */ addiu $a2,$zero,0x1 -/* 6284: 3c198009 */ lui $t9,%hi(var80090ad0) -/* 6288: 3c098009 */ lui $t1,%hi(var80090ae8) -/* 628c: 25290ae8 */ addiu $t1,$t1,%lo(var80090ae8) -/* 6290: 27390ad0 */ addiu $t9,$t9,%lo(var80090ad0) -/* 6294: 3c048009 */ lui $a0,%hi(var80090ab0) -/* 6298: 3c07000e */ lui $a3,0xe -/* 629c: 240a0000 */ addiu $t2,$zero,0x0 -/* 62a0: 240b0000 */ addiu $t3,$zero,0x0 -/* 62a4: afab0014 */ sw $t3,0x14($sp) -/* 62a8: afaa0010 */ sw $t2,0x10($sp) -/* 62ac: 34e74e1c */ ori $a3,$a3,0x4e1c -/* 62b0: 24840ab0 */ addiu $a0,$a0,%lo(var80090ab0) -/* 62b4: afb90018 */ sw $t9,0x18($sp) -/* 62b8: afa9001c */ sw $t1,0x1c($sp) -/* 62bc: 0c0122c8 */ jal osSetTimer -/* 62c0: 24060000 */ addiu $a2,$zero,0x0 -/* 62c4: 3c048009 */ lui $a0,%hi(var80090ad0) -/* 62c8: 24840ad0 */ addiu $a0,$a0,%lo(var80090ad0) -/* 62cc: 00002825 */ or $a1,$zero,$zero -/* 62d0: 0c0121bc */ jal osRecvMesg -/* 62d4: 24060001 */ addiu $a2,$zero,0x1 -/* 62d8: 8fa4005c */ lw $a0,0x5c($sp) -/* 62dc: 8fac0058 */ lw $t4,0x58($sp) -/* 62e0: 240d0010 */ addiu $t5,$zero,0x10 -/* 62e4: ac8d0000 */ sw $t5,0x0($a0) -/* 62e8: ac8c0004 */ sw $t4,0x4($a0) -/* 62ec: 8fae0060 */ lw $t6,0x60($sp) -/* 62f0: 240300ff */ addiu $v1,$zero,0xff -/* 62f4: 24080084 */ addiu $t0,$zero,0x84 -/* 62f8: 240f00ff */ addiu $t7,$zero,0xff -/* 62fc: 00001025 */ or $v0,$zero,$zero -/* 6300: a0880065 */ sb $t0,0x65($a0) -/* 6304: a08f0064 */ sb $t7,0x64($a0) -/* 6308: ac83004c */ sw $v1,0x4c($a0) -/* 630c: ac830050 */ sw $v1,0x50($a0) -/* 6310: ac8e0008 */ sw $t6,0x8($a0) -.L00006314: -/* 6314: 8fbf0024 */ lw $ra,0x24($sp) -.L00006318: -/* 6318: 27bd0058 */ addiu $sp,$sp,0x58 -/* 631c: 03e00008 */ jr $ra -/* 6320: 00000000 */ nop -); +s32 osGbpakInit(OSMesgQueue *queue, OSPfs *pfs, s32 channel) +{ + s32 ret; + s32 i; + u8 buffer[32]; + + pfs->status = 0; + + for (i = 0; i < 32; i++) { + buffer[i] = 0xfe; + } + + ret = __osContRamWrite(queue, channel, 0x400, buffer, 0); + + if (ret == PFS_ERR_NEW_PACK) { + ret = __osContRamWrite(queue, channel, 0x400, buffer, 0); + } + + if (ret != 0) { + return ret; + } + + ret = __osContRamRead(queue, channel, 0x400, buffer); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + + if (buffer[31] == 0xfe) { + return PFS_ERR_DEVICE; + } + + for (i = 0; i < 32; i++) { + buffer[i] = 0x84; + } + + ret = __osContRamWrite(queue, channel, 0x400, buffer, 0); + + if (ret == PFS_ERR_NEW_PACK) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + + ret = __osContRamRead(queue, channel, 0x400, buffer); + + if (ret == 2) { + ret = PFS_ERR_CONTRFAIL; + } + + if (ret != 0) { + return ret; + } + + if (buffer[31] != 0x84) { + return PFS_ERR_DEVICE; + } + + ret = __osPfsGetStatus(queue, channel); + + if (ret != 0) { + return ret; + } + + osCreateMesgQueue(&var80090ad0, &var80090ae8, 1); + osSetTimer(&var80090ab0, 937500, 0, &var80090ad0, &var80090ae8); + osRecvMesg(&var80090ad0, 0, OS_MESG_BLOCK); + + pfs->queue = queue; + pfs->status = 0x10; + pfs->channel = channel; + pfs->activebank = 0x84; + pfs->banks = 0xff; + pfs->version = 0xff; + pfs->dir_size = 0xff; + + return 0; +}