From ab1ec89f22808c38426f7e0d4e4f0e1a5bc3aec9 Mon Sep 17 00:00:00 2001 From: Random <28494085+Random06457@users.noreply.github.com> Date: Mon, 22 Jun 2020 00:43:14 +0200 Subject: [PATCH] Decompile jpegdecoder.c, padsetup.c and code_800C3C20.c (#217) * Decompile jpegdecoder.c, padsetup.c and code_800C3C20.c * change func_800C3C20's prototype and rename some fields in jpeg related structs * Fix comment in Jpeg_GetU16 and change func_800C3C20 * use a switch in padsetup.c --- Makefile | 1 + asm/code_800C3C20.s | 32 -- asm/code_800FCD40.s | 99 ---- asm/jpegdecoder.s | 433 ------------------ .../jpegdecoder/JpegDecoder_ParseNextSymbol.s | 87 ++++ asm/non_matchings/code/z_jpeg/Jpeg_Decode.s | 2 +- data/code_800C3C20.data.s | 16 - data/jpegdecoder.bss.s | 25 - include/functions.h | 14 +- include/variables.h | 5 - include/z64.h | 27 +- spec | 8 +- src/code/code_800C3C20.c | 13 + src/code/jpegdecoder.c | 201 ++++++++ src/code/jpegutils.c | 6 +- src/code/padmgr.c | 2 +- src/code/padsetup.c | 33 ++ src/code/z_jpeg.c | 38 +- 18 files changed, 389 insertions(+), 653 deletions(-) delete mode 100644 asm/code_800C3C20.s delete mode 100644 asm/code_800FCD40.s delete mode 100644 asm/jpegdecoder.s create mode 100644 asm/non_matchings/code/jpegdecoder/JpegDecoder_ParseNextSymbol.s delete mode 100644 data/code_800C3C20.data.s delete mode 100644 data/jpegdecoder.bss.s create mode 100644 src/code/code_800C3C20.c create mode 100644 src/code/jpegdecoder.c create mode 100644 src/code/padsetup.c diff --git a/Makefile b/Makefile index fea74456a6..6e582c0d9c 100644 --- a/Makefile +++ b/Makefile @@ -118,6 +118,7 @@ build/src/libultra_boot_O2/%.o: CC := $(CC_OLD) build/src/libultra_code/%.o: CC := python3 tools/asm_processor/build.py $(CC_OLD) -- $(AS) $(ASFLAGS) -- build/src/code/jpegutils.o: CC := python3 tools/asm_processor/build.py $(CC_OLD) -- $(AS) $(ASFLAGS) -- +build/src/code/jpegdecoder.o: CC := python3 tools/asm_processor/build.py $(CC_OLD) -- $(AS) $(ASFLAGS) -- build/src/boot/%.o: CC := python3 tools/asm_processor/build.py $(CC) -- $(AS) $(ASFLAGS) -- build/src/code/%.o: CC := python3 tools/asm_processor/build.py $(CC) -- $(AS) $(ASFLAGS) -- diff --git a/asm/code_800C3C20.s b/asm/code_800C3C20.s deleted file mode 100644 index 88cedee490..0000000000 --- a/asm/code_800C3C20.s +++ /dev/null @@ -1,32 +0,0 @@ -.include "macro.inc" - -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 # allow use of 64-bit general purpose registers - -.section .text - -.balign 16 - -glabel func_800C3C20 -/* B3ADC0 800C3C20 27BDFFE0 */ addiu $sp, $sp, -0x20 -/* B3ADC4 800C3C24 AFB10018 */ sw $s1, 0x18($sp) -/* B3ADC8 800C3C28 AFB00014 */ sw $s0, 0x14($sp) -/* B3ADCC 800C3C2C 3C108013 */ lui $s0, %hi(D_8012D200) # $s0, 0x8013 -/* B3ADD0 800C3C30 3C118013 */ lui $s1, %hi(D_8012D207) # $s1, 0x8013 -/* B3ADD4 800C3C34 AFBF001C */ sw $ra, 0x1c($sp) -/* B3ADD8 800C3C38 2631D207 */ addiu $s1, %lo(D_8012D207) # addiu $s1, $s1, -0x2df9 -/* B3ADDC 800C3C3C 2610D200 */ addiu $s0, %lo(D_8012D200) # addiu $s0, $s0, -0x2e00 -.L800C3C40: -/* B3ADE0 800C3C40 0C03E1E8 */ jal func_800F87A0 -/* B3ADE4 800C3C44 92040000 */ lbu $a0, ($s0) -/* B3ADE8 800C3C48 26100001 */ addiu $s0, $s0, 1 -/* B3ADEC 800C3C4C 0211082B */ sltu $at, $s0, $s1 -/* B3ADF0 800C3C50 1420FFFB */ bnez $at, .L800C3C40 -/* B3ADF4 800C3C54 00000000 */ nop -/* B3ADF8 800C3C58 8FBF001C */ lw $ra, 0x1c($sp) -/* B3ADFC 800C3C5C 8FB00014 */ lw $s0, 0x14($sp) -/* B3AE00 800C3C60 8FB10018 */ lw $s1, 0x18($sp) -/* B3AE04 800C3C64 03E00008 */ jr $ra -/* B3AE08 800C3C68 27BD0020 */ addiu $sp, $sp, 0x20 diff --git a/asm/code_800FCD40.s b/asm/code_800FCD40.s deleted file mode 100644 index 323bf09a31..0000000000 --- a/asm/code_800FCD40.s +++ /dev/null @@ -1,99 +0,0 @@ -.include "macro.inc" - -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 # allow use of 64-bit general purpose registers - -.section .text - -.balign 16 - -glabel func_800FCD40 -/* B73EE0 800FCD40 27BDFFE0 */ addiu $sp, $sp, -0x20 -/* B73EE4 800FCD44 AFBF001C */ sw $ra, 0x1c($sp) -/* B73EE8 800FCD48 AFB00018 */ sw $s0, 0x18($sp) -/* B73EEC 800FCD4C AFA40020 */ sw $a0, 0x20($sp) -/* B73EF0 800FCD50 240E00FF */ li $t6, 255 -/* B73EF4 800FCD54 A0AE0000 */ sb $t6, ($a1) -/* B73EF8 800FCD58 00C08025 */ move $s0, $a2 -/* B73EFC 800FCD5C AFA50024 */ sw $a1, 0x24($sp) -/* B73F00 800FCD60 0C040304 */ jal osContInit -/* B73F04 800FCD64 8FA40020 */ lw $a0, 0x20($sp) -/* B73F08 800FCD68 10400003 */ beqz $v0, .L800FCD78 -/* B73F0C 800FCD6C 8FA70024 */ lw $a3, 0x24($sp) -/* B73F10 800FCD70 1000003E */ b .L800FCE6C -/* B73F14 800FCD74 8FBF001C */ lw $ra, 0x1c($sp) -.L800FCD78: -/* B73F18 800FCD78 90EF0000 */ lbu $t7, ($a3) -/* B73F1C 800FCD7C 240100FF */ li $at, 255 -/* B73F20 800FCD80 8FA40020 */ lw $a0, 0x20($sp) -/* B73F24 800FCD84 55E10038 */ bnel $t7, $at, .L800FCE68 -/* B73F28 800FCD88 00001025 */ move $v0, $zero -/* B73F2C 800FCD8C 0C040C84 */ jal osContStartQuery -/* B73F30 800FCD90 AFA70024 */ sw $a3, 0x24($sp) -/* B73F34 800FCD94 10400003 */ beqz $v0, .L800FCDA4 -/* B73F38 800FCD98 8FA70024 */ lw $a3, 0x24($sp) -/* B73F3C 800FCD9C 10000032 */ b .L800FCE68 -/* B73F40 800FCDA0 24020001 */ li $v0, 1 -.L800FCDA4: -/* B73F44 800FCDA4 8FA40020 */ lw $a0, 0x20($sp) -/* B73F48 800FCDA8 00002825 */ move $a1, $zero -/* B73F4C 800FCDAC 24060001 */ li $a2, 1 -/* B73F50 800FCDB0 0C000CA0 */ jal osRecvMesg -/* B73F54 800FCDB4 AFA70024 */ sw $a3, 0x24($sp) -/* B73F58 800FCDB8 0C040CA3 */ jal osContGetQuery -/* B73F5C 800FCDBC 02002025 */ move $a0, $s0 -/* B73F60 800FCDC0 8FA70024 */ lw $a3, 0x24($sp) -/* B73F64 800FCDC4 02001025 */ move $v0, $s0 -/* B73F68 800FCDC8 24030005 */ li $v1, 5 -/* B73F6C 800FCDCC A0E00000 */ sb $zero, ($a3) -/* B73F70 800FCDD0 92180003 */ lbu $t8, 3($s0) -/* B73F74 800FCDD4 17000008 */ bnez $t8, .L800FCDF8 -/* B73F78 800FCDD8 00000000 */ nop -/* B73F7C 800FCDDC 96190000 */ lhu $t9, ($s0) -/* B73F80 800FCDE0 24030005 */ li $v1, 5 -/* B73F84 800FCDE4 34090001 */ ori $t1, $zero, 1 -/* B73F88 800FCDE8 54790004 */ bnel $v1, $t9, .L800FCDFC -/* B73F8C 800FCDEC 904A0007 */ lbu $t2, 7($v0) -/* B73F90 800FCDF0 10000001 */ b .L800FCDF8 -/* B73F94 800FCDF4 A0E90000 */ sb $t1, ($a3) -.L800FCDF8: -/* B73F98 800FCDF8 904A0007 */ lbu $t2, 7($v0) -.L800FCDFC: -/* B73F9C 800FCDFC 55400008 */ bnezl $t2, .L800FCE20 -/* B73FA0 800FCE00 904E000B */ lbu $t6, 0xb($v0) -/* B73FA4 800FCE04 944B0004 */ lhu $t3, 4($v0) -/* B73FA8 800FCE08 546B0005 */ bnel $v1, $t3, .L800FCE20 -/* B73FAC 800FCE0C 904E000B */ lbu $t6, 0xb($v0) -/* B73FB0 800FCE10 90EC0000 */ lbu $t4, ($a3) -/* B73FB4 800FCE14 358D0002 */ ori $t5, $t4, 2 -/* B73FB8 800FCE18 A0ED0000 */ sb $t5, ($a3) -/* B73FBC 800FCE1C 904E000B */ lbu $t6, 0xb($v0) -.L800FCE20: -/* B73FC0 800FCE20 55C00008 */ bnezl $t6, .L800FCE44 -/* B73FC4 800FCE24 9048000F */ lbu $t0, 0xf($v0) -/* B73FC8 800FCE28 944F0008 */ lhu $t7, 8($v0) -/* B73FCC 800FCE2C 546F0005 */ bnel $v1, $t7, .L800FCE44 -/* B73FD0 800FCE30 9048000F */ lbu $t0, 0xf($v0) -/* B73FD4 800FCE34 90F80000 */ lbu $t8, ($a3) -/* B73FD8 800FCE38 37190004 */ ori $t9, $t8, 4 -/* B73FDC 800FCE3C A0F90000 */ sb $t9, ($a3) -/* B73FE0 800FCE40 9048000F */ lbu $t0, 0xf($v0) -.L800FCE44: -/* B73FE4 800FCE44 55000008 */ bnezl $t0, .L800FCE68 -/* B73FE8 800FCE48 00001025 */ move $v0, $zero -/* B73FEC 800FCE4C 9449000C */ lhu $t1, 0xc($v0) -/* B73FF0 800FCE50 54690005 */ bnel $v1, $t1, .L800FCE68 -/* B73FF4 800FCE54 00001025 */ move $v0, $zero -/* B73FF8 800FCE58 90EA0000 */ lbu $t2, ($a3) -/* B73FFC 800FCE5C 354B0008 */ ori $t3, $t2, 8 -/* B74000 800FCE60 A0EB0000 */ sb $t3, ($a3) -/* B74004 800FCE64 00001025 */ move $v0, $zero -.L800FCE68: -/* B74008 800FCE68 8FBF001C */ lw $ra, 0x1c($sp) -.L800FCE6C: -/* B7400C 800FCE6C 8FB00018 */ lw $s0, 0x18($sp) -/* B74010 800FCE70 27BD0020 */ addiu $sp, $sp, 0x20 -/* B74014 800FCE74 03E00008 */ jr $ra -/* B74018 800FCE78 00000000 */ nop diff --git a/asm/jpegdecoder.s b/asm/jpegdecoder.s deleted file mode 100644 index 88604ee3d8..0000000000 --- a/asm/jpegdecoder.s +++ /dev/null @@ -1,433 +0,0 @@ -.include "macro.inc" - -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 # allow use of 64-bit general purpose registers - -.section .text - -.balign 16 - -glabel func_800FFA50 -/* B76BF0 800FFA50 27BDFF98 */ addiu $sp, $sp, -0x68 -/* B76BF4 800FFA54 AFBF003C */ sw $ra, 0x3c($sp) -/* B76BF8 800FFA58 AFBE0038 */ sw $fp, 0x38($sp) -/* B76BFC 800FFA5C AFB70034 */ sw $s7, 0x34($sp) -/* B76C00 800FFA60 AFB60030 */ sw $s6, 0x30($sp) -/* B76C04 800FFA64 AFB5002C */ sw $s5, 0x2c($sp) -/* B76C08 800FFA68 AFB40028 */ sw $s4, 0x28($sp) -/* B76C0C 800FFA6C AFB30024 */ sw $s3, 0x24($sp) -/* B76C10 800FFA70 AFB20020 */ sw $s2, 0x20($sp) -/* B76C14 800FFA74 AFB1001C */ sw $s1, 0x1c($sp) -/* B76C18 800FFA78 AFB00018 */ sw $s0, 0x18($sp) -/* B76C1C 800FFA7C AFA70074 */ sw $a3, 0x74($sp) -/* B76C20 800FFA80 AFA00058 */ sw $zero, 0x58($sp) -/* B76C24 800FFA84 8C8F0000 */ lw $t7, ($a0) -/* B76C28 800FFA88 3C018017 */ lui $at, %hi(D_80175660) # $at, 0x8017 -/* B76C2C 800FFA8C 30EE00FF */ andi $t6, $a3, 0xff -/* B76C30 800FFA90 AC2F5660 */ sw $t7, %lo(D_80175660)($at) -/* B76C34 800FFA94 90980004 */ lbu $t8, 4($a0) -/* B76C38 800FFA98 01C03825 */ move $a3, $t6 -/* B76C3C 800FFA9C 00A08825 */ move $s1, $a1 -/* B76C40 800FFAA0 17000003 */ bnez $t8, .L800FFAB0 -/* B76C44 800FFAA4 00C0B025 */ move $s6, $a2 -/* B76C48 800FFAA8 10000007 */ b .L800FFAC8 -/* B76C4C 800FFAAC 24020002 */ li $v0, 2 -.L800FFAB0: -/* B76C50 800FFAB0 90990005 */ lbu $t9, 5($a0) -/* B76C54 800FFAB4 24010001 */ li $at, 1 -/* B76C58 800FFAB8 24020004 */ li $v0, 4 -/* B76C5C 800FFABC 17210002 */ bne $t9, $at, .L800FFAC8 -/* B76C60 800FFAC0 24080080 */ li $t0, 128 -/* B76C64 800FFAC4 AFA80058 */ sw $t0, 0x58($sp) -.L800FFAC8: -/* B76C68 800FFAC8 8C940008 */ lw $s4, 8($a0) -/* B76C6C 800FFACC 8C95000C */ lw $s5, 0xc($a0) -/* B76C70 800FFAD0 8C970010 */ lw $s7, 0x10($a0) -/* B76C74 800FFAD4 14E0000E */ bnez $a3, .L800FFB10 -/* B76C78 800FFAD8 8C9E0014 */ lw $fp, 0x14($a0) -/* B76C7C 800FFADC 3C018017 */ lui $at, %hi(D_80175664) # $at, 0x8017 -/* B76C80 800FFAE0 AC205664 */ sw $zero, %lo(D_80175664)($at) -/* B76C84 800FFAE4 3C018017 */ lui $at, %hi(D_80175668) # $at, 0x8017 -/* B76C88 800FFAE8 24090020 */ li $t1, 32 -/* B76C8C 800FFAEC A0295668 */ sb $t1, %lo(D_80175668)($at) -/* B76C90 800FFAF0 3C018017 */ lui $at, %hi(D_8017566C) # $at, 0x8017 -/* B76C94 800FFAF4 AC20566C */ sw $zero, %lo(D_8017566C)($at) -/* B76C98 800FFAF8 3C018017 */ lui $at, %hi(D_80175669) # $at, 0x8017 -/* B76C9C 800FFAFC A0205669 */ sb $zero, %lo(D_80175669)($at) -/* B76CA0 800FFB00 A7A00064 */ sh $zero, 0x64($sp) -/* B76CA4 800FFB04 A7A00062 */ sh $zero, 0x62($sp) -/* B76CA8 800FFB08 10000014 */ b .L800FFB5C -/* B76CAC 800FFB0C A7A00060 */ sh $zero, 0x60($sp) -.L800FFB10: -/* B76CB0 800FFB10 8FAA0078 */ lw $t2, 0x78($sp) -/* B76CB4 800FFB14 3C018017 */ lui $at, %hi(D_80175664) # $at, 0x8017 -/* B76CB8 800FFB18 8D4B0000 */ lw $t3, ($t2) -/* B76CBC 800FFB1C AC2B5664 */ sw $t3, %lo(D_80175664)($at) -/* B76CC0 800FFB20 914C0004 */ lbu $t4, 4($t2) -/* B76CC4 800FFB24 3C018017 */ lui $at, %hi(D_80175668) # $at, 0x8017 -/* B76CC8 800FFB28 A02C5668 */ sb $t4, %lo(D_80175668)($at) -/* B76CCC 800FFB2C 8D4D0008 */ lw $t5, 8($t2) -/* B76CD0 800FFB30 3C018017 */ lui $at, %hi(D_8017566C) # $at, 0x8017 -/* B76CD4 800FFB34 AC2D566C */ sw $t5, %lo(D_8017566C)($at) -/* B76CD8 800FFB38 914E0005 */ lbu $t6, 5($t2) -/* B76CDC 800FFB3C 3C018017 */ lui $at, %hi(D_80175669) # $at, 0x8017 -/* B76CE0 800FFB40 A02E5669 */ sb $t6, %lo(D_80175669)($at) -/* B76CE4 800FFB44 854F000C */ lh $t7, 0xc($t2) -/* B76CE8 800FFB48 A7AF0064 */ sh $t7, 0x64($sp) -/* B76CEC 800FFB4C 8558000E */ lh $t8, 0xe($t2) -/* B76CF0 800FFB50 A7B80062 */ sh $t8, 0x62($sp) -/* B76CF4 800FFB54 85590010 */ lh $t9, 0x10($t2) -/* B76CF8 800FFB58 A7B90060 */ sh $t9, 0x60($sp) -.L800FFB5C: -/* B76CFC 800FFB5C 12C00026 */ beqz $s6, .L800FFBF8 -/* B76D00 800FFB60 00409025 */ move $s2, $v0 -/* B76D04 800FFB64 27B30064 */ addiu $s3, $sp, 0x64 -.L800FFB68: -/* B76D08 800FFB68 1240000C */ beqz $s2, .L800FFB9C -/* B76D0C 800FFB6C 00008025 */ move $s0, $zero -.L800FFB70: -/* B76D10 800FFB70 02802025 */ move $a0, $s4 -/* B76D14 800FFB74 02A02825 */ move $a1, $s5 -/* B76D18 800FFB78 02203025 */ move $a2, $s1 -/* B76D1C 800FFB7C 0C03FF1E */ jal func_800FFC78 -/* B76D20 800FFB80 02603825 */ move $a3, $s3 -/* B76D24 800FFB84 10400003 */ beqz $v0, .L800FFB94 -/* B76D28 800FFB88 26100001 */ addiu $s0, $s0, 1 -/* B76D2C 800FFB8C 1000002E */ b .L800FFC48 -/* B76D30 800FFB90 24020002 */ li $v0, 2 -.L800FFB94: -/* B76D34 800FFB94 1612FFF6 */ bne $s0, $s2, .L800FFB70 -/* B76D38 800FFB98 26310080 */ addiu $s1, $s1, 0x80 -.L800FFB9C: -/* B76D3C 800FFB9C 02E02025 */ move $a0, $s7 -/* B76D40 800FFBA0 03C02825 */ move $a1, $fp -/* B76D44 800FFBA4 02203025 */ move $a2, $s1 -/* B76D48 800FFBA8 0C03FF1E */ jal func_800FFC78 -/* B76D4C 800FFBAC 27A70062 */ addiu $a3, $sp, 0x62 -/* B76D50 800FFBB0 10400003 */ beqz $v0, .L800FFBC0 -/* B76D54 800FFBB4 26310080 */ addiu $s1, $s1, 0x80 -/* B76D58 800FFBB8 10000023 */ b .L800FFC48 -/* B76D5C 800FFBBC 24020002 */ li $v0, 2 -.L800FFBC0: -/* B76D60 800FFBC0 02E02025 */ move $a0, $s7 -/* B76D64 800FFBC4 03C02825 */ move $a1, $fp -/* B76D68 800FFBC8 02203025 */ move $a2, $s1 -/* B76D6C 800FFBCC 0C03FF1E */ jal func_800FFC78 -/* B76D70 800FFBD0 27A70060 */ addiu $a3, $sp, 0x60 -/* B76D74 800FFBD4 10400003 */ beqz $v0, .L800FFBE4 -/* B76D78 800FFBD8 8FA80058 */ lw $t0, 0x58($sp) -/* B76D7C 800FFBDC 1000001A */ b .L800FFC48 -/* B76D80 800FFBE0 24020002 */ li $v0, 2 -.L800FFBE4: -/* B76D84 800FFBE4 26D6FFFF */ addiu $s6, $s6, -1 -/* B76D88 800FFBE8 26310080 */ addiu $s1, $s1, 0x80 -/* B76D8C 800FFBEC 00084840 */ sll $t1, $t0, 1 -/* B76D90 800FFBF0 16C0FFDD */ bnez $s6, .L800FFB68 -/* B76D94 800FFBF4 02298821 */ addu $s1, $s1, $t1 -.L800FFBF8: -/* B76D98 800FFBF8 3C0B8017 */ lui $t3, %hi(D_80175664) # $t3, 0x8017 -/* B76D9C 800FFBFC 8FA30078 */ lw $v1, 0x78($sp) -/* B76DA0 800FFC00 8D6B5664 */ lw $t3, %lo(D_80175664)($t3) -/* B76DA4 800FFC04 3C0C8017 */ lui $t4, %hi(D_80175668) # $t4, 0x8017 -/* B76DA8 800FFC08 3C0D8017 */ lui $t5, %hi(D_8017566C) # $t5, 0x8017 -/* B76DAC 800FFC0C AC6B0000 */ sw $t3, ($v1) -/* B76DB0 800FFC10 918C5668 */ lbu $t4, %lo(D_80175668)($t4) -/* B76DB4 800FFC14 3C0E8017 */ lui $t6, %hi(D_80175669) # $t6, 0x8017 -/* B76DB8 800FFC18 00001025 */ move $v0, $zero -/* B76DBC 800FFC1C A06C0004 */ sb $t4, 4($v1) -/* B76DC0 800FFC20 8DAD566C */ lw $t5, %lo(D_8017566C)($t5) -/* B76DC4 800FFC24 AC6D0008 */ sw $t5, 8($v1) -/* B76DC8 800FFC28 91CE5669 */ lbu $t6, %lo(D_80175669)($t6) -/* B76DCC 800FFC2C A06E0005 */ sb $t6, 5($v1) -/* B76DD0 800FFC30 87AF0064 */ lh $t7, 0x64($sp) -/* B76DD4 800FFC34 A46F000C */ sh $t7, 0xc($v1) -/* B76DD8 800FFC38 87B80062 */ lh $t8, 0x62($sp) -/* B76DDC 800FFC3C A478000E */ sh $t8, 0xe($v1) -/* B76DE0 800FFC40 87AA0060 */ lh $t2, 0x60($sp) -/* B76DE4 800FFC44 A46A0010 */ sh $t2, 0x10($v1) -.L800FFC48: -/* B76DE8 800FFC48 8FBF003C */ lw $ra, 0x3c($sp) -/* B76DEC 800FFC4C 8FB00018 */ lw $s0, 0x18($sp) -/* B76DF0 800FFC50 8FB1001C */ lw $s1, 0x1c($sp) -/* B76DF4 800FFC54 8FB20020 */ lw $s2, 0x20($sp) -/* B76DF8 800FFC58 8FB30024 */ lw $s3, 0x24($sp) -/* B76DFC 800FFC5C 8FB40028 */ lw $s4, 0x28($sp) -/* B76E00 800FFC60 8FB5002C */ lw $s5, 0x2c($sp) -/* B76E04 800FFC64 8FB60030 */ lw $s6, 0x30($sp) -/* B76E08 800FFC68 8FB70034 */ lw $s7, 0x34($sp) -/* B76E0C 800FFC6C 8FBE0038 */ lw $fp, 0x38($sp) -/* B76E10 800FFC70 03E00008 */ jr $ra -/* B76E14 800FFC74 27BD0068 */ addiu $sp, $sp, 0x68 - -glabel func_800FFC78 -/* B76E18 800FFC78 27BDFFC8 */ addiu $sp, $sp, -0x38 -/* B76E1C 800FFC7C AFB50028 */ sw $s5, 0x28($sp) -/* B76E20 800FFC80 AFB40024 */ sw $s4, 0x24($sp) -/* B76E24 800FFC84 AFB30020 */ sw $s3, 0x20($sp) -/* B76E28 800FFC88 AFB10018 */ sw $s1, 0x18($sp) -/* B76E2C 800FFC8C 00C08825 */ move $s1, $a2 -/* B76E30 800FFC90 00A09825 */ move $s3, $a1 -/* B76E34 800FFC94 27B40034 */ addiu $s4, $sp, 0x34 -/* B76E38 800FFC98 27B50036 */ addiu $s5, $sp, 0x36 -/* B76E3C 800FFC9C AFBF002C */ sw $ra, 0x2c($sp) -/* B76E40 800FFCA0 AFB2001C */ sw $s2, 0x1c($sp) -/* B76E44 800FFCA4 00E09025 */ move $s2, $a3 -/* B76E48 800FFCA8 AFB00014 */ sw $s0, 0x14($sp) -/* B76E4C 800FFCAC 02A03025 */ move $a2, $s5 -/* B76E50 800FFCB0 0C03FF85 */ jal func_800FFE14 -/* B76E54 800FFCB4 02802825 */ move $a1, $s4 -/* B76E58 800FFCB8 10400003 */ beqz $v0, .L800FFCC8 -/* B76E5C 800FFCBC 87AF0034 */ lh $t7, 0x34($sp) -/* B76E60 800FFCC0 1000004B */ b .L800FFDF0 -/* B76E64 800FFCC4 24020001 */ li $v0, 1 -.L800FFCC8: -/* B76E68 800FFCC8 864E0000 */ lh $t6, ($s2) -/* B76E6C 800FFCCC 24100001 */ li $s0, 1 -/* B76E70 800FFCD0 2A010040 */ slti $at, $s0, 0x40 -/* B76E74 800FFCD4 01CFC021 */ addu $t8, $t6, $t7 -/* B76E78 800FFCD8 A6580000 */ sh $t8, ($s2) -/* B76E7C 800FFCDC 86590000 */ lh $t9, ($s2) -/* B76E80 800FFCE0 2412000F */ li $s2, 15 -/* B76E84 800FFCE4 10200041 */ beqz $at, .L800FFDEC -/* B76E88 800FFCE8 A6390000 */ sh $t9, ($s1) -/* B76E8C 800FFCEC 02602025 */ move $a0, $s3 -.L800FFCF0: -/* B76E90 800FFCF0 02802825 */ move $a1, $s4 -/* B76E94 800FFCF4 0C03FF85 */ jal func_800FFE14 -/* B76E98 800FFCF8 02A03025 */ move $a2, $s5 -/* B76E9C 800FFCFC 10400003 */ beqz $v0, .L800FFD0C -/* B76EA0 800FFD00 87A80034 */ lh $t0, 0x34($sp) -/* B76EA4 800FFD04 1000003A */ b .L800FFDF0 -/* B76EA8 800FFD08 24020001 */ li $v0, 1 -.L800FFD0C: -/* B76EAC 800FFD0C 1500001E */ bnez $t0, .L800FFD88 -/* B76EB0 800FFD10 83A30036 */ lb $v1, 0x36($sp) -/* B76EB4 800FFD14 83A30036 */ lb $v1, 0x36($sp) -/* B76EB8 800FFD18 1472000F */ bne $v1, $s2, .L800FFD58 -/* B76EBC 800FFD1C 246AFFFF */ addiu $t2, $v1, -1 -/* B76EC0 800FFD20 0460002F */ bltz $v1, .L800FFDE0 -/* B76EC4 800FFD24 A3AA0036 */ sb $t2, 0x36($sp) -.L800FFD28: -/* B76EC8 800FFD28 00105840 */ sll $t3, $s0, 1 -/* B76ECC 800FFD2C 022B6021 */ addu $t4, $s1, $t3 -/* B76ED0 800FFD30 A5800000 */ sh $zero, ($t4) -/* B76ED4 800FFD34 83AF0036 */ lb $t7, 0x36($sp) -/* B76ED8 800FFD38 26100001 */ addiu $s0, $s0, 1 -/* B76EDC 800FFD3C 00106E00 */ sll $t5, $s0, 0x18 -/* B76EE0 800FFD40 25F8FFFF */ addiu $t8, $t7, -1 -/* B76EE4 800FFD44 A3B80036 */ sb $t8, 0x36($sp) -/* B76EE8 800FFD48 05E1FFF7 */ bgez $t7, .L800FFD28 -/* B76EEC 800FFD4C 000D8603 */ sra $s0, $t5, 0x18 -/* B76EF0 800FFD50 10000024 */ b .L800FFDE4 -/* B76EF4 800FFD54 2A010040 */ slti $at, $s0, 0x40 -.L800FFD58: -/* B76EF8 800FFD58 2A010040 */ slti $at, $s0, 0x40 -/* B76EFC 800FFD5C 10200023 */ beqz $at, .L800FFDEC -.L800FFD60: -/* B76F00 800FFD60 0010C840 */ sll $t9, $s0, 1 -/* B76F04 800FFD64 26100001 */ addiu $s0, $s0, 1 -/* B76F08 800FFD68 00104E00 */ sll $t1, $s0, 0x18 -/* B76F0C 800FFD6C 00098603 */ sra $s0, $t1, 0x18 -/* B76F10 800FFD70 2A010040 */ slti $at, $s0, 0x40 -/* B76F14 800FFD74 02394021 */ addu $t0, $s1, $t9 -/* B76F18 800FFD78 1420FFF9 */ bnez $at, .L800FFD60 -/* B76F1C 800FFD7C A5000000 */ sh $zero, ($t0) -/* B76F20 800FFD80 1000001B */ b .L800FFDF0 -/* B76F24 800FFD84 00001025 */ move $v0, $zero -.L800FFD88: -/* B76F28 800FFD88 0003102A */ slt $v0, $zero, $v1 -/* B76F2C 800FFD8C 246CFFFF */ addiu $t4, $v1, -1 -/* B76F30 800FFD90 1040000C */ beqz $v0, .L800FFDC4 -/* B76F34 800FFD94 A3AC0036 */ sb $t4, 0x36($sp) -.L800FFD98: -/* B76F38 800FFD98 00106840 */ sll $t5, $s0, 1 -/* B76F3C 800FFD9C 022D7021 */ addu $t6, $s1, $t5 -/* B76F40 800FFDA0 A5C00000 */ sh $zero, ($t6) -/* B76F44 800FFDA4 83B90036 */ lb $t9, 0x36($sp) -/* B76F48 800FFDA8 26100001 */ addiu $s0, $s0, 1 -/* B76F4C 800FFDAC 00107E00 */ sll $t7, $s0, 0x18 -/* B76F50 800FFDB0 0019102A */ slt $v0, $zero, $t9 -/* B76F54 800FFDB4 2728FFFF */ addiu $t0, $t9, -1 -/* B76F58 800FFDB8 A3A80036 */ sb $t0, 0x36($sp) -/* B76F5C 800FFDBC 1440FFF6 */ bnez $v0, .L800FFD98 -/* B76F60 800FFDC0 000F8603 */ sra $s0, $t7, 0x18 -.L800FFDC4: -/* B76F64 800FFDC4 87A90034 */ lh $t1, 0x34($sp) -/* B76F68 800FFDC8 00105040 */ sll $t2, $s0, 1 -/* B76F6C 800FFDCC 26100001 */ addiu $s0, $s0, 1 -/* B76F70 800FFDD0 00106600 */ sll $t4, $s0, 0x18 -/* B76F74 800FFDD4 022A5821 */ addu $t3, $s1, $t2 -/* B76F78 800FFDD8 000C8603 */ sra $s0, $t4, 0x18 -/* B76F7C 800FFDDC A5690000 */ sh $t1, ($t3) -.L800FFDE0: -/* B76F80 800FFDE0 2A010040 */ slti $at, $s0, 0x40 -.L800FFDE4: -/* B76F84 800FFDE4 5420FFC2 */ bnezl $at, .L800FFCF0 -/* B76F88 800FFDE8 02602025 */ move $a0, $s3 -.L800FFDEC: -/* B76F8C 800FFDEC 00001025 */ move $v0, $zero -.L800FFDF0: -/* B76F90 800FFDF0 8FBF002C */ lw $ra, 0x2c($sp) -/* B76F94 800FFDF4 8FB00014 */ lw $s0, 0x14($sp) -/* B76F98 800FFDF8 8FB10018 */ lw $s1, 0x18($sp) -/* B76F9C 800FFDFC 8FB2001C */ lw $s2, 0x1c($sp) -/* B76FA0 800FFE00 8FB30020 */ lw $s3, 0x20($sp) -/* B76FA4 800FFE04 8FB40024 */ lw $s4, 0x24($sp) -/* B76FA8 800FFE08 8FB50028 */ lw $s5, 0x28($sp) -/* B76FAC 800FFE0C 03E00008 */ jr $ra -/* B76FB0 800FFE10 27BD0038 */ addiu $sp, $sp, 0x38 - -glabel func_800FFE14 -/* B76FB4 800FFE14 27BDFFD8 */ addiu $sp, $sp, -0x28 -/* B76FB8 800FFE18 AFB00018 */ sw $s0, 0x18($sp) -/* B76FBC 800FFE1C 00808025 */ move $s0, $a0 -/* B76FC0 800FFE20 AFBF001C */ sw $ra, 0x1c($sp) -/* B76FC4 800FFE24 AFA5002C */ sw $a1, 0x2c($sp) -/* B76FC8 800FFE28 AFA60030 */ sw $a2, 0x30($sp) -/* B76FCC 800FFE2C 24040010 */ li $a0, 16 -/* B76FD0 800FFE30 0C03FFD4 */ jal func_800FFF50 -/* B76FD4 800FFE34 A7A00024 */ sh $zero, 0x24($sp) -/* B76FD8 800FFE38 97A90024 */ lhu $t1, 0x24($sp) -/* B76FDC 800FFE3C 8FAA002C */ lw $t2, 0x2c($sp) -/* B76FE0 800FFE40 00003025 */ move $a2, $zero -/* B76FE4 800FFE44 2408000F */ li $t0, 15 -/* B76FE8 800FFE48 3407FFFF */ li $a3, 65535 -.L800FFE4C: -/* B76FEC 800FFE4C 00067040 */ sll $t6, $a2, 1 -/* B76FF0 800FFE50 020E7821 */ addu $t7, $s0, $t6 -/* B76FF4 800FFE54 95E40030 */ lhu $a0, 0x30($t7) -/* B76FF8 800FFE58 0106C023 */ subu $t8, $t0, $a2 -/* B76FFC 800FFE5C 03021807 */ srav $v1, $v0, $t8 -/* B77000 800FFE60 10E40005 */ beq $a3, $a0, .L800FFE78 -/* B77004 800FFE64 00C02825 */ move $a1, $a2 -/* B77008 800FFE68 3079FFFF */ andi $t9, $v1, 0xffff -/* B7700C 800FFE6C 0099082A */ slt $at, $a0, $t9 -/* B77010 800FFE70 10200006 */ beqz $at, .L800FFE8C -/* B77014 800FFE74 3069FFFF */ andi $t1, $v1, 0xffff -.L800FFE78: -/* B77018 800FFE78 24C60001 */ addiu $a2, $a2, 1 -/* B7701C 800FFE7C 30C500FF */ andi $a1, $a2, 0xff -/* B77020 800FFE80 28A10010 */ slti $at, $a1, 0x10 -/* B77024 800FFE84 1420FFF1 */ bnez $at, .L800FFE4C -/* B77028 800FFE88 00A03025 */ move $a2, $a1 -.L800FFE8C: -/* B7702C 800FFE8C 28A10010 */ slti $at, $a1, 0x10 -/* B77030 800FFE90 14200003 */ bnez $at, .L800FFEA0 -/* B77034 800FFE94 3C028017 */ lui $v0, %hi(D_80175668) # $v0, 0x8017 -/* B77038 800FFE98 10000028 */ b .L800FFF3C -/* B7703C 800FFE9C 24020001 */ li $v0, 1 -.L800FFEA0: -/* B77040 800FFEA0 02066021 */ addu $t4, $s0, $a2 -/* B77044 800FFEA4 00067840 */ sll $t7, $a2, 1 -/* B77048 800FFEA8 918D0000 */ lbu $t5, ($t4) -/* B7704C 800FFEAC 020FC021 */ addu $t8, $s0, $t7 -/* B77050 800FFEB0 97190010 */ lhu $t9, 0x10($t8) -/* B77054 800FFEB4 8E0C0050 */ lw $t4, 0x50($s0) -/* B77058 800FFEB8 01A97021 */ addu $t6, $t5, $t1 -/* B7705C 800FFEBC 01D95823 */ subu $t3, $t6, $t9 -/* B77060 800FFEC0 016C6821 */ addu $t5, $t3, $t4 -/* B77064 800FFEC4 91A40000 */ lbu $a0, ($t5) -/* B77068 800FFEC8 8FB80030 */ lw $t8, 0x30($sp) -/* B7706C 800FFECC 24425668 */ addiu $v0, %lo(D_80175668) # addiu $v0, $v0, 0x5668 -/* B77070 800FFED0 00047903 */ sra $t7, $a0, 4 -/* B77074 800FFED4 A30F0000 */ sb $t7, ($t8) -/* B77078 800FFED8 90590000 */ lbu $t9, ($v0) -/* B7707C 800FFEDC 308E000F */ andi $t6, $a0, 0xf -/* B77080 800FFEE0 01C02025 */ move $a0, $t6 -/* B77084 800FFEE4 03255821 */ addu $t3, $t9, $a1 -/* B77088 800FFEE8 256CFFF1 */ addiu $t4, $t3, -0xf -/* B7708C 800FFEEC A04C0000 */ sb $t4, ($v0) -/* B77090 800FFEF0 11C00011 */ beqz $t6, .L800FFF38 -/* B77094 800FFEF4 A5400000 */ sh $zero, ($t2) -/* B77098 800FFEF8 0C03FFD4 */ jal func_800FFF50 -/* B7709C 800FFEFC A3AE0026 */ sb $t6, 0x26($sp) -/* B770A0 800FFF00 8FAA002C */ lw $t2, 0x2c($sp) -/* B770A4 800FFF04 93A40026 */ lbu $a0, 0x26($sp) -/* B770A8 800FFF08 240F0001 */ li $t7, 1 -/* B770AC 800FFF0C A5420000 */ sh $v0, ($t2) -/* B770B0 800FFF10 85450000 */ lh $a1, ($t2) -/* B770B4 800FFF14 248D001F */ addiu $t5, $a0, 0x1f -/* B770B8 800FFF18 01AFC004 */ sllv $t8, $t7, $t5 -/* B770BC 800FFF1C 00B8082A */ slt $at, $a1, $t8 -/* B770C0 800FFF20 10200005 */ beqz $at, .L800FFF38 -/* B770C4 800FFF24 240EFFFF */ li $t6, -1 -/* B770C8 800FFF28 008EC804 */ sllv $t9, $t6, $a0 -/* B770CC 800FFF2C 00B95821 */ addu $t3, $a1, $t9 -/* B770D0 800FFF30 256C0001 */ addiu $t4, $t3, 1 -/* B770D4 800FFF34 A54C0000 */ sh $t4, ($t2) -.L800FFF38: -/* B770D8 800FFF38 00001025 */ move $v0, $zero -.L800FFF3C: -/* B770DC 800FFF3C 8FBF001C */ lw $ra, 0x1c($sp) -/* B770E0 800FFF40 8FB00018 */ lw $s0, 0x18($sp) -/* B770E4 800FFF44 27BD0028 */ addiu $sp, $sp, 0x28 -/* B770E8 800FFF48 03E00008 */ jr $ra -/* B770EC 800FFF4C 00000000 */ nop - -glabel func_800FFF50 -/* B770F0 800FFF50 3C088017 */ lui $t0, %hi(D_80175668) # $t0, 0x8017 -/* B770F4 800FFF54 25085668 */ addiu $t0, %lo(D_80175668) # addiu $t0, $t0, 0x5668 -/* B770F8 800FFF58 91050000 */ lbu $a1, ($t0) -/* B770FC 800FFF5C AFA40000 */ sw $a0, ($sp) -/* B77100 800FFF60 308700FF */ andi $a3, $a0, 0xff -/* B77104 800FFF64 000510C3 */ sra $v0, $a1, 3 -/* B77108 800FFF68 304E00FF */ andi $t6, $v0, 0xff -/* B7710C 800FFF6C 19C00029 */ blez $t6, .L80100014 -/* B77110 800FFF70 01C01025 */ move $v0, $t6 -/* B77114 800FFF74 3C068017 */ lui $a2, %hi(D_80175660) # $a2, 0x8017 -/* B77118 800FFF78 3C0D8017 */ lui $t5, %hi(D_8017566C) # $t5, 0x8017 -/* B7711C 800FFF7C 3C0A8017 */ lui $t2, %hi(D_80175669) # $t2, 0x8017 -/* B77120 800FFF80 3C098017 */ lui $t1, %hi(D_80175664) # $t1, 0x8017 -/* B77124 800FFF84 25295664 */ addiu $t1, %lo(D_80175664) # addiu $t1, $t1, 0x5664 -/* B77128 800FFF88 254A5669 */ addiu $t2, %lo(D_80175669) # addiu $t2, $t2, 0x5669 -/* B7712C 800FFF8C 25AD566C */ addiu $t5, %lo(D_8017566C) # addiu $t5, $t5, 0x566c -/* B77130 800FFF90 8CC65660 */ lw $a2, %lo(D_80175660)($a2) -/* B77134 800FFF94 240C0001 */ li $t4, 1 -/* B77138 800FFF98 240B00FF */ li $t3, 255 -.L800FFF9C: -/* B7713C 800FFF9C 8D240000 */ lw $a0, ($t1) -/* B77140 800FFFA0 91590000 */ lbu $t9, ($t2) -/* B77144 800FFFA4 91050000 */ lbu $a1, ($t0) -/* B77148 800FFFA8 00867821 */ addu $t7, $a0, $a2 -/* B7714C 800FFFAC 91E30000 */ lbu $v1, ($t7) -/* B77150 800FFFB0 24980001 */ addiu $t8, $a0, 1 -/* B77154 800FFFB4 13200006 */ beqz $t9, .L800FFFD0 -/* B77158 800FFFB8 AD380000 */ sw $t8, ($t1) -/* B7715C 800FFFBC 14600004 */ bnez $v1, .L800FFFD0 -/* B77160 800FFFC0 03067021 */ addu $t6, $t8, $a2 -/* B77164 800FFFC4 91C30000 */ lbu $v1, ($t6) -/* B77168 800FFFC8 270F0001 */ addiu $t7, $t8, 1 -/* B7716C 800FFFCC AD2F0000 */ sw $t7, ($t1) -.L800FFFD0: -/* B77170 800FFFD0 15630003 */ bne $t3, $v1, .L800FFFE0 -/* B77174 800FFFD4 00602025 */ move $a0, $v1 -/* B77178 800FFFD8 10000002 */ b .L800FFFE4 -/* B7717C 800FFFDC A14C0000 */ sb $t4, ($t2) -.L800FFFE0: -/* B77180 800FFFE0 A1400000 */ sb $zero, ($t2) -.L800FFFE4: -/* B77184 800FFFE4 8DB80000 */ lw $t8, ($t5) -/* B77188 800FFFE8 2442FFFF */ addiu $v0, $v0, -1 -/* B7718C 800FFFEC 0018CA00 */ sll $t9, $t8, 8 -/* B77190 800FFFF0 ADB90000 */ sw $t9, ($t5) -/* B77194 800FFFF4 03247825 */ or $t7, $t9, $a0 -/* B77198 800FFFF8 305900FF */ andi $t9, $v0, 0xff -/* B7719C 800FFFFC 24B8FFF8 */ addiu $t8, $a1, -8 -/* B771A0 80100000 03201025 */ move $v0, $t9 -/* B771A4 80100004 ADAF0000 */ sw $t7, ($t5) -/* B771A8 80100008 1F20FFE4 */ bgtz $t9, .L800FFF9C -/* B771AC 8010000C A1180000 */ sb $t8, ($t0) -/* B771B0 80100010 330500FF */ andi $a1, $t8, 0xff -.L80100014: -/* B771B4 80100014 3C0D8017 */ lui $t5, %hi(D_8017566C) # $t5, 0x8017 -/* B771B8 80100018 25AD566C */ addiu $t5, %lo(D_8017566C) # addiu $t5, $t5, 0x566c -/* B771BC 8010001C 8DAE0000 */ lw $t6, ($t5) -/* B771C0 80100020 00077823 */ negu $t7, $a3 -/* B771C4 80100024 00A7C021 */ addu $t8, $a1, $a3 -/* B771C8 80100028 00AE1804 */ sllv $v1, $t6, $a1 -/* B771CC 8010002C 01E31806 */ srlv $v1, $v1, $t7 -/* B771D0 80100030 A1180000 */ sb $t8, ($t0) -/* B771D4 80100034 03E00008 */ jr $ra -/* B771D8 80100038 3062FFFF */ andi $v0, $v1, 0xffff diff --git a/asm/non_matchings/code/jpegdecoder/JpegDecoder_ParseNextSymbol.s b/asm/non_matchings/code/jpegdecoder/JpegDecoder_ParseNextSymbol.s new file mode 100644 index 0000000000..ea221d6213 --- /dev/null +++ b/asm/non_matchings/code/jpegdecoder/JpegDecoder_ParseNextSymbol.s @@ -0,0 +1,87 @@ + +glabel JpegDecoder_ParseNextSymbol +/* B76FB4 800FFE14 27BDFFD8 */ addiu $sp, $sp, -0x28 +/* B76FB8 800FFE18 AFB00018 */ sw $s0, 0x18($sp) +/* B76FBC 800FFE1C 00808025 */ move $s0, $a0 +/* B76FC0 800FFE20 AFBF001C */ sw $ra, 0x1c($sp) +/* B76FC4 800FFE24 AFA5002C */ sw $a1, 0x2c($sp) +/* B76FC8 800FFE28 AFA60030 */ sw $a2, 0x30($sp) +/* B76FCC 800FFE2C 24040010 */ li $a0, 16 +/* B76FD0 800FFE30 0C03FFD4 */ jal JpegDecoder_ReadBits +/* B76FD4 800FFE34 A7A00024 */ sh $zero, 0x24($sp) +/* B76FD8 800FFE38 97A90024 */ lhu $t1, 0x24($sp) +/* B76FDC 800FFE3C 8FAA002C */ lw $t2, 0x2c($sp) +/* B76FE0 800FFE40 00003025 */ move $a2, $zero +/* B76FE4 800FFE44 2408000F */ li $t0, 15 +/* B76FE8 800FFE48 3407FFFF */ li $a3, 65535 +.L800FFE4C: +/* B76FEC 800FFE4C 00067040 */ sll $t6, $a2, 1 +/* B76FF0 800FFE50 020E7821 */ addu $t7, $s0, $t6 +/* B76FF4 800FFE54 95E40030 */ lhu $a0, 0x30($t7) +/* B76FF8 800FFE58 0106C023 */ subu $t8, $t0, $a2 +/* B76FFC 800FFE5C 03021807 */ srav $v1, $v0, $t8 +/* B77000 800FFE60 10E40005 */ beq $a3, $a0, .L800FFE78 +/* B77004 800FFE64 00C02825 */ move $a1, $a2 +/* B77008 800FFE68 3079FFFF */ andi $t9, $v1, 0xffff +/* B7700C 800FFE6C 0099082A */ slt $at, $a0, $t9 +/* B77010 800FFE70 10200006 */ beqz $at, .L800FFE8C +/* B77014 800FFE74 3069FFFF */ andi $t1, $v1, 0xffff +.L800FFE78: +/* B77018 800FFE78 24C60001 */ addiu $a2, $a2, 1 +/* B7701C 800FFE7C 30C500FF */ andi $a1, $a2, 0xff +/* B77020 800FFE80 28A10010 */ slti $at, $a1, 0x10 +/* B77024 800FFE84 1420FFF1 */ bnez $at, .L800FFE4C +/* B77028 800FFE88 00A03025 */ move $a2, $a1 +.L800FFE8C: +/* B7702C 800FFE8C 28A10010 */ slti $at, $a1, 0x10 +/* B77030 800FFE90 14200003 */ bnez $at, .L800FFEA0 +/* B77034 800FFE94 3C028017 */ lui $v0, %hi(sJpegBitStreamBitIdx) # $v0, 0x8017 +/* B77038 800FFE98 10000028 */ b .L800FFF3C +/* B7703C 800FFE9C 24020001 */ li $v0, 1 +.L800FFEA0: +/* B77040 800FFEA0 02066021 */ addu $t4, $s0, $a2 +/* B77044 800FFEA4 00067840 */ sll $t7, $a2, 1 +/* B77048 800FFEA8 918D0000 */ lbu $t5, ($t4) +/* B7704C 800FFEAC 020FC021 */ addu $t8, $s0, $t7 +/* B77050 800FFEB0 97190010 */ lhu $t9, 0x10($t8) +/* B77054 800FFEB4 8E0C0050 */ lw $t4, 0x50($s0) +/* B77058 800FFEB8 01A97021 */ addu $t6, $t5, $t1 +/* B7705C 800FFEBC 01D95823 */ subu $t3, $t6, $t9 +/* B77060 800FFEC0 016C6821 */ addu $t5, $t3, $t4 +/* B77064 800FFEC4 91A40000 */ lbu $a0, ($t5) +/* B77068 800FFEC8 8FB80030 */ lw $t8, 0x30($sp) +/* B7706C 800FFECC 24425668 */ addiu $v0, %lo(sJpegBitStreamBitIdx) # addiu $v0, $v0, 0x5668 +/* B77070 800FFED0 00047903 */ sra $t7, $a0, 4 +/* B77074 800FFED4 A30F0000 */ sb $t7, ($t8) +/* B77078 800FFED8 90590000 */ lbu $t9, ($v0) +/* B7707C 800FFEDC 308E000F */ andi $t6, $a0, 0xf +/* B77080 800FFEE0 01C02025 */ move $a0, $t6 +/* B77084 800FFEE4 03255821 */ addu $t3, $t9, $a1 +/* B77088 800FFEE8 256CFFF1 */ addiu $t4, $t3, -0xf +/* B7708C 800FFEEC A04C0000 */ sb $t4, ($v0) +/* B77090 800FFEF0 11C00011 */ beqz $t6, .L800FFF38 +/* B77094 800FFEF4 A5400000 */ sh $zero, ($t2) +/* B77098 800FFEF8 0C03FFD4 */ jal JpegDecoder_ReadBits +/* B7709C 800FFEFC A3AE0026 */ sb $t6, 0x26($sp) +/* B770A0 800FFF00 8FAA002C */ lw $t2, 0x2c($sp) +/* B770A4 800FFF04 93A40026 */ lbu $a0, 0x26($sp) +/* B770A8 800FFF08 240F0001 */ li $t7, 1 +/* B770AC 800FFF0C A5420000 */ sh $v0, ($t2) +/* B770B0 800FFF10 85450000 */ lh $a1, ($t2) +/* B770B4 800FFF14 248D001F */ addiu $t5, $a0, 0x1f +/* B770B8 800FFF18 01AFC004 */ sllv $t8, $t7, $t5 +/* B770BC 800FFF1C 00B8082A */ slt $at, $a1, $t8 +/* B770C0 800FFF20 10200005 */ beqz $at, .L800FFF38 +/* B770C4 800FFF24 240EFFFF */ li $t6, -1 +/* B770C8 800FFF28 008EC804 */ sllv $t9, $t6, $a0 +/* B770CC 800FFF2C 00B95821 */ addu $t3, $a1, $t9 +/* B770D0 800FFF30 256C0001 */ addiu $t4, $t3, 1 +/* B770D4 800FFF34 A54C0000 */ sh $t4, ($t2) +.L800FFF38: +/* B770D8 800FFF38 00001025 */ move $v0, $zero +.L800FFF3C: +/* B770DC 800FFF3C 8FBF001C */ lw $ra, 0x1c($sp) +/* B770E0 800FFF40 8FB00018 */ lw $s0, 0x18($sp) +/* B770E4 800FFF44 27BD0028 */ addiu $sp, $sp, 0x28 +/* B770E8 800FFF48 03E00008 */ jr $ra +/* B770EC 800FFF4C 00000000 */ nop diff --git a/asm/non_matchings/code/z_jpeg/Jpeg_Decode.s b/asm/non_matchings/code/z_jpeg/Jpeg_Decode.s index 151b881279..0d1d9f41c3 100644 --- a/asm/non_matchings/code/z_jpeg/Jpeg_Decode.s +++ b/asm/non_matchings/code/z_jpeg/Jpeg_Decode.s @@ -387,7 +387,7 @@ glabel Jpeg_Decode /* AE5A80 8006E8E0 AFAC0010 */ sw $t4, 0x10($sp) /* AE5A84 8006E8E4 30E700FF */ andi $a3, $a3, 0xff /* AE5A88 8006E8E8 27A4009C */ addiu $a0, $sp, 0x9c -/* AE5A8C 8006E8EC 0C03FE94 */ jal func_800FFA50 +/* AE5A8C 8006E8EC 0C03FE94 */ jal JpegDecoder_Decode /* AE5A90 8006E8F0 24060004 */ li $a2, 4 /* AE5A94 8006E8F4 1040000B */ beqz $v0, .L8006E924 /* AE5A98 8006E8F8 3C048014 */ lui $a0, %hi(D_8013C07C) # $a0, 0x8014 diff --git a/data/code_800C3C20.data.s b/data/code_800C3C20.data.s deleted file mode 100644 index a4457386ab..0000000000 --- a/data/code_800C3C20.data.s +++ /dev/null @@ -1,16 +0,0 @@ -.include "macro.inc" - -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 # allow use of 64-bit general purpose registers - -.section .data - -.balign 16 - -glabel D_8012D200 - .incbin "baserom.z64", 0xBA43A0, 0x7 - -glabel D_8012D207 - .incbin "baserom.z64", 0xBA43A7, 0x9 diff --git a/data/jpegdecoder.bss.s b/data/jpegdecoder.bss.s deleted file mode 100644 index 9380ed1638..0000000000 --- a/data/jpegdecoder.bss.s +++ /dev/null @@ -1,25 +0,0 @@ -.include "macro.inc" - -# assembler directives -.set noat # allow manual use of $at -.set noreorder # don't insert nops after branches -.set gp=64 # allow use of 64-bit general purpose registers - -.section .bss - -.balign 16 - -glabel D_80175660 - .space 0x4 - -glabel D_80175664 - .space 0x4 - -glabel D_80175668 - .space 0x1 - -glabel D_80175669 - .space 0x3 - -glabel D_8017566C - .space 0x4 diff --git a/include/functions.h b/include/functions.h index 1944206f84..c9e244376f 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1566,7 +1566,7 @@ u32 THA_IsCrash(TwoHeadArena* tha); void THA_Init(TwoHeadArena* tha); void THA_Ct(TwoHeadArena* tha, void* ptr, u32 size); void THA_Dt(TwoHeadArena* tha); -// ? func_800C3C20(?); +void func_800C3C20(void); void func_800C3C80(AudioMgr* audioMgr); void AudioMgr_HandleRetrace(AudioMgr* audioMgr); void AudioMgr_HandlePRENMI(AudioMgr* audioMgr); @@ -2306,7 +2306,7 @@ s8 PadUtils_GetRelYImpl(Input* input); s8 PadUtils_GetRelX(Input* input); s8 PadUtils_GetRelY(Input* input); void PadUtils_UpdateRelXY(Input* input); -// ? func_800FCD40(?); +s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status); f32 Math_tanf(f32 x); f32 Math_nearbyintf(f32 x); f32 Math_atanf_taylor_q(f32 x); @@ -2391,17 +2391,17 @@ void Sleep_Usec(u32 usec); void Sleep_Msec(u32 ms); void Sleep_Sec(u32 sec); void JpegUtils_ProcessQuantizationTable(u8* dqt, JpegQuantizationTable* qt, u8 count); -s32 JpegUtils_ParseHuffmancodesLengths(u8* ptr, u8* codesLengths); +s32 JpegUtils_ParseHuffmanCodesLengths(u8* ptr, u8* codesLengths); s32 JpegUtils_GetHuffmanCodes(u8* codesLengths, u16* codes); s32 JpegUtils_SetHuffmanTable(u8* data, JpegHuffmanTable* ht, u16* codes); u32 JpegUtils_ProcessHuffmanTableImpl(u8* data, JpegHuffmanTable* ht, u8* codesLengths, u16* codes, u8 isAc); u32 JpegUtils_ProcessHuffmanTable(u8* dht, JpegHuffmanTable* ht, u8* codesLengths, u16* codes, u8 count); void JpegUtils_SetHuffmanTableOld(u8* data, JpegHuffmanTableOld* ht, u8* codesLengths, u16* codes, s16 count, u8 isAc); u32 JpegUtils_ProcessHuffmanTableImplOld(u8* dht, JpegHuffmanTableOld* ht, u8* codesLengths, u16* codes); -u32 func_800FFA50(JpegDecoder* decoder, u16*, u32, u8, u32*); -// ? func_800FFC78(?); -// ? func_800FFE14(?); -// ? func_800FFF50(?); +s32 JpegDecoder_Decode(JpegDecoder* decoder, u16* mcuBuff, s32 count, u8 isFollowing, JpegDecoderState* state); +s32 JpegDecoder_ProcessMcu(JpegHuffmanTable* hTable0, JpegHuffmanTable* hTable1, s16* mcu, s16* unk); +s32 JpegDecoder_ParseNextSymbol(JpegHuffmanTable* hTable, s16* outCoeff, u8* outZeroCount); +u16 JpegDecoder_ReadBits(u8 len); s32 osPfsFreeBlocks(OSPfs* pfs, s32 *bytes_not_used); void guScale(Mtx* m, f32 x, f32 y, f32 z); f32 sinf(f32); diff --git a/include/variables.h b/include/variables.h index e50f4a445b..8d22b1f3f8 100644 --- a/include/variables.h +++ b/include/variables.h @@ -3723,11 +3723,6 @@ extern NotePool gNoteFreeLists; //extern ? D_801755D0; extern u32 __osMalloc_FreeBlockTest_Enable; //extern ? D_80175640; -//extern ? D_80175660; -//extern ? D_80175664; -//extern ? D_80175668; -//extern ? D_80175669; -//extern ? D_8017566C; //extern ? D_80175670; //extern ? D_80175680; //extern ? D_80175688; diff --git a/include/z64.h b/include/z64.h index 18e21ea78b..82273cc4f4 100644 --- a/include/z64.h +++ b/include/z64.h @@ -1841,17 +1841,21 @@ typedef struct { } JpegHuffmanTableOld; // size = 0x300 typedef struct { - /* 0x00 */ u32 unk_00; - /* 0x04 */ u32 unk_04; - /* 0x08 */ u32 unk_08; - /* 0x0C */ u32 qTablePtrs[3]; + /* 0x00 */ u32 address; + /* 0x04 */ u32 mbCount; + /* 0x08 */ u32 mode; + /* 0x0C */ u32 qTableYPtr; + /* 0x10 */ u32 qTableUPtr; + /* 0x14 */ u32 qTableVPtr; /* 0x18 */ char unk_18[0x8]; } JpegTaskData; // size = 0x20 typedef struct { /* 0x000 */ JpegTaskData taskData; /* 0x020 */ char yieldData[0x200]; - /* 0x220 */ JpegQuantizationTable qTables[3]; + /* 0x220 */ JpegQuantizationTable qTableY; + /* 0x2A0 */ JpegQuantizationTable qTableU; + /* 0x320 */ JpegQuantizationTable qTableV; /* 0x3A0 */ u8 codesLengths[0x110]; /* 0x4B0 */ u16 codes[0x108]; /* 0x6C0 */ u16 unk_6C0[4][0x180]; @@ -1859,7 +1863,7 @@ typedef struct { typedef struct { /* 0x00 */ void* imageData; - /* 0x04 */ u8 unk_04; + /* 0x04 */ u8 mode; /* 0x05 */ u8 unk_05; /* 0x08 */ JpegHuffmanTable* hTablePtrs[4]; /* 0x18 */ u8 unk_18; @@ -1871,7 +1875,7 @@ typedef struct { /* 0x10 */ u8 dhtCount; /* 0x14 */ u8* dhtPtr[4]; /* 0x24 */ void* imageData; - /* 0x28 */ u32 unk_28; // 0 if Y V0 is 0 and 2 if Y V0 is 2 + /* 0x28 */ u32 mode; // 0 if Y V0 is 1 and 2 if Y V0 is 2 /* 0x2C */ char unk_2C[4]; /* 0x30 */ OSScTask scTask; /* 0x88 */ char unk_88[0x10]; @@ -1880,6 +1884,15 @@ typedef struct { /* 0xB4 */ JpegWork* workBuf; } JpegContext; // size = 0xB8 +typedef struct { + /* 0x00 */ u32 byteIdx; + /* 0x04 */ u8 bitIdx; + /* 0x05 */ u8 dontSkip; + /* 0x08 */ u32 curWord; + /* 0x0C */ s16 unk_0C; + /* 0x0E */ s16 unk_0E; + /* 0x10 */ s16 unk_10; +} JpegDecoderState; // size = 0x14 // Vis... typedef struct { diff --git a/spec b/spec index 9e2583c5ef..4a16955990 100644 --- a/spec +++ b/spec @@ -384,8 +384,7 @@ beginseg include "build/asm/PreRender.o" include "build/data/PreRender.rodata.o" include "build/src/code/TwoHeadArena.o" - include "build/asm/code_800C3C20.o" - include "build/data/code_800C3C20.data.o" + include "build/src/code/code_800C3C20.o" include "build/src/code/audioMgr.o" include "build/src/code/title_setup.o" include "build/src/code/game.o" @@ -447,7 +446,7 @@ beginseg include "build/src/code/relocation.o" include "build/src/code/code_800FC620.o" include "build/src/code/padutils.o" - include "build/asm/code_800FCD40.o" + include "build/src/code/padsetup.o" include "build/src/code/code_800FCE80.o" include "build/asm/fp.o" include "build/src/code/system_malloc.o" @@ -456,8 +455,7 @@ beginseg include "build/src/code/printutils.o" include "build/src/code/sleep.o" include "build/src/code/jpegutils.o" - include "build/asm/jpegdecoder.o" - include "build/data/jpegdecoder.bss.o" + include "build/src/code/jpegdecoder.o" include "build/asm/code_80100040.o" include "build/asm/guScale.o" include "build/src/libultra_code/sinf.o" diff --git a/src/code/code_800C3C20.c b/src/code/code_800C3C20.c new file mode 100644 index 0000000000..52d02ca681 --- /dev/null +++ b/src/code/code_800C3C20.c @@ -0,0 +1,13 @@ +#include + +u8 D_8012D200[] = { + 0, 1, 2, 3, 4, 5, 6, +}; + +void func_800C3C20(void) { + s32 i; + + for (i = 0; i < ARRAY_COUNT(D_8012D200) & 0xFFFFFFFFu; i++) { + func_800F87A0(D_8012D200[i]); + } +} diff --git a/src/code/jpegdecoder.c b/src/code/jpegdecoder.c new file mode 100644 index 0000000000..1f73a46263 --- /dev/null +++ b/src/code/jpegdecoder.c @@ -0,0 +1,201 @@ +#include + +u8* sJpegBitStreamPtr; +u32 sJpegBitStreamByteIdx; +u8 sJpegBitStreamBitIdx; +u8 sJpegBitStreamDontSkip; +u32 sJpegBitStreamCurWord; + +s32 JpegDecoder_Decode(JpegDecoder* decoder, u16* mcuBuff, s32 count, u8 isFollowing, JpegDecoderState* state) { + s16 pad; + s16 unk0; + s16 unk1; + s16 unk2; + u32 idx; + s32 inc; + s16 unkCount; + + JpegHuffmanTable* hTable0; + JpegHuffmanTable* hTable1; + JpegHuffmanTable* hTable2; + JpegHuffmanTable* hTable3; + + inc = 0; + sJpegBitStreamPtr = decoder->imageData; + if (decoder->mode == 0) { + unkCount = 2; + } else { + unkCount = 4; + if (decoder->unk_05 == 1) { + inc = 8 * 8 * 2; + } + } + + hTable0 = decoder->hTablePtrs[0]; + hTable1 = decoder->hTablePtrs[1]; + hTable2 = decoder->hTablePtrs[2]; + hTable3 = decoder->hTablePtrs[3]; + + if (!isFollowing) { + sJpegBitStreamByteIdx = 0; + sJpegBitStreamBitIdx = 32; + sJpegBitStreamCurWord = 0; + sJpegBitStreamDontSkip = 0; + unk0 = 0; + unk1 = 0; + unk2 = 0; + } else { + sJpegBitStreamByteIdx = state->byteIdx; + sJpegBitStreamBitIdx = state->bitIdx; + sJpegBitStreamCurWord = state->curWord; + sJpegBitStreamDontSkip = state->dontSkip; + unk0 = state->unk_0C; + unk1 = state->unk_0E; + unk2 = state->unk_10; + } + + while (count != 0) { + for (idx = 0; idx < unkCount; idx++) { + if (JpegDecoder_ProcessMcu(hTable0, hTable1, mcuBuff, &unk0)) { + return 2; + } + mcuBuff += 8 * 8; + } + + if (JpegDecoder_ProcessMcu(hTable2, hTable3, mcuBuff, &unk1)) { + return 2; + } + mcuBuff += 8 * 8; + + if (JpegDecoder_ProcessMcu(hTable2, hTable3, mcuBuff, &unk2)) { + return 2; + } + + count--; + mcuBuff += 8 * 8; + mcuBuff += inc; + } + + state->byteIdx = sJpegBitStreamByteIdx; + state->bitIdx = sJpegBitStreamBitIdx; + state->curWord = sJpegBitStreamCurWord; + state->dontSkip = sJpegBitStreamDontSkip; + state->unk_0C = unk0; + state->unk_0E = unk1; + state->unk_10 = unk2; + return 0; +} + +s32 JpegDecoder_ProcessMcu(JpegHuffmanTable* hTable0, JpegHuffmanTable* hTable1, s16* mcu, s16* unk) { + s8 i = 0; + s8 zeroCount; + s16 coeff; + + if (JpegDecoder_ParseNextSymbol(hTable0, &coeff, &zeroCount)) { + return 1; + } + + *unk += coeff; + mcu[i++] = *unk; + while (i < 8 * 8) { + if (JpegDecoder_ParseNextSymbol(hTable1, &coeff, &zeroCount) != 0) { + return 1; + } + + if (coeff == 0) { + if (zeroCount == 0xF) { + while (zeroCount-- >= 0) { + mcu[i++] = 0; + } + } else { + while (i < 8 * 8) { + mcu[i++] = 0; + } + break; + } + } else { + while (0 < zeroCount--) { + mcu[i++] = 0; + } + mcu[i++] = coeff; + } + } + + return 0; +} + +#ifdef NON_MATCHING +// stack usage (coeffLength is stored as a u32 instead of a u8) +s32 JpegDecoder_ParseNextSymbol(JpegHuffmanTable* hTable, s16* outCoeff, u8* outZeroCount) { + u16 buff; + u8 codeIdx; + u8 sym; + u8 coeffLength; // 0x26 + u16 codeOff; // 0x24 + + codeOff = 0; + buff = JpegDecoder_ReadBits(16); + + for (codeIdx = 0; codeIdx < 16; codeIdx++) { + if (hTable->codesB[codeIdx] == 0xFFFF) { + continue; + } + + codeOff = buff >> (15 - codeIdx); + if (codeOff <= hTable->codesB[codeIdx]) { + break; + } + } + + if (codeIdx >= 16) { + return 1; + } + + sym = hTable->symbols[hTable->codeOffs[codeIdx] + codeOff - hTable->codesA[codeIdx]]; + *outZeroCount = sym >> 4; + coeffLength = sym & 0xF; // not using a temp for "sym & 0xF" puts coeffLength on the stack + + sJpegBitStreamBitIdx += codeIdx - 15; + *outCoeff = 0; + if (coeffLength) { // (cond != 0) instead of (cond) puts coeffLength on the stack + *outCoeff = JpegDecoder_ReadBits(coeffLength); + if (*outCoeff < (1 << (coeffLength - 1))) { + *outCoeff += + (-1 << coeffLength) + 1; // (*outCoeff -= (1 << coeffLength)-1; makes more sense but doesn't match) + } + } + + return 0; +} +#else +#pragma GLOBAL_ASM("asm/non_matchings/code/jpegdecoder/JpegDecoder_ParseNextSymbol.s") +#endif + +u16 JpegDecoder_ReadBits(u8 len) { + u8 byteCount; + u8 data; + s32 ret; + u32 temp; + ret = 0; // this is required for some reason + + for (byteCount = sJpegBitStreamBitIdx >> 3; byteCount > 0; byteCount--) { + data = sJpegBitStreamPtr[sJpegBitStreamByteIdx++]; + if (sJpegBitStreamDontSkip) { + if (data == 0) { + data = sJpegBitStreamPtr[sJpegBitStreamByteIdx++]; + } + } + + sJpegBitStreamDontSkip = (data == 0xFF) ? 1 : 0; + + sJpegBitStreamCurWord <<= 8; + sJpegBitStreamCurWord |= data; + sJpegBitStreamBitIdx -= 8; + } + + ret = (sJpegBitStreamCurWord << (sJpegBitStreamBitIdx)); + temp = ret; + ret = temp >> -len; + sJpegBitStreamBitIdx += len; + return ret; +} diff --git a/src/code/jpegutils.c b/src/code/jpegutils.c index ae23da852b..52b8612dd6 100644 --- a/src/code/jpegutils.c +++ b/src/code/jpegutils.c @@ -12,7 +12,7 @@ void JpegUtils_ProcessQuantizationTable(u8* dqt, JpegQuantizationTable* qt, u8 c } } -s32 JpegUtils_ParseHuffmancodesLengths(u8* ptr, u8* codesLengths) { +s32 JpegUtils_ParseHuffmanCodesLengths(u8* ptr, u8* codesLengths) { u8 off = 1; s16 count = 0; s16 idx = 1; @@ -84,7 +84,7 @@ u32 JpegUtils_ProcessHuffmanTableImpl(u8* data, JpegHuffmanTable* ht, u8* codesL s32 count; s32 temp; - count = JpegUtils_ParseHuffmancodesLengths(data, codesLengths); + count = JpegUtils_ParseHuffmanCodesLengths(data, codesLengths); ret = count; if (count == 0 || (isAc && count > 0x100) || (!isAc && count > 0x10)) { return 0; @@ -139,7 +139,7 @@ u32 JpegUtils_ProcessHuffmanTableImplOld(u8* dht, JpegHuffmanTableOld* ht, u8* c isAc = *dht++ >> 4; - count2 = count = JpegUtils_ParseHuffmancodesLengths(dht, codesLengths); + count2 = count = JpegUtils_ParseHuffmanCodesLengths(dht, codesLengths); if (count == 0 || (isAc && count > 0x100) || (!isAc && count > 0x10)) { return 1; diff --git a/src/code/padmgr.c b/src/code/padmgr.c index 33da52e959..13266ab508 100644 --- a/src/code/padmgr.c +++ b/src/code/padmgr.c @@ -412,7 +412,7 @@ void PadMgr_Init(PadMgr* padmgr, OSMesgQueue* siIntMsgQ, IrqMgr* irqMgr, OSId id PadMgr_UnlockSerialMesgQueue(padmgr, siIntMsgQ); osCreateMesgQueue(&padmgr->lockMsgQ, padmgr->lockMsgBuf, 1); PadMgr_UnlockPadData(padmgr); - func_800FCD40(siIntMsgQ, &padmgr->validCtrlrsMask, padmgr); + PadSetup_Init(siIntMsgQ, &padmgr->validCtrlrsMask, padmgr->padStatus); padmgr->ncontrollers = 4; osContSetCh(padmgr->ncontrollers); diff --git a/src/code/padsetup.c b/src/code/padsetup.c new file mode 100644 index 0000000000..045724a515 --- /dev/null +++ b/src/code/padsetup.c @@ -0,0 +1,33 @@ +#include + +s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status) { + s32 ret; + s32 i; + + *outMask = 0xFF; + ret = osContInit(mq, outMask, status); + if (ret != 0) { + return ret; + } + if (*outMask == 0xFF) { + if (osContStartQuery(mq) != 0) { + return 1; + } + osRecvMesg(mq, NULL, OS_MESG_BLOCK); + osContGetQuery(status); + + *outMask = 0; + for (i = 0; i < 4; i++) { + switch (status[i].errno) { + case 0: + if (status[i].type == CONT_TYPE_NORMAL) { + *outMask |= 1 << i; + } + break; + default: + break; + } + } + } + return 0; +} diff --git a/src/code/z_jpeg.c b/src/code/z_jpeg.c index 609d1412f4..70cf1e70e6 100644 --- a/src/code/z_jpeg.c +++ b/src/code/z_jpeg.c @@ -39,12 +39,12 @@ u32 Jpeg_SendTask(JpegContext* ctx) { JpegWork* workBuf = ctx->workBuf; u32 pad[2]; - workBuf->taskData.unk_00 = PHYSICAL_TO_VIRTUAL(&workBuf->unk_6C0); - workBuf->taskData.unk_08 = ctx->unk_28; - workBuf->taskData.unk_04 = 4; - workBuf->taskData.qTablePtrs[0] = PHYSICAL_TO_VIRTUAL(&workBuf->qTables[0]); - workBuf->taskData.qTablePtrs[1] = PHYSICAL_TO_VIRTUAL(&workBuf->qTables[1]); - workBuf->taskData.qTablePtrs[2] = PHYSICAL_TO_VIRTUAL(&workBuf->qTables[2]); + workBuf->taskData.address = PHYSICAL_TO_VIRTUAL(&workBuf->unk_6C0); + workBuf->taskData.mode = ctx->mode; + workBuf->taskData.mbCount = 4; + workBuf->taskData.qTableYPtr = PHYSICAL_TO_VIRTUAL(&workBuf->qTableY); + workBuf->taskData.qTableUPtr = PHYSICAL_TO_VIRTUAL(&workBuf->qTableU); + workBuf->taskData.qTableVPtr = PHYSICAL_TO_VIRTUAL(&workBuf->qTableV); sJpegTask.flags = 0; sJpegTask.ucode_boot = SysUcode_GetUCodeBoot(); @@ -97,7 +97,7 @@ u16 Jpeg_GetU16(u8* ptr) { if (((u32)ptr & 1) == 0) { // if the address is aligned to 2 return *(u16*)ptr; } else { - return *(u16*)(ptr - 1) << 8 | (*(u16*)(ptr + 1) >> 8); // ?? it's exactly like *(16*)ptr + return *(u16*)(ptr - 1) << 8 | (*(u16*)(ptr + 1) >> 8); // lhu crashes with unaligned addresses } } @@ -174,10 +174,10 @@ void Jpeg_ParseMarkers(u8* ptr, JpegContext* ctx) { if (ptr[9] == 0x21) // component Y : V0 == 1 { - ctx->unk_28 = 0; + ctx->mode = 0; } else if (ptr[9] == 0x22) // component Y : V0 == 2 { - ctx->unk_28 = 2; + ctx->mode = 2; } ptr += Jpeg_GetU16(ptr); break; @@ -215,7 +215,7 @@ s32 Jpeg_Decode(void* data, u16* zbuffer, JpegWork* workBuff, u32 workSize) { JpegContext ctx; // 0x208 JpegHuffmanTable hTables[4]; // 0xB8 JpegDecoder decoder; // 0x9C - u32 unk[5]; // 0x88 + JpegDecoderState state; // 0x88 u16(*src)[0x180]; OSTime diff; // 0x78 OSTime time; // 0x70 @@ -248,19 +248,19 @@ s32 Jpeg_Decode(void* data, u16* zbuffer, JpegWork* workBuff, u32 workSize) { switch (ctx.dqtCount) { case 1: { - JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[0], &workBuff->qTables[0], 3); + JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[0], &workBuff->qTableY, 3); break; } case 2: { - JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[0], &workBuff->qTables[0], 1); - JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[1], &workBuff->qTables[1], 1); - JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[1], &workBuff->qTables[2], 1); + JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[0], &workBuff->qTableY, 1); + JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[1], &workBuff->qTableU, 1); + JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[1], &workBuff->qTableV, 1); break; } case 3: { - JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[0], &workBuff->qTables[0], 1); - JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[1], &workBuff->qTables[1], 1); - JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[2], &workBuff->qTables[2], 1); + JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[0], &workBuff->qTableY, 1); + JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[1], &workBuff->qTableU, 1); + JpegUtils_ProcessQuantizationTable(ctx.dqtPtr[2], &workBuff->qTableV, 1); break; } default: @@ -318,12 +318,12 @@ s32 Jpeg_Decode(void* data, u16* zbuffer, JpegWork* workBuff, u32 workSize) { if (1) {} decoder.unk_18 = 0; decoder.imageData = ctx.imageData; - decoder.unk_04 = ctx.unk_28; + decoder.mode = ctx.mode; y = 0; x = 0; for (i = 0; i < 300; i += 4) { - if (func_800FFA50(&decoder, &workBuff->unk_6C0, 4, i != 0, unk)) { + if (JpegDecoder_Decode(&decoder, &workBuff->unk_6C0, 4, i != 0, &state)) { osSyncPrintf(VT_FGCOL(RED)); osSyncPrintf("Error : Can't decode jpeg\n"); osSyncPrintf(VT_RST);