⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 guide_tech2b.txt

📁 nintendo64 survival document
💻 TXT
字号:
2b. Practice - Sin and Punishment


Bitmap for '3D/Z/B'

Width = 128, Height = 32 ($800 bytes)
format = CI, size = 4bit
Address = 20000000, Offset = 0028fb70.

note: Actually our trace found a different one. But nonetheless.

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This example lives @ ROM $A49AD0 (search for '00 00 0e 48' in that order).

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[0c01:1748] 8003A5B4: JAL     80045D20                                  
[0000:0000] 8003A5B8: NOP                                               

; Load length of output data

[8e02:0004] 8003A2E4: LW      v0[00000000],0004h(s0[800E4780])          
[0222:8823] 8003A2E8: SUBU    s1[802A0370],s1[802A0370],v0[00022F00]    

; Src / Dst

[0200:2021] 8003A2EC: ADDU    a0[00000001],s0[800E4780],r0[00000000]    
[0220:2821] 8003A2F0: ADDU    a1[00000000],s1[8027D470],r0[00000000]    

; Run LZ decoder

[0c01:5b74] 8003A2F4: JAL     80056DD0                                  
[0000:0000] 8003A2F8: NOP                                               

; ===========================================================
; ===========================================================

[0270:9821] 8003A5BC: ADDU    s3[00A49AD0],s3[00A49AD0],s0[00001000]    
[0250:9021] 8003A5C0: ADDU    s2[800E4780],s2[800E4780],s0[00001000]    
[0230:8823] 8003A5C4: SUBU    s1[0000B0F0],s1[0000B0F0],s0[00001000]    
[0220:8021] 8003A57C: ADDU    s0[00001000],s1[000000F0],r0[00000000]    
[8fbf:0030] 8003A5D0: LW      ra[8003A5BC],0030h(sp[800676D0])          
[8fb3:002c] 8003A5D4: LW      s3[00A54BC0],002Ch(sp[800676D0])          
[8fb2:0028] 8003A5D8: LW      s2[800EF870],0028h(sp[800676D0])          
[8fb1:0024] 8003A5DC: LW      s1[00000000],0024h(sp[800676D0])          
[8fb0:0020] 8003A5E0: LW      s0[000000F0],0020h(sp[800676D0])          
[27bd:0070] 8003A5E4: ADDIU   sp[800676D0],sp[800676D0],0070h           
[03e0:0008] 8003A5E8: JR      ra[8003A2E4]                              
[0000:0000] 8003A5EC: NOP                                               

; ===========================================================
; ===========================================================

; a0 = src ptr
; a1 = dst ptr
; a2 = barrel lcv
; a3 = LZ ptr
;
; t8 = stop ptr
; t9 = run count

; Cache bytes

[8c98:0004] 80056DD0: LW      t8[00000000],0004h(a0[800E4780])          
[8c87:0008] 80056DD4: LW      a3[000000E7],0008h(a0[800E4780])          
[8c99:000c] 80056DD8: LW      t9[00000000],000Ch(a0[800E4780])          

; a2 <-- 0

[0000:3021] 80056DDC: ADDU    a2[00000001],r0[00000000],r0[00000000]    

; stop address

[0305:c020] 80056DE0: ADD     t8[00022F00],t8[00022F00],a1[8027D470]    

; Offset -> Absolute address

[00e4:3820] 80056DE4: ADD     a3[00000E48],a3[00000E48],a0[800E4780]    
[0324:c820] 80056DE8: ADD     t9[000068A8],t9[000068A8],a0[800E4780]    

; 16 source bytes read --> a0 + 16

[2084:0010] 80056DEC: ADDI    a0[800E4780],a0[800E4780],0010h           

; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

; Check if barrel empty (a2 == 0)

[14c0:0004] 80056DF0: BNE     a2[00000000],r0[00000000],80056E04h       
[0000:0000] 80056DF4: NOP                                               

; Load 32-bit pattern

[8c88:0000] 80056DF8: LW      t0[2000FF01],0000h(a0[800E4790])          

; Set lcv (32 bits), bump src ptr

[2406:0020] 80056DFC: ADDIU   a2[00000000],r0[00000000],0020h           
[2084:0004] 80056E00: ADDI    a0[800E4790],a0[800E4790],0004h           

; -------------------------------------------------------------

; 0 = LZ, 1 = raw

[0100:482a] 80056E04: SLT     t1[2000FF00],t0[FFFFFFFF],r0[00000000]    
[1120:0006] 80056E08: BEQ     t1[00000001],r0[00000000],80056E24h       
[0000:0000] 80056E0C: NOP                                               

; Copy raw byte and update src ptr

[832a:0000] 80056E10: LB      t2[80060000],0000h(t9[800EB028])          
[2339:0001] 80056E14: ADDI    t9[800EB028],t9[800EB028],0001h           
[a0aa:0000] 80056E18: SB      t2[00000000],0000h(a1[8027D470])          

; J 80056E58
; - bump dst ptr

[1000:000e] 80056E1C: BEQ     r0[00000000],r0[00000000],80056E58h       
[20a5:0001] 80056E20: ADDI    a1[8027D470],a1[8027D470],0001h           

; -------------------------------------------------------------

; read LZ mask

[94ea:0000] 80056E24: LHU     t2[00000017],0000h(a3[800E55C8])          

; bump LZ ptr

[20e7:0002] 80056E28: ADDI    a3[800E55C8],a3[800E55C8],0002h           

; grab window ptr

[000a:5b02] 80056E2C: SRL     t3[0000FF00],t2[00003021],000Ch           
[314a:0fff] 80056E30: ANDI    t2[00003021],t2[00003021],0FFFh           

; run == 0 --> extended run
; - setup window ptr

[1160:000d] 80056E34: BEQ     t3[00000003],r0[00000000],80056E6Ch       
[00aa:4822] 80056E38: SUB     t1[00000000],a1[8027D492],t2[00000021]    

; run + 2

[216b:0002] 80056E3C: ADDI    t3[00000003],t3[00000003],0002h           

; -------------------------------------------------------------

; copy LZ byte

[812a:ffff] 80056E40: LB      t2[00000021],FFFFFFFFh(t1[8027D471])      

; bump run count, window ptr

[216b:ffff] 80056E44: ADDI    t3[00000005],t3[00000005],FFFFFFFFh       
[2129:0001] 80056E48: ADDI    t1[8027D471],t1[8027D471],0001h           

; write LZ byte

[a0aa:0000] 80056E4C: SB      t2[00000000],0000h(a1[8027D492])          

; continue copy, bump dst ptr

[1560:fffb] 80056E50: BNE     t3[00000004],r0[00000000],80056E40h       
[20a5:0001] 80056E54: ADDI    a1[8027D492],a1[8027D492],0001h           

; -------------------------------------------------------------

; Check next pattern bit

[0008:4040] 80056E58: SLL     t0[FFFFFFFF],t0[FFFFFFFF],0001h           

; If dst ptr == exit ptr, return
; - bump lcv

[14b8:ffe4] 80056E5C: BNE     a1[8027D471],t8[802A0370],80056DF0h       
[20c6:ffff] 80056E60: ADDI    a2[00000020],a2[00000020],FFFFFFFFh       

; Exit

[03e0:0008] 80056E64: JR      ra[8003A2FC]                              
[0000:0000] 80056E68: NOP                                               

; -------------------------------------------------------------

; load run count, bump run ptr

[932b:0000] 80056E6C: LBU     t3[00000000],0000h(t9[800EB8DC])          
[2339:0001] 80056E70: ADDI    t9[800EB8DC],t9[800EB8DC],0001h           

; run count + 18

[1000:fff2] 80056E74: BEQ     r0[00000000],r0[00000000],80056E40h       
[216b:0012] 80056E78: ADDI    t3[00000000],t3[00000000],0012h           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -