📄 guide_tech2b.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 + -