232 lines
7.6 KiB
NASM
232 lines
7.6 KiB
NASM
###############################################################
|
|
#
|
|
# OPTIMIZED RUSSIAN TEXT
|
|
#
|
|
#
|
|
|
|
|
|
|
|
# Coords XY init
|
|
lui t2,MyAddr
|
|
|
|
addiu v0,r4,-0xa0 #shift char code for A is 0
|
|
sll v0,2 #charcode * 4
|
|
ori v1,r17,0xf900 #current char params start
|
|
|
|
addu v0,v0,v1 # shift to current char params addr
|
|
lw t7,0x0(v0) #t7 = CURRENT CHAR PARAMS load
|
|
|
|
addiu t8,t2,-0x500 #dest temp scratch addr 8008fb00
|
|
clear r18
|
|
|
|
|
|
|
|
lh v1,-0xE(t2) #Load my temp CHAR COUNTER for check
|
|
lhu t5,0x20(sp) # r13 = ld half (sp+20) = 003A ---X from sp+20
|
|
|
|
sll t6,v1,0x1 #t6 = charcount*2
|
|
addu v1,t6,v1 #v1 = t6+v1 = charcount * 3
|
|
sll v1,0x1 #v1 * 2 = charcount * 6
|
|
addu v0,v1,t5 #v0 = INIT X + CURCHAR * 6
|
|
|
|
sh v0,0x8(s3) #DAT_1f8003d8 save r2 half to 1f8003d8 = X (3A) !!!!!!!!!!!!!!!!
|
|
#SaveYinScratch:
|
|
sh s8,0xa(s3) # DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
|
|
|
|
|
|
#lw t5,0x0(s3) #copying COMMAND 00 00 00 04
|
|
#nop
|
|
lui t5,0x400 #load 4 commands in command
|
|
nop
|
|
sw t5,0x0(t8) #paste to tempChain...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
add5command:
|
|
lui t5, 0x0500 # 'its 5 commands'
|
|
sw t5,0x0(t8) #paste...
|
|
lui t6, 0xe100#################################
|
|
ori t6,0x023f #e100023f - TextPage = interfaceTim - BEFORE LAST COMMAND
|
|
sw t6,0x4(t8) #paste...
|
|
addiu t8, 0x4 #SHIFT temp DMA addr +4 (After TexPage)
|
|
|
|
|
|
|
|
|
|
IsRusChar:
|
|
|
|
lw t6,0x4(s3) #copying COMMAND 80 80 80 64
|
|
nop
|
|
sw t6,0x4(t8) #paste...
|
|
|
|
#######################DEST X AND Y HERE@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
lh t5,0x8(s3) #DEST X HERE
|
|
nop # Need to recalculate X
|
|
addiu t5, 0x1 #right 1 pixel >
|
|
sh t5,0x8(t8) #paste DEST X
|
|
|
|
|
|
lh t6,0xA(s3) #load dest Y
|
|
sra v1, t7, 24 ##>> SHIFT 24 bits = Y vertical offset
|
|
addu t6,t6,v1 #shift dest y
|
|
#addiu t6,0x2
|
|
sh t6,0xA(t8) #save dest y
|
|
|
|
|
|
Ori v1,v1,0x10 #Concat X offs (1<< ) and Y vertical offset - 0x1(2)?
|
|
sb v1,-0x8(t2) #Store coords to temp
|
|
|
|
|
|
|
|
li v1, 0xffff
|
|
and v0, t7, v1 #truncate SRC (FFFF) coords from myTable
|
|
sh v0,0xc(t8) #Saving source coords to chain
|
|
|
|
|
|
|
|
lbu v0, 0xac(gp) #load color
|
|
li v1, 0x3d #initial CLUT X
|
|
addiu v0,-0x1 # color-1
|
|
sra v0, 1 # color /2
|
|
addiu v0, 0x1b0 #vertical color shift in VRAM
|
|
sll v0, 6 #vertical shift << 6 bits
|
|
or t6,v0,V1 # vertical<<6 & horis = CLUT
|
|
|
|
|
|
|
|
sh t6,0xe(t8) #save clut
|
|
|
|
li v1,0xff
|
|
li t5,6
|
|
sh t5,0x10(t8) #paste...
|
|
sra v0, t7, 16 #>> shift by 16 bit right
|
|
and t5, v0, v1 #truncate (AND FF)
|
|
|
|
#NEED TO MAKE DEST SIZE IN T5
|
|
sh t5,0x12(t8) #paste...
|
|
|
|
|
|
|
|
clear t6
|
|
sw t6,0x14(t8)############################################
|
|
|
|
#Fixing text coords
|
|
|
|
#lw t7,0x8(t8) #LOAD X,Y TO T7 FOR STORE IN PARAMS!!
|
|
lw t7,0x8(s3) #LOAD ORIGINAL X,Y TO T7 FOR STORE IN PARAMS!!
|
|
nop
|
|
|
|
|
|
|
|
#MAIN COMMAND PAGELOOP INIT
|
|
move t4,r20 # r12 = r20 (params)
|
|
move t1,r20 # r12 = r20 (params again)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PageLoop2:
|
|
|
|
lui t2,0xff00 # r10 = ld upper ff00 = ff000000 #DECREASE COUNTER & GET CHAIN ADDR
|
|
lw v0,-0x4930(s1)# r2 = *freeChainAddr
|
|
nop
|
|
and r4,v0,t2 # r4 = r2 & ff00..
|
|
and v0,v0,s0 # r2 & 00FFFFFF
|
|
or r5,v0,s7 # r5 = r2 or r23 (80000000) = 801ADF10
|
|
lw v0,0x4(s5) # CmdCounter r2 = *7b6d0+4 = 705
|
|
lw v1,0x0(r5) # r3 = Next Free ChainAddr
|
|
addiu v0,v0,-0x1 # r2 -= 1 Counter Down
|
|
and v1,v1,s0 # r3 & 00FFFFFF cut begin byte
|
|
or r4,r4,v1 # r4 & r3 = ff......
|
|
sw v0,0x4(s5) # CmdCounter save DMA Counter
|
|
sw r4,-0x4930(s1)# freeChain save new freeChain
|
|
|
|
|
|
lui t8,0x8009
|
|
addiu t8,t8,-0x500 #reset temp dma to 8008fb00
|
|
CopyCmdFromTemp:
|
|
lw t5,0x0(t8) #copying chain (comand count)
|
|
lw t6,0x4(t8) #copying (comand id)
|
|
sw t5,0x0(r5) #paste...
|
|
sw t6,0x4(r5) #paste...
|
|
lw t5,0x8(t8) #copying chain (YyyyXxxx)
|
|
lw t6,0xc(t8) #copying (clutYyXx) #COPYING FROM TEMP TO MAIN CHAIN
|
|
sw t5,0x8(r5) #paste...
|
|
sw t6,0xc(r5) #paste...
|
|
lw t5,0x10(t8) #copying chain (SizeYSizeX)
|
|
lw t6,0x14(t8) #copying (TexPage command???)
|
|
sw t5,0x10(r5) #paste...
|
|
sw t6,0x14(r5) #paste...
|
|
|
|
#need to make TexPage on First letter!
|
|
|
|
lhu v0,0x4(t4) #t1->t4 r2 = half (DMA params)+4 (charCounter)
|
|
nop
|
|
bne v0,zero,NotFirstCharForLastCommand # if CharCount<>0 then Goto...
|
|
nop
|
|
lui v0,0x0600 #6 COMMANDS! ON FIRST LETTER
|
|
sw v0,0x0(r5)
|
|
lui t5, 0xe100
|
|
ori t5, 0x0234
|
|
sw t5,0x018(r5) #store sixth command e100000234
|
|
|
|
|
|
NotFirstCharForLastCommand:
|
|
|
|
#OR SHIFTED COMMAND
|
|
|
|
#NEED TO COPY XY TO T8 TO COPY TO PARAMS!!!!
|
|
#lw t8,0x8(t8)
|
|
|
|
###
|
|
lw v1,0x18(t1) #r3 = *r9+18 (next param???)
|
|
lw v0,0x0(r5) # r2 = *cur New Chainaddr
|
|
lw v1,0x0(v1) # r3 = *r3
|
|
and v0,v0,t2 # r2 & ff000000
|
|
and v1,v1,s0 #r3 & 00FFFFFF
|
|
or v0,v0,v1 # r2 | r3 = 04FFFFFF - commands with FFFFFF
|
|
sw v0,0x0(r5) # *curChainAddr r5 = r2 (upd ..04 with ..FF04)
|
|
lw r4,0x18(t1) # r4 = *r8+18 (first chain addr?)
|
|
nop
|
|
lw v0,0x0(r4) # r2 = *r4 FIRST CHAIN LINK TO NEXT??
|
|
and v1,r5,s0 # r3 = r5 (cur chain) & 00FFFFFF
|
|
and v0,v0,t2 # r2 & FF000000
|
|
or v0,v0,v1 # r2 | r3 = last chain adr w 10&....
|
|
sw v0,0x0(r4) # *r4 = r2 FIRST CHAIN NEXT ADDR???
|
|
|
|
sw r5,0x18(t1) #t0->t1 # r5 = *r8+18 curChainAddr
|
|
lhu v0,0x4(t4) #t1->t4 r2 = half (DMA params)+4 (charCounter)
|
|
nop
|
|
bne v0,zero,NotFirstChar2 # if CharCount<>0 then Goto...
|
|
nop
|
|
lui t2,MyAddr
|
|
lb v0,-0x8(t2) #load offset coords from temp
|
|
nop
|
|
sb v0,0x3c(r20) #store first char offset for moving string (is first in new type)
|
|
#andi v0, 0xF #V0 and F = Y offset
|
|
|
|
|
|
|
|
sw r5,0x28(t1) #t0->t1 #*curChain+28 = currentChainAddr
|
|
sw t7,0xc(t4) #t1->t4 # Params+0c = save word X+Y STORE COORDS T7!!!!!
|
|
|
|
|
|
|
|
|
|
NotFirstChar2:
|
|
|
|
addiu t1,t1,0x4 # r8 (params) += 4 (shift params for NextPage)
|
|
addiu v0,t4,0x8 # r2 = r9+8 (shift first chain param for Page)
|
|
sltu v0,t1,v0 # r2 = r8 < r2(r9+8) (first page pass)
|
|
bne v0,zero,PageLoop2 # if r2<>0 (r8<r2) then goto Next Page Loop
|
|
nop
|
|
|
|
j OptimizedSpriteCopyEnd
|
|
nop |