Files
Persona2-PSX-asm-sources/1_IS/_OLD_main_spritecopy.asm
2025-11-04 23:06:09 +05:00

234 lines
8.1 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

###############################################################
#
# OPTIMIZED RUSSIAN TEXT
#
#
# Это была славная попытка оптимизации русского текста (на манер Gemini), но она провалилась, так как под все возможные алфавиты просто нет места в видеопамяти
# Зато мы научились писать команды копирования спрайтов и кодировать координаты vram и clut
# 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