From a0e294c252bd8d1d46e2deeca58d0ff6f445a11a Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 25 Jan 2021 18:58:24 +1000 Subject: [PATCH] Decompile _Genld --- src/include/lib/lib_04a80.h | 31 +- src/include/lib/lib_4a5e0.h | 2 +- src/lib/lib_04a80.c | 576 ++++++++++-------------------------- src/lib/lib_4e690.c | 2 +- 4 files changed, 183 insertions(+), 428 deletions(-) diff --git a/src/include/lib/lib_04a80.h b/src/include/lib/lib_04a80.h index 171f724ff..a7cc61391 100644 --- a/src/include/lib/lib_04a80.h +++ b/src/include/lib/lib_04a80.h @@ -3,10 +3,35 @@ #include #include "types.h" +typedef struct { + union { + /* 00 */ long long s64; + double f64; + } value; + /* 08 */ char *buff; + /* 0c */ int n0; + /* 10 */ int num_leading_zeros; + /* 14 */ int part2_len; + /* 18 */ int num_mid_zeros; + /* 1c */ int part3_len; + /* 20 */ int num_trailing_zeros; + /* 24 */ int precision; + /* 28 */ int width; + /* 2c */ unsigned int size; + /* 30 */ unsigned int flags; + /* 34 */ char length; +} printf_struct; + +#define FLAGS_SPACE 1 +#define FLAGS_PLUS 2 +#define FLAGS_MINUS 4 +#define FLAGS_HASH 8 +#define FLAGS_ZERO 16 + u32 func00004a80(void); u32 func00004c04(void); -u32 func00004c50(void); -u32 func000050ec(void); -u32 func000051a4(void); +u32 _Ldtob(void); +u32 _Ldunscale(void); +void _Genld(printf_struct *px, char code, char *p, short nsig, short xexp); #endif diff --git a/src/include/lib/lib_4a5e0.h b/src/include/lib/lib_4a5e0.h index 237d9f015..e3ac4034c 100644 --- a/src/include/lib/lib_4a5e0.h +++ b/src/include/lib/lib_4a5e0.h @@ -3,7 +3,7 @@ #include #include "types.h" -u32 memcpy(void); +void *memcpy(void *, const void *, size_t); u32 strlen(char *str); u32 strchr(void); diff --git a/src/lib/lib_04a80.c b/src/lib/lib_04a80.c index 38f35c30e..cc97f226c 100644 --- a/src/lib/lib_04a80.c +++ b/src/lib/lib_04a80.c @@ -43,10 +43,6 @@ const u32 var70052510[] = {0x75154fdd}; const u32 var70052514[] = {0x7f73bf3c}; const u32 var70052518[] = {0x4e614e00}; const u32 var7005251c[] = {0x496e6600}; -const u32 var70052520[] = {0x30000000}; -const u32 var70052524[] = {0x00000000}; -const u32 var70052528[] = {0x4197d784}; -const u32 var7005252c[] = {0x00000000}; GLOBAL_ASM( glabel func00004a80 @@ -173,7 +169,7 @@ glabel func00004c04 ); GLOBAL_ASM( -glabel func00004c50 +glabel _Ldtob /* 4c50: 27bdff20 */ addiu $sp,$sp,-224 /* 4c54: 44802000 */ mtc1 $zero,$f4 /* 4c58: afbf0044 */ sw $ra,0x44($sp) @@ -211,7 +207,7 @@ glabel func00004c50 /* 4ccc: 27a40096 */ addiu $a0,$sp,0x96 /* 4cd0: 00c02825 */ or $a1,$a2,$zero /* 4cd4: afa600e0 */ sw $a2,0xe0($sp) -/* 4cd8: 0c00143b */ jal func000050ec +/* 4cd8: 0c00143b */ jal _Ldunscale /* 4cdc: f7a20050 */ sdc1 $f2,0x50($sp) /* 4ce0: 18400010 */ blez $v0,.L00004d24 /* 4ce4: d7a20050 */ ldc1 $f2,0x50($sp) @@ -497,7 +493,7 @@ glabel func00004c50 /* 50ac: 8fa400e0 */ lw $a0,0xe0($sp) /* 50b0: 93a500e7 */ lbu $a1,0xe7($sp) /* 50b4: 02403025 */ or $a2,$s2,$zero -/* 50b8: 0c001469 */ jal func000051a4 +/* 50b8: 0c001469 */ jal _Genld /* 50bc: afb80010 */ sw $t8,0x10($sp) /* 50c0: 8fbf0044 */ lw $ra,0x44($sp) .L000050c4: @@ -514,7 +510,7 @@ glabel func00004c50 ); GLOBAL_ASM( -glabel func000050ec +glabel _Ldunscale /* 50ec: 94a60000 */ lhu $a2,0x0($a1) /* 50f0: 240107ff */ addiu $at,$zero,0x7ff /* 50f4: 30c37ff0 */ andi $v1,$a2,0x7ff0 @@ -568,418 +564,152 @@ glabel func000050ec /* 51a0: 00000000 */ nop ); -GLOBAL_ASM( -glabel func000051a4 -/* 51a4: 27bdffe0 */ addiu $sp,$sp,-32 -/* 51a8: afa7002c */ sw $a3,0x2c($sp) -/* 51ac: 00077400 */ sll $t6,$a3,0x10 -/* 51b0: 000e3c03 */ sra $a3,$t6,0x10 -/* 51b4: afb10018 */ sw $s1,0x18($sp) -/* 51b8: afb00014 */ sw $s0,0x14($sp) -/* 51bc: 00808025 */ or $s0,$a0,$zero -/* 51c0: 00c08825 */ or $s1,$a2,$zero -/* 51c4: afbf001c */ sw $ra,0x1c($sp) -/* 51c8: 1ce00004 */ bgtz $a3,.L000051dc -/* 51cc: afa50024 */ sw $a1,0x24($sp) -/* 51d0: 3c117005 */ lui $s1,%hi(var70052520) -/* 51d4: 26312520 */ addiu $s1,$s1,%lo(var70052520) -/* 51d8: 24070001 */ addiu $a3,$zero,0x1 -.L000051dc: -/* 51dc: 93a30027 */ lbu $v1,0x27($sp) -/* 51e0: 24020066 */ addiu $v0,$zero,0x66 -/* 51e4: 24040067 */ addiu $a0,$zero,0x67 -/* 51e8: 5043000e */ beql $v0,$v1,.L00005224 -/* 51ec: 87a80032 */ lh $t0,0x32($sp) -/* 51f0: 10830003 */ beq $a0,$v1,.L00005200 -/* 51f4: 24010047 */ addiu $at,$zero,0x47 -/* 51f8: 146100a5 */ bne $v1,$at,.L00005490 -/* 51fc: 00000000 */ nop -.L00005200: -/* 5200: 87a80032 */ lh $t0,0x32($sp) -/* 5204: 2901fffc */ slti $at,$t0,-4 -/* 5208: 142000a1 */ bnez $at,.L00005490 -/* 520c: 00000000 */ nop -/* 5210: 8e180024 */ lw $t8,0x24($s0) -/* 5214: 0118082a */ slt $at,$t0,$t8 -/* 5218: 1020009d */ beqz $at,.L00005490 -/* 521c: 00000000 */ nop -/* 5220: 87a80032 */ lh $t0,0x32($sp) -.L00005224: -/* 5224: 02202825 */ or $a1,$s1,$zero -/* 5228: 25080001 */ addiu $t0,$t0,0x1 -/* 522c: 0008cc00 */ sll $t9,$t0,0x10 -/* 5230: 1043000e */ beq $v0,$v1,.L0000526c -/* 5234: 00194403 */ sra $t0,$t9,0x10 -/* 5238: 8e0a0030 */ lw $t2,0x30($s0) -/* 523c: 8e020024 */ lw $v0,0x24($s0) -/* 5240: 314b0008 */ andi $t3,$t2,0x8 -/* 5244: 15600005 */ bnez $t3,.L0000525c -/* 5248: 00e2082a */ slt $at,$a3,$v0 -/* 524c: 50200004 */ beqzl $at,.L00005260 -/* 5250: 00486023 */ subu $t4,$v0,$t0 -/* 5254: ae070024 */ sw $a3,0x24($s0) -/* 5258: 00e01025 */ or $v0,$a3,$zero -.L0000525c: -/* 525c: 00486023 */ subu $t4,$v0,$t0 -.L00005260: -/* 5260: 05810002 */ bgez $t4,.L0000526c -/* 5264: ae0c0024 */ sw $t4,0x24($s0) -/* 5268: ae000024 */ sw $zero,0x24($s0) -.L0000526c: -/* 526c: 1d000034 */ bgtz $t0,.L00005340 -/* 5270: 00e8082a */ slt $at,$a3,$t0 -/* 5274: 8e0f0008 */ lw $t7,0x8($s0) -/* 5278: 8e180014 */ lw $t8,0x14($s0) -/* 527c: 240e0030 */ addiu $t6,$zero,0x30 -/* 5280: 00081823 */ negu $v1,$t0 -/* 5284: 01f8c821 */ addu $t9,$t7,$t8 -/* 5288: a32e0000 */ sb $t6,0x0($t9) -/* 528c: 8e090014 */ lw $t1,0x14($s0) -/* 5290: 8e020024 */ lw $v0,0x24($s0) -/* 5294: 252a0001 */ addiu $t2,$t1,0x1 -/* 5298: 1c400005 */ bgtz $v0,.L000052b0 -/* 529c: ae0a0014 */ sw $t2,0x14($s0) -/* 52a0: 8e0b0030 */ lw $t3,0x30($s0) -/* 52a4: 316c0008 */ andi $t4,$t3,0x8 -/* 52a8: 5180000b */ beqzl $t4,.L000052d8 -/* 52ac: 0043082a */ slt $at,$v0,$v1 -.L000052b0: -/* 52b0: 8e0f0008 */ lw $t7,0x8($s0) -/* 52b4: 8e180014 */ lw $t8,0x14($s0) -/* 52b8: 240d002e */ addiu $t5,$zero,0x2e -/* 52bc: 01f87021 */ addu $t6,$t7,$t8 -/* 52c0: a1cd0000 */ sb $t5,0x0($t6) -/* 52c4: 8e190014 */ lw $t9,0x14($s0) -/* 52c8: 8e020024 */ lw $v0,0x24($s0) -/* 52cc: 27290001 */ addiu $t1,$t9,0x1 -/* 52d0: ae090014 */ sw $t1,0x14($s0) -/* 52d4: 0043082a */ slt $at,$v0,$v1 -.L000052d8: -/* 52d8: 50200006 */ beqzl $at,.L000052f4 -/* 52dc: 00486021 */ addu $t4,$v0,$t0 -/* 52e0: 00024023 */ negu $t0,$v0 -/* 52e4: 00085400 */ sll $t2,$t0,0x10 -/* 52e8: 000a4403 */ sra $t0,$t2,0x10 -/* 52ec: 00081823 */ negu $v1,$t0 -/* 52f0: 00486021 */ addu $t4,$v0,$t0 -.L000052f4: -/* 52f4: 0187082a */ slt $at,$t4,$a3 -/* 52f8: ae030018 */ sw $v1,0x18($s0) -/* 52fc: 10200004 */ beqz $at,.L00005310 -/* 5300: ae0c0024 */ sw $t4,0x24($s0) -/* 5304: 000c3c00 */ sll $a3,$t4,0x10 -/* 5308: 00077c03 */ sra $t7,$a3,0x10 -/* 530c: 01e03825 */ or $a3,$t7,$zero -.L00005310: -/* 5310: 8e180008 */ lw $t8,0x8($s0) -/* 5314: 8e0d0014 */ lw $t5,0x14($s0) -/* 5318: ae07001c */ sw $a3,0x1c($s0) -/* 531c: a7a7002e */ sh $a3,0x2e($sp) -/* 5320: 00e03025 */ or $a2,$a3,$zero -/* 5324: 0c012978 */ jal memcpy -/* 5328: 030d2021 */ addu $a0,$t8,$t5 -/* 532c: 87a7002e */ lh $a3,0x2e($sp) -/* 5330: 8e0e0024 */ lw $t6,0x24($s0) -/* 5334: 01c7c823 */ subu $t9,$t6,$a3 -/* 5338: 100000f4 */ b .L0000570c -/* 533c: ae190020 */ sw $t9,0x20($s0) -.L00005340: -/* 5340: 10200021 */ beqz $at,.L000053c8 -/* 5344: 02202825 */ or $a1,$s1,$zero -/* 5348: 8e090008 */ lw $t1,0x8($s0) -/* 534c: 8e0a0014 */ lw $t2,0x14($s0) -/* 5350: a7a80032 */ sh $t0,0x32($sp) -/* 5354: a7a7002e */ sh $a3,0x2e($sp) -/* 5358: 02202825 */ or $a1,$s1,$zero -/* 535c: 00e03025 */ or $a2,$a3,$zero -/* 5360: 0c012978 */ jal memcpy -/* 5364: 012a2021 */ addu $a0,$t1,$t2 -/* 5368: 87a7002e */ lh $a3,0x2e($sp) -/* 536c: 87a80032 */ lh $t0,0x32($sp) -/* 5370: 8e0b0014 */ lw $t3,0x14($s0) -/* 5374: 8e020024 */ lw $v0,0x24($s0) -/* 5378: 01077823 */ subu $t7,$t0,$a3 -/* 537c: 01676021 */ addu $t4,$t3,$a3 -/* 5380: ae0c0014 */ sw $t4,0x14($s0) -/* 5384: 1c400005 */ bgtz $v0,.L0000539c -/* 5388: ae0f0018 */ sw $t7,0x18($s0) -/* 538c: 8e180030 */ lw $t8,0x30($s0) -/* 5390: 330d0008 */ andi $t5,$t8,0x8 -/* 5394: 11a0000a */ beqz $t5,.L000053c0 -/* 5398: 00000000 */ nop -.L0000539c: -/* 539c: 8e190008 */ lw $t9,0x8($s0) -/* 53a0: 8e090014 */ lw $t1,0x14($s0) -/* 53a4: 240e002e */ addiu $t6,$zero,0x2e -/* 53a8: 03295021 */ addu $t2,$t9,$t1 -/* 53ac: a14e0000 */ sb $t6,0x0($t2) -/* 53b0: 8e0b001c */ lw $t3,0x1c($s0) -/* 53b4: 8e020024 */ lw $v0,0x24($s0) -/* 53b8: 256c0001 */ addiu $t4,$t3,0x1 -/* 53bc: ae0c001c */ sw $t4,0x1c($s0) -.L000053c0: -/* 53c0: 100000d2 */ b .L0000570c -/* 53c4: ae020020 */ sw $v0,0x20($s0) -.L000053c8: -/* 53c8: 8e0f0008 */ lw $t7,0x8($s0) -/* 53cc: 8e180014 */ lw $t8,0x14($s0) -/* 53d0: a7a80032 */ sh $t0,0x32($sp) -/* 53d4: a7a7002e */ sh $a3,0x2e($sp) -/* 53d8: 01003025 */ or $a2,$t0,$zero -/* 53dc: 0c012978 */ jal memcpy -/* 53e0: 01f82021 */ addu $a0,$t7,$t8 -/* 53e4: 87a7002e */ lh $a3,0x2e($sp) -/* 53e8: 87a80032 */ lh $t0,0x32($sp) -/* 53ec: 8e0d0014 */ lw $t5,0x14($s0) -/* 53f0: 8e020024 */ lw $v0,0x24($s0) -/* 53f4: 00e83823 */ subu $a3,$a3,$t0 -/* 53f8: 00074c00 */ sll $t1,$a3,0x10 -/* 53fc: 01a8c821 */ addu $t9,$t5,$t0 -/* 5400: ae190014 */ sw $t9,0x14($s0) -/* 5404: 1c400005 */ bgtz $v0,.L0000541c -/* 5408: 00093c03 */ sra $a3,$t1,0x10 -/* 540c: 8e0a0030 */ lw $t2,0x30($s0) -/* 5410: 314b0008 */ andi $t3,$t2,0x8 -/* 5414: 5160000b */ beqzl $t3,.L00005444 -/* 5418: 0047082a */ slt $at,$v0,$a3 -.L0000541c: -/* 541c: 8e0f0008 */ lw $t7,0x8($s0) -/* 5420: 8e180014 */ lw $t8,0x14($s0) -/* 5424: 240c002e */ addiu $t4,$zero,0x2e -/* 5428: 01f86821 */ addu $t5,$t7,$t8 -/* 542c: a1ac0000 */ sb $t4,0x0($t5) -/* 5430: 8e190014 */ lw $t9,0x14($s0) -/* 5434: 8e020024 */ lw $v0,0x24($s0) -/* 5438: 27290001 */ addiu $t1,$t9,0x1 -/* 543c: ae090014 */ sw $t1,0x14($s0) -/* 5440: 0047082a */ slt $at,$v0,$a3 -.L00005444: -/* 5444: 10200004 */ beqz $at,.L00005458 -/* 5448: 01112821 */ addu $a1,$t0,$s1 -/* 544c: 00023c00 */ sll $a3,$v0,0x10 -/* 5450: 00077403 */ sra $t6,$a3,0x10 -/* 5454: 01c03825 */ or $a3,$t6,$zero -.L00005458: -/* 5458: 8e0a0008 */ lw $t2,0x8($s0) -/* 545c: 8e0b0014 */ lw $t3,0x14($s0) -/* 5460: a7a7002e */ sh $a3,0x2e($sp) -/* 5464: 00e03025 */ or $a2,$a3,$zero -/* 5468: 0c012978 */ jal memcpy -/* 546c: 014b2021 */ addu $a0,$t2,$t3 -/* 5470: 87a7002e */ lh $a3,0x2e($sp) -/* 5474: 8e0f0014 */ lw $t7,0x14($s0) -/* 5478: 8e0c0024 */ lw $t4,0x24($s0) -/* 547c: 01e7c021 */ addu $t8,$t7,$a3 -/* 5480: 01876823 */ subu $t5,$t4,$a3 -/* 5484: ae180014 */ sw $t8,0x14($s0) -/* 5488: 100000a0 */ b .L0000570c -/* 548c: ae0d0018 */ sw $t5,0x18($s0) -.L00005490: -/* 5490: 10830004 */ beq $a0,$v1,.L000054a4 -/* 5494: 87a80032 */ lh $t0,0x32($sp) -/* 5498: 24010047 */ addiu $at,$zero,0x47 -/* 549c: 54610013 */ bnel $v1,$at,.L000054ec -/* 54a0: 8e0f0008 */ lw $t7,0x8($s0) -.L000054a4: -/* 54a4: 8e020024 */ lw $v0,0x24($s0) -/* 54a8: 240e0065 */ addiu $t6,$zero,0x65 -/* 54ac: 00e2082a */ slt $at,$a3,$v0 -/* 54b0: 50200004 */ beqzl $at,.L000054c4 -/* 54b4: 2459ffff */ addiu $t9,$v0,-1 -/* 54b8: ae070024 */ sw $a3,0x24($s0) -/* 54bc: 00e01025 */ or $v0,$a3,$zero -/* 54c0: 2459ffff */ addiu $t9,$v0,-1 -.L000054c4: -/* 54c4: 07210002 */ bgez $t9,.L000054d0 -/* 54c8: ae190024 */ sw $t9,0x24($s0) -/* 54cc: ae000024 */ sw $zero,0x24($s0) -.L000054d0: -/* 54d0: 54830004 */ bnel $a0,$v1,.L000054e4 -/* 54d4: 240a0045 */ addiu $t2,$zero,0x45 -/* 54d8: 10000003 */ b .L000054e8 -/* 54dc: a3ae0027 */ sb $t6,0x27($sp) -/* 54e0: 240a0045 */ addiu $t2,$zero,0x45 -.L000054e4: -/* 54e4: a3aa0027 */ sb $t2,0x27($sp) -.L000054e8: -/* 54e8: 8e0f0008 */ lw $t7,0x8($s0) -.L000054ec: -/* 54ec: 8e180014 */ lw $t8,0x14($s0) -/* 54f0: 922b0000 */ lbu $t3,0x0($s1) -/* 54f4: 26310001 */ addiu $s1,$s1,0x1 -/* 54f8: 01f86021 */ addu $t4,$t7,$t8 -/* 54fc: a18b0000 */ sb $t3,0x0($t4) -/* 5500: 8e0d0014 */ lw $t5,0x14($s0) -/* 5504: 8e020024 */ lw $v0,0x24($s0) -/* 5508: 25b90001 */ addiu $t9,$t5,0x1 -/* 550c: 1c400005 */ bgtz $v0,.L00005524 -/* 5510: ae190014 */ sw $t9,0x14($s0) -/* 5514: 8e090030 */ lw $t1,0x30($s0) -/* 5518: 312e0008 */ andi $t6,$t1,0x8 -/* 551c: 11c0000a */ beqz $t6,.L00005548 -/* 5520: 00000000 */ nop -.L00005524: -/* 5524: 8e0f0008 */ lw $t7,0x8($s0) -/* 5528: 8e180014 */ lw $t8,0x14($s0) -/* 552c: 240a002e */ addiu $t2,$zero,0x2e -/* 5530: 01f85821 */ addu $t3,$t7,$t8 -/* 5534: a16a0000 */ sb $t2,0x0($t3) -/* 5538: 8e0c0014 */ lw $t4,0x14($s0) -/* 553c: 8e020024 */ lw $v0,0x24($s0) -/* 5540: 258d0001 */ addiu $t5,$t4,0x1 -/* 5544: ae0d0014 */ sw $t5,0x14($s0) -.L00005548: -/* 5548: 5840001a */ blezl $v0,.L000055b4 -/* 554c: 8e190008 */ lw $t9,0x8($s0) -/* 5550: 24e7ffff */ addiu $a3,$a3,-1 -/* 5554: 0007cc00 */ sll $t9,$a3,0x10 -/* 5558: 00193c03 */ sra $a3,$t9,0x10 -/* 555c: 0047082a */ slt $at,$v0,$a3 -/* 5560: 10200004 */ beqz $at,.L00005574 -/* 5564: 02202825 */ or $a1,$s1,$zero -/* 5568: 00023c00 */ sll $a3,$v0,0x10 -/* 556c: 00077403 */ sra $t6,$a3,0x10 -/* 5570: 01c03825 */ or $a3,$t6,$zero -.L00005574: -/* 5574: 8e0f0008 */ lw $t7,0x8($s0) -/* 5578: 8e180014 */ lw $t8,0x14($s0) -/* 557c: a7a80032 */ sh $t0,0x32($sp) -/* 5580: a7a7002e */ sh $a3,0x2e($sp) -/* 5584: 00e03025 */ or $a2,$a3,$zero -/* 5588: 0c012978 */ jal memcpy -/* 558c: 01f82021 */ addu $a0,$t7,$t8 -/* 5590: 87a7002e */ lh $a3,0x2e($sp) -/* 5594: 8e0a0014 */ lw $t2,0x14($s0) -/* 5598: 8e0c0024 */ lw $t4,0x24($s0) -/* 559c: 87a80032 */ lh $t0,0x32($sp) -/* 55a0: 01475821 */ addu $t3,$t2,$a3 -/* 55a4: 01876823 */ subu $t5,$t4,$a3 -/* 55a8: ae0b0014 */ sw $t3,0x14($s0) -/* 55ac: ae0d0018 */ sw $t5,0x18($s0) -/* 55b0: 8e190008 */ lw $t9,0x8($s0) -.L000055b4: -/* 55b4: 8e090014 */ lw $t1,0x14($s0) -/* 55b8: 93ae0027 */ lbu $t6,0x27($sp) -/* 55bc: 03298821 */ addu $s1,$t9,$t1 -/* 55c0: 26310001 */ addiu $s1,$s1,0x1 -/* 55c4: 05000005 */ bltz $t0,.L000055dc -/* 55c8: a22effff */ sb $t6,-0x1($s1) -/* 55cc: 240f002b */ addiu $t7,$zero,0x2b -/* 55d0: a22f0000 */ sb $t7,0x0($s1) -/* 55d4: 10000008 */ b .L000055f8 -/* 55d8: 26310001 */ addiu $s1,$s1,0x1 -.L000055dc: -/* 55dc: 00084023 */ negu $t0,$t0 -/* 55e0: 00085400 */ sll $t2,$t0,0x10 -/* 55e4: 2418002d */ addiu $t8,$zero,0x2d -/* 55e8: 000a5c03 */ sra $t3,$t2,0x10 -/* 55ec: a2380000 */ sb $t8,0x0($s1) -/* 55f0: 26310001 */ addiu $s1,$s1,0x1 -/* 55f4: 01604025 */ or $t0,$t3,$zero -.L000055f8: -/* 55f8: 29010064 */ slti $at,$t0,0x64 -/* 55fc: 5420002a */ bnezl $at,.L000056a8 -/* 5600: 2402000a */ addiu $v0,$zero,0xa -/* 5604: 290103e8 */ slti $at,$t0,0x3e8 -/* 5608: 14200013 */ bnez $at,.L00005658 -/* 560c: 240203e8 */ addiu $v0,$zero,0x3e8 -/* 5610: 0102001a */ div $zero,$t0,$v0 -/* 5614: 14400002 */ bnez $v0,.L00005620 -/* 5618: 00000000 */ nop -/* 561c: 0007000d */ break 0x7 -.L00005620: -/* 5620: 2401ffff */ addiu $at,$zero,-1 -/* 5624: 14410004 */ bne $v0,$at,.L00005638 -/* 5628: 3c018000 */ lui $at,0x8000 -/* 562c: 15010002 */ bne $t0,$at,.L00005638 -/* 5630: 00000000 */ nop -/* 5634: 0006000d */ break 0x6 -.L00005638: -/* 5638: 00004010 */ mfhi $t0 -/* 563c: 0008cc00 */ sll $t9,$t0,0x10 -/* 5640: 00006012 */ mflo $t4 -/* 5644: 258d0030 */ addiu $t5,$t4,0x30 -/* 5648: 00194c03 */ sra $t1,$t9,0x10 -/* 564c: 01204025 */ or $t0,$t1,$zero -/* 5650: a22d0000 */ sb $t5,0x0($s1) -/* 5654: 26310001 */ addiu $s1,$s1,0x1 -.L00005658: -/* 5658: 24020064 */ addiu $v0,$zero,0x64 -/* 565c: 0102001a */ div $zero,$t0,$v0 -/* 5660: 14400002 */ bnez $v0,.L0000566c -/* 5664: 00000000 */ nop -/* 5668: 0007000d */ break 0x7 -.L0000566c: -/* 566c: 2401ffff */ addiu $at,$zero,-1 -/* 5670: 14410004 */ bne $v0,$at,.L00005684 -/* 5674: 3c018000 */ lui $at,0x8000 -/* 5678: 15010002 */ bne $t0,$at,.L00005684 -/* 567c: 00000000 */ nop -/* 5680: 0006000d */ break 0x6 -.L00005684: -/* 5684: 00004010 */ mfhi $t0 -/* 5688: 0008c400 */ sll $t8,$t0,0x10 -/* 568c: 00007012 */ mflo $t6 -/* 5690: 25cf0030 */ addiu $t7,$t6,0x30 -/* 5694: 00185403 */ sra $t2,$t8,0x10 -/* 5698: 01404025 */ or $t0,$t2,$zero -/* 569c: a22f0000 */ sb $t7,0x0($s1) -/* 56a0: 26310001 */ addiu $s1,$s1,0x1 -/* 56a4: 2402000a */ addiu $v0,$zero,0xa -.L000056a8: -/* 56a8: 0102001a */ div $zero,$t0,$v0 -/* 56ac: 14400002 */ bnez $v0,.L000056b8 -/* 56b0: 00000000 */ nop -/* 56b4: 0007000d */ break 0x7 -.L000056b8: -/* 56b8: 2401ffff */ addiu $at,$zero,-1 -/* 56bc: 14410004 */ bne $v0,$at,.L000056d0 -/* 56c0: 3c018000 */ lui $at,0x8000 -/* 56c4: 15010002 */ bne $t0,$at,.L000056d0 -/* 56c8: 00000000 */ nop -/* 56cc: 0006000d */ break 0x6 -.L000056d0: -/* 56d0: 00004010 */ mfhi $t0 -/* 56d4: 00086c00 */ sll $t5,$t0,0x10 -/* 56d8: 000dcc03 */ sra $t9,$t5,0x10 -/* 56dc: 00005812 */ mflo $t3 -/* 56e0: 256c0030 */ addiu $t4,$t3,0x30 -/* 56e4: 27290030 */ addiu $t1,$t9,0x30 -/* 56e8: a22c0000 */ sb $t4,0x0($s1) -/* 56ec: a2290001 */ sb $t1,0x1($s1) -/* 56f0: 8e0e0008 */ lw $t6,0x8($s0) -/* 56f4: 8e180014 */ lw $t8,0x14($s0) -/* 56f8: 26310002 */ addiu $s1,$s1,0x2 -/* 56fc: 022e7823 */ subu $t7,$s1,$t6 -/* 5700: 01f85023 */ subu $t2,$t7,$t8 -/* 5704: 03204025 */ or $t0,$t9,$zero -/* 5708: ae0a001c */ sw $t2,0x1c($s0) -.L0000570c: -/* 570c: 8e0b0030 */ lw $t3,0x30($s0) -/* 5710: 24010010 */ addiu $at,$zero,0x10 -/* 5714: 316c0014 */ andi $t4,$t3,0x14 -/* 5718: 55810010 */ bnel $t4,$at,.L0000575c -/* 571c: 8fbf001c */ lw $ra,0x1c($sp) -/* 5720: 8e0d000c */ lw $t5,0xc($s0) -/* 5724: 8e190014 */ lw $t9,0x14($s0) -/* 5728: 8e0e0018 */ lw $t6,0x18($s0) -/* 572c: 8e18001c */ lw $t8,0x1c($s0) -/* 5730: 8e0b0020 */ lw $t3,0x20($s0) -/* 5734: 01b94821 */ addu $t1,$t5,$t9 -/* 5738: 8e030028 */ lw $v1,0x28($s0) -/* 573c: 012e7821 */ addu $t7,$t1,$t6 -/* 5740: 01f85021 */ addu $t2,$t7,$t8 -/* 5744: 014b1021 */ addu $v0,$t2,$t3 -/* 5748: 0043082a */ slt $at,$v0,$v1 -/* 574c: 10200002 */ beqz $at,.L00005758 -/* 5750: 00626023 */ subu $t4,$v1,$v0 -/* 5754: ae0c0010 */ sw $t4,0x10($s0) -.L00005758: -/* 5758: 8fbf001c */ lw $ra,0x1c($sp) -.L0000575c: -/* 575c: 8fb00014 */ lw $s0,0x14($sp) -/* 5760: 8fb10018 */ lw $s1,0x18($sp) -/* 5764: 03e00008 */ jr $ra -/* 5768: 27bd0020 */ addiu $sp,$sp,0x20 -/* 576c: 00000000 */ nop -); +void _Genld(printf_struct *px, char code, char *p, short nsig, short xexp) +{ + const char point = 0x2e; + + if (nsig <= 0) { + nsig = 1, p = (char *)"0"; + } + + if (code == 0x66 || ((code == 0x67 || code == 0x47) && (-4 <= xexp) && (xexp < px->precision))) { + /* 0x66 format */ + ++xexp; /* change to leading digit count */ + + if (code != 0x66) { + /* fixup for 0x67 */ + if (!(px->flags & FLAGS_HASH) && nsig < px->precision) { + px->precision = nsig; + } + + if ((px->precision -= xexp) < 0) { + px->precision = 0; + } + } + + if (xexp <= 0) { + /* digits only to right of point */ + px->buff[px->part2_len++] = 0x30; + + if (0 < px->precision || px->flags & FLAGS_HASH) { + px->buff[px->part2_len++] = point; + } + + if (px->precision < -xexp) { + xexp = -px->precision; + } + + px->num_mid_zeros = -xexp; + px->precision += xexp; + + if (px->precision < nsig) { + nsig = px->precision; + } + + memcpy(&px->buff[px->part2_len], p, px->part3_len = nsig); + + px->num_trailing_zeros = px->precision - nsig; + } else if (nsig < xexp) { + /* zeros before point */ + memcpy(&px->buff[px->part2_len], p, nsig); + + px->part2_len += nsig; + px->num_mid_zeros = xexp - nsig; + + if (0 < px->precision || px->flags & FLAGS_HASH) { + px->buff[px->part2_len] = point, ++px->part3_len; + } + + px->num_trailing_zeros = px->precision; + } else { + /* enough digits before point */ + memcpy(&px->buff[px->part2_len], p, xexp); + + px->part2_len += xexp; + nsig -= xexp; + + if (0 < px->precision || px->flags & FLAGS_HASH) { + px->buff[px->part2_len++] = point; + } + + if (px->precision < nsig) { + nsig = px->precision; + } + + memcpy(&px->buff[px->part2_len], p + xexp, nsig); + + px->part2_len += nsig; + px->num_mid_zeros = px->precision - nsig; + } + } else { + /* 0x65 format */ + if (code == 0x67 || code == 0x47) { + /* fixup for 0x67 */ + if (nsig < px->precision) { + px->precision = nsig; + } + + if (--px->precision < 0) { + px->precision = 0; + } + + code = code == 0x67 ? 0x65 : 0x45; + } + + px->buff[px->part2_len++] = *p++; + + if (0 < px->precision || px->flags & FLAGS_HASH) { + px->buff[px->part2_len++] = point; + } + + if (0 < px->precision) { + /* put fraction digits */ + if (px->precision < --nsig) { + nsig = px->precision; + } + + memcpy(&px->buff[px->part2_len], p, nsig); + + px->part2_len += nsig; + px->num_mid_zeros = px->precision - nsig; + } + + p = (char *)&px->buff[px->part2_len]; /* put exponent */ + *p++ = code; + + if (0 <= xexp) { + *p++ = 0x2b; + } else { + /* negative exponent */ + *p++ = 0x2d; + xexp = -xexp; + } + + if (100 <= xexp) { + /* put oversize exponent */ + if (1000 <= xexp) { + *p++ = xexp / 1000 + 0x30, xexp %= 1000; + } + + *p++ = xexp / 100 + 0x30, xexp %= 100; + } + + *p++ = xexp / 10 + 0x30, xexp %= 10; + *p++ = xexp + 0x30; + + px->part3_len = p - (char *)&px->buff[px->part2_len]; + } + + if ((px->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) { + /* pad with leading zeros */ + int n = px->n0 + px->part2_len + px->num_mid_zeros + px->part3_len + px->num_trailing_zeros; + + if (n < px->width) { + px->num_leading_zeros = px->width - n; + } + } +} + +const u32 var70052524[] = {0x00000000}; +const u32 var70052528[] = {0x4197d784}; +const u32 var7005252c[] = {0x00000000}; diff --git a/src/lib/lib_4e690.c b/src/lib/lib_4e690.c index cbcaf623b..884fea566 100644 --- a/src/lib/lib_4e690.c +++ b/src/lib/lib_4e690.c @@ -350,7 +350,7 @@ glabel func0004e690 .L0004eb44: /* 4eb44: 02002025 */ or $a0,$s0,$zero /* 4eb48: 03077021 */ addu $t6,$t8,$a3 -/* 4eb4c: 0c001314 */ jal func00004c50 +/* 4eb4c: 0c001314 */ jal _Ldtob /* 4eb50: ae0e0008 */ sw $t6,0x8($s0) /* 4eb54: 10000067 */ b .L0004ecf4 /* 4eb58: 8fbf0014 */ lw $ra,0x14($sp)