From 187c698d42f135a45d3edae5353ca753180e718e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 7 Sep 2021 22:08:44 +1000 Subject: [PATCH] Decompile savebufferReadString --- src/game/game_0d4690.c | 93 +++++++++++++--------------------- src/game/game_107fb0.c | 4 +- src/game/game_110680.c | 2 +- src/game/gamefile.c | 6 +-- src/game/mplayer/mplayer.c | 8 +-- src/include/game/game_0d4690.h | 4 +- 6 files changed, 46 insertions(+), 71 deletions(-) diff --git a/src/game/game_0d4690.c b/src/game/game_0d4690.c index c9a19622a..6d8e765cd 100644 --- a/src/game/game_0d4690.c +++ b/src/game/game_0d4690.c @@ -1141,62 +1141,37 @@ void func0f0d54c4(struct savebuffer *buffer) if (tmp / 8 && buffer->bitpos); } -GLOBAL_ASM( -glabel func0f0d54e4 -/* f0d54e4: 27bdffd0 */ addiu $sp,$sp,-48 -/* f0d54e8: afb50028 */ sw $s5,0x28($sp) -/* f0d54ec: afb40024 */ sw $s4,0x24($sp) -/* f0d54f0: afb30020 */ sw $s3,0x20($sp) -/* f0d54f4: afb2001c */ sw $s2,0x1c($sp) -/* f0d54f8: afb10018 */ sw $s1,0x18($sp) -/* f0d54fc: afb00014 */ sw $s0,0x14($sp) -/* f0d5500: 00809825 */ or $s3,$a0,$zero -/* f0d5504: 00a0a825 */ or $s5,$a1,$zero -/* f0d5508: afbf002c */ sw $ra,0x2c($sp) -/* f0d550c: afa60038 */ sw $a2,0x38($sp) -/* f0d5510: 00008825 */ or $s1,$zero,$zero -/* f0d5514: 00009025 */ or $s2,$zero,$zero -/* f0d5518: 00008025 */ or $s0,$zero,$zero -/* f0d551c: 2414000a */ addiu $s4,$zero,0xa -/* f0d5520: 02602025 */ or $a0,$s3,$zero -.L0f0d5524: -/* f0d5524: 0fc354fe */ jal savebufferReadBits -/* f0d5528: 24050008 */ addiu $a1,$zero,0x8 -/* f0d552c: 56200008 */ bnezl $s1,.L0f0d5550 -/* f0d5530: 26100001 */ addiu $s0,$s0,0x1 -/* f0d5534: 14400003 */ bnez $v0,.L0f0d5544 -/* f0d5538: 02b07021 */ addu $t6,$s5,$s0 -/* f0d553c: 10000003 */ b .L0f0d554c -/* f0d5540: 24110001 */ addiu $s1,$zero,0x1 -.L0f0d5544: -/* f0d5544: a1c20000 */ sb $v0,0x0($t6) -/* f0d5548: 02009025 */ or $s2,$s0,$zero -.L0f0d554c: -/* f0d554c: 26100001 */ addiu $s0,$s0,0x1 -.L0f0d5550: -/* f0d5550: 5614fff4 */ bnel $s0,$s4,.L0f0d5524 -/* f0d5554: 02602025 */ or $a0,$s3,$zero -/* f0d5558: 8faf0038 */ lw $t7,0x38($sp) -/* f0d555c: 2418000a */ addiu $t8,$zero,0xa -/* f0d5560: 51e00005 */ beqzl $t7,.L0f0d5578 -/* f0d5564: 26520001 */ addiu $s2,$s2,0x1 -/* f0d5568: 26520001 */ addiu $s2,$s2,0x1 -/* f0d556c: 02b2c821 */ addu $t9,$s5,$s2 -/* f0d5570: a3380000 */ sb $t8,0x0($t9) -/* f0d5574: 26520001 */ addiu $s2,$s2,0x1 -.L0f0d5578: -/* f0d5578: 02b24021 */ addu $t0,$s5,$s2 -/* f0d557c: a1000000 */ sb $zero,0x0($t0) -/* f0d5580: 8fbf002c */ lw $ra,0x2c($sp) -/* f0d5584: 8fb50028 */ lw $s5,0x28($sp) -/* f0d5588: 8fb40024 */ lw $s4,0x24($sp) -/* f0d558c: 8fb30020 */ lw $s3,0x20($sp) -/* f0d5590: 8fb2001c */ lw $s2,0x1c($sp) -/* f0d5594: 8fb10018 */ lw $s1,0x18($sp) -/* f0d5598: 8fb00014 */ lw $s0,0x14($sp) -/* f0d559c: 03e00008 */ jr $ra -/* f0d55a0: 27bd0030 */ addiu $sp,$sp,0x30 -); +/** + * Read a zero-terminated string from the buffer and move the buffer's internal + * pointer past the end of the string. + */ +void savebufferReadString(struct savebuffer *buffer, char *dst, bool addlinebreak) +{ + bool foundnull = false; + s32 index = 0; + s32 i; + + for (i = 0; i < 10; i++) { + s32 byte = savebufferReadBits(buffer, 8); + + if (!foundnull) { + if (byte == '\0') { + foundnull = true; + } else { + dst[i] = byte; + index = i; + } + } + } + + if (addlinebreak) { + index++; + dst[index] = '\n'; + } + + index++; + dst[index] = '\0'; +} GLOBAL_ASM( glabel func0f0d55a4 @@ -1249,12 +1224,12 @@ glabel func0f0d55a4 /* f0d5648: 27bd0030 */ addiu $sp,$sp,0x30 ); -void func0f0d564c(u8 *data1, u8 *data2, s32 arg2) +void func0f0d564c(u8 *data, char *dst, bool addlinebreak) { struct savebuffer buffer; - func0f0d5484(&buffer, data1, 10); - func0f0d54e4(&buffer, data2, arg2); + func0f0d5484(&buffer, data, 10); + savebufferReadString(&buffer, dst, addlinebreak); } #if VERSION >= VERSION_NTSC_1_0 diff --git a/src/game/game_107fb0.c b/src/game/game_107fb0.c index 1ed9c5a02..07f8c9220 100644 --- a/src/game/game_107fb0.c +++ b/src/game/game_107fb0.c @@ -143,7 +143,7 @@ void filemgrGetFileName(char *buffer, struct savelocation000 *arg1, u32 filetype switch (filetype) { case FILETYPE_SOLO: case FILETYPE_MPSETUP: - func0f0d564c(arg1->unk06, tmpbuffer1, 0); + func0f0d564c(arg1->unk06, tmpbuffer1, false); break; case FILETYPE_MPPLAYER: // MP Player filenames have the play duration appended to the name @@ -1254,7 +1254,7 @@ void func0f1099a8(char *buffer, struct savelocation000 *arg1) switch (g_FileLists[g_Menus[g_MpPlayerNum].listnum]->filetype) { case FILETYPE_SOLO: case FILETYPE_MPSETUP: - func0f0d564c(arg1->unk06, localbuffer, 0); + func0f0d564c(arg1->unk06, localbuffer, false); break; case FILETYPE_MPPLAYER: func0f18d9a4(arg1->unk06, localbuffer, &sp20); diff --git a/src/game/game_110680.c b/src/game/game_110680.c index 96ce7aa90..08e44637a 100644 --- a/src/game/game_110680.c +++ b/src/game/game_110680.c @@ -250,7 +250,7 @@ glabel func0f11080c /* f1108d0: 02402025 */ or $a0,$s2,$zero .L0f1108d4: /* f1108d4: 02002825 */ or $a1,$s0,$zero -/* f1108d8: 0fc35539 */ jal func0f0d54e4 +/* f1108d8: 0fc35539 */ jal savebufferReadString /* f1108dc: 24060001 */ addiu $a2,$zero,0x1 /* f1108e0: 2610000c */ addiu $s0,$s0,0xc /* f1108e4: 0211082b */ sltu $at,$s0,$s1 diff --git a/src/game/gamefile.c b/src/game/gamefile.c index 3f17359cb..0eae0bb38 100644 --- a/src/game/gamefile.c +++ b/src/game/gamefile.c @@ -964,7 +964,7 @@ glabel func0f10fac8 /* f10fb74: 3c05800a */ lui $a1,%hi(g_SoloSaveFile) /* f10fb78: 24a52200 */ addiu $a1,$a1,%lo(g_SoloSaveFile) /* f10fb7c: 02802025 */ or $a0,$s4,$zero -/* f10fb80: 0fc35539 */ jal func0f0d54e4 +/* f10fb80: 0fc35539 */ jal savebufferReadString /* f10fb84: 00003025 */ or $a2,$zero,$zero /* f10fb88: 02802025 */ or $a0,$s4,$zero /* f10fb8c: 0fc354fe */ jal savebufferReadBits @@ -1237,7 +1237,7 @@ glabel func0f10fac8 /* f10a0a4: 3c05800a */ lui $a1,0x800a /* f10a0a8: 24a566f0 */ addiu $a1,$a1,0x66f0 /* f10a0ac: 02602025 */ or $a0,$s3,$zero -/* f10a0b0: 0fc34af3 */ jal func0f0d54e4 +/* f10a0b0: 0fc34af3 */ jal savebufferReadString /* f10a0b4: 00003025 */ or $a2,$zero,$zero /* f10a0b8: 02602025 */ or $a0,$s3,$zero /* f10a0bc: 0fc34ab8 */ jal savebufferReadBits @@ -2904,7 +2904,7 @@ void savefileGetOverview(char *arg0, char *name, u8 *stage, u8 *difficulty, u32 struct savebuffer buffer; func0f0d5484(&buffer, arg0, 15); - func0f0d54e4(&buffer, name, 0); + savebufferReadString(&buffer, name, false); *stage = savebufferReadBits(&buffer, 5); diff --git a/src/game/mplayer/mplayer.c b/src/game/mplayer/mplayer.c index d08b5b582..a66503ec7 100644 --- a/src/game/mplayer/mplayer.c +++ b/src/game/mplayer/mplayer.c @@ -8654,7 +8654,7 @@ glabel func0f18d2b8 /* f18d2f8: afb2001c */ sw $s2,0x1c($sp) /* f18d2fc: afb10018 */ sw $s1,0x18($sp) /* f18d300: 02a02825 */ or $a1,$s5,$zero -/* f18d304: 0fc35539 */ jal func0f0d54e4 +/* f18d304: 0fc35539 */ jal savebufferReadString /* f18d308: 24060001 */ addiu $a2,$zero,0x1 /* f18d30c: 02602025 */ or $a0,$s3,$zero /* f18d310: 0fc354fe */ jal savebufferReadBits @@ -9123,7 +9123,7 @@ glabel func0f18d9a4 /* f18d9c4: 27a40018 */ addiu $a0,$sp,0x18 /* f18d9c8: 27a40018 */ addiu $a0,$sp,0x18 /* f18d9cc: 8fa500fc */ lw $a1,0xfc($sp) -/* f18d9d0: 0fc35539 */ jal func0f0d54e4 +/* f18d9d0: 0fc35539 */ jal savebufferReadString /* f18d9d4: 00003025 */ or $a2,$zero,$zero /* f18d9d8: 27a40018 */ addiu $a0,$sp,0x18 /* f18d9dc: 0fc354fe */ jal savebufferReadBits @@ -9774,7 +9774,7 @@ glabel func0f18df5c /* f18df84: afb1001c */ sw $s1,0x1c($sp) /* f18df88: afb00018 */ sw $s0,0x18($sp) /* f18df8c: 02a02825 */ or $a1,$s5,$zero -/* f18df90: 0fc35539 */ jal func0f0d54e4 +/* f18df90: 0fc35539 */ jal savebufferReadString /* f18df94: 00003025 */ or $a2,$zero,$zero /* f18df98: 02602025 */ or $a0,$s3,$zero /* f18df9c: 0fc354fe */ jal savebufferReadBits @@ -10068,7 +10068,7 @@ glabel func0f18e39c /* f18e3c0: 27a40018 */ addiu $a0,$sp,0x18 /* f18e3c4: 27a40018 */ addiu $a0,$sp,0x18 /* f18e3c8: 8fa500fc */ lw $a1,0xfc($sp) -/* f18e3cc: 0fc35539 */ jal func0f0d54e4 +/* f18e3cc: 0fc35539 */ jal savebufferReadString /* f18e3d0: 00003025 */ or $a2,$zero,$zero /* f18e3d4: 27a40018 */ addiu $a0,$sp,0x18 /* f18e3d8: 0fc354fe */ jal savebufferReadBits diff --git a/src/include/game/game_0d4690.h b/src/include/game/game_0d4690.h index b43a302cb..e3b191f70 100644 --- a/src/include/game/game_0d4690.h +++ b/src/include/game/game_0d4690.h @@ -17,9 +17,9 @@ u32 savebufferReadBits(struct savebuffer *buffer, s32 offset); void savebufferClear(struct savebuffer *buffer); void func0f0d5484(struct savebuffer *buffer, u8 *data, u8 len); void func0f0d54c4(struct savebuffer *buffer); -void func0f0d54e4(struct savebuffer *buffer, char *arg1, s32 arg2); +void savebufferReadString(struct savebuffer *buffer, char *dst, bool addlinebreak); u32 func0f0d55a4(void); -void func0f0d564c(u8 *data1, u8 *data2, s32 arg2); +void func0f0d564c(u8 *data, char *dst, bool addlinebreak); void func0f0d5690(void *arg0, char *buffer); u32 func0f0d575c(void); u32 func0f0d579c(void);