490 lines
47 KiB
NASM
490 lines
47 KiB
NASM
**************************************************************
|
||
* 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
|