This commit is contained in:
sShemet
2025-10-04 11:53:04 +05:00
commit 8e506a6912
53 changed files with 11261 additions and 0 deletions

489
ghidra_src/big.asm Normal file
View File

@@ -0,0 +1,489 @@
**************************************************************
* FUNCTION *
**************************************************************
undefined __stdcall drawCharLine_MakeDMAChain(undefined4
assume gp = 0x8007b190
undefined v0:1 <RETURN>
undefined4 a0:4 r4
undefined2 a1:2 r5
undefined2 a2:2 r6 XREF[1]: 8001965c(W)
undefined1 a3:1 r7
undefined1 Stack[0x10]:1 makeShadow? XREF[1]: 8001934c(R)
undefined4 s4:4 r20_LineDMAParam XREF[1]: 80019374(W)
undefined4 s2:4 r18 XREF[1]: 8001956c(W)
undefined4 t1:4 t1 XREF[1]: 800195a8(W)
undefined4 a2:4 DMALinkAddr XREF[1]: 8001965c(W)
undefined4 Stack[-0x4]:4 local_4 XREF[2]: 80019354(W),
80019898(R)
undefined4 Stack[-0x8]:4 local_8 XREF[2]: 80019358(W),
8001989c(R)
undefined4 Stack[-0xc]:4 local_c XREF[2]: 8001935c(W),
800198a0(R)
undefined4 Stack[-0x10]:4 local_10 XREF[2]: 80019304(W),
800198a4(R)
undefined4 Stack[-0x14]:4 local_14 XREF[2]: 80019360(W),
800198a8(R)
undefined4 Stack[-0x18]:4 local_18 XREF[2]: 80019364(W),
800198ac(R)
undefined4 Stack[-0x1c]:4 local_1c XREF[2]: 8001931c(W),
800198b0(R)
undefined4 Stack[-0x20]:4 local_20 XREF[2]: 80019314(W),
800198b4(R)
undefined4 Stack[-0x24]:4 local_24 XREF[2]: 8001930c(W),
800198b8(R)
undefined4 Stack[-0x28]:4 local_28 XREF[2]: 80019330(W),
800198bc(R)
undefined2 Stack[-0x30]:2 textXlocal XREF[2]: 800194f4(W),
80019598(R)
undefined1[16] Stack[-0x40] DMALinksAddr XREF[6,11]: 80019670(W),
80019698(R),
80019764(R),
80019788(R),
800197a4(R),
800197c0(R),
800197a0(R),
800197c4(R),
800197dc(R),
80019410(W),
80019418(R),
80019428(R),
80019414(W),
80019420(W),
800193c8(W),
80019424(R),
800193d8(W)
undefined2 HASH:5f91568 currentReadedChar
drawCharLine_MakeDMAChain XREF[31]: PrintCommandText:8001c398(c),
PrintCommandText:8001c40c(c),
sendTXTLineWithParams:8001c688(c),
PrintSelectionMenu:8001d058(c),
PrintSelectionMenu:8001d0d8(c),
FUN_8001e964:8001e9cc(c),
FUN_8001ebc0:8001ed58(c),
FUN_OVR_EXT__80096f94:800970e8(c),
FUN_OVR_EXT__80096f94:800971dc(c),
FUN_OVR_EXT__80096f94:800973e0(c),
FUN_OVR_EXT__800974bc:800976ec(c),
FUN_OVR_EXT__80099078:800990f8(c),
OVR_EXT::800997d0(c), OVR_EXT::80099870(c),
OVR_EXT::80099948(c), OVR_EXT::80099a28(c),
OVR_EXT::80099a94(c), OVR_EXT::80099af8(c),
OVR_EXT::80099c9c(c), OVR_EXT::80099d30(c),
[more]
80019300 b0 ff bd 27 addiu sp,sp,-0x50
assume gp = <UNKNOWN>
80019304 40 00 b6 af sw s6,local_10(sp) push all regs into stack!
80019308 21 b0 80 00 move s6,r4 save text addr to r22
8001930c 2c 00 b1 af sw s1,local_24(sp)
80019310 21 88 a0 00 move s1,r5 save X to r17
80019314 30 00 b2 af sw s2,local_20(sp)
80019318 21 90 c0 00 move s2,r6 save Y to r18
8001931c 34 00 b3 af sw s3,local_1c(sp)
80019320 80 1f 13 3c lui s3,0x1f80
80019324 d0 03 73 36 ori s3,s3,0x3d0 load Scratchpad temp addr to r19
80019328 ff 00 08 3c lui t0,0xff
8001932c ff ff 08 35 ori t0,t0,0xffff
80019330 28 00 b0 af sw s0,local_28(sp)
80019334 ff 00 f0 30 andi s0,r7,0xff cut a3 (&ff) => s0 - make 2byte
80019338 21 20 00 02 move r4,s0 Save Col Index to r4? (rewrite textaddr??)
8001933c 08 80 07 3c lui r7=>DAT_80080000,0x8008 set r7(cI) to 80080000
80019340 00 ff 06 3c lui r6,0xff00 r6 - load ff000000
80019344 d0 b6 e9 24 addiu t1,r7,-0x4930 r9 = r7-4930 = 8007b6d0
80019348 d0 b6 e3 8c lw v1,-0x4930(r7)=>8007b6d0_freeChain r3 =(r7-4930)
8001934c 60 00 a5 93 lbu r5,makeShadow?(sp) r5 = makeShadow? (sp+60h)
80019350 00 80 02 3c lui v0,0x8000 set r2 to 80000000
80019354 4c 00 bf af sw ra,local_4(sp)
80019358 48 00 be af sw s8,local_8(sp)
8001935c 44 00 b7 af sw s7,local_c(sp)
80019360 3c 00 b5 af sw s5,local_14(sp) push ra,r30,r23,31,r20
80019364 38 00 b4 af sw s4,local_18(sp)
80019368 24 30 66 00 and r6,v1,r6 r3 must begins from FF
8001936c ff 00 a5 30 andi r5,r5,0xff cut makeShadow (and ff)
80019370 24 18 68 00 and v1,v1,t0 r3 and 00ffffff (cut 1 byte)
80019374 25 a0 62 00 or r20_LineDMAParam,v1,v0 r2(800..) or r3 (001adf54)
(from 7b6d0)
to r20 - 801adf54 - FREE DMA ADDR???
80019378 04 00 22 8d lw v0,0x4(t1)=>DAT_8007b6d4_CmdCounter load 7b6d4 to r2 (0706)
8001937c 00 00 83 8e lw v1,0x0(r20_LineDMAParam) load [r20] to r3 (1adf10)
80019380 ff ff 42 24 addiu v0,v0,-0x1 r2=r2-1 (705)
80019384 24 18 68 00 and v1,v1,t0 r3 & r8 (00ffffff) cut f.byte
80019388 25 30 c3 00 or r6,r6,v1 r6 or r3 = ff+r3 = ff1adf10
8001938c 04 00 22 ad sw v0,0x4(t1)=>DAT_8007b6d4_CmdCounter r9+4 = r2
80019390 32 6c 00 0c jal store_Color_to_addr undefined store_Color_to_addr(undefined1 ColIndex, undefine
80019394 d0 b6 e6 ac _sw r6,-0x4930(r7)=>8007b6d0_freeChain store r6(ff1df10) to (r7-4930 = 7b610)
80019398 21 20 80 02 move r4,r20_LineDMAParam lw r4,20 = 801adf54
8001939c 00 2c 11 00 sll r5,s1,0x10 r5 = X<<10h (003A0000)
800193a0 03 2c 05 00 sra r5,r5,0x10 r5=r5>>10h 0000003A
800193a4 00 34 12 00 sll r6,s2,0x10 r6 = Y << 10h
800193a8 03 34 06 00 sra r6,r6,0x10 r6>>10h - 100% clean coords
800193ac 1c 68 00 0c jal initCopycharChain undefined initCopycharChain(undefined4 curDmaChainAddr, und
800193b0 21 38 00 02 _move r7,s0
;;;;init ScratchPad
800193b4 80 1f 07 3c lui r7,0x1f80 load r7 1f800348 - 1st scratch DMA addr
800193b8 48 03 e7 34 ori r7=>DAT_1f800348,r7,0x348 = ??
800193bc 80 1f 06 3c lui r6,0x1f80
800193c0 8c 03 c6 34 ori r6=>DAT_1f80038c,r6,0x38c load r7 1f80038c - 2nd Scrach DMA???
CpuToVRam sizes in temp chain
800193c4 03 00 02 24 li v0,0x3
800193c8 1c 00 a2 a7 sh v0,DMALinksAddr[12](sp) store half (0003) to sp+1c = 00100003
800193cc 06 00 02 24 li v0,0x6 r2 = 0006
800193d0 0d 00 05 24 li r5,0xd r5 = 0d
800193d4 00 a0 04 3c lui r4,0xa000 r4 = a000 0000
800193d8 1e 00 a2 a7 sh v0,DMALinksAddr[14](sp) sp+13 = 00060003
Size of DMA sprite
Init upper char
800193dc 03 00 e5 a0 sb r5,0x3(r7)=>DAT_1f80034b r5(0d) to r7(scr1+3) (byte)
800193e0 04 00 e4 ac sw r4,0x4(r7)=>DAT_1f80034c 'a00000' ->34c - CpuToVram command
800193e4 a0 00 88 97 lhu t0,0xa0(gp)=>VRam_Temp_Char_x Load x(0310) to r8
800193e8 a2 00 82 97 lhu v0,0xa2(gp)=>VRam_Temp_Char_y Load y(01F0)to r2
800193ec 00 01 03 3c lui v1,0x100 ld r3 - 01 00 00 00
800193f0 80 1f 01 3c lui at,0x1f80 ld r1 = 1f800000
800193f4 7c 03 23 ac sw v1,offset DAT_1f80037c(at) ld *r1+37c , r3 (01000000)
load FlushCache cmd to DMATmp
@ the end of DMAChain
36Bytes Free (3x6x2) After
a0000000
013001f0
init lower char
800193f8 03 00 c5 a0 sb r5,0x3(r6)=>DAT_1f80038f load 0d to 2nd (lower char) scratch
800193fc 04 00 c4 ac sw r4,0x4(r6)=>DAT_1f800390 set a0 to 390
80019400 a0 00 85 87 lh r5,0xa0(gp)=>VRam_Temp_Char_x load 0130 to r5
80019404 21 f0 40 02 move s8,s2 r18 to r30 (y)
80019408 80 1f 01 3c lui at,0x1f80 load 1f80 to r1
8001940c c0 03 23 ac sw v1,offset DAT_1f8003c0(at) ld *r1+3c0 , r3 (01000000)
load FlushCache cmd to DMATmp
@ the end of 2nd DMAChain
36Bytes Free (3x6x2) After
a0000000
013001f0
Make coords & codes Up&low and save to scratch
80019410 18 00 a8 a7 sh t0,DMALinksAddr[8](sp) load half 0130 to sp+18
80019414 1a 00 a2 a7 sh v0,DMALinksAddr[10](sp) load half to sp+1a 01f0
80019418 18 00 a4 8f lw r4,DMALinksAddr[8](sp) load 01f00130 to r4 from sp+18
8001941c 06 00 42 24 addiu v0,v0,0x6 r2 += 6 = 01f6 - lower char coords
80019420 1a 00 a2 a7 sh v0,DMALinksAddr[10](sp) save half 01f2 to sp+1a
80019424 1c 00 a2 8f lw v0,DMALinksAddr[12](sp) load 00060003 to r2 from sp+1c
80019428 18 00 a3 8f lw v1,DMALinksAddr[8](sp) load 01f0130 to r3 from sp+18
8001942c 21 40 a0 00 move t0,r5 load 0130(r5) to r8
80019430 0c 00 e2 ac sw v0,0xc(r7)=>DAT_1f800354 load r2 - 0003006 to 1st char (to r7+0c)
80019434 0c 00 c2 ac sw v0,0xc(r6)=>DAT_1f800398 load r2 - 0003006 to 2st char (to r6+0c)
80019438 01 80 02 3c lui v0,0x8001 load 80010000 to r2
8001943c 08 00 e4 ac sw r4,0x8(r7)=>DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA)
80019440 08 00 c3 ac sw v1,0x8(r6)=>DAT_1f800394 load r3 (lower coord 01f0) to r6+8 (DMA)
Make StrangeTable in SCRATCH
80019444 80 1f 18 3c lui t8,0x1f80
80019448 e0 02 18 37 ori t8,t8,0x2e0 load 1f8002e0 to r24?
8001944c e8 03 4f 24 addiu t7,v0,0x3e8 r15 = 800103e8
80019450 03 00 ed 89 lwl t5,0x3(t7)
80019454 00 00 ed 99 lwr t5,0x0(t7)=>DAT_800103e8 = 00010000h
80019458 07 00 ee 89 lwl t6,0x7(t7)
8001945c 04 00 ee 99 lwr t6,0x4(t7)=>DAT_800103ec = 00110010h
80019460 03 00 0d ab swl t5,0x3(t8)
80019464 00 00 0d bb swr t5,0x0(t8)=>DAT_1f8002e0 = ??
80019468 07 00 0e ab swl t6,0x7(t8)
8001946c 04 00 0e bb swr t6,0x4(t8)=>DAT_1f8002e4 = ??
80019470 0b 00 ed 89 lwl t5,0xb(t7)
80019474 08 00 ed 99 lwr t5,0x8(t7)=>DAT_800103f0 = 01010100h
80019478 0f 00 ee 89 lwl t6,0xf(t7)
8001947c 0c 00 ee 99 lwr t6,0xc(t7)=>DAT_800103f4 = 01110110h
80019480 0b 00 0d ab swl t5,0xb(t8)
80019484 08 00 0d bb swr t5,0x8(t8)=>DAT_1f8002e8 = ??
80019488 0f 00 0e ab swl t6,0xf(t8)
8001948c 0c 00 0e bb swr t6,0xc(t8)=>DAT_1f8002ec = ??
80019490 13 00 ed 89 lwl t5,0x13(t7)
80019494 10 00 ed 99 lwr t5,0x10(t7)=>DAT_800103f8 = 10011000h
80019498 17 00 ee 89 lwl t6,0x17(t7)
8001949c 14 00 ee 99 lwr t6,0x14(t7)=>DAT_800103fc = 10111010h
800194a0 13 00 0d ab swl t5,0x13(t8) Making ConvertTo4Bits Table
800194a4 10 00 0d bb swr t5,0x10(t8)=>DAT_1f8002f0 = ??
800194a8 17 00 0e ab swl t6,0x17(t8)
800194ac 14 00 0e bb swr t6,0x14(t8)=>DAT_1f8002f4 = ??
800194b0 1b 00 ed 89 lwl t5,0x1b(t7)
800194b4 18 00 ed 99 lwr t5,0x18(t7)=>DAT_80010400 = 11011100h
800194b8 1f 00 ee 89 lwl t6,0x1f(t7)
800194bc 1c 00 ee 99 lwr t6,0x1c(t7)=>DAT_80010404 = 11111110h
800194c0 1b 00 0d ab swl t5,0x1b(t8)
800194c4 18 00 0d bb swr t5,0x18(t8)=>DAT_1f8002f8 = ??
800194c8 1f 00 0e ab swl t6,0x1f(t8)
800194cc 1c 00 0e bb swr t6,0x1c(t8)=>DAT_1f8002fc = ??
Copy Sprite DMA Command Forming
800194d0 04 00 02 24 li v0,0x4
800194d4 03 00 62 a2 sb v0,0x3(s3)=>DAT_1f8003d3 04 00 00 00 to 3d0 (sb 04 to 3d3)
800194d8 64 00 02 24 li v0,0x64
800194dc 07 00 62 a2 sb v0,0x7(s3)=>DAT_1f8003d7 sb 64 to 3d7 (copySpriteCommand)
800194e0 80 00 02 24 li v0,0x80
800194e4 04 00 62 a2 sb v0,0x4(s3)=>DAT_1f8003d4 make 80 80 80 64 (3d4,5,6,7)
800194e8 05 00 62 a2 sb v0,0x5(s3)=>DAT_1f8003d5 SPRITE COPY DMA COMMAND
800194ec 06 00 62 a2 sb v0,0x6(s3)=>DAT_1f8003d6 = ??
800194f0 02 00 a1 04 bgez r5,LAB_800194fc branch if r5>=0
800194f4 20 00 b1 a7 _sh s1,textXlocal(sp) sp+20 loadhalf X (3A)
800194f8 3f 00 a8 24 addiu t0,r5,0x3f else r8 = r5 + 3f
LAB_800194fc XREF[1]: 800194f0(j)
800194fc 83 11 08 00 sra v0,t0,0x6 r2 = r8 (130) >> 6 = 4
80019500 80 11 02 00 sll v0,v0,0x6 r2 = r2 (4) << 6 = 100
80019504 23 10 a2 00 subu v0,r5,v0 r2 = r5(130) - r2 = 30
80019508 a2 00 83 87 lh v1,0xa2(gp)=>VRam_Temp_Char_y load Y half 01f0 form Y(mem)
8001950c 80 10 02 00 sll v0,v0,0x2 r2 << 2 = c0
80019510 0c 00 62 a2 sb v0,0xc(s3)=>DAT_1f8003dc set src X (c0) sprCpy(3th command)
80019514 02 00 61 04 bgez v1,LAB_80019520 if Y r3>=0 - branch & r2=r3
80019518 21 10 60 00 _move v0,v1
8001951c ff 00 62 24 addiu v0,v1,0xff else r2 = ff - r3
LAB_80019520 XREF[1]: 80019514(j)
80019520 03 12 02 00 sra v0,v0,0x8 r2 (1f0) >>a 8 = 001
80019524 00 12 02 00 sll v0,v0,0x8 r2 (001) <<l 8 = 100 Cleared 1st byte
80019528 23 10 62 00 subu v0,v1,v0 r2 = r3-r2 = F0
8001952c 0d 00 62 a2 sb v0,0xd(s3)=>DAT_1f8003dd set src Y (F0) sprCpy(3th command)
80019530 a8 00 83 97 lhu v1,0xa8(gp)=>DAT_8007b238 load XYhalf(7df3) to r3 from DMAchain
Size of Char To Copy (000Cx000C)
80019534 0c 00 02 24 li v0,0xc
80019538 10 00 62 a6 sh v0,0x10(s3)=>DAT_1f8003e0 r2 = 000c. load halfs to 3e0,3e2
8001953c 12 00 62 a6 sh v0,0x12(s3)=>DAT_1f8003e2 = ??
MAKING TEMP CHAIN IN SCRATCHPAD FOR COPY SPRITE TO SCREEN
80019540 0e 00 63 a6 sh v1,0xe(s3)=>DAT_1f8003de load r3half to 3de XYcoords to DMATemp (7fd3)
START TO READING CHARS HERE
80019544 00 00 c4 96 lhu r4,0x0(s6) LOAD FIRST CHAR (HALF-2bytes) to r4 (c2) from *r22
80019548 00 00 00 00 nop
8001954c 00 10 82 2c sltiu v0,r4,0x1000 r2 = r4 < 1000h
80019550 b1 00 40 10 beq v0,zero,TextEnd branch if not char (r2=0)
80019554 02 00 d6 26 _addiu s6,s6,0x2 add +2 to r22 (read char addr)
80019558 08 80 11 3c lui s1,0x8008 load 80080000 to r17
8001955c d0 b6 35 26 addiu s5,s1,-0x4930 r21 = r17-4930= 7b6d0 (tempDMA)
80019560 ff 00 10 3c lui s0,0xff
80019564 ff ff 10 36 ori s0,s0,0xffff r16 = 00 ff ff ff
80019568 00 80 17 3c lui s7,0x8000 r3 = 8000 000
LAB_8001956c XREF[1]: 80019810(j)
8001956c 32 66 00 0c jal CreateCharCopyToDMAChain load current char, copy to Scratch
80019570 21 90 00 00 _clear r18 r18 = 0
80019574 b0 00 82 8f lw v0,0xb0(gp)=>DAT_8007b240_parms load r2 from r28+0b0 (7b240)(Xoffs)
80019578 04 00 83 96 lhu v1,0x4(r20_LineDMAParam) r3 = half *DMAAddr + 4
8001957c 0c 00 42 24 addiu v0,v0,0xc 0x0c * 12px btw letters!
80019580 18 00 62 00 mult v1,v0 r3*r2 = xOffs*charNum
80019584 00 ff 0a 3c lui t2,0xff00 r10 = ld upper ff00 = ff000000
80019588 21 60 80 02 move t4,r20_LineDMAParam r12 = r20
8001958c 10 00 ab 27 addiu t3,sp,0x10 r11 = sp + 10 = 807ffe50
80019590 21 48 80 02 move t1,r20_LineDMAParam r9 = r20 (paramsAddr)
80019594 0a 00 7e a6 sh s8,0xa(s3)=>DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??)
80019598 20 00 ad 97 lhu t5,textXlocal(sp) r13 = ld half (sp+20) = 003A
8001959c 12 70 00 00 mflo t6 r14 = lo
800195a0 21 10 ae 01 addu v0,t5,t6 r2 = r13 + r14 = 3A
Рассчитываем координаты символа на экране
800195a4 08 00 62 a6 sh v0,0x8(s3)=>DAT_1f8003d8 save r2 half to 1f8003d8 = Y (3A)
MAKING COPYSPRITE CHAIN
ScreenLoop XREF[1]: 800197ec(j)
800195a8 d0 b6 22 8e lw v0,-0x4930(s1)=>8007b6d0_freeChain r2 = *7b6d0
800195ac 00 00 00 00 nop
800195b0 24 20 4a 00 and r4,v0,t2 r4 = a2 & ff000000 - is begins with ff
800195b4 24 10 50 00 and v0,v0,s0 r2 & r16 (00FFFFFF) = cut FF
800195b8 25 28 57 00 or r5,v0,s7 r5 = r2 or r23 (80000000) = 801ADF10
r5 = next free chain
800195bc 04 00 a2 8e lw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter r2 = *7b6d0+4 = 705
800195c0 00 00 a3 8c lw v1,0x0(r5) r3 = *r5 chainAddr?
next sec free chain
800195c4 ff ff 42 24 addiu v0,v0,-0x1 r2 -= 1
800195c8 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF = cut
800195cc 25 20 83 00 or r4,r4,v1 r4 or r3 . r4&ff = ff1adecc
800195d0 04 00 a2 ae sw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter store r2 (704) in *7b6d4
800195d4 d0 b6 24 ae sw r4,-0x4930(s1)=>8007b6d0_freeChain 7b640 = r4
800195d8 00 00 6f 8e lw t7,0x0(s3)=>DAT_1f8003d0 copy CopySpriteCommand
r15 = *r19
800195dc 04 00 78 8e lw t8,0x4(s3)=>DAT_1f8003d4 r24 = *r19+4
800195e0 08 00 6d 8e lw t5,0x8(s3)=>DAT_1f8003d8 r13 = *r19+8
800195e4 0c 00 6e 8e lw t6,0xc(s3)=>DAT_1f8003dc r14 = *r19+0c
800195e8 00 00 af ac sw t7,0x0(r5) *r5 = r15
800195ec 04 00 b8 ac sw t8,0x4(r5) *r5+4 = r24
800195f0 08 00 ad ac sw t5,0x8(r5) *r5+8 = r13
800195f4 0c 00 ae ac sw t6,0xc(r5) *r5+c = r14
800195f8 10 00 6f 8e lw t7,0x10(s3)=>DAT_1f8003e0 r15 = *r19+10h last command
800195fc 00 00 00 00 nop
80019600 10 00 af ac sw t7,0x10(r5) *r5+10 = r15
80019604 18 00 23 8d lw v1,0x18(t1) r3 = *r9+18 (2nd screen???) = 801adf64
80019608 00 00 a2 8c lw v0,0x0(r5) r2 = *r5
8001960c 00 00 63 8c lw v1,0x0(v1) r3 = *r3 = 00FFFF
80019610 24 10 4a 00 and v0,v0,t2 r2 & r10 (ff00...) = 0400.. - Cleaning
80019614 24 18 70 00 and v1,v1,s0 r3 & r16 (00ff..) = cutting
80019618 25 10 43 00 or v0,v0,v1 r2 or r3 = 04FFFFFF
8001961c 00 00 a2 ac sw v0,0x0(r5) *r5 = r2
80019620 18 00 24 8d lw r4,0x18(t1) r4 = *r19+18
80019624 00 00 00 00 nop
80019628 00 00 82 8c lw v0,0x0(r4) r2 = *r4 (00ffffff)
8001962c 24 18 b0 00 and v1,r5,s0 r3 = r5 and r16 (00ff..)
80019630 24 10 4a 00 and v0,v0,t2 r2 & ff0000
80019634 25 10 43 00 or v0,v0,v1 r2 | r3 (001adf10)
80019638 00 00 82 ac sw v0,0x0(r4) *r4 = r2
8001963c 18 00 25 ad sw r5,0x18(t1) *r9+18 = r5
80019640 04 00 82 95 lhu v0,0x4(t4) r2 = half r12 + 4
80019644 00 00 00 00 nop
80019648 02 00 40 14 bne v0,zero,LAB_80019654 if r2<>0 = goto
8001964c 21 40 00 00 _clear t0 clear r8
80019650 28 00 25 ad sw r5,0x28(t1) *r9+28 = r5 (df10)
LAB_80019654 XREF[1]: 80019648(j)
80019654 21 38 00 01 move r7,t0 r7 = r8
80019658 21 30 60 01 move r6,t3 r6 = r11 stack +10(?)
MAKE HALF CHAR CHAIN (r7 is offset in scratch)
UpDownCharLoop XREF[1]: 8001975c(j)
8001965c 80 1f 05 3c lui r5,0x1f80 r5 = 1f80000
80019660 d0 b6 22 8e lw v0,-0x4930(s1)=>8007b6d0_freeChain r2 = *7b6d0
80019664 48 03 a5 34 ori r5=>DAT_1f800348,r5,0x348 r5 or 348 - ld upper char ScrChain
80019668 24 10 50 00 and v0,v0,s0 r2 & 00FFFFFF
8001966c 25 10 57 00 or v0,v0,s7 r2 & 80000000
80019670 00 00 c2 ac sw v0,0x0(DMALinkAddr)=>DMALinksAddr[0] set r2 to r6 (stack) (upper char chain)
80019674 d0 b6 23 8e lw v1,-0x4930(s1)=>8007b6d0_freeChain r3 = *7b6d0
80019678 00 00 42 8c lw v0,0x0(v0) r2 = *r2 LAST NEW CHAIN ADDR
8001967c 04 00 a4 8e lw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter r4 = chain counter
80019680 24 18 6a 00 and v1,v1,t2 r3 & FF000000
80019684 24 10 50 00 and v0,v0,s0 r2 & 00 FF FF FF (cut)
80019688 25 18 62 00 or v1,v1,v0 r3 | r2 (ff-nextfreeaddr)
8001968c ff ff 84 24 addiu r4,r4,-0x1 dec r4 chain counter -1
80019690 d0 b6 23 ae sw v1,-0x4930(s1)=>8007b6d0_freeChain save next addr to *7b6d0
80019694 04 00 a4 ae sw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter save chain counter 7b6d4
80019698 00 00 c4 8c lw r4,0x0(DMALinkAddr)=>DMALinksAddr[0] r4 = second chain addr
8001969c 21 18 e5 00 addu v1,r7,r5 r3 = r7(counter)+r5 = current read ScrDMAAddr
800196a0 25 10 64 00 or v0,v1,r4 r2 = r3(curScrAddr) | r4(DestAddr)
800196a4 03 00 42 30 andi v0,v0,0x3 r2 & 3.. Test for Src | dest & 3
Смещение относ. 4 байт у Исх или Назн
Если не ноль - обработка смещения
800196a8 16 00 40 10 beq v0,zero,goodAddr if a=0 then Ok, jump
800196ac 30 00 62 24 _addiu v0,v1,0x30 r2 = r3 (старт) + 30h -
конечный адрес (30h=48 байт)
LAB_800196b0 XREF[1]: 800196f4(j)
800196b0 03 00 6f 88 lwl t7,0x3(v1) r15 = *r3+3
800196b4 00 00 6f 98 lwr t7,0x0(v1)=>DAT_1f800348 = ??
800196b8 07 00 78 88 lwl t8,0x7(v1)
800196bc 04 00 78 98 lwr t8,0x4(v1)=>DAT_1f80034c load halfbytes until r2<>r3
800196c0 0b 00 6d 88 lwl t5,0xb(v1)
800196c4 08 00 6d 98 lwr t5,0x8(v1)=>DAT_1f800350 = ??
800196c8 0f 00 6e 88 lwl t6,0xf(v1)
800196cc 0c 00 6e 98 lwr t6,0xc(v1)=>DAT_1f800354 = ??
800196d0 03 00 8f a8 swl t7,0x3(r4)
800196d4 00 00 8f b8 swr t7,0x0(r4)
800196d8 07 00 98 a8 swl t8,0x7(r4)
800196dc 04 00 98 b8 swr t8,0x4(r4)
800196e0 0b 00 8d a8 swl t5,0xb(r4)
800196e4 08 00 8d b8 swr t5,0x8(r4)
800196e8 0f 00 8e a8 swl t6,0xf(r4)
800196ec 0c 00 8e b8 swr t6,0xc(r4)
800196f0 10 00 63 24 addiu v1,v1,0x10 r3 += 10
800196f4 ee ff 62 14 bne v1,v0,LAB_800196b0
800196f8 10 00 84 24 _addiu r4,r4,0x10 r4 += 10
800196fc cc 65 00 08 j LAB_80019730
80019700 00 00 00 00 _nop
goodAddr XREF[2]: 800196a8(j), 80019728(j)
80019704 00 00 6f 8c lw t7,0x0(v1)=>DAT_1f800348 r15 = *r3
80019708 04 00 78 8c lw t8,0x4(v1)=>DAT_1f80034c r24 = *r3+4
8001970c 08 00 6d 8c lw t5,0x8(v1)=>DAT_1f800350 r13 = *r3+8
80019710 0c 00 6e 8c lw t6,0xc(v1)=>DAT_1f800354 r14 = *r3+c
80019714 00 00 8f ac sw t7,0x0(r4) *r4 (dest) = r15
80019718 04 00 98 ac sw t8,0x4(r4) *r4+4 (dest) = r24
8001971c 08 00 8d ac sw t5,0x8(r4) *r4+8 (dest) = r13
80019720 0c 00 8e ac sw t6,0xc(r4) *r4+c (dest) = r14
80019724 10 00 63 24 addiu v1,v1,0x10 r3 += 10h (16) src
80019728 f6 ff 62 14 bne v1,v0,goodAddr if r3<>r2 then loop
8001972c 10 00 84 24 _addiu r4,r4,0x10 r4 += 10h (16) dest
LAB_80019730 XREF[1]: 800196fc(j)
80019730 03 00 6f 88 lwl t7,0x3(v1)
80019734 00 00 6f 98 lwr t7,0x0(v1)=>DAT_1f800358 = ??
80019738 07 00 78 88 lwl t8,0x7(v1)
8001973c 04 00 78 98 lwr t8,0x4(v1)=>DAT_1f80035c = ??
80019740 03 00 8f a8 swl t7,0x3(r4)
80019744 00 00 8f b8 swr t7,0x0(r4) add by halfBytes
80019748 07 00 98 a8 swl t8,0x7(r4)
8001974c 04 00 98 b8 swr t8,0x4(r4)
80019750 44 00 e7 24 addiu r7,r7,0x44 r7 += 44 (68)
80019754 01 00 08 25 addiu t0,t0,0x1 r8 += 1
80019758 02 00 02 2d sltiu v0,t0,0x2 r2 = if r8<=2
8001975c bf ff 40 14 bne v0,zero,UpDownCharLoop then another loop (lower char)
80019760 04 00 c6 24 _addiu DMALinkAddr,DMALinkAddr,0x4 Shift DMALinkAddress in r6
80019764 10 00 a4 8f lw r4,DMALinksAddr[0](sp) r4 = *sp+10 (sec chain addr)
80019768 18 00 23 8d lw v1,0x18(t1) r3 = *r9+18h = first chain addr @ secondchain header
8001976c 00 00 82 8c lw v0,0x0(r4) r2 = *r4 = currChain start (0d000000)
80019770 00 00 63 8c lw v1,0x0(v1) r3 = *r3 = currChain start (04ffffff)
80019774 24 10 4a 00 and v0,v0,t2 a2 & r10 (ff 00 0 00)
80019778 24 18 70 00 and v1,v1,s0 r3 & r16 00FFFFFF
8001977c 25 10 43 00 or v0,v0,v1 r2 | r3
80019780 00 00 82 ac sw v0,0x0(r4) save cur chain header with ??FFFFFF
80019784 18 00 24 8d lw r4,0x18(t1) r4 = *r9+18h = first chain addr @ secondchain header
80019788 10 00 a3 8f lw v1,DMALinksAddr[0](sp) r3 = *sp+10 (sec chain addr)
8001978c 00 00 82 8c lw v0,0x0(r4) r2 = load *r4 1st chain (04ffffff)
80019790 24 18 70 00 and v1,v1,s0 r3 & r16 00FFFFFF
80019794 24 10 4a 00 and v0,v0,t2 r2 & r10 (ff 00 0 00)
80019798 25 10 43 00 or v0,v0,v1 r2 | r3
8001979c 00 00 82 ac sw v0,0x0(r4) *first chain addr=04_sec_chain
800197a0 14 00 a4 8f lw r4,DMALinksAddr[4](sp) r4 = load last chain addr
800197a4 10 00 a3 8f lw v1,DMALinksAddr[0](sp) r3 = *sp+10 (sec chain addr)
800197a8 00 00 82 8c lw v0,0x0(r4) r2 = load last chain header
800197ac 00 00 63 8c lw v1,0x0(v1) r3 = *r3 (header of 2nd chain)
800197b0 24 10 4a 00 and v0,v0,t2 a2 & ff00..
800197b4 24 18 70 00 and v1,v1,s0 r3 & 00ffff..
800197b8 25 10 43 00 or v0,v0,v1 r2 | r3 = sec chain header (0d+ffff)
800197bc 00 00 82 ac sw v0,0x0(r4) store header 0dffffff to last chain
800197c0 10 00 a4 8f lw r4,DMALinksAddr[0](sp) r4 = *sp+10 (sec chain addr)
800197c4 14 00 a3 8f lw v1,DMALinksAddr[4](sp) r3 = load last chain addr
800197c8 00 00 82 8c lw v0,0x0(r4) r2 = load sec chain header
800197cc 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF
800197d0 24 10 4a 00 and v0,v0,t2 r2 & FF000000
800197d4 25 10 43 00 or v0,v0,v1 r2 | r3
800197d8 00 00 82 ac sw v0,0x0(r4) *r4 = r2 (sec header with command count)
800197dc 14 00 a2 8f lw v0,DMALinksAddr[4](sp) r2 = load last chain addr
800197e0 01 00 52 26 addiu r18,r18,0x1 18 += 1 (screen counter?)
800197e4 18 00 22 ad sw v0,0x18(t1) load r2 (last cmd addr)
to lower DMA table???
800197e8 02 00 42 2e sltiu v0,r18,0x2 if r18<2 -v
800197ec 6e ff 40 14 bne v0,zero,ScreenLoop Loop again another screen
800197f0 04 00 29 25 _addiu t1,t1,0x4 SHIFT LOWER DMA TABLE MAIN ADDR
800197f4 04 00 82 96 lhu v0,0x4(r20_LineDMAParam) r2 = upper half of textParam+4
800197f8 00 00 00 00 nop
800197fc 01 00 42 24 addiu v0,v0,0x1 a += 1
80019800 04 00 82 a6 sh v0,0x4(r20_LineDMAParam) save half to textParams+4
80019804 00 00 c4 96 lhu r4,0x0(s6) r4 = load next Char (2 bytes)
80019808 00 00 00 00 nop
8001980c 00 10 82 2c sltiu v0,r4,0x1000 r2 = currentChar<1000h (is Char)
80019810 56 ff 40 14 bne v0,zero,LAB_8001956c if Char - make next char
80019814 02 00 d6 26 _addiu s6,s6,0x2 move current text addr
TextEnd XREF[1]: 80019550(j)
80019818 21 90 00 00 clear r18 r18 = 0
8001981c 08 80 13 3c lui s3,0x8008
80019820 d0 b6 75 26 addiu s5,s3,-0x4930 r19 = 80080000, r21 = 7b6d0
80019824 ff 00 11 3c lui s1,0xff r17 = 00ff0000
80019828 ff ff 31 36 ori s1,s1,0xffff r17 & ffff = 00ff ffff
8001982c 21 80 80 02 move s0,r20_LineDMAParam r16 = r20 (currentTLineParam)
80019830 21 28 00 00 clear r5
PageLoop XREF[1]: 8001988c(j)
80019834 01 00 06 24 li DMALinkAddr,0x1 r6=1
80019838 21 90 46 02 addu r18,r18,DMALinkAddr r18(Counter) += r6
8001983c 00 80 02 3c lui v0,0x8000 r2 = 80000000
80019840 00 ff 04 3c lui r4,0xff00 r4 = ff00 0000
80019844 d0 b6 63 8e lw v1,-0x4930(s3)=>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
80019848 a4 00 87 8f lw r7,0xa4(gp)=>DAT_8007b234 r7 = someParam(почти DMA)gp+a4 = 34
8001984c 24 18 71 00 and v1,v1,s1 r3 & 00FFFFFF
80019850 25 18 62 00 or v1,v1,v0 r3 | r2 = 80.....
80019854 30 00 03 ae sw v1,0x30(s0) store last free ChAddr to DMAParams
80019858 d0 b6 62 8e lw v0,-0x4930(s3)=>8007b6d0_freeChain r2 = next free chain
8001985c 00 00 63 8c lw v1,0x0(v1) r3 = *r3 = last chain - made one more chain
80019860 24 10 44 00 and v0,v0,r4 a2 & ff000000
80019864 24 18 71 00 and v1,v1,s1 r3 & 00FFFFFF
80019868 04 00 a4 8e lw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter r4 = DMA Counter
8001986c 25 10 43 00 or v0,v0,v1 r2 | r3
80019870 d0 b6 62 ae sw v0,-0x4930(s3)=>8007b6d0_freeChain new free chain addr add to *7b6b0
80019874 ff ff 84 24* addiu r4,r4,-0x1 DMA Cunter =- 1
80019878 04 00 a4 ae sw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter Store DMA Count
8001987c 30 00 04 8e lw r4,0x30(s0) r4 = *DMA params + 30 = Start Of DMA Chain
80019880 b3 50 01 0c jal SetDrawTPage Set DRAW PAGE
80019884 04 00 10 26 _addiu s0,s0,0x4 r16 += 4 - Shgift DMAParams for next Page
80019888 02 00 42 2e sltiu v0,r18,0x2 r2 = r18<2
8001988c e9 ff 40 14 bne v0,zero,PageLoop if not r2 then goto Loop
80019890 21 28 00 00 _clear r5 r5 = 0
80019894 21 10 80 02 move v0,r20_LineDMAParam r2 = DMAParamsMain
80019898 4c 00 bf 8f lw ra,local_4(sp)
8001989c 48 00 be 8f lw s8,local_8(sp)
800198a0 44 00 b7 8f lw s7,local_c(sp)
800198a4 40 00 b6 8f lw s6,local_10(sp)
800198a8 3c 00 b5 8f lw s5,local_14(sp)
800198ac 38 00 b4 8f lw r20_LineDMAParam,local_18(sp) VOSSTANAVL STEK
800198b0 34 00 b3 8f lw s3,local_1c(sp)
800198b4 30 00 b2 8f lw r18,local_20(sp)
800198b8 2c 00 b1 8f lw s1,local_24(sp)
800198bc 28 00 b0 8f lw s0,local_28(sp)
800198c0 08 00 e0 03 jr ra ret
800198c4 50 00 bd 27 _addiu sp,sp,0x50 Stek +50h

91
ghidra_src/charL.asm Normal file
View File

@@ -0,0 +1,91 @@
**************************************************************
* FUNCTION *
**************************************************************
undefined __stdcall makeCharPixels(undefined4 r4, undefi
assume gp = 0x8007b190
undefined v0:1 <RETURN>
undefined4 a0:4 r4
undefined4 a1:4 a1
undefined4 a2:4 isSmallChar XREF[1]: 8001a11c(W)
undefined4 t2:4 t2 XREF[1]: 8001a0f8(W)
undefined4 t1:4 t1 XREF[1]: 8001a118(W)
undefined4 a2:4 a2 XREF[1]: 8001a11c(W)
undefined2 HASH:5f64aad curByte
makeCharPixels XREF[4]: PrintTimeinSaveLoad?:8001621c(c),
CreateCharCopyToDMAChain:800198dc(c),
GenerateSmallChar:8001a298(c),
PrintPlayerNameInBattle!:8001b0ec(c)
8001a0f8 ac 00 8a 93 lbu t2,0xac(gp)=>DAT_8007b23c load colIndex(b) to r10 from 7b23c
assume gp = <UNKNOWN>
8001a0fc 09 00 c0 14 bne isSmallChar,zero,initSmFontAddr if r6 <> 0 then Branch (small text)
8001a100 21 40 80 00 _move t0,r4 load ScrathAddr to r8
8001a104 1e 80 03 3c lui v1,0x801e
8001a108 80 f4 63 34 ori v1,v1,0xf480 load font addr in mem to r3
8001a10c c0 10 05 00 sll v0,a1,0x3 r2 = a1 (r5) << 3
8001a110 21 10 45 00 addu v0,v0,a1 r2 += r5 (ITOGO r2 = r5*9)
8001a114 40 10 02 00 sll v0,v0,0x1 r2 << 1. ITOGO r2 = r5 * 18 (12h)
8001a118 21 48 43 00 addu t1,v0,v1 r9 (charAddr) = r2(offs)+r3(start) = 801F0224
8001a11c 50 68 00 08 j contLoadChar
8001a120 09 00 06 24 _li a2,0x9 r6 = charBytesLength = 9
initSmFontAddr XREF[1]: 8001a0fc(j)
8001a124 1e 80 03 3c lui v1,0x801e
8001a128 00 f0 63 34 ori v1,v1,0xf000 load font addr to r3 (801ef000)
8001a12c 40 10 05 00 sll v0,a1,0x1 r2 = r5 << 1 (*2)
8001a130 21 10 45 00 addu v0,v0,a1 r2 += r5 (it. *3)
8001a134 80 10 02 00 sll v0,v0,0x2 r2 << 2 (*4) (r2 = r5 *12)
8001a138 21 48 43 00 addu t1,v0,v1 r9 = r2(offs) + r3 (start)
8001a13c 06 00 06 24 li a2,0x6 r6 = byteslength = 6
contLoadChar XREF[1]: 8001a11c(j)
8001a140 21 10 c0 00 move v0,a2 r2 = r6 (counter)
8001a144 2f 00 40 10 beq v0,zero,charLoaded if counter=0 then branch
8001a148 ff ff c6 24 _addiu a2,a2,-0x1 dec r6
8001a14c 80 1f 07 3c lui a3,0x1f80
8001a150 e0 02 e7 34 ori a3,a3,0x2e0 set scratch convert addr r7 = 1f8002e0
charLoop XREF[1]: 8001a1fc(j)
8001a154 00 00 23 95 lhu v1=>DAT_801ef480_font12x12,0x0(CharF load upperhalf of char to r3
8001a158 00 00 00 00 nop
8001a15c 0f 00 64 30 andi r4,v1,0xf r4 = r3 & 0f - cutting left semibyte
8001a160 02 19 03 00 srl v1,v1,0x4 r3 >> 4
8001a164 0f 00 62 30 andi v0,v1,0xf r2 = r3 & 0f
8001a168 40 10 02 00 sll v0,v0,0x1 r2 << 1
8001a16c 21 10 47 00 addu v0,v0,a3 r2 = r2 + to4bitConvertTableAddr (r7)
8001a170 00 00 42 94 lhu v0,0x0(v0)=>DAT_1f8002e0 r2 = *r2(half) pixel pattern
8001a174 00 00 00 00 nop
8001a178 18 00 4a 00 mult v0,t2 r2*r10. make Color
8001a17c 40 20 04 00 sll r4,r4,0x1 r4 << 1
8001a180 21 20 87 00 addu r4,r4,a3 r4 += r6 counter
8001a184 12 28 00 00 mflo a1 load lo to r5
8001a188 00 00 82 94 lhu v0,0x0(r4)=>DAT_1f8002e0 load table+r4
8001a18c 00 00 00 00 nop
8001a190 18 00 4a 00 mult v0,t2 r2 * colorIndex r10
8001a194 02 19 03 00 srl v1,v1,0x4 r3 >> 4, right 4 bits
8001a198 0f 00 64 30 andi r4,v1,0xf r4 = r3 & f0 (cut right semibyte)
8001a19c 02 19 03 00 srl v1,v1,0x4 r3 >> 4
8001a1a0 40 18 03 00 sll v1,v1,0x1 r3 << 1 = *2
8001a1a4 21 18 67 00 addu v1,v1,a3 r3=r3+Table r7
8001a1a8 00 14 05 00 sll v0,a1,0x10 r2 = r5 << 10 bits
8001a1ac 12 60 00 00 mflo t4 load r12,low
8001a1b0 25 10 82 01 or v0,t4,v0 r2 = r12 | r2
8001a1b4 00 00 02 ad sw v0,0x0(t0) load *r8(current Scratch) from r2(result)
8001a1b8 00 00 62 94 lhu v0,0x0(v1)=>DAT_1f8002e0 load r2 from TablePattern Half from r3
8001a1bc 00 00 00 00 nop
8001a1c0 18 00 4a 00 mult v0,t2 r2*color r10
8001a1c4 40 20 04 00 sll r4,r4,0x1 r4 << 1
8001a1c8 21 20 87 00 addu r4,r4,a3 r4 = r4 + TableStart
8001a1cc 12 28 00 00 mflo a1 ld r5,lo
8001a1d0 00 00 82 94 lhu v0,0x0(r4)=>DAT_1f8002e0 ld half r2 from *r4
8001a1d4 00 00 00 00 nop
8001a1d8 18 00 4a 00 mult v0,t2 r2*col
8001a1dc 02 00 29 25 addiu t1,t1,0x2 move charFont + +2
8001a1e0 21 18 c0 00 move v1,a2 r3 = byteCount (r6)
8001a1e4 ff ff c6 24 addiu a2,a2,-0x1 r6 -= 1
8001a1e8 04 00 08 25 addiu t0,t0,0x4 scrathAddr r8 += 4
8001a1ec 00 14 05 00 sll v0,a1,0x10 r2 = r5 << 10 bits (move to hi)
8001a1f0 12 60 00 00 mflo t4 ld r12,lo (result)
8001a1f4 25 10 82 01 or v0,t4,v0 combine r2 & r 12 (0001 x 1111)
8001a1f8 00 00 02 ad sw v0,0x0(t0) store result to scratch r2 to *r8
8001a1fc d5 ff 60 14 bne v1,zero,charLoop if r3 counter<>0 goto loop
8001a200 04 00 08 25 _addiu t0,t0,0x4 r8 scrath += 4
charLoaded XREF[1]: 8001a144(j)
8001a204 08 00 e0 03 jr ra
8001a208 00 00 00 00 _nop

471
ghidra_src/small.asm Normal file
View File

@@ -0,0 +1,471 @@
**************************************************************
* FUNCTION *
**************************************************************
undefined __stdcall DrawSmallFontString(undefined4 r4, u
assume gp = 0x8007b190
undefined v0:1 <RETURN>
undefined4 a0:4 r4
undefined2 a1:2 r5
undefined2 a2:2 r6
undefined1 a3:1 r7
undefined1 Stack[0x10]:1 Shadow XREF[1]: 80019af8(R)
undefined2 s2:2 Y XREF[1]: 80019d40(W)
undefined2 s1:2 X XREF[1]: 80019d9c(W)
undefined4 Stack[-0x4]:4 local_4 XREF[2]: 80019b00(W),
8001a040(R)
undefined4 Stack[-0x8]:4 local_8 XREF[2]: 80019ac4(W),
8001a044(R)
undefined4 Stack[-0xc]:4 local_c XREF[2]: 80019aac(W),
8001a048(R)
undefined4 Stack[-0x10]:4 local_10 XREF[2]: 80019b04(W),
8001a04c(R)
undefined4 Stack[-0x14]:4 local_14 XREF[2]: 80019ae0(W),
8001a050(R)
undefined4 Stack[-0x18]:4 local_18 XREF[2]: 80019b08(W),
8001a054(R)
undefined4 Stack[-0x1c]:4 local_1c XREF[2]: 80019b0c(W),
8001a058(R)
undefined4 Stack[-0x20]:4 local_20 XREF[2]: 80019abc(W),
8001a05c(R)
undefined4 Stack[-0x24]:4 local_24 XREF[2]: 80019ad4(W),
8001a060(R)
undefined4 Stack[-0x28]:4 local_28 XREF[2]: 80019ab4(W),
8001a064(R)
undefined4 Stack[-0x30]:4 local_30 XREF[2]: 80019cf8(W),
80019d34(R)
undefined4 Stack[-0x34]:4 local_34 XREF[2]: 80019cec(W),
80019d28(R)
undefined4 Stack[-0x38]:4 local_38 XREF[2]: 80019b48(W),
80019d40(R)
undefined4 Stack[-0x3c]:4 local_3c XREF[2,1]: 80019b7c(W),
80019ba8(R),
80019b84(W)
uint Stack[-0x40]:4 tempCoordsInVram_01f00130 XREF[2,1]: 80019bb0(W),
80019bb8(R),
80019bb4(W)
undefined1 HASH:5f6f43d currentCharCode
undefined4 HASH:23f572d tempVar
DrawSmallFontString XREF[12]: FUN_OVR_EXT__80096f94:80097148(c),
FUN_OVR_EXT__80096f94:8009719c(c),
FUN_OVR_EXT__80096f94:80097204(c),
FUN_OVR_EXT__80096f94:8009725c(c),
FUN_OVR_EXT__80096f94:8009730c(c),
FUN_OVR_EXT__80098f88:80099024(c),
drawMenu2x4:8009ce24(c),
FUN_OVR_EXT__8009e218:8009e498(c),
FUN_OVR_EXT__8009e218:8009e6f4(c),
FUN_OVR_EXT__8009e954:8009eac4(c),
FUN_OVR_EXT2_0092__800bb83c:800bbb38(c),
FUN_OVR_EXT2_0092__800c4578:800c45b0(c)
80019aa8 b0 ff bd 27 addiu sp,sp,-0x50 shift stack -50
assume gp = <UNKNOWN>
80019aac 44 00 b7 af sw s7,local_c(sp) save r23, sp+44
80019ab0 21 b8 80 00 move s7,r4 r23 = r4 (textAddr)
80019ab4 28 00 b0 af sw s0,local_28(sp) *sp+28, r16
80019ab8 21 80 a0 00 move s0,r5 r16=r5
80019abc 30 00 b2 af sw s2,local_20(sp) *sp+30, r18
80019ac0 21 90 c0 00 move s2,r6 r18 = r6
80019ac4 48 00 be af sw s8,local_8(sp) *sp+48 = r30
80019ac8 21 f0 00 02 move s8,s0 r30 = r16
80019acc ff 00 08 3c lui t0,0xff
80019ad0 ff ff 08 35 ori t0,t0,0xffff r8 = 00ffffff
80019ad4 2c 00 b1 af sw s1,local_24(sp) *sp+2c = r17
80019ad8 ff 00 f1 30 andi s1,r7,0xff r17 = r7 & ff (color & shadow)
80019adc 21 20 20 02 move r4,s1 r4 = r17
80019ae0 3c 00 b5 af sw s5,local_14(sp) *sp+3c = r21
80019ae4 08 80 15 3c lui s5,0x8008 r21 = 80080000
80019ae8 00 ff 06 3c lui r6,0xff00 r6 = ff000000
80019aec 00 80 02 3c lui v0,0x8000 r2 = 8000 0000
80019af0 21 68 a0 02 move t5,s5 r13 = r21
80019af4 d0 b6 a3 8e lw v1,-0x4930(s5)=>8007b6d0_freeChain r3 = *freeChain
80019af8 60 00 a7 8f lw r7,Shadow(sp) r7 = sp+60
80019afc d0 b6 ad 25 addiu t5,t5,-0x4930 t5 -= 4930 = 8007b640 (freeChain)
80019b00 4c 00 bf af sw ra,local_4(sp) *sp+4c = ra
80019b04 40 00 b6 af sw s6,local_10(sp) *sp+40 = r22
80019b08 38 00 b4 af sw s4,local_18(sp) *sp+38 = r20
80019b0c 34 00 b3 af sw s3,local_1c(sp) *sp+34 = r19
80019b10 24 30 66 00 and r6,v1,r6 r6 & r3 (freeChain)
80019b14 ff 00 e5 30 andi r5,r7,0xff r5 = r7 & ff
80019b18 24 18 68 00 and v1,v1,t0 r3 & 00FFFFFF
80019b1c 25 a0 62 00 or s4,v1,v0 r20 = r3 | 8000000 (80..+r3)
80019b20 10 00 e7 30 andi r7,r7,0x10 r7 & 10 (2nd bit only)
80019b24 2b 38 07 00 sltu r7,zero,r7 r7 = 0<r7 (is 2nd bit if shad ON?)
80019b28 04 00 a2 8d lw v0,0x4(t5)=>DAT_8007b6d4_CmdCounter r2 = *DMACounter
80019b2c 00 00 83 8e lw v1,0x0(s4) r3 = *r20 - next chain addr
80019b30 ff ff 42 24 addiu v0,v0,-0x1 DMACounter -1
80019b34 24 18 68 00 and v1,v1,t0 r3 & 00FFFFFF
80019b38 25 30 c3 00 or r6,r6,v1 r6 = FF... | r3
80019b3c 04 00 a2 ad sw v0,0x4(t5)=>DAT_8007b6d4_CmdCounter save DMACounter
80019b40 d0 b6 a6 ae sw r6,-0x4930(s5)=>8007b6d0_freeChain save next free chain to 7b6do
80019b44 32 6c 00 0c jal store_Color_to_addr undefined store_Color_to_addr(undefined1 ColIndex, undefine
80019b48 18 00 a7 af _sw r7,local_38(sp) r7 = sp+18, color
80019b4c 21 20 80 02 move r4,s4 r4 = r20 (cur new chain)
80019b50 00 84 10 00 sll s0,s0,0x10 r16 << 10 (log) Cleaning coords
80019b54 03 2c 10 00 sra r5,s0,0x10 r5 = r16 >> 10 (ar)
80019b58 00 94 12 00 sll s2,s2,0x10 r18 << 10 (log)
80019b5c 03 84 12 00 sra s0,s2,0x10 r16 = r18 >> 10 (ar)
80019b60 21 30 00 02 move r6,s0 r6 = r16
80019b64 1c 68 00 0c jal initCopycharChain INIT TEXT CHAIN
80019b68 21 38 20 02 _move r7,s1 r7 = r17 (color)
80019b6c 80 1f 05 3c lui r5,0x1f80 r5 = 1f800348 - chain params start
80019b70 48 03 a5 34 ori r5,r5,0x348
80019b74 02 00 02 24 li v0,0x2 r2 = 2, r7 = 0c (size)
80019b78 0c 00 07 24 li r7,0xc
80019b7c 14 00 a2 a7 sh v0,local_3c(sp) *sp+14 = half r2 (heigth)
80019b80 10 00 02 24 li v0,0x10
80019b84 16 00 a7 a7 sh r7,local_3c+0x2(sp) *sp+16 = half r7 (color?)
80019b88 03 00 a2 a0 sb v0,0x3(r5)=>DAT_1f80034b *34b = byte r2 (10) DMALenght
80019b8c 00 a0 02 3c lui v0,0xa000 r2 = a000000
80019b90 04 00 a2 ac sw v0,0x4(r5)=>DAT_1f80034c *34c = r2 (a000000) DMA cmd
80019b94 a0 00 83 97 lhu v1,0xa0(gp)=>VRam_Temp_Char_x r3 = half gp+a0 (x)
80019b98 a2 00 84 97 lhu r4,0xa2(gp)=>VRam_Temp_Char_y r4 = half gp+a2 (y)
80019b9c 00 01 02 3c lui v0,0x100 r2 = 01000000 - FlushCache
80019ba0 80 1f 01 3c lui at,0x1f80 at = 1f800000
80019ba4 88 03 22 ac sw v0,offset DAT_1f800388(at) *at+388 = r2
80019ba8 14 00 a2 8f lw v0,local_3c(sp) r2 = sp+14 - w*h (0c*02)!
80019bac 80 1f 13 3c lui s3,0x1f80 r19 = 1f80
80019bb0 10 00 a3 a7 sh v1,tempCoordsInVram_01f00130(sp) *sp+10 = half r3
tempCoordsInVram_01f00130
80019bb4 12 00 a4 a7 sh r4,tempCoordsInVram_01f00130+0x2(sp) *sp+12 = half r4
80019bb8 10 00 a3 8f lw v1,tempCoordsInVram_01f00130(sp) r3 = sp+10 - Temp coords
80019bbc a0 00 84 87 lh r4,0xa0(gp)=>VRam_Temp_Char_x r4 (signed half?) = gp+a0
80019bc0 d0 03 73 36 ori s3,s3,0x3d0 r19 | 3d0 = 1f8003d0
80019bc4 0c 00 a2 ac sw v0,0xc(r5)=>DAT_1f800354 *354 = r2 (Temp char Size)
80019bc8 01 80 02 3c lui v0,0x8001 r2 = 8001
80019bcc 21 30 80 00 move r6,r4 r6 = r4 (x)
80019bd0 08 00 a3 ac sw v1,0x8(r5)=>DAT_1f800350 *350 = r3 = temp coords (01f0 0130)
80019bd4 80 1f 0d 3c lui t5,0x1f80 r13 = 1f80
80019bd8 e0 02 ad 35 ori t5,t5,0x2e0 r13 | 2e0
80019bdc e8 03 58 24 addiu t8,v0,0x3e8 r24 = r2 + 3e0 = 800103e0
80019be0 03 00 0e 8b lwl t6,0x3(t8)
80019be4 00 00 0e 9b lwr t6,0x0(t8)=>DAT_800103e8 = 00010000h
80019be8 07 00 0f 8b lwl t7,0x7(t8)
80019bec 04 00 0f 9b lwr t7,0x4(t8)=>DAT_800103ec = 00110010h
80019bf0 03 00 ae a9 swl t6,0x3(t5)
80019bf4 00 00 ae b9 swr t6,0x0(t5)=>DAT_1f8002e0 = ??
80019bf8 07 00 af a9 swl t7,0x7(t5)
80019bfc 04 00 af b9 swr t7,0x4(t5)=>DAT_1f8002e4 = ??
80019c00 0b 00 0e 8b lwl t6,0xb(t8)
80019c04 08 00 0e 9b lwr t6,0x8(t8)=>DAT_800103f0 = 01010100h
80019c08 0f 00 0f 8b lwl t7,0xf(t8)
80019c0c 0c 00 0f 9b lwr t7,0xc(t8)=>DAT_800103f4 = 01110110h
80019c10 0b 00 ae a9 swl t6,0xb(t5)
80019c14 08 00 ae b9 swr t6,0x8(t5)=>DAT_1f8002e8 Init 4bits table
80019c18 0f 00 af a9 swl t7,0xf(t5)
80019c1c 0c 00 af b9 swr t7,0xc(t5)=>DAT_1f8002ec = ??
80019c20 13 00 0e 8b lwl t6,0x13(t8)
80019c24 10 00 0e 9b lwr t6,0x10(t8)=>DAT_800103f8 = 10011000h
80019c28 17 00 0f 8b lwl t7,0x17(t8)
80019c2c 14 00 0f 9b lwr t7,0x14(t8)=>DAT_800103fc = 10111010h
80019c30 13 00 ae a9 swl t6,0x13(t5)
80019c34 10 00 ae b9 swr t6,0x10(t5)=>DAT_1f8002f0 = ??
80019c38 17 00 af a9 swl t7,0x17(t5)
80019c3c 14 00 af b9 swr t7,0x14(t5)=>DAT_1f8002f4 = ??
80019c40 1b 00 0e 8b lwl t6,0x1b(t8)
80019c44 18 00 0e 9b lwr t6,0x18(t8)=>DAT_80010400 = 11011100h
80019c48 1f 00 0f 8b lwl t7,0x1f(t8)
80019c4c 1c 00 0f 9b lwr t7,0x1c(t8)=>DAT_80010404 = 11111110h
80019c50 1b 00 ae a9 swl t6,0x1b(t5)
80019c54 18 00 ae b9 swr t6,0x18(t5)=>DAT_1f8002f8 = ??
80019c58 1f 00 af a9 swl t7,0x1f(t5)
80019c5c 1c 00 af b9 swr t7,0x1c(t5)=>DAT_1f8002fc = ??
80019c60 04 00 02 24 li v0,0x4
80019c64 03 00 62 a2 sb v0,0x3(s3)=>DAT_1f8003d3 = ??
80019c68 64 00 02 24 li v0,0x64
80019c6c 07 00 62 a2 sb v0,0x7(s3)=>DAT_1f8003d7 = ??
80019c70 80 00 02 24 li v0,0x80
80019c74 04 00 62 a2 sb v0,0x4(s3)=>DAT_1f8003d4 = ??
80019c78 05 00 62 a2 sb v0,0x5(s3)=>DAT_1f8003d5 save 04, 64808080 cmds bytes to Scratch
80019c7c 02 00 81 04 bgez r4,x>0 if r4>=0 then branch
80019c80 06 00 62 a2 _sb v0,0x6(s3)=>DAT_1f8003d6 last 80
80019c84 3f 00 86 24 addiu r6,r4,0x3f ELSE r6 = r4(X)+3f???
x>0 XREF[1]: 80019c7c(j)
80019c88 83 11 06 00 sra v0,r6,0x6 r2 = r6 >> 6 = 4
80019c8c 80 11 02 00 sll v0,v0,0x6 r2 << 6 = 100
80019c90 23 10 82 00 subu v0,r4,v0 r2 = r6 - r2 = 30
80019c94 a2 00 83 87 lh v1,0xa2(gp)=>VRam_Temp_Char_y r3 = load Y half from mem
80019c98 80 10 02 00 sll v0,v0,0x2 r2 << 2
80019c9c 0c 00 62 a2 sb v0,0xc(s3)=>DAT_1f8003dc *3dc = byte r2 (X)
80019ca0 02 00 61 04 bgez v1,y>0 IF r3>=0 goto...
80019ca4 21 10 60 00 _move v0,v1 r2 = r3 (Y)
80019ca8 ff 00 62 24 addiu v0,v1,0xff ELSE r2 = r3+ff
y>0 XREF[1]: 80019ca0(j)
80019cac 03 12 02 00 sra v0,v0,0x8 r2 >> 8
80019cb0 00 12 02 00 sll v0,v0,0x8 r2 << 8
80019cb4 23 10 62 00 subu v0,v1,v0 r2 = r3-r2
80019cb8 0d 00 62 a2 sb v0,0xd(s3)=>DAT_1f8003dd *3dd byte = r2 (Y)
80019cbc a8 00 83 97 lhu v1,0xa8(gp)=>DAT_8007b238 r3 = XYhalf(7df3)
80019cc0 08 00 02 24 li v0,0x8 r2 = 8 Sprite WIDTH
80019cc4 10 00 62 a6 sh v0,0x10(s3)=>DAT_1f8003e0 *3e0 = r2 (8)
80019cc8 12 00 67 a6 sh r7,0x12(s3)=>DAT_1f8003e2 *3e2 = r7 (0c) - sprite heigth
80019ccc 0e 00 63 a6 sh v1,0xe(s3)=>DAT_1f8003de *3de = r3 = 7df3
80019cd0 00 00 e5 92 lbu r5,0x0(s7) r5 = byte unsigned *r23 READING TEXT CODE
80019cd4 00 00 00 00 nop
80019cd8 b9 00 a0 10 beq r5,zero,textEnd if CHAR is 0 - end
80019cdc 01 00 f7 26 _addiu s7,s7,0x1 CHAR addr +=1
80019ce0 21 b0 a0 02 move s6,s5 r22 = r21
80019ce4 08 80 15 3c lui s5,0x8008 r21 = 8008
80019ce8 d0 b6 b5 26 addiu s5,s5,-0x4930 r21 = 7b6d0 (free chain)
80019cec 1c 00 b0 af sw s0,local_34(sp) sp+1c = r16 (X)
80019cf0 ff 00 10 3c lui s0,0xff
80019cf4 ff ff 10 36 ori s0,s0,0xffff r16 = 00FFFFFF
80019cf8 20 00 b2 af sw s2,local_30(sp) *sp+20 = r18
LAB_80019cfc XREF[1]: 80019fb8(j)
80019cfc 99 ff a3 24 addiu v1,r5,-0x67 r3 = r5-67 = CHAR code shift
80019d00 13 00 62 2c sltiu v0,v1,0x13 r2 = r3 <= 13
80019d04 0b 00 40 10 beq v0,zero,switchD_80019d20::r3<=13 r2=0? -> r3 > 13 -> goto Switch
80019d08 80 10 03 00 _sll v0,v1,0x2 r2 = r3 << 2 (*4) cmdID
80019d0c 01 80 0e 3c lui t6,0x8001 r14 = 8001 0000
80019d10 a0 04 ce 25 addiu t6,t6,0x4a0 r14 & 04a0
80019d14 21 10 4e 00 addu v0,v0,t6 r2 += t6 (command table)
80019d18 00 00 42 8c lw v0,0x0(v0)=>->switchD_80019d20::case r2 = *r2 (cmd addr)
80019d1c 00 00 00 00 nop
switchD_80019d20::switchD
80019d20 08 00 40 00 jr v0 --CALL R2 SWITCH--
80019d24 00 00 00 00 _nop
switchD_80019d20::caseD_6a XREF[6]: 800104a0(*), 800104ac(*), 800104c4(*),
switchD_80019d20::caseD_70 800104c8(*), 800104e8(*), 80019d20(j)
switchD_80019d20::caseD_71
switchD_80019d20::caseD_79
switchD_80019d20::caseD_67
80019d28 1c 00 af 8f lw t7,local_34(sp) r15 = *sp+1c
80019d2c 50 67 00 08 j LAB_80019d40
80019d30 02 00 f2 25 _addiu s2,t7,0x2 s2 = r15 + 2??
switchD_80019d20::caseD_69 XREF[16]: 800104a4(*), 800104a8(*), 800104b0(*),
switchD_80019d20::caseD_6b 800104b4(*), 800104b8(*), 800104bc(*),
switchD_80019d20::caseD_6c 800104c0(*), 800104cc(*), 800104d0(*),
switchD_80019d20::caseD_6d 800104d4(*), 800104d8(*), 800104dc(*),
switchD_80019d20::caseD_6e 800104e0(*), 800104e4(*), 80019d04(j),
switchD_80019d20::caseD_6f 80019d20(j)
switchD_80019d20::caseD_72
switchD_80019d20::caseD_73
switchD_80019d20::caseD_74
switchD_80019d20::caseD_75
switchD_80019d20::caseD_76
switchD_80019d20::caseD_77
switchD_80019d20::caseD_78
switchD_80019d20::r3<=13
80019d34 20 00 b8 8f lw t8,local_30(sp) r24 = *sp+20 (shifted Y??)
80019d38 00 00 00 00 nop
80019d3c 03 94 18 00 sra s2,t8,0x10 r18 = r24 >> 10 - shift coord back
LAB_80019d40 XREF[1]: 80019d2c(j)
80019d40 18 00 ad 8f lw t5,local_38(sp) r13 = *sp+18 (color & shadow)
80019d44 00 00 00 00 nop
80019d48 10 00 a0 11 beq t5,zero,LAB_80019d8c if shadow (r13=0) then Branch
80019d4c e0 ff a5 24 _addiu r5,r5,-0x20 curCharCode -= 20
80019d50 01 80 02 3c lui v0,0x8001
80019d54 3c 04 42 24 addiu v0,v0,0x43c r2 = 8001043c
80019d58 21 10 a2 00 addu v0,r5,v0 r2 += r5
80019d5c 01 80 03 3c lui v1,0x8001 r3 = 80010000
80019d60 00 00 42 90 lbu v0,0x0(v0)=>DAT_8001041c r2 = *r2 byte
80019d64 28 04 63 24 addiu v1,v1,0x428 r3 & 428 = 80010428
80019d68 40 10 02 00 sll v0,v0,0x1 r2 << 1
80019d6c 21 10 43 00 addu v0,v0,v1 r2 += r3
80019d70 00 00 43 90 lbu v1=>DAT_80010428,0x0(v0) r3 = byte *r2
80019d74 01 00 42 90 lbu v0,0x1(v0)=>DAT_80010429 r2 = byte *r2+1
80019d78 23 18 c3 03 subu v1,s8,v1
80019d7c 00 24 03 00 sll r4,v1,0x10
80019d80 03 8c 04 00 sra s1,r4,0x10
80019d84 68 67 00 08 j LAB_80019da0
80019d88 21 f0 43 00 _addu s8,v0,v1
LAB_80019d8c XREF[1]: 80019d48(j)
80019d8c 00 1c 1e 00 sll v1,s8,0x10 r3 = fp(r30???) << 10b
80019d90 04 00 82 96 lhu v0,0x4(s4) r2 = r20+4* (DMA PArams+4)(charnum)
80019d94 03 1c 03 00 sra v1,v1,0x10 r3 >> 10 (ar) - INIT X
80019d98 c0 10 02 00 sll v0,v0,0x3 r2 << 3 (l) charnum * 8
80019d9c 21 88 62 00 addu X,v1,v0 r17 (x) = r2+r3 (initX+r2)
addr = 1f800358?
LAB_80019da0 XREF[1]: 80019d84(j)
80019da0 a1 68 00 0c jal GenerateSmallChar undefined GenerateSmallChar()
80019da4 21 20 a0 00 _move r4,r5 r4 = r5 = Y?
80019da8 00 80 0c 3c lui t4,0x8000 r12 = 80000000
80019dac 00 ff 0a 3c lui t2,0xff00 r10 = ff000000
80019db0 21 48 80 02 move t1,s4 r9 = r20 (current dma line params)
80019db4 80 1f 0b 3c lui t3,0x1f80 r11 = 1f800388 (free dma chain????)
80019db8 88 03 6b 35 ori t3,t3,0x388
80019dbc 21 40 80 02 move t0,s4 r8 = r20 (another dma line params)
80019dc0 08 00 71 a6 sh X,0x8(s3)=>DAT_1f8003d8 *DMAScr(r19+8,3d0+8) = half r17 (X)
80019dc4 0a 00 72 a6 sh Y,0xa(s3)=>DAT_1f8003da *DMAScr(r19+0a,3d0+0a) = half r18 (Y)
PageLoop XREF[1]: 80019f98(j)
80019dc8 d0 b6 c2 8e lw v0,-0x4930(s6)=>8007b6d0_freeChain r2 = *freeChainAddr
80019dcc 00 00 00 00 nop
80019dd0 24 20 4a 00 and r4,v0,t2 r4 = r2 & ff00..
80019dd4 24 10 50 00 and v0,v0,s0 r2 & 00FFFFFF
80019dd8 25 28 4c 00 or r5,v0,t4 r5 = 80 & r2
80019ddc 04 00 a2 8e lw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter r2 = DMA Counter
80019de0 00 00 a3 8c lw v1,0x0(r5) r3 = New Free ChainAddr
80019de4 ff ff 42 24 addiu v0,v0,-0x1 r2 -= 1 Counter Down
80019de8 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF cut begin byte
80019dec 25 20 83 00 or r4,r4,v1 r4 & r3 = ff......
80019df0 04 00 a2 ae sw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter save DMA Counter
80019df4 d0 b6 c4 ae sw r4,-0x4930(s6)=>8007b6d0_freeChain save new freeChain
CopyScriptChain copy from scratch
80019df8 00 00 6e 8e lw t6,0x0(s3)=>DAT_1f8003d0 r14 = 04000000 - DMA Commands Count
80019dfc 04 00 6f 8e lw t7,0x4(s3)=>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd
80019e00 08 00 78 8e lw t8,0x8(s3)=>DAT_1f8003d8 r24 = 001500d1 - xy screen coords
80019e04 0c 00 6d 8e lw t5,0xc(s3)=>DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page)
80019e08 00 00 ae ac sw t6,0x0(r5) *r5 = r14
80019e0c 04 00 af ac sw t7,0x4(r5) *r5+4 = r15
80019e10 08 00 b8 ac sw t8,0x8(r5) *r5+8 = r24
80019e14 0c 00 ad ac sw t5,0xc(r5) *r5+c = r13
80019e18 10 00 6e 8e lw t6,0x10(s3)=>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
80019e1c 00 00 00 00 nop
80019e20 10 00 ae ac sw t6,0x10(r5) *r5+10 = r14
CharMakeChain?
80019e24 18 00 03 8d lw v1,0x18(t0) r3 = *r8+18 (first chain addr?)
80019e28 00 00 a2 8c lw v0,0x0(r5) r2 = *curChainaddr
80019e2c 00 00 63 8c lw v1,0x0(v1) r3 = *r3
80019e30 24 10 4a 00 and v0,v0,t2 r2 & ff000000
80019e34 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF
80019e38 25 10 43 00 or v0,v0,v1 r2 | r3 = 04FFFFFF - commands with FFFFFF
80019e3c 00 00 a2 ac sw v0,0x0(r5) *curChainAddr r5 = r2 (upd ..04 with ..FF04)
80019e40 18 00 04 8d lw r4,0x18(t0) r4 = *r8+18 (first chain addr?)
80019e44 00 00 00 00 nop
80019e48 00 00 82 8c lw v0,0x0(r4) r2 = *r4 FIRST CHAIN LINK TO NEXT??
80019e4c 24 18 b0 00 and v1,r5,s0 r3 = r5 (cur chain) & 00FFFFFF
80019e50 24 10 4a 00 and v0,v0,t2 r2 & FF000000
80019e54 25 10 43 00 or v0,v0,v1 r2 | r3 = last chain adr w 10&....
80019e58 00 00 82 ac sw v0,0x0(r4) *r4 = r2 FIRST CHAIN NEXT ADDR???
80019e5c 18 00 05 ad sw r5,0x18(t0) t0 - main ChainParams r5 = *r8+18 curChainAddr
80019e60 04 00 22 95 lhu v0,0x4(t1) t1 - page ChainParams r2 = half (DMA params)+4 (charCounter)
80019e64 00 00 00 00 nop
80019e68 04 00 40 14 bne v0,zero,NotFirstChar if CharCount<>0 then Goto...
80019e6c 00 00 00 00 _nop
80019e70 28 00 05 ad sw r5,0x28(t0) *curChain+28 = currentChainAddr
80019e74 0c 00 31 a5 sh X,0xc(t1) Params+0c = save half X
80019e78 0e 00 32 a5 sh Y,0xe(t1) Params+0e = save half Y
COPYCHAR To DMAChain
NotFirstChar XREF[1]: 80019e68(j)
80019e7c 80 1f 05 3c lui r5,0x1f80 r5 = *1f80
80019e80 d0 b6 c2 8e lw v0,-0x4930(s6)=>8007b6d0_freeChain r2 = *nextFreeChain
80019e84 48 03 a5 34 ori r5,r5,0x348 r5 | 1f800348 = Scratch CharData
80019e88 24 20 4a 00 and r4,v0,t2 r4 = r2 & FF000000
80019e8c 24 10 50 00 and v0,v0,s0 r2 & 00FFFFFF
80019e90 25 38 4c 00 or r7,v0,t4 r7 = r2 | r12 = nextChain & 80...
80019e94 21 30 e0 00 move r6,r7 r6 = r7 (nextChain)
80019e98 04 00 a2 8e lw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter r2 = chainCounter*
80019e9c 00 00 e3 8c lw v1,0x0(r7) r3 = *nextChainNextAddr
80019ea0 ff ff 42 24 addiu v0,v0,-0x1 r2 -= 1
80019ea4 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF
80019ea8 25 20 83 00 or r4,r4,v1 r4 | r3 = FF..nextchain (cutCmdCount)
80019eac 04 00 a2 ae sw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter *cmdCountr = r2 = save
80019eb0 03 00 e2 30 andi v0,r7,0x3 r2 = r7 & 3 (check destAddr MOD 4)
80019eb4 16 00 40 10 beq v0,zero,Copy16Bytes if r7 MOD 4 = 0 then Branch
80019eb8 d0 b6 c4 ae _sw r4,-0x4930(s6)=>8007b6d0_freeChain *nextFreeChain = r4
CopyBy2Bytes XREF[1]: 80019f00(j)
80019ebc 03 00 ae 88 lwl t6,0x3(r5) if r7 mod4 <> 0 - копируем по 2 байта
80019ec0 00 00 ae 98 lwr t6,0x0(r5)=>DAT_1f800348 = ??
80019ec4 07 00 af 88 lwl t7,0x7(r5)
80019ec8 04 00 af 98 lwr t7,0x4(r5)=>DAT_1f80034c = ??
80019ecc 0b 00 b8 88 lwl t8,0xb(r5)
80019ed0 08 00 b8 98 lwr t8,0x8(r5)=>DAT_1f800350 = ??
80019ed4 0f 00 ad 88 lwl t5,0xf(r5)
80019ed8 0c 00 ad 98 lwr t5,0xc(r5)=>DAT_1f800354 = ??
80019edc 03 00 ce a8 swl t6,0x3(r6)
80019ee0 00 00 ce b8 swr t6,0x0(r6)
80019ee4 07 00 cf a8 swl t7,0x7(r6)
80019ee8 04 00 cf b8 swr t7,0x4(r6)
80019eec 0b 00 d8 a8 swl t8,0xb(r6)
80019ef0 08 00 d8 b8 swr t8,0x8(r6)
80019ef4 0f 00 cd a8 swl t5,0xf(r6)
80019ef8 0c 00 cd b8 swr t5,0xc(r6)
80019efc 10 00 a5 24 addiu r5,r5,0x10
80019f00 ee ff ab 14 bne r5,t3,CopyBy2Bytes
80019f04 10 00 c6 24 _addiu r6,r6,0x10
80019f08 cf 67 00 08 j last4BytesCopy
80019f0c 00 00 00 00 _nop
Copying Char Data From Scratch
Copy16Bytes XREF[2]: 80019eb4(j), 80019f34(j)
80019f10 00 00 ae 8c lw t6,0x0(r5)=>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
80019f14 04 00 af 8c lw t7,0x4(r5)=>DAT_1f80034c = ??
80019f18 08 00 b8 8c lw t8,0x8(r5)=>DAT_1f800350 = ??
80019f1c 0c 00 ad 8c lw t5,0xc(r5)=>DAT_1f800354 = ??
80019f20 00 00 ce ac sw t6,0x0(r6)
80019f24 04 00 cf ac sw t7,0x4(r6) Copy cmdCnt + A0000000 + 013001F0 + 000C0002
80019f28 08 00 d8 ac sw t8,0x8(r6) Copy 16bytes*4 times
80019f2c 0c 00 cd ac sw t5,0xc(r6)
80019f30 10 00 a5 24 addiu r5,r5,0x10
80019f34 f6 ff ab 14 bne r5,t3,Copy16Bytes
80019f38 10 00 c6 24 _addiu r6,r6,0x10
last4BytesCopy XREF[1]: 80019f08(j)
80019f3c 03 00 ae 88 lwl t6,0x3(r5) r14 left = 2 bytes from *r5+3
80019f40 00 00 ae 98 lwr t6,0x0(r5)=>DAT_1f800358 r14 right = 2 bytes from *r5
80019f44 00 00 00 00 nop
80019f48 03 00 ce a8 swl t6,0x3(r6) *r6 = r14 left
80019f4c 00 00 ce b8 swr t6,0x0(r6) *r6+3 = r14 right
linking DMA char+copysprite
80019f50 18 00 03 8d lw v1,0x18(t0) r3 = current DMACopySprite Chain
80019f54 00 00 e2 8c lw v0,0x0(r7) r2 = current CharChainCommands
80019f58 00 00 63 8c lw v1,0x0(v1) r3 = *r3 (comNum+FFFFFF(nextLink))
80019f5c 24 10 4a 00 and v0,v0,t2 r2 & FF.....
80019f60 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF
80019f64 25 10 43 00 or v0,v0,v1 r2 | r3 = 10FFFFFF(cmdNum&FF..)
80019f68 00 00 e2 ac sw v0,0x0(r7) *r7 = r2 saveCurChainCmd
80019f6c 18 00 04 8d lw r4,0x18(t0) r4 = r8+18h - cur CopySpriteCmd hdrAddr
80019f70 00 00 00 00 nop
80019f74 00 00 82 8c lw v0,0x0(r4) r2 = *r4 (04FFFFFF)
80019f78 24 18 f0 00 and v1,r7,s0 r3 = r7 & 00FFFFFF (Copying Cur Char Chain)
80019f7c 24 10 4a 00 and v0,v0,t2 r2 & FF000000 (04000000) CmdCount
80019f80 25 10 43 00 or v0,v0,v1 R2 | R3 = 04(cmd)..+CharChainAddr
80019f84 00 00 82 ac sw v0,0x0(r4) *r4 = r2 = FullCommand With Link!!!
(04..CharAddr) + SpriteCopyCommand
80019f88 18 00 07 ad sw r7,0x18(t0) *r8+18 = Last Char Chain!
80019f8c 04 00 08 25 addiu t0,t0,0x4 r8 (params) += 4 (shift params for NextPage)
80019f90 08 00 22 25 addiu v0,t1,0x8 r2 = r9+8 (shift first chain param for Page)
80019f94 2b 10 02 01 sltu v0,t0,v0 r2 = r8 < r2(r9+8) (first page pass)
80019f98 8b ff 40 14 bne v0,zero,PageLoop if r2<>0 (r8<r2) then goto Next Page Loop
80019f9c 00 00 00 00 _nop
80019fa0 04 00 82 96 lhu v0,0x4(s4) r2 = *r20+4 = charCount
80019fa4 00 00 00 00 nop
80019fa8 01 00 42 24 addiu v0,v0,0x1 r2+=1
80019fac 04 00 82 a6 sh v0,0x4(s4) *charCount += 1
80019fb0 00 00 e5 92 lbu r5,0x0(s7) load next Char to r5 (byte)
80019fb4 00 00 00 00 nop
80019fb8 50 ff a0 14 bne r5,zero,LAB_80019cfc if char<>0 then goto MAKE CHAR
80019fbc 01 00 f7 26 _addiu s7,s7,0x1 charAddr += 1
textEnd XREF[1]: 80019cd8(j)
80019fc0 21 90 00 00 clear Y r18 = 0
80019fc4 08 80 13 3c lui s3,0x8008
80019fc8 d0 b6 75 26 addiu s5,s3,-0x4930 r21 = 8007b6d0 = next Free chain Addr
80019fcc ff 00 11 3c lui X,0xff
80019fd0 ff ff 31 36 ori X,X,0xffff r17 = 00FFFFFF
80019fd4 21 80 80 02 move s0,s4 r16 = r20 DMAChain ParamsAddr
80019fd8 21 28 00 00 clear r5 r5 = 0
callPageChain XREF[1]: 8001a034(j)
80019fdc 01 00 06 24 li r6,0x1 r6 = 1
80019fe0 21 90 46 02 addu Y,Y,r6 r18 += r6 (page counter)
80019fe4 00 80 02 3c lui v0,0x8000 r2 = 8000 0000
80019fe8 00 ff 04 3c lui r4,0xff00 r4 = ff000000
80019fec d0 b6 63 8e lw v1,-0x4930(s3)=>8007b6d0_freeChain r3 = *freeChain
80019ff0 a4 00 87 8f lw r7,0xa4(gp)=>DAT_8007b234 r7 = gp+a4 (34h)
80019ff4 24 18 71 00 and v1,v1,X r3 & FF000000
80019ff8 25 18 62 00 or v1,v1,v0 r3 | r2 = 80...freechain)
80019ffc 30 00 03 ae sw v1,0x30(s0) r3 = *r16+30 = last Chain Addr to params
8001a000 d0 b6 62 8e lw v0,-0x4930(s3)=>8007b6d0_freeChain r2 = nextFreeChain
8001a004 00 00 63 8c lw v1,0x0(v1) r3=*r3
8001a008 24 10 44 00 and v0,v0,r4 r2 & FF000000
8001a00c 24 18 71 00 and v1,v1,X r3 & 00FFFFFF
8001a010 04 00 a4 8e lw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter r4 = cmdCounter*
8001a014 25 10 43 00 or v0,v0,v1 r2 | r3
8001a018 d0 b6 62 ae sw v0,-0x4930(s3)=>8007b6d0_freeChain *nexFreechain = r2
8001a01c ff ff 84 24 addiu r4,r4,-0x1 r4 -= 1
8001a020 04 00 a4 ae sw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter save *cmdCounter r4
8001a024 30 00 04 8e lw r4,0x30(s0) r4 = *r16+30 = last Chain Addr to params
8001a028 b3 50 01 0c jal SetDrawTPage call DrawChain
8001a02c 04 00 10 26 _addiu s0,s0,0x4 paramsAddr += 4
8001a030 02 00 42 2e sltiu v0,Y,0x2 a2 = r18 < 2
8001a034 e9 ff 40 14 bne v0,zero,callPageChain if a2<>0 (r18<2) then goto another page
8001a038 21 28 00 00 _clear r5 r5 = 0
8001a03c 21 10 80 02 move v0,s4 r2 = paramsAddr
8001a040 4c 00 bf 8f lw ra,local_4(sp)
8001a044 48 00 be 8f lw s8,local_8(sp)
8001a048 44 00 b7 8f lw s7,local_c(sp)
8001a04c 40 00 b6 8f lw s6,local_10(sp)
8001a050 3c 00 b5 8f lw s5,local_14(sp) RESTORE registers from stack
8001a054 38 00 b4 8f lw s4,local_18(sp)
8001a058 34 00 b3 8f lw s3,local_1c(sp)
8001a05c 30 00 b2 8f lw Y,local_20(sp)
8001a060 2c 00 b1 8f lw X,local_24(sp)
8001a064 28 00 b0 8f lw s0,local_28(sp)
8001a068 08 00 e0 03 jr ra ret
8001a06c 50 00 bd 27 _addiu sp,sp,0x50 return stack +50