Порядок в каталогах
This commit is contained in:
BIN
2_EP/BIN/0681.bin
Normal file
BIN
2_EP/BIN/0681.bin
Normal file
Binary file not shown.
BIN
2_EP/BIN/F0681.BIN
Normal file
BIN
2_EP/BIN/F0681.BIN
Normal file
Binary file not shown.
BIN
2_EP/BIN/SLPS_028.25
Normal file
BIN
2_EP/BIN/SLPS_028.25
Normal file
Binary file not shown.
76
2_EP/EP_TITLE_WINDOW_TEXT_PRINT.asm
Normal file
76
2_EP/EP_TITLE_WINDOW_TEXT_PRINT.asm
Normal file
@@ -0,0 +1,76 @@
|
||||
;//////////////////////////////////////////////////////
|
||||
;// ETERNAL PUNISHMENT TITLE CODE PATCH
|
||||
|
||||
|
||||
.psx
|
||||
|
||||
.open "2_EP/BIN/0681.BIN", 0x800AB000
|
||||
|
||||
.org 0x800b5300
|
||||
.area 0xFC,0
|
||||
|
||||
|
||||
|
||||
lhu v0,0x0(s0)
|
||||
move r4,s0 ;loading text addr to r4
|
||||
|
||||
andi v0,0xff ;clear text length
|
||||
|
||||
addu s0,s0,v0 ;move text addr + charLen
|
||||
addiu s0,2 ;move text addr +2 (code)
|
||||
andi v0,v0,1
|
||||
beq v0,zero,notAnd1
|
||||
nop
|
||||
addiu s0,s0,1 ; make text addr odd (next line/code)
|
||||
notAnd1:
|
||||
|
||||
andi r5,s3,0xffff ;load X
|
||||
andi r6,s1,0xffff ;load Y
|
||||
li r7, 1 ;white color
|
||||
jal 0x80090000 ;call print text
|
||||
sw r7,0x10(sp) ;store shadow ON in stack+10
|
||||
|
||||
lui v1,0x800c
|
||||
sw v0,-0x6f8c(v1) ;=>DAT_TITLE__800b9074 ;save DMAParams Addr???
|
||||
lhu v1,0x0(s0) ;load next codes
|
||||
li v0,0x1103 ;end text code
|
||||
beq v1,v0,textdone ;this is end of text
|
||||
addiu s0,s0,2 ;move en
|
||||
addiu s1,s1,0xe ; Y = Y + 14
|
||||
|
||||
|
||||
nextLine:
|
||||
lhu v0,0x0(s0)
|
||||
|
||||
|
||||
|
||||
move r4,s0 ;loading text addr to r4
|
||||
andi v0,0xff ;clear text length
|
||||
|
||||
addu s0,s0,v0 ;move text addr + charLen
|
||||
addiu s0,2 ;move text addr +2 (code)
|
||||
andi v0,v0,1
|
||||
beq v0,zero,notAnd1_2
|
||||
nop
|
||||
addiu s0,s0,1 ; make text addr odd (next line/code)
|
||||
notAnd1_2:
|
||||
|
||||
andi r5,s3,0xffff ;load X
|
||||
andi r6,s1,0xffff ;load Y
|
||||
jal 0x80090000 ;call print text
|
||||
li r7, 1 ;white color
|
||||
lui v1,0x800c
|
||||
lw r4,-0x6f8c(v1) ;=>DAT_TITLE__800b9074 ;load DMAParams Addr???
|
||||
jal 0x8001b8d8 ; CloseTextDMA
|
||||
move r5,v0
|
||||
|
||||
lhu v0,0x0(s0)
|
||||
li v1,0x1103 ;end text code
|
||||
|
||||
addiu s0,2 ;move text addr +2 (code)
|
||||
bne v1,v0,nextLine ;this is end of text
|
||||
addiu s1,s1,0xe ; Y = Y + 14
|
||||
|
||||
textdone:
|
||||
.endarea
|
||||
.close
|
||||
49
2_EP/EP__OLD_4bitPattern.asm
Normal file
49
2_EP/EP__OLD_4bitPattern.asm
Normal file
@@ -0,0 +1,49 @@
|
||||
;4bit table pattern
|
||||
|
||||
lui v0,0x8001
|
||||
lui t9,0x1f80
|
||||
ori t9,t9,0x2e0 ;Pattern addr 1f8002e0
|
||||
addiu t8,v0,0x5fc ;r15 = 800105fc
|
||||
|
||||
lwl t5,0x3(t8)
|
||||
lwr t5,0x0(t8)
|
||||
lwl t7,0x7(t8)
|
||||
lwr t7,0x4(t8)
|
||||
|
||||
swl t5,0x3(t9)
|
||||
swr t5,0x0(t9)
|
||||
swl t7,0x7(t9)
|
||||
swr t7,0x4(t9)
|
||||
|
||||
|
||||
lwl t5,0xb(t8)
|
||||
lwr t5,0x8(t8)
|
||||
lwl t7,0xf(t8)
|
||||
lwr t7,0xc(t8)
|
||||
|
||||
swl t5,0xb(t9)
|
||||
swr t5,0x8(t9)
|
||||
swl t7,0xf(t9)
|
||||
swr t7,0xc(t9)
|
||||
|
||||
|
||||
lwl t5,0x13(t8)
|
||||
lwr t5,0x10(t8)
|
||||
lwl t7,0x17(t8)
|
||||
lwr t7,0x14(t8)
|
||||
|
||||
swl t5,0x13(t9)
|
||||
swr t5,0x10(t9)
|
||||
swl t7,0x17(t9)
|
||||
swr t7,0x14(t9)
|
||||
|
||||
|
||||
lwl t5,0x1b(t8)
|
||||
lwr t5,0x18(t8)
|
||||
lwl t7,0x1f(t8)
|
||||
lwr t7,0x1c(t8)
|
||||
|
||||
swl t5,0x1b(t9)
|
||||
swr t5,0x18(t9)
|
||||
swl t7,0x1f(t9)
|
||||
swr t7,0x1c(t9)
|
||||
89
2_EP/EP__OLD_charload.asm
Normal file
89
2_EP/EP__OLD_charload.asm
Normal file
@@ -0,0 +1,89 @@
|
||||
|
||||
; LOADING CHAR FROM CUSTOM FONT
|
||||
|
||||
makeCharPixelsCustom:
|
||||
|
||||
addiu sp,sp,-0x18
|
||||
move a1,r4
|
||||
lui r4,0x1f80
|
||||
ori r4,r4,0x358
|
||||
|
||||
sw ra,0x10(sp)
|
||||
|
||||
li a2,0x01
|
||||
|
||||
lbu t2,0xa4(gp)
|
||||
move t0,r4
|
||||
lui v1,0x801f ; ;load font addr to r3 (801ef000 + BA00)
|
||||
ori v1,v1,0xaa00 ; ==== 801faa00
|
||||
sll v0,a1,0x1 ; r2 = r5 << 1 (*2)
|
||||
addu v0,v0,a1 ; r2 += r5 (it. *3)
|
||||
sll v0,v0,0x2 ;*12 ; r2 << 2 (*4) (r2 = r5 *12)
|
||||
addu t1,v0,v1 ;t1 = char addr ; r9 = r2(offs) + r3 (start)
|
||||
;T1 = SOURCE ADDR
|
||||
li a2,0x6 ; a2 = byteslength = 6
|
||||
move v0,a2 ; r2 = a2 (counter)
|
||||
beq v0,zero,charLoaded ; if counter=0 then branch
|
||||
addiu a2,a2,-0x1 ; dec a2
|
||||
lui a3,0x1f80
|
||||
ori a3,a3,0x2e0 ; set scratch convert addr r7 = 1f8002e0
|
||||
CharLoop:
|
||||
lhu v1,0x0(t1) ;load upperhalf of char to r3
|
||||
nop
|
||||
andi r4,v1,0xf ; r4 = r3 & 0f - cutting left semibyte
|
||||
srl v1,v1,0x4 ; r3 >> 4
|
||||
andi v0,v1,0xf ; r2 = r3 & 0f
|
||||
sll v0,v0,0x1 ; r2 << 1
|
||||
addu v0,v0,a3 ; r2 = r2 + to4bitConvertTableAddr (r7)
|
||||
lhu v0,0x0(v0);>DAT_1f8002e0 r2 = *r2(half) pixel pattern
|
||||
nop
|
||||
mult v0,t2 ; r2*r10. make Color
|
||||
sll r4,r4,0x1 ; r4 << 1
|
||||
addu r4,r4,a3 ; r4 += a2 counter
|
||||
mflo a1 ; load lo to r5
|
||||
lhu v0,0x0(r4);>DAT_1f8002e0 load table+r4
|
||||
nop
|
||||
mult v0,t2 ; r2 * colorIndex r10
|
||||
srl v1,v1,0x4 ; r3 >> 4, right 4 bits
|
||||
andi r4,v1,0xf ; r4 = r3 & f0 (cut right semibyte)
|
||||
srl v1,v1,0x4 ; r3 >> 4
|
||||
sll v1,v1,0x1 ; r3 << 1 = *2
|
||||
addu v1,v1,a3 ; r3=r3+Table r7
|
||||
sll v0,a1,0x10 ; r2 = r5 << 10 bits
|
||||
mflo t4 ; load r12,low
|
||||
or v0,t4,v0 ; r2 = r12 | r2
|
||||
sw v0,0x0(t0) ; load *r8(current Scratch) from r2(result)
|
||||
lhu v0,0x0(v1);>DAT_1f8002e0 ; load r2 from TablePattern Half from r3
|
||||
nop
|
||||
mult v0,t2 ; r2*color r10
|
||||
sll r4,r4,0x1 ; r4 << 1
|
||||
addu r4,r4,a3 ; r4 = r4 + TableStart
|
||||
mflo a1 ; ld r5,lo
|
||||
lhu v0,0x0(r4);>DAT_1f8002e0 ; ld half r2 from *r4
|
||||
nop
|
||||
mult v0,t2 ; r2*col
|
||||
addiu t1,t1,0x2 ; move charFont + +2
|
||||
move v1,a2 ; r3 = byteCount (a2)
|
||||
addiu a2,a2,-0x1 ; a2 -= 1
|
||||
addiu t0,t0,0x4 ; scrathAddr r8 += 4
|
||||
sll v0,a1,0x10 ; r2 = r5 << 10 bits (move to hi)
|
||||
mflo t4 ; ld r12,lo (result)
|
||||
or v0,t4,v0 ; combine r2 & r 12 (0001 x 1111)
|
||||
sw v0,0x0(t0) ; store result to scratch r2 to *r8
|
||||
bne v1,zero,charLoop ; if r3 counter<>0 goto loop
|
||||
addiu t0,t0,0x4 ; r8 scrath += 4
|
||||
charLoaded:
|
||||
|
||||
lbu v1,0xa5(gp) ; >DAT_8007b23d_textMode load curText Shadow?
|
||||
li v0,0x1
|
||||
bne v1,v0,NotShadow ;Shadow character check
|
||||
nop
|
||||
lui r4,0x1f80
|
||||
jal MakeShadowSmallChar ;Make shadow in Scratch DMA
|
||||
ori r4,r4,0x358
|
||||
|
||||
NotShadow:
|
||||
lw ra,0x10(sp) ;Restore stack and exit
|
||||
nop
|
||||
jr ra
|
||||
addiu sp,sp,0x18
|
||||
572
2_EP/EP__OLD_main.asm
Normal file
572
2_EP/EP__OLD_main.asm
Normal file
@@ -0,0 +1,572 @@
|
||||
;
|
||||
; Persona 2 Eternal Punishment (PSX) JAP / Custom Characters/Data Patch
|
||||
;
|
||||
; Author: Sergey Shemet 06/10/2022
|
||||
|
||||
.psx
|
||||
|
||||
|
||||
|
||||
.definelabel SetDrawTPage, 0x800578fc
|
||||
.definelabel storeColor, 0x8001c0b4
|
||||
.definelabel initCopyCharChain, 0x8001b110
|
||||
;.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
|
||||
;.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
|
||||
.definelabel MakeShadowSmallChar, 0x8001b2a8
|
||||
.definelabel PrintBigDMAText, 0x8001a3a8
|
||||
|
||||
.definelabel MyAddr, 0x8009
|
||||
|
||||
|
||||
.open "SLPS_028.25", 0x8000F800
|
||||
|
||||
|
||||
;.include "complex_strings_copy.asm" ;Make complex strings in battles
|
||||
|
||||
;;neeeeed to init 8008fff6 = min dma commands
|
||||
|
||||
.org 0x80090000
|
||||
ExternalPrint:
|
||||
;;;;;;;text routing test routine
|
||||
; move r3,s3
|
||||
; move s3,r4
|
||||
|
||||
lhu v0,0x0(a0) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
|
||||
nop
|
||||
; move s3,r3
|
||||
srl v1,v0,0xD ;;;;Check 13th bit (1byte system !!!)
|
||||
bne v1,zero,MyPrintLineRoutine
|
||||
clear v1
|
||||
j PrintBigDMAText
|
||||
nop
|
||||
|
||||
;;;;;;;;;;;;;;;;;MyPrintLineRoutine
|
||||
MyPrintLineRoutine:
|
||||
addiu sp,sp,-0x50
|
||||
sw s4,0x38(sp)
|
||||
move s4,r4 ;textReadAddr - S4 (NOT S6!)
|
||||
sw s0,0x28(sp)
|
||||
move s0,r5
|
||||
sw s1,0x2c(sp)
|
||||
move s1,r6
|
||||
sw s3,0x34(sp)
|
||||
|
||||
; NEW COMMAND OBRAB
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;lw v1,0x0(s5)
|
||||
;nop
|
||||
;v1/r3 - MyChars charcount
|
||||
andi v0,v0,0xff
|
||||
addiu s4,s4,0x2 ;Moving text read pointer +2bytes
|
||||
|
||||
|
||||
|
||||
lui s3,MyAddr
|
||||
sw v0,-0x10(s3) ;store bytecounter @ 8008fff0 and clean charCounter (8008fff2)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
lui s3,0x1f80
|
||||
ori s3,s3,0x3d0 ;s3 = 1f8003d0 - copysprite cmd in scratch
|
||||
lui t0,0xff
|
||||
ori t0,t0,0xffff ;t0 = 00FFFFFF
|
||||
|
||||
;sw s0, 0x28(sp) ;save s0 in stack
|
||||
andi r4,r7,0xff ;s0 - cut textMode (color & shadow)
|
||||
lui r7, 0x8008 ;r7 = 8008 0000
|
||||
lui r6, 0xff00 ;r6 = FF000000
|
||||
|
||||
addiu t1,r7,-0x31a8 ;t1 = 8007b6d0 - new free CHAIN Here
|
||||
lw v1, -0x31a8(r7) ;r3/v1 = load freeChain
|
||||
lbu r5,0x60(sp) ;shadow flag from stack to r5
|
||||
lui v0,0x8000 ;r2 = 8000 0000
|
||||
sw ra,0x48(sp)
|
||||
sw s7,0x44(sp)
|
||||
sw s6,0x40(sp)
|
||||
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
|
||||
sw s2,0x30(sp)
|
||||
|
||||
;;init chains
|
||||
and r6,v1,r6 ;r6 = r3 & ff000000 = FF000000
|
||||
andi r5,r5,0xff ;clean text mode (color/shadow)
|
||||
and v1,v1,t0 ;r3 & 00ffffff
|
||||
or s5,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
|
||||
lw v0,0x4(t1) ;Load DMA Counter
|
||||
lw v1,0x0(s5) ;r3 = next free Chain
|
||||
addiu v0,v0,-0x1 ;DMA Counter-1
|
||||
and v1,v1,t0 ; r3 & r8 (00ffffff) cut f.byte
|
||||
or r6,r6,v1 ; r6 | r3 = ff+r3 = next free Chain (FF...) +
|
||||
sw v0,0x4(t1) ;save DMACounter
|
||||
jal storeColor
|
||||
sw r6,-0x31a8(r7) ;SAVE next free Chain (FF...) to 7b6d0
|
||||
move r4,s5 ;currentChainAddr
|
||||
sll r5,s0,0x10 ;r5 = X<<10h (003A0000)
|
||||
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
|
||||
sll r6,s1,0x10 ; r6 = Y << 10h
|
||||
jal initCopyCharChain ;init line chains
|
||||
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
|
||||
;move r7,s0 ;store textMode _THIS IS FOR INIT
|
||||
|
||||
;;;;init ScratchPad
|
||||
;;;;;;;;;;;;;;;;;; CPU TO VRAM
|
||||
lui r6,0x1f80
|
||||
ori r6,r6,0x348 ;r7 = FIRST CHAR START
|
||||
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
|
||||
;ori r6,r6,0x38c
|
||||
|
||||
|
||||
;4bit table pattern
|
||||
.include "EP_4bitPattern.asm"
|
||||
|
||||
|
||||
li v0,0x2
|
||||
sh v0,0x1c(sp)
|
||||
li v0,0xc
|
||||
li r4,0x10 ;COMMANDS IN CHAR FORMING CHAIN?
|
||||
lui r3,0xa000 ;r4 = a000 0000
|
||||
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
|
||||
|
||||
|
||||
|
||||
; INIT CHAR
|
||||
lui v0,0x100 ;FLUSH CACHE 01 00 00 00 =>DAT_1f80034b
|
||||
|
||||
sb r4,0x3(r6) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
|
||||
sw r3,0x4(r6); SAVE a000000 TO DAT_1f80034c
|
||||
|
||||
|
||||
lui at,0x1f80 ;scrathcpadStart
|
||||
sw v0,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
|
||||
|
||||
|
||||
; Copy Sprite DMA Command Forming
|
||||
li v0,0x4
|
||||
sb v0,0x3(s3) ; 04 00 00 00 to 3d0 (sb 04 to 3d3) CHAIN LENGTH
|
||||
li v0,0x64
|
||||
sb v0,0x7(s3) ;sb 64 to 3d7 (copySpriteCommand)
|
||||
|
||||
lhu r4,0x98(gp) ;0310 ;Load x(0310) to r8
|
||||
lhu r3,0x9a(gp) ;01f0 ;Load y(01F0)to r2
|
||||
;lui v1,0x100 ;0100 0000 flushcache
|
||||
|
||||
li v0,0x80
|
||||
sb v0,0x4(s3)
|
||||
sb v0,0x5(s3)
|
||||
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6)
|
||||
|
||||
|
||||
setY1:
|
||||
|
||||
|
||||
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
|
||||
|
||||
lh r7,0x98(gp) ;for futher sprite X calc
|
||||
sh r4,0x18(sp)
|
||||
sh r3,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
|
||||
|
||||
lw r4,0x18(sp) ;LOAD 013001f0 from stack
|
||||
;lw v1,0x18(sp)
|
||||
|
||||
move t0,r7
|
||||
sw r4,0x8(r6) ;DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA)
|
||||
sw v0,0xc(r6) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
|
||||
|
||||
bgez r7,LAB_800194fc
|
||||
SetX1:
|
||||
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
|
||||
addiu t0,r7,0x3f
|
||||
|
||||
|
||||
LAB_800194fc: ;decoding coords for source sprite
|
||||
sra v0,t0,0x6 ;r2 = r6 >> 6 = 4
|
||||
sll v0,v0,0x6 ;r2 << 6 = 100
|
||||
subu v0,r7,v0 ;r2 = r6 - r2 = 30
|
||||
lh v1,0x9a(gp) ;r3 = load Y half from mem
|
||||
sll v0,v0,0x2 ;r2 << 2
|
||||
sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE CHAR SPRITE X BYTE
|
||||
bgez v1,LAB_80019520 ;if Y r3>=0 - branch & r2=r3
|
||||
move v0,v1
|
||||
addiu v0,v1,0xff ;else r2 = ff - r3
|
||||
LAB_80019520:
|
||||
sra v0,v0,0x8
|
||||
sll v0,v0,0x8
|
||||
subu v0,v1,v0
|
||||
sb v0,0xd(s3) ; >DAT_1f8003dd ;STORE CHAR SPRITE Y BYTE
|
||||
lhu v1,0xa0(gp)
|
||||
;DIFF BETWEEN VERSs::::::::::::::::::::::
|
||||
li v0,0x8 ; r2 = 8 Sprite WIDTH
|
||||
sh v0,0x10(s3) ; 3e0 - 0008 save
|
||||
sh v1,0xe(s3);=>DAT_1f8003de ; *3de = r3 = 7df3
|
||||
|
||||
sh s0,0x8(s3)
|
||||
sh s1,0xa(s3)
|
||||
|
||||
li v0,0xc ; r2 = c Sprite HEIGTH
|
||||
sh v0,0x12(s3) ; 3e2 - 000c save
|
||||
|
||||
|
||||
;TEXT READ START
|
||||
|
||||
|
||||
|
||||
lbu r4,0x0(s4) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
|
||||
nop
|
||||
addiu s4,s4,0x1 ;Shift read address +1 byte
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
|
||||
|
||||
lui s6,0x8008 ;load 80080000 to r17
|
||||
addiu s7,s6,-0x3198 ;r21 = r17-4930= 7b6d0 (tempDMA)
|
||||
lui s0,0xff
|
||||
ori s0,s0,0xffff ;s0 = 00 ff ff ff
|
||||
lui s1,0x8000 ;r3 = 8000 0000
|
||||
NextChar:
|
||||
addiu r4,r4,-0x20 ;Shift unprintable symbols
|
||||
|
||||
|
||||
;ОБРАБОТКА ПРОБЕЛОВ
|
||||
|
||||
bne r4,zero,SpaceCheckBranch ;Если не пробел - перепрыгиваем сразу
|
||||
nop
|
||||
|
||||
lui t2,MyAddr
|
||||
lh v0,-0xE(t2) ;Load my temp CHAR COUNTER for check
|
||||
nop
|
||||
lh t3,-0x10(t2)
|
||||
addiu v0,v0,1 ;overall chars+1
|
||||
beq v0,t3,SpaceCheckBranch ;is last char - пробел не проверяем!
|
||||
nop
|
||||
|
||||
|
||||
;ITS A SPACE!!!!
|
||||
sh v0,-0xE(t2) ;Save charcount += 1
|
||||
nop
|
||||
lbu r4,0x0(s4) ;LOAD NEXT CHAR
|
||||
;j SpaceJump
|
||||
|
||||
;X COORD SHIFT (+6)
|
||||
lhu v0,0xa8(gp) ;LOAD INIT X
|
||||
lhu v1,0x8(s3) ;LOAD LAST X IN SCRATCH
|
||||
addiu v0,v0,0x6 ;v0 = INIT X+6
|
||||
addu v1,v1,v0 ;LAST X = LAST X + (INIT X + 6)
|
||||
sh v1,0x8(s3) ;UPDATE LAST X IN SCRATCH DMA
|
||||
|
||||
|
||||
j NextChar
|
||||
addiu s4,s4,0x1 ;Shift read address +1 byte
|
||||
|
||||
|
||||
SpaceCheckBranch:
|
||||
;LAB_8001a608 NextChar:
|
||||
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
|
||||
clear s2
|
||||
; Coords XY init
|
||||
;lw v0,0xb0(gp); =>DAT_8007b240_parms load r2 from r28+0b0 (7b240)(Xoffs)
|
||||
;lui t2,MyAddr
|
||||
;lh v1,-0xE(t2) ;Load my temp CHAR COUNTER for check
|
||||
; lhu v1,0x4(r20) ; current char = r3 = half *DMAAddr + 4
|
||||
;addiu v0,v0,0x6 ; 0x06 * 6px btw letters!
|
||||
;mult v1,v0 ; r3*r2 = xOffs*charNum
|
||||
|
||||
|
||||
lui t2,0xff00 ; r10 = ld upper ff00 = ff000000
|
||||
move t6,s5 ; r14 = r21 (params) =r9 FROM SMALL SRC
|
||||
addiu t5,sp,0x10 ; r11 = sp + 10 = 807ffe50
|
||||
lui t3,0x8008
|
||||
addiu t4,t3,-0x31a8
|
||||
move t1,s5 ; r9 = r21 (params again) =t9 ;=r8 FROM SMALL
|
||||
|
||||
|
||||
SetY:
|
||||
; sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
|
||||
SetX:
|
||||
; lhu t5,0x20(sp) ; r13 = ld half (sp+20) = 003A ---X from sp+20 !!
|
||||
; mflo t6 ; r14 = lo
|
||||
;addu v0,t5,t6 ; r2 = r13 + r14 = X + Offset
|
||||
; sh v0,0x8(s3) ;DAT_1f8003d8 save r2 half to 1f8003d8 = X (3A) !!!!!!!!!!!!!!!!
|
||||
PageLoop:
|
||||
;MAKING COPYSPRITE CHAIN
|
||||
lw v0,-0x3198(s6); r2 = *freeChainAddr
|
||||
nop
|
||||
and r4,v0,t2 ; r4 = r2 & ff00..
|
||||
and v0,v0,s0 ; r2 & 00FFFFFF
|
||||
or r5,v0,s1 ; r5 = r2 or r23 (80000000) = 801ADF10
|
||||
lw v0,0x4(s7) ; CmdCounter r2 = *7b6d0+4 = 705
|
||||
lw v1,0x0(r5) ; r3 = New 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(s7) ; CmdCounter save DMA Counter
|
||||
sw r4,-0x3198(s6); freeChain save new freeChain
|
||||
|
||||
CopyCmdFromScratch:
|
||||
; CopyScriptChain copy from scratch
|
||||
lw t9,0x0(s3) ;>DAT_1f8003d0 r14 = 04000000 - DMA Commands Count
|
||||
lw t7,0x4(s3) ;>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd
|
||||
lw t8,0x8(s3) ;>DAT_1f8003d8 r24 = 001500d1 - xy screen coords
|
||||
lw t5,0xc(s3); >DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page)
|
||||
sw t9,0x0(r5) ; *r5 = r14
|
||||
sw t7,0x4(r5) ; *r5+4 = r15
|
||||
sw t8,0x8(r5) ; *r5+8 = r24
|
||||
sw t5,0xc(r5) ; *r5+c = r13
|
||||
lw t9,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
|
||||
nop
|
||||
sw t9,0x10(r5) ; *r5+10 = r14 - LAST COMMAND SAVE
|
||||
; t1 = t0 (small) !!!!
|
||||
; t4 = t1 (small) !!!!
|
||||
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(t6) ;t1->t6 r2 = half (DMA params)+4 (charCounter)
|
||||
nop
|
||||
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
|
||||
nop ;clear t0
|
||||
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = Set first Char Chain
|
||||
sw t8,0xc(t6) ;t1->t6 ; Params+0c = save STORE COORDS to params
|
||||
;sh s2,0xe(t4) ;t1->t6 ;Params+0e = save half Y
|
||||
NotFirstChar:
|
||||
|
||||
; lui t3,0x1f80
|
||||
; ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
|
||||
|
||||
|
||||
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
|
||||
|
||||
lw v0,-0x31a8(t3);>8007b6d0_freeChain r2 = *nextFreeChain
|
||||
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
|
||||
and r4,v0,t2 ; r4 = r2 & FF000000 FFNEXTCHAIN
|
||||
and v0,v0,s0 ; r2 & 00FFFFFF = 00XTCHAN
|
||||
or r7,v0,s1 ;or (800...) ; r7 = r2 | r12 = nextChain & 80...
|
||||
move r6,r7 ; r6 = r7 (nextChain)
|
||||
lw v0,0x4(t4) ; CmdCounter r2 = DMA Counter
|
||||
lw v1,0x0(r7) ; r3 = New Free ChainAddr / currHeader Addr
|
||||
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
|
||||
and v1,v1,s0 ; r3 & 80.... commandCount / currHeader
|
||||
or r4,r4,v1 ; r4 & r3 = ff......
|
||||
sw v0,0x4(t4);>DAT_8007b6d4_CmdCounter save DMA Counter
|
||||
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
|
||||
sw r4,-0x31a8(t3);>8007b6d0_freeChain save new freeChain
|
||||
|
||||
|
||||
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
|
||||
addiu v0,r5,0x40 ;T3 = 388!
|
||||
|
||||
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
CopyBy2Bytes:
|
||||
lwl t9,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
|
||||
lwr t9,0x0(r5);>DAT_1f800348
|
||||
lwl t7,0x7(r5)
|
||||
lwr t7,0x4(r5);>DAT_1f80034c
|
||||
lwl t8,0xb(r5)
|
||||
lwr t8,0x8(r5);>DAT_1f800350
|
||||
lwl t5,0xf(r5)
|
||||
lwr t5,0xc(r5);>DAT_1f800354
|
||||
swl t9,0x3(r6)
|
||||
swr t9,0x0(r6)
|
||||
swl t7,0x7(r6)
|
||||
swr t7,0x4(r6)
|
||||
swl t8,0xb(r6)
|
||||
swr t8,0x8(r6)
|
||||
swl t5,0xf(r6)
|
||||
swr t5,0xc(r6)
|
||||
addiu r5,r5,0x10
|
||||
bne r5,v0,CopyBy2Bytes
|
||||
addiu r6,r6,0x10
|
||||
j last4BytesCopy
|
||||
nop
|
||||
Copy16Bytes:
|
||||
lw t9,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
|
||||
lw t7,0x4(r5)
|
||||
lw t8,0x8(r5)
|
||||
lw t5,0xc(r5)
|
||||
sw t9,0x0(r6)
|
||||
sw t7,0x4(r6)
|
||||
sw t8,0x8(r6)
|
||||
sw t5,0xc(r6)
|
||||
addiu r5,r5,0x10
|
||||
bne r5,v0,Copy16Bytes
|
||||
addiu r6,r6,0x10
|
||||
last4BytesCopy:
|
||||
lwl t9,0x3(r5) ; r14 left = 2 bytes from *r5+3
|
||||
lwr t9,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
|
||||
nop
|
||||
swl t9,0x3(r6) ; *r6 = r14 left
|
||||
swr t9,0x0(r6) ; *r6+3 = r14 right
|
||||
|
||||
|
||||
; linking DMA char+copysprite
|
||||
|
||||
; t0 (smallSRC) = t1 (HERE) !!!! ;r8 = r9 !!!!!!!!!!!!!
|
||||
; t1 (smallSRC) = t6 (HERE) !!!! ;r9 = r14 !!!!!!!!!!!!
|
||||
|
||||
lw v1,0x18(t1) ; r3 = current DMACopySprite Chain
|
||||
lw v0,0x0(r7) ; r2 = current CharChainCommands
|
||||
lw v1,0x0(v1) ; r3 = *r3 (comNum+FFFFFF(nextLink))
|
||||
and v0,v0,t2 ; r2 & FF.....
|
||||
and v1,v1,s0 ; r3 & 00FFFFFF
|
||||
or v0,v0,v1 ; r2 | r3 = 10FFFFFF(cmdNum&FF..)
|
||||
sw v0,0x0(r7) ; *r7 = r2 saveCurChainCmd (10FFFFFF)
|
||||
|
||||
lw r4,0x18(t1) ; r4 = r8+18h - cur CopySpriteCmd hdrAddr
|
||||
nop
|
||||
lw v0,0x0(r4) ; r2 = *r4 (04FFFFFF)
|
||||
and v1,r7,s0 ; r3 = r7 & 00FFFFFF (Copying Cur Char Chain)
|
||||
and v0,v0,t2 ; r2 & FF000000 (04000000) CmdCount
|
||||
or v0,v0,v1 ; R2 | R3 = 04(cmd)..+CharChainAddr
|
||||
sw v0,0x0(r4) ; *r4 = r2 = FullCommand With Link!!!
|
||||
; (04..CharAddr) + SpriteCopyCommand
|
||||
sw r7,0x18(t1) ; *r8+18 = Last Char Chain!
|
||||
|
||||
addiu t1,t1,0x4 ; r8 (params) += 4 (shift params for NextPage)
|
||||
addiu v0,t6,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,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
|
||||
nop
|
||||
|
||||
|
||||
;X COORD SHIFT (+6)
|
||||
lhu v0,0xa8(gp) ;LOAD INIT X
|
||||
lhu v1,0x8(s3) ;LOAD LAST X IN SCRATCH
|
||||
addiu v0,v0,0x6 ;v0 = INIT X+6
|
||||
addu v1,v1,v0 ;LAST X = LAST X + (INIT X + 6)
|
||||
sh v1,0x8(s3) ;UPDATE LAST X IN SCRATCH DMA
|
||||
|
||||
|
||||
SpaceJump:
|
||||
;;;CharCount + Check
|
||||
lhu v0,0x4(s5) ; r2 = current charDMACount
|
||||
lui t9,MyAddr
|
||||
addiu v0,v0,0x1 ; a += 1
|
||||
sh v0,0x4(s5) ;save DMAcounter to chain
|
||||
|
||||
|
||||
;DMA OVERFLOW CHECK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (8007b6d4)
|
||||
|
||||
lw v0,0x4(s7) ; CmdCounter r2 = DMA Char Counter
|
||||
;lhu v1,-0xC(t9) ;v1 = 8008fff4 = minimum cmd counter
|
||||
move v1,5 ;80cd0 ///
|
||||
sltu v0,v0,v1 ; v0 = v0 < V1 ?
|
||||
bne v0,zero,TextEnd ;if v0<>0 then Goto End Text (DMA OVERFLOW!!!!)
|
||||
nop
|
||||
|
||||
|
||||
|
||||
|
||||
lui t3,MyAddr
|
||||
lhu v0,-0xE(t3) ; r2 = charCount In string
|
||||
lhu v1,-0x10(t3) ; r3 = My charOverAll In string
|
||||
addiu v0,v0,0x1 ; a += 1
|
||||
lbu r4,0x0(s4) ; load next Char to r4 (byte)
|
||||
|
||||
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
|
||||
addiu s4,s4,0x1 ;Shift CharAddr
|
||||
|
||||
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
|
||||
nop
|
||||
|
||||
TextEnd:
|
||||
clear r18
|
||||
lui s3,0x8008
|
||||
addiu s4,s3,-0x3198 ; r19 = 80080000, r21 = 7b6d0
|
||||
lui s1,0xff ; r17 = 00ff0000
|
||||
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
|
||||
move s0,s5 ; r16 = r20 (currentTLineParam)
|
||||
clear r5
|
||||
PageTLoop: ;ALMOST FINISH!!!!
|
||||
li r6,0x1 ; r6=1
|
||||
addu r18,r18,r6 ; r18(Counter) += r6
|
||||
lui v0,0x8000 ; r2 = 80000000
|
||||
lui r4,0xff00 ; r4 = ff00 0000
|
||||
lw v1,-0x3198(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
|
||||
lw r7,0x9c(gp);>DAT_8007b234 r7 = someParam(почти DMA)gp+a4 = 34
|
||||
and v1,v1,s1 ; r3 & 00FFFFFF
|
||||
or v1,v1,v0 ; r3 | r2 = 80.....
|
||||
sw v1,0x30(s0) ; store last free ChAddr to DMAParams
|
||||
lw v0,-0x3198(s3);>8007b6d0_freeChain r2 = next free chain
|
||||
lw v1,0x0(v1) ; r3 = *r3 = last chain - made one more chain
|
||||
and v0,v0,r4 ; a2 & ff000000
|
||||
and v1,v1,s1 ; r3 & 00FFFFFF
|
||||
lw r4,0x4(s4);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
|
||||
or v0,v0,v1 ; r2 | r3
|
||||
sw v0,-0x3198(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
|
||||
addiu r4,r4,-0x1 ; DMA Cunter =- 1
|
||||
sw r4,0x4(s4);>DAT_8007b6d4_CmdCounter Store DMA Count
|
||||
lw r4,0x30(s0) ; r4 = *DMA params + 30 = Start Of DMA Chain
|
||||
jal SetDrawTPage ; Set DRAW PAGE
|
||||
addiu s0,s0,0x4 ; r16 += 4 - Shgift DMAParams for next Page
|
||||
sltiu v0,r18,0x2 ; r2 = r18<2
|
||||
bne v0,zero,PageTLoop ; if not r2 then goto Loop
|
||||
clear r5 ; r5 = 0
|
||||
move v0,s5 ; r2 = DMAParamsMain
|
||||
|
||||
lw ra,0x48(sp)
|
||||
|
||||
lw s7,0x44(sp)
|
||||
lw s6,0x40(sp)
|
||||
lw s5,0x3c(sp) ;restoring regs from Stack
|
||||
lw s4,0x38(sp)
|
||||
lw s3,0x34(sp)
|
||||
lw s2,0x30(sp)
|
||||
lw s1,0x2c(sp)
|
||||
lw s0,0x28(sp)
|
||||
|
||||
jr ra
|
||||
addiu sp,sp,0x50
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chars / 2 Return Func
|
||||
.include "EP_charload.asm"
|
||||
|
||||
.include "charCalcs.asm"
|
||||
|
||||
|
||||
;patching PrintCommandText
|
||||
|
||||
.org 0x8001d138
|
||||
;jal 0x8001a3a8 ORIG CALL
|
||||
jal ExternalPrint
|
||||
|
||||
.org 0x8001d0c4
|
||||
;jal 0x8001a3a8 ORIG CALL
|
||||
jal ExternalPrint
|
||||
|
||||
|
||||
|
||||
.org 0x8001bee0
|
||||
j ReturnCharsInString ;custom routine
|
||||
; j 0x8001beec
|
||||
|
||||
.org 0x8001bf08
|
||||
; addiu sp,sp,-0x18 ;Original Code
|
||||
; sw ra,0x10(sp)
|
||||
j calcnextXCustom ;PATCHED
|
||||
nop
|
||||
|
||||
|
||||
|
||||
.close
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
|
||||
;;.include "battle_patch.asm"
|
||||
|
||||
|
||||
|
||||
|
||||
;;.include "txtpatches.asm" ;misc text patches
|
||||
|
||||
; COMPILE COMMAND: ./armips -temp 123_EP EP_main.asm
|
||||
410
2_EP/EP_main_grouped.asm
Normal file
410
2_EP/EP_main_grouped.asm
Normal file
@@ -0,0 +1,410 @@
|
||||
;
|
||||
; Persona 2 Eternal Punishment (PSX) JAP / Custom Characters/Data Patch
|
||||
; Author: Sergey Shemet 06/10/2022
|
||||
|
||||
.psx
|
||||
|
||||
// Определения функций
|
||||
.definelabel SetDrawTPage, 0x800578fc
|
||||
.definelabel storeColor, 0x8001c0b4
|
||||
.definelabel initCopyCharChain, 0x8001b110
|
||||
.definelabel MakeShadowSmallChar, 0x8001b2a8
|
||||
.definelabel PrintBigDMAText, 0x8001a3a8
|
||||
|
||||
.definelabel MyAddr, 0x8009
|
||||
|
||||
.open "SLPS_028.25", 0x8000F800
|
||||
|
||||
.org 0x80090000
|
||||
|
||||
ExternalPrint:
|
||||
// Текстовая тестовая процедура
|
||||
lhu v0, 0x0(a0) // Читаем 2 байта текста
|
||||
nop
|
||||
srl v1, v0, 0xD // Проверяем 13-й бит (система 1 байт)
|
||||
bne v1, zero, MyPrintLineRoutine // Если установлен, переходим к нашей процедуре
|
||||
clear v1
|
||||
j PrintBigDMAText // Иначе используем стандартную процедуру
|
||||
nop
|
||||
|
||||
MyPrintLineRoutine:
|
||||
addiu sp, sp, -0x50 // Выделяем место в стеке
|
||||
sw s4, 0x38(sp) // Сохраняем регистры
|
||||
move s4, a0 // Адрес чтения текста -> s4
|
||||
sw s0, 0x28(sp)
|
||||
move s0, a1
|
||||
sw s1, 0x2c(sp)
|
||||
move s1, a2
|
||||
sw s3, 0x34(sp)
|
||||
|
||||
// Обработка новой команды
|
||||
andi v0, v0, 0xff // Берем младший байт
|
||||
addiu s4, s4, 0x2 // Сдвигаем указатель текста на +2 байта
|
||||
|
||||
lui s3, MyAddr
|
||||
sw v0, -0x10(s3) // Сохраняем счетчик байтов @ 8008fff0
|
||||
|
||||
// Инициализация scratchpad
|
||||
lui s3, 0x1f80
|
||||
ori s3, s3, 0x3d0 // s3 = 1f8003d0 - команда копирования спрайта
|
||||
lui t0, 0xff
|
||||
ori t0, t0, 0xffff // t0 = 00FFFFFF
|
||||
|
||||
andi a0, a3, 0xff // Режим текста (цвет и тень)
|
||||
lui a3, 0x8008 // a3 = 80080000
|
||||
lui a2, 0xff00 // a2 = FF000000
|
||||
|
||||
addiu t1, a3, -0x31a8 // t1 = 8007b6d0 - новая свободная цепочка
|
||||
lw v1, -0x31a8(a3) // v1 = загружаем свободную цепочку
|
||||
lbu a1, 0x60(sp) // Флаг тени из стека -> a1
|
||||
lui v0, 0x8000 // v0 = 80000000
|
||||
sw ra, 0x48(sp) // Сохраняем регистры
|
||||
sw s7, 0x44(sp)
|
||||
sw s6, 0x40(sp)
|
||||
sw s5, 0x3c(sp)
|
||||
sw s2, 0x30(sp)
|
||||
|
||||
// Инициализация цепочек
|
||||
and a2, v1, a2 // a2 = v1 & ff000000
|
||||
andi a1, a1, 0xff // Очищаем режим текста
|
||||
and v1, v1, t0 // v1 & 00ffffff
|
||||
or s5, v1, v0 // s5 - основной адрес свободной цепочки
|
||||
lw v0, 0x4(t1) // Загружаем счетчик DMA
|
||||
lw v1, 0x0(s5) // v1 = следующая свободная цепочка
|
||||
addiu v0, v0, -0x1 // Уменьшаем счетчик DMA
|
||||
and v1, v1, t0 // v1 & 00ffffff
|
||||
or a2, a2, v1 // a2 | v1 = следующая свободная цепочка
|
||||
sw v0, 0x4(t1) // Сохраняем счетчик DMA
|
||||
sw a2, -0x31a8(a3) // Сохраняем следующую свободную цепочку
|
||||
jal storeColor
|
||||
move a0, s5 // Текущий адрес цепочки
|
||||
sll a1, s0, 0x10 // a1 = X << 16
|
||||
sra a1, a1, 0x10 // a1 = X координата
|
||||
sll a2, s1, 0x10 // a2 = Y << 16
|
||||
jal initCopyCharChain // Инициализация цепочек символов
|
||||
sra a2, a2, 0x10 // a2 = Y координата
|
||||
|
||||
// Инициализация ScratchPad (CPU to VRAM)
|
||||
lui a2, 0x1f80
|
||||
ori a2, a2, 0x348 // a2 = первый символ начала
|
||||
|
||||
// 4-битная таблица паттернов
|
||||
.include "EP_4bitPattern.asm"
|
||||
|
||||
li v0, 0x2
|
||||
sh v0, 0x1c(sp)
|
||||
li v0, 0xc
|
||||
li a0, 0x10 // Команды в цепочке формирования символа?
|
||||
lui v1, 0xa000 // a0 = a0000000
|
||||
sh v0, 0x1e(sp) // Сохраняем 000C0002 в стек+1c
|
||||
|
||||
// Инициализация символа
|
||||
lui v0, 0x100 // Сброс кэша 01000000
|
||||
sb a0, 0x3(a2) // Сохраняем количество команд
|
||||
sw v1, 0x4(a2) // Сохраняем a0000000
|
||||
|
||||
lui at, 0x1f80 // Начало scratchpad
|
||||
sw v0, 0x388(at) // Сохраняем в конец первой цепочки символов
|
||||
|
||||
// Формирование команды DMA копирования спрайта
|
||||
li v0, 0x4
|
||||
sb v0, 0x3(s3) // Длина цепочки = 4
|
||||
li v0, 0x64
|
||||
sb v0, 0x7(s3) // Команда копирования спрайта
|
||||
|
||||
lhu a0, 0x98(gp) // Загружаем X координату
|
||||
lhu v1, 0x9a(gp) // Загружаем Y координату
|
||||
|
||||
li v0, 0x80
|
||||
sb v0, 0x4(s3)
|
||||
sb v0, 0x5(s3)
|
||||
sb v0, 0x6(s3) // Формируем 80808064
|
||||
|
||||
setY1:
|
||||
lw v0, 0x1c(sp) // v0 = 000c0002 из стека
|
||||
lh a3, 0x98(gp) // Для дальнейших расчетов X спрайта
|
||||
sh a0, 0x18(sp)
|
||||
sh v1, 0x1a(sp) // Сохраняем координаты в стек
|
||||
lw a0, 0x18(sp) // Загружаем координаты из стека
|
||||
move t0, a3
|
||||
sw a0, 0x8(a2) // Загружаем координаты в DMA
|
||||
sw v0, 0xc(a2) // Сохраняем в первый символ
|
||||
|
||||
bgez a3, LAB_800194fc
|
||||
|
||||
SetX1:
|
||||
sh s1, 0x20(sp) // Сохраняем X половину в sp+20
|
||||
addiu t0, a3, 0x3f
|
||||
|
||||
LAB_800194fc:
|
||||
// Декодирование координат для исходного спрайта
|
||||
sra v0, t0, 0x6 // v0 = t0 >> 6
|
||||
sll v0, v0, 0x6 // v0 << 6
|
||||
subu v0, a3, v0 // v0 = a3 - v0
|
||||
lh v1, 0x9a(gp) // Загружаем Y половину из памяти
|
||||
sll v0, v0, 0x2 // v0 << 2
|
||||
sb v0, 0xc(s3) // Сохраняем X байт спрайта символа
|
||||
bgez v1, LAB_80019520 // Если Y >= 0 - ветвление
|
||||
move v0, v1
|
||||
addiu v0, v1, 0xff // Иначе v0 = ff - v1
|
||||
|
||||
LAB_80019520:
|
||||
sra v0, v0, 0x8
|
||||
sll v0, v0, 0x8
|
||||
subu v0, v1, v0
|
||||
sb v0, 0xd(s3) // Сохраняем Y байт спрайта символа
|
||||
lhu v1, 0xa0(gp)
|
||||
|
||||
li v0, 0x8 // Ширина спрайта = 8
|
||||
sh v0, 0x10(s3) // Сохраняем ширину
|
||||
sh v1, 0xe(s3) // Сохраняем значение
|
||||
|
||||
sh s0, 0x8(s3) // Сохраняем X
|
||||
sh s1, 0xa(s3) // Сохраняем Y
|
||||
|
||||
li v0, 0xc // Высота спрайта = 12
|
||||
sh v0, 0x12(s3) // Сохраняем высоту
|
||||
|
||||
// Начало чтения текста
|
||||
lbu a0, 0x0(s4) // Основное чтение байта команды
|
||||
nop
|
||||
addiu s4, s4, 0x1 // Сдвиг адреса чтения на +1 байт
|
||||
|
||||
SpaceCheckBranch:
|
||||
jal makeCharPixelsCustom // Создание маленького символа в scratch
|
||||
clear s2
|
||||
|
||||
lui t2, 0xff00 // t2 = ff000000
|
||||
move t6, s5 // Параметры
|
||||
addiu t5, sp, 0x10 // t5 = sp + 10
|
||||
lui t3, 0x8008
|
||||
addiu t4, t3, -0x31a8
|
||||
move t1, s5 // Параметры снова
|
||||
|
||||
SetY:
|
||||
SetX:
|
||||
PageLoop:
|
||||
// Создание цепочки копирования спрайта
|
||||
lw v0, -0x3198(s6) // v0 = *адрес свободной цепочки
|
||||
nop
|
||||
and a0, v0, t2 // a0 = v0 & ff00..
|
||||
and v0, v0, s0 // v0 & 00FFFFFF
|
||||
or a1, v0, s1 // a1 = v0 | 80000000
|
||||
lw v0, 0x4(s7) // Счетчик команд
|
||||
lw v1, 0x0(a1) // Новый адрес свободной цепочки
|
||||
addiu v0, v0, -0x1 // Уменьшаем счетчик
|
||||
and v1, v1, s0 // v1 & 00FFFFFF
|
||||
or a0, a0, v1 // a0 & v1
|
||||
sw v0, 0x4(s7) // Сохраняем счетчик DMA
|
||||
sw a0, -0x3198(s6) // Сохраняем новую свободную цепочку
|
||||
|
||||
CopyCmdFromScratch:
|
||||
// Копирование команды из scratch
|
||||
lw t9, 0x0(s3) // Количество команд DMA
|
||||
lw t7, 0x4(s3) // Команда копирования спрайта
|
||||
lw t8, 0x8(s3) // Координаты экрана XY
|
||||
lw t5, 0xc(s3) // CLUT и координаты текстуры
|
||||
sw t9, 0x0(a1)
|
||||
sw t7, 0x4(a1)
|
||||
sw t8, 0x8(a1)
|
||||
sw t5, 0xc(a1)
|
||||
lw t9, 0x10(s3) // Размер спрайта после копирования
|
||||
nop
|
||||
sw t9, 0x10(a1) // Сохраняем последнюю команду
|
||||
|
||||
lw v1, 0x18(t1) // Следующий параметр
|
||||
lw v0, 0x0(a1) // Текущий новый адрес цепочки
|
||||
lw v1, 0x0(v1) // Загружаем значение
|
||||
and v0, v0, t2 // v0 & ff000000
|
||||
and v1, v1, s0 // v1 & 00FFFFFF
|
||||
or v0, v0, v1 // Команды с FFFFFF
|
||||
sw v0, 0x0(a1) // Обновляем текущий адрес цепочки
|
||||
lw a0, 0x18(t1) // Первый адрес цепочки
|
||||
nop
|
||||
lw v0, 0x0(a0) // Первая ссылка цепочки на следующую
|
||||
and v1, a1, s0 // v1 = a1 & 00FFFFFF
|
||||
and v0, v0, t2 // v0 & FF000000
|
||||
or v0, v0, v1 // Последний адрес цепочки
|
||||
sw v0, 0x0(a0) // Первая цепочка следующего адреса
|
||||
sw a1, 0x18(t1) // Текущий адрес цепочки
|
||||
lhu v0, 0x4(t6) // Счетчик символов
|
||||
nop
|
||||
bne v0, zero, NotFirstChar // Если счетчик символов ≠ 0, переходим
|
||||
nop
|
||||
|
||||
sw a1, 0x28(t1) // Устанавливаем первую цепочку символов
|
||||
sw t8, 0xc(t6) // Сохраняем координаты в параметры
|
||||
// sh s2, 0xe(t4) // Сохраняем половину Y
|
||||
|
||||
NotFirstChar:
|
||||
lui a1, 0x1f80 // Адрес символа здесь
|
||||
lw v0, -0x31a8(t3) // Следующая свободная цепочка
|
||||
ori a1, a1, 0x348 // a1 | 1f800348 = Scratch данные символа
|
||||
and a0, v0, t2 // a0 = v0 & FF000000
|
||||
and v0, v0, s0 // v0 & 00FFFFFF
|
||||
or a3, v0, s1 // a3 = следующая цепочка & 80...
|
||||
move a2, a3 // a2 = a3 (следующая цепочка)
|
||||
lw v0, 0x4(t4) // Счетчик команд
|
||||
lw v1, 0x0(a3) // Новый адрес свободной цепочки
|
||||
addiu v0, v0, -0x1 // Уменьшаем счетчик
|
||||
and v1, v1, s0 // v1 & 80... количество команд
|
||||
or a0, a0, v1 // a0 & v1
|
||||
sw v0, 0x4(t4) // Сохраняем счетчик DMA
|
||||
andi v0, a3, 0x3 // Проверяем адрес назначения MOD 4
|
||||
sw a0, -0x31a8(t3) // Сохраняем новую свободную цепочку
|
||||
|
||||
beq v0, zero, Copy16Bytes // Если MOD 4 = 0, ветвление
|
||||
addiu v0, a1, 0x40
|
||||
|
||||
CopyBy2Bytes:
|
||||
// Копируем по 2 байта если MOD 4 ≠ 0
|
||||
lwl t9, 0x3(a1)
|
||||
lwr t9, 0x0(a1)
|
||||
lwl t7, 0x7(a1)
|
||||
lwr t7, 0x4(a1)
|
||||
lwl t8, 0xb(a1)
|
||||
lwr t8, 0x8(a1)
|
||||
lwl t5, 0xf(a1)
|
||||
lwr t5, 0xc(a1)
|
||||
swl t9, 0x3(a2)
|
||||
swr t9, 0x0(a2)
|
||||
swl t7, 0x7(a2)
|
||||
swr t7, 0x4(a2)
|
||||
swl t8, 0xb(a2)
|
||||
swr t8, 0x8(a2)
|
||||
swl t5, 0xf(a2)
|
||||
swr t5, 0xc(a2)
|
||||
addiu a1, a1, 0x10
|
||||
bne a1, v0, CopyBy2Bytes
|
||||
addiu a2, a2, 0x10
|
||||
j last4BytesCopy
|
||||
nop
|
||||
|
||||
Copy16Bytes:
|
||||
// Копируем по 16 байт
|
||||
lw t9, 0x0(a1)
|
||||
lw t7, 0x4(a1)
|
||||
lw t8, 0x8(a1)
|
||||
lw t5, 0xc(a1)
|
||||
sw t9, 0x0(a2)
|
||||
sw t7, 0x4(a2)
|
||||
sw t8, 0x8(a2)
|
||||
sw t5, 0xc(a2)
|
||||
addiu a1, a1, 0x10
|
||||
bne a1, v0, Copy16Bytes
|
||||
addiu a2, a2, 0x10
|
||||
|
||||
last4BytesCopy:
|
||||
// Копируем последние 4 байта
|
||||
lwl t9, 0x3(a1)
|
||||
lwr t9, 0x0(a1)
|
||||
nop
|
||||
swl t9, 0x3(a2)
|
||||
swr t9, 0x0(a2)
|
||||
|
||||
// Связывание DMA символа + копирование спрайта
|
||||
lw v1, 0x18(t1) // Текущая цепочка DMA копирования спрайта
|
||||
lw v0, 0x0(a3) // Текущие команды цепочки символов
|
||||
lw v1, 0x0(v1) // Количество команд + следующая ссылка
|
||||
and v0, v0, t2 // v0 & FF.....
|
||||
and v1, v1, s0 // v1 & 00FFFFFF
|
||||
or v0, v0, v1 // Количество команд & FF..
|
||||
sw v0, 0x0(a3) // Сохраняем текущую команду цепочки
|
||||
lw a0, 0x18(t1) // Адрес заголовка текущей команды копирования спрайта
|
||||
nop
|
||||
lw v0, 0x0(a0) // 04FFFFFF
|
||||
and v1, a3, s0 // v1 = копирование текущей цепочки символов
|
||||
and v0, v0, t2 // v0 & FF000000 (количество команд)
|
||||
or v0, v0, v1 // Полная команда со ссылкой
|
||||
sw v0, 0x0(a0) // Сохраняем с ссылкой на цепочку символов
|
||||
sw a3, 0x18(t1) // Последняя цепочка символов
|
||||
|
||||
addiu t1, t1, 0x4 // Сдвигаем параметры для следующей страницы
|
||||
addiu v0, t6, 0x8 // Сдвигаем первый параметр цепочки для страницы
|
||||
sltu v0, t1, v0 // Проверяем прохождение первой страницы
|
||||
bne v0, zero, PageLoop // Если не прошли, продолжаем цикл страниц
|
||||
nop
|
||||
|
||||
// Сдвиг X координаты (+6)
|
||||
lhu v0, 0xa8(gp) // Загружаем начальный X
|
||||
lhu v1, 0x8(s3) // Загружаем последний X в scratch
|
||||
addiu v0, v0, 0x6 // v0 = начальный X + 6
|
||||
addu v1, v1, v0 // Последний X = последний X + (начальный X + 6)
|
||||
sh v1, 0x8(s3) // Обновляем последний X в DMA scratch
|
||||
|
||||
SpaceJump:
|
||||
// Увеличиваем счетчик символов + проверка
|
||||
lhu v0, 0x4(s5) // Текущее количество символов DMA
|
||||
lui t9, MyAddr
|
||||
addiu v0, v0, 0x1 // Увеличиваем на 1
|
||||
sh v0, 0x4(s5) // Сохраняем счетчик в цепочку
|
||||
|
||||
// Проверка переполнения DMA
|
||||
lw v0, 0x4(s7) // Счетчик команд DMA
|
||||
move v1, 5 // Минимальный счетчик команд
|
||||
sltu v0, v0, v1 // v0 < v1?
|
||||
bne v0, zero, TextEnd // Если переполнение DMA, завершаем текст
|
||||
nop
|
||||
|
||||
lui t3, MyAddr
|
||||
lhu v0, -0xE(t3) // Количество символов в строке
|
||||
lhu v1, -0x10(t3) // Общее количество символов в строке
|
||||
addiu v0, v0, 0x1 // Увеличиваем на 1
|
||||
lbu a0, 0x0(s4) // Загружаем следующий символ
|
||||
sh v0, -0xE(t3) // Сохраняем счетчик символов
|
||||
addiu s4, s4, 0x1 // Сдвигаем адрес символа
|
||||
|
||||
bne v0, v1, NextChar // Если текущий символ ≠ общему количеству, продолжаем
|
||||
nop
|
||||
|
||||
TextEnd:
|
||||
clear s2
|
||||
lui s3, 0x8008
|
||||
addiu s4, s3, -0x3198 // s4 = 7b6d0
|
||||
lui s1, 0xff
|
||||
ori s1, s1, 0xffff // s1 = 00ffffff
|
||||
move s0, s5 // s0 = текущие параметры строки
|
||||
clear a1
|
||||
|
||||
PageTLoop:
|
||||
// Завершающая обработка страниц
|
||||
li a2, 0x1 // a2 = 1
|
||||
addu s2, s2, a2 // Увеличиваем счетчик
|
||||
lui v0, 0x8000 // v0 = 80000000
|
||||
lui a0, 0xff00 // a0 = ff000000
|
||||
lw v1, -0x3198(s3) // Следующая свободная цепочка
|
||||
lw a3, 0x9c(gp) // Некоторые параметры (почти DMA)
|
||||
and v1, v1, s1 // v1 & 00FFFFFF
|
||||
or v1, v1, v0 // v1 | v0 = 80.....
|
||||
sw v1, 0x30(s0) // Сохраняем последний свободный адрес в параметрах DMA
|
||||
lw v0, -0x3198(s3) // Следующая свободная цепочка
|
||||
lw v1, 0x0(v1) // Создаем еще одну цепочку
|
||||
and v0, v0, a0 // v0 & ff000000
|
||||
and v1, v1, s1 // v1 & 00FFFFFF
|
||||
lw a0, 0x4(s4) // Счетчик DMA
|
||||
or v0, v0, v1 // v0 | v1
|
||||
sw v0, -0x3198(s3) // Новый адрес свободной цепочки
|
||||
addiu a0, a0, -0x1 // Уменьшаем счетчик DMA
|
||||
sw a0, 0x4(s4) // Сохраняем счетчик DMA
|
||||
lw a0, 0x30(s0) // Начало цепочки DMA
|
||||
jal SetDrawTPage // Устанавливаем страницу отрисовки
|
||||
addiu s0, s0, 0x4 // Сдвигаем параметры DMA для следующей страницы
|
||||
sltiu v0, s2, 0x2 // Проверяем счетчик < 2
|
||||
bne v0, zero, PageTLoop // Если да, продолжаем цикл
|
||||
clear a1 // a1 = 0
|
||||
|
||||
move v0, s5 // Возвращаем основные параметры DMA
|
||||
|
||||
// Восстанавливаем регистры из стека
|
||||
lw ra, 0x48(sp)
|
||||
lw s7, 0x44(sp)
|
||||
lw s6, 0x40(sp)
|
||||
lw s5, 0x3c(sp)
|
||||
lw s4, 0x38(sp)
|
||||
lw s3, 0x34(sp)
|
||||
lw s2, 0x30(sp)
|
||||
lw s1, 0x2c(sp)
|
||||
lw s0, 0x28(sp)
|
||||
|
||||
jr ra // Возврат
|
||||
addiu sp, sp, 0x50 // Восстанавливаем стек
|
||||
67
2_EP/EP_txtpatches.asm
Normal file
67
2_EP/EP_txtpatches.asm
Normal file
@@ -0,0 +1,67 @@
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;
|
||||
;;; Some txt Patches to JAPAN Version to print bi(u)g text smaller
|
||||
;;;
|
||||
|
||||
.open "2_EP/BIN/SLPS_028.25", 0x8000F800
|
||||
|
||||
;Text speed patch (0 - show all text, 2 - Normal, 1 - Button Pressed (fast) )
|
||||
.org 0x8001b5b8
|
||||
li a1, 0
|
||||
;lhu a1, 0x74(s0) ;Original Code
|
||||
|
||||
|
||||
// ; Main Bigfont size between letters for special codes
|
||||
// .org 0x8001927c
|
||||
// addiu v0,v0,0x6
|
||||
|
||||
// ;calcNextX Routine (calc X in line after command)
|
||||
// ;.org 0x8001af38
|
||||
// ; sll r2,r3,2h ; Its Original - Custom in custom routine
|
||||
|
||||
// ;dialog start line tabulation
|
||||
// ;.org 0x8007b195
|
||||
// ; .byte 0x4 ;pixels
|
||||
// .org 0x8001ca0c
|
||||
// li a2, 0x4
|
||||
|
||||
// ;;;;;;;;;;;;;;;;;;;;;;;;Print Routines Calls Replacing
|
||||
|
||||
// ;main dialog calls from PrintProgramText Routine
|
||||
// .org 0x8001cd58
|
||||
// jal ExternalPrint
|
||||
// .org 0x8001cdd8
|
||||
// jal ExternalPrint
|
||||
|
||||
// .org 0x8001c098
|
||||
// jal ExternalPrint
|
||||
// .org 0x8001c10c
|
||||
// jal ExternalPrint
|
||||
|
||||
|
||||
|
||||
|
||||
// ;printPlaneTEXT (PlayerName, etc...)
|
||||
// .org 0x8001c388
|
||||
// jal ExternalPrint
|
||||
|
||||
|
||||
|
||||
// ;custom CheckCharNumToLineEnd for proper Complex Lines Read (charcountread)
|
||||
// .org 0x8001abf4
|
||||
// j ReturnCharsInString ;custom routine
|
||||
// clear v1
|
||||
// ;j 0x8001af00 ;original code
|
||||
|
||||
// ;calcnextX Custom
|
||||
|
||||
// .org 0x8001ac1c
|
||||
// ; addiu sp,sp,-0x18 ;Original Code
|
||||
// ; sw ra,0x10(sp)
|
||||
// j calcnextXCustom ;PATCHED
|
||||
// nop
|
||||
|
||||
.close
|
||||
|
||||
|
||||
Reference in New Issue
Block a user