EP: text print fixes

This commit is contained in:
sShemet
2025-11-07 10:51:48 +05:00
parent 894afef9ab
commit 4d739ba8fb
6 changed files with 788 additions and 780 deletions

Binary file not shown.

View File

@@ -7,57 +7,57 @@
800578FC setdrawtpage 800578FC setdrawtpage
80090000 externalprint 80090000 externalprint
8009001C myprintlineroutine 8009001C myprintlineroutine
800900DC cputovram_scratchpad_template 800900E0 cputovram_scratchpad_template
8009010C _1bppto4bpp_table_template 80090110 _1bppto4bpp_table_template
8009015C rect_scratchpad_template 80090160 rect_scratchpad_template
800901A0 make_sprite_size_table 800901A4 make_sprite_size_table
800901C8 misc_init 800901CC misc_init
800901CC textgroupreadloop 800901D0 textgroupreadloop
800901F0 readtexttobuffer 800901F4 readtexttobuffer
8009023C form_char_data_in_scratch 80090240 form_char_data_in_scratch
80090244 rect_cmd_init 80090248 rect_cmd_init
80090268 rect_set_x 8009026C rect_set_x
8009027C rect_set_width 80090280 rect_set_width
80090284 pageloop 80090288 pageloop
800902B8 rect_copy_scratch_to_ram 800902BC rect_copy_scratch_to_ram
800902E4 rect_scratch_connect 800902E8 rect_scratch_connect
80090338 cpu2vram_cmd_loop 8009033C cpu2vram_cmd_loop
800903A4 copy_char_data_start 800903A8 copy_char_data_start
800903C0 copy_char_data_loop 800903C4 copy_char_data_loop
800903E8 set_flush_cache_cmd 800903EC set_flush_cache_cmd
800903F8 cpu2vram_dma_link 800903FC cpu2vram_dma_link
80090454 chunk_making_end 80090458 chunk_making_end
80090470 textend 80090474 textend
8009048C pagetloop 80090490 pagetloop
8009051C make_char_line_in_scratch 80090524 make_char_line_in_scratch
80090538 char_data_clear 80090540 char_data_clear
80090544 char_data_loop 8009054C char_data_loop
80090570 chars_font_loop 80090578 chars_font_loop
80090598 char_lines_loop 800905A0 char_lines_loop
800905A8 its_not_empty 800905B0 its_not_empty
80090638 not_last 80090640 not_last
80090644 divideby4 8009064C divideby4
80090644 zero_jump 8009064C zero_jump
80090654 spacejump 8009065C spacejump
80090670 sprite_end 80090678 sprite_end
80090688 make_shadow 80090690 make_shadow
800906AC shadow_row_loop 800906B4 shadow_row_loop
800906B0 shadow_sprites_loop 800906B8 shadow_sprites_loop
800906C0 shadow_pixel_loop 800906C8 shadow_pixel_loop
8009071C normal_case 80090724 normal_case
80090740 no_s 80090748 no_s
8009076C notshadow 80090774 notshadow
80090780 returncharsinstring 80090788 returncharsinstring
8009079C ismy1bytestring 800907A4 ismy1bytestring
800907B8 notand1 800907C0 notand1
800907C8 getnewchar 800907D0 getnewchar
800907CC startreading 800907D4 startreading
800907E8 calcnextxcustom 800907F0 calcnextxcustom
80090810 japoldtext 80090818 japoldtext
80090818 ihavestringlength 80090820 ihavestringlength
80090830 retuncharstocity 80090838 retuncharstocity
8009084C ismy1bytecity 80090854 ismy1bytecity
80090860 retuncharstocitydiv2 80090868 retuncharstocitydiv2
8009087C ismy1bytecitydiv2 80090884 ismy1bytecitydiv2
80090898 notand1_2 800908A0 notand1_2
 

File diff suppressed because it is too large Load Diff

View File

@@ -29,9 +29,9 @@
ExternalPrint: ExternalPrint:
;;;;;;;text routing test routine ;;;;;;;text routing test routine
; move r3,s3 ; move r3,s3
; move s3,r4 ; move s3,a0
lhu v0,0x0(a0) ;read half 2 bytes of text (r4, not s1+0c!!!!!) lhu v0,0x0(a0) ;read half 2 bytes of text (a0, not s1+0c!!!!!)
nop nop
; move s3,r3 ; move s3,r3
srl v1,v0,0xD ;;;;Check 13th bit (1byte system !!!) srl v1,v0,0xD ;;;;Check 13th bit (1byte system !!!)
@@ -44,11 +44,11 @@ ExternalPrint:
MyPrintLineRoutine: MyPrintLineRoutine:
addiu sp,sp,-0x50 addiu sp,sp,-0x50
sw s4,0x38(sp) sw s4,0x38(sp)
move s4,r4 ;textReadAddr - S4 (NOT S6!) move s4,a0 ;textReadAddr - S4 (NOT S6!)
sw s0,0x28(sp) sw s0,0x28(sp)
move s0,r5 move s0,a1
sw s1,0x2c(sp) sw s1,0x2c(sp)
move s1,r6 move s1,a2
sw s3,0x34(sp) sw s3,0x34(sp)
; NEW COMMAND OBRAB ; NEW COMMAND OBRAB
@@ -71,13 +71,13 @@ MyPrintLineRoutine:
ori t0,t0,0xffff ;t0 = 00FFFFFF ori t0,t0,0xffff ;t0 = 00FFFFFF
;sw s0, 0x28(sp) ;save s0 in stack ;sw s0, 0x28(sp) ;save s0 in stack
andi r4,r7,0xff ;s0 - cut textMode (color & shadow) andi a0,a3,0xff ;s0 - cut textMode (color & shadow)
lui r7, 0x8008 ;r7 = 8008 0000 lui a3, 0x8008 ;a3 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000 lui a2, 0xff00 ;a2 = FF000000
addiu t1,r7,-0x31a8 ;t1 = 8007b6d0 - new free CHAIN Here addiu t1,a3,-0x31a8 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x31a8(r7) ;r3/v1 = load freeChain lw v1, -0x31a8(a3) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5 lbu a1,0x60(sp) ;shadow flag from stack to a1
lui v0,0x8000 ;r2 = 8000 0000 lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x48(sp) sw ra,0x48(sp)
sw s7,0x44(sp) sw s7,0x44(sp)
@@ -86,32 +86,32 @@ MyPrintLineRoutine:
sw s2,0x30(sp) sw s2,0x30(sp)
;;init chains ;;init chains
and r6,v1,r6 ;r6 = r3 & ff000000 = FF000000 and a2,v1,a2 ;a2 = r3 & ff000000 = FF000000
andi r5,r5,0xff ;clean text mode (color/shadow) andi a1,a1,0xff ;clean text mode (color/shadow)
and v1,v1,t0 ;r3 & 00ffffff and v1,v1,t0 ;r3 & 00ffffff
or s5,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr or s5,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(s5) ;r3 = next free Chain lw v1,0x0(s5) ;r3 = next free Chain
addiu v0,v0,-0x1 ;DMA Counter-1 addiu v0,v0,-0x1 ;DMA Counter-1
and v1,v1,t0 ; r3 & r8 (00ffffff) cut f.byte and v1,v1,t0 ; r3 & r8 (00ffffff) cut f.byte
or r6,r6,v1 ; r6 | r3 = ff+r3 = next free Chain (FF...) + or a2,a2,v1 ; a2 | r3 = ff+r3 = next free Chain (FF...) +
sw v0,0x4(t1) ;save DMACounter sw v0,0x4(t1) ;save DMACounter
jal storeColor jal storeColor
sw r6,-0x31a8(r7) ;SAVE next free Chain (FF...) to 7b6d0 sw a2,-0x31a8(a3) ;SAVE next free Chain (FF...) to 7b6d0
move r4,s5 ;currentChainAddr move a0,s5 ;currentChainAddr
sll r5,s0,0x10 ;r5 = X<<10h (003A0000) sll a1,s0,0x10 ;a1 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A sra a1,a1,0x10 ; a1=a1>>10h 0000003A
sll r6,s1,0x10 ; r6 = Y << 10h sll a2,s1,0x10 ; a2 = Y << 10h
jal initCopyCharChain ;init line chains jal initCopyCharChain ;init line chains
sra r6,r6,0x10 ;r6>>10h - 100% clean coords sra a2,a2,0x10 ;a2>>10h - 100% clean coords
;move r7,s0 ;store textMode _THIS IS FOR INIT ;move a3,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad ;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM ;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r6,0x1f80 lui a2,0x1f80
ori r6,r6,0x348 ;r7 = FIRST CHAR START ori a2,a2,0x348 ;a3 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!! ;lui a2,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c ;ori a2,a2,0x38c
;4bit table pattern ;4bit table pattern
@@ -121,8 +121,8 @@ MyPrintLineRoutine:
li v0,0x2 li v0,0x2
sh v0,0x1c(sp) sh v0,0x1c(sp)
li v0,0xc li v0,0xc
li r4,0x10 ;COMMANDS IN CHAR FORMING CHAIN? li a0,0x10 ;COMMANDS IN CHAR FORMING CHAIN?
lui r3,0xa000 ;r4 = a000 0000 lui r3,0xa000 ;a0 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
@@ -130,8 +130,8 @@ MyPrintLineRoutine:
; INIT CHAR ; INIT CHAR
lui v0,0x100 ;FLUSH CACHE 01 00 00 00 =>DAT_1f80034b lui v0,0x100 ;FLUSH CACHE 01 00 00 00 =>DAT_1f80034b
sb r4,0x3(r6) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\ sb a0,0x3(a2) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r3,0x4(r6); SAVE a000000 TO DAT_1f80034c sw r3,0x4(a2); SAVE a000000 TO DAT_1f80034c
lui at,0x1f80 ;scrathcpadStart lui at,0x1f80 ;scrathcpadStart
@@ -144,7 +144,7 @@ MyPrintLineRoutine:
li v0,0x64 li v0,0x64
sb v0,0x7(s3) ;sb 64 to 3d7 (copySpriteCommand) sb v0,0x7(s3) ;sb 64 to 3d7 (copySpriteCommand)
lhu r4,0x98(gp) ;0310 ;Load x(0310) to r8 lhu a0,0x98(gp) ;0310 ;Load x(0310) to r8
lhu r3,0x9a(gp) ;01f0 ;Load y(01F0)to r2 lhu r3,0x9a(gp) ;01f0 ;Load y(01F0)to r2
;lui v1,0x100 ;0100 0000 flushcache ;lui v1,0x100 ;0100 0000 flushcache
@@ -159,27 +159,27 @@ setY1:
lw v0,0x1c(sp) ; r2 = 000c0002 from stack lw v0,0x1c(sp) ; r2 = 000c0002 from stack
lh r7,0x98(gp) ;for futher sprite X calc lh a3,0x98(gp) ;for futher sprite X calc
sh r4,0x18(sp) sh a0,0x18(sp)
sh r3,0x1a(sp) ;SAVE CONCAT 013001f0 to stack sh r3,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack lw a0,0x18(sp) ;LOAD 013001f0 from stack
;lw v1,0x18(sp) ;lw v1,0x18(sp)
move t0,r7 move t0,a3
sw r4,0x8(r6) ;DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA) sw a0,0x8(a2) ;DAT_1f800350 load a0 (upper coord 01f6) to a3+8 (DMA)
sw v0,0xc(r6) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c) sw v0,0xc(a2) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to a3+0c)
bgez r7,LAB_800194fc bgez a3,LAB_800194fc
SetX1: SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!! sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r7,0x3f addiu t0,a3,0x3f
LAB_800194fc: ;decoding coords for source sprite LAB_800194fc: ;decoding coords for source sprite
sra v0,t0,0x6 ;r2 = r6 >> 6 = 4 sra v0,t0,0x6 ;r2 = a2 >> 6 = 4
sll v0,v0,0x6 ;r2 << 6 = 100 sll v0,v0,0x6 ;r2 << 6 = 100
subu v0,r7,v0 ;r2 = r6 - r2 = 30 subu v0,a3,v0 ;r2 = a2 - r2 = 30
lh v1,0x9a(gp) ;r3 = load Y half from mem lh v1,0x9a(gp) ;r3 = load Y half from mem
sll v0,v0,0x2 ;r2 << 2 sll v0,v0,0x2 ;r2 << 2
sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE CHAR SPRITE X BYTE sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE CHAR SPRITE X BYTE
@@ -208,7 +208,7 @@ LAB_80019520:
lbu r4,0x0(s4) ;MAIN READ CHAR COMMAND - Load Byte Unsigned lbu a0,0x0(s4) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop nop
addiu s4,s4,0x1 ;Shift read address +1 byte addiu s4,s4,0x1 ;Shift read address +1 byte
@@ -220,12 +220,12 @@ LAB_80019520:
ori s0,s0,0xffff ;s0 = 00 ff ff ff ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s1,0x8000 ;r3 = 8000 0000 lui s1,0x8000 ;r3 = 8000 0000
NextChar: NextChar:
addiu r4,r4,-0x20 ;Shift unprintable symbols addiu a0,a0,-0x20 ;Shift unprintable symbols
;ОБРАБОТКА ПРОБЕЛОВ ;ОБРАБОТКА ПРОБЕЛОВ
bne r4,zero,SpaceCheckBranch ;Если не пробел - перепрыгиваем сразу bne a0,zero,SpaceCheckBranch ;Если не пробел - перепрыгиваем сразу
nop nop
lui t2,MyAddr lui t2,MyAddr
@@ -240,7 +240,7 @@ NextChar:
;ITS A SPACE!!!! ;ITS A SPACE!!!!
sh v0,-0xE(t2) ;Save charcount += 1 sh v0,-0xE(t2) ;Save charcount += 1
nop nop
lbu r4,0x0(s4) ;LOAD NEXT CHAR lbu a0,0x0(s4) ;LOAD NEXT CHAR
;j SpaceJump ;j SpaceJump
;X COORD SHIFT (+6) ;X COORD SHIFT (+6)
@@ -287,16 +287,16 @@ PageLoop:
;MAKING COPYSPRITE CHAIN ;MAKING COPYSPRITE CHAIN
lw v0,-0x3198(s6); r2 = *freeChainAddr lw v0,-0x3198(s6); r2 = *freeChainAddr
nop nop
and r4,v0,t2 ; r4 = r2 & ff00.. and a0,v0,t2 ; a0 = r2 & ff00..
and v0,v0,s0 ; r2 & 00FFFFFF and v0,v0,s0 ; r2 & 00FFFFFF
or r5,v0,s1 ; r5 = r2 or r23 (80000000) = 801ADF10 or a1,v0,s1 ; a1 = r2 or r23 (80000000) = 801ADF10
lw v0,0x4(s7) ; CmdCounter r2 = *7b6d0+4 = 705 lw v0,0x4(s7) ; CmdCounter r2 = *7b6d0+4 = 705
lw v1,0x0(r5) ; r3 = New Free ChainAddr lw v1,0x0(a1) ; r3 = New Free ChainAddr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut begin byte and v1,v1,s0 ; r3 & 00FFFFFF cut begin byte
or r4,r4,v1 ; r4 & r3 = ff...... or a0,a0,v1 ; a0 & r3 = ff......
sw v0,0x4(s7) ; CmdCounter save DMA Counter sw v0,0x4(s7) ; CmdCounter save DMA Counter
sw r4,-0x3198(s6); freeChain save new freeChain sw a0,-0x3198(s6); freeChain save new freeChain
CopyCmdFromScratch: CopyCmdFromScratch:
; CopyScriptChain copy from scratch ; CopyScriptChain copy from scratch
@@ -304,35 +304,35 @@ CopyCmdFromScratch:
lw t7,0x4(s3) ;>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd lw t7,0x4(s3) ;>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd
lw t8,0x8(s3) ;>DAT_1f8003d8 r24 = 001500d1 - xy screen coords lw t8,0x8(s3) ;>DAT_1f8003d8 r24 = 001500d1 - xy screen coords
lw t5,0xc(s3); >DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page) lw t5,0xc(s3); >DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page)
sw t9,0x0(r5) ; *r5 = r14 sw t9,0x0(a1) ; *a1 = r14
sw t7,0x4(r5) ; *r5+4 = r15 sw t7,0x4(a1) ; *a1+4 = r15
sw t8,0x8(r5) ; *r5+8 = r24 sw t8,0x8(a1) ; *a1+8 = r24
sw t5,0xc(r5) ; *r5+c = r13 sw t5,0xc(a1) ; *a1+c = r13
lw t9,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy lw t9,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop nop
sw t9,0x10(r5) ; *r5+10 = r14 - LAST COMMAND SAVE sw t9,0x10(a1) ; *a1+10 = r14 - LAST COMMAND SAVE
; t1 = t0 (small) !!!! ; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!! ; t4 = t1 (small) !!!!
lw v1,0x18(t1) ;r3 = *r9+18 (next param???) lw v1,0x18(t1) ;r3 = *r9+18 (next param???)
lw v0,0x0(r5) ; r2 = *cur New Chainaddr lw v0,0x0(a1) ; r2 = *cur New Chainaddr
lw v1,0x0(v1) ; r3 = *r3 lw v1,0x0(v1) ; r3 = *r3
and v0,v0,t2 ; r2 & ff000000 and v0,v0,t2 ; r2 & ff000000
and v1,v1,s0 ;r3 & 00FFFFFF and v1,v1,s0 ;r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 04FFFFFF - commands with FFFFFF or v0,v0,v1 ; r2 | r3 = 04FFFFFF - commands with FFFFFF
sw v0,0x0(r5) ; *curChainAddr r5 = r2 (upd ..04 with ..FF04) sw v0,0x0(a1) ; *curChainAddr a1 = r2 (upd ..04 with ..FF04)
lw r4,0x18(t1) ; r4 = *r8+18 (first chain addr?) lw a0,0x18(t1) ; a0 = *r8+18 (first chain addr?)
nop nop
lw v0,0x0(r4) ; r2 = *r4 FIRST CHAIN LINK TO NEXT?? lw v0,0x0(a0) ; r2 = *a0 FIRST CHAIN LINK TO NEXT??
and v1,r5,s0 ; r3 = r5 (cur chain) & 00FFFFFF and v1,a1,s0 ; r3 = a1 (cur chain) & 00FFFFFF
and v0,v0,t2 ; r2 & FF000000 and v0,v0,t2 ; r2 & FF000000
or v0,v0,v1 ; r2 | r3 = last chain adr w 10&.... or v0,v0,v1 ; r2 | r3 = last chain adr w 10&....
sw v0,0x0(r4) ; *r4 = r2 FIRST CHAIN NEXT ADDR??? sw v0,0x0(a0) ; *a0 = r2 FIRST CHAIN NEXT ADDR???
sw r5,0x18(t1) ;t0->t1 ; r5 = *r8+18 curChainAddr sw a1,0x18(t1) ;t0->t1 ; a1 = *r8+18 curChainAddr
lhu v0,0x4(t6) ;t1->t6 r2 = half (DMA params)+4 (charCounter) lhu v0,0x4(t6) ;t1->t6 r2 = half (DMA params)+4 (charCounter)
nop nop
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto... bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
nop ;clear t0 nop ;clear t0
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = Set first Char Chain sw a1,0x28(t1) ;t0->t1 ;*curChain+28 = Set first Char Chain
sw t8,0xc(t6) ;t1->t6 ; Params+0c = save STORE COORDS to params sw t8,0xc(t6) ;t1->t6 ; Params+0c = save STORE COORDS to params
;sh s2,0xe(t4) ;t1->t6 ;Params+0e = save half Y ;sh s2,0xe(t4) ;t1->t6 ;Params+0e = save half Y
NotFirstChar: NotFirstChar:
@@ -341,26 +341,26 @@ NotFirstChar:
; ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr ; ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6 lui a1,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
lw v0,-0x31a8(t3);>8007b6d0_freeChain r2 = *nextFreeChain lw v0,-0x31a8(t3);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData ori a1,a1,0x348 ; a1 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000 FFNEXTCHAIN and a0,v0,t2 ; a0 = r2 & FF000000 FFNEXTCHAIN
and v0,v0,s0 ; r2 & 00FFFFFF = 00XTCHAN and v0,v0,s0 ; r2 & 00FFFFFF = 00XTCHAN
or r7,v0,s1 ;or (800...) ; r7 = r2 | r12 = nextChain & 80... or a3,v0,s1 ;or (800...) ; a3 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain) move a2,a3 ; a2 = a3 (nextChain)
lw v0,0x4(t4) ; CmdCounter r2 = DMA Counter lw v0,0x4(t4) ; CmdCounter r2 = DMA Counter
lw v1,0x0(r7) ; r3 = New Free ChainAddr / currHeader Addr lw v1,0x0(a3) ; r3 = New Free ChainAddr / currHeader Addr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 80.... commandCount / currHeader and v1,v1,s0 ; r3 & 80.... commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff...... or a0,a0,v1 ; a0 & r3 = ff......
sw v0,0x4(t4);>DAT_8007b6d4_CmdCounter save DMA Counter sw v0,0x4(t4);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4) andi v0,a3,0x3 ; r2 = a3 & 3 (check destAddr MOD 4)
sw r4,-0x31a8(t3);>8007b6d0_freeChain save new freeChain sw a0,-0x31a8(t3);>8007b6d0_freeChain save new freeChain
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch beq v0,zero,Copy16Bytes ; if a3 MOD 4 = 0 then Branch
addiu v0,r5,0x40 ;T3 = 388! addiu v0,a1,0x40 ;T3 = 388!
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain ;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
@@ -369,45 +369,45 @@ NotFirstChar:
CopyBy2Bytes: CopyBy2Bytes:
lwl t9,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта lwl t9,0x3(a1) ; if a3 mod4 <> 0 - копируем по 2 байта
lwr t9,0x0(r5);>DAT_1f800348 lwr t9,0x0(a1);>DAT_1f800348
lwl t7,0x7(r5) lwl t7,0x7(a1)
lwr t7,0x4(r5);>DAT_1f80034c lwr t7,0x4(a1);>DAT_1f80034c
lwl t8,0xb(r5) lwl t8,0xb(a1)
lwr t8,0x8(r5);>DAT_1f800350 lwr t8,0x8(a1);>DAT_1f800350
lwl t5,0xf(r5) lwl t5,0xf(a1)
lwr t5,0xc(r5);>DAT_1f800354 lwr t5,0xc(a1);>DAT_1f800354
swl t9,0x3(r6) swl t9,0x3(a2)
swr t9,0x0(r6) swr t9,0x0(a2)
swl t7,0x7(r6) swl t7,0x7(a2)
swr t7,0x4(r6) swr t7,0x4(a2)
swl t8,0xb(r6) swl t8,0xb(a2)
swr t8,0x8(r6) swr t8,0x8(a2)
swl t5,0xf(r6) swl t5,0xf(a2)
swr t5,0xc(r6) swr t5,0xc(a2)
addiu r5,r5,0x10 addiu a1,a1,0x10
bne r5,v0,CopyBy2Bytes bne a1,v0,CopyBy2Bytes
addiu r6,r6,0x10 addiu a2,a2,0x10
j last4BytesCopy j last4BytesCopy
nop nop
Copy16Bytes: Copy16Bytes:
lw t9,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr lw t9,0x0(a1);>DAT_1f800348 a1 - curScratchAddr,a2 -cur DMAAddr
lw t7,0x4(r5) lw t7,0x4(a1)
lw t8,0x8(r5) lw t8,0x8(a1)
lw t5,0xc(r5) lw t5,0xc(a1)
sw t9,0x0(r6) sw t9,0x0(a2)
sw t7,0x4(r6) sw t7,0x4(a2)
sw t8,0x8(r6) sw t8,0x8(a2)
sw t5,0xc(r6) sw t5,0xc(a2)
addiu r5,r5,0x10 addiu a1,a1,0x10
bne r5,v0,Copy16Bytes bne a1,v0,Copy16Bytes
addiu r6,r6,0x10 addiu a2,a2,0x10
last4BytesCopy: last4BytesCopy:
lwl t9,0x3(r5) ; r14 left = 2 bytes from *r5+3 lwl t9,0x3(a1) ; r14 left = 2 bytes from *a1+3
lwr t9,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5 lwr t9,0x0(a1);>DAT_1f800358 r14 right = 2 bytes from *a1
nop nop
swl t9,0x3(r6) ; *r6 = r14 left swl t9,0x3(a2) ; *a2 = r14 left
swr t9,0x0(r6) ; *r6+3 = r14 right swr t9,0x0(a2) ; *a2+3 = r14 right
; linking DMA char+copysprite ; linking DMA char+copysprite
@@ -416,22 +416,22 @@ last4BytesCopy:
; t1 (smallSRC) = t6 (HERE) !!!! ;r9 = r14 !!!!!!!!!!!! ; t1 (smallSRC) = t6 (HERE) !!!! ;r9 = r14 !!!!!!!!!!!!
lw v1,0x18(t1) ; r3 = current DMACopySprite Chain lw v1,0x18(t1) ; r3 = current DMACopySprite Chain
lw v0,0x0(r7) ; r2 = current CharChainCommands lw v0,0x0(a3) ; r2 = current CharChainCommands
lw v1,0x0(v1) ; r3 = *r3 (comNum+FFFFFF(nextLink)) lw v1,0x0(v1) ; r3 = *r3 (comNum+FFFFFF(nextLink))
and v0,v0,t2 ; r2 & FF..... and v0,v0,t2 ; r2 & FF.....
and v1,v1,s0 ; r3 & 00FFFFFF and v1,v1,s0 ; r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 10FFFFFF(cmdNum&FF..) or v0,v0,v1 ; r2 | r3 = 10FFFFFF(cmdNum&FF..)
sw v0,0x0(r7) ; *r7 = r2 saveCurChainCmd (10FFFFFF) sw v0,0x0(a3) ; *a3 = r2 saveCurChainCmd (10FFFFFF)
lw r4,0x18(t1) ; r4 = r8+18h - cur CopySpriteCmd hdrAddr lw a0,0x18(t1) ; a0 = r8+18h - cur CopySpriteCmd hdrAddr
nop nop
lw v0,0x0(r4) ; r2 = *r4 (04FFFFFF) lw v0,0x0(a0) ; r2 = *a0 (04FFFFFF)
and v1,r7,s0 ; r3 = r7 & 00FFFFFF (Copying Cur Char Chain) and v1,a3,s0 ; r3 = a3 & 00FFFFFF (Copying Cur Char Chain)
and v0,v0,t2 ; r2 & FF000000 (04000000) CmdCount and v0,v0,t2 ; r2 & FF000000 (04000000) CmdCount
or v0,v0,v1 ; R2 | R3 = 04(cmd)..+CharChainAddr or v0,v0,v1 ; R2 | R3 = 04(cmd)..+CharChainAddr
sw v0,0x0(r4) ; *r4 = r2 = FullCommand With Link!!! sw v0,0x0(a0) ; *a0 = r2 = FullCommand With Link!!!
; (04..CharAddr) + SpriteCopyCommand ; (04..CharAddr) + SpriteCopyCommand
sw r7,0x18(t1) ; *r8+18 = Last Char Chain! sw a3,0x18(t1) ; *r8+18 = Last Char Chain!
addiu t1,t1,0x4 ; r8 (params) += 4 (shift params for NextPage) addiu t1,t1,0x4 ; r8 (params) += 4 (shift params for NextPage)
addiu v0,t6,0x8 ; r2 = r9+8 (shift first chain param for Page) addiu v0,t6,0x8 ; r2 = r9+8 (shift first chain param for Page)
@@ -472,7 +472,7 @@ SpaceJump:
lhu v0,-0xE(t3) ; r2 = charCount In string lhu v0,-0xE(t3) ; r2 = charCount In string
lhu v1,-0x10(t3) ; r3 = My charOverAll In string lhu v1,-0x10(t3) ; r3 = My charOverAll In string
addiu v0,v0,0x1 ; a += 1 addiu v0,v0,0x1 ; a += 1
lbu r4,0x0(s4) ; load next Char to r4 (byte) lbu a0,0x0(s4) ; load next Char to a0 (byte)
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
addiu s4,s4,0x1 ;Shift CharAddr addiu s4,s4,0x1 ;Shift CharAddr
@@ -481,38 +481,38 @@ SpaceJump:
nop nop
TextEnd: TextEnd:
clear r18 clear s2
lui s3,0x8008 lui s3,0x8008
addiu s4,s3,-0x3198 ; r19 = 80080000, r21 = 7b6d0 addiu s4,s3,-0x3198 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000 lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,s5 ; r16 = r20 (currentTLineParam) move s0,s5 ; r16 = r20 (currentTLineParam)
clear r5 clear a1
PageTLoop: ;ALMOST FINISH!!!! PageTLoop: ;ALMOST FINISH!!!!
li r6,0x1 ; r6=1 li a2,0x1 ; a2=1
addu r18,r18,r6 ; r18(Counter) += r6 addu s2,s2,a2 ; s2(Counter) += a2
lui v0,0x8000 ; r2 = 80000000 lui v0,0x8000 ; r2 = 80000000
lui r4,0xff00 ; r4 = ff00 0000 lui a0,0xff00 ; a0 = ff00 0000
lw v1,-0x3198(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0) lw v1,-0x3198(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
lw r7,0x9c(gp);>DAT_8007b234 r7 = someParam(почти DMA)gp+a4 = 34 lw a3,0x9c(gp);>DAT_8007b234 a3 = someParam(почти DMA)gp+a4 = 34
and v1,v1,s1 ; r3 & 00FFFFFF and v1,v1,s1 ; r3 & 00FFFFFF
or v1,v1,v0 ; r3 | r2 = 80..... or v1,v1,v0 ; r3 | r2 = 80.....
sw v1,0x30(s0) ; store last free ChAddr to DMAParams sw v1,0x30(s0) ; store last free ChAddr to DMAParams
lw v0,-0x3198(s3);>8007b6d0_freeChain r2 = next free chain lw v0,-0x3198(s3);>8007b6d0_freeChain r2 = next free chain
lw v1,0x0(v1) ; r3 = *r3 = last chain - made one more chain lw v1,0x0(v1) ; r3 = *r3 = last chain - made one more chain
and v0,v0,r4 ; a2 & ff000000 and v0,v0,a0 ; a2 & ff000000
and v1,v1,s1 ; r3 & 00FFFFFF and v1,v1,s1 ; r3 & 00FFFFFF
lw r4,0x4(s4);>DAT_8007b6d4_CmdCounter r4 = DMA Counter lw a0,0x4(s4);>DAT_8007b6d4_CmdCounter a0 = DMA Counter
or v0,v0,v1 ; r2 | r3 or v0,v0,v1 ; r2 | r3
sw v0,-0x3198(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0 sw v0,-0x3198(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1 addiu a0,a0,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s4);>DAT_8007b6d4_CmdCounter Store DMA Count sw a0,0x4(s4);>DAT_8007b6d4_CmdCounter Store DMA Count
lw r4,0x30(s0) ; r4 = *DMA params + 30 = Start Of DMA Chain lw a0,0x30(s0) ; a0 = *DMA params + 30 = Start Of DMA Chain
jal SetDrawTPage ; Set DRAW PAGE jal SetDrawTPage ; Set DRAW PAGE
addiu s0,s0,0x4 ; r16 += 4 - Shgift DMAParams for next Page addiu s0,s0,0x4 ; r16 += 4 - Shgift DMAParams for next Page
sltiu v0,r18,0x2 ; r2 = r18<2 sltiu v0,s2,0x2 ; r2 = s2<2
bne v0,zero,PageTLoop ; if not r2 then goto Loop bne v0,zero,PageTLoop ; if not r2 then goto Loop
clear r5 ; r5 = 0 clear a1 ; a1 = 0
move v0,s5 ; r2 = DMAParamsMain move v0,s5 ; r2 = DMAParamsMain
lw ra,0x48(sp) lw ra,0x48(sp)

View File

@@ -43,6 +43,8 @@ MyPrintLineRoutine:
sw s6, 0x40(sp) sw s6, 0x40(sp)
sw s7, 0x44(sp) sw s7, 0x44(sp)
sw s8, 0x24(sp)
move s6, a0 // Адрес чтения текста -> s6 move s6, a0 // Адрес чтения текста -> s6
move s1, a1 move s1, a1
move s2, a2 move s2, a2
@@ -75,7 +77,7 @@ MyPrintLineRoutine:
and v1, v1, t0 // v1 & 00ffffff and v1, v1, t0 // v1 & 00ffffff
or s4, v1, v0 // s5 - основной адрес свободной цепочки or s4, v1, v0 // s5 - основной адрес свободной цепочки
lw v0, 0x4(t1) // Загружаем счетчик DMA lw v0, 0x4(t1) // Загружаем счетчик DMA
lw v1, 0x0(s5) // v1 = следующая свободная цепочка lw v1, 0x0(s4) // v1 = следующий свободный адрес в цепочке
addiu v0, v0, -0x1 // Уменьшаем счетчик DMA addiu v0, v0, -0x1 // Уменьшаем счетчик DMA
and v1, v1, t0 // v1 & 00ffffff and v1, v1, t0 // v1 & 00ffffff
or a2, a2, v1 // a2 | v1 = следующая свободная цепочка or a2, a2, v1 // a2 | v1 = следующая свободная цепочка
@@ -83,7 +85,7 @@ MyPrintLineRoutine:
jal storeColor //Сохраняем цвет jal storeColor //Сохраняем цвет
sw a2, 0x0(t1) // Сохраняем следующую свободную цепочку sw a2, 0x0(t1) // Сохраняем следующую свободную цепочку
move a0, s4 // Текущий адрес цепочки move a0, s4 // Текущий адрес цепочки как параметр инициализации (a0)
sll a1, s1, 0x10 // a1 = X << 16 sll a1, s1, 0x10 // a1 = X << 16
sra a1, a1, 0x10 // a1 = X координата sra a1, a1, 0x10 // a1 = X координата
sll a2, s2, 0x10 // a2 = Y << 16 sll a2, s2, 0x10 // a2 = Y << 16
@@ -115,7 +117,7 @@ _1bppTo4bpp_table_template:
lui t8, 0x1f80 lui t8, 0x1f80
ori t8, t8, 0x390 ori t8, t8, 0x390
lui t7, 0x8001 lui t7, 0x8001
ori t7, t7, 0x3e8 ori t7, t7, 0x5fc
lw t5, 0x0(t7) lw t5, 0x0(t7)
lw t6, 0x4(t7) lw t6, 0x4(t7)
sw t5, 0x0(t8) sw t5, 0x0(t8)
@@ -144,7 +146,7 @@ rect_scratchpad_template:
sw v0, 0x4(s3) sw v0, 0x4(s3)
li v0, 0xf0c0 li v0, 0xf0c0
sh v0, 0xc(s3) // Сохраняем координаты VU (всегда f0c0) sh v0, 0xc(s3) // Сохраняем координаты VU (всегда f0c0)
lhu v1, 0x9a(gp) // Загружаем CLUT из GP (всегда 7FD3) lhu v1, 0xa0(gp) // Загружаем CLUT из GP (всегда 7FD3)
li v0, 0 li v0, 0
sw v0, 0x8(s3) //Чистим экранные координаты sw v0, 0x8(s3) //Чистим экранные координаты
@@ -459,10 +461,12 @@ PageTLoop:
bne v0, zero, PageTLoop // Если да, продолжаем цикл bne v0, zero, PageTLoop // Если да, продолжаем цикл
clear a1 // a1 = 0 clear a1 // a1 = 0
move v0, s5 // Возвращаем основные параметры DMA move v0, s4 // Возвращаем основные параметры DMA
// Восстанавливаем регистры из стека // Восстанавливаем регистры из стека
lw ra, 0x48(sp) lw ra, 0x48(sp)
lw s7, 0x44(sp) lw s7, 0x44(sp)
lw s6, 0x40(sp) lw s6, 0x40(sp)
lw s5, 0x3c(sp) lw s5, 0x3c(sp)
@@ -472,6 +476,8 @@ PageTLoop:
lw s1, 0x2c(sp) lw s1, 0x2c(sp)
lw s0, 0x28(sp) lw s0, 0x28(sp)
lw s8, 0x24(sp) //need to be saved!
jr ra // Возврат jr ra // Возврат
addiu sp, sp, 0x50 // Восстанавливаем стек addiu sp, sp, 0x50 // Восстанавливаем стек

View File

@@ -159,7 +159,7 @@ EP regs
0x98(gp) - char vram UV 0x98(gp) - char vram UV
0x9c(gp) - char texture page for setTpage 0x9c(gp) - char texture page for setTpage
0x9a(gp) - half - CLUT 0xa0(gp) - half - CLUT
b 0xa4(gp) - color b 0xa4(gp) - color
b 0xa5(gp) - shadow b 0xa5(gp) - shadow