From c790bc5db448ab8b8f541b3bc1199735f4059499 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 27 Nov 2022 15:44:00 +1000 Subject: [PATCH] jpn-final: Decompile langGetJpnCharPixels --- ld/pd.ld | 2 +- src/game/game_1531a0.c | 14 +- src/game/lang.c | 440 ++++++--------------------------- src/game/langinit.c | 24 +- src/game/langtick.c | 20 +- src/include/bss.h | 6 +- src/include/constants.h | 6 + src/include/game/lang.h | 2 +- src/include/types.h | 8 +- src/lib/ultra/io/conteepread.c | 2 +- 10 files changed, 125 insertions(+), 399 deletions(-) diff --git a/ld/pd.ld b/ld/pd.ld index 59a32cf05..f97665684 100644 --- a/ld/pd.ld +++ b/ld/pd.ld @@ -74,7 +74,7 @@ OUTPUT_ARCH (mips) SECTIONS { #if VERSION >= VERSION_JPN_FINAL - _jpndata1 = 0x17fc40; + _jpndata1 = 0x178c40; _jpndata2 = 0x18b340; #elif VERSION >= VERSION_PAL_BETA _jpndata1 = 0x17fc40; diff --git a/src/game/game_1531a0.c b/src/game/game_1531a0.c index 191ab7479..8997003a7 100644 --- a/src/game/game_1531a0.c +++ b/src/game/game_1531a0.c @@ -1414,7 +1414,7 @@ glabel text0f154f38 /* f154d7c: 55c00006 */ bnezl $t6,.JF0f154d98 /* f154d80: 96390000 */ lhu $t9,0x0($s1) /* f154d84: 94c40000 */ lhu $a0,0x0($a2) -/* f154d88: 0fc5b967 */ jal lang0f16e3fc +/* f154d88: 0fc5b967 */ jal langGetJpnCharPixels /* f154d8c: 2484ff80 */ addiu $a0,$a0,-128 /* f154d90: ae220008 */ sw $v0,0x8($s1) /* f154d94: 96390000 */ lhu $t9,0x0($s1) @@ -1717,7 +1717,7 @@ Gfx *text0f154f38(Gfx *gdl, s32 *arg1, struct fontchar *curchar, struct fontchar #if VERSION >= VERSION_JPN_FINAL if (curchar->pixeldata == NULL) { - curchar->pixeldata = (void *) lang0f16e3fc(curchar->index - 0x80); + curchar->pixeldata = (void *) langGetJpnCharPixels(curchar->index - 0x80); } if (curchar->index >= 0x80) { @@ -1924,7 +1924,7 @@ Gfx *text0f1552d4(Gfx *gdl, f32 x, f32 y, f32 widthscale, f32 heightscale, } tmpchar.index = codepoint + 0x80; - tmpchar.pixeldata = (void *) lang0f16e3fc(codepoint); + tmpchar.pixeldata = (void *) langGetJpnCharPixels(codepoint); text += 2; } @@ -1962,7 +1962,7 @@ Gfx *text0f15568c(Gfx *gdl, s32 *x, s32 *y, struct fontchar *curchar, struct fon && *x >= savedx && curchar->baseline + sp90 + curchar->height >= savedy) { if (curchar->pixeldata == NULL) { - curchar->pixeldata = (void *)lang0f16e3fc(curchar->index - 0x80); + curchar->pixeldata = (void *)langGetJpnCharPixels(curchar->index - 0x80); } if (curchar->index >= 0x80) { @@ -2422,7 +2422,7 @@ Gfx *textRenderProjected(Gfx *gdl, s32 *x, s32 *y, char *text, struct fontchar * } tmpchar.index = codepoint + 0x80; - tmpchar.pixeldata = (void *)lang0f16e3fc(codepoint); + tmpchar.pixeldata = (void *)langGetJpnCharPixels(codepoint); gdl = text0f15568c(gdl, x, y, &tmpchar, &tmpchar, font, savedx, savedy, width, height, arg9); @@ -2482,7 +2482,7 @@ Gfx *textRenderChar(Gfx *gdl, s32 *x, s32 *y, struct fontchar *char1, struct fon && sp38 + char1->baseline + char1->height >= arg7) { #if VERSION >= VERSION_JPN_FINAL if (char1->pixeldata == NULL) { - char1->pixeldata = (void *)lang0f16e3fc(char1->index - 0x80); + char1->pixeldata = (void *)langGetJpnCharPixels(char1->index - 0x80); } #else if (g_Blend.types) { @@ -2681,7 +2681,7 @@ Gfx *textRender(Gfx *gdl, s32 *x, s32 *y, char *text, } sp74.index = codepoint + 0x80; - sp74.pixeldata = (void *)lang0f16e3fc(codepoint); + sp74.pixeldata = (void *)langGetJpnCharPixels(codepoint); gdl = textRenderChar(gdl, x, y, &sp74, &sp74, font, savedx, savedy, width * var8007fad0, height, arg10); diff --git a/src/game/lang.c b/src/game/lang.c index 7c740722e..bf312a5ff 100644 --- a/src/game/lang.c +++ b/src/game/lang.c @@ -55,13 +55,13 @@ u8 *g_LangBuffer = NULL; u8 *g_LangBufferPos = NULL; s32 g_LangBufferSize = 0; u32 *g_LangBanks[69]; -struct var800aabb4 *var800aabb4; -struct var800aabb8 *var800aabb8; +struct jpncharpixels *g_JpnCharCachePixels; +struct jpncacheitem *g_JpnCacheCacheItems; s32 g_LanguageId = LANGUAGE_NTSC_EN; #else u32 *g_LangBanks[69]; -struct var800aabb4 *var800aabb4; -struct var800aabb8 *var800aabb8; +struct jpncharpixels *g_JpnCharCachePixels; +struct jpncacheitem *g_JpnCacheCacheItems; bool g_Jpn = false; #endif @@ -212,399 +212,121 @@ u32 langGetLangBankIndexFromStagenum(s32 stagenum) return bank; } -#if MATCHING && VERSION == VERSION_JPN_FINAL -const char var7f1b8850jf[] = "tmul"; -const char var7f1b8858jf[] = "tload"; -u32 var80084810jf = 0; -u32 var80084814jf = 8; - -GLOBAL_ASM( -glabel lang0f16e3fc -/* f16e59c: 27bdffd0 */ addiu $sp,$sp,-48 -/* f16e5a0: afb00018 */ sw $s0,0x18($sp) -/* f16e5a4: 308e2000 */ andi $t6,$a0,0x2000 -/* f16e5a8: 00808025 */ move $s0,$a0 -/* f16e5ac: afbf001c */ sw $ra,0x1c($sp) -/* f16e5b0: 2409ffff */ li $t1,-1 -/* f16e5b4: 240affff */ li $t2,-1 -/* f16e5b8: 11c00002 */ beqz $t6,.JF0f16e5c4 -/* f16e5bc: 00004025 */ move $t0,$zero -/* f16e5c0: 24080001 */ li $t0,0x1 -.JF0f16e5c4: -/* f16e5c4: 3c047f1c */ lui $a0,%hi(var7f1b8850jf) -/* f16e5c8: 3c058008 */ lui $a1,%hi(var80084814jf) -/* f16e5cc: 24a54814 */ addiu $a1,$a1,%lo(var80084814jf) -/* f16e5d0: 24848850 */ addiu $a0,$a0,%lo(var7f1b8850jf) -/* f16e5d4: afa80020 */ sw $t0,0x20($sp) -/* f16e5d8: afa90028 */ sw $t1,0x28($sp) -/* f16e5dc: 0c0036b4 */ jal mainOverrideVariable -/* f16e5e0: afaa0024 */ sw $t2,0x24($sp) -/* f16e5e4: 3c047f1c */ lui $a0,%hi(var7f1b8858jf) -/* f16e5e8: 3c058008 */ lui $a1,%hi(var80084810jf) -/* f16e5ec: 24a54810 */ addiu $a1,$a1,%lo(var80084810jf) -/* f16e5f0: 0c0036b4 */ jal mainOverrideVariable -/* f16e5f4: 24848858 */ addiu $a0,$a0,%lo(var7f1b8858jf) -/* f16e5f8: 3c028008 */ lui $v0,%hi(var80084810jf) -/* f16e5fc: 8c424810 */ lw $v0,%lo(var80084810jf)($v0) -/* f16e600: 8fa80020 */ lw $t0,0x20($sp) -/* f16e604: 8fa90028 */ lw $t1,0x28($sp) -/* f16e608: 10400002 */ beqz $v0,.JF0f16e614 -/* f16e60c: 8faa0024 */ lw $t2,0x24($sp) -/* f16e610: 00408025 */ move $s0,$v0 -.JF0f16e614: -/* f16e614: 3c07800a */ lui $a3,%hi(var8009d140jf) -/* f16e618: 8ce7d140 */ lw $a3,%lo(var8009d140jf)($a3) -/* f16e61c: 00003025 */ move $a2,$zero -/* f16e620: 3c04800b */ lui $a0,%hi(var800aabb8) -/* f16e624: 58e00026 */ blezl $a3,.JF0f16e6c0 -/* f16e628: 00c7082a */ slt $at,$a2,$a3 -/* f16e62c: 8c84b5a8 */ lw $a0,%lo(var800aabb8)($a0) -.JF0f16e630: -/* f16e630: 15000005 */ bnez $t0,.JF0f16e648 -/* f16e634: 00000000 */ nop -/* f16e638: 948f0000 */ lhu $t7,0x0($a0) -/* f16e63c: 31f83fff */ andi $t8,$t7,0x3fff -/* f16e640: 5218001f */ beql $s0,$t8,.JF0f16e6c0 -/* f16e644: 00c7082a */ slt $at,$a2,$a3 -.JF0f16e648: -/* f16e648: 1100000a */ beqz $t0,.JF0f16e674 -/* f16e64c: 94830000 */ lhu $v1,0x0($a0) -/* f16e650: 24d90001 */ addiu $t9,$a2,0x1 -/* f16e654: 0327082a */ slt $at,$t9,$a3 -/* f16e658: 10200006 */ beqz $at,.JF0f16e674 -/* f16e65c: 306b3fff */ andi $t3,$v1,0x3fff -/* f16e660: 160b0004 */ bne $s0,$t3,.JF0f16e674 -/* f16e664: 02001025 */ move $v0,$s0 -/* f16e668: 948c0002 */ lhu $t4,0x2($a0) -/* f16e66c: 318d3fff */ andi $t5,$t4,0x3fff -/* f16e670: 104d0012 */ beq $v0,$t5,.JF0f16e6bc -.JF0f16e674: -/* f16e674: 00031382 */ srl $v0,$v1,0xe -/* f16e678: 14400002 */ bnez $v0,.JF0f16e684 -/* f16e67c: 24c50001 */ addiu $a1,$a2,0x1 -/* f16e680: 00c04825 */ move $t1,$a2 -.JF0f16e684: -/* f16e684: 5440000a */ bnezl $v0,.JF0f16e6b0 -/* f16e688: 00a7082a */ slt $at,$a1,$a3 -/* f16e68c: 948e0002 */ lhu $t6,0x2($a0) -/* f16e690: 00a7082a */ slt $at,$a1,$a3 -/* f16e694: 000e7b82 */ srl $t7,$t6,0xe -/* f16e698: 55e00005 */ bnezl $t7,.JF0f16e6b0 -/* f16e69c: 00a7082a */ slt $at,$a1,$a3 -/* f16e6a0: 50200003 */ beqzl $at,.JF0f16e6b0 -/* f16e6a4: 00a7082a */ slt $at,$a1,$a3 -/* f16e6a8: 00c05025 */ move $t2,$a2 -/* f16e6ac: 00a7082a */ slt $at,$a1,$a3 -.JF0f16e6b0: -/* f16e6b0: 00a03025 */ move $a2,$a1 -/* f16e6b4: 1420ffde */ bnez $at,.JF0f16e630 -/* f16e6b8: 24840002 */ addiu $a0,$a0,0x2 -.JF0f16e6bc: -/* f16e6bc: 00c7082a */ slt $at,$a2,$a3 -.JF0f16e6c0: -/* f16e6c0: 1020002b */ beqz $at,.JF0f16e770 -/* f16e6c4: 3c18800b */ lui $t8,%hi(var800aabb8) -/* f16e6c8: 8f18b5a8 */ lw $t8,%lo(var800aabb8)($t8) -/* f16e6cc: 00061840 */ sll $v1,$a2,0x1 -/* f16e6d0: 15000010 */ bnez $t0,.JF0f16e714 -/* f16e6d4: 03032021 */ addu $a0,$t8,$v1 -/* f16e6d8: 90990000 */ lbu $t9,0x0($a0) -/* f16e6dc: 3c0d8008 */ lui $t5,%hi(var80084814jf) -/* f16e6e0: 3c18800b */ lui $t8,%hi(var800aabb4) -/* f16e6e4: 332bff3f */ andi $t3,$t9,0xff3f -/* f16e6e8: 356c0080 */ ori $t4,$t3,0x80 -/* f16e6ec: a08c0000 */ sb $t4,0x0($a0) -/* f16e6f0: 8dad4814 */ lw $t5,%lo(var80084814jf)($t5) -/* f16e6f4: 8f18b5a4 */ lw $t8,%lo(var800aabb4)($t8) -/* f16e6f8: 00cd0019 */ multu $a2,$t5 -/* f16e6fc: 00007012 */ mflo $t6 -/* f16e700: 000e7880 */ sll $t7,$t6,0x2 -/* f16e704: 01ee7823 */ subu $t7,$t7,$t6 -/* f16e708: 000f7880 */ sll $t7,$t7,0x2 -/* f16e70c: 1000007b */ b .JF0f16e8fc -/* f16e710: 01f81021 */ addu $v0,$t7,$t8 -.JF0f16e714: -/* f16e714: 90990000 */ lbu $t9,0x0($a0) -/* f16e718: 3c07800b */ lui $a3,%hi(var800aabb8) -/* f16e71c: 24e7b5a8 */ addiu $a3,$a3,%lo(var800aabb8) -/* f16e720: 332bff3f */ andi $t3,$t9,0xff3f -/* f16e724: 356c0080 */ ori $t4,$t3,0x80 -/* f16e728: a08c0000 */ sb $t4,0x0($a0) -/* f16e72c: 8ced0000 */ lw $t5,0x0($a3) -/* f16e730: 3c198008 */ lui $t9,%hi(var80084814jf) -/* f16e734: 01a32021 */ addu $a0,$t5,$v1 -/* f16e738: 908e0002 */ lbu $t6,0x2($a0) -/* f16e73c: 3c0d800b */ lui $t5,%hi(var800aabb4) -/* f16e740: 31cfff3f */ andi $t7,$t6,0xff3f -/* f16e744: 35f80080 */ ori $t8,$t7,0x80 -/* f16e748: a0980002 */ sb $t8,0x2($a0) -/* f16e74c: 8f394814 */ lw $t9,%lo(var80084814jf)($t9) -/* f16e750: 8dadb5a4 */ lw $t5,%lo(var800aabb4)($t5) -/* f16e754: 00d90019 */ multu $a2,$t9 -/* f16e758: 00005812 */ mflo $t3 -/* f16e75c: 000b6080 */ sll $t4,$t3,0x2 -/* f16e760: 018b6023 */ subu $t4,$t4,$t3 -/* f16e764: 000c6080 */ sll $t4,$t4,0x2 -/* f16e768: 10000064 */ b .JF0f16e8fc -/* f16e76c: 018d1021 */ addu $v0,$t4,$t5 -.JF0f16e770: -/* f16e770: 15000039 */ bnez $t0,.JF0f16e858 -/* f16e774: 00000000 */ nop -/* f16e778: 05200037 */ bltz $t1,.JF0f16e858 -/* f16e77c: 3c07800b */ lui $a3,%hi(var800aabb8) -/* f16e780: 24e7b5a8 */ addiu $a3,$a3,%lo(var800aabb8) -/* f16e784: 8cee0000 */ lw $t6,0x0($a3) -/* f16e788: 00091840 */ sll $v1,$t1,0x1 -/* f16e78c: 320d3fff */ andi $t5,$s0,0x3fff -/* f16e790: 01c31021 */ addu $v0,$t6,$v1 -/* f16e794: 904f0000 */ lbu $t7,0x0($v0) -/* f16e798: 2408000c */ li $t0,0xc -/* f16e79c: 3c0c800b */ lui $t4,%hi(var800aabb4) -/* f16e7a0: 31f8ff3f */ andi $t8,$t7,0xff3f -/* f16e7a4: 37190080 */ ori $t9,$t8,0x80 -/* f16e7a8: a0590000 */ sb $t9,0x0($v0) -/* f16e7ac: 8ceb0000 */ lw $t3,0x0($a3) -/* f16e7b0: 3c198008 */ lui $t9,%hi(var80084814jf) -/* f16e7b4: 01631021 */ addu $v0,$t3,$v1 -/* f16e7b8: 944e0000 */ lhu $t6,0x0($v0) -/* f16e7bc: 31cfc000 */ andi $t7,$t6,0xc000 -/* f16e7c0: 01afc025 */ or $t8,$t5,$t7 -/* f16e7c4: a4580000 */ sh $t8,0x0($v0) -/* f16e7c8: 8f394814 */ lw $t9,%lo(var80084814jf)($t9) -/* f16e7cc: 8d8cb5a4 */ lw $t4,%lo(var800aabb4)($t4) -/* f16e7d0: afa90028 */ sw $t1,0x28($sp) -/* f16e7d4: 03280019 */ multu $t9,$t0 -/* f16e7d8: 001978c0 */ sll $t7,$t9,0x3 -/* f16e7dc: 01f97821 */ addu $t7,$t7,$t9 -/* f16e7e0: 000f7940 */ sll $t7,$t7,0x5 -/* f16e7e4: 00003012 */ mflo $a2 -/* f16e7e8: 00000000 */ nop -/* f16e7ec: 00000000 */ nop -/* f16e7f0: 01260019 */ multu $t1,$a2 -/* f16e7f4: 00005812 */ mflo $t3 -/* f16e7f8: 016c2021 */ addu $a0,$t3,$t4 -/* f16e7fc: 3c0b0018 */ lui $t3,0x18 -/* f16e800: 02190019 */ multu $s0,$t9 -/* f16e804: 256b8c40 */ addiu $t3,$t3,-29632 -/* f16e808: 00007012 */ mflo $t6 -/* f16e80c: 00000000 */ nop -/* f16e810: 00000000 */ nop -/* f16e814: 01c80019 */ multu $t6,$t0 -/* f16e818: 00006812 */ mflo $t5 -/* f16e81c: 01afc021 */ addu $t8,$t5,$t7 -/* f16e820: 0c0034ec */ jal dmaExec -/* f16e824: 030b2821 */ addu $a1,$t8,$t3 -/* f16e828: 3c0c8008 */ lui $t4,%hi(var80084814jf) -/* f16e82c: 8fa90028 */ lw $t1,0x28($sp) -/* f16e830: 8d8c4814 */ lw $t4,%lo(var80084814jf)($t4) -/* f16e834: 3c0d800b */ lui $t5,%hi(var800aabb4) -/* f16e838: 8dadb5a4 */ lw $t5,%lo(var800aabb4)($t5) -/* f16e83c: 012c0019 */ multu $t1,$t4 -/* f16e840: 00007012 */ mflo $t6 -/* f16e844: 000ec880 */ sll $t9,$t6,0x2 -/* f16e848: 032ec823 */ subu $t9,$t9,$t6 -/* f16e84c: 0019c880 */ sll $t9,$t9,0x2 -/* f16e850: 1000002a */ b .JF0f16e8fc -/* f16e854: 032d1021 */ addu $v0,$t9,$t5 -.JF0f16e858: -/* f16e858: 11000021 */ beqz $t0,.JF0f16e8e0 -/* f16e85c: 00000000 */ nop -/* f16e860: 0540001f */ bltz $t2,.JF0f16e8e0 -/* f16e864: 3c07800b */ lui $a3,%hi(var800aabb8) -/* f16e868: 24e7b5a8 */ addiu $a3,$a3,%lo(var800aabb8) -/* f16e86c: 8cef0000 */ lw $t7,0x0($a3) -/* f16e870: 000a2040 */ sll $a0,$t2,0x1 -/* f16e874: 3c02800b */ lui $v0,%hi(var800aabb4) -/* f16e878: 01e41821 */ addu $v1,$t7,$a0 -/* f16e87c: 90780000 */ lbu $t8,0x0($v1) -/* f16e880: 330bff3f */ andi $t3,$t8,0xff3f -/* f16e884: 356c0080 */ ori $t4,$t3,0x80 -/* f16e888: a06c0000 */ sb $t4,0x0($v1) -/* f16e88c: 8cee0000 */ lw $t6,0x0($a3) -/* f16e890: 320b3fff */ andi $t3,$s0,0x3fff -/* f16e894: 01c41821 */ addu $v1,$t6,$a0 -/* f16e898: 90790002 */ lbu $t9,0x2($v1) -/* f16e89c: 332dff3f */ andi $t5,$t9,0xff3f -/* f16e8a0: 35af0080 */ ori $t7,$t5,0x80 -/* f16e8a4: a06f0002 */ sb $t7,0x2($v1) -/* f16e8a8: 8cf80000 */ lw $t8,0x0($a3) -/* f16e8ac: 03041821 */ addu $v1,$t8,$a0 -/* f16e8b0: 946c0000 */ lhu $t4,0x0($v1) -/* f16e8b4: 318ec000 */ andi $t6,$t4,0xc000 -/* f16e8b8: 016ec825 */ or $t9,$t3,$t6 -/* f16e8bc: a4790000 */ sh $t9,0x0($v1) -/* f16e8c0: 8ced0000 */ lw $t5,0x0($a3) -/* f16e8c4: 01a41821 */ addu $v1,$t5,$a0 -/* f16e8c8: 946f0002 */ lhu $t7,0x2($v1) -/* f16e8cc: 31f8c000 */ andi $t8,$t7,0xc000 -/* f16e8d0: 01785825 */ or $t3,$t3,$t8 -/* f16e8d4: a46b0002 */ sh $t3,0x2($v1) -/* f16e8d8: 10000008 */ b .JF0f16e8fc -/* f16e8dc: 8c42b5a4 */ lw $v0,%lo(var800aabb4)($v0) -.JF0f16e8e0: -/* f16e8e0: 3c03800a */ lui $v1,%hi(var8009d370jf) -/* f16e8e4: 2463d370 */ addiu $v1,$v1,%lo(var8009d370jf) -/* f16e8e8: 8c6c0000 */ lw $t4,0x0($v1) -/* f16e8ec: 3c02800b */ lui $v0,%hi(var800aabb4) -/* f16e8f0: 258e0001 */ addiu $t6,$t4,0x1 -/* f16e8f4: ac6e0000 */ sw $t6,0x0($v1) -/* f16e8f8: 8c42b5a4 */ lw $v0,%lo(var800aabb4)($v0) -.JF0f16e8fc: -/* f16e8fc: 8fbf001c */ lw $ra,0x1c($sp) -/* f16e900: 8fb00018 */ lw $s0,0x18($sp) -/* f16e904: 27bd0030 */ addiu $sp,$sp,0x30 -/* f16e908: 03e00008 */ jr $ra -/* f16e90c: 00000000 */ nop -); -#else extern u8 _jpndata1; extern u8 _jpndata2; -struct var800aabb4 *lang0f16e3fc(s32 arg0) +struct jpncharpixels *langGetJpnCharPixels(s32 codepoint) { -#if VERSION == VERSION_JPN_FINAL s32 i; - s32 t2 = -1; - s32 t3 = -1; - bool t0 = false; + s32 freeindexsingle = -1; + s32 freeindexmulti = -1; + bool multibyte = false; - static u32 var80084810jf = 0; - static u32 var80084814jf = 8; +#if VERSION == VERSION_JPN_FINAL + static u32 tload = 0; + static u32 tmul = 8; +#endif - if (arg0 & 0x2000) { - if (1); - t0 = true; + if (codepoint & 0x2000) { + multibyte = true; } - mainOverrideVariable("tmul", &var80084814jf); - mainOverrideVariable("tload", &var80084810jf); +#if VERSION == VERSION_JPN_FINAL + mainOverrideVariable("tmul", &tmul); + mainOverrideVariable("tload", &tload); - if (var80084810jf) { - arg0 = var80084810jf; + if (tload) { + codepoint = tload; } +#endif - if (arg0 && arg0); +#if VERSION == VERSION_JPN_FINAL +#define SHIFTAMOUNT 0 +#define TMUL tmul +#else +#define SHIFTAMOUNT 1 +#define TMUL 8 +#endif - for (i = 0; i < var8009d140jf; i++) { - if ((t0 || arg0 != var800aabb8[i].unk00_02) - && (!t0 || i + 1 >= var8009d140jf - || arg0 != var800aabb8[i].unk00_02 - || arg0 != var800aabb8[i + 1].unk00_02)) { - if (var800aabb8[i].unk00_00 == 0) { - if (1); - t2 = i; - } - - if (var800aabb8[i].unk00_00 == 0 && var800aabb8[i + 1].unk00_00 == 0 && i + 1 < var8009d140jf) { - t3 = i; - } - } else { + for (i = 0; i < MAX_JPN_CACHE_ITEMS(); i++) { + if (!multibyte && (codepoint >> SHIFTAMOUNT) == g_JpnCacheCacheItems[i].codepoint) { break; } - } - if (i < var8009d140jf) { - if (!t0) { - var800aabb8[i].unk00_00 = 2; + if (multibyte && i + 1 < MAX_JPN_CACHE_ITEMS() + && (codepoint >> SHIFTAMOUNT) == g_JpnCacheCacheItems[i].codepoint + && (codepoint >> SHIFTAMOUNT) == g_JpnCacheCacheItems[i + 1].codepoint) { + break; + } - return &var800aabb4[i * var80084814jf]; - } else { - var800aabb8[i + 0].unk00_00 = 2; - var800aabb8[i + 1].unk00_00 = 2; + if (g_JpnCacheCacheItems[i].ttl == 0) { + freeindexsingle = i; + } - return &var800aabb4[var80084814jf * i]; + if (g_JpnCacheCacheItems[i].ttl == 0 && g_JpnCacheCacheItems[i + 1].ttl == 0 && i + 1 < MAX_JPN_CACHE_ITEMS()) { + freeindexmulti = i; } } - if (!t0 && t2 >= 0) { - var800aabb8[t2].unk00_00 = 2; - var800aabb8[t2].unk00_02 = arg0; + if (i < MAX_JPN_CACHE_ITEMS()) { + if (!multibyte) { + g_JpnCacheCacheItems[i].ttl = 2; - dmaExec((u8 *) (t2 * (var80084814jf * 0x0c) + (u32)&var800aabb4[0]), - (u32) &_jpndata1 + ((arg0 * var80084814jf) * 0xc + var80084814jf * (24 * 0xc)), - var80084814jf * 0x0c); + return &g_JpnCharCachePixels[i * TMUL]; + } else { + g_JpnCacheCacheItems[i + 0].ttl = 2; + g_JpnCacheCacheItems[i + 1].ttl = 2; - return &var800aabb4[var80084814jf * t2]; + return &g_JpnCharCachePixels[TMUL * i]; + } } - if (t0 && t3 >= 0) { - var800aabb8[t3 + 0].unk00_00 = 2; - var800aabb8[t3 + 1].unk00_00 = 2; - var800aabb8[t3 + 0].unk00_02 = arg0; - var800aabb8[t3 + 1].unk00_02 = arg0; - return &var800aabb4[0]; +#if VERSION == VERSION_JPN_FINAL + if (!multibyte && freeindexsingle >= 0) { + g_JpnCacheCacheItems[freeindexsingle].ttl = 2; + g_JpnCacheCacheItems[freeindexsingle].codepoint = codepoint; + + dmaExec((u8 *) (freeindexsingle * (TMUL * 0x0c) + (u32)&g_JpnCharCachePixels[0]), + (u32) &_jpndata1 + ((codepoint * TMUL) * 0xc + TMUL * (24 * 0xc)), + TMUL * 0x0c); + + return &g_JpnCharCachePixels[TMUL * freeindexsingle]; + } + + if (multibyte && freeindexmulti >= 0) { + g_JpnCacheCacheItems[freeindexmulti + 0].ttl = 2; + g_JpnCacheCacheItems[freeindexmulti + 1].ttl = 2; + g_JpnCacheCacheItems[freeindexmulti + 0].codepoint = codepoint; + g_JpnCacheCacheItems[freeindexmulti + 1].codepoint = codepoint; + return &g_JpnCharCachePixels[0]; } else { var8009d370jf++; - return &var800aabb4[0]; + return &g_JpnCharCachePixels[0]; } #else - s32 i; - s32 t2 = -1; - s32 t3 = -1; - bool t0 = false; + if (!multibyte && freeindexsingle >= 0) { + g_JpnCacheCacheItems[freeindexsingle].ttl = 2; + g_JpnCacheCacheItems[freeindexsingle].codepoint = codepoint >> 1; - if (arg0 & 0x2000) { - if (1); - t0 = true; + dmaExec(&g_JpnCharCachePixels[freeindexsingle * 8], (u32)&_jpndata1 + (codepoint >> SHIFTAMOUNT) * 0x60, 0x60); + + return &g_JpnCharCachePixels[freeindexsingle * 8]; } - if (arg0 && arg0); + if (multibyte && freeindexmulti >= 0) { + g_JpnCacheCacheItems[freeindexmulti + 0].ttl = 2; + g_JpnCacheCacheItems[freeindexmulti + 1].ttl = 2; + g_JpnCacheCacheItems[freeindexmulti + 0].codepoint = codepoint >> 1; + g_JpnCacheCacheItems[freeindexmulti + 1].codepoint = codepoint >> 1; - for (i = 0; i < 0x7c; i++) { - if ((t0 || (arg0 >> 1) != var800aabb8[i].unk00_02) - && (!t0 || i + 1 >= 0x7c - || (arg0 >> 1) != var800aabb8[i + 0].unk00_02 - || (arg0 >> 1) != var800aabb8[i + 1].unk00_02)) { - if (var800aabb8[i].unk00_00 == 0) { - if (1); - t2 = i; - } + dmaExec(&g_JpnCharCachePixels[freeindexmulti * 8], (u32)&_jpndata2 + ((codepoint & 0x1fff) >> SHIFTAMOUNT) * 0x80, 0x80); - if (var800aabb8[i].unk00_00 == 0 && var800aabb8[i + 1].unk00_00 == 0 && i + 1 < 0x7c) { - t3 = i; - } - } else { - break; - } + return &g_JpnCharCachePixels[freeindexmulti * 8]; } - if (i < 0x7c) { - if (!t0) { - var800aabb8[i].unk00_00 = 2; - - return &var800aabb4[i * 8]; - } else { - var800aabb8[i + 0].unk00_00 = 2; - var800aabb8[i + 1].unk00_00 = 2; - - return &var800aabb4[i * 8]; - } - } - - if (!t0 && t2 >= 0) { - var800aabb8[t2].unk00_00 = 2; - var800aabb8[t2].unk00_02 = arg0 >> 1; - - dmaExec(&var800aabb4[t2 * 8], (u32)&_jpndata1 + (arg0 >> 1) * 0x60, 0x60); - - return &var800aabb4[t2 * 8]; - } - - if (t0 && t3 >= 0) { - var800aabb8[t3 + 0].unk00_00 = 2; - var800aabb8[t3 + 1].unk00_00 = 2; - var800aabb8[t3 + 0].unk00_02 = arg0 >> 1; - var800aabb8[t3 + 1].unk00_02 = arg0 >> 1; - - dmaExec(&var800aabb4[t3 * 8], (u32)&_jpndata2 + ((arg0 & 0x1fff) >> 1) * 0x80, 0x80); - - return &var800aabb4[t3 * 8]; - } - - return &var800aabb4[0]; + return &g_JpnCharCachePixels[0]; #endif } -#endif /** * NTSC only supports English, while PAL supports 4 languages and JPN has its diff --git a/src/game/langinit.c b/src/game/langinit.c index 18ea5dfae..e8e9f2865 100644 --- a/src/game/langinit.c +++ b/src/game/langinit.c @@ -7,30 +7,28 @@ u16 *g_FrameBuffers[2]; -extern s32 var8009d140jf; - void langInit(void) { s32 i; #if VERSION >= VERSION_JPN_FINAL - var8009d140jf = IS4MB() ? 124 : 174; + g_JpnMaxCacheItems = IS4MB() ? 124 : 174; - var800aabb4 = mempAlloc(var8009d140jf * (sizeof(struct var800aabb4) * 8), MEMPOOL_PERMANENT); - var800aabb8 = mempAlloc(ALIGN16(var8009d140jf * sizeof(struct var800aabb8)), MEMPOOL_PERMANENT); + g_JpnCharCachePixels = mempAlloc(MAX_JPN_CACHE_ITEMS() * (sizeof(struct jpncharpixels) * 8), MEMPOOL_PERMANENT); + g_JpnCacheCacheItems = mempAlloc(ALIGN16(MAX_JPN_CACHE_ITEMS() * sizeof(struct jpncacheitem)), MEMPOOL_PERMANENT); - for (i = 0; i < var8009d140jf; i++) { - var800aabb8[i].unk00_00 = 0; - var800aabb8[i].unk00_02 = 0x3fff; + for (i = 0; i < MAX_JPN_CACHE_ITEMS(); i++) { + g_JpnCacheCacheItems[i].ttl = 0; + g_JpnCacheCacheItems[i].codepoint = -1; } #else if (g_Jpn) { - var800aabb4 = mempAlloc(124 * (sizeof(struct var800aabb4) * 8), MEMPOOL_PERMANENT); - var800aabb8 = mempAlloc(ALIGN16(124 * sizeof(struct var800aabb8)), MEMPOOL_PERMANENT); + g_JpnCharCachePixels = mempAlloc(MAX_JPN_CACHE_ITEMS() * (sizeof(struct jpncharpixels) * 8), MEMPOOL_PERMANENT); + g_JpnCacheCacheItems = mempAlloc(ALIGN16(MAX_JPN_CACHE_ITEMS() * sizeof(struct jpncacheitem)), MEMPOOL_PERMANENT); - for (i = 0; i < 124; i++) { - var800aabb8[i].unk00_00 = 0; - var800aabb8[i].unk00_02 = 0x3fff; + for (i = 0; i < MAX_JPN_CACHE_ITEMS(); i++) { + g_JpnCacheCacheItems[i].ttl = 0; + g_JpnCacheCacheItems[i].codepoint = -1; } } #endif diff --git a/src/game/langtick.c b/src/game/langtick.c index 767c49baf..2b9704db7 100644 --- a/src/game/langtick.c +++ b/src/game/langtick.c @@ -11,7 +11,7 @@ s32 var8009d370jf; #endif -extern s32 var8009d140jf; +extern s32 g_JpnMaxCacheItems; void langTick(void) { @@ -29,9 +29,9 @@ void langTick(void) language = 99; } - for (i = 0; i < var8009d140jf; i++) { - if (var800aabb8[i].unk00_00) { - var800aabb8[i].unk00_00--; + for (i = 0; i < MAX_JPN_CACHE_ITEMS(); i++) { + if (g_JpnCacheCacheItems[i].ttl) { + g_JpnCacheCacheItems[i].ttl--; } } #elif VERSION >= VERSION_PAL_BETA @@ -45,17 +45,17 @@ void langTick(void) } if (g_Jpn) { - for (i = 0; i != 124; i++) { - if (var800aabb8[i].unk00_00) { - var800aabb8[i].unk00_00--; + for (i = 0; i != MAX_JPN_CACHE_ITEMS(); i++) { + if (g_JpnCacheCacheItems[i].ttl) { + g_JpnCacheCacheItems[i].ttl--; } } } #else if (g_Jpn) { - for (i = 0; i != 124; i++) { - if (var800aabb8[i].unk00_00) { - var800aabb8[i].unk00_00--; + for (i = 0; i != MAX_JPN_CACHE_ITEMS(); i++) { + if (g_JpnCacheCacheItems[i].ttl) { + g_JpnCacheCacheItems[i].ttl--; } } } diff --git a/src/include/bss.h b/src/include/bss.h index 33c91f95c..3f5a9437c 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -247,8 +247,8 @@ extern u32 g_AudioXReasonsActive[4]; extern s32 g_MusicXReasonMinDurations[4]; extern s32 g_MusicXReasonMaxDurations[4]; extern u32 *g_LangBanks[69]; -extern struct var800aabb4 *var800aabb4; -extern struct var800aabb8 *var800aabb8; +extern struct jpncharpixels *g_JpnCharCachePixels; +extern struct jpncacheitem *g_JpnCacheCacheItems; extern struct texture *g_Textures; extern struct texpool g_TexSharedPool; extern struct texcacheitem g_TexCacheItems[150]; @@ -287,7 +287,7 @@ extern u8 g_AmBotCommands[16]; extern struct mpsetup g_MpSetup; extern struct bossfile g_BossFile; extern struct chrdata *g_MpBotChrPtrs[MAX_BOTS]; -extern s32 var8009d140jf; +extern s32 g_JpnMaxCacheItems; extern s32 var8009d370jf; #endif diff --git a/src/include/constants.h b/src/include/constants.h index d5ae3deed..0b06ecd39 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -106,6 +106,12 @@ #define ROM_GAMECODE 'NPDE' #endif +#if VERSION == VERSION_JPN_FINAL +#define MAX_JPN_CACHE_ITEMS() g_JpnMaxCacheItems +#else +#define MAX_JPN_CACHE_ITEMS() 124 +#endif + // These actions are assigned to chr->actiontype #define ACT_INIT 0 #define ACT_STAND 1 diff --git a/src/include/game/lang.h b/src/include/game/lang.h index e2cc7a248..8f1e3e904 100644 --- a/src/include/game/lang.h +++ b/src/include/game/lang.h @@ -11,7 +11,7 @@ void langReset(s32 stagenum); void langTick(void); u32 langGetLangBankIndexFromStagenum(s32 stagenum); -struct var800aabb4 *lang0f16e3fc(s32 arg0); +struct jpncharpixels *langGetJpnCharPixels(s32 codepoint); s32 langGetFileNumOffset(void); s32 langGetFileId(s32 bank); void langLoad(s32 bank); diff --git a/src/include/types.h b/src/include/types.h index 450ac74e9..cb6fdc11f 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -5116,15 +5116,15 @@ struct texture { u32 unk04_0c : 4; }; -struct var800aabb4 { +struct jpncharpixels { /*0x00*/ u32 unk00; /*0x04*/ u32 unk04; /*0x08*/ u32 unk08; }; -struct var800aabb8 { - u16 unk00_00 : 2; - u16 unk00_02 : 14; +struct jpncacheitem { + u16 ttl : 2; + u16 codepoint : 14; }; struct bgcmd { diff --git a/src/lib/ultra/io/conteepread.c b/src/lib/ultra/io/conteepread.c index 93f340df2..e386473a7 100644 --- a/src/lib/ultra/io/conteepread.c +++ b/src/lib/ultra/io/conteepread.c @@ -7,7 +7,7 @@ OSPifRam __osEepPifRam; #if VERSION >= VERSION_JPN_FINAL u32 var8009d010pf[4]; -s32 var8009d140jf; +s32 g_JpnMaxCacheItems; #elif VERSION >= VERSION_PAL_BETA u32 var8009d010pf[4]; #endif