Порядок в каталогах

This commit is contained in:
sShemet
2025-11-04 23:06:09 +05:00
parent 7b0bae2f55
commit 73eab3e768
56 changed files with 1751 additions and 3163 deletions

BIN
2_EP/BIN/0681.bin Normal file

Binary file not shown.

BIN
2_EP/BIN/F0681.BIN Normal file

Binary file not shown.

BIN
2_EP/BIN/SLPS_028.25 Normal file

Binary file not shown.

View 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

View 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
View 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
View 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
View 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
View 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