This commit is contained in:
sShemet
2025-10-04 11:53:04 +05:00
commit 8e506a6912
53 changed files with 11261 additions and 0 deletions

BIN
0001_BATTLE_CODE.bin Normal file

Binary file not shown.

BIN
0681.bin Normal file

Binary file not shown.

Binary file not shown.

BIN
1097_CODE_ENG.bin Normal file

Binary file not shown.

BIN
1119_CITY_CODE_patched.bin Normal file

Binary file not shown.

Binary file not shown.

587
123 Normal file
View File

@@ -0,0 +1,587 @@
; 4 files included
; 839 lines
; 65 labels
; 0 equations
; C:\PSX\ASM\p2is_asm\cd_extra_main.asm
; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm
; C:\PSX\ASM\p2is_asm\charCalcs.asm
; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm
FFFFFFFF .psx ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 6
800522F0 setdrawtpage: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 9
8001ADC8 storecolor: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 10
80019D70 initcopycharchain: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 11
80019F0C makeshadowsmallchar: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 12
80019000 printbigdmatext: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 13
00008009 myaddr: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 15
FFFFFFFF .open ""C:\\PSX\\ASM\\p2is_asm\\SLPS_028.26"",0x8000F800 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 18
8000F800 .org 0x80090000 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 19
80090000 externalprint: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 21
80090000 move r3,s3 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 23
80090004 move s3,r4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 24
80090008 lhu v0,0x0(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 26
8009000C move s3,r3 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 27
80090010 srl v1,v0,0xD ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 28
80090014 bne v1,zero,0x80090024 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 29
80090018 clear v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 30
8009001C j 0x80019000 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 31
80090020 nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 32
80090024 myprintlineroutine: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 34
80090024 addiu sp,sp,-0x50 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 35
80090028 sw s6,0x40(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 36
8009002C move s6,a0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 37
80090030 sw s1,0x2C(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 38
80090034 move s1,a1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 39
80090038 sw s2,0x30(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 40
8009003C move s2,a2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 41
80090040 sw s3,0x34(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 42
80090044 andi v0,v0,0xFF ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 49
80090048 addiu s6,s6,0x2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 50
8009004C lui s3,-0x7FF7 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 53
80090050 sh v0,-0x10(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 54
80090054 sh v0,-0xE(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 55
80090058 lui s3,0x1F80 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 60
8009005C ori s3,s3,0x3D0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 61
80090060 lui t0,0xFF ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 63
80090064 ori t0,t0,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 64
80090068 sw s0,0x28(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 66
8009006C andi s0,a3,0xFF ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 67
80090070 move a0,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 68
80090074 initdma: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 71
80090074 lui a3,-0x7FF8 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 72
80090078 lui a2,-0x100 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 73
8009007C addiu t1,a3,-0x6C20 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 74
80090080 lw v1,-0x6C20(a3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 75
80090084 lbu a1,0x60(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 76
80090088 lui v0,-0x8000 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 77
8009008C sw ra,0x4C(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 80
80090090 sw s8,0x48(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 81
80090094 sw s7,0x44(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 82
80090098 sw s5,0x3C(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 83
8009009C sw s4,0x38(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 84
800900A0 preparedmachain: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 87
800900A0 and a2,v1,a2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 88
800900A4 andi a1,a1,0xFF ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 89
800900A8 and v1,v1,t0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 90
800900AC or s4,v1,v0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 91
800900B0 lw v0,0x4(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 93
800900B4 lw v1,0x0(s4) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 94
800900B8 addiu v0,v0,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 95
800900BC and v1,v1,t0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 96
800900C0 or a2,a2,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 97
800900C4 sw v0,0x4(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 98
800900C8 prepareattrs: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 101
800900C8 jal 0x8001ADC8 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 102
800900CC sw a2,-0x6C20(a3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 103
800900D0 move a0,s4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 104
800900D4 sll a1,s1,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 107
800900D8 sra a1,a1,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 108
800900DC sll a2,s2,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 109
800900E0 sra a2,a2,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 110
800900E4 jal 0x80019D70 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 111
800900E8 move a3,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 112
800900EC setupgpuregisters: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 115
800900EC lui a3,0x1F80 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 116
800900F0 ori a3,a3,0x348 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 117
800900F4 ori v0,r0,0x2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 121
800900F8 sh v0,0x1C(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 122
800900FC ori v0,r0,0xC ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 123
80090100 ori a1,r0,0xD ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 124
80090104 lui a0,-0x6000 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 125
80090108 scratchcputovraminit: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 128
80090108 sh v0,0x1E(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 129
8009010C ori a1,r0,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 130
80090110 sb a1,0x3(a3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 131
80090114 sw a0,0x4(a3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 132
80090118 lhu t0,0x9C(gp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 134
8009011C lhu v0,0x9E(gp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 135
80090120 lui v1,0x100 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 136
80090124 lui at,0x1F80 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 138
80090128 sw v1,0x37C(at) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 139
8009012C calculatecoords: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 145
8009012C lh a1,0x9C(gp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 146
80090130 move s8,s2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 147
80090134 sh t0,0x18(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 151
80090138 sh v0,0x1A(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 152
8009013C lw a0,0x18(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 153
80090140 lw v1,0x18(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 157
80090144 lw v0,0x1C(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 158
80090148 move t0,a1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 159
8009014C sw v0,0x8(a3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 160
80090150 lui v0,-0x7FFF ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 163
80090154 sw a0,0x8(a3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 164
80090158 lui t8,0x1F80 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 170
8009015C ori t8,t8,0x2E0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 171
80090160 addiu t7,v0,0x3E8 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 172
80090164 lwl t5,0x3(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 173
80090168 lwr t5,0x0(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 174
8009016C lwl t6,0x7(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 175
80090170 lwr t6,0x4(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 176
80090174 swl t5,0x3(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 177
80090178 swr t5,0x0(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 178
8009017C swl t6,0x7(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 179
80090180 swr t6,0x4(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 180
80090184 lwl t5,0xB(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 181
80090188 lwr t5,0x8(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 182
8009018C lwl t6,0xF(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 183
80090190 lwr t6,0xC(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 184
80090194 swl t5,0xB(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 185
80090198 swr t5,0x8(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 186
8009019C swl t6,0xF(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 187
800901A0 swr t6,0xC(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 188
800901A4 lwl t5,0x13(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 189
800901A8 lwr t5,0x10(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 190
800901AC lwl t6,0x17(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 191
800901B0 lwr t6,0x14(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 192
800901B4 swl t5,0x13(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 193
800901B8 swr t5,0x10(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 194
800901BC swl t6,0x17(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 195
800901C0 swr t6,0x14(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 196
800901C4 lwl t5,0x1B(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 197
800901C8 lwr t5,0x18(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 198
800901CC lwl t6,0x1F(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 199
800901D0 lwr t6,0x1C(t7) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 200
800901D4 swl t5,0x1B(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 201
800901D8 swr t5,0x18(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 202
800901DC swl t6,0x1F(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 203
800901E0 swr t6,0x1C(t8) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 204
800901E4 ori v0,r0,0x4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 207
800901E8 sb v0,0x3(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 208
800901EC ori v0,r0,0x64 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 209
800901F0 sb v0,0x7(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 210
800901F4 ori v0,r0,0x80 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 211
800901F8 sb v0,0x4(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 212
800901FC sb v0,0x5(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 213
80090200 sb v0,0x6(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 214
80090204 positionprocessing: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 217
80090204 bgez a1,0x80090210 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 218
80090208 sh s1,0x20(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 219
8009020C addoffsetx: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 221
8009020C addiu t0,a1,0x3F ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 222
80090210 calculatexoffset: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 224
80090210 sra v0,t0,0x6 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 225
80090214 sll v0,v0,0x6 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 226
80090218 subu v0,a1,v0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 227
8009021C lh v1,0x9E(gp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 228
80090220 sll v0,v0,0x2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 229
80090224 sb v0,0xC(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 230
80090228 ycoordinateprocessing: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 233
80090228 bgez v1,0x80090234 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 234
8009022C move v0,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 235
80090230 addoffsety: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 237
80090230 addiu v0,v1,0xFF ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 238
80090234 calculateyoffset: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 240
80090234 sra v0,v0,0x8 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 241
80090238 sll v0,v0,0x8 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 242
8009023C subu v0,v1,v0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 243
80090240 sb v0,0xD(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 244
80090244 lhu v1,0xA4(gp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 246
80090248 ori v0,r0,0x8 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 247
8009024C sh v0,0x10(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 248
80090250 ori v0,r0,0xC ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 249
80090254 sh v0,0x12(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 250
80090258 sh v1,0xE(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 251
8009025C loadcharacter: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 254
8009025C lbu a0,0x0(s6) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 255
80090260 nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 256
80090264 addiu s6,s6,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 262
80090268 lui s1,-0x7FF8 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 265
8009026C addiu s5,s1,-0x6C20 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 266
80090270 lui s0,0xFF ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 267
80090274 ori s0,s0,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 268
80090278 lui s7,-0x8000 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 269
8009027C nextchar: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 272
8009027C addiu r4,r4,-0x20 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 273
80090280 isfirstchar: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 278
80090280 jal 0x80090580 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 279
80090284 clear s2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 280
80090288 setupdmaforchar: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 283
80090288 lw v0,0xAC(gp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 284
8009028C lhu v1,0x4(s4) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 285
80090290 addiu v0,v0,0x6 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 286
80090294 mult v1,v0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 287
80090298 lui t2,-0x100 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 288
8009029C move t4,s4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 289
800902A0 addiu t3,sp,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 290
800902A4 move t1,s4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 291
800902A8 sh s8,0xA(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 293
800902AC lhu t5,0x20(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 294
800902B0 mflo t6 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 295
800902B4 addu v0,t5,t6 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 296
800902B8 sh v0,0x8(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 297
800902BC pageloop: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 300
800902BC lw v0,-0x6C20(s1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 301
800902C0 nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 302
800902C4 and a0,v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 303
800902C8 and v0,v0,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 304
800902CC or a1,v0,s7 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 305
800902D0 lw v0,0x4(s5) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 307
800902D4 lw v1,0x0(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 308
800902D8 addiu v0,v0,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 309
800902DC and v1,v1,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 310
800902E0 or a0,a0,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 311
800902E4 sw v0,0x4(s5) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 312
800902E8 sw a0,-0x6C20(s1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 313
800902EC copyrectcmd: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 316
800902EC lw t7,0x0(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 317
800902F0 lw t8,0x4(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 318
800902F4 lw t5,0x8(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 319
800902F8 lw t6,0xC(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 320
800902FC sw t7,0x0(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 322
80090300 sw t8,0x4(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 323
80090304 sw t5,0x8(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 324
80090308 sw t6,0xC(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 325
8009030C lw t7,0x10(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 327
80090310 nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 328
80090314 sw t7,0x10(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 329
80090318 dmacharaddres: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 332
80090318 lw v1,0x18(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 333
8009031C lw v0,0x0(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 334
80090320 lw v1,0x0(v1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 335
80090324 and v0,v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 336
80090328 and v1,v1,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 337
8009032C or v0,v0,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 338
80090330 sw v0,0x0(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 339
80090334 lw a0,0x18(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 341
80090338 nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 342
8009033C lw v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 343
80090340 and v1,a1,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 344
80090344 and v0,v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 345
80090348 or v0,v0,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 346
8009034C sw v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 347
80090350 sw a1,0x18(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 348
80090354 lhu v0,0x4(t4) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 351
80090358 nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 352
8009035C bne v0,zero,0x8009036C ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 353
80090360 clear t0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 354
80090364 sw a1,0x28(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 356
80090368 sw t8,0xC(t4) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 357
8009036C notfirstchar: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 359
8009036C lui a1,0x1F80 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 368
80090370 lw v0,-0x6C20(s1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 369
80090374 ori a1,a1,0x348 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 370
80090378 and a0,v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 371
8009037C and v0,v0,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 372
80090380 or a3,v0,s7 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 373
80090384 move a2,a3 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 374
80090388 lw v0,0x4(s5) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 380
8009038C lw v1,0x0(a3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 382
80090390 addiu v0,v0,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 383
80090394 and v1,v1,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 384
80090398 or a0,a0,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 386
8009039C sw v0,0x4(s5) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 387
800903A0 lui t3,0x1F80 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 389
800903A4 ori t3,t3,0x388 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 390
800903A8 andi v0,a3,0x3 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 392
800903AC beq v0,zero,0x80090408 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 394
800903B0 sw a0,-0x6C20(s1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 395
800903B4 copyby2bytes: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 401
800903B4 lwl t7,0x3(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 402
800903B8 lwr t7,0x0(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 403
800903BC lwl t8,0x7(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 404
800903C0 lwr t8,0x4(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 405
800903C4 lwl t5,0xB(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 406
800903C8 lwr t5,0x8(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 407
800903CC lwl t6,0xF(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 408
800903D0 lwr t6,0xC(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 409
800903D4 swl t7,0x3(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 411
800903D8 swr t7,0x0(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 412
800903DC swl t8,0x7(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 413
800903E0 swr t8,0x4(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 414
800903E4 swl t5,0xB(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 415
800903E8 swr t5,0x8(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 416
800903EC swl t6,0xF(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 417
800903F0 swr t6,0xC(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 418
800903F4 addiu a1,a1,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 420
800903F8 bne a1,t3,0x800903B4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 421
800903FC addiu a2,a2,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 422
80090400 j 0x80090434 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 424
80090404 nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 425
80090408 copy16bytes: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 428
80090408 lw t7,0x0(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 429
8009040C lw t8,0x4(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 430
80090410 lw t5,0x8(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 431
80090414 lw t6,0xC(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 432
80090418 sw t7,0x0(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 434
8009041C sw t8,0x4(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 435
80090420 sw t5,0x8(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 436
80090424 sw t6,0xC(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 437
80090428 addiu a1,a1,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 439
8009042C bne a1,t3,0x80090408 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 440
80090430 addiu a2,a2,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 441
80090434 last4bytescopy: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 444
80090434 lwl t7,0x3(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 445
80090438 lwr t7,0x0(a1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 446
8009043C nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 449
80090440 swl t7,0x3(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 450
80090444 swr t7,0x0(a2) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 451
80090448 finaldmaupdate: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 463
80090448 lw v1,0x18(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 465
8009044C lw v0,0x0(a3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 466
80090450 lw v1,0x0(v1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 467
80090454 and v0,v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 468
80090458 and v1,v1,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 469
8009045C or v0,v0,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 470
80090460 sw v0,0x0(a3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 471
80090464 lw a0,0x18(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 473
80090468 nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 474
8009046C lw v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 475
80090470 and v1,a3,s0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 476
80090474 and v0,v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 477
80090478 or v0,v0,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 478
8009047C sw v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 479
80090480 sw a3,0x18(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 481
80090484 addiu t1,t1,0x4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 482
80090488 addiu v0,t4,0x8 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 483
8009048C sltu v0,t1,v0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 485
80090490 bne v0,zero,0x800902BC ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 486
80090494 nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 487
80090498 spacecharjumphere: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 490
80090498 lhu v0,0x4(s4) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 491
8009049C nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 492
800904A0 addiu v0,v0,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 493
800904A4 lui t3,-0x7FF7 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 496
800904A8 lhu v1,-0x10(t3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 497
800904AC lbu r4,0x0(s6) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 498
800904B0 addiu s6,s6,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 499
800904B4 sh v0,0x4(s4) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 500
800904B8 lhu v0,-0xE(t3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 502
800904BC nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 503
800904C0 addiu v0,v0,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 504
800904C4 sh v0,-0xE(t3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 505
800904C8 bne v0,zero,0x8009027C ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 511
800904CC nop ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 512
800904D0 textend: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 516
800904D0 clear s2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 517
800904D4 lui s3,-0x7FF8 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 518
800904D8 addiu s5,s3,-0x6C20 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 519
800904DC lui s1,0xFF ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 520
800904E0 ori s1,s1,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 521
800904E4 move s0,s4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 522
800904E8 clear a1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 523
800904EC pagetloop: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 526
800904EC ori a2,r0,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 527
800904F0 addu s2,s2,a2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 528
800904F4 lui v0,-0x8000 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 529
800904F8 lui a0,-0x100 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 530
800904FC lw v1,-0x6C20(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 532
80090500 lw a3,0xA0(gp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 533
80090504 and v1,v1,s1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 534
80090508 or v1,v1,v0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 535
8009050C sw v1,0x30(s0) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 536
80090510 lw v0,-0x6C20(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 538
80090514 lw v1,0x0(v1) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 539
80090518 and v0,v0,a0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 540
8009051C and v1,v1,s1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 541
80090520 lw a0,0x4(s5) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 542
80090524 or v0,v0,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 543
80090528 sw v0,-0x6C20(s3) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 544
8009052C addiu a0,a0,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 545
80090530 sw a0,0x4(s5) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 546
80090534 lw a0,0x30(s0) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 548
80090538 jal 0x800522F0 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 549
8009053C addiu s0,s0,0x4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 550
80090540 sltiu v0,s2,0x2 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 552
80090544 bne v0,zero,0x800904EC ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 553
80090548 clear a1 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 554
8009054C returnfromfunction: ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 557
8009054C move v0,s4 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 558
80090550 lw ra,0x4C(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 559
80090554 lw s8,0x48(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 560
80090558 lw s7,0x44(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 561
8009055C lw s6,0x40(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 562
80090560 lw s5,0x3C(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 563
80090564 lw s4,0x38(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 564
80090568 lw s3,0x34(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 565
8009056C lw s2,0x30(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 566
80090570 lw s1,0x2C(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 567
80090574 lw s0,0x28(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 568
80090578 jr ra ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 570
8009057C addiu sp,sp,0x50 ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 571
80090580 makecharpixelscustom: ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 4
80090580 addiu sp,sp,-0x18 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 6
80090584 move a1,a0 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 7
80090588 lui a0,0x1F80 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 8
8009058C ori a0,a0,0x358 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 9
80090590 sw ra,0x10(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 11
80090594 ori a2,r0,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 13
80090598 lbu t2,0xA8(gp) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 15
8009059C move t0,r4 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 16
800905A0 lui v1,-0x7FE1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 17
800905A4 ori v1,v1,-0x5600 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 18
800905A8 sll v0,a1,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 19
800905AC addu v0,v0,a1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 20
800905B0 sll v0,v0,0x2 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 21
800905B4 addu t1,v0,v1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 22
800905B8 ori r6,r0,0x6 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 23
800905BC move v0,r6 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 24
800905C0 beq v0,zero,0x80090680 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 25
800905C4 addiu r6,r6,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 26
800905C8 lui a3,0x1F80 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 27
800905CC ori a3,a3,0x2E0 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 28
800905D0 charloop: ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 29
800905D0 lhu v1,0x0(t1) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 30
800905D4 nop ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 31
800905D8 andi r4,v1,0xF ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 32
800905DC srl v1,v1,0x4 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 33
800905E0 andi v0,v1,0xF ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 34
800905E4 sll v0,v0,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 35
800905E8 addu v0,v0,a3 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 36
800905EC lhu v0,0x0(v0) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 37
800905F0 nop ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 38
800905F4 mult v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 39
800905F8 sll r4,r4,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 40
800905FC addu r4,r4,a3 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 41
80090600 mflo a1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 42
80090604 lhu v0,0x0(r4) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 43
80090608 nop ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 44
8009060C mult v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 45
80090610 srl v1,v1,0x4 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 46
80090614 andi r4,v1,0xF ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 47
80090618 srl v1,v1,0x4 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 48
8009061C sll v1,v1,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 49
80090620 addu v1,v1,a3 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 50
80090624 sll v0,a1,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 51
80090628 mflo t4 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 52
8009062C or v0,t4,v0 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 53
80090630 sw v0,0x0(t0) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 54
80090634 lhu v0,0x0(v1) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 55
80090638 nop ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 56
8009063C mult v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 57
80090640 sll r4,r4,0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 58
80090644 addu r4,r4,a3 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 59
80090648 mflo a1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 60
8009064C lhu v0,0x0(r4) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 61
80090650 nop ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 62
80090654 mult v0,t2 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 63
80090658 addiu t1,t1,0x2 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 64
8009065C move v1,a2 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 65
80090660 addiu a2,a2,-0x1 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 66
80090664 addiu t0,t0,0x4 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 67
80090668 sll v0,a1,0x10 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 68
8009066C mflo t4 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 69
80090670 or v0,t4,v0 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 70
80090674 sw v0,0x0(t0) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 71
80090678 bne v1,zero,0x800905D0 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 72
8009067C addiu t0,t0,0x4 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 73
80090680 charloaded: ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 74
80090680 lbu v1,0xA9(gp) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 76
80090684 nop ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 77
80090688 bne v1,v0,0x8009069C ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 78
8009068C nop ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 79
80090690 lui a0,0x1F80 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 80
80090694 jal 0x80019F0C ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 81
80090698 ori a0,a0,0x358 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 82
8009069C notshadow: ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 84
8009069C lw ra,0x10(sp) ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 85
800906A0 nop ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 86
800906A4 jr ra ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 87
800906A8 addiu sp,sp,0x18 ; C:\PSX\ASM\p2is_asm\cd_extra_charload.asm line 88
800906AC returncharsinstring: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 1
800906AC lhu v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 4
800906B0 nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 5
800906B4 srl v0,v0,0xD ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 6
800906B8 bne v0,zero,0x800906C8 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 7
800906BC clear v1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 8
800906C0 j 0x800906F8 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 11
800906C4 nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 12
800906C8 ismy1bytestring: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 13
800906C8 lhu v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 14
800906CC nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 15
800906D0 andi v0,v0,0xFF ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 16
800906D4 andi v1,v0,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 18
800906D8 beq v1,zero,0x800906E4 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 19
800906DC nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 20
800906E0 addiu v0,v0,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 21
800906E4 notand1: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 23
800906E4 sra v0,v0,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 24
800906E8 addiu v0,v0,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 25
800906EC jr ra ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 26
800906F0 move v1,v0 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 27
800906F4 getnewchar: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 29
800906F4 addiu v1,v1,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 30
800906F8 startreading: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 31
800906F8 lhu v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 32
800906FC nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 33
80090700 sltiu v0,v0,0x1000 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 34
80090704 bne v0,zero,0x800906F4 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 35
80090708 addiu a0,a0,0x2 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 36
8009070C jr ra ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 37
80090710 move v0,v1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 38
80090714 calcnextxcustom: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 41
80090714 addiu sp,sp,-0x18 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 42
80090718 sw ra,0x10(sp) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 43
8009071C lhu v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 45
80090720 nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 46
80090724 andi v1,v0,0xFF ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 47
80090728 srl v0,v0,0xD ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 48
8009072C beq v0,zero,0x8009073C ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 49
80090730 nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 50
80090734 j 0x80090744 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 51
80090738 move v0,v1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 52
8009073C japoldtext: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 53
8009073C jal 0x800906AC ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 54
80090740 nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 55
80090744 ihavestringlength: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 56
80090744 sll v1,v0,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 57
80090748 addu v1,v1,v0 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 58
8009074C lw ra,0x10(sp) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 59
80090750 sll v0,v1,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 60
80090754 jr ra ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 61
80090758 addiu sp,sp,0x18 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 62
8009075C retuncharstocity: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 64
8009075C lhu v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 65
80090760 nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 66
80090764 srl v0,v0,0xD ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 67
80090768 bne v0,zero,0x80090778 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 68
8009076C clear v1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 69
80090770 j 0x800906F8 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 71
80090774 nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 72
80090778 ismy1bytecity: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 73
80090778 lhu v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 74
8009077C nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 75
80090780 andi v0,v0,0xFF ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 76
80090784 jr ra ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 77
80090788 move v1,v0 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 78
8009078C retuncharstocitydiv2: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 81
8009078C lhu v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 82
80090790 nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 83
80090794 srl v0,v0,0xD ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 84
80090798 bne v0,zero,0x800907A8 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 85
8009079C clear v1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 86
800907A0 j 0x800906F8 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 88
800907A4 nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 89
800907A8 ismy1bytecitydiv2: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 90
800907A8 lhu v0,0x0(a0) ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 91
800907AC nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 92
800907B0 andi v0,v0,0xFF ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 93
800907B4 andi v1,v0,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 95
800907B8 beq v1,zero,0x800907C4 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 96
800907BC nop ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 97
800907C0 addiu v0,v0,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 98
800907C4 notand1_2: ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 100
800907C4 sra v0,v0,0x1 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 101
800907C8 jr ra ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 103
800907CC move v1,v0 ; C:\PSX\ASM\p2is_asm\charCalcs.asm line 104
800907D0 .close ; C:\PSX\ASM\p2is_asm\cd_extra_main.asm line 577
FFFFFFFF .open ""C:\\PSX\\ASM\\p2is_asm\\SLPS_028.26"",0x8000F800 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 7
8000F800 .org 0x8001927C ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 16
8001927C addiu v0,v0,0x6 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 17
80019280 .org 0x8001CD58 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 31
8001CD58 jal 0x80090000 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 32
8001CD5C .org 0x8001CDD8 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 33
8001CDD8 jal 0x80090000 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 34
8001CDDC .org 0x8001C098 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 36
8001C098 jal 0x80090000 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 37
8001C09C .org 0x8001C10C ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 38
8001C10C jal 0x80090000 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 39
8001C110 .org 0x8001C388 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 45
8001C388 jal 0x80090000 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 46
8001C38C .org 0x8001ABF4 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 51
8001ABF4 j 0x800906AC ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 52
8001ABF8 clear v1 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 53
8001ABFC .org 0x8001AC1C ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 58
8001AC1C j 0x80090714 ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 61
8001AC20 nop ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 62
8001AC24 .close ; C:\PSX\ASM\p2is_asm\cd_extra_txtpatches.asm line 64

61
123_EP Normal file
View File

@@ -0,0 +1,61 @@
; 1 file included
; 76 lines
; 8 labels
; 0 equations
; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm
FFFFFFFF .psx ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 5
FFFFFFFF .open ""C:\\Users\\ShemetSA.RADIO\\Documents\\GitHub\\p2is_asm\\0681.BIN"",0x800AB000; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 7
800AB000 .org 0x800B5300 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 9
800B5300 .area 0x000000FC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 10
800B5300 lhu v0,0x0(s0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 14
800B5304 move r4,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 15
800B5308 andi v0,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 17
800B530C addu s0,s0,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 19
800B5310 addiu s0,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 20
800B5314 andi v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 21
800B5318 beq v0,zero,0x800B5324 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 22
800B531C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 23
800B5320 addiu s0,s0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 24
800B5324 notand1: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 25
800B5324 andi r5,s3,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 27
800B5328 andi r6,s1,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 28
800B532C ori r7,r0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 29
800B5330 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 30
800B5334 sw r7,0x10(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 31
800B5338 lui v1,-0x7FF4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 33
800B533C sw v0,-0x6F8C(v1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 34
800B5340 lhu v1,0x0(s0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 35
800B5344 ori v0,r0,0x1103 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 36
800B5348 beq v1,v0,0x800B53AC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 37
800B534C addiu s0,s0,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 38
800B5350 addiu s1,s1,0xE ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 39
800B5354 nextline: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 42
800B5354 lhu v0,0x0(s0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 43
800B5358 move r4,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 47
800B535C andi v0,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 48
800B5360 addu s0,s0,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 50
800B5364 addiu s0,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 51
800B5368 andi v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 52
800B536C beq v0,zero,0x800B5378 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 53
800B5370 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 54
800B5374 addiu s0,s0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 55
800B5378 notand1_2: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 56
800B5378 andi r5,s3,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 58
800B537C andi r6,s1,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 59
800B5380 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 60
800B5384 ori r7,r0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 61
800B5388 lui v1,-0x7FF4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 62
800B538C lw r4,-0x6F8C(v1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 63
800B5390 jal 0x8001B8D8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 64
800B5394 move r5,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 65
800B5398 lhu v0,0x0(s0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 67
800B539C ori v1,r0,0x1103 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 68
800B53A0 addiu s0,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 70
800B53A4 bne v1,v0,0x800B5354 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 71
800B53A8 addiu s1,s1,0xE ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 72
800B53AC textdone: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 74
800B53AC .fill 0x00000050,0x00 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 74
800B53FC .endarea ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 74
800B53FC .close ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\EP_TITLE_WINDOW_TEXT_PRINT.asm line 76

74
123_battle Normal file
View File

@@ -0,0 +1,74 @@
; 1 file included
; 102 lines
; 10 labels
; 0 equations
; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm
FFFFFFFF .psx ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 3
FFFFFFFF .open ""C:\\Users\\ShemetSA.RADIO\\Documents\\GitHub\\p2is_asm\\0001_BATTLE_CODE.bin"",0x800AB000; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 5
800EF150 simplecopystring: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 7
800AB000 .org 0x800F9E60 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 9
800F9E60 lhu r2,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 11
800F9E64 addiu r5,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 12
800F9E68 sh r2,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 13
800F9E6C andi r3,r2,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 14
800F9E70 addiu r4,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 15
800F9E74 nextch: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 16
800F9E74 lbu r2,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 17
800F9E78 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 18
800F9E7C sb r2,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 19
800F9E80 addiu r4,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 20
800F9E84 addiu r5,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 21
800F9E88 addiu r3,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 22
800F9E8C bne r3,zero,0x800F9E74 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 23
800F9E90 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 24
800F9E94 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 25
800F9E98 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 26
800F9E9C checkandcopyrusinscript: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 30
800F9E9C lhu r3,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 31
800F9EA0 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 32
800F9EA4 srl r3,r3,0xD ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 33
800F9EA8 bne v1,zero,0x800F9EB8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 34
800F9EAC nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 35
800F9EB0 j 0x800EF150 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 36
800F9EB4 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 37
800F9EB8 mycopy: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 39
800F9EB8 lhu r3,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 40
800F9EBC nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 41
800F9EC0 andi r3,r3,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 42
800F9EC4 addiu r3,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 43
800F9EC8 nx: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 44
800F9EC8 lbu r2,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 45
800F9ECC nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 46
800F9ED0 sb r2,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 47
800F9ED4 addiu r4,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 48
800F9ED8 addiu r3,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 49
800F9EDC bne r3,zero,0x800F9EC8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 50
800F9EE0 addiu r5,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 51
800F9EE4 andi r2,r4,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 54
800F9EE8 beq r2,zero,0x800F9EF4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 55
800F9EEC nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 56
800F9EF0 addiu r4,r4,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 57
800F9EF4 notand1_3: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 60
800F9EF4 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 61
800F9EF8 move r2,r4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 62
800F9EFC .org 0x800F9F20 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 67
800F9F20 lui r2,-0x7FEF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 68
800F9F24 lbu r2,0xBC8(r2) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 69
800F9F28 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 70
800F9F2C ori r3,r0,0x3 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 71
800F9F30 bne r2,r3,0x800F9F3C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 72
800F9F34 ori r3,r0,0x30 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 73
800F9F38 ori r3,r0,0x80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 75
800F9F3C not3: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 76
800F9F3C lui r2,0x1F49 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 77
800F9F40 sb r3,-0xC(r2) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 78
800F9F44 j 0x80016E10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 79
800F9F48 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 80
800F9F4C .org 0x800AD4E8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 84
800AD4E8 .org 0x800F1F60 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 94
800F1F60 jal 0x800F9E9C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 95
800F1F64 .org 0x800F20BC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 96
800F20BC jal 0x800F9E9C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 97
800F20C0 .close ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 102

692
123_new Normal file
View File

@@ -0,0 +1,692 @@
; 6 files included
; 941 lines
; 58 labels
; 0 equations
; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm
; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm
; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm
; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm
; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm
; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm
FFFFFFFF .psx ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 6
800542CC setdrawtpage: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 10
8001B0C8 storecolor: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 11
8001A070 initcopycharchain: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 12
8001A08F makecharpixels: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 13
8001A284 generatesmallchar: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 14
8001A20C makeshadowsmallchar: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 15
80019300 printbigdmatext: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 16
00008009 myaddr: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 18
FFFFFFFF .open ""C:\\Users\\ShemetSA.RADIO\\Documents\\GitHub\\p2is_asm\\SLPS_021.00"",0x8000F800; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 21
8000F800 .org 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 28
80090000 externalprint: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 29
80090000 move r3,s3 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 31
80090004 move s3,r4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 32
80090008 lhu v0,0x0(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 34
8009000C move s3,r3 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 35
80090010 srl v1,v0,0xD ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 36
80090014 bne v1,zero,0x80090024 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 37
80090018 clear v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 38
8009001C j 0x80019300 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 39
80090020 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 40
80090024 myprintlineroutine: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 43
80090024 addiu sp,sp,-0x50 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 44
80090028 sw s6,0x40(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 45
8009002C move s6,r4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 46
80090030 sw s1,0x2C(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 47
80090034 move s1,r5 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 48
80090038 sw s2,0x30(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 49
8009003C move s2,r6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 50
80090040 sw s3,0x34(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 51
80090044 andi v0,v0,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 58
80090048 addiu s6,s6,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 59
8009004C lui s3,-0x7FF7 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 63
80090050 sw v0,-0x10(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 64
80090054 lui s3,0x1F80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 67
80090058 ori s3,s3,0x3D0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 68
8009005C lui t0,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 69
80090060 ori t0,t0,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 70
80090064 sw s0,0x28(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 72
80090068 andi s0,r7,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 73
8009006C move r4,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 74
80090070 lui r7,-0x7FF8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 75
80090074 lui r6,-0x100 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 76
80090078 addiu t1,r7,-0x4930 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 78
8009007C lw v1,-0x4930(r7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 79
80090080 lbu r5,0x60(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 80
80090084 lui v0,-0x8000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 81
80090088 sw ra,0x4C(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 82
8009008C sw s8,0x48(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 83
80090090 sw s7,0x44(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 84
80090094 sw s5,0x3C(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 85
80090098 sw s4,0x38(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 86
8009009C and r6,v1,r6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 88
800900A0 andi r5,r5,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 89
800900A4 and v1,v1,t0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 90
800900A8 or r20,v1,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 91
800900AC lw v0,0x4(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 92
800900B0 lw v1,0x0(r20) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 93
800900B4 addiu v0,v0,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 94
800900B8 and v1,v1,t0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 95
800900BC or r6,r6,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 96
800900C0 sw v0,0x4(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 97
800900C4 jal 0x8001B0C8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 98
800900C8 sw r6,-0x4930(r7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 99
800900CC move r4,r20 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 100
800900D0 sll r5,s1,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 101
800900D4 sra r5,r5,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 102
800900D8 sll r6,s2,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 103
800900DC sra r6,r6,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 104
800900E0 jal 0x8001A070 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 105
800900E4 move r7,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 106
800900E8 lui r7,0x1F80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 110
800900EC ori r7,r7,0x348 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 111
800900F0 ori v0,r0,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 114
800900F4 sh v0,0x1C(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 115
800900F8 ori v0,r0,0xC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 116
800900FC lui r4,-0x6000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 118
80090100 sh v0,0x1E(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 119
80090104 ori r5,r0,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 124
80090108 sb r5,0x3(r7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 125
8009010C sw r4,0x4(r7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 126
80090110 lhu t0,0xA0(gp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 127
80090114 lhu v0,0xA2(gp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 128
80090118 lui v1,0x100 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 129
8009011C lui at,0x1F80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 130
80090120 sw v1,0x388(at) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 131
80090124 sety1: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 132
80090124 move s8,s2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 133
80090128 lh r5,0xA0(gp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 134
8009012C sh t0,0x18(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 135
80090130 sh v0,0x1A(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 136
80090134 lw r4,0x18(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 137
80090138 lw v0,0x1C(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 138
8009013C sw r4,0x8(r7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 139
80090140 sw v0,0xC(r7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 140
80090144 lui v0,-0x7FFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 142
80090148 lui t8,0x1F80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 2
8009014C ori t8,t8,0x2E0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 3
80090150 addiu t7,v0,0x3E8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 4
80090154 lwl t5,0x3(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 6
80090158 lwr t5,0x0(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 7
8009015C lwl t6,0x7(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 8
80090160 lwr t6,0x4(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 9
80090164 swl t5,0x3(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 11
80090168 swr t5,0x0(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 12
8009016C swl t6,0x7(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 13
80090170 swr t6,0x4(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 14
80090174 lwl t5,0xB(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 17
80090178 lwr t5,0x8(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 18
8009017C lwl t6,0xF(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 19
80090180 lwr t6,0xC(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 20
80090184 swl t5,0xB(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 22
80090188 swr t5,0x8(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 23
8009018C swl t6,0xF(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 24
80090190 swr t6,0xC(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 25
80090194 lwl t5,0x13(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 28
80090198 lwr t5,0x10(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 29
8009019C lwl t6,0x17(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 30
800901A0 lwr t6,0x14(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 31
800901A4 swl t5,0x13(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 33
800901A8 swr t5,0x10(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 34
800901AC swl t6,0x17(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 35
800901B0 swr t6,0x14(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 36
800901B4 lwl t5,0x1B(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 39
800901B8 lwr t5,0x18(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 40
800901BC lwl t6,0x1F(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 41
800901C0 lwr t6,0x1C(t7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 42
800901C4 swl t5,0x1B(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 44
800901C8 swr t5,0x18(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 45
800901CC swl t6,0x1F(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 46
800901D0 swr t6,0x1C(t8) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\4bitPattern.asm line 47
800901D4 ori v0,r0,0x4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 148
800901D8 sb v0,0x3(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 149
800901DC ori v0,r0,0x64 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 150
800901E0 sb v0,0x7(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 151
800901E4 ori v0,r0,0x80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 152
800901E8 sb v0,0x4(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 153
800901EC sb v0,0x5(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 154
800901F0 sb v0,0x6(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 155
800901F4 bgez r5,0x80090200 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 156
800901F8 setx1: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 157
800901F8 sh s1,0x20(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 158
800901FC addiu t0,r5,0x3F ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 159
80090200 lab_800194fc: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 160
80090200 sra v0,t0,0x6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 161
80090204 sll v0,v0,0x6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 162
80090208 subu v0,r5,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 163
8009020C lh v1,0xA2(gp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 164
80090210 sll v0,v0,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 165
80090214 sb v0,0xC(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 166
80090218 bgez v1,0x80090224 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 167
8009021C move v0,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 168
80090220 addiu v0,v1,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 169
80090224 lab_80019520: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 170
80090224 sra v0,v0,0x8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 171
80090228 sll v0,v0,0x8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 172
8009022C subu v0,v1,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 173
80090230 sb v0,0xD(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 174
80090234 lhu v1,0xA8(gp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 175
80090238 ori v0,r0,0x8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 177
8009023C sh v0,0x10(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 178
80090240 sh v1,0xE(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 179
80090244 ori v0,r0,0xC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 180
80090248 sh v0,0x12(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 181
8009024C lbu r4,0x0(s6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 184
80090250 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 185
80090254 addiu s6,s6,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 186
80090258 lui s1,-0x7FF8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 188
8009025C addiu s5,s1,-0x4930 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 189
80090260 lui s0,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 190
80090264 ori s0,s0,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 191
80090268 lui s7,-0x8000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 192
8009026C nextchar: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 193
8009026C addiu r4,r4,-0x20 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 194
80090270 bne r4,zero,0x800902A8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 199
80090274 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 200
80090278 lui t2,-0x7FF7 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 202
8009027C lh v0,-0xE(t2) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 203
80090280 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 204
80090284 lh t3,-0x10(t2) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 205
80090288 addiu v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 206
8009028C beq v0,t3,0x800902A8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 207
80090290 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 208
80090294 sh v0,-0xE(t2) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 210
80090298 lbu r4,0x0(s6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 211
8009029C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 212
800902A0 j 0x8009026C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 213
800902A4 addiu s6,s6,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 214
800902A8 spacecheckbranch: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 217
800902A8 jal 0x800905AC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 219
800902AC clear r18 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 220
800902B0 lw v0,0xB0(gp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 223
800902B4 lui t2,-0x7FF7 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 224
800902B8 lh v1,-0xE(t2) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 225
800902BC addiu v0,v0,0x6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 227
800902C0 mult v1,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 230
800902C4 lui t2,-0x100 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 234
800902C8 move t4,r20 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 235
800902CC addiu t3,sp,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 236
800902D0 move t1,r20 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 237
800902D4 gety: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 238
800902D4 sh s8,0xA(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 239
800902D8 getx: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 240
800902D8 lhu t5,0x20(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 241
800902DC mflo t6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 242
800902E0 addu v0,t5,t6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 243
800902E4 sh v0,0x8(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 244
800902E8 pageloop: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 245
800902E8 lw v0,-0x4930(s1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 247
800902EC nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 248
800902F0 and r4,v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 249
800902F4 and v0,v0,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 250
800902F8 or r5,v0,s7 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 251
800902FC lw v0,0x4(s5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 252
80090300 lw v1,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 253
80090304 addiu v0,v0,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 254
80090308 and v1,v1,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 255
8009030C or r4,r4,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 256
80090310 sw v0,0x4(s5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 257
80090314 sw r4,-0x4930(s1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 258
80090318 copycmdfromscratch: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 259
80090318 lw t6,0x0(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 261
8009031C lw t7,0x4(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 262
80090320 lw t8,0x8(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 263
80090324 lw t5,0xC(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 264
80090328 sw t6,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 265
8009032C sw t7,0x4(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 266
80090330 sw t8,0x8(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 267
80090334 sw t5,0xC(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 268
80090338 lw t6,0x10(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 269
8009033C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 270
80090340 sw t6,0x10(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 271
80090344 lw v1,0x18(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 274
80090348 lw v0,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 275
8009034C lw v1,0x0(v1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 276
80090350 and v0,v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 277
80090354 and v1,v1,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 278
80090358 or v0,v0,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 279
8009035C sw v0,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 280
80090360 lw r4,0x18(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 281
80090364 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 282
80090368 lw v0,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 283
8009036C and v1,r5,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 284
80090370 and v0,v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 285
80090374 or v0,v0,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 286
80090378 sw v0,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 287
8009037C sw r5,0x18(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 288
80090380 lhu v0,0x4(t4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 289
80090384 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 290
80090388 bne v0,zero,0x80090398 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 291
8009038C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 292
80090390 sw r5,0x28(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 293
80090394 sw t8,0xC(t4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 294
80090398 notfirstchar: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 296
80090398 lui r5,0x1F80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 297
8009039C lw v0,-0x4930(s1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 298
800903A0 ori r5,r5,0x348 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 299
800903A4 and r4,v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 300
800903A8 and v0,v0,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 301
800903AC or r7,v0,s7 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 302
800903B0 move r6,r7 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 303
800903B4 lw v0,0x4(s5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 304
800903B8 lw v1,0x0(r7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 305
800903BC addiu v0,v0,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 306
800903C0 and v1,v1,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 307
800903C4 or r4,r4,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 308
800903C8 sw v0,0x4(s5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 309
800903CC andi v0,r7,0x3 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 310
800903D0 lui t3,0x1F80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 312
800903D4 ori t3,t3,0x388 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 313
800903D8 beq v0,zero,0x80090434 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 315
800903DC sw r4,-0x4930(s1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 316
800903E0 copyby2bytes: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 320
800903E0 lwl t6,0x3(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 321
800903E4 lwr t6,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 322
800903E8 lwl t7,0x7(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 323
800903EC lwr t7,0x4(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 324
800903F0 lwl t8,0xB(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 325
800903F4 lwr t8,0x8(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 326
800903F8 lwl t5,0xF(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 327
800903FC lwr t5,0xC(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 328
80090400 swl t6,0x3(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 329
80090404 swr t6,0x0(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 330
80090408 swl t7,0x7(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 331
8009040C swr t7,0x4(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 332
80090410 swl t8,0xB(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 333
80090414 swr t8,0x8(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 334
80090418 swl t5,0xF(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 335
8009041C swr t5,0xC(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 336
80090420 addiu r5,r5,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 337
80090424 bne r5,t3,0x800903E0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 338
80090428 addiu r6,r6,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 339
8009042C j 0x80090460 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 340
80090430 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 341
80090434 copy16bytes: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 342
80090434 lw t6,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 343
80090438 lw t7,0x4(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 344
8009043C lw t8,0x8(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 345
80090440 lw t5,0xC(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 346
80090444 sw t6,0x0(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 347
80090448 sw t7,0x4(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 348
8009044C sw t8,0x8(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 349
80090450 sw t5,0xC(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 350
80090454 addiu r5,r5,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 351
80090458 bne r5,t3,0x80090434 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 352
8009045C addiu r6,r6,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 353
80090460 last4bytescopy: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 354
80090460 lwl t6,0x3(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 355
80090464 lwr t6,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 356
80090468 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 357
8009046C swl t6,0x3(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 358
80090470 swr t6,0x0(r6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 359
80090474 lw v1,0x18(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 364
80090478 lw v0,0x0(r7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 365
8009047C lw v1,0x0(v1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 366
80090480 and v0,v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 367
80090484 and v1,v1,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 368
80090488 or v0,v0,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 369
8009048C sw v0,0x0(r7) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 370
80090490 lw r4,0x18(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 371
80090494 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 372
80090498 lw v0,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 373
8009049C and v1,r7,s0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 374
800904A0 and v0,v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 375
800904A4 or v0,v0,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 376
800904A8 sw v0,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 377
800904AC sw r7,0x18(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 379
800904B0 addiu t1,t1,0x4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 380
800904B4 addiu v0,t4,0x8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 381
800904B8 sltu v0,t1,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 382
800904BC bne v0,zero,0x800902E8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 383
800904C0 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 384
800904C4 lhu v0,0x4(r20) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 387
800904C8 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 388
800904CC addiu v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 389
800904D0 sh v0,0x4(r20) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 390
800904D4 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 391
800904D8 lui t3,-0x7FF7 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 392
800904DC lhu v0,-0xE(t3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 393
800904E0 lhu v1,-0x10(t3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 394
800904E4 addiu v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 395
800904E8 lbu r4,0x0(s6) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 396
800904EC sh v0,-0xE(t3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 398
800904F0 addiu s6,s6,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 399
800904F4 bne v0,v1,0x8009026C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 401
800904F8 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 402
800904FC textend: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 403
800904FC clear r18 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 404
80090500 lui s3,-0x7FF8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 405
80090504 addiu s5,s3,-0x4930 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 406
80090508 lui s1,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 407
8009050C ori s1,s1,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 408
80090510 move s0,r20 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 409
80090514 clear r5 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 410
80090518 pagetloop: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 411
80090518 ori r6,r0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 412
8009051C addu r18,r18,r6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 413
80090520 lui v0,-0x8000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 414
80090524 lui r4,-0x100 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 415
80090528 lw v1,-0x4930(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 416
8009052C lw r7,0xA4(gp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 417
80090530 and v1,v1,s1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 418
80090534 or v1,v1,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 419
80090538 sw v1,0x30(s0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 420
8009053C lw v0,-0x4930(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 421
80090540 lw v1,0x0(v1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 422
80090544 and v0,v0,r4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 423
80090548 and v1,v1,s1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 424
8009054C lw r4,0x4(s5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 425
80090550 or v0,v0,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 426
80090554 sw v0,-0x4930(s3) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 427
80090558 addiu r4,r4,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 428
8009055C sw r4,0x4(s5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 429
80090560 lw r4,0x30(s0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 430
80090564 jal 0x800542CC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 431
80090568 addiu s0,s0,0x4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 432
8009056C sltiu v0,r18,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 433
80090570 bne v0,zero,0x80090518 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 434
80090574 clear r5 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 435
80090578 move v0,r20 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 436
8009057C lw ra,0x4C(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 438
80090580 lw s8,0x48(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 439
80090584 lw s7,0x44(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 440
80090588 lw s6,0x40(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 441
8009058C lw s5,0x3C(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 442
80090590 lw s4,0x38(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 443
80090594 lw s3,0x34(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 444
80090598 lw s2,0x30(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 445
8009059C lw s1,0x2C(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 446
800905A0 lw s0,0x28(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 447
800905A4 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 449
800905A8 addiu sp,sp,0x50 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 450
800905AC makecharpixelscustom: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 4
800905AC addiu sp,sp,-0x18 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 6
800905B0 move a1,a0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 7
800905B4 lui a0,0x1F80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 8
800905B8 ori a0,a0,0x358 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 9
800905BC sw ra,0x10(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 11
800905C0 ori a2,r0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 13
800905C4 lbu t2,0xAC(gp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 15
800905C8 move t0,r4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 16
800905CC lui v1,-0x7FE1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 17
800905D0 ori v1,v1,-0x5600 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 18
800905D4 sll v0,a1,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 19
800905D8 addu v0,v0,a1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 20
800905DC sll v0,v0,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 21
800905E0 addu t1,v0,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 22
800905E4 ori r6,r0,0x6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 23
800905E8 move v0,r6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 24
800905EC beq v0,zero,0x800906AC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 25
800905F0 addiu r6,r6,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 26
800905F4 lui a3,0x1F80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 27
800905F8 ori a3,a3,0x2E0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 28
800905FC charloop: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 29
800905FC lhu v1,0x0(t1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 30
80090600 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 31
80090604 andi r4,v1,0xF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 32
80090608 srl v1,v1,0x4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 33
8009060C andi v0,v1,0xF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 34
80090610 sll v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 35
80090614 addu v0,v0,a3 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 36
80090618 lhu v0,0x0(v0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 37
8009061C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 38
80090620 mult v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 39
80090624 sll r4,r4,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 40
80090628 addu r4,r4,a3 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 41
8009062C mflo a1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 42
80090630 lhu v0,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 43
80090634 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 44
80090638 mult v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 45
8009063C srl v1,v1,0x4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 46
80090640 andi r4,v1,0xF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 47
80090644 srl v1,v1,0x4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 48
80090648 sll v1,v1,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 49
8009064C addu v1,v1,a3 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 50
80090650 sll v0,a1,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 51
80090654 mflo t4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 52
80090658 or v0,t4,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 53
8009065C sw v0,0x0(t0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 54
80090660 lhu v0,0x0(v1) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 55
80090664 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 56
80090668 mult v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 57
8009066C sll r4,r4,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 58
80090670 addu r4,r4,a3 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 59
80090674 mflo a1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 60
80090678 lhu v0,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 61
8009067C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 62
80090680 mult v0,t2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 63
80090684 addiu t1,t1,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 64
80090688 move v1,a2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 65
8009068C addiu a2,a2,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 66
80090690 addiu t0,t0,0x4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 67
80090694 sll v0,a1,0x10 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 68
80090698 mflo t4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 69
8009069C or v0,t4,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 70
800906A0 sw v0,0x0(t0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 71
800906A4 bne v1,zero,0x800905FC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 72
800906A8 addiu t0,t0,0x4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 73
800906AC charloaded: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 74
800906AC lbu v1,0xAD(gp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 76
800906B0 ori v0,r0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 77
800906B4 bne v1,v0,0x800906C8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 78
800906B8 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 79
800906BC lui a0,0x1F80 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 80
800906C0 jal 0x8001A20C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 81
800906C4 ori a0,a0,0x358 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 82
800906C8 notshadow: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 84
800906C8 lw ra,0x10(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 85
800906CC nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 86
800906D0 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 87
800906D4 addiu sp,sp,0x18 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charload.asm line 88
800906D8 returncharsinstring: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 1
800906D8 lhu v0,0x0(a0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 4
800906DC nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 5
800906E0 srl v0,v0,0xD ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 6
800906E4 bne v0,zero,0x800906F4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 7
800906E8 clear v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 8
800906EC j 0x80090724 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 11
800906F0 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 12
800906F4 ismy1bytestring: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 13
800906F4 lhu v0,0x0(a0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 14
800906F8 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 15
800906FC andi v0,v0,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 16
80090700 andi v1,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 18
80090704 beq v1,zero,0x80090710 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 19
80090708 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 20
8009070C addiu v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 21
80090710 notand1: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 23
80090710 sra v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 24
80090714 addiu v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 25
80090718 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 26
8009071C move v1,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 27
80090720 getnewchar: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 29
80090720 addiu v1,v1,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 30
80090724 startreading: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 31
80090724 lhu v0,0x0(a0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 32
80090728 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 33
8009072C sltiu v0,v0,0x1000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 34
80090730 bne v0,zero,0x80090720 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 35
80090734 addiu a0,a0,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 36
80090738 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 37
8009073C move v0,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 38
80090740 calcnextxcustom: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 41
80090740 addiu sp,sp,-0x18 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 42
80090744 sw ra,0x10(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 43
80090748 lhu v0,0x0(a0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 45
8009074C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 46
80090750 andi v1,v0,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 47
80090754 srl v0,v0,0xD ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 48
80090758 beq v0,zero,0x80090768 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 49
8009075C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 50
80090760 j 0x80090770 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 51
80090764 move v0,v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 52
80090768 japoldtext: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 53
80090768 jal 0x800906D8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 54
8009076C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 55
80090770 ihavestringlength: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 56
80090770 sll v1,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 57
80090774 addu v1,v1,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 58
80090778 lw ra,0x10(sp) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 59
8009077C sll v0,v1,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 60
80090780 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 61
80090784 addiu sp,sp,0x18 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 62
80090788 retuncharstocity: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 64
80090788 lhu v0,0x0(a0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 65
8009078C nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 66
80090790 srl v0,v0,0xD ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 67
80090794 bne v0,zero,0x800907A4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 68
80090798 clear v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 69
8009079C j 0x80090724 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 71
800907A0 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 72
800907A4 ismy1bytecity: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 73
800907A4 lhu v0,0x0(a0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 74
800907A8 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 75
800907AC andi v0,v0,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 76
800907B0 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 77
800907B4 move v1,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 78
800907B8 retuncharstocitydiv2: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 81
800907B8 lhu v0,0x0(a0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 82
800907BC nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 83
800907C0 srl v0,v0,0xD ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 84
800907C4 bne v0,zero,0x800907D4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 85
800907C8 clear v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 86
800907CC j 0x80090724 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 88
800907D0 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 89
800907D4 ismy1bytecitydiv2: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 90
800907D4 lhu v0,0x0(a0) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 91
800907D8 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 92
800907DC andi v0,v0,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 93
800907E0 andi v1,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 95
800907E4 beq v1,zero,0x800907F0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 96
800907E8 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 97
800907EC addiu v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 98
800907F0 notand1_2: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 100
800907F0 sra v0,v0,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 101
800907F4 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 103
800907F8 move v1,v0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\charCalcs.asm line 104
800907FC .close ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\main.asm line 458
FFFFFFFF .open ""C:\\Users\\ShemetSA.RADIO\\Documents\\GitHub\\p2is_asm\\0001_BATTLE_CODE.bin"",0x800AB000; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 3
800AB000 .org 0x800F9E60 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 6
800F9E60 lhu r2,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 8
800F9E64 addiu r5,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 9
800F9E68 sh r2,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 10
800F9E6C andi r3,r2,0xFF ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 11
800F9E70 addiu r4,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 12
800F9E74 nextch: ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 13
800F9E74 lbu r2,0x0(r5) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 14
800F9E78 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 15
800F9E7C sb r2,0x0(r4) ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 16
800F9E80 addiu r4,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 17
800F9E84 addiu r5,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 18
800F9E88 addiu r3,-0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 19
800F9E8C bne r3,zero,0x800F9E74 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 20
800F9E90 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 21
800F9E94 jr ra ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 22
800F9E98 .org 0x800AD4E8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 25
800AD4E8 jal 0x800F9E60 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 30
800AD4EC .close ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\battle_patch.asm line 33
FFFFFFFF .open ""C:\\Users\\ShemetSA.RADIO\\Documents\\GitHub\\p2is_asm\\SLPS_021.00"",0x8000F800; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 7
8000F800 .org 0x8001BFD4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 10
8001BFD4 ori r5,r0,0x0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 11
8001BFD8 .org 0x8001957C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 16
8001957C addiu v0,v0,0x6 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 17
80019580 .org 0x8001AF38 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 20
8001AF38 sll r2,r3,0x2 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 21
8001AF3C .org 0x8007B195 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 24
8007B195 .byte 0x04 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 25
8007B196 .org 0x8001C398 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 31
8001C398 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 32
8001C39C .org 0x8001C40C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 33
8001C40C jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 34
8001C410 .org 0x8001D058 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 37
8001D058 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 38
8001D05C .org 0x8001D0D8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 39
8001D0D8 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 40
8001D0DC .org 0x8001C688 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 43
8001C688 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 44
8001C68C .org 0x8001AEF4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 49
8001AEF4 j 0x800906D8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 50
8001AEF8 clear v1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 51
8001AEFC .org 0x8001AF1C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 55
8001AF1C j 0x80090740 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 58
8001AF20 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 59
8001AF24 .close ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 61
FFFFFFFF .open ""C:\\Users\\ShemetSA.RADIO\\Documents\\GitHub\\p2is_asm\\1096_J_MENU_Settings_Code.bin"",0x800A2000; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 66
800A2000 .org 0x800A2658 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 68
800A2658 ori a1,r0,0x5C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 69
800A265C .org 0x800A2678 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 70
800A2678 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 71
800A267C .org 0x800A2690 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 72
800A2690 jal 0x8001AFC0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 73
800A2694 .org 0x800A26AC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 76
800A26AC jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 77
800A26B0 .org 0x800A26E8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 78
800A26E8 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 79
800A26EC .org 0x800A298C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 80
800A298C jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 81
800A2990 .org 0x800A29B8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 82
800A29B8 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 83
800A29BC .org 0x800A29F4 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 84
800A29F4 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 85
800A29F8 .org 0x800A2A44 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 86
800A2A44 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 87
800A2A48 .org 0x800A2D20 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 88
800A2D20 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 89
800A2D24 .org 0x800A2D4C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 90
800A2D4C jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 91
800A2D50 .org 0x800A2D7C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 92
800A2D7C jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 93
800A2D80 .org 0x800A3090 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 94
800A3090 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 95
800A3094 .org 0x800A30CC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 96
800A30CC jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 97
800A30D0 .org 0x800A35AC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 98
800A35AC jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 99
800A35B0 .org 0x800A35E0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 100
800A35E0 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 101
800A35E4 .org 0x800A3624 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 102
800A3624 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 103
800A3628 .org 0x800A3658 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 104
800A3658 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 105
800A365C .org 0x800A369C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 106
800A369C jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 107
800A36A0 .org 0x800A36D0 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 108
800A36D0 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 109
800A36D4 .org 0x800A3704 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 110
800A3704 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 111
800A3708 .org 0x800A3734 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 112
800A3734 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 113
800A3738 .org 0x800A3BA8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 114
800A3BA8 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 115
800A3BAC .org 0x800A3BDC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 116
800A3BDC jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 117
800A3BE0 .org 0x800A3C20 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 118
800A3C20 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 119
800A3C24 .org 0x800A3C4C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 120
800A3C4C jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 121
800A3C50 .org 0x800A3C90 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 122
800A3C90 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 123
800A3C94 .org 0x800A3CBC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 124
800A3CBC jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 125
800A3CC0 .org 0x800A4310 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 126
800A4310 jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 127
800A4314 .org 0x800A435C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 128
800A435C jal 0x80090000 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 129
800A4360 .close ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 131
FFFFFFFF .open ""C:\\Users\\ShemetSA.RADIO\\Documents\\GitHub\\p2is_asm\\1119_CITY_CODE_patched.bin"",0x800AB000; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 136
800AB000 .org 0x800AD320 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 140
800AD320 nop ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 141
800AD324 .org 0x800AD328 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 144
800AD328 sll a1,0x1 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 145
800AD32C .org 0x800AD360 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 147
800AD360 addiu a1,a1,0x5 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 148
800AD364 .org 0x800AD30C ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 152
800AD30C jal 0x80090788 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 153
800AD310 .org 0x800AD3AC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 157
800AD3AC jal 0x80090788 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 158
800AD3B0 .org 0x800AF1DC ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 161
800AF1DC jal 0x800907B8 ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 162
800AF1E0 .close ; C:\Users\ShemetSA.RADIO\Documents\GitHub\p2is_asm\txtpatches.asm line 166

47
4bitPattern.asm Normal file
View File

@@ -0,0 +1,47 @@
;4bit table pattern
lui t8,0x1f80
ori t8,t8,0x2e0 ;Pattern addr 1f8002e0
addiu t7,v0,0x3e8 ;r15 = 800103e8
lwl t5,0x3(t7)
lwr t5,0x0(t7)
lwl t6,0x7(t7)
lwr t6,0x4(t7)
swl t5,0x3(t8)
swr t5,0x0(t8)
swl t6,0x7(t8)
swr t6,0x4(t8)
lwl t5,0xb(t7)
lwr t5,0x8(t7)
lwl t6,0xf(t7)
lwr t6,0xc(t7)
swl t5,0xb(t8)
swr t5,0x8(t8)
swl t6,0xf(t8)
swr t6,0xc(t8)
lwl t5,0x13(t7)
lwr t5,0x10(t7)
lwl t6,0x17(t7)
lwr t6,0x14(t7)
swl t5,0x13(t8)
swr t5,0x10(t8)
swl t6,0x17(t8)
swr t6,0x14(t8)
lwl t5,0x1b(t7)
lwr t5,0x18(t7)
lwl t6,0x1f(t7)
lwr t6,0x1c(t7)
swl t5,0x1b(t8)
swr t5,0x18(t8)
swl t6,0x1f(t8)
swr t6,0x1c(t8)

49
EP_4bitPattern.asm Normal file
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)

160
EP_CharLoadBIG_SRC.asm Normal file
View File

@@ -0,0 +1,160 @@
**************************************************************
* FUNCTION *
**************************************************************
undefined MakeCharInScratch()
assume gp = 0x8007c970
undefined v0:1 <RETURN>
undefined4 Stack[-0x8]:4 local_8 XREF[2]: 8001a96c(W),
8001aa40(R)
MakeCharInScratch XREF[1]: DrawCharLine_1a3a8:8001a608(c)
8001a95c e8 ff bd 27 addiu sp,sp,-0x18
assume gp = <UNKNOWN>
8001a960 21 28 80 00 move a1,a0
8001a964 80 1f 04 3c lui a0,0x1f80
8001a968 00 03 84 34 ori a0=>DAT_1f800300,a0,0x300 = ??
8001a96c 10 00 bf af sw ra,local_8(sp)
8001a970 65 6c 00 0c jal makeCharPixels undefined makeCharPixels()
8001a974 21 30 00 00 _clear a2
8001a978 a5 00 83 93 lbu v1,0xa5(gp)=>DAT_8007ca15
8001a97c 01 00 02 24 li v0,0x1
8001a980 03 00 62 14 bne v1,v0,LAB_8001a990
8001a984 80 1f 04 3c _lui a0,0x1f80
8001a988 94 6a 00 0c jal MakeCharShadow undefined MakeCharShadow()
8001a98c 00 03 84 34 _ori a0=>DAT_1f800300,a0,0x300 = ??
LAB_8001a990 XREF[1]: 8001a980(j)
8001a990 80 1f 03 3c lui v1,0x1f80
8001a994 58 03 63 34 ori v1,v1,0x358
8001a998 80 1f 02 3c lui v0,0x1f80
8001a99c 00 03 42 34 ori v0,v0,0x300
8001a9a0 80 1f 04 3c lui a0,0x1f80
8001a9a4 20 03 84 34 ori a0,a0,0x320
LAB_8001a9a8 XREF[1]: 8001a9cc(j)
8001a9a8 00 00 47 8c lw a3,0x0(v0)=>DAT_1f800300 = ??
8001a9ac 04 00 48 8c lw t0,offset DAT_1f800304(v0) = ??
8001a9b0 08 00 49 8c lw t1,offset DAT_1f800308(v0) = ??
8001a9b4 0c 00 4a 8c lw t2,offset DAT_1f80030c(v0) = ??
8001a9b8 00 00 67 ac sw a3,0x0(v1)=>DAT_1f800358 = ??
8001a9bc 04 00 68 ac sw t0,0x4(v1)=>DAT_1f80035c = ??
8001a9c0 08 00 69 ac sw t1,0x8(v1)=>DAT_1f800360 = ??
8001a9c4 0c 00 6a ac sw t2,0xc(v1)=>DAT_1f800364 = ??
8001a9c8 10 00 42 24 addiu v0,v0,0x10
8001a9cc f6 ff 44 14 bne v0,a0,LAB_8001a9a8
8001a9d0 10 00 63 24 _addiu v1,v1,0x10
8001a9d4 03 00 47 88 lwl a3,0x3(v0)
8001a9d8 00 00 47 98 lwr a3,0x0(v0)=>DAT_1f800310 = ??
8001a9dc 00 00 00 00 nop
8001a9e0 03 00 67 a8 swl a3,0x3(v1)
8001a9e4 00 00 67 b8 swr a3,0x0(v1)=>DAT_1f800368 = ??
8001a9e8 80 1f 03 3c lui v1,0x1f80
8001a9ec 9c 03 63 34 ori v1,v1,0x39c
8001a9f0 80 1f 02 3c lui v0,0x1f80
8001a9f4 24 03 42 34 ori v0,v0,0x324
8001a9f8 80 1f 04 3c lui a0,0x1f80
8001a9fc 44 03 84 34 ori a0,a0,0x344
LAB_8001aa00 XREF[1]: 8001aa24(j)
8001aa00 00 00 47 8c lw a3,0x0(v0)=>DAT_1f800324 = ??
8001aa04 04 00 48 8c lw t0,0x4(v0)=>DAT_1f800328 = ??
8001aa08 08 00 49 8c lw t1,0x8(v0)=>DAT_1f80032c = ??
8001aa0c 0c 00 4a 8c lw t2,0xc(v0)=>DAT_1f800330 = ??
8001aa10 00 00 67 ac sw a3,0x0(v1)=>DAT_1f80039c = ??
8001aa14 04 00 68 ac sw t0,0x4(v1)=>DAT_1f8003a0 = ??
8001aa18 08 00 69 ac sw t1,0x8(v1)=>DAT_1f8003a4 = ??
8001aa1c 0c 00 6a ac sw t2,0xc(v1)=>DAT_1f8003a8 = ??
8001aa20 10 00 42 24 addiu v0=>DAT_1f800334,v0,0x10 = ??
8001aa24 f6 ff 44 14 bne v0,a0,LAB_8001aa00
8001aa28 10 00 63 24 _addiu v1,v1,0x10
8001aa2c 03 00 47 88 lwl a3,0x3(v0)
8001aa30 00 00 47 98 lwr a3,0x0(v0)=>DAT_1f800334 = ??
8001aa34 00 00 00 00 nop
8001aa38 03 00 67 a8 swl a3,0x3(v1)
8001aa3c 00 00 67 b8 swr a3,0x0(v1)=>DAT_1f8003ac = ??
8001aa40 10 00 bf 8f lw ra,local_8(sp)
8001aa44 00 00 00 00 nop
8001aa48 08 00 e0 03 jr ra
8001aa4c 18 00 bd 27 _addiu sp,sp,0x18
**************************************************************
* FUNCTION *
**************************************************************
undefined makeCharPixels()
assume gp = 0x8007c970
undefined v0:1 <RETURN>
makeCharPixels XREF[4]: FUN_80016a5c:80016ad0(c),
MakeCharInScratch:8001a970(c),
GenerateSmallChar:8001b334(c),
FUN_8001c0c8:8001c0d8(c)
8001b194 a4 00 8a 93 lbu t2,0xa4(gp)=>DAT_8007ca14
assume gp = <UNKNOWN>
8001b198 09 00 c0 14 bne a2,zero,LAB_8001b1c0
8001b19c 21 40 80 00 _move t0,a0
8001b1a0 1e 80 03 3c lui v1,0x801e
8001b1a4 80 f4 63 34 ori v1,v1,0xf480
8001b1a8 c0 10 05 00 sll v0,a1,0x3
8001b1ac 21 10 45 00 addu v0,v0,a1
8001b1b0 40 10 02 00 sll v0,v0,0x1
8001b1b4 21 48 43 00 addu t1,v0,v1
8001b1b8 77 6c 00 08 j LAB_8001b1dc
8001b1bc 09 00 06 24 _li a2,0x9
LAB_8001b1c0 XREF[1]: 8001b198(j)
8001b1c0 1e 80 03 3c lui v1,0x801e
8001b1c4 00 f0 63 34 ori v1,v1,0xf000
8001b1c8 40 10 05 00 sll v0,a1,0x1
8001b1cc 21 10 45 00 addu v0,v0,a1
8001b1d0 80 10 02 00 sll v0,v0,0x2
8001b1d4 21 48 43 00 addu t1,v0,v1
8001b1d8 06 00 06 24 li a2,0x6
LAB_8001b1dc XREF[1]: 8001b1b8(j)
8001b1dc 21 10 c0 00 move v0,a2
8001b1e0 2f 00 40 10 beq v0,zero,LAB_8001b2a0
8001b1e4 ff ff c6 24 _addiu a2,a2,-0x1
8001b1e8 80 1f 07 3c lui a3,0x1f80
8001b1ec e0 02 e7 34 ori a3,a3,0x2e0
LAB_8001b1f0 XREF[1]: 8001b298(j)
8001b1f0 00 00 23 95 lhu v1=>DAT_801ef480,0x0(t1)=>DAT_801ef482 = ??
8001b1f4 00 00 00 00 nop
8001b1f8 0f 00 64 30 andi a0,v1,0xf
8001b1fc 02 19 03 00 srl v1,v1,0x4
8001b200 0f 00 62 30 andi v0,v1,0xf
8001b204 40 10 02 00 sll v0,v0,0x1
8001b208 21 10 47 00 addu v0,v0,a3
8001b20c 00 00 42 94 lhu v0,0x0(v0)=>DAT_1f8002e0 = ??
8001b210 00 00 00 00 nop
8001b214 18 00 4a 00 mult v0,t2
8001b218 40 20 04 00 sll a0,a0,0x1
8001b21c 21 20 87 00 addu a0,a0,a3
8001b220 12 28 00 00 mflo a1
8001b224 00 00 82 94 lhu v0,0x0(a0)=>DAT_1f8002e0 = ??
8001b228 00 00 00 00 nop
8001b22c 18 00 4a 00 mult v0,t2
8001b230 02 19 03 00 srl v1,v1,0x4
8001b234 0f 00 64 30 andi a0,v1,0xf
8001b238 02 19 03 00 srl v1,v1,0x4
8001b23c 40 18 03 00 sll v1,v1,0x1
8001b240 21 18 67 00 addu v1,v1,a3
8001b244 00 14 05 00 sll v0,a1,0x10
8001b248 12 60 00 00 mflo t4
8001b24c 25 10 82 01 or v0,t4,v0
8001b250 00 00 02 ad sw v0,0x0(t0)
8001b254 00 00 62 94 lhu v0,0x0(v1)=>DAT_1f8002e0 = ??
8001b258 00 00 00 00 nop
8001b25c 18 00 4a 00 mult v0,t2
8001b260 40 20 04 00 sll a0,a0,0x1
8001b264 21 20 87 00 addu a0,a0,a3
8001b268 12 28 00 00 mflo a1
8001b26c 00 00 82 94 lhu v0,0x0(a0)=>DAT_1f8002e0 = ??
8001b270 00 00 00 00 nop
8001b274 18 00 4a 00 mult v0,t2
8001b278 02 00 29 25 addiu t1,t1,0x2
8001b27c 21 18 c0 00 move v1,a2
8001b280 ff ff c6 24 addiu a2,a2,-0x1
8001b284 04 00 08 25 addiu t0,t0,0x4
8001b288 00 14 05 00 sll v0,a1,0x10
8001b28c 12 60 00 00 mflo t4
8001b290 25 10 82 01 or v0,t4,v0
8001b294 00 00 02 ad sw v0,0x0(t0)
8001b298 d5 ff 60 14 bne v1,zero,LAB_8001b1f0
8001b29c 04 00 08 25 _addiu t0,t0,0x4
LAB_8001b2a0 XREF[1]: 8001b1e0(j)
8001b2a0 08 00 e0 03 jr ra
8001b2a4 00 00 00 00 _nop

116
EP_CharLoadSML_SRC.asm Normal file
View File

@@ -0,0 +1,116 @@
**************************************************************
* FUNCTION *
**************************************************************
undefined GenerateSmallChar()
assume gp = 0x8007c970
undefined v0:1 <RETURN>
undefined4 Stack[-0x8]:4 local_8 XREF[2]: 8001b330(W),
8001b358(R)
GenerateSmallChar XREF[2]: MakeSmallChar:8001ae38(c),
FUN_8001c3a4:8001c548(c)
8001b320 e8 ff bd 27 addiu sp,sp,-0x18
assume gp = <UNKNOWN>
8001b324 21 28 80 00 move a1,a0
8001b328 80 1f 04 3c lui a0,0x1f80
8001b32c 58 03 84 34 ori a0=>DAT_1f800358,a0,0x358 = ??
8001b330 10 00 bf af sw ra,local_8(sp)
8001b334 65 6c 00 0c jal makeCharPixels undefined makeCharPixels()
8001b338 01 00 06 24 _li a2,0x1
8001b33c a5 00 83 93 lbu v1,0xa5(gp)=>DAT_8007ca15
8001b340 01 00 02 24 li v0,0x1
8001b344 04 00 62 14 bne v1,v0,LAB_8001b358
8001b348 00 00 00 00 _nop
8001b34c 80 1f 04 3c lui a0,0x1f80
8001b350 aa 6c 00 0c jal MakeCharShadow undefined MakeCharShadow()
8001b354 58 03 84 34 _ori a0=>DAT_1f800358,a0,0x358 = ??
LAB_8001b358 XREF[1]: 8001b344(j)
8001b358 10 00 bf 8f lw ra,local_8(sp)
8001b35c 00 00 00 00 nop
8001b360 08 00 e0 03 jr ra
8001b364 18 00 bd 27 _addiu sp,sp,0x18
**************************************************************
* FUNCTION *
**************************************************************
undefined makeCharPixels()
assume gp = 0x8007c970
undefined v0:1 <RETURN>
makeCharPixels XREF[4]: FUN_80016a5c:80016ad0(c),
MakeCharInScratch:8001a970(c),
GenerateSmallChar:8001b334(c),
FUN_8001c0c8:8001c0d8(c)
8001b194 a4 00 8a 93 lbu t2,0xa4(gp)=>DAT_8007ca14
assume gp = <UNKNOWN>
8001b198 09 00 c0 14 bne a2,zero,LAB_8001b1c0
8001b19c 21 40 80 00 _move t0,a0
8001b1a0 1e 80 03 3c lui v1,0x801e
8001b1a4 80 f4 63 34 ori v1,v1,0xf480
8001b1a8 c0 10 05 00 sll v0,a1,0x3
8001b1ac 21 10 45 00 addu v0,v0,a1
8001b1b0 40 10 02 00 sll v0,v0,0x1
8001b1b4 21 48 43 00 addu t1,v0,v1
8001b1b8 77 6c 00 08 j LAB_8001b1dc
8001b1bc 09 00 06 24 _li a2,0x9
LAB_8001b1c0 XREF[1]: 8001b198(j)
8001b1c0 1e 80 03 3c lui v1,0x801e
8001b1c4 00 f0 63 34 ori v1,v1,0xf000
8001b1c8 40 10 05 00 sll v0,a1,0x1
8001b1cc 21 10 45 00 addu v0,v0,a1
8001b1d0 80 10 02 00 sll v0,v0,0x2
8001b1d4 21 48 43 00 addu t1,v0,v1
8001b1d8 06 00 06 24 li a2,0x6
LAB_8001b1dc XREF[1]: 8001b1b8(j)
8001b1dc 21 10 c0 00 move v0,a2
8001b1e0 2f 00 40 10 beq v0,zero,LAB_8001b2a0
8001b1e4 ff ff c6 24 _addiu a2,a2,-0x1
8001b1e8 80 1f 07 3c lui a3,0x1f80
8001b1ec e0 02 e7 34 ori a3,a3,0x2e0
LAB_8001b1f0 XREF[1]: 8001b298(j)
8001b1f0 00 00 23 95 lhu v1=>DAT_801ef480,0x0(t1)=>DAT_801ef482 = ??
8001b1f4 00 00 00 00 nop
8001b1f8 0f 00 64 30 andi a0,v1,0xf
8001b1fc 02 19 03 00 srl v1,v1,0x4
8001b200 0f 00 62 30 andi v0,v1,0xf
8001b204 40 10 02 00 sll v0,v0,0x1
8001b208 21 10 47 00 addu v0,v0,a3
8001b20c 00 00 42 94 lhu v0,0x0(v0)=>DAT_1f8002e0 = ??
8001b210 00 00 00 00 nop
8001b214 18 00 4a 00 mult v0,t2
8001b218 40 20 04 00 sll a0,a0,0x1
8001b21c 21 20 87 00 addu a0,a0,a3
8001b220 12 28 00 00 mflo a1
8001b224 00 00 82 94 lhu v0,0x0(a0)=>DAT_1f8002e0 = ??
8001b228 00 00 00 00 nop
8001b22c 18 00 4a 00 mult v0,t2
8001b230 02 19 03 00 srl v1,v1,0x4
8001b234 0f 00 64 30 andi a0,v1,0xf
8001b238 02 19 03 00 srl v1,v1,0x4
8001b23c 40 18 03 00 sll v1,v1,0x1
8001b240 21 18 67 00 addu v1,v1,a3
8001b244 00 14 05 00 sll v0,a1,0x10
8001b248 12 60 00 00 mflo t4
8001b24c 25 10 82 01 or v0,t4,v0
8001b250 00 00 02 ad sw v0,0x0(t0)
8001b254 00 00 62 94 lhu v0,0x0(v1)=>DAT_1f8002e0 = ??
8001b258 00 00 00 00 nop
8001b25c 18 00 4a 00 mult v0,t2
8001b260 40 20 04 00 sll a0,a0,0x1
8001b264 21 20 87 00 addu a0,a0,a3
8001b268 12 28 00 00 mflo a1
8001b26c 00 00 82 94 lhu v0,0x0(a0)=>DAT_1f8002e0 = ??
8001b270 00 00 00 00 nop
8001b274 18 00 4a 00 mult v0,t2
8001b278 02 00 29 25 addiu t1,t1,0x2
8001b27c 21 18 c0 00 move v1,a2
8001b280 ff ff c6 24 addiu a2,a2,-0x1
8001b284 04 00 08 25 addiu t0,t0,0x4
8001b288 00 14 05 00 sll v0,a1,0x10
8001b28c 12 60 00 00 mflo t4
8001b290 25 10 82 01 or v0,t4,v0
8001b294 00 00 02 ad sw v0,0x0(t0)
8001b298 d5 ff 60 14 bne v1,zero,LAB_8001b1f0
8001b29c 04 00 08 25 _addiu t0,t0,0x4
LAB_8001b2a0 XREF[1]: 8001b1e0(j)
8001b2a0 08 00 e0 03 jr ra
8001b2a4 00 00 00 00 _nop

View File

@@ -0,0 +1,76 @@
;//////////////////////////////////////////////////////
;// ETERNAL PUNISHMENT TITLE CODE PATCH
.psx
.open "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

429
EP_big_SRC.asm Normal file
View File

@@ -0,0 +1,429 @@
FUN_8002162c:800216bc(c)
8001a3a8 b0 ff bd 27 addiu sp,sp,-0x50
8001a3ac 38 00 b4 af sw s4,local_18(sp)
8001a3b0 21 a0 80 00 move s4,r4
8001a3b4 28 00 b0 af sw s0,local_28(sp)
8001a3b8 21 80 a0 00 move s0,r5
8001a3bc 2c 00 b1 af sw s1,local_24(sp)
8001a3c0 21 88 c0 00 move s1,r6
8001a3c4 34 00 b3 af sw s3,local_1c(sp)
8001a3c8 80 1f 13 3c lui s3,0x1f80
8001a3cc d0 03 73 36 ori s3,s3,0x3d0
8001a3d0 ff 00 08 3c lui t0,0xff
8001a3d4 ff ff 08 35 ori t0,t0,0xffff
8001a3d8 ff 00 e4 30 andi r4,r7,0xff
8001a3dc 08 80 07 3c lui r7=>DAT_80080000,0x8008 = ??
8001a3e0 00 ff 06 3c lui r6,0xff00
8001a3e4 58 ce e9 24 addiu t1,r7,-0x31a8
8001a3e8 58 ce e3 8c lw v1,-0x31a8(r7)=>DAT_8007ce58 = ??
8001a3ec 60 00 a5 93 lbu r5,Stack-10?(sp)
8001a3f0 00 80 02 3c lui v0,0x8000
8001a3f4 48 00 bf af sw ra,local_8(sp)
8001a3f8 44 00 b7 af sw s7,local_c(sp)
8001a3fc 40 00 b6 af sw s6,local_10(sp)
8001a400 3c 00 b5 af sw s5,local_14(sp)
8001a404 30 00 b2 af sw s2,local_20(sp)
;;init chains
8001a408 24 30 66 00 and r6,v1,r6
8001a40c ff 00 a5 30 andi r5,r5,0xff
8001a410 24 18 68 00 and v1,v1,t0
8001a414 25 a8 62 00 or s5,v1,v0
8001a418 04 00 22 8d lw v0,0x4(t1)=>DAT_8007ce5c = ??
8001a41c 00 00 a3 8e lw v1,0x0(s5)
8001a420 ff ff 42 24 addiu v0,v0,-0x1
8001a424 24 18 68 00 and v1,v1,t0
8001a428 25 30 c3 00 or r6,r6,v1
8001a42c 04 00 22 ad sw v0,0x4(t1)=>DAT_8007ce5c = ??
8001a430 2d 70 00 0c jal StoreColorToAddr undefined StoreColorToAddr()
8001a434 58 ce e6 ac _sw r6,-0x31a8(r7)=>DAT_8007ce58 = ??
8001a438 21 20 a0 02 move r4,s5
8001a43c 00 2c 10 00 sll r5,s0,0x10
8001a440 03 2c 05 00 sra r5,r5,0x10
8001a444 00 34 11 00 sll r6,s1,0x10
8001a448 44 6c 00 0c jal InitDMAtextChain undefined InitDMAtextChain()
8001a44c 03 34 06 00 _sra r6,r6,0x10
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
8001a450 80 1f 06 3c lui r6,0x1f80
8001a454 48 03 c6 34 ori r6=>DAT_1f800348,r6,0x348 = ??
;8001a458 80 1f 05 3c lui r5,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;8001a45c 8c 03 a5 34 ori r5=>DAT_1f80038c,r5,0x38c = ??
;4bit table pattern
8001a4f0 03 00 02 24 li v0,0x3
8001a4f4 1c 00 a2 a7 sh v0,local_34(sp)
8001a4f8 06 00 02 24 li v0,0x6
8001a4fc 0d 00 04 24 li r4,0xd
8001a500 00 a0 03 3c lui v1,0xa000
8001a504 1e 00 a2 a7 sh v0,local_34+0x2(sp)
INIT CHAR
8001a508 00 01 02 3c lui v0,0x100
8001a50c 03 00 c4 a0 sb r4,0x3(r6)=>DAT_1f80034b = ??
8001a510 04 00 c3 ac sw v1,0x4(r6)=>DAT_1f80034c = ??
8001a514 80 1f 01 3c lui at,0x1f80
8001a518 7c 03 22 ac sw v0,offset DAT_1f80037c(at) = ??
8001a51c 03 00 a4 a0 sb r4,0x3(r5)=>DAT_1f80038f = ??
8001a520 04 00 a3 ac sw v1,0x4(r5)=>DAT_1f800390 = ??
8001a524 80 1f 01 3c lui at,0x1f80
8001a528 c0 03 22 ac sw v0,offset DAT_1f8003c0(at) = ??
8001a52c 04 00 02 24 li v0,0x4
8001a530 03 00 62 a2 sb v0,0x3(s3)=>DAT_1f8003d3 = ??
8001a534 64 00 02 24 li v0,0x64
8001a538 07 00 62 a2 sb v0,0x7(s3)=>DAT_1f8003d7 = ??
8001a53c 98 00 84 97 lhu r4,0x98(gp)=>DAT_8007ca08
8001a540 9a 00 83 97 lhu v1,0x9a(gp)=>DAT_8007ca0a
8001a544 80 00 02 24 li v0,0x80
8001a548 04 00 62 a2 sb v0,0x4(s3)=>DAT_1f8003d4 = ??
8001a54c 05 00 62 a2 sb v0,0x5(s3)=>DAT_1f8003d5 = ??
8001a550 06 00 62 a2 sb v0,0x6(s3)=>DAT_1f8003d6 = ??
setY1:
8001a554 1c 00 a2 8f lw v0,local_34(sp)
8001a558 98 00 87 87 lh r7,0x98(gp)=>DAT_8007ca08
8001a55c 18 00 a4 a7 sh r4,local_38(sp)
8001a560 1a 00 a3 a7 sh v1,local_38+0x2(sp)
8001a564 18 00 a4 8f lw r4,local_38(sp)
8001a568 06 00 63 24 addiu v1,v1,0x6
8001a56c 1a 00 a3 a7 sh v1,local_38+0x2(sp) LOWER GLIPH COORD
8001a570 18 00 a3 8f lw v1,local_38(sp)
8001a574 21 40 e0 00 move t0,r7
8001a578 0c 00 c2 ac sw v0,0xc(r6)=>DAT_1f800354 = ??
8001a57c 0c 00 a2 ac sw v0,0xc(r5)=>DAT_1f800398 = ??
8001a580 08 00 c4 ac sw r4,0x8(r6)=>DAT_1f800350 = ??
8001a584 02 00 e1 04 bgez r7,LAB_8001a590
8001a588 08 00 a3 ac _sw v1,0x8(r5)=>DAT_1f800394 = ??
8001a58c 3f 00 e8 24 addiu t0,r7,0x3f
;decoding coords for source sprite
; >DAT_1f8003dc ;STORE CHAR SPRITE X BYTE
LAB_8001a590 XREF[1]: 8001a584(j)
8001a590 83 11 08 00 sra v0,t0,0x6
8001a594 80 11 02 00 sll v0,v0,0x6
8001a598 23 10 e2 00 subu v0,r7,v0
8001a59c 9a 00 83 87 lh v1,0x9a(gp)=>DAT_8007ca0a
8001a5a0 80 10 02 00 sll v0,v0,0x2
8001a5a4 0c 00 62 a2 sb v0,0xc(s3)=>DAT_1f8003dc = ??
8001a5a8 02 00 61 04 bgez v1,LAB_8001a5b4
8001a5ac 21 10 60 00 _move v0,v1
8001a5b0 ff 00 62 24 addiu v0,v1,0xff
; >DAT_1f8003dd ;STORE CHAR SPRITE Y BYTE
LAB_8001a5b4 XREF[1]: 8001a5a8(j)
8001a5b4 03 12 02 00 sra v0,v0,0x8
8001a5b8 00 12 02 00 sll v0,v0,0x8
8001a5bc 23 10 62 00 subu v0,v1,v0
8001a5c0 0d 00 62 a2 sb v0,0xd(s3)=>DAT_1f8003dd = ??
8001a5c4 a0 00 83 97 lhu v1,0xa0(gp)=>DAT_8007ca10
8001a5c8 0c 00 02 24 li v0,0xc
8001a5cc 10 00 62 a6 sh v0,0x10(s3)=>DAT_1f8003e0 = ??
8001a5d0 12 00 62 a6 sh v0,0x12(s3)=>DAT_1f8003e2 = ??
8001a5d4 08 00 70 a6 sh s0,0x8(s3)=>DAT_1f8003d8 = ??
8001a5d8 0a 00 71 a6 sh s1,0xa(s3)=>DAT_1f8003da = ??
8001a5dc 0e 00 63 a6 sh v1,0xe(s3)=>DAT_1f8003de = ??
;TEXT READ START
8001a5e0 00 00 84 96 lhu r4,0x0(s4)
8001a5e4 00 00 00 00 nop
8001a5e8 00 10 82 2c sltiu v0,r4,0x1000
8001a5ec b0 00 40 10 beq v0,zero,LAB_8001a8b0 INIT X IN STACK
8001a5f0 02 00 94 26 _addiu s4,s4,0x2
8001a5f4 08 80 16 3c lui s6,0x8008
8001a5f8 68 ce d7 26 addiu s7,s6,-0x3198
8001a5fc ff 00 10 3c lui s0,0xff
8001a600 ff ff 10 36 ori s0,s0,0xffff
8001a604 00 80 11 3c lui s1,0x8000
LAB_8001a608 NextChar: XREF[1]: 8001a8a8(j)
8001a608 57 6a 00 0c jal MakeCharInScratch undefined MakeCharInScratch()
8001a60c 21 90 00 00 _clear s2
; Coords XY init
8001a610 00 ff 0a 3c lui t2,0xff00
8001a614 21 70 a0 02 move t6,s5
8001a618 10 00 ad 27 addiu t5,sp,0x10
8001a61c 20 00 ad af sw t5,local_30(sp)
8001a620 08 80 0b 3c lui t3,0x8008
8001a624 58 ce 6c 25 addiu t4,t3,-0x31a8
8001a628 21 48 a0 02 move t1,s5
PageLoop:
LAB_8001a62c XREF[1]: 8001a870(j)
8001a62c 68 ce c2 8e lw v0,-0x3198(s6)=>DMA_NEXT_FREE_CHAIN_8007ce68 = ??
8001a630 00 00 00 00 nop
8001a634 24 20 4a 00 and r4,v0,t2
8001a638 24 10 50 00 and v0,v0,s0
8001a63c 25 28 51 00 or r5,v0,s1
8001a640 04 00 e2 8e lw v0,0x4(s7)=>DMA_COUNTER_8007ce6c = ??
8001a644 00 00 a3 8c lw v1,0x0(r5)
8001a648 ff ff 42 24 addiu v0,v0,-0x1
8001a64c 24 18 70 00 and v1,v1,s0
8001a650 25 20 83 00 or r4,r4,v1
8001a654 04 00 e2 ae sw v0,0x4(s7)=>DMA_COUNTER_8007ce6c = ??
8001a658 68 ce c4 ae sw r4,-0x3198(s6)=>DMA_NEXT_FREE_CHAIN_8007ce68 = ??
CopyCmdFromScratch:
8001a65c 00 00 6f 8e lw t7,0x0(s3)=>DAT_1f8003d0 = ??
8001a660 04 00 78 8e lw t8,0x4(s3)=>DAT_1f8003d4 = ??
8001a664 08 00 79 8e lw t9,0x8(s3)=>DAT_1f8003d8 = ??
8001a668 0c 00 6d 8e lw t5,0xc(s3)=>DAT_1f8003dc = ??
8001a66c 00 00 af ac sw t7,0x0(r5)
8001a670 04 00 b8 ac sw t8,0x4(r5)
8001a674 08 00 b9 ac sw t9,0x8(r5)
8001a678 0c 00 ad ac sw t5,0xc(r5)
8001a67c 10 00 6f 8e lw t7,0x10(s3)=>DAT_1f8003e0 = ??
8001a680 00 00 00 00 nop
8001a684 10 00 af ac sw t7,0x10(r5)
8001a688 18 00 23 8d lw v1,0x18(t1)
8001a68c 00 00 a2 8c lw v0,0x0(r5)
8001a690 00 00 63 8c lw v1,0x0(v1)
8001a694 24 10 4a 00 and v0,v0,t2
8001a698 24 18 70 00 and v1,v1,s0
8001a69c 25 10 43 00 or v0,v0,v1
8001a6a0 00 00 a2 ac sw v0,0x0(r5)
8001a6a4 18 00 24 8d lw r4,0x18(t1)
8001a6a8 00 00 00 00 nop
8001a6ac 00 00 82 8c lw v0,0x0(r4)
8001a6b0 24 18 b0 00 and v1,r5,s0
8001a6b4 24 10 4a 00 and v0,v0,t2
8001a6b8 25 10 43 00 or v0,v0,v1
8001a6bc 00 00 82 ac sw v0,0x0(r4)
8001a6c0 18 00 25 ad sw r5,0x18(t1)
8001a6c4 04 00 c2 95 lhu v0,0x4(t6)
8001a6c8 00 00 00 00 nop
8001a6cc 02 00 40 14 bne v0,zero,LAB_8001a6d8 NotFirstChar
8001a6d0 21 40 00 00 _clear t0
8001a6d4 28 00 25 ad sw r5,0x28(t1)
NotFirstChar:
LAB_8001a6d8 XREF[1]: 8001a6cc(j)
8001a6d8 21 38 00 01 move r7,t0
8001a6dc 20 00 a6 8f lw r6,local_30(sp) ---loading from stack????
LAB_8001a6e0 XREF[1]: 8001a7e0(j)
8001a6e0 80 1f 05 3c lui r5,0x1f80
8001a6e4 58 ce 62 8d lw v0,-0x31a8(t3)=>DAT_8007ce58 = ??
8001a6e8 48 03 a5 34 ori r5=>DAT_1f800348,r5,0x348 = ??
8001a6ec 24 10 50 00 and v0,v0,s0
8001a6f0 25 10 51 00 or v0,v0,s1
8001a6f4 00 00 c2 ac sw v0,0x0(r6) ---saving to stack????
8001a6f8 58 ce 63 8d lw v1,-0x31a8(t3)=>DAT_8007ce58 = ??
8001a6fc 00 00 42 8c lw v0,0x0(v0)
8001a700 04 00 84 8d lw r4,0x4(t4)=>DAT_8007ce5c = ??
8001a704 24 18 6a 00 and v1,v1,t2
8001a708 24 10 50 00 and v0,v0,s0
8001a70c 25 18 62 00 or v1,v1,v0
8001a710 ff ff 84 24 addiu r4,r4,-0x1
8001a714 58 ce 63 ad sw v1,-0x31a8(t3)=>DAT_8007ce58 = ??
8001a718 04 00 84 ad sw r4,0x4(t4)=>DAT_8007ce5c = ??
8001a71c 00 00 c4 8c lw r4,0x0(r6)
8001a720 21 18 e5 00 addu v1,r7,r5
8001a724 25 10 64 00 or v0,v1,r4
8001a728 03 00 42 30 andi v0,v0,0x3
8001a72c 16 00 40 10 beq v0,zero,LAB_8001a788
8001a730 30 00 62 24 _addiu v0,v1,0x30
LAB_8001a734 XREF[1]: 8001a778(j)
8001a734 03 00 6f 88 lwl t7,0x3(v1)
8001a738 00 00 6f 98 lwr t7,0x0(v1)=>DAT_1f800348 = ??
8001a73c 07 00 78 88 lwl t8,0x7(v1)
8001a740 04 00 78 98 lwr t8,0x4(v1)=>DAT_1f80034c = ??
8001a744 0b 00 79 88 lwl t9,0xb(v1)
8001a748 08 00 79 98 lwr t9,0x8(v1)=>DAT_1f800350 = ??
8001a74c 0f 00 6d 88 lwl t5,0xf(v1)
8001a750 0c 00 6d 98 lwr t5,0xc(v1)=>DAT_1f800354 = ??
8001a754 03 00 8f a8 swl t7,0x3(r4)
8001a758 00 00 8f b8 swr t7,0x0(r4)
8001a75c 07 00 98 a8 swl t8,0x7(r4)
8001a760 04 00 98 b8 swr t8,0x4(r4)
8001a764 0b 00 99 a8 swl t9,0xb(r4)
8001a768 08 00 99 b8 swr t9,0x8(r4)
8001a76c 0f 00 8d a8 swl t5,0xf(r4)
8001a770 0c 00 8d b8 swr t5,0xc(r4)
8001a774 10 00 63 24 addiu v1,v1,0x10
8001a778 ee ff 62 14 bne v1,v0,LAB_8001a734
8001a77c 10 00 84 24 _addiu r4,r4,0x10
8001a780 ed 69 00 08 j LAB_8001a7b4
8001a784 00 00 00 00 _nop
LAB_8001a788 XREF[2]: 8001a72c(j), 8001a7ac(j)
8001a788 00 00 6f 8c lw t7,0x0(v1)=>DAT_1f800348 = ??
8001a78c 04 00 78 8c lw t8,0x4(v1)=>DAT_1f80034c = ??
8001a790 08 00 79 8c lw t9,0x8(v1)=>DAT_1f800350 = ??
8001a794 0c 00 6d 8c lw t5,0xc(v1)=>DAT_1f800354 = ??
8001a798 00 00 8f ac sw t7,0x0(r4)
8001a79c 04 00 98 ac sw t8,0x4(r4)
8001a7a0 08 00 99 ac sw t9,0x8(r4)
8001a7a4 0c 00 8d ac sw t5,0xc(r4)
8001a7a8 10 00 63 24 addiu v1,v1,0x10
8001a7ac f6 ff 62 14 bne v1,v0,LAB_8001a788
8001a7b0 10 00 84 24 _addiu r4,r4,0x10
LAB_8001a7b4
last4BytesCopy: XREF[1]: 8001a780(j)
8001a7b4 03 00 6f 88 lwl t7,0x3(v1)
8001a7b8 00 00 6f 98 lwr t7,0x0(v1)=>DAT_1f800358 = ??
8001a7bc 07 00 78 88 lwl t8,0x7(v1)
8001a7c0 04 00 78 98 lwr t8,0x4(v1)=>DAT_1f80035c = ??
8001a7c4 03 00 8f a8 swl t7,0x3(r4)
8001a7c8 00 00 8f b8 swr t7,0x0(r4)
8001a7cc 07 00 98 a8 swl t8,0x7(r4)
8001a7d0 04 00 98 b8 swr t8,0x4(r4)
;UPPER/LOWER COMMAND LOOP
8001a7d4 44 00 e7 24 addiu r7,r7,0x44
8001a7d8 01 00 08 25 addiu t0,t0,0x1
8001a7dc 02 00 02 2d sltiu v0,t0,0x2
8001a7e0 bf ff 40 14 bne v0,zero,LAB_8001a6e0
8001a7e4 04 00 c6 24 _addiu r6,r6,0x4
8001a7e8 10 00 a4 8f lw r4,local_40(sp)
8001a7ec 18 00 23 8d lw v1,0x18(t1)
8001a7f0 00 00 82 8c lw v0,0x0(r4)
8001a7f4 00 00 63 8c lw v1,0x0(v1)
8001a7f8 24 10 4a 00 and v0,v0,t2
8001a7fc 24 18 70 00 and v1,v1,s0
8001a800 25 10 43 00 or v0,v0,v1
8001a804 00 00 82 ac sw v0,0x0(r4)
8001a808 18 00 24 8d lw r4,0x18(t1)
8001a80c 10 00 a3 8f lw v1,local_40(sp)
8001a810 00 00 82 8c lw v0,0x0(r4)
8001a814 24 18 70 00 and v1,v1,s0
8001a818 24 10 4a 00 and v0,v0,t2
8001a81c 25 10 43 00 or v0,v0,v1
8001a820 00 00 82 ac sw v0,0x0(r4)
8001a824 14 00 a4 8f lw r4,local_3c(sp)
8001a828 10 00 a3 8f lw v1,local_40(sp)
8001a82c 00 00 82 8c lw v0,0x0(r4)
8001a830 00 00 63 8c lw v1,0x0(v1)
8001a834 24 10 4a 00 and v0,v0,t2
8001a838 24 18 70 00 and v1,v1,s0
8001a83c 25 10 43 00 or v0,v0,v1
8001a840 00 00 82 ac sw v0,0x0(r4)
8001a844 10 00 a4 8f lw r4,local_40(sp)
8001a848 14 00 a3 8f lw v1,local_3c(sp)
8001a84c 00 00 82 8c lw v0,0x0(r4)
8001a850 24 18 70 00 and v1,v1,s0
8001a854 24 10 4a 00 and v0,v0,t2
8001a858 25 10 43 00 or v0,v0,v1
8001a85c 00 00 82 ac sw v0,0x0(r4)
8001a860 14 00 a2 8f lw v0,local_3c(sp)
8001a864 01 00 52 26 addiu s2,s2,0x1
8001a868 18 00 22 ad sw v0,0x18(t1)
8001a86c 02 00 42 2e sltiu v0,s2,0x2
8001a870 6e ff 40 14 bne v0,zero,LAB_8001a62c
8001a874 04 00 29 25 _addiu t1,t1,0x4
X COORD SHIFT (+12)
8001a878 a8 00 82 97 lhu v0,0xa8(gp)=>DAT_8007ca18 ;LOAD INIT X
8001a87c 08 00 63 96 lhu v1,0x8(s3)=>DAT_1f8003d8 ;LOAD LAST X = ??
8001a880 0c 00 42 24 addiu v0,v0,0xc
8001a884 21 18 62 00 addu v1,v1,v0
8001a888 08 00 63 a6 sh v1,0x8(s3)=>DAT_1f8003d8 = ??
r2 = current charDMACount
8001a88c 04 00 a2 96 lhu v0,0x4(s5)
8001a890 00 00 00 00 nop
8001a894 01 00 42 24 addiu v0,v0,0x1
8001a898 04 00 a2 a6 sh v0,0x4(s5)
8001a89c 00 00 84 96 lhu r4,0x0(s4)
8001a8a0 00 00 00 00 nop
8001a8a4 00 10 82 2c sltiu v0,r4,0x1000
8001a8a8 57 ff 40 14 bne v0,zero,LAB_8001a608 IF r4<1000 - GOTO NEXT CHAR
8001a8ac 02 00 94 26 _addiu s4,s4,0x2
LAB_8001a8b0 TEXT END XREF[1]: 8001a5ec(j)
8001a8b0 21 90 00 00 clear s2
8001a8b4 08 80 13 3c lui s3,0x8008
8001a8b8 68 ce 74 26 addiu s4,s3,-0x3198
8001a8bc ff 00 11 3c lui s1,0xff
8001a8c0 ff ff 31 36 ori s1,s1,0xffff
8001a8c4 21 80 a0 02 move s0,s5
8001a8c8 21 28 00 00 clear r5
LAB_8001a8cc XREF[1]: 8001a924(j)
8001a8cc 01 00 06 24 li r6,0x1
8001a8d0 21 90 46 02 addu s2,s2,r6
8001a8d4 00 80 02 3c lui v0,0x8000
8001a8d8 00 ff 04 3c lui r4,0xff00
8001a8dc 68 ce 63 8e lw v1,-0x3198(s3)=>DMA_NEXT_FREE_CHAIN_8007ce68 = ??
8001a8e0 9c 00 87 8f lw r7,0x9c(gp)=>DAT_8007ca0c
8001a8e4 24 18 71 00 and v1,v1,s1
8001a8e8 25 18 62 00 or v1,v1,v0
8001a8ec 30 00 03 ae sw v1,0x30(s0)
8001a8f0 68 ce 62 8e lw v0,-0x3198(s3)=>DMA_NEXT_FREE_CHAIN_8007ce68 = ??
8001a8f4 00 00 63 8c lw v1,0x0(v1)
8001a8f8 24 10 44 00 and v0,v0,r4
8001a8fc 24 18 71 00 and v1,v1,s1
8001a900 04 00 84 8e lw r4,0x4(s4)=>DMA_COUNTER_8007ce6c = ??
8001a904 25 10 43 00 or v0,v0,v1
8001a908 68 ce 62 ae sw v0,-0x3198(s3)=>DMA_NEXT_FREE_CHAIN_8007ce68 = ??
8001a90c ff ff 84 24 addiu r4,r4,-0x1
8001a910 04 00 84 ae sw r4,0x4(s4)=>DMA_COUNTER_8007ce6c = ??
8001a914 30 00 04 8e lw r4,0x30(s0)
8001a918 3f 5e 01 0c jal SetDrawTPage void SetDrawTPage(DR_TPAGE * p, int dfe, int dtd, int tpage)
8001a91c 04 00 10 26 _addiu s0,s0,0x4
8001a920 02 00 42 2e sltiu v0,s2,0x2
8001a924 e9 ff 40 14 bne v0,zero,LAB_8001a8cc
8001a928 21 28 00 00 _clear r5
8001a92c 21 10 a0 02 move v0,s5
8001a930 48 00 bf 8f lw ra,local_8(sp)
8001a934 44 00 b7 8f lw s7,local_c(sp)
8001a938 40 00 b6 8f lw s6,local_10(sp)
8001a93c 3c 00 b5 8f lw s5,local_14(sp)
8001a940 38 00 b4 8f lw s4,local_18(sp)
8001a944 34 00 b3 8f lw s3,local_1c(sp)
8001a948 30 00 b2 8f lw s2,local_20(sp)
8001a94c 2c 00 b1 8f lw s1,local_24(sp)
8001a950 28 00 b0 8f lw s0,local_28(sp)
8001a954 08 00 e0 03 jr ra

89
EP_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
EP_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
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 // Восстанавливаем стек

448
EP_small_SRC.asm Normal file
View File

@@ -0,0 +1,448 @@
**************************************************************
* FUNCTION *
**************************************************************
undefined MakeSmallChar(undefined r4, undefined par
assume gp = 0x8007c970
undefined v0:1 <RETURN>
undefined a0:1 r4
undefined a1:1 r5
undefined a2:1 r6
undefined a3:1 r7
undefined4 Stack[0x10]:4 param_5 XREF[1]: 8001ab80(R)
MakeSmallChar
8001ab3c a8 ff bd 27 addiu sp,sp,-0x58
assume gp = <UNKNOWN>
8001ab40 44 00 b5 af sw s5,local_14(sp)
8001ab44 21 a8 80 00 move s5,r4
8001ab48 30 00 b0 af sw s0,local_28(sp)
8001ab4c 21 80 a0 00 move s0,r5
8001ab50 34 00 b1 af sw s1,local_24(sp)
8001ab54 21 88 c0 00 move s1,r6
8001ab58 38 00 b2 af sw s2,local_20(sp)
8001ab5c 80 1f 12 3c lui s2,0x1f80
8001ab60 d0 03 52 36 ori s2,s2,0x3d0
8001ab64 ff 00 09 3c lui t1,0xff
8001ab68 ff ff 29 35 ori t1,t1,0xffff
8001ab6c ff 00 e4 30 andi r4,r7,0xff
8001ab70 08 80 08 3c lui t0,0x8008
8001ab74 00 ff 06 3c lui r6,0xff00
8001ab78 58 ce 0a 25 addiu t2,t0,-0x31a8
8001ab7c 58 ce 03 8d lw v1,-0x31a8(t0)=>DAT_8007ce58 = ??
8001ab80 68 00 a7 8f lw r7,Stack+10(sp)
8001ab84 00 80 02 3c lui v0,0x8000 ;r2 = 8000 0000
8001ab88 54 00 bf af sw ra,local_4(sp)
8001ab8c 50 00 be af sw s8,local_8(sp)
8001ab90 4c 00 b7 af sw s7,local_c(sp)
8001ab94 48 00 b6 af sw s6,local_10(sp)
8001ab98 40 00 b4 af sw s4,local_18(sp)
8001ab9c 3c 00 b3 af sw s3,local_1c(sp)
8001aba0 28 00 b0 a7 sh s0,local_30(sp)
;;init chains
8001aba4 24 30 66 00 and r6,v1,r6
8001aba8 ff 00 e5 30 andi r5,r7,0xff
8001abac 24 18 69 00 and v1,v1,t1
8001abb0 25 a0 62 00 or s4,v1,v0
8001abb4 10 00 e7 30 andi r7,r7,0x10
8001abb8 2b 38 07 00 sltu r7,zero,r7
8001abbc 04 00 42 8d lw v0,0x4(t2)=>DAT_8007ce5c DMA cnt-1 = ??
8001abc0 00 00 83 8e lw v1,0x0(s4)
8001abc4 ff ff 42 24 addiu v0,v0,-0x1
8001abc8 24 18 69 00 and v1,v1,t1
8001abcc 25 30 c3 00 or r6,r6,v1
8001abd0 04 00 42 ad sw v0,0x4(t2)=>DAT_8007ce5c = ??
8001abd4 58 ce 06 ad sw r6,-0x31a8(t0)=>DAT_8007ce58 = ??
8001abd8 2d 70 00 0c jal StoreColorToAddr undefined StoreColorToAddr()
8001abdc 18 00 a7 af _sw r7,local_40(sp)
8001abe0 21 20 80 02 move r4,s4
8001abe4 00 84 10 00 sll s0,s0,0x10
8001abe8 03 2c 10 00 sra r5,s0,0x10
8001abec 00 8c 11 00 sll s1,s1,0x10
8001abf0 03 84 11 00 sra s0,s1,0x10
8001abf4 44 6c 00 0c jal InitDMAtextChain undefined InitDMAtextChain()
8001abf8 21 30 00 02 _move r6,s0
8001abfc 80 1f 04 3c lui r4,0x1f80
8001ac00 48 03 84 34 ori r4,r4,0x348
--------------4bit pattern here
8001ac94 02 00 02 24 li v0,0x2
8001ac98 0c 00 08 24 li t0,0xc
8001ac9c 14 00 a2 a7 sh v0,local_44(sp)
8001aca0 10 00 02 24 li v0,0x10
8001aca4 16 00 a8 a7 sh t0,local_44+0x2(sp)
8001aca8 03 00 82 a0 sb v0,0x3(r4)=>DAT_1f80034b = ??
8001acac 00 a0 02 3c lui v0,0xa000
8001acb0 04 00 82 ac sw v0,0x4(r4)=>DAT_1f80034c = ??
8001acb4 00 01 02 3c lui v0,0x100
8001acb8 80 1f 01 3c lui at,0x1f80
8001acbc 88 03 22 ac sw v0,offset DAT_1f800388(at) = ??
8001acc0 04 00 02 24 li v0,0x4
8001acc4 03 00 42 a2 sb v0,0x3(s2)=>DAT_1f8003d3 = ??
8001acc8 64 00 02 24 li v0,0x64
8001accc 07 00 42 a2 sb v0,0x7(s2)=>DAT_1f8003d7 = ??
8001acd0 98 00 83 97 lhu v1,0x98(gp)=>DAT_8007ca08
8001acd4 9a 00 87 97 lhu r7,0x9a(gp)=>DAT_8007ca0a
8001acd8 80 00 02 24 li v0,0x80
8001acdc 04 00 42 a2 sb v0,0x4(s2)=>DAT_1f8003d4 = ??
8001ace0 05 00 42 a2 sb v0,0x5(s2)=>DAT_1f8003d5 = ??
8001ace4 06 00 42 a2 sb v0,0x6(s2)=>DAT_1f8003d6 = ??
8001ace8 14 00 a2 8f lw v0,local_44(sp)
8001acec 10 00 a3 a7 sh v1,local_48(sp)
8001acf0 00 1c 03 00 sll v1,v1,0x10
8001acf4 03 2c 03 00 sra r5,v1,0x10
8001acf8 12 00 a7 a7 sh r7,local_48+0x2(sp)
8001acfc 10 00 a3 8f lw v1,local_48(sp)
8001ad00 21 30 a0 00 move r6,r5
8001ad04 0c 00 82 ac sw v0,0xc(r4)=>DAT_1f800354 = ??
8001ad08 02 00 a1 04 bgez r5,LAB_8001ad14
8001ad0c 08 00 83 ac _sw v1,0x8(r4)=>DAT_1f800350 = ??
8001ad10 3f 00 a6 24 addiu r6,r5,0x3f
LAB_800194fc: LAB_8001ad14 XREF[1]: 8001ad08(j)
8001ad14 83 11 06 00 sra v0,r6,0x6
8001ad18 80 11 02 00 sll v0,v0,0x6
8001ad1c 23 10 a2 00 subu v0,r5,v0
8001ad20 80 10 02 00 sll v0,v0,0x2
8001ad24 0c 00 42 a2 sb v0,0xc(s2)=>DAT_1f8003dc = ??
8001ad28 00 14 07 00 sll v0,r7,0x10
8001ad2c 03 1c 02 00 sra v1,v0,0x10
8001ad30 02 00 61 04 bgez v1,LAB_8001ad3c
8001ad34 21 10 60 00 _move v0,v1
8001ad38 ff 00 62 24 addiu v0,v1,0xff
LAB_8001ad3c XREF[1]: 8001ad30(j)
8001ad3c 03 12 02 00 sra v0,v0,0x8
8001ad40 00 12 02 00 sll v0,v0,0x8
8001ad44 23 10 62 00 subu v0,v1,v0
8001ad48 0d 00 42 a2 sb v0,0xd(s2)=>DAT_1f8003dd = ??
8001ad4c a0 00 83 97 lhu v1,0xa0(gp)=>DAT_8007ca10
8001ad50 08 00 02 24 li v0,0x8 ; r2 = 8 Sprite WIDTH
8001ad54 10 00 42 a6 sh v0,0x10(s2)=>DAT_1f8003e0 = ??
8001ad58 12 00 48 a6 sh t0,0x12(s2)=>DAT_1f8003e2 = ??
8001ad5c 0e 00 43 a6 sh v1,0xe(s2)=>DAT_1f8003de = ??
;TEXT READ START!!!!!!!!!
8001ad60 00 00 a5 92 lbu r5,0x0(s5)
8001ad64 00 00 00 00 nop
8001ad68 bd 00 a0 10 beq r5,zero,LAB_8001b060
8001ad6c 01 00 b5 26 _addiu s5,s5,0x1
8001ad70 08 80 16 3c lui s6,0x8008
8001ad74 68 ce de 26 addiu s8,s6,-0x3198
8001ad78 1c 00 b0 af sw s0,local_3c(sp)
8001ad7c ff 00 10 3c lui s0,0xff
8001ad80 ff ff 10 36 ori s0,s0,0xffff
8001ad84 20 00 b1 af sw s1,local_38(sp)
LAB_8001ad88 XREF[1]: 8001b058(j)
8001ad88 99 ff a3 24 addiu v1,r5,-0x67
8001ad8c 13 00 62 2c sltiu v0,v1,0x13
8001ad90 0b 00 40 10 beq v0,zero,switchD_8001adac::caseD_68
8001ad94 80 10 03 00 _sll v0,v1,0x2
8001ad98 01 80 0f 3c lui t7,0x8001
8001ad9c b4 06 ef 25 addiu t7,t7,0x6b4
8001ada0 21 10 4f 00 addu v0,v0,t7
8001ada4 00 00 42 8c lw v0,0x0(v0)=>->switchD_8001adac::caseD_67 = 8001adb4
8001ada8 00 00 00 00 nop
switchD_8001adac::switchD
8001adac 08 00 40 00 jr v0
8001adb0 00 00 00 00 _nop
switchD_8001adac::caseD_6a XREF[6]: 800106b4(*), 800106c0(*), 800106d8(*),
switchD_8001adac::caseD_70 800106dc(*), 800106fc(*), 8001adac(j)
switchD_8001adac::caseD_71
switchD_8001adac::caseD_79
switchD_8001adac::caseD_67
8001adb4 1c 00 b7 8f lw s7,local_3c(sp)
8001adb8 73 6b 00 08 j LAB_8001adcc
8001adbc 02 00 f1 26 _addiu s1,s7,0x2
switchD_8001adac::caseD_69 XREF[16]: 800106b8(*), 800106bc(*), 800106c4(*),
switchD_8001adac::caseD_6b 800106c8(*), 800106cc(*), 800106d0(*),
switchD_8001adac::caseD_6c 800106d4(*), 800106e0(*), 800106e4(*),
switchD_8001adac::caseD_6d 800106e8(*), 800106ec(*), 800106f0(*),
switchD_8001adac::caseD_6e 800106f4(*), 800106f8(*), 8001ad90(j),
switchD_8001adac::caseD_6f 8001adac(j)
switchD_8001adac::caseD_72
switchD_8001adac::caseD_73
switchD_8001adac::caseD_74
switchD_8001adac::caseD_75
switchD_8001adac::caseD_76
switchD_8001adac::caseD_77
switchD_8001adac::caseD_78
switchD_8001adac::caseD_68
8001adc0 20 00 b8 8f lw t8,local_38(sp)
8001adc4 00 00 00 00 nop
8001adc8 03 8c 18 00 sra s1,t8,0x10
LAB_8001adcc XREF[1]: 8001adb8(j)
8001adcc 18 00 b9 8f lw t9,local_40(sp)
8001add0 00 00 00 00 nop
8001add4 12 00 20 13 beq t9,zero,LAB_8001ae20
8001add8 e0 ff a5 24 _addiu r5,r5,-0x20
8001addc 01 80 02 3c lui v0,0x8001
8001ade0 50 06 42 24 addiu v0,v0,0x650
8001ade4 21 10 a2 00 addu v0,r5,v0
8001ade8 01 80 03 3c lui v1,0x8001
8001adec 3c 06 63 24 addiu v1,v1,0x63c
8001adf0 00 00 42 90 lbu v0,0x0(v0)=>DAT_80010630 = 63h c
8001adf4 28 00 af 97 lhu t7,local_30(sp)
8001adf8 40 10 02 00 sll v0,v0,0x1
8001adfc 21 10 43 00 addu v0,v0,v1
8001ae00 00 00 43 90 lbu v1=>DAT_8001063c,0x0(v0)
8001ae04 01 00 42 90 lbu v0,0x1(v0)=>DAT_8001063d = 04h
8001ae08 23 18 e3 01 subu v1,t7,v1
8001ae0c 00 24 03 00 sll r4,v1,0x10
8001ae10 03 9c 04 00 sra s3,r4,0x10
8001ae14 21 10 43 00 addu v0,v0,v1
8001ae18 8e 6b 00 08 j LAB_8001ae38
8001ae1c 28 00 a2 a7 _sh v0,local_30(sp)
LAB_8001ae20 XREF[1]: 8001add4(j)
8001ae20 28 00 b7 97 lhu s7,local_30(sp)
8001ae24 04 00 82 96 lhu v0,0x4(s4)
8001ae28 00 1c 17 00 sll v1,s7,0x10
8001ae2c 03 1c 03 00 sra v1,v1,0x10
8001ae30 c0 10 02 00 sll v0,v0,0x3
8001ae34 21 98 62 00 addu s3,v1,v0
LAB_8001ae38 XREF[1]: 8001ae18(j)
8001ae38 c8 6c 00 0c jal GenerateSmallChar undefined FUN_8001b320()
8001ae3c 21 20 a0 00 _move r4,r5
8001ae40 00 80 0e 3c lui t6,0x8000
8001ae44 00 ff 0a 3c lui t2,0xff00
8001ae48 21 48 80 02 move t1,s4
8001ae4c 08 80 0c 3c lui t4,0x8008
8001ae50 58 ce 8d 25 addiu t5,t4,-0x31a8
8001ae54 80 1f 0b 3c lui t3,0x1f80
8001ae58 88 03 6b 35 ori t3,t3,0x388
8001ae5c 21 40 80 02 move t0,s4
8001ae60 08 00 53 a6 sh s3,0x8(s2)=>DAT_1f8003d8 = ??
8001ae64 0a 00 51 a6 sh s1,0xa(s2)=>DAT_1f8003da = ??
PageLoop:
LAB_8001ae68 XREF[1]: 8001b038(j)
8001ae68 68 ce c2 8e lw v0,-0x3198(s6)=>DMA_NEXT_FREE_CHAIN_8007ce68 = ??
8001ae6c 00 00 00 00 nop
8001ae70 24 20 4a 00 and r4,v0,t2
8001ae74 24 10 50 00 and v0,v0,s0
8001ae78 25 28 4e 00 or r5,v0,t6
8001ae7c 04 00 c2 8f lw v0,0x4(s8)=>DMA_COUNTER_8007ce6c = ??
8001ae80 00 00 a3 8c lw v1,0x0(r5)
8001ae84 ff ff 42 24 addiu v0,v0,-0x1
8001ae88 24 18 70 00 and v1,v1,s0
8001ae8c 25 20 83 00 or r4,r4,v1
8001ae90 04 00 c2 af sw v0,0x4(s8)=>DMA_COUNTER_8007ce6c = ??
8001ae94 68 ce c4 ae sw r4,-0x3198(s6)=>DMA_NEXT_FREE_CHAIN_8007c = ??
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
8001ae98 00 00 58 8e lw t8,0x0(s2)=>DAT_1f8003d0 = ??
8001ae9c 04 00 59 8e lw t9,0x4(s2)=>DAT_1f8003d4 = ??
8001aea0 08 00 4f 8e lw t7,0x8(s2)=>DAT_1f8003d8 = ??
8001aea4 0c 00 57 8e lw s7,0xc(s2)=>DAT_1f8003dc = ??
8001aea8 00 00 b8 ac sw t8,0x0(r5)
8001aeac 04 00 b9 ac sw t9,0x4(r5)
8001aeb0 08 00 af ac sw t7,0x8(r5)
8001aeb4 0c 00 b7 ac sw s7,0xc(r5)
8001aeb8 10 00 58 8e lw t8,0x10(s2)=>DAT_1f8003e0 = ??
8001aebc 00 00 00 00 nop
8001aec0 10 00 b8 ac sw t8,0x10(r5)
8001aec4 18 00 03 8d lw v1,0x18(t0)
8001aec8 00 00 a2 8c lw v0,0x0(r5)
8001aecc 00 00 63 8c lw v1,0x0(v1)
8001aed0 24 10 4a 00 and v0,v0,t2
8001aed4 24 18 70 00 and v1,v1,s0
8001aed8 25 10 43 00 or v0,v0,v1
8001aedc 00 00 a2 ac sw v0,0x0(r5)
8001aee0 18 00 04 8d lw r4,0x18(t0)
8001aee4 00 00 00 00 nop
;;;YEHU
8001aee8 00 00 82 8c lw v0,0x0(r4)
8001aeec 24 18 b0 00 and v1,r5,s0
8001aef0 24 10 4a 00 and v0,v0,t2
8001aef4 25 10 43 00 or v0,v0,v1
8001aef8 00 00 82 ac sw v0,0x0(r4)
8001aefc 18 00 05 ad sw r5,0x18(t0)
8001af00 04 00 22 95 lhu v0,0x4(t1)
8001af04 00 00 00 00 nop
8001af08 04 00 40 14 bne v0,zero,LAB_8001af1c
8001af0c 00 00 00 00 _nop
8001af10 28 00 05 ad sw r5,0x28(t0)
8001af14 0c 00 33 a5 sh s3,0xc(t1)
8001af18 0e 00 31 a5 sh s1,0xe(t1)
NotFirstChar: LAB_8001af1c XREF[1]: 8001af08(j)
8001af1c 80 1f 05 3c lui r5,0x1f80
8001af20 58 ce 82 8d lw v0,-0x31a8(t4)=>DAT_8007ce58 = ??
8001af24 48 03 a5 34 ori r5,r5,0x348
8001af28 24 20 4a 00 and r4,v0,t2
8001af2c 24 10 50 00 and v0,v0,s0
8001af30 25 38 4e 00 or r7,v0,t6
8001af34 21 30 e0 00 move r6,r7
8001af38 04 00 a2 8d lw v0,0x4(t5)=>DAT_8007ce5c = ??
8001af3c 00 00 e3 8c lw v1,0x0(r7)
8001af40 ff ff 42 24 addiu v0,v0,-0x1
8001af44 24 18 70 00 and v1,v1,s0
8001af48 25 20 83 00 or r4,r4,v1
8001af4c 04 00 a2 ad sw v0,0x4(t5)=>DAT_8007ce5c = ??
8001af50 03 00 e2 30 andi v0,r7,0x3
8001af54 16 00 40 10 beq v0,zero,LAB_8001afb0
8001af58 58 ce 84 ad _sw r4,-0x31a8(t4)=>DAT_8007ce58 = ??
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
LAB_8001af5c XREF[1]: 8001afa0(j)
8001af5c 03 00 b8 88 lwl t8,0x3(r5)
8001af60 00 00 b8 98 lwr t8,0x0(r5)=>DAT_1f800348 = ??
8001af64 07 00 b9 88 lwl t9,0x7(r5)
8001af68 04 00 b9 98 lwr t9,0x4(r5)=>DAT_1f80034c = ??
8001af6c 0b 00 af 88 lwl t7,0xb(r5)
8001af70 08 00 af 98 lwr t7,0x8(r5)=>DAT_1f800350 = ??
8001af74 0f 00 b7 88 lwl s7,0xf(r5)
8001af78 0c 00 b7 98 lwr s7,0xc(r5)=>DAT_1f800354 = ??
8001af7c 03 00 d8 a8 swl t8,0x3(r6)
8001af80 00 00 d8 b8 swr t8,0x0(r6)
8001af84 07 00 d9 a8 swl t9,0x7(r6)
8001af88 04 00 d9 b8 swr t9,0x4(r6)
8001af8c 0b 00 cf a8 swl t7,0xb(r6)
8001af90 08 00 cf b8 swr t7,0x8(r6)
8001af94 0f 00 d7 a8 swl s7,0xf(r6)
8001af98 0c 00 d7 b8 swr s7,0xc(r6)
8001af9c 10 00 a5 24 addiu r5,r5,0x10
8001afa0 ee ff ab 14 bne r5,t3,LAB_8001af5c
8001afa4 10 00 c6 24 _addiu r6,r6,0x10
8001afa8 f7 6b 00 08 j LAB_8001afdc
8001afac 00 00 00 00 _nop
Copy16Bytes:
LAB_8001afb0 XREF[2]: 8001af54(j), 8001afd4(j)
8001afb0 00 00 b8 8c lw t8,0x0(r5)=>DAT_1f800348 = ??
8001afb4 04 00 b9 8c lw t9,0x4(r5)=>DAT_1f80034c = ??
8001afb8 08 00 af 8c lw t7,0x8(r5)=>DAT_1f800350 = ??
8001afbc 0c 00 b7 8c lw s7,0xc(r5)=>DAT_1f800354 = ??
8001afc0 00 00 d8 ac sw t8,0x0(r6)
8001afc4 04 00 d9 ac sw t9,0x4(r6)
8001afc8 08 00 cf ac sw t7,0x8(r6)
8001afcc 0c 00 d7 ac sw s7,0xc(r6)
8001afd0 10 00 a5 24 addiu r5,r5,0x10
8001afd4 f6 ff ab 14 bne r5,t3,LAB_8001afb0
8001afd8 10 00 c6 24 _addiu r6,r6,0x10
last4BytesCopy:
LAB_8001afdc XREF[1]: 8001afa8(j)
8001afdc 03 00 b8 88 lwl t8,0x3(r5)
8001afe0 00 00 b8 98 lwr t8,0x0(r5)=>DAT_1f800358 = ??
8001afe4 00 00 00 00 nop
8001afe8 03 00 d8 a8 swl t8,0x3(r6)
8001afec 00 00 d8 b8 swr t8,0x0(r6)
; linking DMA char+copysprite
8001aff0 18 00 03 8d lw v1,0x18(t0)
8001aff4 00 00 e2 8c lw v0,0x0(r7)
8001aff8 00 00 63 8c lw v1,0x0(v1)
8001affc 24 10 4a 00 and v0,v0,t2
8001b000 24 18 70 00 and v1,v1,s0
8001b004 25 10 43 00 or v0,v0,v1
8001b008 00 00 e2 ac sw v0,0x0(r7)
8001b00c 18 00 04 8d lw r4,0x18(t0)
8001b010 00 00 00 00 nop
8001b014 00 00 82 8c lw v0,0x0(r4)
8001b018 24 18 f0 00 and v1,r7,s0
8001b01c 24 10 4a 00 and v0,v0,t2
8001b020 25 10 43 00 or v0,v0,v1
8001b024 00 00 82 ac sw v0,0x0(r4)
8001b028 18 00 07 ad sw r7,0x18(t0)
8001b02c 04 00 08 25 addiu t0,t0,0x4
8001b030 08 00 22 25 addiu v0,t1,0x8
8001b034 2b 10 02 01 sltu v0,t0,v0
8001b038 8b ff 40 14 bne v0,zero,LAB_8001ae68 Go To pageLoop
8001b03c 00 00 00 00 _nop
;DMA OVERFLOW CHECK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (8007b6d4)
8001b040 04 00 82 96 lhu v0,0x4(s4)
8001b044 00 00 00 00 nop
8001b048 01 00 42 24 addiu v0,v0,0x1
8001b04c 04 00 82 a6 sh v0,0x4(s4)
8001b050 00 00 a5 92 lbu r5,0x0(s5)
8001b054 00 00 00 00 nop
8001b058 4b ff a0 14 bne r5,zero,LAB_8001ad88
8001b05c 01 00 b5 26 _addiu s5,s5,0x1
TextEnd:
LAB_8001b060 XREF[1]: 8001ad68(j)
8001b060 21 90 00 00 clear s2
8001b064 08 80 13 3c lui s3,0x8008
8001b068 68 ce 75 26 addiu s5,s3,-0x3198
8001b06c ff 00 11 3c lui s1,0xff
8001b070 ff ff 31 36 ori s1,s1,0xffff
8001b074 21 80 80 02 move s0,s4
8001b078 21 28 00 00 clear r5
PageTLoop:
LAB_8001b07c XREF[1]: 8001b0d4(j)
8001b07c 01 00 06 24 li r6,0x1
8001b080 21 90 46 02 addu s2,s2,r6
8001b084 00 80 02 3c lui v0,0x8000
8001b088 00 ff 04 3c lui r4,0xff00
8001b08c 68 ce 63 8e lw v1,-0x3198(s3)=>DMA_NEXT_FREE_CHAIN_8007ce68 = ??
8001b090 9c 00 87 8f lw r7,0x9c(gp)=>DAT_8007ca0c
8001b094 24 18 71 00 and v1,v1,s1
8001b098 25 18 62 00 or v1,v1,v0
8001b09c 30 00 03 ae sw v1,0x30(s0)
8001b0a0 68 ce 62 8e lw v0,-0x3198(s3)=>DMA_NEXT_FREE_CHAIN_8007ce68 = ??
8001b0a4 00 00 63 8c lw v1,0x0(v1)
8001b0a8 24 10 44 00 and v0,v0,r4
8001b0ac 24 18 71 00 and v1,v1,s1
8001b0b0 04 00 a4 8e lw r4,0x4(s5)=>DMA_COUNTER_8007ce6c = ??
8001b0b4 25 10 43 00 or v0,v0,v1
8001b0b8 68 ce 62 ae sw v0,-0x3198(s3)=>DMA_NEXT_FREE_CHAIN_8007ce68 = ??
8001b0bc ff ff 84 24 addiu r4,r4,-0x1
8001b0c0 04 00 a4 ae sw r4,0x4(s5)=>DMA_COUNTER_8007ce6c = ??
8001b0c4 30 00 04 8e lw r4,0x30(s0)
8001b0c8 3f 5e 01 0c jal SetDrawTPage void SetDrawTPage(DR_TPAGE * p, int dfe, int dtd, int tpage)
8001b0cc 04 00 10 26 _addiu s0,s0,0x4
8001b0d0 02 00 42 2e sltiu v0,s2,0x2
8001b0d4 e9 ff 40 14 bne v0,zero,LAB_8001b07c
8001b0d8 21 28 00 00 _clear r5
8001b0dc 21 10 80 02 move v0,s4
8001b0e0 54 00 bf 8f lw ra,local_4(sp)
8001b0e4 50 00 be 8f lw s8,local_8(sp)
8001b0e8 4c 00 b7 8f lw s7,local_c(sp)
8001b0ec 48 00 b6 8f lw s6,local_10(sp)
8001b0f0 44 00 b5 8f lw s5,local_14(sp)
8001b0f4 40 00 b4 8f lw s4,local_18(sp)
8001b0f8 3c 00 b3 8f lw s3,local_1c(sp)
8001b0fc 38 00 b2 8f lw s2,local_20(sp)
8001b100 34 00 b1 8f lw s1,local_24(sp)
8001b104 30 00 b0 8f lw s0,local_28(sp)
8001b108 08 00 e0 03 jr ra
8001b10c 58 00 bd 27 _addiu sp,sp,0x58

BIN
F0681.BIN Normal file

Binary file not shown.

BIN
F1079.BIN Normal file

Binary file not shown.

123
GROUPED_ALGO.txt Normal file
View File

@@ -0,0 +1,123 @@
- Проверка на "мой формат" текста. Проверка 13ого бита команды. Если нет - вызов оригинальной японской процедуры
- Инициализация регистров (сдвиг стека, сохранение регистров)
- Инициализация "текстовой строки"
- получение адреса свободной цепочки/декремент счётчика
- вызов оригинальной процедуры инициализации параметров initCopyCharChain
- получение/чистка координат, сохранение в стек
- сохранение множителя цвета/признака тени
- подготовка scratchpad
- готовим команду rect, копируя туда координаты, команду 64808080 и первые экранные координаты
- готовим "шаблон-заголовок" команды CpuToVram с последней командой 0x01 в scratchpad
- tPos = 0
- textEnd = false
ЦИКЛ ЧТЕНИЯ ГРУППЫ СИМВОЛОВ
- Считаем количество символов (lineLen) до конца строки от текущей позиции (tPos), одновременно копируя коды в буфер
- Если lineLen >= 10
- lineLen = 10
- tPos += 10
- textEnd = false
- Else
- lineLen = lineLen
- tPos += lineLen
- textEnd = true
- Вызываем процедуру формирования данных строки длиной (lineLen)
- Здесь формируем всю строку в scratchpad, в готовом 4битном формате,
возвращая реальную width
- в первой версии не будем применять тень (разберёмся потом)
- Вычисляем spriteCmdCount = количество нужных команд CpuToVram, вычисляя ceil(width/8)
ЗАПИСЬ КОМАНД!
Запись команд происходит снизу вверх! То есть, сначала пишем rect, потом все CpuToVram,
связывая их и записывая текущую цепочку в textParams.
ЦИКЛ СТРАНИЦ (1,2)
- получение адреса свободной цепочки/декремент счётчика
- КОПИРОВАНИЕ КОМАНДЫ rect из scratchpad
- установка width и координаты в rect
- установка x = tPos * 6 + initX в rect
ЦИКЛ ФОРМИРОВАНИЯ СПРАЙТОВ 8x12 (< spriteCmdCount)
- получение адреса свободной цепочки/декремент счётчика
- Запись шаблона CpuToVram из scratchpad в новую цепочку
- Запись данных символа 8x12 из scratchpad в новую цепочку
- Связь предыдущего блока с текущим/обновление text_params
КОНЕЦ ЦИКЛА СПРАЙТОВ
КОНЕЦ ЦИКЛА СТРАНИЦ
Если textEnd == 0 переход на начало цикла
КОНЕЦ ЦИКЛА ГРУППЫ СИМВОЛОВ
ЦИКЛ ДОБАВЛЕНИЯ setTpage для 2 страниц
- получение адреса свободной цепочки/декремент счётчика
- вызов/запись команды setTpage
- связь последней команды + обновление text_params
КОНЕЦ ЦИКЛА
Возврат значения text_params(ссылка на всю текстовую структуру)
Формула чтения данных символа из scratchpad:
y = charLen * 4
for x = 0 to width * 4 - 1
chardataBytes.Add(y * (len * 4) + x)
next x
IS inner data
1f8001e0 -
1f800348 - 4bit chardata
1f800348 - CpuToVram cmd template
1f800358 cmdLengt (0x10)
0000000a
3001f001 - 0130 + (spriteIndex * 2) : 01f0.
02000c00
........
00000001 - flushcache in result chain
1f800390 -
1f8003ac - 1bpp to 4bpp convert table
1f8003d0 - Rect
cmdLengt (04)
80808064
5c00d400 - dest coords
c0f0d37f - src coords & clut
08000c00 - width & heigth
IS regs:
a2 - FF000000
a3 - 80080000
s3 - scratch read address
s6 - text read pointer
s7 - 80000000 address mask
t0 - 00FFFFFF
t1 - print_params for PAGE
t1 + 4 - short - charcount
t1 + 18 - chain last addr
t1 + 1C - chain last addr
t4 - overall print params
8007b6d0 - next Free Chain addr
8007b6d4 - left Chain Counter
0xa0(gp) - char vram UV
0xa4(gp) - char texture page for setTpage
0xa8(gp) - half - CLUT
0xac(gp) - color
0xb0(gp) - character width multiplier
Custom regs:
t5 - current chunk cpu2vram blocks count
t6 - current overall X
t7 -
t8 -
s2 - char count for current sprite
s8 - chunk block index (cpu2vram)

210
IS_charload_grouped.asm Normal file
View File

@@ -0,0 +1,210 @@
// LOADING CHAR FROM CUSTOM FONT FOR ALL LINE
make_char_line_in_scratch:
addiu sp, sp,-0x18
sw ra, 0x10(sp)
sw t5, 0x14(sp)
move t5, a0 //char num
sll s3, a1, 0x2 //width in bytes (sprite count * 4)
lui t7, MyAddr
addiu t7, -0x0c //Text buffer pointer
char_data_clear:
lui a0, 0x1f80
addiu a1, a0, 0x1c0
addiu a2, a0, 0x348
li v0, 0
char_data_loop:
sw v0, 0x0(a1)
addiu a1, 0x4
bne a1, a2, char_data_loop
nop
addiu s1, a0, 0x01c0 // destination address reset
li a2, 0 // char index counter
lbu v0, 0x0(t7)
lbu t2, 0xac(gp) //load color
addiu t7, t7, 0x01
lui a3, 0x1f80
ori a3, a3,0x390 // set scratch convert addr r7 = 1f8002e0
chars_font_loop:
addiu v0, -0x20 //shift unprintable
beq v0, zero, spaceJump //If space (0x20 ASCII) -- bypass char
nop
lui v1, 0x801f // //load font addr to r3 (801ef000 + BA00)
ori v1, v1, 0xaa00 // ==== 801faa00
sll t0, v0, 2 // t0 = v0 * 4
sll v0, v0, 3 // v0 = v0 * 8
addu v0, v0, t0 // v0 = (v0*8) + (v0*4) = v0*12
addu t1, v0, v1 //t1 = char addr // t1 = r2(offs) + r3 (start)
clear t3 //new lines counter
char_lines_loop:
lbu v1, 0x0(t1) //load byte of char font to r3
nop
beq v1, zero, zero_jump
nop
its_not_empty:
//right
andi a0, v1, 0xf // a0 = r3 & 0f - cutting left semibyte
sll a0, a0, 0x1 // a0 << 1
addu a0, a0, a3 // a0 += bit table
lhu a0, 0x0(a0) // в a0 - правый полусимвол в 4 бит
//left
srl a1, v1, 0x4 // r3 >> 4
andi a1, a1, 0xf // r2 = r3 & 0f
sll a1, a1, 0x1 // r2 << 1
addu a1, a1, a3 // r2 = r2 + to4bitConvertTableAddr (r7)
lhu a1, 0x0(a1)//>DAT_1f8002e0 в a1 - левый полусимвол в 4 бит
nop
//combine & color
sll a1, 0x10
or a0, a1
mult a0, t2 //set color - сохраняем в регистре умножения готовые 4 байта
//line dest addr calc -
// s1(dest addr) + ((current line * (charcount * 4) + charIndex * 3))
//calc char index * 3
sll a1, a2, 1
addu a1, a1, a2
//getting final char line word...
nop
mflo t4 // t4 = final char
//multiplying current line * width
mult t3, s3
nop
nop
nop
mflo a0
//getting final address
addu a0, a0, a1 // a0 = current_line * width_in_bytes + charindex * 3
addu a0, a0, s1 // s1 = destination write address
andi v0, t4, 0xFF //
sb v0, 0x00(a0) //
sra v0, t4, 0x08 //
andi v0, v0, 0xFF //
sb v0, 0x01(a0) // Byte by byte char data save in LITTLE ENDIAN
sra v0, t4, 0x10 // cause we are not fitting to memory words
andi v0, v0, 0xFF //
sb v0, 0x02(a0) //
addiu v0, t5, -0x1
bne a2, v0, not_last
andi v1, t5, 0x3
beq v1, zero, divideby4
not_last:
sra v0, t4, 0x18 // Байт рисуется только если длина не кратна 4
andi v0, v0, 0xFF // и это не последний байт
sb v0, 0x03(a0) // (иначе происходит наложение байта на следующую строку)
divideby4:
zero_jump:
addiu t3, t3, 0x01 //inc line counter
li v0, 0x0C //line max count
bne t3, v0, char_lines_loop //comparing...
addiu t1, t1, 0x01 //shift char font line address
spaceJump:
addiu a2, a2, 0x1 // inc char index
lbu v0, 0x0(t7)
addiu t7, t7, 0x01
beq v0, zero, sprite_end //if we read 0 - end
nop
bne a2, t5, chars_font_loop // if r3 counter<>0 goto loop
nop
sprite_end:
lbu v1, 0xad(gp) // >DAT_8007b23d_textMode load curText Shadow?
li v0, 0x1
bne v1, v0, NotShadow //Shadow character check
nop
lui a0, 0x1f80
ori a0, a0, 0x1c0
make_shadow: //s3 - line width in bytes
move a1, s3 // a1 = ширина
sll a1, 0x1 //a1 = смещение на 3 строку (ширина * 2)
sll v0, s3, 3 //v0 = ширина строки * 8
addu v0, a1 //v0 = ширина строки * 10
addu a3, a0, v0 // a3 = указатель на 10 строку
addu a0, a1 // a0 = Указатель на 3 строку
lbu t1, 0xac(gp) // v0 = базовый цвет символа
li t2, 0xf // t2 = маска 0xF для работы с 4 битами пикселя
addiu t1, 0x1 // t1 = цвет тени (базовый цвет + 1)
// Основной цикл по строкам (снизу вверх)
shadow_row_loop:
clear t5 //clear sprite shift counter
//Цикл спрайтов в строке
shadow_sprites_loop:
addu t7, a3, t5 //Текущий адрес спрайта = Адрес текущей строки + смещение спрайта
lw t0, 0x0(t7) // t0 = текущая полоса спрайта
clear a2 // a2 = счётчик пикселей в строке (X координата)
li a1, 0x4 // a1 = сдвиг 1 пиксель вправо (4 бита)
// Внутренний цикл по пикселям в строке
shadow_pixel_loop:
sll v0, a2, 0x2 // v0 = смещение битов для исходного пикселя (X * 4)
sllv v0, t2, v0 // v0 = маска для исходного пикселя (0xF << (X*4))
and v0, t0, v0 // v0 = проверяем есть ли исходный пиксель
beq v0, zero, no_s // если пикселя нет, пропускаем
sllv v0, t2, a1 // v0 = маска для пикселя тени (0xF << позицияени)
addu t8, t7, s3 //этот же байт в следующей строке = наш адрес + ширина строки
lw v1, 0x0(t8) // v1 = следующая строка (где будет тень) // смещение на ВСЮ ШИРИНУ СТРОКИ
nop
and v0, v1, v0 // проверяем занято ли место для тени
bne v0, zero, no_s // если место занято, пропускаем
sllv v0, t1, a1 // v0 = цвет тени в нужной позиции
or v0, v1, v0 // добавляем тень к следующей строке
sw v0, 0x0(t8) // сохраняем строку с тенью
no_s:
addiu a2, a2, 0x1 // следующий пиксель (X+1)
sltiu v0, a2, 0x7 // проверяем X < 7 (только 7 из 8 пикселей)
bne v0, zero, shadow_pixel_loop // продолжаем цикл по пикселям
addiu a1, a1, 0x4 // следующая позиция тени (+4 бита = +1 пиксель)
addiu t5, t5, 0x04
bne t5, s3, shadow_sprites_loop
nop
// next line
subu a3, s3 //Двигаемся назад на ширину строки
sltu v0, a3, a0 // проверяем вышли ли за верхнюю границу
beq v0, zero, shadow_row_loop // продолжаем цикл по строкам
nop
NotShadow:
lw t5,0x14(sp)
lw ra,0x10(sp) //Restore stack and exit
nop
jr ra
addiu sp, sp, 0x18

480
IS_main_grouped.asm Normal file
View File

@@ -0,0 +1,480 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
; Author: Sergey Shemet 12/10/2021
.psx
// Определения функций
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f // need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 // need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 0x8000F800
.include "complex_strings_copy.asm"
.org 0x80090000
ExternalPrint:
// Текстовая тестовая процедура
move v1, s3 // Сохраняем s3
move s3, a0 // Устанавливаем s3 как адрес текста
lhu v0, 0x0(s3) // Читаем 2 байта текста
move s3, v1 // Восстанавливаем s3
srl v1, v0, 0xD // Проверяем 13-й бит (система 1 байт)
bne v1, zero, MyPrintLineRoutine // Если установлен, переходим к нашей процедуре
clear v1
j PrintBigDMAText // Иначе используем стандартную процедуру
nop
MyPrintLineRoutine:
addiu sp, sp, -0x50 // Выделяем место в стеке
sw ra, 0x4c(sp) // Сохраняем регистры
sw s1, 0x2c(sp)
sw s2, 0x30(sp)
sw s3, 0x34(sp)
sw s4, 0x38(sp)
sw s5, 0x3c(sp)
sw s6, 0x40(sp) // Сохраняем регистры
sw s8, 0x48(sp)
sw s7, 0x44(sp)
move s6, a0 // Адрес чтения текста -> s6
move s1, a1
move s2, a2
// Смещаем поинтер чтения
andi v0, v0, 0xff // Берем младший байт
addiu s6, s6, 0x2 // Сдвигаем указатель текста на +2 байта
lui s3, MyAddr
sh v0, -0x10(s3) // Сохраняем счетчик байтов @ 8008fff0 для общего количества
sh v0, -0x0e(s3) // Сохраняем счетчик байтов @ 8008fff2 для обратного отсчёта
lui t0, 0xff
ori t0, t0, 0xffff // t0 = 00FFFFFF
sw s0, 0x28(sp) // Сохраняем s0 в стеке
andi s0, a3, 0xff // s0 - режим текста (цвет и тень)
move a0, s0 // a0 = s0 (обрезанный цвет)
lui a3, 0x8008 // a3 = 80080000
lui a2, 0xff00 // a2 = FF000000
//Начинаем формировать цепочки
addiu t1, a3, -0x4930 // t1 = 8007b6d0 - новая свободная цепочка
lw v1, -0x4930(a3) // v1 = загружаем свободную цепочку
lbu a1, 0x60(sp) // Флаг тени из стека -> a1
lui v0, 0x8000 // v0 = 80000000
// Инициализация цвета и textParams
and a2, v1, a2 // a2 = v1 & ff000000
andi a1, a1, 0xff // Очищаем режим текста
and v1, v1, t0 // v1 & 00ffffff
or s4, v1, v0 // s4 - основной адрес свободной цепочки
lw v0, 0x4(t1) // Загружаем счетчик DMA
lw v1, 0x0(s4) // v1 = следующая свободная цепочка
addiu v0, v0, -0x1 // Уменьшаем счетчик DMA
and v1, v1, t0 // v1 & 00ffffff
or a2, a2, v1 // a2 | v1 = следующая свободная цепочка
sw v0, 0x4(t1) // Сохраняем счетчик DMA
jal storeColor
sw a2, -0x4930(a3) // Сохраняем следующую свободную цепочку
move a0, s4 // Текущий адрес цепочки
sll a1, s1, 0x10 // a1 = X << 16
sra a1, a1, 0x10 // a1 = X координата
sll a2, s2, 0x10 // a2 = Y << 16
sra a2, a2, 0x10 // a2 = Y координата
jal initCopyCharChain // Инициализация цепочек символов
move a3, s0 // Сохраняем режим текста
// Шаблон cpuToVram
cputovram_scratchpad_template:
lui a3, 0x1f80
ori a3, a3, 0x0348 // a3 = первый символ начала
lui a1, 0x0F00 // Количество команд без flushcache
sw a1, 0x0(a3) // Сохраняем количество команд
lui a0, 0xa000 // a0 = a0000000
sw a0, 0x4(a3)
lui v0, 0x01f0
ori v0, 0x0130
sw v0, 0x8(a3) // сохраняем VU для CPUtoVRAM
lui v0, 0xc
ori v0, 0x2
sw v0, 0xc(a3) // сохраняем 000c0002
_1bppTo4bpp_table_template:
// Копирование таблицы преобразования 1bpp в 4bpp
lui t8, 0x1f80
ori t8, t8, 0x390
lui t7, 0x8001
ori t7, t7, 0x3e8
lw t5, 0x0(t7)
lw t6, 0x4(t7)
sw t5, 0x0(t8)
sw t6, 0x4(t8)
lw t5, 0x8(t7)
lw t6, 0xC(t7)
sw t5, 0x8(t8)
sw t6, 0xC(t8)
lw t5, 0x10(t7)
lw t6, 0x14(t7)
sw t5, 0x10(t8)
sw t6, 0x14(t8)
lw t5, 0x18(t7)
lw t6, 0x1C(t7)
sw t5, 0x18(t8)
sw t6, 0x1C(t8)
rect_scratchpad_template:
// Шаблон команды rect в scratchpad
lui s3, 0x1f80
ori s3, 0x03d0 // s3 = 1f8003d0 - адрес rect в scratchpad
lui v0, 0x0400
sw v0, 0x0(s3) // Длина цепочки = 4
lui v0, 0x6480
ori v0, 0x8080
sw v0, 0x4(s3)
li v0, 0xf0c0
sh v0, 0xc(s3) // Сохраняем координаты VU (всегда f0c0)
lhu v1, 0xa8(gp) // Загружаем CLUT из GP (всегда 7FD3)
li v0, 0
sw v0, 0x8(s3) //Чистим экранные координаты
sh s2, 0xa(s3) //И сразу устанавливаем Y
lui v0, 0xc
ori v0, 0x8 // Ширина спрайта = 8
sw v0, 0x10(s3) // Сохраняем ширину
sh v1, 0xe(s3) // Сохраняем CLUT
make_sprite_size_table:
lui s3, 0x1f80
ori s3, 0x03f0 // Будем серить в scratch
lui v0, 0x0303 // таблицей рассчитанных команд и ширин
ori v0, 0x0201 // необходимых для спрайтов линии (cmdCount << 2)
sw v0, 0x0(s3)
lui v1, 0x0606
ori v1, 0x0504
sw v1, 0x4(s3)
li v0, 0x0807
sh v0, 0x8(s3)
misc_init:
move t6, s1 // Текущий экранный X, который будет смещаться и писаться в команду rect
// Устанавливаем, исходя из прилетевшей координаты X
TextGroupReadLoop:
// Смотрим количество символов до предела (не более 10) (проверяем MyAddr-0xE)
// Отнимаем количество символов в MyAddr-0xE. Устанавливаем признак, если ещё не конец
// Копируем символы во временный буфер MyAddr (-0x0с)
lui s3, 0x1f80
ori s3, 0x03f0 // Перезадаём адрес таблицы количества спрайтов для нового цикла
lui t1, MyAddr //Постоянный счётчик
//TODO!!!!!: Динамическая длина строки для соединения с переменными!
lh v1, -0x0e(t1) //Загружаем количество оставшихся символов
lui t2, MyAddr //Сдвиг для буфера
sltiu a0, v1, 0x0B //Меньше 10 в строке?
bne a0, zero, readTextToBuffer
clear s2 //Обнуляем счётчик символов
li v1, 0xA //Установка максимального количество символов
readTextToBuffer:
lbu a0, 0x0(s6) // Основное чтение байта текста
addiu s6, s6, 0x1 // Сдвиг адреса чтения на +1 байт
addiu v1, v1, -0x1 // Осталось в этом блоке...
sb a0, -0x0c(t2) // Запись символа в буфер
addiu s2, s2, 0x1 // Счётчик прочитанного +1
lh v0, -0x0e(t1) // Грузим общий счётчик
addiu t2, t2, 0x1 // Сдвиг записи +1
addiu v0, v0, -0x01 // Общий счётчик -1
bne v1, zero, readTextToBuffer // Проверяем частный счётчик != 0
sh v0, -0x0e(t1) // Сохраняем общий счётчик
li a0, 0
sb a0, -0x0c(t2) //На всякий случай сохраняем 00-терминатор
addu s3, s3, s2 // получаем адрес количества спрайтов из таблицы
addiu s3, -0x1 // index -1
lbu a1, 0x0(s3) // Читаем количество в a1
nop
move t5, a1 // Храним количество блоков для спрайта
form_char_data_in_scratch:
jal make_char_line_in_scratch //Вызываем процедуру формирования строки
move a0, s2 //Передаём в неё длину строки в символах (a0) и в спрайтах (a1)
// (формируем спрайт размером до 60x12)
rect_cmd_init:
lui s3, 0x1f80
ori s3, 0x03d0 // s3 = 1f8003d0 - адрес rect в scratchpad
lui s1, 0x8008 // Загружаем 80080000
addiu s5, s1, -0x4930 // s5 = 7b6d0 (временный DMA)
lui s0, 0xff
ori s0, s0, 0xffff // s0 = 00ffffff
lui s7, 0x8000 // s7 = 80000000
//Старый неактуальный код из далёкого атлусовского прошлого
// Инициализация координат XY
//lw v0, 0xb0(gp) // Какой-то множитель ширины символа. В нашем случае не нужен!
//lhu v1, 0x4(s4) // Старый счётчик символов сейчас считает спрайты
// addiu v0, v0, 0x6 // 0x06 * 6px между буквами!
// mult v1, v0 // v1 * v0 = смещение X * номер символа
// addiu t3, sp, 0x10 // t3 = sp + 10
// sh s8, 0xa(s3) // экранный Y установлен на этапе формироания rect
lui t2, 0xff00 // t2 = ff000000
move t4, s4 // t4 - указатель на print params ОСНОВНОЙ
move t1, s4 // t1 - print params для смещения страниц
rect_set_X:
// lhu t5, 0x20(sp) // Загружаем X из стека
// mflo t6 // Результат умножения
// addu v0, t5, t6 // v0 = X + смещение
sh t6, 0x8(s3) // Сохраняем X координату в текущий rect
sll v0, s2, 1
addu v0, s2 // Умножаем количество обработанных символов на 6
sll v0, 1
addu t6, v0 // Сдвигаем X (прочитаем со следующим блоком символов)
rect_set_width:
sh v0, 0x10(s3) //И, не отходя от кассы, сохраняем в rect эту ширину
PageLoop:
// Создание цепочки копирования спрайта
lw v0, -0x4930(s1) // v0 = *адрес свободной цепочки
nop
and a0, v0, t2 // a0 = v0 & ff00..
and v0, v0, s0 // v0 & 00FFFFFF
or a1, v0, s7 // a1 = v0 | s7 (80000000)
lw v0, 0x4(s5) // Счетчик команд
lw v1, 0x0(a1) // Новый адрес свободной цепочки
addiu v0, v0, -0x1 // Уменьшаем счетчик
and v1, v1, s0 // v1 & 00FFFFFF
or a0, a0, v1 // a0 & v1
sw v0, 0x4(s5) // Сохраняем счетчик DMA
sw a0, -0x4930(s1) // Сохраняем новую свободную цепочку
rect_copy_scratch_to_ram:
lw t8, 0x0(s3) // Количество команд DMA
lw t7, 0x4(s3) // Команда копирования спрайта
sw t8, 0x0(a1)
sw t7, 0x4(a1)
lw a3, 0x8(s3) // Координаты экрана XY
lw t7, 0xc(s3) // CLUT и координаты текстуры
sw a3, 0x8(a1)
sw t7, 0xc(a1)
lw t8, 0x10(s3) // Размер спрайта после копирования
nop
sw t8, 0x10(a1) // Сохраняем последнюю команду
rect_scratch_connect:
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(t4) // Счетчик символов
nop
bne v0, zero, cpu2vram_cmd_loop // Если счетчик символов 0, переходим
clear s8 // Сбрасываем счётчик команд спрайтов
sw a1, 0x28(t1) // Устанавливаем первую цепочку символов в print_params
sw a3, 0xc(t4) // Сохраняем экранные координаты в print params
cpu2vram_cmd_loop:
// Цикл команд cpu_to_vram
lw v0, -0x4930(s1) // Следующая свободная цепочка
nop
and a0, v0, t2 // a0 = v0 & FF000000
and v0, v0, s0 // v0 & 00FFFFFF
or a3, v0, s7 // a3 = следующая цепочка & 80...
move a2, a3 // a2 = a3 (следующая цепочка)
lw v0, 0x4(s5) // Счетчик команд
lw v1, 0x0(a3) // Новый адрес свободной цепочки
addiu v0, v0, -0x1 // Уменьшаем счетчик
and v1, v1, s0 // v1 & 00FFFFFF
or a0, a0, v1 // a0 & v1
sw v0, 0x4(s5) // Сохраняем счетчик DMA
sw a0, -0x4930(s1) // Сохраняем новую свободную цепочку
//Тут "оптимизировали" копирование в short, и сделали своё копирование со смещением спрайтов
lui a1, 0x1f80
ori a1, a1, 0x348 // 1f800348 = Scratch команда cpu2vram
lw t8, 0x0(a1)
lw t7, 0x4(a1)
sw t8, 0x0(a2)
sw t7, 0x4(a2)
lw t8, 0x8(a1) //Сохраняем базу команды cpu2vram
lw t7, 0xc(a1)
sw t8, 0x8(a2)
sw t7, 0xc(a2)
sll v1, s8, 1 //Текущий индекс блока * 2
addiu v0, v1, 0x130 //складываем со 0x130 (начало блока спрайта в VRAM)
sh v0, 0x8(a2) //Обновляем VU X прямо в RAM
copy_char_data_start:
lui t3, 0x1f80
ori t3, t3, 0x1c0 // Начало данных спрайта в scratch
addiu a2, 0x10 //Адрес для записи данных после заголовка команды
clear v0 //Основной счётчик строк (0-11)
sll v1, t5, 2 //v1 = количество байт в одной строке (блоки * 4) (инкремент)
sll a1, s8, 2 //Вычисляем смещение начала чтения
addu a1, t3 //a1 = начинаем с него
copy_char_data_loop:
lw t7, 0x0(a1) //Грузим данные
addu a1, v1 //Смещаем адрес чтения
sw t7, 0x0(a2) //Сохраняем данные
addiu a2, 0x04
addiu v0, 0x01
bne v0, 0x0c, copy_char_data_loop
nop
bne s8, zero, cpu2vram_dma_link // Если это первая команда (последняя выполняемая, то добавляем flushcache)
nop
set_flush_cache_cmd:
li t8, 0x10
sb t8, -0x3d(a2) //Обновляем длину команды до 0x10
lui t8, 0x0100
sw t8, 0x0(a2) //Устанавливаем команду flush cache в конце команды
cpu2vram_dma_link:
// Связывание 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) // Последняя цепочка символов
//Конец цикла команд cpu_to_vram
addiu s8, 0x1
bne s8, t5, cpu2vram_cmd_loop
nop
addiu t1, t1, 0x4 // Сдвигаем параметры для следующей страницы
addiu v0, t4, 0x8 // Сдвигаем первый параметр цепочки для страницы
sltu v0, t1, v0 // Проверяем прохождение первой страницы
bne v0, zero, PageLoop // Если не прошли, продолжаем цикл страниц
nop
chunk_making_end:
// Увеличиваем счетчик символов + проверка
lhu v0, 0x4(s4) // Текущее количество спрайтов
lui t3, MyAddr
addiu v0, v0, 0x1 // Увеличиваем на 1
lhu v1, -0x0e(t3) // Количество оставшихся символов
sh v0, 0x4(s4) // Сохраняем счетчик спрайтов в print_params
bne v1, zero, TextGroupReadLoop
// Если обработаны все буквы и созданы все спрайты, то выходим
nop
TextEnd:
clear s2
lui s3, 0x8008
addiu s5, s3, -0x4930 // s5 = 7b6d0
lui s1, 0xff
ori s1, s1, 0xffff // s1 = 00ffffff
move s0, s4 // 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, -0x4930(s3) // Следующая свободная цепочка
lw a3, 0xa4(gp) // Некоторые параметры (почти DMA)
and v1, v1, s1 // v1 & 00FFFFFF
or v1, v1, v0 // v1 | v0 = 80.....
sw v1, 0x30(s0) // Сохраняем последний свободный адрес в параметрах DMA
lw v0, -0x4930(s3) // Следующая свободная цепочка
lw v1, 0x0(v1) // Создаем еще одну цепочку
and v0, v0, a0 // v0 & ff000000
and v1, v1, s1 // v1 & 00FFFFFF
lw a0, 0x4(s5) // Счетчик DMA
or v0, v0, v1 // v0 | v1
sw v0, -0x4930(s3) // Новый адрес свободной цепочки
addiu a0, a0, -0x1 // Уменьшаем счетчик DMA
sw a0, 0x4(s5) // Сохраняем счетчик 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, s4 // Возвращаем основные параметры DMA
// Восстанавливаем регистры из стека
lw ra, 0x4c(sp)
lw s8, 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 // Восстанавливаем стек
.ascii "This game was officially cracked by SERGEY SHEMET 2021-2025. WHAT ARE YOU DOING HERE, BOY?"
.byte 0x00
.byte 0x00
// Включаем дополнительные файлы
.include "IS_charload_grouped.asm"
.include "charCalcs.asm"
.close
.include "txtpatches.asm" // misc text patches
// compile with ./armips -sym SLPS_021.00.map IS_main_grouped.asm

BIN
SLPS_021.00 Normal file

Binary file not shown.

75
SLPS_021.00.map Normal file
View File

@@ -0,0 +1,75 @@
00000000 0
00008009 myaddr
80019300 printbigdmatext
8001A070 initcopycharchain
8001A08F makecharpixels
8001A20C makeshadowsmallchar
8001A284 generatesmallchar
8001B0C8 storecolor
800542CC setdrawtpage
8008F624 next2bytes
8008F650 savelengthandexit
8008F66C ismystring
8008F67C nextmybyte
8008F73C nextmybyte2
8008F760 secondstrisjap
8008F774 next2bytes2
8008F7A0 savelengthandexit2
80090000 externalprint
80090024 myprintlineroutine
800900E4 cputovram_scratchpad_template
80090114 _1bppto4bpp_table_template
80090164 rect_scratchpad_template
800901A8 make_sprite_size_table
800901D0 misc_init
800901D4 textgroupreadloop
800901F8 readtexttobuffer
8009023C form_char_data_in_scratch
80090244 rect_cmd_init
8009026C rect_set_x
80090280 rect_set_width
80090284 pageloop
800902B4 rect_copy_scratch_to_ram
800902E0 rect_scratch_connect
80090334 cpu2vram_cmd_loop
8009039C copy_char_data_start
800903B8 copy_char_data_loop
800903E0 set_flush_cache_cmd
800903F0 cpu2vram_dma_link
8009044C chunk_making_end
80090468 textend
80090484 pagetloop
80090518 .asc:005A
80090572 .byt:0001
80090573 .byt:0001
80090574 make_char_line_in_scratch
80090590 char_data_clear
800905A0 char_data_loop
800905CC chars_font_loop
800905F4 char_lines_loop
80090604 its_not_empty
80090694 not_last
800906A0 divideby4
800906A0 zero_jump
800906B0 spacejump
800906CC sprite_end
800906E4 make_shadow
80090708 shadow_row_loop
8009070C shadow_sprites_loop
8009071C shadow_pixel_loop
80090750 no_s
8009077C notshadow
80090790 returncharsinstring
800907AC ismy1bytestring
800907C8 notand1
800907D8 getnewchar
800907DC startreading
800907F8 calcnextxcustom
80090820 japoldtext
80090828 ihavestringlength
80090840 retuncharstocity
8009085C ismy1bytecity
80090870 retuncharstocitydiv2
8009088C ismy1bytecitydiv2
800908A8 notand1_2


BIN
SLPS_021.00_1.1 Normal file

Binary file not shown.

BIN
SLPS_021.00_old Normal file

Binary file not shown.

BIN
SLPS_028.25 Normal file

Binary file not shown.

BIN
SLPS_028.26 Normal file

Binary file not shown.

64
SLPS_028.26.map Normal file
View File

@@ -0,0 +1,64 @@
00000000 0
00008009 myaddr
80019000 originalkanjiprint
80019D70 initcopycharchain
80019F0C makeshadowsmallchar
8001ADC8 storecolor
800522F0 setdrawtpage
80090000 externalprint
80090024 myprintlineroutine
80090074 initdma
80090074 update_free_dma
800900A0 preparedmachain
800900C8 prepareattrs
800900EC init_cputovram_vars_int_scratch
8009012C coords_size_cputovram_scr
800901E4 init_rect_cmd_in_scr
80090204 positionprocessing
8009020C addoffsetx
80090210 calculatexoffset
80090228 ycoordinateprocessing
80090230 addoffsety
80090234 calculateyoffset
8009025C loadcharacter
8009027C nextchar
80090280 isfirstchar
80090288 setup_x_coord_in_rect_scratch
80090298 some_printparams_save
800902A8 end_x_coord_rect
800902BC pageloop
800902BC update_free_dma2
800902EC copyrectcmd
80090318 print_params_and_chain_addr_set
80090368 notfirstchar
80090370 cputovram_cmd_from_scratch_copy
80090370 halfkanji_loop
80090370 update_free_dma3
800903C4 copyby2bytes
80090418 copy16bytes
80090444 last4bytescopy
80090458 link_char_dma_cmds
8009049C enabled_lower_kanji
800904DC disabled_lower_kanji
800904F0 spacecharjumphere
80090518 textend
80090534 pagetloop
80090594 returnfromfunction
800905C8 makecharpixelscustom
80090618 charloop
800906C8 charloaded
800906E4 notshadow
800906F4 returncharsinstring
80090710 ismy1bytestring
8009072C notand1
8009073C getnewchar
80090740 startreading
8009075C calcnextxcustom
80090784 japoldtext
8009078C ihavestringlength
800907A4 retuncharstocity
800907C0 ismy1bytecity
800907D4 retuncharstocitydiv2
800907F0 ismy1bytecitydiv2
8009080C notand1_2


BIN
armips.exe Normal file

Binary file not shown.

102
battle_patch.asm Normal file
View File

@@ -0,0 +1,102 @@
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
.psx
.open "0001_BATTLE_CODE.bin", 0x800AB000
.definelabel SimpleCopyString, 0x800ef150
.org 0x800f9e60
;BOSSNAME COPY
lhu r2,0x0(r5)
addiu r5,2
sh r2,0x0(r4)
andi r3,r2,0xFF
addiu r4,2
nextch:
lbu r2,0x0(r5)
nop
sb r2,0x0(r4)
addiu r4,1
addiu r5,1
addiu r3,-1
bne r3,zero,nextch
nop
jr ra
nop
;BATTLE CONTACT RUS SCRIPT BUILDING
CheckAndCopyRusInScript:
lhu r3,0x0(r5)
nop
srl r3,r3,0xD ;;;;Check 13th bit (1byte system !!!)
bne v1,zero,MyCopy
nop
j SimpleCopyString
nop
MyCopy:
lhu r3,0x0(r5)
nop
andi r3,r3,0xFF
addiu r3,2
nx:
lbu r2,0x0(r5)
nop
sb r2,0x0(r4)
addiu r4,1
addiu r3,-1
bne r3,zero,nx
addiu r5,1
;needToCheck And1 ;ODD_OR_EVEN???
andi r2,r4,0x1
beq r2,zero,notAnd1_3
nop
addiu r4,r4,0x1
notAnd1_3:
jr ra
move r2,r4 ;Duplicate for futher script
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ДИНАМИЧЕСКОЕ ОБРУБАНИЕ ТЕКСТА В БОЁВКЕ!
.org 0x800f9f20
lui r2,0x8011 ;;; LUI ---==== LOAD UPPER INTEGER
lbu r2,0x0bc8(r2)
nop
li r3,3
bne r2,r3,not3 ;if mode not 3 = limit 30!
li r3,0x30 ;ЭТА СРОКА ВЫПОЛНИТСЯ ПРИ ПЕРЕХОДЕ. Если перехода нет, то r3 перезаписывается. Итого экономим 32 байта на дублях команд
li r3,0x80 ;Эта строка выполнится только если в 80110bc8 будет 03 (режим общения)
not3:
lui r2,0x8009 ;загружаем адрес 80090000 в r2
sb r3,-0x0c(r2) ;Записываем новый лимит в 80090000 - 0c
j 0x80016e10 ;вылетаем в программу дальше по плану! (Хз что там за программа, но выполняется каждый цикл)
nop
;BOSSNAME COPYЧёт формат
.org 0x800ad4e8
;jal 0x80016024 - ORIGINAL CALL
;custom call
; jal 0x8008f600
;.org 0x800ad508
; jal 0x8008f700
;Battlecontact copy
.org 0x800f1f60
jal CheckAndCopyRusInScript
.org 0x800f20bc
jal CheckAndCopyRusInScript
.close

88
cd_extra_charload.asm Normal file
View File

@@ -0,0 +1,88 @@
; LOADING CHAR FROM CUSTOM FONT
makeCharPixelsCustom:
addiu sp,sp,-0x18
move a1,a0
lui a0,0x1f80
ori a0,a0,0x358
sw ra,0x10(sp)
li a2,1
lbu t2,0xa8(gp) ;a8(gp) -- color
move t0,r4
lui v1,0x801f ; ;load font addr to r3 (801ef480)
ori v1,v1,0xaa00 ;
sll v0,a1,0x1 ; r2 = r5 << 1 (*2)
addu v0,v0,a1 ; r2 += r5 (it. *3)
sll v0,v0,0x2 ; r2 << 2 (*4) (r2 = r5 *12)
addu t1,v0,v1 ;t1 = char addr ; r9 = r2(offs) + r3 (start)
li r6,0x6 ; r6 = byteslength = 6
move v0,r6 ; r2 = r6 (counter)
beq v0,zero,charLoaded ; if counter=0 then branch
addiu r6,r6,-0x1 ; dec r6
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 += r6 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 (r6)
addiu a2,a2,-0x1 ; r6 -= 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, 0xa9(gp) ; a9(gp) -- shadow
li v0, 0x1
bne v1, v0, NotShadow ;Shadow character check
nop
lui a0,0x1f80
jal MakeShadowSmallChar ;Make shadow in Scratch DMA
ori a0,a0,0x358
NotShadow:
lw ra,0x10(sp) ;Restore stack and exit
nop
jr ra
addiu sp, sp, 0x18

620
cd_extra_main.asm Normal file
View File

@@ -0,0 +1,620 @@
////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Persona 2 Eternal Punishment CD Extra (PSX) JAP / Custom Characters/Data Patch
//
// Author: Sergey Shemet 17/09/2025
//
.psx
.definelabel SetDrawTPage, 0x800522F0
.definelabel storeColor, 0x8001ADC8
.definelabel initCopyCharChain, 0x80019D70
.definelabel MakeShadowSmallChar, 0x80019F0C // 0x800196BC -big char shadow???
.definelabel OriginalKanjiPrint, 0x80019000
.definelabel MyAddr, 0x8009
.open "SLPS_028.26", 0x8000F800
.org 0x80090000
ExternalPrint:
// Text routing test routine
move r3,s3
move s3,r4
lhu v0,0x0(s3) // Read half 2 bytes of text
move s3,r3
srl v1,v0,0xD // Check 13th bit (Russian text format 20XX cmd)
bne v1,zero,MyPrintLineRoutine
clear v1
j OriginalKanjiPrint // Если не включен 13 бит, то это обычный японский текст. Вызов обычной подпрограммы вывода.
nop
MyPrintLineRoutine:
addiu sp, sp, -0x50 // Выделение места в стеке (80 bytes)
sw s6, 0x40(sp) // Сохранение s6
move s6, a0 // s6 = param_1 (указатель на текст)
sw s1, 0x2C(sp) // Сохранение s1
move s1, a1 // s1 = param_2 (X координата)
sw s2, 0x30(sp) // Сохранение s2
move s2, a2 // s2 = param_3 (Y координата)
sw s3, 0x34(sp) // Сохранение s3
//v1/r3 - MyChars charcount
andi v0, 0xff
addiu s6, 0x2 //Moving text read pointer +2bytes
lui s3, MyAddr
sh v0, -0x10(s3) //store half bytecounter @ 8008fff0
sh v0, -0x0E(s3) //store half bytecounter @ 8008fff2
//////////////////////////////////////
// Инициализация адресов scratch и масок
lui s3, 0x1F80 // Базовый адрес GPU
ori s3, s3, 0x03D0 // Адрес для команд отрисовки
lui t0, 0xFF // Маска для DMA операций
ori t0, t0, 0xFFFF
sw s0, 0x28(sp) // Сохранение s0
andi s0, a3, 0xFF // s0 = param_4 (цвет/атрибуты)
move a0, s0 // a0 = цвет текста
// Блок инициализации DMA
InitDMA:
update_free_dma:
lui a3, 0x8008 // Базовый адрес для текстового DMA
lui a2, 0xFF00 // Маска для адресной части
addiu t1, a3, -0x6C20 // TextDMANexChainAddr
lw v1, -0x6C20(a3) // Загрузка текущего DMA адреса
lbu a1, 0x60(sp) // Загрузка цвета из стека
lui v0, 0x8000 // Флаг для адресации
// Сохранение всех регистров
sw ra, 0x4C(sp) // Сохранение return address
sw s8, 0x48(sp) // Сохранение s8
sw s7, 0x44(sp) // Сохранение s7
sw s5, 0x3C(sp) // Сохранение s5
sw s4, 0x38(sp) // Сохранение s4
// Подготовка DMA цепочки
PrepareDMAChain:
and a2, v1, a2 // Извлечение первого байта
and v1, v1, t0 // Отсекаем первый байт у адреса
or s4, v1, v0 // Совмещаем 80...... и 00ADDR = новый DMA адрес
lw v0, 0x4(t1) // TextDMACounter
lw v1, 0x0(s4) // Разыменовывание указателя на текущий адрес = след адрес
addiu v0, v0, -1 // Декремент счетчика
and v1, v1, t0 // Очистка адресной части
or a2, a2, v1 // Объединение исходного первого байта (FF) с новым адресом
sw v0, 0x4(t1) // Сохранение счетчика
// Подготовка атрибутов строки
PrepareAttrs:
andi a1, a1, 0xFF // Маскирование цвета
jal storeColor // Установка цвета и тени
sw a2, -0x6C20(a3) // Сохранение нового свободного DMA адреса
move a0, s4 // a0 = DMA адрес
// Подготовка координат
sll a1, s1, 0x10 // Подготовка X координаты
sra a1, a1, 0x10
sll a2, s2, 0x10 // Подготовка Y координаты
sra a2, a2, 0x10
jal initCopyCharChain // Инициализация строки
move a3, s0 // a3 = а-три-буты
init_cputovram_vars_int_scratch:
lui a3, 0x1F80
ori a3, a3, 0x0348 // Адрес паттернов в scratchpad
//lui a2, 0x1F80
//ori a2, a2, 0x038C // Disable second kanji half command
li v0, 0x02 // Ширина в px в 16битном режиме (Original 3px (12 in 4bit), my - 2px)
sh v0, 0x1C(sp)
li v0, 0x0C // Высота полукандзи. (Original 6px, my - 12px)
li a1, 0x0D // 0D - оригинальная длина команды CPUtoVRAM (Scratch) в words
lui a0, 0xA000 // A0000000 - CPUtoVRAM command
sh v0, 0x1E(sp) // sp+1c = 000C0002
li a1, 0x10 //INSERT // Переписываем длину команды (т.к. формируем символ в пределах одной команды)
sb a1, 0x3(a3) // Установка длины 0x10 элемента цепочки CPUtoVRAM (Scratch)
sw a0, 0x4(a3) // Установка команды A0000000 CPUtoVRAM (Scratch)
lhu t0, 0x9C(gp) // Загрузка vram X из глобальных настроек
lhu v0, 0x9E(gp) // Загрузка vram Y из глобальных настроек
lui v1, 0x0100 // GPU flushcache command (0100 0000)
lui at, 0x1F80
sw v1, 0x0388(at) // Save flushcache (конец первой команды)(not 37c!)
// lower half params set
// sb a1, 0x3(a2) // Отключаем данные нижней половины
// sw a0, 0x4(a2) //
// Настройка координат для каждой половины символа.
coords_size_cputovram_scr:
lh a1, 0x9C(gp) // Загрузка X
move s8, s2 // Сохранение Y позиции
// lui at, 0x1F80
// sw v1, 0x03C0(at) // Save flushcache (second command (Disabled))
sh t0, 0x18(sp) // Сохранение XY в стек как полуслова (CONCAT)
sh v0, 0x1A(sp)
lw a0, 0x18(sp) //Загружаем XY-word из стека для CPUtoVRAM
//Абсолютно неоптимальная хрень - можно было сразу вытащить word из 0x9C(gp),
// либо просто задать a0 = 3001F001,
// так как адрес всегда один и тот же. Скорее всего, он менялся при разработке и дебаге игры
// sh v0, 0x1A(sp) //Отключаем вычисление и сохранение VRAM-Y нижнего полусимвола.
lw v1, 0x18(sp)
lw v0, 0x1C(sp) //Грузим размер символа (16-бит) из стека
move t0, a1 // t0 будет X - пригодится ниже, в расчётах
sw a0, 0x8(a3) //сохраняем 3001F001 to 00350 (uv-коодинаты в команду cputovram - 130x1f0)
// sw v0, 0xc(a2) //disable lower
sw v0, 0xC(a3) // set 02000c00 to 00354 (sprite pixel size)
// sw v1, 0x8(a2)
lui v0,0x8001 //load 80010000 to r2
//4bit pattern in scratch
lui t8, 0x1f80
ori t8, t8, 0x2e0
addiu t7, v0, 0x3e8
lwl t5, 0x3(t7)
lwr t5, 0x0(t7)
lwl t6, 0x7(t7)
lwr t6, 0x4(t7)
swl t5, 0x3(t8)
swr t5, 0x0(t8)
swl t6, 0x7(t8)
swr t6, 0x4(t8)
lwl t5, 0xb(t7)
lwr t5, 0x8(t7)
lwl t6, 0xf(t7)
lwr t6, 0xc(t7)
swl t5, 0xb(t8)
swr t5, 0x8(t8)
swl t6, 0xf(t8)
swr t6, 0xc(t8)
lwl t5, 0x13(t7)
lwr t5, 0x10(t7)
lwl t6, 0x17(t7)
lwr t6, 0x14(t7)
swl t5, 0x13(t8)
swr t5, 0x10(t8)
swl t6, 0x17(t8)
swr t6, 0x14(t8)
lwl t5, 0x1b(t7)
lwr t5, 0x18(t7)
lwl t6, 0x1f(t7)
lwr t6, 0x1c(t7)
swl t5, 0x1b(t8)
swr t5, 0x18(t8)
swl t6, 0x1f(t8)
swr t6, 0x1c(t8)
// Copy Sprite DMA Command Forming
init_rect_cmd_in_scr:
li v0,0x4 // Длина команды RectTexBlend (04000000)
sb v0,0x3(s3) // сохраняем в scratch
li v0,0x64 // Команда RectTexBlend (64)
sb v0,0x7(s3) // Сохранение команды RectTexBlend (64)
li v0,0x80 // 80 - стандартная яркость спрайта
sb v0,0x4(s3) // R
sb v0,0x5(s3) // G
sb v0,0x6(s3) // B = Сохранение 80 80 80 + 64 (3d4,5,6,7)
//
// Здесь запаковка ИСХОДНЫХ координат спрайта в VRAM.
//Но они никогда не меняются. Наверное, можно оптимизировать и записывать f0c0
PositionProcessing:
bgez a1, CalculateXOffset // Проверка знака X координаты
sh s1, 0x20(sp) // Сохранение X позиции
AddOffsetX:
addiu t0, a1, 0x3F // Смещение, если меньше ноля
CalculateXOffset:
sra v0, t0, 0x6
sll v0, v0, 0x6 // округляем X
subu v0, a1, v0
lh v1, 0x9E(gp) // Загрузка Y параметра
sll v0, v0, 0x2 // Умножение X на 4
sb v0, 0xC(s3) // Сохранение X в команду Reсt
// Обработка Y координаты
YCoordinateProcessing:
bgez v1, CalculateYOffset // Проверка знака Y координаты
move v0, v1
AddOffsetY:
addiu v0, v1, 0xFF // Добавление смещения если отрицательно
CalculateYOffset:
sra v0, v0, 0x8 // Округление координаты Y
sll v0, v0, 0x8
subu v0, v1, v0
sb v0, 0xD(s3) // Сохранение Y текстуры в команду Reсt
// всю эту часть кода можно смело заменять записью 7DF3F0C0 в адрес 0xC(s3)
// она рассчитана на динамический расчёт координат UV и CLUT, но они у нас статические
lhu v1, 0xA4(gp) // Загружаем из глобальных настроек координаты CLUT текста в VRAM (ВСЕГДА 7FD3 - 304 x 511)
li v0, 0x8
sh v0, 0x10(s3) // Сохраняем ширину спрайта в пикселях
li v0, 0xc
sh v0, 0x12(s3) // Сохраняем высоту спрайта в пикселях (0xC = 12)
sh v1, 0xe(s3) // Сохраняем clut в команду rect
// Основной цикл чтения символов из памяти
LoadCharacter:
lbu a0, 0x0(s6) // Загрузка символа из текста (Читаем byte вместо half) - текст хранится побайтово
nop
//Неактуальный код проверки терминатора иероглифов
//sltiu v0, a0, 0x1000 // Проверка на конец текста
//beq v0, zero, FinishDrawing // Если символ > 0x1000 (команда) - завершаем
addiu s6, s6, 0x1 // Переход к следующему символу (в оригинале было смещение на 2 байта)
// Подготовка к отрисовке символа
lui s1, 0x8008
addiu s5, s1, -0x6C20 // TextDMANexChainAddr
lui s0, 0xFF
ori s0, s0, 0xFFFF
lui s7, 0x8000
// Цикл отрисовки символа
NextChar:
addiu r4, r4, -0x20 // Смещаем код символа для правильного рассчёта в шрифте
//Тут нужна проверка на пробел
isFirstChar:
jal makeCharPixelsCustom // Создание символа в scratchpad кастомной процедурой
clear s2 // Сброс счетчика
// Настройка X для символа
Setup_X_coord_in_rect_scratch:
lw v0, 0xAC(gp) // Первая координата текста
lhu v1, 0x4(s4) // Счётчик отрисованных символов в строке (print_params+4)
addiu v0, v0, 0x6 // Добавление смещения к первой координате
mult v1, v0 // Умножаем...
some_printparams_save:
lui t2, 0xFF00 // Маска для адреса
move t4, s4 // Копирование адреса print_params
addiu t3, sp, 0x10 // Сохраняем адрес стек+0x10
move t1, s4 // t1 - основной регистр print_params, который смещается для разных страниц
end_x_coord_rect:
sh s8, 0xA(s3) // Сохранение Y позиции в команду Rect (3dc)
lhu t5, 0x20(sp) // Загрузка X позиции из стека
mflo t6 // Результат умножения в t6
addu v0, t5, t6 // Вычисление финальной позиции (X + смещение)
sh v0, 0x8(s3) // Сохранение X позиции в команду Rect (3d8)
PageLoop:
update_free_dma2:
// получаем свободный адрес для цепочки в текущей странице
lw v0, -0x6C20(s1) // Текущий свободный DMA адрес
nop
and a0, v0, t2 // В a0 оставляем первый байт с помощью маски & FF000000 (должно получиться 80000000)
and v0, v0, s0 // В v0 срезаем первый байт с помощью маски & 00FFFFFF
or a1, v0, s7 // в a1 cовмещаем адрес, приводим к виду (80XXXXXX) - получаем конечный адрес для записи команды rect
lw v0, 0x4(s5) // DMA счетчик оставшихся свободных цепочек
lw v1, 0x0(a1) // Разыменовываем адрес следующей свободной цепочки (v1 = *a1)
addiu v0, v0, -1 // Декремент счетчика
and v1, v1, s0 // Очистка адресной части следующей свободной цепочки
or a0, a0, v1 // Совмещаем адрес с FF......
sw v0, 0x4(s5) // Сохранение счетчика
sw a0, -0x6C20(s1) // Сохранение нового адреса
// Копирование данных команды rect в RAM из scratch
CopyRectCmd:
lw t7, 0x0(s3) // Загрузка данных команды rect из scratch
lw t8, 0x4(s3)
lw t5, 0x8(s3)
lw t6, 0xC(s3)
sw t7, 0x0(a1) // Сохранение данных команды rect в RAM
sw t8, 0x4(a1)
sw t5, 0x8(a1)
sw t6, 0xC(a1)
lw t7, 0x10(s3)
nop // ждём команду, чтобы значение загрузилось в регистр (особенность MIPS)
sw t7, 0x10(a1) // докидываем данные
// Линкуем предыдущую команду страницы и текущую ()
previous_last_cmd_link_with_current:
lw v1, 0x18(t1) // Загрузка указателя хранения последней команды в странице print_params+0x18
lw v0, 0x0(a1) // Загружаем текущую длину (0004), которая перезаписала адрес в цепочке DMA, когда копировали из sсratch
lw v1, 0x0(v1) // Разыменование указателя (v1 = *v1), читаем количество команд последней команды (обычно XXFFFFFF)
and v0, v0, t2 // Чистим количество команд (& ff)
and v1, v1, s0 // Очистка адресной части из параметров строки print_params
or v0, v0, v1 // Объединение (делаем cmdCount + ffffff from next_cmd) - очистка/экранирование?
sw v0, 0x0(a1) // Сохранение адреса следующей команды в команде rect (04ffffff)
lw a0, 0x18(t1) // Снова грузим указатель на маску print_params+0x18 (00fffff)
nop // ПРОПУСК!
lw v0, 0x0(a0) // Разыменование указателя (v0 = *a0)
and v1, a1, s0 // Отрезаем первый байт у адреса цепочки команды rect (сначала это маска 00ФФФФФФ)
and v0, v0, t2 // &ff000000 (c маской)
or v0, v0, v1 // Объединение (берём у маски кол-во команд, и след адрес)
sw v0, 0x0(a0) // Сохраняем след адрес вместо маски (00freeChain)
sw a1, 0x18(t1) // Сохраняем адрес след свободной цепочки в print_params (t1+18)
// То, что было маской - стало ссылкой на след команду цепочки в этой странице
// Проверка на первый символ (нужна ли запись первой записи в print_params+0x28?)
lhu v0, 0x4(t4) // Проверка - есть ли хоть один сформированный символ
nop
bne v0, zero, NotFirstChar // Если не ноль, пропускаем
clear t0 // Очистка счетчика
sw a1, 0x28(t1) // Установка первичного адреса в print_params (+16 от ссылки на бывшую маску)
//ИТОГО -- PrintParams + 0x18 - указатель на последнюю команду на странице
// PrintParams + 0x28 - указатель на первую команду на странице
// Для второй страницы - смещаемся +0x04
NotFirstChar:
move a3, t0 // Обнуляем a3 - это смещение для копирования данных в полусимволе
move a2, t3 // загрузка адреса sp+10. В *a2 будет храниться сформированный адрес cputovram в ram
// Здесь был цикл на 2 полусимвола.
// Выдаются свободные адреса цепочек и формируется cputoVram1 и 2 (нам нужна одна команда вместо двух)
cputovram_cmd_from_scratch_copy:
update_free_dma3:
halfkanji_loop:
lui a1, 0x1F80
lw v0, -0x6C20(s1) // Берём адрес след свободной цепочки
ori a1, a1, 0x0348 // Берём адрес в scrathPad символа CPUtoVRAM
and v0, v0, s0 // отрезаем первый байт у свободной цепочки &00FFFFFF
or v0, v0, s7 // Прикручиваем адрес 80....... || nextChain
sw v0, 0x0(a2) // Сохранение след полного адреса в sp+0x10
lw v1, -0x6C20(s1) // Берём ЕЩЁ РАЗ адрес свободной цепочки, но уже в v1
lw v0, 0x0(v0) // Разыменование - v0 = *v0
lw a0, 0x4(s5) // Грузим счётчик
and v1, t2 // Отрезаем префикс у адреса свободной цепочки в v1 (0xFF - Мы грузили адрес свободной цепочки, чтобы взять префикс FF???)
and v0, s0 // чистим адрес от префикса (который и так 00, но неизвестно, что было в данных)(0x00FFFFFF)
or v1, v0 // в v1 - адрес NextFreeDMA cо старым префиксом
addiu a0, -0x01 // Декремент счётчика
sw v1, -0x6C20(s1) // Сохраняем NextFreeDMA
sw a0, 0x4(s5) // save counter
lw a0, 0x0(a2) // Грузим след свободный адрес из *sp+10
addu v1, a3, a1 // v1 = смещение полусимвола + начало первого символа в scratch (указание на начало данных полусимвола)
or v0, v1, a0 // v0 = Проверка на выравнивание адресов чтения и записи
andi v0, v0, 0x0003 // путём схлопывания их адресов через or и проверки первых 2 битов (то есть числа 3).
beqz v0, Copy16Bytes // Если биты пусты, значит оба адреса выровнены по 4 байта, можно копировать word целиком
addiu v0, v1, 0x40 // v0 = максимальный адрес копирования исходных данных символа в Scratch
// Копирование данных команды CPUtoVRAM символа из scratchpad в RAM
// Невыровненное копирование по 2 байта
CopyBy2Bytes:
lwl t7, 0x3(v1) // Загрузка полусловами по 2 байта
lwr t7, 0x0(v1)
lwl t8, 0x7(v1)
lwr t8, 0x4(v1)
lwl t5, 0xB(v1)
lwr t5, 0x8(v1)
lwl t6, 0xF(v1)
lwr t6, 0xC(v1)
swl t7, 0x3(a0) // Сохранение с выравниванием
swr t7, 0x0(a0)
swl t8, 0x7(a0)
swr t8, 0x4(a0)
swl t5, 0xB(a0)
swr t5, 0x8(a0)
swl t6, 0xF(a0)
swr t6, 0xC(a0)
addiu v1, 0x10 // Смещение адреса в scratch
bne v1, v0, CopyBy2Bytes // Проверяем на достижение целевого адреса
addiu a0, a0, 0x10 // Следующий целевой адрес
j last4BytesCopy
nop
// Быстрое выровненное копирование по 4 байта
Copy16Bytes:
lw t7, 0x0(v1) // Загрузка 32-битных слов
lw t8, 0x4(v1)
lw t5, 0x8(v1)
lw t6, 0xC(v1)
sw t7, 0x0(a0) // Сохранение
sw t8, 0x4(a0)
sw t5, 0x8(a0)
sw t6, 0xC(a0)
addiu v1, 0x10 // Смещение адреса в scratch
bne v1, v0, Copy16Bytes // Проверяем на достижение целевого адреса
addiu a0, a0, 0x10 // Следующий целевой адрес
// Завершение копирования
last4BytesCopy:
lwl t7, 0x3(v1) // Копирование остатка
lwr t7, 0x0(v1)
// lwl t8, 0x7(v1)
// lwr t8, 0x4(v1)
nop
swl t7, 0x3(a0)
swr t7, 0x0(a0)
// swl t8, 0x7(a0)
// swr t8, 0x4(a0)
// Здесь старый код цикла копирования второго полукандзи
// addiu a3, a3, 0x44 // Увеличение смещения
// addiu t0, t0, 0x1 // Инкремент счетчика полусимволов
// sltiu v0, t0, 0x2 // Если счётчик <2,
// bne v0, zero, halfkanji_loop// то считываем ещё раз,
// addiu a2, a2, 0x4 // увеличивая адрес хранения команды полусимвола (a2 = sp+14)
// Линковка DMA-команд
link_char_dma_cmds:
lw a0, 0x10(sp) // в a0 грузим адрес первого полусимвола (который хранился в *sp+10)
lw v1, 0x18(t1) // Получили адрес rect из print_params (вернее, видимо, адрес начала цепочки)
lw v0, 0x0(a0) // v0 = *a0 - длина команды cpoutovram (10/0d 000000) без следующего адреса
lw v1, 0x0(v1) // v1 = *v1 - разыменовали и получили длину команды rect (04ffffff) без следующего адреса
and v0, t2 // v0 & FF000000 - чистим длину команды
and v1, s0 // v1 & 00FFFFFF - отрезали маску у длины команды rect
or v0, v1 // || Совмещаем число количества команд cpoutovram и маску rect (0dffffff)
sw v0, 0x0(a0) // сохраняем длину команды cpoutovram с маской ffffff в цепочку
lw a0, 0x18(t1) // Опять грузим адрес rect из print_params
lw v1, 0x10(sp) // ОпятЬ! грузим адрес первого полусимвола
lw v0, 0x0(a0) // v0 = *a0, то есть грузим длину команды с маской (10ffffff) вместо адреса
and v1, s0 // &00ffffff у адреса первого полусимвола (режем префикс), оставляя адрес
and v0, t2 // в v0 - длина команды rect. Чистим (&ff000000)
or v0, v1 // СОЗДАЁТСЯ ЛИНК команды rect и след. адреса (04+nextCommandAddr)
sw v0, 0x0(a0) // сохраняем линк в цепочке (команда rect указывает на следующую команду)
// односимвольная система
j disabled_lower_kanji // перепрыгиваем линковку нижнего полусимвола
lw v0, 0x10(sp) // сразу грузим адрес цепочки cpoutovram1 для сохранения в print_params
enabled_lower_kanji:
// Второй полусимвол - код оставлен, чтобы понимать принцип линковки
// зачем-то сначала адрес следующей команды превращается в xxFFFFFF,
// скорее всего это маркер конца цепочки текста
lw a0, 0x14(sp) // в a0 грузим адрес второго полусимвола (который хранился в *sp+14)
lw v1, 0x10(sp) // грузим адрес первого полусимвола
lw v0, 0x0(a0) // v0 = *a0, грузим команду с маской (0d000000) вместо адреса
lw v1, 0x0(v1) // v1 = *v1, Разыменовываем адрес первого полусимвола (0dffffff)
and v0, t2 // в v0 - длина команды cpoutovram2 (&ff000000)
and v1, s0 // &00ffffff у адреса первого полусимвола (режем префикс)
or v0, v1 // получаем длину команды cpoutovram2 с &00ffffff (0dffffff)
sw v0, 0x0(a0) // сохраняем длину команды cpoutovram2 в цепочку
lw a0, 0x10(sp) // грузим адрес первого полусимвола
lw v1, 0x14(sp) // v1 - адрес второго полусимвола
lw v0, 0x0(a0) // v0 = *a0 Разыменовываем адрес первого полусимвола
and v1, s0 // &00ffffff у адреса второго полусимвола (режем префикс)
and v0, t2 // в v0 - длина команды cpoutovram1. чистим (&ff000000)
or v0, v1 // СОЗДАЁТСЯ ЛИНК команды cpoutovram1 и cpoutovram2 (0d+nextCommandAddr)
sw v0, 0x0(a0) // сохраняем линк в цепочке (команда cpoutovram1 указывает на следующую команду)
lw v0, 0x14(sp) // v0 - адрес второго полусимвола
disabled_lower_kanji:
addiu s2, 0x1 // Увеличение счетчика страниц
sw v0, 0x18(t1) // Обновление связи в print_params (она указывает на адрес последней команды символа в этой странице)
sltiu v0, s2, 0x2 // Проверка счётчика текущей страницы
bnez v0, PageLoop // Если < 2, то формируем символ ещё раз в новую страницу.
addiu t1, t1,0x4 // смещаем базовый адрес text_params для следующей страницы
// Обновление индекса и проверка конца чтения
SpaceCharJumpHere:
lhu v0, 0x4(s4) // Грузим счётчик символов в print_params
nop
addiu v0, v0, 0x1 // Инкремент счётчика
//Моя проверка переменных
lui t3, MyAddr
lhu v1, -0x10(t3) // грузим количество символов
lbu r4, 0x0(s6) // Читаем следующую букву
addiu s6, s6, 0x1 // Смещаем позицию чтения
sh v0, 0x4(s4) // Сохраняем счётчик сформированных символов в строке в print_params
bne v0, v1, NextChar // Сравниваем переменные - моё общее кол-во символов и счётчик символов из print_params. Завершаемся, если количество сошлось.
nop
//Старый код с иероглифами
// lhu a0, 0x0(s6) // Загрузка следующего символа
// nop
// sltiu v0, a0, 0x1000 // Проверка на конец текста
//addiu s6, s6, 0x2 // Старый код - следующий символ
// Закрытие отрисовки текста
TextEnd:
clear s2 // Очистка счётчика текстурных страниц s2
lui s3, 0x8008 // s3 = 80080000
addiu s5, s3, -0x6C20 // s5 = 800793e0 - nextFreeChain
lui s1, 0xFF
ori s1, s1, 0xFFFF // s1 = 00ffffff
move s0, s4 // s0 = print_params
clear a1 // Очистка a1
// Цикл установки текстурных страниц
PageTLoop:
li a2, 0x1 // Длина команды текстурных страниц. Читается в SetDrawTPage
addu s2, a2 // Обновление счетчика s += a2
lui v0, 0x8000 // Префикс адресации v0 = 80000000
lui a0, 0xFF00 // Маска адреса a0 = ff000000
//Расчищаем команду под установку текстурной страницы
lw v1, -0x6C20(s3) // v1 = nextFreeDma
lw a3, 0xA0(gp) // Загрузка a3 = 34 (текстурная страница). Читается в SetDrawTPage
and v1, s1 // Очистка префикса nextFreeDma
or v1, v0 // превращаем nextFreeDma в адрес (80000000 || nextFreeDma)
sw v1, 0x30(s0) // Сохранение адреса пустой команды для drawtpage в print_params
lw v0, -0x6C20(s3) // Ещё раз v0 = nextFreeDma
lw v1, 0x0(v1) // Разыменовывание v1 = *v1. Получаем содержимое адреса след. свободной цепочки.
and v0, a0 // оставляем префикс от nextFreeDma (99,999% это будет ff)
and v1, s1 // Чиcтка адреса в цепочке от префикса
lw a0, 0x4(s5) // Грузим DMA-счетчик
or v0, v0, v1 // Объединение префикса со след пустым адресом
sw v0, -0x6C20(s3) // Сохранение nextFreeDma
addiu a0, a0, -1 // Декремент счетчика
sw a0, 0x4(s5) // Сохранение счетчика свободных команд
lw a0, 0x30(s0) // Загрузка адреса пустой команды для drawtpage из print_params
jal SetDrawTPage // Установка DrawTPage (текстурной страницы)
addiu s0, s0, 0x4 // Смещение в print_params для следующей страницы
sltiu v0, s2, 0x2 // Проверка на завершение 2 страниц
bne v0, zero, PageTLoop // Если не закончили, продолжаем
clear a1 // Очистка a1
// Восстановление регистров и возврат
ReturnFromFunction:
move v0, s4 // Возвращаем DMA адрес
lw ra, 0x4C(sp) // Восстановление return address
lw s8, 0x48(sp) // Восстановление s8
lw s7, 0x44(sp) // Восстановление s7
lw s6, 0x40(sp) // Восстановление s6
lw s5, 0x3C(sp) // Восстановление s5
lw s4, 0x38(sp) // Восстановление s4
lw s3, 0x34(sp) // Восстановление s3
lw s2, 0x30(sp) // Восстановление s2
lw s1, 0x2C(sp) // Восстановление s1
lw s0, 0x28(sp) // Восстановление s0
jr ra // Возврат из функции
addiu sp, sp, 0x50 // Восстановление стека
.include "cd_extra_charload.asm"
.include "charCalcs.asm"
.close
.include "cd_extra_txtpatches.asm" //misc text patches
// COMPILE COMMAND: ./armips -sym cd_extra_main.map cd_extra_main.asm

View File

@@ -0,0 +1,408 @@
smallCharLine:
addiu sp, sp, -0x50
sw s7, 0x44(sp)
move s7, a0 ; s7 = text_ptr
sw s0, 0x28(sp)
move s0, a1 ; s0 = X
sw s2, 0x30(sp)
move s2, a2 ; s2 = Y
sw s8, 0x48(sp)
move s8, s0 ; s8 = X (copy)
lui t0, 0xFF
ori t0, t0, 0xFFFF
sw s1, 0x2C(sp)
andi s1, a3, 0xFF ; s1 = color
move a0, s1
sw s5, 0x3C(sp)
lui s5, 0x8008
lui a2, 0xFF00
lui v0, 0x8000
move t5, s5
lw v1, -0x6C20(s5) ; TextDMANexChainAddr
lw a3, 0x60(sp)
addiu t5, t5, -0x6C20
sw ra, 0x4C(sp)
sw s6, 0x40(sp)
sw s4, 0x38(sp)
sw s3, 0x34(sp)
; === DMA INITIALIZATION ===
and a2, v1, a2
andi a1, a3, 0xFF
and v1, v1, t0
or s4, v1, v0 ; s4 = DMA base
andi a3, a3, 0x10
sltu a3, zero, a3
lw v0, 0x4(t5) ; TextDMACounter
lw v1, 0x0(s4)
addiu v0, v0, -1
and v1, v1, t0
or a2, a2, v1
sw v0, 0x4(t5)
sw a2, -0x6C20(s5)
jal FUN_8001adc8
sw a3, 0x18(sp)
; === CHARACTER SETUP ===
move a0, s4
sll s0, s0, 0x10
sra a1, s0, 0x10
sll s2, s2, 0x10
sra s0, s2, 0x10
move a2, s0
jal FUN_80019d70
move a3, s1
; === GPU REGISTER SETUP ===
lui a1, 0x1F80
ori a1, a1, 0x0348
li v0, 0x2
li a3, 0xC
sh v0, 0x14(sp)
li v0, 0x10
sh a3, 0x16(sp)
sb v0, 0x3(a1)
lui v0, 0xA000
sw v0, 0x4(a1)
lhu v1, 0x9C(gp) ; DAT_80078f40
lhu a0, 0x9E(gp) ; DAT_80078f42
lui v0, 0x100
lui at, 0x1F80
sw v0, 0x388(at)
lw v0, 0x14(sp)
lui s3, 0x1F80
sh v1, 0x10(sp)
sh a0, 0x12(sp)
lw v1, 0x10(sp)
lh a0, 0x9C(gp)
ori s3, s3, 0x3D0
sw v0, 0xC(a1)
lui v0, 0x8001
move a2, a0
sw v1, 0x8(a1)
; === PATTERN SETUP ===
lui t5, 0x1F80
ori t5, t5, 0x2E0
addiu t8, v0, 0x3E8
lwl t6, 0x3(t8)
lwr t6, 0x0(t8)
lwl t7, 0x7(t8)
lwr t7, 0x4(t8)
swl t6, 0x3(t5)
swr t6, 0x0(t5)
swl t7, 0x7(t5)
swr t7, 0x4(t5)
lwl t6, 0xB(t8)
lwr t6, 0x8(t8)
lwl t7, 0xF(t8)
lwr t7, 0xC(t8)
swl t6, 0xB(t5)
swr t6, 0x8(t5)
swl t7, 0xF(t5)
swr t7, 0xC(t5)
lwl t6, 0x13(t8)
lwr t6, 0x10(t8)
lwl t7, 0x17(t8)
lwr t7, 0x14(t8)
swl t6, 0x13(t5)
swr t6, 0x10(t5)
swl t7, 0x17(t5)
swr t7, 0x14(t5)
lwl t6, 0x1B(t8)
lwr t6, 0x18(t8)
lwl t7, 0x1F(t8)
lwr t7, 0x1C(t8)
swl t6, 0x1B(t5)
swr t6, 0x18(t5)
swl t7, 0x1F(t5)
swr t7, 0x1C(t5)
; === SPRITE COMMAND SETUP ===
li v0, 0x4
sb v0, 0x3(s3)
li v0, 0x64
sb v0, 0x7(s3)
li v0, 0x80
sb v0, 0x4(s3)
sb v0, 0x5(s3)
bgez a0, calc_x_offset
sb v0, 0x6(s3)
addiu a2, a0, 0x3F
calc_x_offset:
sra v0, a2, 0x6
sll v0, v0, 0x6
subu v0, a0, v0
lh v1, 0x9E(gp)
sll v0, v0, 0x2
sb v0, 0xC(s3)
bgez v1, calc_y_offset
move v0, v1
addiu v0, v1, 0xFF
calc_y_offset:
sra v0, v0, 0x8
sll v0, v0, 0x8
subu v0, v1, v0
sb v0, 0xD(s3)
lhu v1, 0xA4(gp) ; DAT_80078f48
li v0, 0x8
sh v0, 0x10(s3)
sh a3, 0x12(s3)
sh v1, 0xE(s3)
; === MAIN TEXT LOOP ===
lbu a1, 0x0(s7)
beq a1, zero, finish
addiu s7, s7, 0x1
move s6, s5
lui s5, 0x8008
addiu s5, s5, -0x6C20
sw s0, 0x1C(sp)
lui s0, 0xFF
ori s0, s0, 0xFFFF
sw s2, 0x20(sp)
text_loop:
addiu v1, a1, -0x67
sltiu v0, v1, 0x13
beq v0, zero, switch_default
sll v0, v1, 0x2
lui t6, 0x8001
addiu t6, t6, 0x4A0
addu v0, v0, t6
lw v0, 0x0(v0)
jr v0
switch_cases:
lw t7, 0x1C(sp)
j after_switch
addiu s2, t7, 0x2
switch_default:
lw t8, 0x20(sp)
sra s2, t8, 0x10
after_switch:
lw t5, 0x18(sp)
beq t5, zero, normal_pos
addiu a1, a1, -0x20
lui v0, 0x8001
addiu v0, v0, 0x43C
addu v0, a1, v0
lui v1, 0x8001
lbu v0, 0x0(v0)
addiu v1, v1, 0x428
sll v0, v0, 0x1
addu v0, v0, v1
lbu v1, 0x0(v0)
lbu v0, 0x1(v0)
subu v1, s8, v1
sll a0, v1, 0x10
sra s1, a0, 0x10
j pos_calculated
addu s8, v0, v1
normal_pos:
sll v1, s8, 0x10
lhu v0, 0x4(s4)
sra v1, v1, 0x10
sll v0, v0, 0x3
addu s1, v1, v0
pos_calculated:
jal FUN_80019f84
move a0, a1
lui t4, 0x8000
lui t2, 0xFF00
move t1, s4
lui t3, 0x1F80
ori t3, t3, 0x388
move t0, s4
sh s1, 0x8(s3)
sh s2, 0xA(s3)
; === DMA CHAIN PROCESSING ===
dma_loop:
lw v0, -0x6C20(s6)
and a0, v0, t2
and v0, v0, s0
or a1, v0, t4
lw v0, 0x4(s5)
lw v1, 0x0(a1)
addiu v0, v0, -1
and v1, v1, s0
or a0, a0, v1
sw v0, 0x4(s5)
sw a0, -0x6C20(s6)
lw t6, 0x0(s3)
lw t7, 0x4(s3)
lw t8, 0x8(s3)
lw t5, 0xC(s3)
sw t6, 0x0(a1)
sw t7, 0x4(a1)
sw t8, 0x8(a1)
sw t5, 0xC(a1)
lw t6, 0x10(s3)
sw t6, 0x10(a1)
lw v1, 0x18(t0)
lw v0, 0x0(a1)
lw v1, 0x0(v1)
and v0, v0, t2
and v1, v1, s0
or v0, v0, v1
sw v0, 0x0(a1)
lw a0, 0x18(t0)
lw v0, 0x0(a0)
and v1, a1, s0
and v0, v0, t2
or v0, v0, v1
sw v0, 0x0(a0)
sw a1, 0x18(t0)
lhu v0, 0x4(t1)
beq v0, zero, is_first
nop
j not_first
nop
is_first:
sw a1, 0x28(t0)
sh s1, 0xC(t1)
sh s2, 0xE(t1)
not_first:
lui a1, 0x1F80
ori a1, a1, 0x348
lw v0, -0x6C20(s6)
and a0, v0, t2
and v0, v0, s0
or a3, v0, t4
move a2, a3
lw v0, 0x4(s5)
lw v1, 0x0(a3)
addiu v0, v0, -1
and v1, v1, s0
or a0, a0, v1
sw v0, 0x4(s5)
andi v0, a3, 0x3
beq v0, zero, aligned_copy
sw a0, -0x6C20(s6)
unaligned_copy:
lwl t6, 0x3(a1)
lwr t6, 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 t6, 0x3(a2)
swr t6, 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, t3, unaligned_copy
addiu a2, a2, 0x10
j copy_done
nop
aligned_copy:
lw t6, 0x0(a1)
lw t7, 0x4(a1)
lw t8, 0x8(a1)
lw t5, 0xC(a1)
sw t6, 0x0(a2)
sw t7, 0x4(a2)
sw t8, 0x8(a2)
sw t5, 0xC(a2)
addiu a1, a1, 0x10
bne a1, t3, aligned_copy
addiu a2, a2, 0x10
copy_done:
lwl t6, 0x3(a1)
lwr t6, 0x0(a1)
swl t6, 0x3(a2)
swr t6, 0x0(a2)
lw v1, 0x18(t0)
lw v0, 0x0(a3)
lw v1, 0x0(v1)
and v0, v0, t2
and v1, v1, s0
or v0, v0, v1
sw v0, 0x0(a3)
lw a0, 0x18(t0)
lw v0, 0x0(a0)
and v1, a3, s0
and v0, v0, t2
or v0, v0, v1
sw v0, 0x0(a0)
sw a3, 0x18(t0)
addiu t0, t0, 0x4
addiu v0, t1, 0x8
sltu v0, t0, v0
bne v0, zero, dma_loop
nop
lhu v0, 0x4(s4)
addiu v0, v0, 0x1
sh v0, 0x4(s4)
lbu a1, 0x0(s7)
bne a1, zero, text_loop
addiu s7, s7, 0x1
; === CLEANUP ===
finish:
clear s2
lui s3, 0x8008
addiu s5, s3, -0x6C20
lui s1, 0xFF
ori s1, s1, 0xFFFF
move s0, s4
clear a1
cleanup_loop:
li a2, 0x1
addu s2, s2, a2
lui v0, 0x8000
lui a0, 0xFF00
lw v1, -0x6C20(s3)
lw a3, 0xA0(gp)
and v1, v1, s1
or v1, v1, v0
sw v1, 0x30(s0)
lw v0, -0x6C20(s3)
lw v1, 0x0(v1)
and v0, v0, a0
and v1, v1, s1
lw a0, 0x4(s5)
or v0, v0, v1
sw v0, -0x6C20(s3)
addiu a0, a0, -1
sw a0, 0x4(s5)
lw a0, 0x30(s0)
jal SetDrawTPage
addiu s0, s0, 0x4
sltiu v0, s2, 0x2
bne v0, zero, cleanup_loop
clear a1
move v0, s4
lw ra, 0x4C(sp)
lw s8, 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

453
cd_extra_main_source.asm Normal file
View File

@@ -0,0 +1,453 @@
DrawCharLine_19000:
addiu sp, sp, -0x50
sw s6, 0x40(sp)
move s6, a0
sw s1, 0x2c(sp)
move s1, a1
sw s2, 0x30(sp)
move s2, a2
sw s3, 0x34(sp)
lui s3, 0x1f80
ori s3, s3, 0x3d0
lui t0, 0xff
ori t0, t0, 0xffff
sw s0, 0x28(sp)
andi s0, a3, 0xff
move a0, s0
InitDMA:
lui a3, 0x8008
lui a2, 0xff00
addiu t1, a3, -0x6c20
lw v1, -0x6c20(a3)
lbu a1, 0x60(sp)
lui v0, 0x8000
sw ra, 0x4c(sp)
sw s8, 0x48(sp)
sw s7, 0x44(sp)
sw s5, 0x3c(sp)
sw s4, 0x38(sp)
and a2, v1, a2
andi a1, a1, 0xff
and v1, v1, t0
or s4, v1, v0
lw v0, 0x4(t1)
lw v1, 0x0(s4)
addiu v0, v0, -0x1
and v1, v1, t0
or a2, a2, v1
sw v0, 0x4(t1)
jal FUN_8001adc8
sw a2, -0x6c20(a3)
move a0, s4
sll a1, s1, 0x10
sra a1, a1, 0x10
sll a2, s2, 0x10
sra a2, a2, 0x10
jal FUN_80019d70
move a3, s0
; Настройка GPU регистров
SetupGPURegisters:
lui a3, 0x1f80
ori a3, a3, 0x348
lui a2, 0x1f80
ori a2, a2, 0x38c
li v0, 0x3
sh v0, 0x1c(sp)
li v0, 0x6
li a1, 0xd
lui a0, 0xa000
; GPU init in scratch
ScratchCPUtoVRAMinit:
sh v0, 0x1e(sp)
sb a1, 0x3(a3)
sw a0, 0x4(a3)
lhu t0, 0x9c(gp)
lhu v0, 0x9e(gp)
lui v1, 0x100
lui at, 0x1f80
sw v1, 0x37c(at)
sb a1, 0x3(a2)
sw a0, 0x4(a2)
calculateCoords:
lh a1, 0x9c(gp)
move s8, s2
lui at, 0x1f80
sw v1, 0x3c0(at)
sh t0, 0x18(sp)
sh v0, 0x1a(sp)
lw a0, 0x18(sp)
addiu v0, v0, 0x6
sh v0, 0x1a(sp)
lw v0, 0x1c(sp)
lw v1, 0x18(sp)
move t0, a1
sw v0, 0xc(a3)
sw v0, 0xc(a2)
lui v0, 0x8001
sw a0, 0x8(a3)
sw v1, 0x8(a2)
;4bit pattern in scratch
lui t8, 0x1f80
ori t8, t8, 0x2e0
addiu t7, v0, 0x3e8
lwl t5, 0x3(t7)
lwr t5, 0x0(t7)
lwl t6, 0x7(t7)
lwr t6, 0x4(t7)
swl t5, 0x3(t8)
swr t5, 0x0(t8)
swl t6, 0x7(t8)
swr t6, 0x4(t8)
lwl t5, 0xb(t7)
lwr t5, 0x8(t7)
lwl t6, 0xf(t7)
lwr t6, 0xc(t7)
swl t5, 0xb(t8)
swr t5, 0x8(t8)
swl t6, 0xf(t8)
swr t6, 0xc(t8)
lwl t5, 0x13(t7)
lwr t5, 0x10(t7)
lwl t6, 0x17(t7)
lwr t6, 0x14(t7)
swl t5, 0x13(t8)
swr t5, 0x10(t8)
swl t6, 0x17(t8)
swr t6, 0x14(t8)
lwl t5, 0x1b(t7)
lwr t5, 0x18(t7)
lwl t6, 0x1f(t7)
lwr t6, 0x1c(t7)
swl t5, 0x1b(t8)
swr t5, 0x18(t8)
swl t6, 0x1f(t8)
swr t6, 0x1c(t8)
; Copy Sprite DMA Command Forming
li v0, 0x4
sb v0, 0x3(s3)
li v0, 0x64
sb v0, 0x7(s3)
li v0, 0x80
sb v0, 0x4(s3)
sb v0, 0x5(s3)
sb v0, 0x6(s3)
bgez a1, LAB_800191fc
sh s1, 0x20(sp)
AddOffsetX:
addiu t0, a1, 0x3f
LAB_800191fc:
sra v0, t0, 0x6
sll v0, v0, 0x6
subu v0, a1, v0
lh v1, 0x9e(gp)
sll v0, v0, 0x2
sb v0, 0xc(s3)
bgez v1, LAB_80019220
move v0, v1
AddOffsetY:
addiu v0, v1, 0xff
LAB_80019220:
sra v0, v0, 0x8
sll v0, v0, 0x8
subu v0, v1, v0
sb v0, 0xd(s3)
lhu v1, 0xa4(gp)
li v0, 0xc
sh v0, 0x10(s3)
sh v0, 0x12(s3)
sh v1, 0xe(s3)
LoadCharacter:
lhu a0, 0x0(s6)
nop
sltiu v0, a0, 0x1000
beq v0, zero, LAB_80019518
addiu s6, s6, 0x2
; Подготовка к отрисовке символа
lui s1, 0x8008
addiu s5, s1, -0x6c20
lui s0, 0xff
ori s0, s0, 0xffff
lui s7, 0x8000
LAB_8001926c:
jal MakeCharInScratch
clear s2
; Настройка DMA для символа
SetupDMAForChar:
lw v0, 0xac(gp)
lhu v1, 0x4(s4)
addiu v0, v0, 0xc
mult v1, v0
lui t2, 0xff00
move t4, s4
addiu t3, sp, 0x10
move t1, s4
sh s8, 0xa(s3)
lhu t5, 0x20(sp)
mflo t6
addu v0, t5, t6
sh v0, 0x8(s3)
LAB_800192a8:
lw v0, -0x6c20(s1)
nop
and a0, v0, t2
and v0, v0, s0
or a1, v0, s7
lw v0, 0x4(s5)
lw v1, 0x0(a1)
addiu v0, v0, -0x1
and v1, v1, s0
or a0, a0, v1
sw v0, 0x4(s5)
sw a0, -0x6c20(s1)
lw t7, 0x0(s3)
lw t8, 0x4(s3)
lw t5, 0x8(s3)
lw t6, 0xc(s3)
sw t7, 0x0(a1)
sw t8, 0x4(a1)
sw t5, 0x8(a1)
sw t6, 0xc(a1)
lw t7, 0x10(s3)
nop
sw t7, 0x10(a1)
; Подготовка адресов в DMA-цепочке в RAM
DMAcharAddres:
lw v1, 0x18(t1)
lw v0, 0x0(a1)
lw v1, 0x0(v1)
and v0, v0, t2
and v1, v1, s0
or v0, v0, v1
sw v0, 0x0(a1)
lw a0, 0x18(t1)
nop
lw v0, 0x0(a0)
and v1, a1, s0
and v0, v0, t2
or v0, v0, v1
sw v0, 0x0(a0)
sw a1, 0x18(t1)
lhu v0, 0x4(t4)
nop
bne v0, zero, LAB_80019354
clear t0
sw a1, 0x28(t1)
LAB_80019354:
move a3, t0
move a2, t3
LAB_8001935c:
lui a1, 0x1f80
lw v0, -0x6c20(s1)
ori a1, a1, 0x348
and v0, v0, s0
or v0, v0, s7
sw v0, 0x0(a2)
lw v1, -0x6c20(s1)
lw v0, 0x0(v0)
lw a0, 0x4(s5)
and v1, v1, t2
and v0, v0, s0
or v1, v1, v0
addiu a0, a0, -0x1
sw v1, -0x6c20(s1)
sw a0, 0x4(s5)
lw a0, 0x0(a2)
addu v1, a3, a1
or v0, v1, a0
andi v0, v0, 0x3
beq v0, zero, LAB_80019404
addiu v0, v1, 0x30
LAB_800193b0:
lwl t7, 0x3(v1)
lwr t7, 0x0(v1)
lwl t8, 0x7(v1)
lwr t8, 0x4(v1)
lwl t5, 0xb(v1)
lwr t5, 0x8(v1)
lwl t6, 0xf(v1)
lwr t6, 0xc(v1)
swl t7, 0x3(a0)
swr t7, 0x0(a0)
swl t8, 0x7(a0)
swr t8, 0x4(a0)
swl t5, 0xb(a0)
swr t5, 0x8(a0)
swl t6, 0xf(a0)
swr t6, 0xc(a0)
addiu v1, v1, 0x10
bne v1, v0, LAB_800193b0
addiu a0, a0, 0x10
j LAB_80019430
nop
LAB_80019404:
lw t7, 0x0(v1)
lw t8, 0x4(v1)
lw t5, 0x8(v1)
lw t6, 0xc(v1)
sw t7, 0x0(a0)
sw t8, 0x4(a0)
sw t5, 0x8(a0)
sw t6, 0xc(a0)
addiu v1, v1, 0x10
bne v1, v0, LAB_80019404
addiu a0, a0, 0x10
LAB_80019430:
lwl t7, 0x3(v1)
lwr t7, 0x0(v1)
lwl t8, 0x7(v1)
lwr t8, 0x4(v1)
swl t7, 0x3(a0)
swr t7, 0x0(a0)
swl t8, 0x7(a0)
swr t8, 0x4(a0)
addiu a3, a3, 0x44
addiu t0, t0, 0x1
sltiu v0, t0, 0x2
bne v0, zero, LAB_8001935c
addiu a2, a2, 0x4
lw a0, 0x10(sp)
lw v1, 0x18(t1)
lw v0, 0x0(a0)
lw v1, 0x0(v1)
and v0, v0, t2
and v1, v1, s0
or v0, v0, v1
sw v0, 0x0(a0)
lw a0, 0x18(t1)
lw v1, 0x10(sp)
lw v0, 0x0(a0)
and v1, v1, s0
and v0, v0, t2
or v0, v0, v1
sw v0, 0x0(a0)
lw a0, 0x14(sp)
lw v1, 0x10(sp)
lw v0, 0x0(a0)
lw v1, 0x0(v1)
and v0, v0, t2
and v1, v1, s0
or v0, v0, v1
sw v0, 0x0(a0)
lw a0, 0x10(sp)
lw v1, 0x14(sp)
lw v0, 0x0(a0)
and v1, v1, s0
and v0, v0, t2
or v0, v0, v1
sw v0, 0x0(a0)
lw v0, 0x14(sp)
addiu s2, s2, 0x1
sw v0, 0x18(t1)
sltiu v0, s2, 0x2
bne v0, zero, LAB_800192a8
addiu t1, t1, 0x4
lhu v0, 0x4(s4)
nop
addiu v0, v0, 0x1
sh v0, 0x4(s4)
lhu a0, 0x0(s6)
nop
sltiu v0, a0, 0x1000
bne v0, zero, LAB_8001926c
addiu s6, s6, 0x2
LAB_80019518:
clear s2
lui s3, 0x8008
addiu s5, s3, -0x6c20
lui s1, 0xff
ori s1, s1, 0xffff
move s0, s4
clear a1
LAB_80019534:
li a2, 0x1
addu s2, s2, a2
lui v0, 0x8000
lui a0, 0xff00
lw v1, -0x6c20(s3)
lw a3, 0xa0(gp)
and v1, v1, s1
or v1, v1, v0
sw v1, 0x30(s0)
lw v0, -0x6c20(s3)
lw v1, 0x0(v1)
and v0, v0, a0
and v1, v1, s1
lw a0, 0x4(s5)
or v0, v0, v1
sw v0, -0x6c20(s3)
addiu a0, a0, -0x1
sw a0, 0x4(s5)
lw a0, 0x30(s0)
jal SetDrawTPage
addiu s0, s0, 0x4
sltiu v0, s2, 0x2
bne v0, zero, LAB_80019534
clear a1
move v0, s4
lw ra, 0x4c(sp)
lw s8, 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
cd_extra_txtpatches.asm Normal file
View File

@@ -0,0 +1,67 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Some txt Patches to JAPAN Version to print bi(u)g text smaller
;;;
.open "SLPS_028.26", 0x8000F800
;Text speed patch (0 - show all text, 2 - Normal, 1 - Button Pressed (fast) )
.org 0x8001b5b8
li a0, 0
;lhu a0, 0xc0(gp) ;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

104
charCalcs.asm Normal file
View File

@@ -0,0 +1,104 @@
ReturnCharsInString:
lhu v0,0x0(a0)
nop
srl v0,v0,0xD ;;;;Check 13th bit (1byte system !!!)
bne v0,zero,IsMy1byteString
clear v1
;v1 = charCount
j StartReading
nop
IsMy1byteString:
lhu v0,0x0(a0)
nop
andi v0,v0,0xff ;Clear from cmd flag
andi v1,v0,0x1
beq v1,zero,notAnd1
nop
addiu v0,v0,0x1
notAnd1:
sra v0,v0,1 ;v0/2 (bytes Pairs)
addiu v0,v0,1 ;v0 += = header 2 bytes
jr ra
move v1,v0 ;return v0,v1 - charsNum
GetNewChar:
addiu v1,v1,1
StartReading:
lhu v0,0x0(a0) ;a0 - curTextAddr
nop
sltiu v0,v0,0x1000
bne v0,zero,GetNewChar ;if currentChar<1000 - goto next addr+2b
addiu a0,a0,2
jr ra
move v0,v1 ;return v0,v1 - charsNum
calcNextXCustom:
addiu sp,sp,-0x18
sw ra,0x10(sp)
lhu v0,0x0(a0)
nop
andi v1,v0,0xff ;Clear from cmd flag
srl v0,v0,0xD ;;;;Check 13th bit (1byte system !!!)
beq v0,zero,JapOldText ;if bit 0d = 0 - OldTypeText
nop
j IHaveStringLength
move v0,v1 ;double char count
JapOldText:
jal ReturnCharsInString
nop
IHaveStringLength:
sll v1,v0,0x1
addu v1,v1,v0
lw ra,0x10(sp)
sll v0,v1,0x1 ;*charcount * 6 pix
jr ra
addiu sp,sp,0x18
RetunCharsToCity:
lhu v0,0x0(a0)
nop
srl v0,v0,0xD ;;;;Check 13th bit (1byte system !!!)
bne v0,zero,IsMy1byteCity
clear v1 ;v1 = charCount
j StartReading
nop
IsMy1byteCity:
lhu v0,0x0(a0)
nop
andi v0,v0,0xff ;Clear from cmd flag
jr ra
move v1,v0 ;return v0,v1 - charsNum
RetunCharsToCityDiv2:
lhu v0,0x0(a0)
nop
srl v0,v0,0xD ;;;;Check 13th bit (1byte system !!!)
bne v0,zero,IsMy1byteCityDiv2
clear v1 ;v1 = charCount
j StartReading
nop
IsMy1byteCityDiv2:
lhu v0,0x0(a0)
nop
andi v0,v0,0xff ;Clear from cmd flag
andi v1,v0,0x1
beq v1,zero,notAnd1_2
nop
addiu v0,v0,0x1
notAnd1_2:
sra v0,v0,1 ;v0/2 (bytes Pairs)
; addiu v0,v0,1 ;v0 += = header 2 bytes
jr ra
move v1,v0 ;return v0,v1 - charsNum

88
charload.asm Normal file
View File

@@ -0,0 +1,88 @@
; LOADING CHAR FROM CUSTOM FONT
makeCharPixelsCustom:
addiu sp,sp,-0x18
move a1,a0
lui a0,0x1f80
ori a0,a0,0x358
sw ra,0x10(sp)
li a2,1
lbu t2,0xac(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 ; r2 << 2 (*4) (r2 = r5 *12)
addu t1,v0,v1 ;t1 = char addr ; r9 = r2(offs) + r3 (start)
li r6,0x6 ; r6 = byteslength = 6
move v0,r6 ; r2 = r6 (counter)
beq v0,zero,charLoaded ; if counter=0 then branch
addiu r6,r6,-0x1 ; dec r6
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 += r6 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 (r6)
addiu a2,a2,-0x1 ; r6 -= 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,0xad(gp) ; >DAT_8007b23d_textMode load curText Shadow?
li v0,0x1
bne v1,v0,NotShadow ;Shadow character check
nop
lui a0,0x1f80
jal MakeShadowSmallChar ;Make shadow in Scratch DMA
ori a0,a0,0x358
NotShadow:
lw ra,0x10(sp) ;Restore stack and exit
nop
jr ra
addiu sp,sp,0x18

0
compile_command.txt Normal file
View File

172
complex_strings_copy.asm Normal file
View File

@@ -0,0 +1,172 @@
;;;;;;;;;;;;;;;;;;;;;;MAKING COMPLEX RUSSIAN STRINGS
.org 0x8008f600
;InitProgram + First Hybrid Copy
lui r2,0x8009
sw r4,-0x30(r2) ;;;Store start string addr
lhu r3,0x0(r5)
nop
srl r2,r3,0xD ;;;;Check 13th bit (1byte system !!!)
bne r2,zero,isMyString ;;if yes - jump to my prog. If no - init this
lhu r3,0x0(r5) ;load first 2-byte
clear r2 ;clear MAIN counter
;Standart 2-byte name
addiu r4,2 ;DestAddr + 2 (For my xx20 Command)
next2bytes:
sb r3,0x0(r4)
addiu r4,1 ;add dest counter
addiu r5,2 ;add src counter
addiu r2,1 ;add char counter
lhu r3,0x0(r5) ;read next jap char
nop
srl r3,r3,0xC ;Is it end of 2byte-string???
bne r3,zero,saveLengthAndExit
lhu r3,0x0(r5)
j next2bytes
nop
saveLengthAndExit:
ori r2,0x2000 ;add my command
lui r3,0x8009
lw r3,-0x30(r3) ;load str init address
nop
sh r2,0x0(r3) ;save init counter +20 to dest addr (half)
jr ra ;exit
move r2,r4 ;Duplicate for futher script
isMyString:
lhu r3,0x0(r5)
nop
andi r3,r3,0xFF
addiu r3,2 ;length to copy = charnum+2
nextMyByte:
lbu r2,0x0(r5)
nop
sb r2,0x0(r4)
addiu r4,1
addiu r3,-1
bne r3,zero,nextMyByte
addiu r5,1
jr ra ;exit
move r2,r4 ;Duplicate for futher script
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.org 0x8008f700 ;Adding my text Program
lhu r3,0x0(r5) ;read src string length
nop
;NEED TO CHECK STRING FORMAT
srl r2,r3,0xD ;;;;Check 13th bit (1byte system !!!) ;FOR TATSHUYA BOSS
beq r2,zero,secondStrisJap
nop
lbu r2,0x0(r4) ;read destination string length (1 byte)
nop
lbu r3,0x0(r5) ;read src string length
nop
add r2,r3 ;Sum lengts of old and new strings
sb r2,0x0(r4) ;save new string length
addiu r5,2 ;shift src +2 (len code)
sub r2,r3
addiu r4,2
add r4,r2 ;shift destination - len+2
nextMyByte2:
lbu r2,0x0(r5)
nop
sb r2,0x0(r4)
addiu r4,1
addiu r3,-1
bne r3,zero,nextMyByte
addiu r5,1
jr ra ;exit
move r2,r4 ;Duplicate for futher script
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
secondStrisJap:
lbu r3,0x0(r4) ;read dest string length
addiu r4,2 ;DestAddr + 2 (For my xx20 Command)
add r4,r3 ;add dest counter = end of prev string
lhu r3,0x0(r5) ;load first 2-byte
clear r2 ;clear MAIN counter
;Standart 2-byte name
next2bytes2:
sb r3,0x0(r4)
addiu r4,1 ;add dest counter
addiu r5,2 ;add src counter
addiu r2,1 ;add char counter
lhu r3,0x0(r5) ;read next jap char
nop
srl r3,r3,0xC ;Is it end of 2byte-string???
bne r3,zero,saveLengthAndExit2
lhu r3,0x0(r5)
j next2bytes2
nop
saveLengthAndExit2:
lui r3,0x8009
lw r3,-0x30(r3)
nop
lhu r3,0x0(r3) ;load str prev length
nop
add r2,r3,r2 ;main counter + prev string length
;ori r2,r3,0x2000 ;add my command = xx20
lui r3,0x8009
lw r3,-0x30(r3)
nop
sh r2,0x0(r3) ;save counter +20 to dest addr (half)
jr ra ;exit
move r2,r4 ;Duplicate for futher script
;NAMEENTER SWAP ROUTINE
.org 0x8008f800 ;Adding my text Program
;r4 - destination
;r5 - source
move r6,ra
lui r5, 0x8008
ori r5, 0x0a7c ;Copy name to temp
lui r4, 0x8008
ori r4, 0xfa0e ;dest+2
jal 0x80015fe0 ;TEMP - 80080a0e
nop
lui r5, 0x8008
ori r5, 0x0ae4 ;Copy surname to name
lui r4, 0x8008
ori r4, 0x0a7e ;dest+2
jal 0x80015fe0
nop
lui r5, 0x8008
ori r5, 0xfa0c ;Copy temp to surname ;TEMP - 80080a0c
lui r4, 0x8008
ori r4, 0x0ae6 ;dest+2
jal 0x80015fe0
nop
move ra,r6
li r4,0
j 0x80017a9c ;EXIT

489
ghidra_src/big.asm Normal file
View File

@@ -0,0 +1,489 @@
**************************************************************
* FUNCTION *
**************************************************************
undefined __stdcall drawCharLine_MakeDMAChain(undefined4
assume gp = 0x8007b190
undefined v0:1 <RETURN>
undefined4 a0:4 r4
undefined2 a1:2 r5
undefined2 a2:2 r6 XREF[1]: 8001965c(W)
undefined1 a3:1 r7
undefined1 Stack[0x10]:1 makeShadow? XREF[1]: 8001934c(R)
undefined4 s4:4 r20_LineDMAParam XREF[1]: 80019374(W)
undefined4 s2:4 r18 XREF[1]: 8001956c(W)
undefined4 t1:4 t1 XREF[1]: 800195a8(W)
undefined4 a2:4 DMALinkAddr XREF[1]: 8001965c(W)
undefined4 Stack[-0x4]:4 local_4 XREF[2]: 80019354(W),
80019898(R)
undefined4 Stack[-0x8]:4 local_8 XREF[2]: 80019358(W),
8001989c(R)
undefined4 Stack[-0xc]:4 local_c XREF[2]: 8001935c(W),
800198a0(R)
undefined4 Stack[-0x10]:4 local_10 XREF[2]: 80019304(W),
800198a4(R)
undefined4 Stack[-0x14]:4 local_14 XREF[2]: 80019360(W),
800198a8(R)
undefined4 Stack[-0x18]:4 local_18 XREF[2]: 80019364(W),
800198ac(R)
undefined4 Stack[-0x1c]:4 local_1c XREF[2]: 8001931c(W),
800198b0(R)
undefined4 Stack[-0x20]:4 local_20 XREF[2]: 80019314(W),
800198b4(R)
undefined4 Stack[-0x24]:4 local_24 XREF[2]: 8001930c(W),
800198b8(R)
undefined4 Stack[-0x28]:4 local_28 XREF[2]: 80019330(W),
800198bc(R)
undefined2 Stack[-0x30]:2 textXlocal XREF[2]: 800194f4(W),
80019598(R)
undefined1[16] Stack[-0x40] DMALinksAddr XREF[6,11]: 80019670(W),
80019698(R),
80019764(R),
80019788(R),
800197a4(R),
800197c0(R),
800197a0(R),
800197c4(R),
800197dc(R),
80019410(W),
80019418(R),
80019428(R),
80019414(W),
80019420(W),
800193c8(W),
80019424(R),
800193d8(W)
undefined2 HASH:5f91568 currentReadedChar
drawCharLine_MakeDMAChain XREF[31]: PrintCommandText:8001c398(c),
PrintCommandText:8001c40c(c),
sendTXTLineWithParams:8001c688(c),
PrintSelectionMenu:8001d058(c),
PrintSelectionMenu:8001d0d8(c),
FUN_8001e964:8001e9cc(c),
FUN_8001ebc0:8001ed58(c),
FUN_OVR_EXT__80096f94:800970e8(c),
FUN_OVR_EXT__80096f94:800971dc(c),
FUN_OVR_EXT__80096f94:800973e0(c),
FUN_OVR_EXT__800974bc:800976ec(c),
FUN_OVR_EXT__80099078:800990f8(c),
OVR_EXT::800997d0(c), OVR_EXT::80099870(c),
OVR_EXT::80099948(c), OVR_EXT::80099a28(c),
OVR_EXT::80099a94(c), OVR_EXT::80099af8(c),
OVR_EXT::80099c9c(c), OVR_EXT::80099d30(c),
[more]
80019300 b0 ff bd 27 addiu sp,sp,-0x50
assume gp = <UNKNOWN>
80019304 40 00 b6 af sw s6,local_10(sp) push all regs into stack!
80019308 21 b0 80 00 move s6,r4 save text addr to r22
8001930c 2c 00 b1 af sw s1,local_24(sp)
80019310 21 88 a0 00 move s1,r5 save X to r17
80019314 30 00 b2 af sw s2,local_20(sp)
80019318 21 90 c0 00 move s2,r6 save Y to r18
8001931c 34 00 b3 af sw s3,local_1c(sp)
80019320 80 1f 13 3c lui s3,0x1f80
80019324 d0 03 73 36 ori s3,s3,0x3d0 load Scratchpad temp addr to r19
80019328 ff 00 08 3c lui t0,0xff
8001932c ff ff 08 35 ori t0,t0,0xffff
80019330 28 00 b0 af sw s0,local_28(sp)
80019334 ff 00 f0 30 andi s0,r7,0xff cut a3 (&ff) => s0 - make 2byte
80019338 21 20 00 02 move r4,s0 Save Col Index to r4? (rewrite textaddr??)
8001933c 08 80 07 3c lui r7=>DAT_80080000,0x8008 set r7(cI) to 80080000
80019340 00 ff 06 3c lui r6,0xff00 r6 - load ff000000
80019344 d0 b6 e9 24 addiu t1,r7,-0x4930 r9 = r7-4930 = 8007b6d0
80019348 d0 b6 e3 8c lw v1,-0x4930(r7)=>8007b6d0_freeChain r3 =(r7-4930)
8001934c 60 00 a5 93 lbu r5,makeShadow?(sp) r5 = makeShadow? (sp+60h)
80019350 00 80 02 3c lui v0,0x8000 set r2 to 80000000
80019354 4c 00 bf af sw ra,local_4(sp)
80019358 48 00 be af sw s8,local_8(sp)
8001935c 44 00 b7 af sw s7,local_c(sp)
80019360 3c 00 b5 af sw s5,local_14(sp) push ra,r30,r23,31,r20
80019364 38 00 b4 af sw s4,local_18(sp)
80019368 24 30 66 00 and r6,v1,r6 r3 must begins from FF
8001936c ff 00 a5 30 andi r5,r5,0xff cut makeShadow (and ff)
80019370 24 18 68 00 and v1,v1,t0 r3 and 00ffffff (cut 1 byte)
80019374 25 a0 62 00 or r20_LineDMAParam,v1,v0 r2(800..) or r3 (001adf54)
(from 7b6d0)
to r20 - 801adf54 - FREE DMA ADDR???
80019378 04 00 22 8d lw v0,0x4(t1)=>DAT_8007b6d4_CmdCounter load 7b6d4 to r2 (0706)
8001937c 00 00 83 8e lw v1,0x0(r20_LineDMAParam) load [r20] to r3 (1adf10)
80019380 ff ff 42 24 addiu v0,v0,-0x1 r2=r2-1 (705)
80019384 24 18 68 00 and v1,v1,t0 r3 & r8 (00ffffff) cut f.byte
80019388 25 30 c3 00 or r6,r6,v1 r6 or r3 = ff+r3 = ff1adf10
8001938c 04 00 22 ad sw v0,0x4(t1)=>DAT_8007b6d4_CmdCounter r9+4 = r2
80019390 32 6c 00 0c jal store_Color_to_addr undefined store_Color_to_addr(undefined1 ColIndex, undefine
80019394 d0 b6 e6 ac _sw r6,-0x4930(r7)=>8007b6d0_freeChain store r6(ff1df10) to (r7-4930 = 7b610)
80019398 21 20 80 02 move r4,r20_LineDMAParam lw r4,20 = 801adf54
8001939c 00 2c 11 00 sll r5,s1,0x10 r5 = X<<10h (003A0000)
800193a0 03 2c 05 00 sra r5,r5,0x10 r5=r5>>10h 0000003A
800193a4 00 34 12 00 sll r6,s2,0x10 r6 = Y << 10h
800193a8 03 34 06 00 sra r6,r6,0x10 r6>>10h - 100% clean coords
800193ac 1c 68 00 0c jal initCopycharChain undefined initCopycharChain(undefined4 curDmaChainAddr, und
800193b0 21 38 00 02 _move r7,s0
;;;;init ScratchPad
800193b4 80 1f 07 3c lui r7,0x1f80 load r7 1f800348 - 1st scratch DMA addr
800193b8 48 03 e7 34 ori r7=>DAT_1f800348,r7,0x348 = ??
800193bc 80 1f 06 3c lui r6,0x1f80
800193c0 8c 03 c6 34 ori r6=>DAT_1f80038c,r6,0x38c load r7 1f80038c - 2nd Scrach DMA???
CpuToVRam sizes in temp chain
800193c4 03 00 02 24 li v0,0x3
800193c8 1c 00 a2 a7 sh v0,DMALinksAddr[12](sp) store half (0003) to sp+1c = 00100003
800193cc 06 00 02 24 li v0,0x6 r2 = 0006
800193d0 0d 00 05 24 li r5,0xd r5 = 0d
800193d4 00 a0 04 3c lui r4,0xa000 r4 = a000 0000
800193d8 1e 00 a2 a7 sh v0,DMALinksAddr[14](sp) sp+13 = 00060003
Size of DMA sprite
Init upper char
800193dc 03 00 e5 a0 sb r5,0x3(r7)=>DAT_1f80034b r5(0d) to r7(scr1+3) (byte)
800193e0 04 00 e4 ac sw r4,0x4(r7)=>DAT_1f80034c 'a00000' ->34c - CpuToVram command
800193e4 a0 00 88 97 lhu t0,0xa0(gp)=>VRam_Temp_Char_x Load x(0310) to r8
800193e8 a2 00 82 97 lhu v0,0xa2(gp)=>VRam_Temp_Char_y Load y(01F0)to r2
800193ec 00 01 03 3c lui v1,0x100 ld r3 - 01 00 00 00
800193f0 80 1f 01 3c lui at,0x1f80 ld r1 = 1f800000
800193f4 7c 03 23 ac sw v1,offset DAT_1f80037c(at) ld *r1+37c , r3 (01000000)
load FlushCache cmd to DMATmp
@ the end of DMAChain
36Bytes Free (3x6x2) After
a0000000
013001f0
init lower char
800193f8 03 00 c5 a0 sb r5,0x3(r6)=>DAT_1f80038f load 0d to 2nd (lower char) scratch
800193fc 04 00 c4 ac sw r4,0x4(r6)=>DAT_1f800390 set a0 to 390
80019400 a0 00 85 87 lh r5,0xa0(gp)=>VRam_Temp_Char_x load 0130 to r5
80019404 21 f0 40 02 move s8,s2 r18 to r30 (y)
80019408 80 1f 01 3c lui at,0x1f80 load 1f80 to r1
8001940c c0 03 23 ac sw v1,offset DAT_1f8003c0(at) ld *r1+3c0 , r3 (01000000)
load FlushCache cmd to DMATmp
@ the end of 2nd DMAChain
36Bytes Free (3x6x2) After
a0000000
013001f0
Make coords & codes Up&low and save to scratch
80019410 18 00 a8 a7 sh t0,DMALinksAddr[8](sp) load half 0130 to sp+18
80019414 1a 00 a2 a7 sh v0,DMALinksAddr[10](sp) load half to sp+1a 01f0
80019418 18 00 a4 8f lw r4,DMALinksAddr[8](sp) load 01f00130 to r4 from sp+18
8001941c 06 00 42 24 addiu v0,v0,0x6 r2 += 6 = 01f6 - lower char coords
80019420 1a 00 a2 a7 sh v0,DMALinksAddr[10](sp) save half 01f2 to sp+1a
80019424 1c 00 a2 8f lw v0,DMALinksAddr[12](sp) load 00060003 to r2 from sp+1c
80019428 18 00 a3 8f lw v1,DMALinksAddr[8](sp) load 01f0130 to r3 from sp+18
8001942c 21 40 a0 00 move t0,r5 load 0130(r5) to r8
80019430 0c 00 e2 ac sw v0,0xc(r7)=>DAT_1f800354 load r2 - 0003006 to 1st char (to r7+0c)
80019434 0c 00 c2 ac sw v0,0xc(r6)=>DAT_1f800398 load r2 - 0003006 to 2st char (to r6+0c)
80019438 01 80 02 3c lui v0,0x8001 load 80010000 to r2
8001943c 08 00 e4 ac sw r4,0x8(r7)=>DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA)
80019440 08 00 c3 ac sw v1,0x8(r6)=>DAT_1f800394 load r3 (lower coord 01f0) to r6+8 (DMA)
Make StrangeTable in SCRATCH
80019444 80 1f 18 3c lui t8,0x1f80
80019448 e0 02 18 37 ori t8,t8,0x2e0 load 1f8002e0 to r24?
8001944c e8 03 4f 24 addiu t7,v0,0x3e8 r15 = 800103e8
80019450 03 00 ed 89 lwl t5,0x3(t7)
80019454 00 00 ed 99 lwr t5,0x0(t7)=>DAT_800103e8 = 00010000h
80019458 07 00 ee 89 lwl t6,0x7(t7)
8001945c 04 00 ee 99 lwr t6,0x4(t7)=>DAT_800103ec = 00110010h
80019460 03 00 0d ab swl t5,0x3(t8)
80019464 00 00 0d bb swr t5,0x0(t8)=>DAT_1f8002e0 = ??
80019468 07 00 0e ab swl t6,0x7(t8)
8001946c 04 00 0e bb swr t6,0x4(t8)=>DAT_1f8002e4 = ??
80019470 0b 00 ed 89 lwl t5,0xb(t7)
80019474 08 00 ed 99 lwr t5,0x8(t7)=>DAT_800103f0 = 01010100h
80019478 0f 00 ee 89 lwl t6,0xf(t7)
8001947c 0c 00 ee 99 lwr t6,0xc(t7)=>DAT_800103f4 = 01110110h
80019480 0b 00 0d ab swl t5,0xb(t8)
80019484 08 00 0d bb swr t5,0x8(t8)=>DAT_1f8002e8 = ??
80019488 0f 00 0e ab swl t6,0xf(t8)
8001948c 0c 00 0e bb swr t6,0xc(t8)=>DAT_1f8002ec = ??
80019490 13 00 ed 89 lwl t5,0x13(t7)
80019494 10 00 ed 99 lwr t5,0x10(t7)=>DAT_800103f8 = 10011000h
80019498 17 00 ee 89 lwl t6,0x17(t7)
8001949c 14 00 ee 99 lwr t6,0x14(t7)=>DAT_800103fc = 10111010h
800194a0 13 00 0d ab swl t5,0x13(t8) Making ConvertTo4Bits Table
800194a4 10 00 0d bb swr t5,0x10(t8)=>DAT_1f8002f0 = ??
800194a8 17 00 0e ab swl t6,0x17(t8)
800194ac 14 00 0e bb swr t6,0x14(t8)=>DAT_1f8002f4 = ??
800194b0 1b 00 ed 89 lwl t5,0x1b(t7)
800194b4 18 00 ed 99 lwr t5,0x18(t7)=>DAT_80010400 = 11011100h
800194b8 1f 00 ee 89 lwl t6,0x1f(t7)
800194bc 1c 00 ee 99 lwr t6,0x1c(t7)=>DAT_80010404 = 11111110h
800194c0 1b 00 0d ab swl t5,0x1b(t8)
800194c4 18 00 0d bb swr t5,0x18(t8)=>DAT_1f8002f8 = ??
800194c8 1f 00 0e ab swl t6,0x1f(t8)
800194cc 1c 00 0e bb swr t6,0x1c(t8)=>DAT_1f8002fc = ??
Copy Sprite DMA Command Forming
800194d0 04 00 02 24 li v0,0x4
800194d4 03 00 62 a2 sb v0,0x3(s3)=>DAT_1f8003d3 04 00 00 00 to 3d0 (sb 04 to 3d3)
800194d8 64 00 02 24 li v0,0x64
800194dc 07 00 62 a2 sb v0,0x7(s3)=>DAT_1f8003d7 sb 64 to 3d7 (copySpriteCommand)
800194e0 80 00 02 24 li v0,0x80
800194e4 04 00 62 a2 sb v0,0x4(s3)=>DAT_1f8003d4 make 80 80 80 64 (3d4,5,6,7)
800194e8 05 00 62 a2 sb v0,0x5(s3)=>DAT_1f8003d5 SPRITE COPY DMA COMMAND
800194ec 06 00 62 a2 sb v0,0x6(s3)=>DAT_1f8003d6 = ??
800194f0 02 00 a1 04 bgez r5,LAB_800194fc branch if r5>=0
800194f4 20 00 b1 a7 _sh s1,textXlocal(sp) sp+20 loadhalf X (3A)
800194f8 3f 00 a8 24 addiu t0,r5,0x3f else r8 = r5 + 3f
LAB_800194fc XREF[1]: 800194f0(j)
800194fc 83 11 08 00 sra v0,t0,0x6 r2 = r8 (130) >> 6 = 4
80019500 80 11 02 00 sll v0,v0,0x6 r2 = r2 (4) << 6 = 100
80019504 23 10 a2 00 subu v0,r5,v0 r2 = r5(130) - r2 = 30
80019508 a2 00 83 87 lh v1,0xa2(gp)=>VRam_Temp_Char_y load Y half 01f0 form Y(mem)
8001950c 80 10 02 00 sll v0,v0,0x2 r2 << 2 = c0
80019510 0c 00 62 a2 sb v0,0xc(s3)=>DAT_1f8003dc set src X (c0) sprCpy(3th command)
80019514 02 00 61 04 bgez v1,LAB_80019520 if Y r3>=0 - branch & r2=r3
80019518 21 10 60 00 _move v0,v1
8001951c ff 00 62 24 addiu v0,v1,0xff else r2 = ff - r3
LAB_80019520 XREF[1]: 80019514(j)
80019520 03 12 02 00 sra v0,v0,0x8 r2 (1f0) >>a 8 = 001
80019524 00 12 02 00 sll v0,v0,0x8 r2 (001) <<l 8 = 100 Cleared 1st byte
80019528 23 10 62 00 subu v0,v1,v0 r2 = r3-r2 = F0
8001952c 0d 00 62 a2 sb v0,0xd(s3)=>DAT_1f8003dd set src Y (F0) sprCpy(3th command)
80019530 a8 00 83 97 lhu v1,0xa8(gp)=>DAT_8007b238 load XYhalf(7df3) to r3 from DMAchain
Size of Char To Copy (000Cx000C)
80019534 0c 00 02 24 li v0,0xc
80019538 10 00 62 a6 sh v0,0x10(s3)=>DAT_1f8003e0 r2 = 000c. load halfs to 3e0,3e2
8001953c 12 00 62 a6 sh v0,0x12(s3)=>DAT_1f8003e2 = ??
MAKING TEMP CHAIN IN SCRATCHPAD FOR COPY SPRITE TO SCREEN
80019540 0e 00 63 a6 sh v1,0xe(s3)=>DAT_1f8003de load r3half to 3de XYcoords to DMATemp (7fd3)
START TO READING CHARS HERE
80019544 00 00 c4 96 lhu r4,0x0(s6) LOAD FIRST CHAR (HALF-2bytes) to r4 (c2) from *r22
80019548 00 00 00 00 nop
8001954c 00 10 82 2c sltiu v0,r4,0x1000 r2 = r4 < 1000h
80019550 b1 00 40 10 beq v0,zero,TextEnd branch if not char (r2=0)
80019554 02 00 d6 26 _addiu s6,s6,0x2 add +2 to r22 (read char addr)
80019558 08 80 11 3c lui s1,0x8008 load 80080000 to r17
8001955c d0 b6 35 26 addiu s5,s1,-0x4930 r21 = r17-4930= 7b6d0 (tempDMA)
80019560 ff 00 10 3c lui s0,0xff
80019564 ff ff 10 36 ori s0,s0,0xffff r16 = 00 ff ff ff
80019568 00 80 17 3c lui s7,0x8000 r3 = 8000 000
LAB_8001956c XREF[1]: 80019810(j)
8001956c 32 66 00 0c jal CreateCharCopyToDMAChain load current char, copy to Scratch
80019570 21 90 00 00 _clear r18 r18 = 0
80019574 b0 00 82 8f lw v0,0xb0(gp)=>DAT_8007b240_parms load r2 from r28+0b0 (7b240)(Xoffs)
80019578 04 00 83 96 lhu v1,0x4(r20_LineDMAParam) r3 = half *DMAAddr + 4
8001957c 0c 00 42 24 addiu v0,v0,0xc 0x0c * 12px btw letters!
80019580 18 00 62 00 mult v1,v0 r3*r2 = xOffs*charNum
80019584 00 ff 0a 3c lui t2,0xff00 r10 = ld upper ff00 = ff000000
80019588 21 60 80 02 move t4,r20_LineDMAParam r12 = r20
8001958c 10 00 ab 27 addiu t3,sp,0x10 r11 = sp + 10 = 807ffe50
80019590 21 48 80 02 move t1,r20_LineDMAParam r9 = r20 (paramsAddr)
80019594 0a 00 7e a6 sh s8,0xa(s3)=>DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??)
80019598 20 00 ad 97 lhu t5,textXlocal(sp) r13 = ld half (sp+20) = 003A
8001959c 12 70 00 00 mflo t6 r14 = lo
800195a0 21 10 ae 01 addu v0,t5,t6 r2 = r13 + r14 = 3A
Рассчитываем координаты символа на экране
800195a4 08 00 62 a6 sh v0,0x8(s3)=>DAT_1f8003d8 save r2 half to 1f8003d8 = Y (3A)
MAKING COPYSPRITE CHAIN
ScreenLoop XREF[1]: 800197ec(j)
800195a8 d0 b6 22 8e lw v0,-0x4930(s1)=>8007b6d0_freeChain r2 = *7b6d0
800195ac 00 00 00 00 nop
800195b0 24 20 4a 00 and r4,v0,t2 r4 = a2 & ff000000 - is begins with ff
800195b4 24 10 50 00 and v0,v0,s0 r2 & r16 (00FFFFFF) = cut FF
800195b8 25 28 57 00 or r5,v0,s7 r5 = r2 or r23 (80000000) = 801ADF10
r5 = next free chain
800195bc 04 00 a2 8e lw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter r2 = *7b6d0+4 = 705
800195c0 00 00 a3 8c lw v1,0x0(r5) r3 = *r5 chainAddr?
next sec free chain
800195c4 ff ff 42 24 addiu v0,v0,-0x1 r2 -= 1
800195c8 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF = cut
800195cc 25 20 83 00 or r4,r4,v1 r4 or r3 . r4&ff = ff1adecc
800195d0 04 00 a2 ae sw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter store r2 (704) in *7b6d4
800195d4 d0 b6 24 ae sw r4,-0x4930(s1)=>8007b6d0_freeChain 7b640 = r4
800195d8 00 00 6f 8e lw t7,0x0(s3)=>DAT_1f8003d0 copy CopySpriteCommand
r15 = *r19
800195dc 04 00 78 8e lw t8,0x4(s3)=>DAT_1f8003d4 r24 = *r19+4
800195e0 08 00 6d 8e lw t5,0x8(s3)=>DAT_1f8003d8 r13 = *r19+8
800195e4 0c 00 6e 8e lw t6,0xc(s3)=>DAT_1f8003dc r14 = *r19+0c
800195e8 00 00 af ac sw t7,0x0(r5) *r5 = r15
800195ec 04 00 b8 ac sw t8,0x4(r5) *r5+4 = r24
800195f0 08 00 ad ac sw t5,0x8(r5) *r5+8 = r13
800195f4 0c 00 ae ac sw t6,0xc(r5) *r5+c = r14
800195f8 10 00 6f 8e lw t7,0x10(s3)=>DAT_1f8003e0 r15 = *r19+10h last command
800195fc 00 00 00 00 nop
80019600 10 00 af ac sw t7,0x10(r5) *r5+10 = r15
80019604 18 00 23 8d lw v1,0x18(t1) r3 = *r9+18 (2nd screen???) = 801adf64
80019608 00 00 a2 8c lw v0,0x0(r5) r2 = *r5
8001960c 00 00 63 8c lw v1,0x0(v1) r3 = *r3 = 00FFFF
80019610 24 10 4a 00 and v0,v0,t2 r2 & r10 (ff00...) = 0400.. - Cleaning
80019614 24 18 70 00 and v1,v1,s0 r3 & r16 (00ff..) = cutting
80019618 25 10 43 00 or v0,v0,v1 r2 or r3 = 04FFFFFF
8001961c 00 00 a2 ac sw v0,0x0(r5) *r5 = r2
80019620 18 00 24 8d lw r4,0x18(t1) r4 = *r19+18
80019624 00 00 00 00 nop
80019628 00 00 82 8c lw v0,0x0(r4) r2 = *r4 (00ffffff)
8001962c 24 18 b0 00 and v1,r5,s0 r3 = r5 and r16 (00ff..)
80019630 24 10 4a 00 and v0,v0,t2 r2 & ff0000
80019634 25 10 43 00 or v0,v0,v1 r2 | r3 (001adf10)
80019638 00 00 82 ac sw v0,0x0(r4) *r4 = r2
8001963c 18 00 25 ad sw r5,0x18(t1) *r9+18 = r5
80019640 04 00 82 95 lhu v0,0x4(t4) r2 = half r12 + 4
80019644 00 00 00 00 nop
80019648 02 00 40 14 bne v0,zero,LAB_80019654 if r2<>0 = goto
8001964c 21 40 00 00 _clear t0 clear r8
80019650 28 00 25 ad sw r5,0x28(t1) *r9+28 = r5 (df10)
LAB_80019654 XREF[1]: 80019648(j)
80019654 21 38 00 01 move r7,t0 r7 = r8
80019658 21 30 60 01 move r6,t3 r6 = r11 stack +10(?)
MAKE HALF CHAR CHAIN (r7 is offset in scratch)
UpDownCharLoop XREF[1]: 8001975c(j)
8001965c 80 1f 05 3c lui r5,0x1f80 r5 = 1f80000
80019660 d0 b6 22 8e lw v0,-0x4930(s1)=>8007b6d0_freeChain r2 = *7b6d0
80019664 48 03 a5 34 ori r5=>DAT_1f800348,r5,0x348 r5 or 348 - ld upper char ScrChain
80019668 24 10 50 00 and v0,v0,s0 r2 & 00FFFFFF
8001966c 25 10 57 00 or v0,v0,s7 r2 & 80000000
80019670 00 00 c2 ac sw v0,0x0(DMALinkAddr)=>DMALinksAddr[0] set r2 to r6 (stack) (upper char chain)
80019674 d0 b6 23 8e lw v1,-0x4930(s1)=>8007b6d0_freeChain r3 = *7b6d0
80019678 00 00 42 8c lw v0,0x0(v0) r2 = *r2 LAST NEW CHAIN ADDR
8001967c 04 00 a4 8e lw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter r4 = chain counter
80019680 24 18 6a 00 and v1,v1,t2 r3 & FF000000
80019684 24 10 50 00 and v0,v0,s0 r2 & 00 FF FF FF (cut)
80019688 25 18 62 00 or v1,v1,v0 r3 | r2 (ff-nextfreeaddr)
8001968c ff ff 84 24 addiu r4,r4,-0x1 dec r4 chain counter -1
80019690 d0 b6 23 ae sw v1,-0x4930(s1)=>8007b6d0_freeChain save next addr to *7b6d0
80019694 04 00 a4 ae sw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter save chain counter 7b6d4
80019698 00 00 c4 8c lw r4,0x0(DMALinkAddr)=>DMALinksAddr[0] r4 = second chain addr
8001969c 21 18 e5 00 addu v1,r7,r5 r3 = r7(counter)+r5 = current read ScrDMAAddr
800196a0 25 10 64 00 or v0,v1,r4 r2 = r3(curScrAddr) | r4(DestAddr)
800196a4 03 00 42 30 andi v0,v0,0x3 r2 & 3.. Test for Src | dest & 3
Смещение относ. 4 байт у Исх или Назн
Если не ноль - обработка смещения
800196a8 16 00 40 10 beq v0,zero,goodAddr if a=0 then Ok, jump
800196ac 30 00 62 24 _addiu v0,v1,0x30 r2 = r3 (старт) + 30h -
конечный адрес (30h=48 байт)
LAB_800196b0 XREF[1]: 800196f4(j)
800196b0 03 00 6f 88 lwl t7,0x3(v1) r15 = *r3+3
800196b4 00 00 6f 98 lwr t7,0x0(v1)=>DAT_1f800348 = ??
800196b8 07 00 78 88 lwl t8,0x7(v1)
800196bc 04 00 78 98 lwr t8,0x4(v1)=>DAT_1f80034c load halfbytes until r2<>r3
800196c0 0b 00 6d 88 lwl t5,0xb(v1)
800196c4 08 00 6d 98 lwr t5,0x8(v1)=>DAT_1f800350 = ??
800196c8 0f 00 6e 88 lwl t6,0xf(v1)
800196cc 0c 00 6e 98 lwr t6,0xc(v1)=>DAT_1f800354 = ??
800196d0 03 00 8f a8 swl t7,0x3(r4)
800196d4 00 00 8f b8 swr t7,0x0(r4)
800196d8 07 00 98 a8 swl t8,0x7(r4)
800196dc 04 00 98 b8 swr t8,0x4(r4)
800196e0 0b 00 8d a8 swl t5,0xb(r4)
800196e4 08 00 8d b8 swr t5,0x8(r4)
800196e8 0f 00 8e a8 swl t6,0xf(r4)
800196ec 0c 00 8e b8 swr t6,0xc(r4)
800196f0 10 00 63 24 addiu v1,v1,0x10 r3 += 10
800196f4 ee ff 62 14 bne v1,v0,LAB_800196b0
800196f8 10 00 84 24 _addiu r4,r4,0x10 r4 += 10
800196fc cc 65 00 08 j LAB_80019730
80019700 00 00 00 00 _nop
goodAddr XREF[2]: 800196a8(j), 80019728(j)
80019704 00 00 6f 8c lw t7,0x0(v1)=>DAT_1f800348 r15 = *r3
80019708 04 00 78 8c lw t8,0x4(v1)=>DAT_1f80034c r24 = *r3+4
8001970c 08 00 6d 8c lw t5,0x8(v1)=>DAT_1f800350 r13 = *r3+8
80019710 0c 00 6e 8c lw t6,0xc(v1)=>DAT_1f800354 r14 = *r3+c
80019714 00 00 8f ac sw t7,0x0(r4) *r4 (dest) = r15
80019718 04 00 98 ac sw t8,0x4(r4) *r4+4 (dest) = r24
8001971c 08 00 8d ac sw t5,0x8(r4) *r4+8 (dest) = r13
80019720 0c 00 8e ac sw t6,0xc(r4) *r4+c (dest) = r14
80019724 10 00 63 24 addiu v1,v1,0x10 r3 += 10h (16) src
80019728 f6 ff 62 14 bne v1,v0,goodAddr if r3<>r2 then loop
8001972c 10 00 84 24 _addiu r4,r4,0x10 r4 += 10h (16) dest
LAB_80019730 XREF[1]: 800196fc(j)
80019730 03 00 6f 88 lwl t7,0x3(v1)
80019734 00 00 6f 98 lwr t7,0x0(v1)=>DAT_1f800358 = ??
80019738 07 00 78 88 lwl t8,0x7(v1)
8001973c 04 00 78 98 lwr t8,0x4(v1)=>DAT_1f80035c = ??
80019740 03 00 8f a8 swl t7,0x3(r4)
80019744 00 00 8f b8 swr t7,0x0(r4) add by halfBytes
80019748 07 00 98 a8 swl t8,0x7(r4)
8001974c 04 00 98 b8 swr t8,0x4(r4)
80019750 44 00 e7 24 addiu r7,r7,0x44 r7 += 44 (68)
80019754 01 00 08 25 addiu t0,t0,0x1 r8 += 1
80019758 02 00 02 2d sltiu v0,t0,0x2 r2 = if r8<=2
8001975c bf ff 40 14 bne v0,zero,UpDownCharLoop then another loop (lower char)
80019760 04 00 c6 24 _addiu DMALinkAddr,DMALinkAddr,0x4 Shift DMALinkAddress in r6
80019764 10 00 a4 8f lw r4,DMALinksAddr[0](sp) r4 = *sp+10 (sec chain addr)
80019768 18 00 23 8d lw v1,0x18(t1) r3 = *r9+18h = first chain addr @ secondchain header
8001976c 00 00 82 8c lw v0,0x0(r4) r2 = *r4 = currChain start (0d000000)
80019770 00 00 63 8c lw v1,0x0(v1) r3 = *r3 = currChain start (04ffffff)
80019774 24 10 4a 00 and v0,v0,t2 a2 & r10 (ff 00 0 00)
80019778 24 18 70 00 and v1,v1,s0 r3 & r16 00FFFFFF
8001977c 25 10 43 00 or v0,v0,v1 r2 | r3
80019780 00 00 82 ac sw v0,0x0(r4) save cur chain header with ??FFFFFF
80019784 18 00 24 8d lw r4,0x18(t1) r4 = *r9+18h = first chain addr @ secondchain header
80019788 10 00 a3 8f lw v1,DMALinksAddr[0](sp) r3 = *sp+10 (sec chain addr)
8001978c 00 00 82 8c lw v0,0x0(r4) r2 = load *r4 1st chain (04ffffff)
80019790 24 18 70 00 and v1,v1,s0 r3 & r16 00FFFFFF
80019794 24 10 4a 00 and v0,v0,t2 r2 & r10 (ff 00 0 00)
80019798 25 10 43 00 or v0,v0,v1 r2 | r3
8001979c 00 00 82 ac sw v0,0x0(r4) *first chain addr=04_sec_chain
800197a0 14 00 a4 8f lw r4,DMALinksAddr[4](sp) r4 = load last chain addr
800197a4 10 00 a3 8f lw v1,DMALinksAddr[0](sp) r3 = *sp+10 (sec chain addr)
800197a8 00 00 82 8c lw v0,0x0(r4) r2 = load last chain header
800197ac 00 00 63 8c lw v1,0x0(v1) r3 = *r3 (header of 2nd chain)
800197b0 24 10 4a 00 and v0,v0,t2 a2 & ff00..
800197b4 24 18 70 00 and v1,v1,s0 r3 & 00ffff..
800197b8 25 10 43 00 or v0,v0,v1 r2 | r3 = sec chain header (0d+ffff)
800197bc 00 00 82 ac sw v0,0x0(r4) store header 0dffffff to last chain
800197c0 10 00 a4 8f lw r4,DMALinksAddr[0](sp) r4 = *sp+10 (sec chain addr)
800197c4 14 00 a3 8f lw v1,DMALinksAddr[4](sp) r3 = load last chain addr
800197c8 00 00 82 8c lw v0,0x0(r4) r2 = load sec chain header
800197cc 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF
800197d0 24 10 4a 00 and v0,v0,t2 r2 & FF000000
800197d4 25 10 43 00 or v0,v0,v1 r2 | r3
800197d8 00 00 82 ac sw v0,0x0(r4) *r4 = r2 (sec header with command count)
800197dc 14 00 a2 8f lw v0,DMALinksAddr[4](sp) r2 = load last chain addr
800197e0 01 00 52 26 addiu r18,r18,0x1 18 += 1 (screen counter?)
800197e4 18 00 22 ad sw v0,0x18(t1) load r2 (last cmd addr)
to lower DMA table???
800197e8 02 00 42 2e sltiu v0,r18,0x2 if r18<2 -v
800197ec 6e ff 40 14 bne v0,zero,ScreenLoop Loop again another screen
800197f0 04 00 29 25 _addiu t1,t1,0x4 SHIFT LOWER DMA TABLE MAIN ADDR
800197f4 04 00 82 96 lhu v0,0x4(r20_LineDMAParam) r2 = upper half of textParam+4
800197f8 00 00 00 00 nop
800197fc 01 00 42 24 addiu v0,v0,0x1 a += 1
80019800 04 00 82 a6 sh v0,0x4(r20_LineDMAParam) save half to textParams+4
80019804 00 00 c4 96 lhu r4,0x0(s6) r4 = load next Char (2 bytes)
80019808 00 00 00 00 nop
8001980c 00 10 82 2c sltiu v0,r4,0x1000 r2 = currentChar<1000h (is Char)
80019810 56 ff 40 14 bne v0,zero,LAB_8001956c if Char - make next char
80019814 02 00 d6 26 _addiu s6,s6,0x2 move current text addr
TextEnd XREF[1]: 80019550(j)
80019818 21 90 00 00 clear r18 r18 = 0
8001981c 08 80 13 3c lui s3,0x8008
80019820 d0 b6 75 26 addiu s5,s3,-0x4930 r19 = 80080000, r21 = 7b6d0
80019824 ff 00 11 3c lui s1,0xff r17 = 00ff0000
80019828 ff ff 31 36 ori s1,s1,0xffff r17 & ffff = 00ff ffff
8001982c 21 80 80 02 move s0,r20_LineDMAParam r16 = r20 (currentTLineParam)
80019830 21 28 00 00 clear r5
PageLoop XREF[1]: 8001988c(j)
80019834 01 00 06 24 li DMALinkAddr,0x1 r6=1
80019838 21 90 46 02 addu r18,r18,DMALinkAddr r18(Counter) += r6
8001983c 00 80 02 3c lui v0,0x8000 r2 = 80000000
80019840 00 ff 04 3c lui r4,0xff00 r4 = ff00 0000
80019844 d0 b6 63 8e lw v1,-0x4930(s3)=>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
80019848 a4 00 87 8f lw r7,0xa4(gp)=>DAT_8007b234 r7 = someParam(почти DMA)gp+a4 = 34
8001984c 24 18 71 00 and v1,v1,s1 r3 & 00FFFFFF
80019850 25 18 62 00 or v1,v1,v0 r3 | r2 = 80.....
80019854 30 00 03 ae sw v1,0x30(s0) store last free ChAddr to DMAParams
80019858 d0 b6 62 8e lw v0,-0x4930(s3)=>8007b6d0_freeChain r2 = next free chain
8001985c 00 00 63 8c lw v1,0x0(v1) r3 = *r3 = last chain - made one more chain
80019860 24 10 44 00 and v0,v0,r4 a2 & ff000000
80019864 24 18 71 00 and v1,v1,s1 r3 & 00FFFFFF
80019868 04 00 a4 8e lw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter r4 = DMA Counter
8001986c 25 10 43 00 or v0,v0,v1 r2 | r3
80019870 d0 b6 62 ae sw v0,-0x4930(s3)=>8007b6d0_freeChain new free chain addr add to *7b6b0
80019874 ff ff 84 24* addiu r4,r4,-0x1 DMA Cunter =- 1
80019878 04 00 a4 ae sw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter Store DMA Count
8001987c 30 00 04 8e lw r4,0x30(s0) r4 = *DMA params + 30 = Start Of DMA Chain
80019880 b3 50 01 0c jal SetDrawTPage Set DRAW PAGE
80019884 04 00 10 26 _addiu s0,s0,0x4 r16 += 4 - Shgift DMAParams for next Page
80019888 02 00 42 2e sltiu v0,r18,0x2 r2 = r18<2
8001988c e9 ff 40 14 bne v0,zero,PageLoop if not r2 then goto Loop
80019890 21 28 00 00 _clear r5 r5 = 0
80019894 21 10 80 02 move v0,r20_LineDMAParam r2 = DMAParamsMain
80019898 4c 00 bf 8f lw ra,local_4(sp)
8001989c 48 00 be 8f lw s8,local_8(sp)
800198a0 44 00 b7 8f lw s7,local_c(sp)
800198a4 40 00 b6 8f lw s6,local_10(sp)
800198a8 3c 00 b5 8f lw s5,local_14(sp)
800198ac 38 00 b4 8f lw r20_LineDMAParam,local_18(sp) VOSSTANAVL STEK
800198b0 34 00 b3 8f lw s3,local_1c(sp)
800198b4 30 00 b2 8f lw r18,local_20(sp)
800198b8 2c 00 b1 8f lw s1,local_24(sp)
800198bc 28 00 b0 8f lw s0,local_28(sp)
800198c0 08 00 e0 03 jr ra ret
800198c4 50 00 bd 27 _addiu sp,sp,0x50 Stek +50h

91
ghidra_src/charL.asm Normal file
View File

@@ -0,0 +1,91 @@
**************************************************************
* FUNCTION *
**************************************************************
undefined __stdcall makeCharPixels(undefined4 r4, undefi
assume gp = 0x8007b190
undefined v0:1 <RETURN>
undefined4 a0:4 r4
undefined4 a1:4 a1
undefined4 a2:4 isSmallChar XREF[1]: 8001a11c(W)
undefined4 t2:4 t2 XREF[1]: 8001a0f8(W)
undefined4 t1:4 t1 XREF[1]: 8001a118(W)
undefined4 a2:4 a2 XREF[1]: 8001a11c(W)
undefined2 HASH:5f64aad curByte
makeCharPixels XREF[4]: PrintTimeinSaveLoad?:8001621c(c),
CreateCharCopyToDMAChain:800198dc(c),
GenerateSmallChar:8001a298(c),
PrintPlayerNameInBattle!:8001b0ec(c)
8001a0f8 ac 00 8a 93 lbu t2,0xac(gp)=>DAT_8007b23c load colIndex(b) to r10 from 7b23c
assume gp = <UNKNOWN>
8001a0fc 09 00 c0 14 bne isSmallChar,zero,initSmFontAddr if r6 <> 0 then Branch (small text)
8001a100 21 40 80 00 _move t0,r4 load ScrathAddr to r8
8001a104 1e 80 03 3c lui v1,0x801e
8001a108 80 f4 63 34 ori v1,v1,0xf480 load font addr in mem to r3
8001a10c c0 10 05 00 sll v0,a1,0x3 r2 = a1 (r5) << 3
8001a110 21 10 45 00 addu v0,v0,a1 r2 += r5 (ITOGO r2 = r5*9)
8001a114 40 10 02 00 sll v0,v0,0x1 r2 << 1. ITOGO r2 = r5 * 18 (12h)
8001a118 21 48 43 00 addu t1,v0,v1 r9 (charAddr) = r2(offs)+r3(start) = 801F0224
8001a11c 50 68 00 08 j contLoadChar
8001a120 09 00 06 24 _li a2,0x9 r6 = charBytesLength = 9
initSmFontAddr XREF[1]: 8001a0fc(j)
8001a124 1e 80 03 3c lui v1,0x801e
8001a128 00 f0 63 34 ori v1,v1,0xf000 load font addr to r3 (801ef000)
8001a12c 40 10 05 00 sll v0,a1,0x1 r2 = r5 << 1 (*2)
8001a130 21 10 45 00 addu v0,v0,a1 r2 += r5 (it. *3)
8001a134 80 10 02 00 sll v0,v0,0x2 r2 << 2 (*4) (r2 = r5 *12)
8001a138 21 48 43 00 addu t1,v0,v1 r9 = r2(offs) + r3 (start)
8001a13c 06 00 06 24 li a2,0x6 r6 = byteslength = 6
contLoadChar XREF[1]: 8001a11c(j)
8001a140 21 10 c0 00 move v0,a2 r2 = r6 (counter)
8001a144 2f 00 40 10 beq v0,zero,charLoaded if counter=0 then branch
8001a148 ff ff c6 24 _addiu a2,a2,-0x1 dec r6
8001a14c 80 1f 07 3c lui a3,0x1f80
8001a150 e0 02 e7 34 ori a3,a3,0x2e0 set scratch convert addr r7 = 1f8002e0
charLoop XREF[1]: 8001a1fc(j)
8001a154 00 00 23 95 lhu v1=>DAT_801ef480_font12x12,0x0(CharF load upperhalf of char to r3
8001a158 00 00 00 00 nop
8001a15c 0f 00 64 30 andi r4,v1,0xf r4 = r3 & 0f - cutting left semibyte
8001a160 02 19 03 00 srl v1,v1,0x4 r3 >> 4
8001a164 0f 00 62 30 andi v0,v1,0xf r2 = r3 & 0f
8001a168 40 10 02 00 sll v0,v0,0x1 r2 << 1
8001a16c 21 10 47 00 addu v0,v0,a3 r2 = r2 + to4bitConvertTableAddr (r7)
8001a170 00 00 42 94 lhu v0,0x0(v0)=>DAT_1f8002e0 r2 = *r2(half) pixel pattern
8001a174 00 00 00 00 nop
8001a178 18 00 4a 00 mult v0,t2 r2*r10. make Color
8001a17c 40 20 04 00 sll r4,r4,0x1 r4 << 1
8001a180 21 20 87 00 addu r4,r4,a3 r4 += r6 counter
8001a184 12 28 00 00 mflo a1 load lo to r5
8001a188 00 00 82 94 lhu v0,0x0(r4)=>DAT_1f8002e0 load table+r4
8001a18c 00 00 00 00 nop
8001a190 18 00 4a 00 mult v0,t2 r2 * colorIndex r10
8001a194 02 19 03 00 srl v1,v1,0x4 r3 >> 4, right 4 bits
8001a198 0f 00 64 30 andi r4,v1,0xf r4 = r3 & f0 (cut right semibyte)
8001a19c 02 19 03 00 srl v1,v1,0x4 r3 >> 4
8001a1a0 40 18 03 00 sll v1,v1,0x1 r3 << 1 = *2
8001a1a4 21 18 67 00 addu v1,v1,a3 r3=r3+Table r7
8001a1a8 00 14 05 00 sll v0,a1,0x10 r2 = r5 << 10 bits
8001a1ac 12 60 00 00 mflo t4 load r12,low
8001a1b0 25 10 82 01 or v0,t4,v0 r2 = r12 | r2
8001a1b4 00 00 02 ad sw v0,0x0(t0) load *r8(current Scratch) from r2(result)
8001a1b8 00 00 62 94 lhu v0,0x0(v1)=>DAT_1f8002e0 load r2 from TablePattern Half from r3
8001a1bc 00 00 00 00 nop
8001a1c0 18 00 4a 00 mult v0,t2 r2*color r10
8001a1c4 40 20 04 00 sll r4,r4,0x1 r4 << 1
8001a1c8 21 20 87 00 addu r4,r4,a3 r4 = r4 + TableStart
8001a1cc 12 28 00 00 mflo a1 ld r5,lo
8001a1d0 00 00 82 94 lhu v0,0x0(r4)=>DAT_1f8002e0 ld half r2 from *r4
8001a1d4 00 00 00 00 nop
8001a1d8 18 00 4a 00 mult v0,t2 r2*col
8001a1dc 02 00 29 25 addiu t1,t1,0x2 move charFont + +2
8001a1e0 21 18 c0 00 move v1,a2 r3 = byteCount (r6)
8001a1e4 ff ff c6 24 addiu a2,a2,-0x1 r6 -= 1
8001a1e8 04 00 08 25 addiu t0,t0,0x4 scrathAddr r8 += 4
8001a1ec 00 14 05 00 sll v0,a1,0x10 r2 = r5 << 10 bits (move to hi)
8001a1f0 12 60 00 00 mflo t4 ld r12,lo (result)
8001a1f4 25 10 82 01 or v0,t4,v0 combine r2 & r 12 (0001 x 1111)
8001a1f8 00 00 02 ad sw v0,0x0(t0) store result to scratch r2 to *r8
8001a1fc d5 ff 60 14 bne v1,zero,charLoop if r3 counter<>0 goto loop
8001a200 04 00 08 25 _addiu t0,t0,0x4 r8 scrath += 4
charLoaded XREF[1]: 8001a144(j)
8001a204 08 00 e0 03 jr ra
8001a208 00 00 00 00 _nop

471
ghidra_src/small.asm Normal file
View File

@@ -0,0 +1,471 @@
**************************************************************
* FUNCTION *
**************************************************************
undefined __stdcall DrawSmallFontString(undefined4 r4, u
assume gp = 0x8007b190
undefined v0:1 <RETURN>
undefined4 a0:4 r4
undefined2 a1:2 r5
undefined2 a2:2 r6
undefined1 a3:1 r7
undefined1 Stack[0x10]:1 Shadow XREF[1]: 80019af8(R)
undefined2 s2:2 Y XREF[1]: 80019d40(W)
undefined2 s1:2 X XREF[1]: 80019d9c(W)
undefined4 Stack[-0x4]:4 local_4 XREF[2]: 80019b00(W),
8001a040(R)
undefined4 Stack[-0x8]:4 local_8 XREF[2]: 80019ac4(W),
8001a044(R)
undefined4 Stack[-0xc]:4 local_c XREF[2]: 80019aac(W),
8001a048(R)
undefined4 Stack[-0x10]:4 local_10 XREF[2]: 80019b04(W),
8001a04c(R)
undefined4 Stack[-0x14]:4 local_14 XREF[2]: 80019ae0(W),
8001a050(R)
undefined4 Stack[-0x18]:4 local_18 XREF[2]: 80019b08(W),
8001a054(R)
undefined4 Stack[-0x1c]:4 local_1c XREF[2]: 80019b0c(W),
8001a058(R)
undefined4 Stack[-0x20]:4 local_20 XREF[2]: 80019abc(W),
8001a05c(R)
undefined4 Stack[-0x24]:4 local_24 XREF[2]: 80019ad4(W),
8001a060(R)
undefined4 Stack[-0x28]:4 local_28 XREF[2]: 80019ab4(W),
8001a064(R)
undefined4 Stack[-0x30]:4 local_30 XREF[2]: 80019cf8(W),
80019d34(R)
undefined4 Stack[-0x34]:4 local_34 XREF[2]: 80019cec(W),
80019d28(R)
undefined4 Stack[-0x38]:4 local_38 XREF[2]: 80019b48(W),
80019d40(R)
undefined4 Stack[-0x3c]:4 local_3c XREF[2,1]: 80019b7c(W),
80019ba8(R),
80019b84(W)
uint Stack[-0x40]:4 tempCoordsInVram_01f00130 XREF[2,1]: 80019bb0(W),
80019bb8(R),
80019bb4(W)
undefined1 HASH:5f6f43d currentCharCode
undefined4 HASH:23f572d tempVar
DrawSmallFontString XREF[12]: FUN_OVR_EXT__80096f94:80097148(c),
FUN_OVR_EXT__80096f94:8009719c(c),
FUN_OVR_EXT__80096f94:80097204(c),
FUN_OVR_EXT__80096f94:8009725c(c),
FUN_OVR_EXT__80096f94:8009730c(c),
FUN_OVR_EXT__80098f88:80099024(c),
drawMenu2x4:8009ce24(c),
FUN_OVR_EXT__8009e218:8009e498(c),
FUN_OVR_EXT__8009e218:8009e6f4(c),
FUN_OVR_EXT__8009e954:8009eac4(c),
FUN_OVR_EXT2_0092__800bb83c:800bbb38(c),
FUN_OVR_EXT2_0092__800c4578:800c45b0(c)
80019aa8 b0 ff bd 27 addiu sp,sp,-0x50 shift stack -50
assume gp = <UNKNOWN>
80019aac 44 00 b7 af sw s7,local_c(sp) save r23, sp+44
80019ab0 21 b8 80 00 move s7,r4 r23 = r4 (textAddr)
80019ab4 28 00 b0 af sw s0,local_28(sp) *sp+28, r16
80019ab8 21 80 a0 00 move s0,r5 r16=r5
80019abc 30 00 b2 af sw s2,local_20(sp) *sp+30, r18
80019ac0 21 90 c0 00 move s2,r6 r18 = r6
80019ac4 48 00 be af sw s8,local_8(sp) *sp+48 = r30
80019ac8 21 f0 00 02 move s8,s0 r30 = r16
80019acc ff 00 08 3c lui t0,0xff
80019ad0 ff ff 08 35 ori t0,t0,0xffff r8 = 00ffffff
80019ad4 2c 00 b1 af sw s1,local_24(sp) *sp+2c = r17
80019ad8 ff 00 f1 30 andi s1,r7,0xff r17 = r7 & ff (color & shadow)
80019adc 21 20 20 02 move r4,s1 r4 = r17
80019ae0 3c 00 b5 af sw s5,local_14(sp) *sp+3c = r21
80019ae4 08 80 15 3c lui s5,0x8008 r21 = 80080000
80019ae8 00 ff 06 3c lui r6,0xff00 r6 = ff000000
80019aec 00 80 02 3c lui v0,0x8000 r2 = 8000 0000
80019af0 21 68 a0 02 move t5,s5 r13 = r21
80019af4 d0 b6 a3 8e lw v1,-0x4930(s5)=>8007b6d0_freeChain r3 = *freeChain
80019af8 60 00 a7 8f lw r7,Shadow(sp) r7 = sp+60
80019afc d0 b6 ad 25 addiu t5,t5,-0x4930 t5 -= 4930 = 8007b640 (freeChain)
80019b00 4c 00 bf af sw ra,local_4(sp) *sp+4c = ra
80019b04 40 00 b6 af sw s6,local_10(sp) *sp+40 = r22
80019b08 38 00 b4 af sw s4,local_18(sp) *sp+38 = r20
80019b0c 34 00 b3 af sw s3,local_1c(sp) *sp+34 = r19
80019b10 24 30 66 00 and r6,v1,r6 r6 & r3 (freeChain)
80019b14 ff 00 e5 30 andi r5,r7,0xff r5 = r7 & ff
80019b18 24 18 68 00 and v1,v1,t0 r3 & 00FFFFFF
80019b1c 25 a0 62 00 or s4,v1,v0 r20 = r3 | 8000000 (80..+r3)
80019b20 10 00 e7 30 andi r7,r7,0x10 r7 & 10 (2nd bit only)
80019b24 2b 38 07 00 sltu r7,zero,r7 r7 = 0<r7 (is 2nd bit if shad ON?)
80019b28 04 00 a2 8d lw v0,0x4(t5)=>DAT_8007b6d4_CmdCounter r2 = *DMACounter
80019b2c 00 00 83 8e lw v1,0x0(s4) r3 = *r20 - next chain addr
80019b30 ff ff 42 24 addiu v0,v0,-0x1 DMACounter -1
80019b34 24 18 68 00 and v1,v1,t0 r3 & 00FFFFFF
80019b38 25 30 c3 00 or r6,r6,v1 r6 = FF... | r3
80019b3c 04 00 a2 ad sw v0,0x4(t5)=>DAT_8007b6d4_CmdCounter save DMACounter
80019b40 d0 b6 a6 ae sw r6,-0x4930(s5)=>8007b6d0_freeChain save next free chain to 7b6do
80019b44 32 6c 00 0c jal store_Color_to_addr undefined store_Color_to_addr(undefined1 ColIndex, undefine
80019b48 18 00 a7 af _sw r7,local_38(sp) r7 = sp+18, color
80019b4c 21 20 80 02 move r4,s4 r4 = r20 (cur new chain)
80019b50 00 84 10 00 sll s0,s0,0x10 r16 << 10 (log) Cleaning coords
80019b54 03 2c 10 00 sra r5,s0,0x10 r5 = r16 >> 10 (ar)
80019b58 00 94 12 00 sll s2,s2,0x10 r18 << 10 (log)
80019b5c 03 84 12 00 sra s0,s2,0x10 r16 = r18 >> 10 (ar)
80019b60 21 30 00 02 move r6,s0 r6 = r16
80019b64 1c 68 00 0c jal initCopycharChain INIT TEXT CHAIN
80019b68 21 38 20 02 _move r7,s1 r7 = r17 (color)
80019b6c 80 1f 05 3c lui r5,0x1f80 r5 = 1f800348 - chain params start
80019b70 48 03 a5 34 ori r5,r5,0x348
80019b74 02 00 02 24 li v0,0x2 r2 = 2, r7 = 0c (size)
80019b78 0c 00 07 24 li r7,0xc
80019b7c 14 00 a2 a7 sh v0,local_3c(sp) *sp+14 = half r2 (heigth)
80019b80 10 00 02 24 li v0,0x10
80019b84 16 00 a7 a7 sh r7,local_3c+0x2(sp) *sp+16 = half r7 (color?)
80019b88 03 00 a2 a0 sb v0,0x3(r5)=>DAT_1f80034b *34b = byte r2 (10) DMALenght
80019b8c 00 a0 02 3c lui v0,0xa000 r2 = a000000
80019b90 04 00 a2 ac sw v0,0x4(r5)=>DAT_1f80034c *34c = r2 (a000000) DMA cmd
80019b94 a0 00 83 97 lhu v1,0xa0(gp)=>VRam_Temp_Char_x r3 = half gp+a0 (x)
80019b98 a2 00 84 97 lhu r4,0xa2(gp)=>VRam_Temp_Char_y r4 = half gp+a2 (y)
80019b9c 00 01 02 3c lui v0,0x100 r2 = 01000000 - FlushCache
80019ba0 80 1f 01 3c lui at,0x1f80 at = 1f800000
80019ba4 88 03 22 ac sw v0,offset DAT_1f800388(at) *at+388 = r2
80019ba8 14 00 a2 8f lw v0,local_3c(sp) r2 = sp+14 - w*h (0c*02)!
80019bac 80 1f 13 3c lui s3,0x1f80 r19 = 1f80
80019bb0 10 00 a3 a7 sh v1,tempCoordsInVram_01f00130(sp) *sp+10 = half r3
tempCoordsInVram_01f00130
80019bb4 12 00 a4 a7 sh r4,tempCoordsInVram_01f00130+0x2(sp) *sp+12 = half r4
80019bb8 10 00 a3 8f lw v1,tempCoordsInVram_01f00130(sp) r3 = sp+10 - Temp coords
80019bbc a0 00 84 87 lh r4,0xa0(gp)=>VRam_Temp_Char_x r4 (signed half?) = gp+a0
80019bc0 d0 03 73 36 ori s3,s3,0x3d0 r19 | 3d0 = 1f8003d0
80019bc4 0c 00 a2 ac sw v0,0xc(r5)=>DAT_1f800354 *354 = r2 (Temp char Size)
80019bc8 01 80 02 3c lui v0,0x8001 r2 = 8001
80019bcc 21 30 80 00 move r6,r4 r6 = r4 (x)
80019bd0 08 00 a3 ac sw v1,0x8(r5)=>DAT_1f800350 *350 = r3 = temp coords (01f0 0130)
80019bd4 80 1f 0d 3c lui t5,0x1f80 r13 = 1f80
80019bd8 e0 02 ad 35 ori t5,t5,0x2e0 r13 | 2e0
80019bdc e8 03 58 24 addiu t8,v0,0x3e8 r24 = r2 + 3e0 = 800103e0
80019be0 03 00 0e 8b lwl t6,0x3(t8)
80019be4 00 00 0e 9b lwr t6,0x0(t8)=>DAT_800103e8 = 00010000h
80019be8 07 00 0f 8b lwl t7,0x7(t8)
80019bec 04 00 0f 9b lwr t7,0x4(t8)=>DAT_800103ec = 00110010h
80019bf0 03 00 ae a9 swl t6,0x3(t5)
80019bf4 00 00 ae b9 swr t6,0x0(t5)=>DAT_1f8002e0 = ??
80019bf8 07 00 af a9 swl t7,0x7(t5)
80019bfc 04 00 af b9 swr t7,0x4(t5)=>DAT_1f8002e4 = ??
80019c00 0b 00 0e 8b lwl t6,0xb(t8)
80019c04 08 00 0e 9b lwr t6,0x8(t8)=>DAT_800103f0 = 01010100h
80019c08 0f 00 0f 8b lwl t7,0xf(t8)
80019c0c 0c 00 0f 9b lwr t7,0xc(t8)=>DAT_800103f4 = 01110110h
80019c10 0b 00 ae a9 swl t6,0xb(t5)
80019c14 08 00 ae b9 swr t6,0x8(t5)=>DAT_1f8002e8 Init 4bits table
80019c18 0f 00 af a9 swl t7,0xf(t5)
80019c1c 0c 00 af b9 swr t7,0xc(t5)=>DAT_1f8002ec = ??
80019c20 13 00 0e 8b lwl t6,0x13(t8)
80019c24 10 00 0e 9b lwr t6,0x10(t8)=>DAT_800103f8 = 10011000h
80019c28 17 00 0f 8b lwl t7,0x17(t8)
80019c2c 14 00 0f 9b lwr t7,0x14(t8)=>DAT_800103fc = 10111010h
80019c30 13 00 ae a9 swl t6,0x13(t5)
80019c34 10 00 ae b9 swr t6,0x10(t5)=>DAT_1f8002f0 = ??
80019c38 17 00 af a9 swl t7,0x17(t5)
80019c3c 14 00 af b9 swr t7,0x14(t5)=>DAT_1f8002f4 = ??
80019c40 1b 00 0e 8b lwl t6,0x1b(t8)
80019c44 18 00 0e 9b lwr t6,0x18(t8)=>DAT_80010400 = 11011100h
80019c48 1f 00 0f 8b lwl t7,0x1f(t8)
80019c4c 1c 00 0f 9b lwr t7,0x1c(t8)=>DAT_80010404 = 11111110h
80019c50 1b 00 ae a9 swl t6,0x1b(t5)
80019c54 18 00 ae b9 swr t6,0x18(t5)=>DAT_1f8002f8 = ??
80019c58 1f 00 af a9 swl t7,0x1f(t5)
80019c5c 1c 00 af b9 swr t7,0x1c(t5)=>DAT_1f8002fc = ??
80019c60 04 00 02 24 li v0,0x4
80019c64 03 00 62 a2 sb v0,0x3(s3)=>DAT_1f8003d3 = ??
80019c68 64 00 02 24 li v0,0x64
80019c6c 07 00 62 a2 sb v0,0x7(s3)=>DAT_1f8003d7 = ??
80019c70 80 00 02 24 li v0,0x80
80019c74 04 00 62 a2 sb v0,0x4(s3)=>DAT_1f8003d4 = ??
80019c78 05 00 62 a2 sb v0,0x5(s3)=>DAT_1f8003d5 save 04, 64808080 cmds bytes to Scratch
80019c7c 02 00 81 04 bgez r4,x>0 if r4>=0 then branch
80019c80 06 00 62 a2 _sb v0,0x6(s3)=>DAT_1f8003d6 last 80
80019c84 3f 00 86 24 addiu r6,r4,0x3f ELSE r6 = r4(X)+3f???
x>0 XREF[1]: 80019c7c(j)
80019c88 83 11 06 00 sra v0,r6,0x6 r2 = r6 >> 6 = 4
80019c8c 80 11 02 00 sll v0,v0,0x6 r2 << 6 = 100
80019c90 23 10 82 00 subu v0,r4,v0 r2 = r6 - r2 = 30
80019c94 a2 00 83 87 lh v1,0xa2(gp)=>VRam_Temp_Char_y r3 = load Y half from mem
80019c98 80 10 02 00 sll v0,v0,0x2 r2 << 2
80019c9c 0c 00 62 a2 sb v0,0xc(s3)=>DAT_1f8003dc *3dc = byte r2 (X)
80019ca0 02 00 61 04 bgez v1,y>0 IF r3>=0 goto...
80019ca4 21 10 60 00 _move v0,v1 r2 = r3 (Y)
80019ca8 ff 00 62 24 addiu v0,v1,0xff ELSE r2 = r3+ff
y>0 XREF[1]: 80019ca0(j)
80019cac 03 12 02 00 sra v0,v0,0x8 r2 >> 8
80019cb0 00 12 02 00 sll v0,v0,0x8 r2 << 8
80019cb4 23 10 62 00 subu v0,v1,v0 r2 = r3-r2
80019cb8 0d 00 62 a2 sb v0,0xd(s3)=>DAT_1f8003dd *3dd byte = r2 (Y)
80019cbc a8 00 83 97 lhu v1,0xa8(gp)=>DAT_8007b238 r3 = XYhalf(7df3)
80019cc0 08 00 02 24 li v0,0x8 r2 = 8 Sprite WIDTH
80019cc4 10 00 62 a6 sh v0,0x10(s3)=>DAT_1f8003e0 *3e0 = r2 (8)
80019cc8 12 00 67 a6 sh r7,0x12(s3)=>DAT_1f8003e2 *3e2 = r7 (0c) - sprite heigth
80019ccc 0e 00 63 a6 sh v1,0xe(s3)=>DAT_1f8003de *3de = r3 = 7df3
80019cd0 00 00 e5 92 lbu r5,0x0(s7) r5 = byte unsigned *r23 READING TEXT CODE
80019cd4 00 00 00 00 nop
80019cd8 b9 00 a0 10 beq r5,zero,textEnd if CHAR is 0 - end
80019cdc 01 00 f7 26 _addiu s7,s7,0x1 CHAR addr +=1
80019ce0 21 b0 a0 02 move s6,s5 r22 = r21
80019ce4 08 80 15 3c lui s5,0x8008 r21 = 8008
80019ce8 d0 b6 b5 26 addiu s5,s5,-0x4930 r21 = 7b6d0 (free chain)
80019cec 1c 00 b0 af sw s0,local_34(sp) sp+1c = r16 (X)
80019cf0 ff 00 10 3c lui s0,0xff
80019cf4 ff ff 10 36 ori s0,s0,0xffff r16 = 00FFFFFF
80019cf8 20 00 b2 af sw s2,local_30(sp) *sp+20 = r18
LAB_80019cfc XREF[1]: 80019fb8(j)
80019cfc 99 ff a3 24 addiu v1,r5,-0x67 r3 = r5-67 = CHAR code shift
80019d00 13 00 62 2c sltiu v0,v1,0x13 r2 = r3 <= 13
80019d04 0b 00 40 10 beq v0,zero,switchD_80019d20::r3<=13 r2=0? -> r3 > 13 -> goto Switch
80019d08 80 10 03 00 _sll v0,v1,0x2 r2 = r3 << 2 (*4) cmdID
80019d0c 01 80 0e 3c lui t6,0x8001 r14 = 8001 0000
80019d10 a0 04 ce 25 addiu t6,t6,0x4a0 r14 & 04a0
80019d14 21 10 4e 00 addu v0,v0,t6 r2 += t6 (command table)
80019d18 00 00 42 8c lw v0,0x0(v0)=>->switchD_80019d20::case r2 = *r2 (cmd addr)
80019d1c 00 00 00 00 nop
switchD_80019d20::switchD
80019d20 08 00 40 00 jr v0 --CALL R2 SWITCH--
80019d24 00 00 00 00 _nop
switchD_80019d20::caseD_6a XREF[6]: 800104a0(*), 800104ac(*), 800104c4(*),
switchD_80019d20::caseD_70 800104c8(*), 800104e8(*), 80019d20(j)
switchD_80019d20::caseD_71
switchD_80019d20::caseD_79
switchD_80019d20::caseD_67
80019d28 1c 00 af 8f lw t7,local_34(sp) r15 = *sp+1c
80019d2c 50 67 00 08 j LAB_80019d40
80019d30 02 00 f2 25 _addiu s2,t7,0x2 s2 = r15 + 2??
switchD_80019d20::caseD_69 XREF[16]: 800104a4(*), 800104a8(*), 800104b0(*),
switchD_80019d20::caseD_6b 800104b4(*), 800104b8(*), 800104bc(*),
switchD_80019d20::caseD_6c 800104c0(*), 800104cc(*), 800104d0(*),
switchD_80019d20::caseD_6d 800104d4(*), 800104d8(*), 800104dc(*),
switchD_80019d20::caseD_6e 800104e0(*), 800104e4(*), 80019d04(j),
switchD_80019d20::caseD_6f 80019d20(j)
switchD_80019d20::caseD_72
switchD_80019d20::caseD_73
switchD_80019d20::caseD_74
switchD_80019d20::caseD_75
switchD_80019d20::caseD_76
switchD_80019d20::caseD_77
switchD_80019d20::caseD_78
switchD_80019d20::r3<=13
80019d34 20 00 b8 8f lw t8,local_30(sp) r24 = *sp+20 (shifted Y??)
80019d38 00 00 00 00 nop
80019d3c 03 94 18 00 sra s2,t8,0x10 r18 = r24 >> 10 - shift coord back
LAB_80019d40 XREF[1]: 80019d2c(j)
80019d40 18 00 ad 8f lw t5,local_38(sp) r13 = *sp+18 (color & shadow)
80019d44 00 00 00 00 nop
80019d48 10 00 a0 11 beq t5,zero,LAB_80019d8c if shadow (r13=0) then Branch
80019d4c e0 ff a5 24 _addiu r5,r5,-0x20 curCharCode -= 20
80019d50 01 80 02 3c lui v0,0x8001
80019d54 3c 04 42 24 addiu v0,v0,0x43c r2 = 8001043c
80019d58 21 10 a2 00 addu v0,r5,v0 r2 += r5
80019d5c 01 80 03 3c lui v1,0x8001 r3 = 80010000
80019d60 00 00 42 90 lbu v0,0x0(v0)=>DAT_8001041c r2 = *r2 byte
80019d64 28 04 63 24 addiu v1,v1,0x428 r3 & 428 = 80010428
80019d68 40 10 02 00 sll v0,v0,0x1 r2 << 1
80019d6c 21 10 43 00 addu v0,v0,v1 r2 += r3
80019d70 00 00 43 90 lbu v1=>DAT_80010428,0x0(v0) r3 = byte *r2
80019d74 01 00 42 90 lbu v0,0x1(v0)=>DAT_80010429 r2 = byte *r2+1
80019d78 23 18 c3 03 subu v1,s8,v1
80019d7c 00 24 03 00 sll r4,v1,0x10
80019d80 03 8c 04 00 sra s1,r4,0x10
80019d84 68 67 00 08 j LAB_80019da0
80019d88 21 f0 43 00 _addu s8,v0,v1
LAB_80019d8c XREF[1]: 80019d48(j)
80019d8c 00 1c 1e 00 sll v1,s8,0x10 r3 = fp(r30???) << 10b
80019d90 04 00 82 96 lhu v0,0x4(s4) r2 = r20+4* (DMA PArams+4)(charnum)
80019d94 03 1c 03 00 sra v1,v1,0x10 r3 >> 10 (ar) - INIT X
80019d98 c0 10 02 00 sll v0,v0,0x3 r2 << 3 (l) charnum * 8
80019d9c 21 88 62 00 addu X,v1,v0 r17 (x) = r2+r3 (initX+r2)
addr = 1f800358?
LAB_80019da0 XREF[1]: 80019d84(j)
80019da0 a1 68 00 0c jal GenerateSmallChar undefined GenerateSmallChar()
80019da4 21 20 a0 00 _move r4,r5 r4 = r5 = Y?
80019da8 00 80 0c 3c lui t4,0x8000 r12 = 80000000
80019dac 00 ff 0a 3c lui t2,0xff00 r10 = ff000000
80019db0 21 48 80 02 move t1,s4 r9 = r20 (current dma line params)
80019db4 80 1f 0b 3c lui t3,0x1f80 r11 = 1f800388 (free dma chain????)
80019db8 88 03 6b 35 ori t3,t3,0x388
80019dbc 21 40 80 02 move t0,s4 r8 = r20 (another dma line params)
80019dc0 08 00 71 a6 sh X,0x8(s3)=>DAT_1f8003d8 *DMAScr(r19+8,3d0+8) = half r17 (X)
80019dc4 0a 00 72 a6 sh Y,0xa(s3)=>DAT_1f8003da *DMAScr(r19+0a,3d0+0a) = half r18 (Y)
PageLoop XREF[1]: 80019f98(j)
80019dc8 d0 b6 c2 8e lw v0,-0x4930(s6)=>8007b6d0_freeChain r2 = *freeChainAddr
80019dcc 00 00 00 00 nop
80019dd0 24 20 4a 00 and r4,v0,t2 r4 = r2 & ff00..
80019dd4 24 10 50 00 and v0,v0,s0 r2 & 00FFFFFF
80019dd8 25 28 4c 00 or r5,v0,t4 r5 = 80 & r2
80019ddc 04 00 a2 8e lw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter r2 = DMA Counter
80019de0 00 00 a3 8c lw v1,0x0(r5) r3 = New Free ChainAddr
80019de4 ff ff 42 24 addiu v0,v0,-0x1 r2 -= 1 Counter Down
80019de8 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF cut begin byte
80019dec 25 20 83 00 or r4,r4,v1 r4 & r3 = ff......
80019df0 04 00 a2 ae sw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter save DMA Counter
80019df4 d0 b6 c4 ae sw r4,-0x4930(s6)=>8007b6d0_freeChain save new freeChain
CopyScriptChain copy from scratch
80019df8 00 00 6e 8e lw t6,0x0(s3)=>DAT_1f8003d0 r14 = 04000000 - DMA Commands Count
80019dfc 04 00 6f 8e lw t7,0x4(s3)=>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd
80019e00 08 00 78 8e lw t8,0x8(s3)=>DAT_1f8003d8 r24 = 001500d1 - xy screen coords
80019e04 0c 00 6d 8e lw t5,0xc(s3)=>DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page)
80019e08 00 00 ae ac sw t6,0x0(r5) *r5 = r14
80019e0c 04 00 af ac sw t7,0x4(r5) *r5+4 = r15
80019e10 08 00 b8 ac sw t8,0x8(r5) *r5+8 = r24
80019e14 0c 00 ad ac sw t5,0xc(r5) *r5+c = r13
80019e18 10 00 6e 8e lw t6,0x10(s3)=>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
80019e1c 00 00 00 00 nop
80019e20 10 00 ae ac sw t6,0x10(r5) *r5+10 = r14
CharMakeChain?
80019e24 18 00 03 8d lw v1,0x18(t0) r3 = *r8+18 (first chain addr?)
80019e28 00 00 a2 8c lw v0,0x0(r5) r2 = *curChainaddr
80019e2c 00 00 63 8c lw v1,0x0(v1) r3 = *r3
80019e30 24 10 4a 00 and v0,v0,t2 r2 & ff000000
80019e34 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF
80019e38 25 10 43 00 or v0,v0,v1 r2 | r3 = 04FFFFFF - commands with FFFFFF
80019e3c 00 00 a2 ac sw v0,0x0(r5) *curChainAddr r5 = r2 (upd ..04 with ..FF04)
80019e40 18 00 04 8d lw r4,0x18(t0) r4 = *r8+18 (first chain addr?)
80019e44 00 00 00 00 nop
80019e48 00 00 82 8c lw v0,0x0(r4) r2 = *r4 FIRST CHAIN LINK TO NEXT??
80019e4c 24 18 b0 00 and v1,r5,s0 r3 = r5 (cur chain) & 00FFFFFF
80019e50 24 10 4a 00 and v0,v0,t2 r2 & FF000000
80019e54 25 10 43 00 or v0,v0,v1 r2 | r3 = last chain adr w 10&....
80019e58 00 00 82 ac sw v0,0x0(r4) *r4 = r2 FIRST CHAIN NEXT ADDR???
80019e5c 18 00 05 ad sw r5,0x18(t0) t0 - main ChainParams r5 = *r8+18 curChainAddr
80019e60 04 00 22 95 lhu v0,0x4(t1) t1 - page ChainParams r2 = half (DMA params)+4 (charCounter)
80019e64 00 00 00 00 nop
80019e68 04 00 40 14 bne v0,zero,NotFirstChar if CharCount<>0 then Goto...
80019e6c 00 00 00 00 _nop
80019e70 28 00 05 ad sw r5,0x28(t0) *curChain+28 = currentChainAddr
80019e74 0c 00 31 a5 sh X,0xc(t1) Params+0c = save half X
80019e78 0e 00 32 a5 sh Y,0xe(t1) Params+0e = save half Y
COPYCHAR To DMAChain
NotFirstChar XREF[1]: 80019e68(j)
80019e7c 80 1f 05 3c lui r5,0x1f80 r5 = *1f80
80019e80 d0 b6 c2 8e lw v0,-0x4930(s6)=>8007b6d0_freeChain r2 = *nextFreeChain
80019e84 48 03 a5 34 ori r5,r5,0x348 r5 | 1f800348 = Scratch CharData
80019e88 24 20 4a 00 and r4,v0,t2 r4 = r2 & FF000000
80019e8c 24 10 50 00 and v0,v0,s0 r2 & 00FFFFFF
80019e90 25 38 4c 00 or r7,v0,t4 r7 = r2 | r12 = nextChain & 80...
80019e94 21 30 e0 00 move r6,r7 r6 = r7 (nextChain)
80019e98 04 00 a2 8e lw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter r2 = chainCounter*
80019e9c 00 00 e3 8c lw v1,0x0(r7) r3 = *nextChainNextAddr
80019ea0 ff ff 42 24 addiu v0,v0,-0x1 r2 -= 1
80019ea4 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF
80019ea8 25 20 83 00 or r4,r4,v1 r4 | r3 = FF..nextchain (cutCmdCount)
80019eac 04 00 a2 ae sw v0,0x4(s5)=>DAT_8007b6d4_CmdCounter *cmdCountr = r2 = save
80019eb0 03 00 e2 30 andi v0,r7,0x3 r2 = r7 & 3 (check destAddr MOD 4)
80019eb4 16 00 40 10 beq v0,zero,Copy16Bytes if r7 MOD 4 = 0 then Branch
80019eb8 d0 b6 c4 ae _sw r4,-0x4930(s6)=>8007b6d0_freeChain *nextFreeChain = r4
CopyBy2Bytes XREF[1]: 80019f00(j)
80019ebc 03 00 ae 88 lwl t6,0x3(r5) if r7 mod4 <> 0 - копируем по 2 байта
80019ec0 00 00 ae 98 lwr t6,0x0(r5)=>DAT_1f800348 = ??
80019ec4 07 00 af 88 lwl t7,0x7(r5)
80019ec8 04 00 af 98 lwr t7,0x4(r5)=>DAT_1f80034c = ??
80019ecc 0b 00 b8 88 lwl t8,0xb(r5)
80019ed0 08 00 b8 98 lwr t8,0x8(r5)=>DAT_1f800350 = ??
80019ed4 0f 00 ad 88 lwl t5,0xf(r5)
80019ed8 0c 00 ad 98 lwr t5,0xc(r5)=>DAT_1f800354 = ??
80019edc 03 00 ce a8 swl t6,0x3(r6)
80019ee0 00 00 ce b8 swr t6,0x0(r6)
80019ee4 07 00 cf a8 swl t7,0x7(r6)
80019ee8 04 00 cf b8 swr t7,0x4(r6)
80019eec 0b 00 d8 a8 swl t8,0xb(r6)
80019ef0 08 00 d8 b8 swr t8,0x8(r6)
80019ef4 0f 00 cd a8 swl t5,0xf(r6)
80019ef8 0c 00 cd b8 swr t5,0xc(r6)
80019efc 10 00 a5 24 addiu r5,r5,0x10
80019f00 ee ff ab 14 bne r5,t3,CopyBy2Bytes
80019f04 10 00 c6 24 _addiu r6,r6,0x10
80019f08 cf 67 00 08 j last4BytesCopy
80019f0c 00 00 00 00 _nop
Copying Char Data From Scratch
Copy16Bytes XREF[2]: 80019eb4(j), 80019f34(j)
80019f10 00 00 ae 8c lw t6,0x0(r5)=>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
80019f14 04 00 af 8c lw t7,0x4(r5)=>DAT_1f80034c = ??
80019f18 08 00 b8 8c lw t8,0x8(r5)=>DAT_1f800350 = ??
80019f1c 0c 00 ad 8c lw t5,0xc(r5)=>DAT_1f800354 = ??
80019f20 00 00 ce ac sw t6,0x0(r6)
80019f24 04 00 cf ac sw t7,0x4(r6) Copy cmdCnt + A0000000 + 013001F0 + 000C0002
80019f28 08 00 d8 ac sw t8,0x8(r6) Copy 16bytes*4 times
80019f2c 0c 00 cd ac sw t5,0xc(r6)
80019f30 10 00 a5 24 addiu r5,r5,0x10
80019f34 f6 ff ab 14 bne r5,t3,Copy16Bytes
80019f38 10 00 c6 24 _addiu r6,r6,0x10
last4BytesCopy XREF[1]: 80019f08(j)
80019f3c 03 00 ae 88 lwl t6,0x3(r5) r14 left = 2 bytes from *r5+3
80019f40 00 00 ae 98 lwr t6,0x0(r5)=>DAT_1f800358 r14 right = 2 bytes from *r5
80019f44 00 00 00 00 nop
80019f48 03 00 ce a8 swl t6,0x3(r6) *r6 = r14 left
80019f4c 00 00 ce b8 swr t6,0x0(r6) *r6+3 = r14 right
linking DMA char+copysprite
80019f50 18 00 03 8d lw v1,0x18(t0) r3 = current DMACopySprite Chain
80019f54 00 00 e2 8c lw v0,0x0(r7) r2 = current CharChainCommands
80019f58 00 00 63 8c lw v1,0x0(v1) r3 = *r3 (comNum+FFFFFF(nextLink))
80019f5c 24 10 4a 00 and v0,v0,t2 r2 & FF.....
80019f60 24 18 70 00 and v1,v1,s0 r3 & 00FFFFFF
80019f64 25 10 43 00 or v0,v0,v1 r2 | r3 = 10FFFFFF(cmdNum&FF..)
80019f68 00 00 e2 ac sw v0,0x0(r7) *r7 = r2 saveCurChainCmd
80019f6c 18 00 04 8d lw r4,0x18(t0) r4 = r8+18h - cur CopySpriteCmd hdrAddr
80019f70 00 00 00 00 nop
80019f74 00 00 82 8c lw v0,0x0(r4) r2 = *r4 (04FFFFFF)
80019f78 24 18 f0 00 and v1,r7,s0 r3 = r7 & 00FFFFFF (Copying Cur Char Chain)
80019f7c 24 10 4a 00 and v0,v0,t2 r2 & FF000000 (04000000) CmdCount
80019f80 25 10 43 00 or v0,v0,v1 R2 | R3 = 04(cmd)..+CharChainAddr
80019f84 00 00 82 ac sw v0,0x0(r4) *r4 = r2 = FullCommand With Link!!!
(04..CharAddr) + SpriteCopyCommand
80019f88 18 00 07 ad sw r7,0x18(t0) *r8+18 = Last Char Chain!
80019f8c 04 00 08 25 addiu t0,t0,0x4 r8 (params) += 4 (shift params for NextPage)
80019f90 08 00 22 25 addiu v0,t1,0x8 r2 = r9+8 (shift first chain param for Page)
80019f94 2b 10 02 01 sltu v0,t0,v0 r2 = r8 < r2(r9+8) (first page pass)
80019f98 8b ff 40 14 bne v0,zero,PageLoop if r2<>0 (r8<r2) then goto Next Page Loop
80019f9c 00 00 00 00 _nop
80019fa0 04 00 82 96 lhu v0,0x4(s4) r2 = *r20+4 = charCount
80019fa4 00 00 00 00 nop
80019fa8 01 00 42 24 addiu v0,v0,0x1 r2+=1
80019fac 04 00 82 a6 sh v0,0x4(s4) *charCount += 1
80019fb0 00 00 e5 92 lbu r5,0x0(s7) load next Char to r5 (byte)
80019fb4 00 00 00 00 nop
80019fb8 50 ff a0 14 bne r5,zero,LAB_80019cfc if char<>0 then goto MAKE CHAR
80019fbc 01 00 f7 26 _addiu s7,s7,0x1 charAddr += 1
textEnd XREF[1]: 80019cd8(j)
80019fc0 21 90 00 00 clear Y r18 = 0
80019fc4 08 80 13 3c lui s3,0x8008
80019fc8 d0 b6 75 26 addiu s5,s3,-0x4930 r21 = 8007b6d0 = next Free chain Addr
80019fcc ff 00 11 3c lui X,0xff
80019fd0 ff ff 31 36 ori X,X,0xffff r17 = 00FFFFFF
80019fd4 21 80 80 02 move s0,s4 r16 = r20 DMAChain ParamsAddr
80019fd8 21 28 00 00 clear r5 r5 = 0
callPageChain XREF[1]: 8001a034(j)
80019fdc 01 00 06 24 li r6,0x1 r6 = 1
80019fe0 21 90 46 02 addu Y,Y,r6 r18 += r6 (page counter)
80019fe4 00 80 02 3c lui v0,0x8000 r2 = 8000 0000
80019fe8 00 ff 04 3c lui r4,0xff00 r4 = ff000000
80019fec d0 b6 63 8e lw v1,-0x4930(s3)=>8007b6d0_freeChain r3 = *freeChain
80019ff0 a4 00 87 8f lw r7,0xa4(gp)=>DAT_8007b234 r7 = gp+a4 (34h)
80019ff4 24 18 71 00 and v1,v1,X r3 & FF000000
80019ff8 25 18 62 00 or v1,v1,v0 r3 | r2 = 80...freechain)
80019ffc 30 00 03 ae sw v1,0x30(s0) r3 = *r16+30 = last Chain Addr to params
8001a000 d0 b6 62 8e lw v0,-0x4930(s3)=>8007b6d0_freeChain r2 = nextFreeChain
8001a004 00 00 63 8c lw v1,0x0(v1) r3=*r3
8001a008 24 10 44 00 and v0,v0,r4 r2 & FF000000
8001a00c 24 18 71 00 and v1,v1,X r3 & 00FFFFFF
8001a010 04 00 a4 8e lw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter r4 = cmdCounter*
8001a014 25 10 43 00 or v0,v0,v1 r2 | r3
8001a018 d0 b6 62 ae sw v0,-0x4930(s3)=>8007b6d0_freeChain *nexFreechain = r2
8001a01c ff ff 84 24 addiu r4,r4,-0x1 r4 -= 1
8001a020 04 00 a4 ae sw r4,0x4(s5)=>DAT_8007b6d4_CmdCounter save *cmdCounter r4
8001a024 30 00 04 8e lw r4,0x30(s0) r4 = *r16+30 = last Chain Addr to params
8001a028 b3 50 01 0c jal SetDrawTPage call DrawChain
8001a02c 04 00 10 26 _addiu s0,s0,0x4 paramsAddr += 4
8001a030 02 00 42 2e sltiu v0,Y,0x2 a2 = r18 < 2
8001a034 e9 ff 40 14 bne v0,zero,callPageChain if a2<>0 (r18<2) then goto another page
8001a038 21 28 00 00 _clear r5 r5 = 0
8001a03c 21 10 80 02 move v0,s4 r2 = paramsAddr
8001a040 4c 00 bf 8f lw ra,local_4(sp)
8001a044 48 00 be 8f lw s8,local_8(sp)
8001a048 44 00 b7 8f lw s7,local_c(sp)
8001a04c 40 00 b6 8f lw s6,local_10(sp)
8001a050 3c 00 b5 8f lw s5,local_14(sp) RESTORE registers from stack
8001a054 38 00 b4 8f lw s4,local_18(sp)
8001a058 34 00 b3 8f lw s3,local_1c(sp)
8001a05c 30 00 b2 8f lw Y,local_20(sp)
8001a060 2c 00 b1 8f lw X,local_24(sp)
8001a064 28 00 b0 8f lw s0,local_28(sp)
8001a068 08 00 e0 03 jr ra ret
8001a06c 50 00 bd 27 _addiu sp,sp,0x50 return stack +50

760
main.asm Normal file
View File

@@ -0,0 +1,760 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 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(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
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 s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
clear r25 ;CURRENT TEXT MODE
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,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 s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(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 r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;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,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;SAVE 013001f0 TO SCRATCH
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; 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)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,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,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(gp) ;r3 = load Y half from mem
sll v0,v0,0x2 ;r2 << 2
sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE RECT SRC 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 RECT SRC CHAR SPRITE Y BYTE
lhu v1,0xa8(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 CLUT of RECT
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,0x8000 ;r3 = 8000 0000
NextChar:
addiu r4,r4,-0x20 ;Shift unprintable symbols
li t2, 0xa0 ; минимальное значение оптимизированного кода (a0+20 = 192 (Русская А))
sltu v0,r4,t2
bne v0, zero, NotOptimized ; проверяем на русский текст и перепрыгиваем на старый режим, если нет.
nop
.include "main_spritecopy.asm"
NotOptimized:
;ОБРАБОТКА ПРОБЕЛОВ
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
sh v0,-0xE(t2) ;Save charcount += 1
lbu r4,0x0(s6) ;LOAD NEXT CHAR
nop
j NextChar
addiu s6,s6,0x1 ;Shift read address +1 byte
SpaceCheckBranch:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; 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 t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
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) !!!!!!!!!!!!!!!!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IF Mode is not 0 = load 2 to page counter
PageLoop:
;MAKING COPYSPRITE CHAIN
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 = 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(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
contStandartDMA:
lui t6,0x500 ; set 4 commands in next chain
nop
sw t6,0x0(r5) ; set 5 commands
nop
lui t6, 0xe100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ori t6,0x0234 ;;;;;;;make changepage command in every command to standart
sw t6,0x4(r5) ;store it before all 6400000 command
addiu r5,4 ;SHIFT DEST ADDR
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 t7,0x4(r5) ; *r5+4 = r15
sw t8,0x8(r5) ; *r5+8 = r24
sw t5,0xc(r5) ; *r5+c = r13
lw t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,0x10(r5) ; *r5+10 = r14 - LAST COMMAND SAVE
addiu r5,-0x4 ;SHIFT DEST ADDR MINUS
clear r25 ;clearing r25 (reset current chars status)
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,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
clear v0
sb v0,0x3c(r20) ;store first char offset for moving string (is first in new type)
;sh v0,-0x8(t4) ;store first char offset for moving string (is first in new type)
nop
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; 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 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,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 t6,0x3(r6)
swr t6,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,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
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
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,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,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
OptimizedSpriteCopyEnd:
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charDMACount
nop
addiu v0,v0,0x1 ; a += 1
sh v0,0x4(r20) ;save DMAcounter to chain
nop
;DMA OVERFLOW CHECK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (8007b6d4)
lui t3,MyAddr
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lhu v1,-0xC(t3) ;v1 = 8008fff4 = minimum cmd counter
nop
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(s6) ; load next Char to r4 (byte)
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
addiu s6,s6,0x1 ;Shift CharAddr
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; r16 = r20 (currentTLineParam)
clear r5
clear r25 ;clearing r25 (reset current chars status)
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,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
;;;;;;;;;;;;;;;;
lw r7,0xa4(gp);>DAT_8007b234 r7 = Texture page = 34
beq r25,zero, lastTextPageDefaul
nop
li r7,0x3f ;IF MODE<>0 then TexturePage = 23F
;;;;;;;;;;;;;;;''
lastTextPageDefaul:
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,-0x4930(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(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>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,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,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 "charload.asm"
.include "charCalcs.asm"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001a7dc
;;;;;text patch for Text MOVING & OFFSET
;make branch videocomand reading
chainSpriteCheck:
lbu v1,0x7(r5)
li r27, 0xe1
beq r27, v1, ShiftedCommandCheck
nop
j 0x8001a7e4 ;return
nop
ShiftedCommandCheck:
lbu v1,0xb(r5) ;my new shifted sprite command
li r27, 0x64
beq r27, v1, ShiftedCommandCheck2
nop
lbu v1,0x7(r5)
nop
j 0x8001a7e4 ;return
nop
ShiftedCommandCheck2:
lbu v1,0xb(r5)
goingback:
j 0x8001a7e4 ;return
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001aa8c
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;text patch for Text MOVING & OFFSET
getRightCoords:
; lw r5, 0x28(t1) ;get chain addr from params
;lhu r3, 0xc(t2) ;get X from params
lbu r4,0x7(r5)
li r2,0xe1 ;if my new 5 commands?
bne r2,r4,oldStyleCommand
nop
addiu r5,4
oldStyleCommand:
lhu r2, 0x8(r5) ;getting cur x (r5 is chain addr) --------!
lhu r4, 0xe(t2) ;;getting Y from param
subu r3,r3,r2 ; get X offset
move r12,r3 ; Saving X offset in r12
lhu r2, 0xa(r5) ;getting cur y from chain ----------!
sll r3,r3,0x10 ;Shift r3 <<< 10 bits
;add r2,r23 ;add
subu r2,r4,r2 ;get Y offset
;clear r23
returnToInnocence:
j 0x8001aaa8 ;continue!
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001ab2c
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movesprite:
lbu r2,0x07(r4)
nop
beq r2, t7, simpleSpriteCmd ;if r2 == t7 = 64
nop
beq r2, t6, simpleSpriteCmd ;if r2 == t6 = 66 --simple move
nop
li r3, 0xe1
beq r2, r3, IsThisMyChain ;ReallyMyChain
nop
j exitmovesprite
nop
ReallyMyChain:
lbu r2,0x03(r4)
li r3, 0x05
beq r2, r3, IsThisMyChain
nop
j exitmovesprite
nop
IsThisMyChain:
lbu r2,0x0b(r4)
nop
beq r2, t7, notSimpleSpriteCommand ;is this my E1 + 64?
nop
j exitmovesprite
nop
notSimpleSpriteCommand:
lbu r3,0x3c(t2) ;get offset X
lhu r2,0x0c(r4)
sra r3, r3, 0x4 ;shift 12 >> 4 = 1 pix (OR 0)
addu r2,r2,t4
addu r2,r2,r3 ;adding myMainOffset X
sh r2,0xC(r4)
lbu r2,0x3c(t2) ;get offset Y
lhu r3,0xE(r4)
andi r2, r2, 0xF ;get Y offset
addu r3,r3,t3
addu r3,r3,r2 ;adding myMainOffset
;addiu r3,r3,2
sh r3,0xE(r4)
nop
j exitmovesprite
nop
simpleSpriteCmd:
lhu r2,0x8(r4)
lhu r3,0xA(r4)
addu r2,r2,t4
addu r3,r3,t3
sh r2,0x8(r4)
sh r3,0xA(r4)
nop
exitmovesprite:
j 0x8001ab5c ;EXIT TO MAIN routine
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SET TEXT BRIGHTNESS
setTextBrightness:
lbu r2,0x07(v1)
nop
beq r2, t1, simpleBright ;if r2 == t7 = 64
nop
beq r2, t0, simpleBright ;if r2 == t6 = 66 --simple move
nop
li r15, 0xe1
beq r2, r15, ItsMyBrigth1 ;ReallyMyChain
nop
j exitbrightsprite
nop
ItsMyBrigth1:
lbu r2,0x0b(v1)
nop
beq r2, t1, ItsMyBrigthMake ;is this my E1 + 64?
nop
j exitbrightsprite
nop
ItsMyBrigthMake:
sb s1,0x8(v1)
sb s2,0x9(v1)
sb s3,0xa(v1)
j 0x8001ad6c
nop
simpleBright:
sb s1,0x4(v1)
sb s2,0x5(v1)
sb s3,0x6(v1)
exitbrightsprite:
j 0x8001ad6c
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Patching main code
.org 0x8001a7dc
;lbu v1,0x7(r5) ;- ORIGINAL load current command
j chainSpriteCheck
nop
.org 0x8001aa8c
;lhu r2, 0x8(r5) ;getting cur x (r5 is chain addr) --------!
;lhu r4, 0xe(t2) ;;getting Y from prarm param
j getRightCoords
nop
.org 0x8001ab2c
;lbu v0,0x07(a0)
j movesprite ;movingsprite routine
nop
.org 0x8001ad48
;lbu v0,0x07(a1)
j setTextBrightness ;textbrightness routine
nop
.close
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
;.include "battle_patch.asm"
.include "txtpatches.asm" ;misc text patches
; COMPILE COMMAND: ./armips -temp 123 main.asm

View File

@@ -0,0 +1,470 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 0x8000F800
.include "complex_strings_copy.asm" ;Make complex strings in battles
.org 0x80090000
ExternalPrint:
;;;;;;;text routing test routine
move r3,s3
move s3,r4
lhu v0,0x0(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
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 s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,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 s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(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 r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;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,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA)
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; 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)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,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,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(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,0xa8(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
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,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
sh v0,-0xE(t2) ;Save charcount += 1
lbu r4,0x0(s6) ;LOAD NEXT CHAR
nop
j NextChar
addiu s6,s6,0x1 ;Shift read address +1 byte
SpaceCheckBranch:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; 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 t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
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,-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 = 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(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
lw t6,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 t6,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 t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,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(t4) ;t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; 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 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,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 t6,0x3(r6)
swr t6,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,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!!
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
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,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,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charDMACount
nop
addiu v0,v0,0x1 ; a += 1
sh v0,0x4(r20) ;save DMAcounter to chain
;DMA NEED CHECK HERE (8007b6d4)
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(s6) ; load next Char to r4 (byte)
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
addiu s6,s6,0x1 ;Shift CharAddr
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; 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,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
lw r7,0xa4(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,-0x4930(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(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>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,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,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 "charload.asm"
.include "charCalcs.asm"
.close
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
.include "battle_patch.asm"
.include "txtpatches.asm" ;misc text patches

View File

@@ -0,0 +1,482 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 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(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
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 s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,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 s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(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 r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;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,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA)
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; 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)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,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,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(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,0xa8(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
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,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
sh v0,-0xE(t2) ;Save charcount += 1
lbu r4,0x0(s6) ;LOAD NEXT CHAR
nop
j NextChar
addiu s6,s6,0x1 ;Shift read address +1 byte
SpaceCheckBranch:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; 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 t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
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,-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 = 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(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
lw t6,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 t6,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 t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,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(t4) ;t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; 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 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,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 t6,0x3(r6)
swr t6,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,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!!
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
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,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,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charDMACount
nop
addiu v0,v0,0x1 ; a += 1
sh v0,0x4(r20) ;save DMAcounter to chain
nop
;DMA OVERFLOW CHECK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (8007b6d4)
lui t3,MyAddr
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lhu v1,-0xC(t3) ;v1 = 8008fff4 = minimum cmd counter
nop
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(s6) ; load next Char to r4 (byte)
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
addiu s6,s6,0x1 ;Shift CharAddr
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; 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,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
lw r7,0xa4(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,-0x4930(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(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>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,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,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 "charload.asm"
.include "charCalcs.asm"
.close
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
.include "battle_patch.asm"
; 69 x 44
;yellow - 976 X 437 white - 976 X 432
.include "txtpatches.asm" ;misc text patches

439
main_before_spaces.asm Normal file
View File

@@ -0,0 +1,439 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 0x8000F800
.org 0x80090000
ExternalPrint:
;;;;;;;text routing test routine
move r3,s3
move s3,r4
lhu v0,0x0(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
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 s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,0x2 ;Moving text read pointer +2bytes
lui s3,MyAddr
sh v0,-0x10(s3) ;store half bytecounter @ 8008fff0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(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 r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;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,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA)
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; 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)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,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,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(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,0xa8(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
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,0x8000 ;r3 = 8000 0000
NextChar:
addiu r4,r4,-0x20 ;Shift unprintable symbols
; lhu v1,0x4(r20) ; current char = r3 = half *DMAAddr + 4
; nop
; beq v1,zero,isFirstChar ;check charnum. if 0 - dont check space (string not initializated)
; nop
;check r0 is 0 and jump to next char
; beq r4,zero,SpaceCharJumpHere ;if char=0 (space) = jump to end of charLoop
; nop
isFirstChar:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; Coords XY init
lw v0,0xb0(gp); =>DAT_8007b240_parms load r2 from r28+0b0 (7b240)(Xoffs)
lhu v1,0x4(r20) ; current char = r3 = half *DMAAddr + 4
;NEED TO CUSTOM CHAR COUNT
addiu v0,v0,0x6 ; 0x06 * 6px btw letters!
mult v1,v0 ; r3*r2 = xOffs*charNum
lui t2,0xff00 ; r10 = ld upper ff00 = ff000000
move t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
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,-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 = 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(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
lw t6,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 t6,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 t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,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(t4) ;t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; 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 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,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 t6,0x3(r6)
swr t6,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,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!!
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
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,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,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
SpaceCharJumpHere:
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charCount
nop
addiu v0,v0,0x1 ; a += 1
lui t3,MyAddr
lhu v1,-0x10(t3) ; r3 = My charCount In string
lbu r4,0x0(s6) ; load next Char to r4 (byte)
addiu s6,s6,0x1 ;Shift CharAddr
sh v0,0x4(r20) ; r2 = save to chain
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; 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,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
lw r7,0xa4(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,-0x4930(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(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>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,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,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 "charload.asm"
.include "charCalcs.asm"
.close
.include "txtpatches.asm" ;misc text patches

760
main_making_offsets.asm Normal file
View File

@@ -0,0 +1,760 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 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(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
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 s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
clear r25 ;CURRENT TEXT MODE
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,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 s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(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 r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;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,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;SAVE 013001f0 TO SCRATCH
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; 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)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,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,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(gp) ;r3 = load Y half from mem
sll v0,v0,0x2 ;r2 << 2
sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE RECT SRC 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 RECT SRC CHAR SPRITE Y BYTE
lhu v1,0xa8(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 CLUT of RECT
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,0x8000 ;r3 = 8000 0000
NextChar:
addiu r4,r4,-0x20 ;Shift unprintable symbols
li t2, 0xa0 ; минимальное значение оптимизированного кода (a0+20 = 192 (Русская А))
sltu v0,r4,t2
bne v0, zero, NotOptimized ; проверяем на русский текст и перепрыгиваем на старый режим, если нет.
nop
.include "main_spritecopy.asm"
NotOptimized:
;ОБРАБОТКА ПРОБЕЛОВ
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
sh v0,-0xE(t2) ;Save charcount += 1
lbu r4,0x0(s6) ;LOAD NEXT CHAR
nop
j NextChar
addiu s6,s6,0x1 ;Shift read address +1 byte
SpaceCheckBranch:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; 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 t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
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) !!!!!!!!!!!!!!!!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IF Mode is not 0 = load 2 to page counter
PageLoop:
;MAKING COPYSPRITE CHAIN
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 = 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(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
contStandartDMA:
lui t6,0x500 ; set 4 commands in next chain
nop
sw t6,0x0(r5) ; set 5 commands
nop
lui t6, 0xe100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ori t6,0x0234 ;;;;;;;make changepage command in every command to standart
sw t6,0x4(r5) ;store it before all 6400000 command
addiu r5,4 ;SHIFT DEST ADDR
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 t7,0x4(r5) ; *r5+4 = r15
sw t8,0x8(r5) ; *r5+8 = r24
sw t5,0xc(r5) ; *r5+c = r13
lw t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,0x10(r5) ; *r5+10 = r14 - LAST COMMAND SAVE
addiu r5,-0x4 ;SHIFT DEST ADDR MINUS
clear r25 ;clearing r25 (reset current chars status)
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,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
clear v0
sb v0,-0x1(r20) ;store first char offset for moving string (is first in new type)
;sh v0,-0x8(t4) ;store first char offset for moving string (is first in new type)
nop
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; 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 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,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 t6,0x3(r6)
swr t6,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,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
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
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,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,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
OptimizedSpriteCopyEnd:
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charDMACount
nop
addiu v0,v0,0x1 ; a += 1
sh v0,0x4(r20) ;save DMAcounter to chain
nop
;DMA OVERFLOW CHECK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (8007b6d4)
lui t3,MyAddr
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lhu v1,-0xC(t3) ;v1 = 8008fff4 = minimum cmd counter
nop
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(s6) ; load next Char to r4 (byte)
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
addiu s6,s6,0x1 ;Shift CharAddr
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; r16 = r20 (currentTLineParam)
clear r5
clear r25 ;clearing r25 (reset current chars status)
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,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
;;;;;;;;;;;;;;;;
lw r7,0xa4(gp);>DAT_8007b234 r7 = Texture page = 34
beq r25,zero, lastTextPageDefaul
nop
li r7,0x3f ;IF MODE<>0 then TexturePage = 23F
;;;;;;;;;;;;;;;''
lastTextPageDefaul:
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,-0x4930(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(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>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,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,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 "charload.asm"
.include "charCalcs.asm"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001a7dc
;;;;;text patch for Text MOVING & OFFSET
;make branch videocomand reading
chainSpriteCheck:
lbu v1,0x7(r5)
li r27, 0xe1
beq r27, v1, ShiftedCommandCheck
nop
j 0x8001a7e4 ;return
nop
ShiftedCommandCheck:
lbu v1,0xb(r5) ;my new shifted sprite command
li r27, 0x64
beq r27, v1, ShiftedCommandCheck2
nop
lbu v1,0x7(r5)
nop
j 0x8001a7e4 ;return
nop
ShiftedCommandCheck2:
lbu v1,0xb(r5)
goingback:
j 0x8001a7e4 ;return
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001aa8c
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;text patch for Text MOVING & OFFSET
getRightCoords:
; lw r5, 0x28(t1) ;get chain addr from params
;lhu r3, 0xc(t2) ;get X from params
lbu r4,0x7(r5)
li r2,0xe1 ;if my new 5 commands?
bne r2,r4,oldStyleCommand
nop
addiu r5,4
oldStyleCommand:
lhu r2, 0x8(r5) ;getting cur x (r5 is chain addr) --------!
lhu r4, 0xe(t2) ;;getting Y from param
subu r3,r3,r2 ; get X offset
move r12,r3 ; Saving X offset in r12
lhu r2, 0xa(r5) ;getting cur y from chain ----------!
sll r3,r3,0x10 ;Shift r3 <<< 10 bits
;add r2,r23 ;add
subu r2,r4,r2 ;get Y offset
;clear r23
returnToInnocence:
j 0x8001aaa8 ;continue!
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001ab2c
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movesprite:
lbu r2,0x07(r4)
nop
beq r2, t7, simpleSpriteCmd ;if r2 == t7 = 64
nop
beq r2, t6, simpleSpriteCmd ;if r2 == t6 = 66 --simple move
nop
li r3, 0xe1
beq r2, r3, IsThisMyChain ;ReallyMyChain
nop
j exitmovesprite
nop
ReallyMyChain:
lbu r2,0x03(r4)
li r3, 0x05
beq r2, r3, IsThisMyChain
nop
j exitmovesprite
nop
IsThisMyChain:
lbu r2,0x0b(r4)
nop
beq r2, t7, notSimpleSpriteCommand ;is this my E1 + 64?
nop
j exitmovesprite
nop
notSimpleSpriteCommand:
; lbu t7,-0x1(t2) ;get offset XY
lhu r2,0x0c(r4) ;load cur sprite X
sra t6, t7, 0x4 ;shift 12 >> 4 = 1 pix (OR 0)
addu r2,r2,t4 ;add chain offset
;addu r2,r2,t6 ;adding myMainOffset X
sh r2,0xC(r4)
lhu r3,0xE(r4)
andi t6, t7, 0xF ;get Y offset
addu r3,r3,t3
;addu r3,r3,t6 ;adding myMainOffset (1,2,0, etc...)
addiu r3,r3,2
sh r3,0xE(r4)
nop
j exitmovesprite
nop
simpleSpriteCmd:
lhu r2,0x8(r4)
lhu r3,0xA(r4)
addu r2,r2,t4
addu r3,r3,t3
sh r2,0x8(r4)
sh r3,0xA(r4)
nop
exitmovesprite:
j 0x8001ab5c ;EXIT TO MAIN routine
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SET TEXT BRIGHTNESS
setTextBrightness:
lbu r2,0x07(v1)
nop
beq r2, t1, simpleBright ;if r2 == t7 = 64
nop
beq r2, t0, simpleBright ;if r2 == t6 = 66 --simple move
nop
li r15, 0xe1
beq r2, r15, ItsMyBrigth1 ;ReallyMyChain
nop
j exitbrightsprite
nop
ItsMyBrigth1:
lbu r2,0x0b(v1)
nop
beq r2, t1, ItsMyBrigthMake ;is this my E1 + 64?
nop
j exitbrightsprite
nop
ItsMyBrigthMake:
sb s1,0x8(v1)
sb s2,0x9(v1)
sb s3,0xa(v1)
j 0x8001ad6c
nop
simpleBright:
sb s1,0x4(v1)
sb s2,0x5(v1)
sb s3,0x6(v1)
exitbrightsprite:
j 0x8001ad6c
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Patching main code
.org 0x8001a7dc
;lbu v1,0x7(r5) ;- ORIGINAL load current command
j chainSpriteCheck
nop
.org 0x8001aa8c
;lhu r2, 0x8(r5) ;getting cur x (r5 is chain addr) --------!
;lhu r4, 0xe(t2) ;;getting Y from prarm param
j getRightCoords
nop
.org 0x8001ab2c
;lbu v0,0x07(a0)
j movesprite ;movingsprite routine
nop
.org 0x8001ad48
;lbu v0,0x07(a1)
j setTextBrightness ;textbrightness routine
nop
.close
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
;.include "battle_patch.asm"
.include "txtpatches.asm" ;misc text patches
; COMPILE COMMAND: ./armips -temp 123 main.asm

232
main_spritecopy.asm Normal file
View File

@@ -0,0 +1,232 @@
###############################################################
#
# 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

203
txtpatches.asm Normal file
View File

@@ -0,0 +1,203 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Some txt Patches to JAPAN Version to print bi(u)g text smaller
;;;
.open "SLPS_021.00", 0x8000F800
;Text speed patch (0 - show all text(!!!) - 4 - Normal (Pressed Button - 1))
;.org 0x8001bfd4
; li r5,0
;move a0,s0 ;Original Code
; Main Bigfont size between letters for special codes
;.org 0x8001957c
; 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
;;;;;;;;;;;;;;;;;;;;;;;;Print Routines Calls Replacing
;main dialog calls from PrintProgramText Routine
;.org 0x8001c398
; jal ExternalPrint
;.org 0x8001c40c
; jal ExternalPrint
;Selection Menu Calls
;.org 0x8001d058
; jal ExternalPrint
;.org 0x8001d0d8
; jal ExternalPrint
;printPlaneTEXT (PlayerName, etc...)
;.org 0x8001c688
; jal ExternalPrint
;custom CheckCharNumToLineEnd for proper Complex Lines Read (charcountread)
.org 0x8001aef4
j ReturnCharsInString ;custom routine
clear v1
;j 0x8001af00 ;original code
;calcnextX Custom
.org 0x8001af1c
; addiu sp,sp,-0x18 ;Original Code
; sw ra,0x10(sp)
j calcnextXCustom ;PATCHED
nop
.close
; COnfiguration Menu Strings Calls
.open "1096_J_MENU_Settings_Code.bin", 0x800A2000
.org 0x800a2658
li a1,0x5c
.org 0x800a2678
jal ExternalPrint ;CONFIGURATION MENU & X Coord
.org 0x800a2690
jal 0x8001afc0 ;OOOOOPS :))))
.org 0x800a26ac
jal ExternalPrint
.org 0x800a26e8
jal ExternalPrint
.org 0x800a298c
jal ExternalPrint
.org 0x800a29b8
jal ExternalPrint
.org 0x800a29f4
jal ExternalPrint
.org 0x800a2a44
jal ExternalPrint
.org 0x800a2d20
jal ExternalPrint
.org 0x800a2d4c
jal ExternalPrint
.org 0x800a2d7c
jal ExternalPrint
.org 0x800a3090
jal ExternalPrint
.org 0x800a30cc
jal ExternalPrint
.org 0x800a35ac
jal ExternalPrint
.org 0x800a35e0
jal ExternalPrint
.org 0x800a3624
jal ExternalPrint
.org 0x800a3658
jal ExternalPrint
.org 0x800a369c
jal ExternalPrint
.org 0x800a36d0
jal ExternalPrint
.org 0x800a3704
jal ExternalPrint
.org 0x800a3734
jal ExternalPrint
.org 0x800a3ba8
jal ExternalPrint
.org 0x800a3bdc
jal ExternalPrint
.org 0x800a3c20
jal ExternalPrint
.org 0x800a3c4c
jal ExternalPrint
.org 0x800a3c90
jal ExternalPrint
.org 0x800a3cbc
jal ExternalPrint
.org 0x800a4310
jal ExternalPrint
.org 0x800a435c
jal ExternalPrint
.close
; CITY PATCHES!
.open "1119_CITY_CODE_patched_2023.bin", 0x800AB000
;IN 1119 - 800AD320 (offs 8992) - need to 0,0,0,0 (its shift left 0x1) x3 instead x6 - Text and rect coord
;OVERALL X LEFT SHIFT!!!
;.org 0x800ad320C:\Downloads\PSX
;nop
;'800AD328 need to 64 instead 128 (text pixels wide x2 instead x4) - rect X WIDE
;.org 0x800ad328
;sll a1,0x1
;'800AD360 (offs 9056)- need 5 instead 6 - pixels for X-offset text from start of rect
;.org 0x800ad360
;addiu a1,a1,0x5
;check lenght for hiuse names for overallcoords calc
.org 0x800ad30c
jal RetunCharsToCity
;checklenghth for housename RECT
.org 0x800ad3ac
jal RetunCharsToCity
.org 0x800af1dc
;jal RetunCharsToCityDiv2 ;OR ReturnCharsInString
jal 0x8001af1c
.close
;.org 0x800ad380
;jal ExternalPrint
;.org 0x800ad400
;jal ExternalPrint
;.org 0x800b2008
;jal ExternalPrint
;.org 0x800b21b8
;jal ExternalPrint
;.org 0x800b2278
;jal ExternalPrint
;district select windows
;.org 0x800b1af0
; .byte 0x12
;.org 0x800b1afc
; .byte 0x08
;.org 0x800b1c3f
; .byte 0x00
;.org 0x800b1c68
; .byte 0x4a
;.org 0x800b1ca8
; .byte 0x4a
;.org 0x800b1d4c
; .byte 0x4a
;.org 0x800b1d94
; .byte 0x4a
;.org 0x800b1dc0
; .byte 0x4a
;.org 0x800b8d3c
;City Districts Table with pointers Here