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

📄 guide_tech2a.txt

📁 nintendo64 survival document
💻 TXT
字号:
2a. Practice - Shiren 2


This time, we talk to a villager. VWF tiles.

Address = 20000000, Offset = 0023ec80
320x8, 4-bit I. $500 bytes.

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

Three lines of dialogue at RAM location. The terms are backwards. >.<

Write RAM, addr = 2023EF18, PC=80082F90
Read RAM, addr = 8023EF18, PC=80082F9C

Write RAM, addr = 2023EE78, PC=80082FC0
Read RAM, addr = 8023EE78, PC=80082FDC

Write RAM, addr = 2023EF1C, PC=80082F84
Read RAM, addr = 8023EF1C, PC=80082F9C

Write RAM, addr = 2023EF23, PC=80082FD0
Read RAM, addr = 8023EF23, PC=80082FDC

VWF code appears below.

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

More interestingly, the font should likely be in ROM uncompressed.

80029c44: PI Copy CART to RDRAM 136b ($88) from B016D2D6 to 80165980
80029c44: PI Copy CART to RDRAM 136b ($88) from B016B08C to 80165980
80029c44: PI Copy CART to RDRAM 136b ($88) from B0157F10 to 80165980
80029c44: PI Copy CART to RDRAM 136b ($88) from B015814A to 80165980

Looks like some header bytes - shows up as pixels.

On really close examination, we see shadow pixels in-game.
So the font uses lots of different colors.

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

; VWF: Importantly, data is 4-bit linear storage (!)
;      So (1234)(1234) equals two pixels. This isn't planar math.

[1aa0:0013] 80083194: BLEZ    s5[0000000E],r0[00000000],800831E4h       
[0000:802d] 80083198: DADDU   s0[00000000],r0[00000000],r0[00000000]    

[0014:1400] 8008319C: SLL     v0[00000070],s4[00000030],0010h           
[0002:a403] 800831A0: SRA     s4[00000030],v0[00300000],0010h           
[0013:1400] 800831A4: SLL     v0[00300000],s3[0000000C],0010h           

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

[0002:1403] 800831A8: SRA     v0[000C0000],v0[000C0000],0010h           
[0440:0006] 800831AC: BLTZ    v0[0000000C],800831C8h                    
[2652:fff8] 800831B0: ADDIU   s2[801659F2],s2[801659F2],FFFFFFF8h       

[0054:102a] 800831B4: SLT     v0[0000000C],v0[0000000C],s4[00000030]    
[1040:0003] 800831B8: BEQ     v0[00000001],r0[00000000],800831C8h       
[0220:202d] 800831BC: DADDU   a0[0000000C],s1[0000E128],r0[00000000]    

[0c02:0bcf] 800831C0: JAL     80082F3C                                  
[0240:282d] 800831C4: DADDU   a1[00000006],s2[801659EA],r0[00000000]    

[2631:fec0] 800831C8: ADDIU   s1[0000E128],s1[0000E128],FFFFFEC0h       
[0620:0005] 800831CC: BLTZ    s1[0000DFE8],800831E4h                    
[2673:ffff] 800831D0: ADDIU   s3[0000000C],s3[0000000C],FFFFFFFFh       

; One pixel row done

[2610:0001] 800831D4: ADDIU   s0[00000000],s0[00000000],0001h           

; Continue looping if rows not done

[0215:102a] 800831D8: SLT     v0[00000000],s0[00000001],s5[0000000E]    

[1440:fff2] 800831DC: BNE     v0[00000001],r0[00000000],800831A8h       
[0013:1400] 800831E0: SLL     v0,s3,0010h                               
    
; =====================================================================
; =====================================================================

; Clear horizontal lcv

[0000:402d] 80082F3C: DADDU   t0[0000FF01],r0[00000000],r0[00000000]    

[0004:1fc2] 80082F40: SRL     v1[0000E128],a0[0000E128],001Fh           
[3c02:8014] 80082F44: LUI     v0[00000001],FFFF8014h                    
[8c42:e8e4] 80082F48: LW      v0[80140000],FFFFE8E4h(v0[80140000])      
[0083:1821] 80082F4C: ADDU    v1[00000000],a0[0000E128],v1[00000000]    
[0002:1080] 80082F50: SLL     v0[00000000],v0[00000000],0002h           
[3c01:801b] 80082F54: LUI     at[80000000],FFFF801Bh                    
[0022:0821] 80082F58: ADDU    at[801B0000],at[801B0000],v0[00000000]    

[8c22:9050] 80082F5C: LW      v0[00000000],FFFF9050h(at[801B0000])      
[0003:1843] 80082F60: SRA     v1[0000E128],v1[0000E128],0001h           

; Src tile address (VWF cache)

[0043:3021] 80082F64: ADDU    a2[0000000E],v0[80236A80],v1[00007094]    

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

; Load next pair of pixels <-- a1

[90a2:0000] 80082F68: LBU     v0[80236A80],0000h(a1[801659EA])          

; Retrieve pixel #1 --> v1 (upper 4)
; Retrieve pixel #2 --> a3 (lower 4) [see delay slot]

[0002:1902] 80082F6C: SRL     v1[00007094],v0[00000000],0004h           

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

; If blank pixel #1, skip VWF code

[1060:000b] 80082F70: BEQ     v1[00000000],r0[00000000],80082FA0h       
[3047:000f] 80082F74: ANDI    a3[00000000],v0[00000000],000Fh           

; a0 is even --> store to first 4-bits of VWF 'tile' (byte)
; a0 is odd  --> store to last  4-bits of VWF 'tile' (byte)

[3082:0001] 80082F78: ANDI    v0[000000F0],a0[0000E12A],0001h           
[5040:0004] 80082F7C: BEQL    v0[00000000],r0[00000000],80082F90h       
[0003:1900] 80082F80: SLL     v1[0000000F],v1[0000000F],0004h           

; Load upper 4-bits of VWF cache

[90c2:0000] 80082F84: LBU     v0[00000001],0000h(a2[8023DB1A])          
[0802:0be6] 80082F88: J       80082F98                                  
[3042:00f0] 80082F8C: ANDI    v0[00000000],v0[00000000],00F0h           

; Load lower 4-bits of VWF cache

[90c2:0000] 80082F90: LBU     v0[00000000],0000h(a2[8023DB15])          
[3042:000f] 80082F94: ANDI    v0[00000000],v0[00000000],000Fh           

; Add old pixel and store new

[0043:1025] 80082F98: OR      v0[00000000],v0[00000000],v1[000000F0]    
[a0c2:0000] 80082F9C: SB      v0[000000F0],0000h(a2[8023DB15])          

; Bump VWF cursor position (even/odd alignment)

[2484:0001] 80082FA0: ADDIU   a0[0000E128],a0[0000E128],0001h           

; Bump VWF dst ptr

[3082:0001] 80082FA4: ANDI    v0[00000000],a0[0000E129],0001h           
[5040:0001] 80082FA8: BEQL    v0[00000001],r0[00000000],80082FB0h       
[24c6:0001] 80082FAC: ADDIU   a2[8023DB1A],a2[8023DB1A],0001h           

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

; If blank pixel #2, skip VWF code (and bump VWF cursor)

[50e0:000c] 80082FB0: BEQL    a3[00000000],r0[00000000],80082FE4h       
[2484:0001] 80082FB4: ADDIU   a0[0000E129],a0[0000E129],0001h           

; a0 is even --> store to first 4-bits of VWF 'tile' (byte)
; a0 is odd  --> store to last  4-bits of VWF 'tile' (byte)

[1040:0005] 80082FB8: BEQ     v0[00000001],r0[00000000],80082FD0h       
[0007:1900] 80082FBC: SLL     v1[000000F0],a3[0000000F],0004h           

; Load upper 4-bits of VWF cache

[90c2:0000] 80082FC0: LBU     v0[00000001],0000h(a2[8023DB18])          
[3042:00f0] 80082FC4: ANDI    v0[000000F0],v0[000000F0],00F0h           

; Add old pixel and store new

[0802:0bf7] 80082FC8: J       80082FDC                                  
[00e2:1025] 80082FCC: OR      v0[000000F0],a3[0000000F],v0[000000F0]    


; Load lower 4-bits of VWF cache

[90c2:0000] 80082FD0: LBU     v0[00000000],0000h(a2[8023DB1B])          
[3042:000f] 80082FD4: ANDI    v0[00000000],v0[00000000],000Fh           

; Add old pixel

[0043:1025] 80082FD8: OR      v0[00000000],v0[00000000],v1[00000070]    

; Store new result

[a0c2:0000] 80082FDC: SB      v0[000000FF],0000h(a2[8023DB18])          

; Bump VWF cursor position (even/odd alignment)

[2484:0001] 80082FE0: ADDIU   a0[0000E131],a0[0000E131],0001h           

; Bump VWF dst ptr

[3082:0001] 80082FE4: ANDI    v0[00000001],a0[0000E12A],0001h           
[5040:0001] 80082FE8: BEQL    v0[00000000],r0[00000000],80082FF0h       
[24c6:0001] 80082FEC: ADDIU   a2[8023DB14],a2[8023DB14],0001h           

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

; Two more pixels done --> t0 + 2

[2508:0002] 80082FF0: ADDIU   t0[00000000],t0[00000000],0002h           

; Loop through 16 pixels in row (check t0)
; Bump src ptr --> a1 + 1

[2902:0010] 80082FF4: SLTI    v0[00000000],t0[00000002],0010h           
[1440:ffdb] 80082FF8: BNE     v0[00000001],r0[00000000],80082F68h       
[24a5:0001] 80082FFC: ADDIU   a1[801659EA],a1[801659EA],0001h           

; Exit

[03e0:0008] 80083000: JR      ra[800831C8]                              
[0000:0000] 80083004: NOP                                               

⌨️ 快捷键说明

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