commit 8e506a6912855a6bdb0917184fd80e65a1c481d1 Author: sShemet Date: Sat Oct 4 11:53:04 2025 +0500 init diff --git a/0001_BATTLE_CODE.bin b/0001_BATTLE_CODE.bin new file mode 100644 index 0000000..50c0e1c Binary files /dev/null and b/0001_BATTLE_CODE.bin differ diff --git a/0681.bin b/0681.bin new file mode 100644 index 0000000..1dc10aa Binary files /dev/null and b/0681.bin differ diff --git a/1096_J_MENU_Settings_Code.bin b/1096_J_MENU_Settings_Code.bin new file mode 100644 index 0000000..b48e67c Binary files /dev/null and b/1096_J_MENU_Settings_Code.bin differ diff --git a/1097_CODE_ENG.bin b/1097_CODE_ENG.bin new file mode 100644 index 0000000..cad12c6 Binary files /dev/null and b/1097_CODE_ENG.bin differ diff --git a/1119_CITY_CODE_patched.bin b/1119_CITY_CODE_patched.bin new file mode 100644 index 0000000..9ffc729 Binary files /dev/null and b/1119_CITY_CODE_patched.bin differ diff --git a/1119_CITY_CODE_patched_2023.bin b/1119_CITY_CODE_patched_2023.bin new file mode 100644 index 0000000..187094e Binary files /dev/null and b/1119_CITY_CODE_patched_2023.bin differ diff --git a/123 b/123 new file mode 100644 index 0000000..bdf03d8 --- /dev/null +++ b/123 @@ -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 diff --git a/123_EP b/123_EP new file mode 100644 index 0000000..29943d7 --- /dev/null +++ b/123_EP @@ -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 diff --git a/123_battle b/123_battle new file mode 100644 index 0000000..7093ccf --- /dev/null +++ b/123_battle @@ -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 diff --git a/123_new b/123_new new file mode 100644 index 0000000..e5550d5 --- /dev/null +++ b/123_new @@ -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 diff --git a/4bitPattern.asm b/4bitPattern.asm new file mode 100644 index 0000000..a317da2 --- /dev/null +++ b/4bitPattern.asm @@ -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) \ No newline at end of file diff --git a/EP_4bitPattern.asm b/EP_4bitPattern.asm new file mode 100644 index 0000000..47e0b60 --- /dev/null +++ b/EP_4bitPattern.asm @@ -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) \ No newline at end of file diff --git a/EP_CharLoadBIG_SRC.asm b/EP_CharLoadBIG_SRC.asm new file mode 100644 index 0000000..61a1d23 --- /dev/null +++ b/EP_CharLoadBIG_SRC.asm @@ -0,0 +1,160 @@ + ************************************************************** + * FUNCTION * + ************************************************************** + undefined MakeCharInScratch() + assume gp = 0x8007c970 +undefined v0:1 +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 = +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 + 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 = +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 diff --git a/EP_CharLoadSML_SRC.asm b/EP_CharLoadSML_SRC.asm new file mode 100644 index 0000000..0c3b480 --- /dev/null +++ b/EP_CharLoadSML_SRC.asm @@ -0,0 +1,116 @@ + ************************************************************** + * FUNCTION * + ************************************************************** + undefined GenerateSmallChar() + assume gp = 0x8007c970 +undefined v0:1 +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 = +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 + 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 = +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 diff --git a/EP_TITLE_WINDOW_TEXT_PRINT.asm b/EP_TITLE_WINDOW_TEXT_PRINT.asm new file mode 100644 index 0000000..66c75c5 --- /dev/null +++ b/EP_TITLE_WINDOW_TEXT_PRINT.asm @@ -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 diff --git a/EP_big_SRC.asm b/EP_big_SRC.asm new file mode 100644 index 0000000..fdd2735 --- /dev/null +++ b/EP_big_SRC.asm @@ -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 + + + + + diff --git a/EP_charload.asm b/EP_charload.asm new file mode 100644 index 0000000..e1a1092 --- /dev/null +++ b/EP_charload.asm @@ -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 \ No newline at end of file diff --git a/EP_main.asm b/EP_main.asm new file mode 100644 index 0000000..6a30bd2 --- /dev/null +++ b/EP_main.asm @@ -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 (r80 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 \ No newline at end of file diff --git a/EP_main_grouped.asm b/EP_main_grouped.asm new file mode 100644 index 0000000..86c0a0e --- /dev/null +++ b/EP_main_grouped.asm @@ -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 // Восстанавливаем стек \ No newline at end of file diff --git a/EP_small_SRC.asm b/EP_small_SRC.asm new file mode 100644 index 0000000..e88a88d --- /dev/null +++ b/EP_small_SRC.asm @@ -0,0 +1,448 @@ + ************************************************************** + * FUNCTION * + ************************************************************** + undefined MakeSmallChar(undefined r4, undefined par + assume gp = 0x8007c970 +undefined v0:1 +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 = +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 diff --git a/F0681.BIN b/F0681.BIN new file mode 100644 index 0000000..50e718e Binary files /dev/null and b/F0681.BIN differ diff --git a/F1079.BIN b/F1079.BIN new file mode 100644 index 0000000..53b17b3 Binary files /dev/null and b/F1079.BIN differ diff --git a/GROUPED_ALGO.txt b/GROUPED_ALGO.txt new file mode 100644 index 0000000..2a6a197 --- /dev/null +++ b/GROUPED_ALGO.txt @@ -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) diff --git a/IS_charload_grouped.asm b/IS_charload_grouped.asm new file mode 100644 index 0000000..51d0557 --- /dev/null +++ b/IS_charload_grouped.asm @@ -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 \ No newline at end of file diff --git a/IS_main_grouped.asm b/IS_main_grouped.asm new file mode 100644 index 0000000..9d90a35 --- /dev/null +++ b/IS_main_grouped.asm @@ -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 \ No newline at end of file diff --git a/SLPS_021.00 b/SLPS_021.00 new file mode 100644 index 0000000..a513a3a Binary files /dev/null and b/SLPS_021.00 differ diff --git a/SLPS_021.00.map b/SLPS_021.00.map new file mode 100644 index 0000000..08fb75b --- /dev/null +++ b/SLPS_021.00.map @@ -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 + \ No newline at end of file diff --git a/SLPS_021.00_1.1 b/SLPS_021.00_1.1 new file mode 100644 index 0000000..f6714bb Binary files /dev/null and b/SLPS_021.00_1.1 differ diff --git a/SLPS_021.00_old b/SLPS_021.00_old new file mode 100644 index 0000000..5d80c24 Binary files /dev/null and b/SLPS_021.00_old differ diff --git a/SLPS_028.25 b/SLPS_028.25 new file mode 100644 index 0000000..7535b7f Binary files /dev/null and b/SLPS_028.25 differ diff --git a/SLPS_028.26 b/SLPS_028.26 new file mode 100644 index 0000000..9d5bbb0 Binary files /dev/null and b/SLPS_028.26 differ diff --git a/SLPS_028.26.map b/SLPS_028.26.map new file mode 100644 index 0000000..2f89e60 --- /dev/null +++ b/SLPS_028.26.map @@ -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 + \ No newline at end of file diff --git a/armips.exe b/armips.exe new file mode 100644 index 0000000..e018655 Binary files /dev/null and b/armips.exe differ diff --git a/battle_patch.asm b/battle_patch.asm new file mode 100644 index 0000000..35e8efa --- /dev/null +++ b/battle_patch.asm @@ -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 \ No newline at end of file diff --git a/cd_extra_charload.asm b/cd_extra_charload.asm new file mode 100644 index 0000000..20599a5 --- /dev/null +++ b/cd_extra_charload.asm @@ -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 \ No newline at end of file diff --git a/cd_extra_main.asm b/cd_extra_main.asm new file mode 100644 index 0000000..1fe4ce2 --- /dev/null +++ b/cd_extra_main.asm @@ -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 \ No newline at end of file diff --git a/cd_extra_main_small_source.asm b/cd_extra_main_small_source.asm new file mode 100644 index 0000000..ea71fd7 --- /dev/null +++ b/cd_extra_main_small_source.asm @@ -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 \ No newline at end of file diff --git a/cd_extra_main_source.asm b/cd_extra_main_source.asm new file mode 100644 index 0000000..c1a5e69 --- /dev/null +++ b/cd_extra_main_source.asm @@ -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 \ No newline at end of file diff --git a/cd_extra_txtpatches.asm b/cd_extra_txtpatches.asm new file mode 100644 index 0000000..12db0a6 --- /dev/null +++ b/cd_extra_txtpatches.asm @@ -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 + + diff --git a/charCalcs.asm b/charCalcs.asm new file mode 100644 index 0000000..5da3cd9 --- /dev/null +++ b/charCalcs.asm @@ -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 \ No newline at end of file diff --git a/charload.asm b/charload.asm new file mode 100644 index 0000000..6c62dea --- /dev/null +++ b/charload.asm @@ -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 \ No newline at end of file diff --git a/compile_command.txt b/compile_command.txt new file mode 100644 index 0000000..e69de29 diff --git a/complex_strings_copy.asm b/complex_strings_copy.asm new file mode 100644 index 0000000..f827ac4 --- /dev/null +++ b/complex_strings_copy.asm @@ -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 + \ No newline at end of file diff --git a/ghidra_src/big.asm b/ghidra_src/big.asm new file mode 100644 index 0000000..df9d00a --- /dev/null +++ b/ghidra_src/big.asm @@ -0,0 +1,489 @@ + ************************************************************** + * FUNCTION * + ************************************************************** + undefined __stdcall drawCharLine_MakeDMAChain(undefined4 + assume gp = 0x8007b190 + undefined v0:1 + 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 = + 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) <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 diff --git a/ghidra_src/charL.asm b/ghidra_src/charL.asm new file mode 100644 index 0000000..c8536d7 --- /dev/null +++ b/ghidra_src/charL.asm @@ -0,0 +1,91 @@ + ************************************************************** + * FUNCTION * + ************************************************************** + undefined __stdcall makeCharPixels(undefined4 r4, undefi + assume gp = 0x8007b190 + undefined v0:1 + 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 = + 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 diff --git a/ghidra_src/small.asm b/ghidra_src/small.asm new file mode 100644 index 0000000..0518254 --- /dev/null +++ b/ghidra_src/small.asm @@ -0,0 +1,471 @@ + ************************************************************** + * FUNCTION * + ************************************************************** + undefined __stdcall DrawSmallFontString(undefined4 r4, u + assume gp = 0x8007b190 + undefined v0:1 + 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 = + 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 = 0DAT_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 (r80 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 diff --git a/main.asm b/main.asm new file mode 100644 index 0000000..693efcb --- /dev/null +++ b/main.asm @@ -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 (r80 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 \ No newline at end of file diff --git a/main_before_FINAL_optimization.asm b/main_before_FINAL_optimization.asm new file mode 100644 index 0000000..11de35d --- /dev/null +++ b/main_before_FINAL_optimization.asm @@ -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 (r8OverallChar - 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 \ No newline at end of file diff --git a/main_before_copysprite_optimize.asm b/main_before_copysprite_optimize.asm new file mode 100644 index 0000000..199a7ff --- /dev/null +++ b/main_before_copysprite_optimize.asm @@ -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 (r80 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 \ No newline at end of file diff --git a/main_before_spaces.asm b/main_before_spaces.asm new file mode 100644 index 0000000..cbdab19 --- /dev/null +++ b/main_before_spaces.asm @@ -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 (r8OverallChar - 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 \ No newline at end of file diff --git a/main_making_offsets.asm b/main_making_offsets.asm new file mode 100644 index 0000000..536ce6a --- /dev/null +++ b/main_making_offsets.asm @@ -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 (r80 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 \ No newline at end of file diff --git a/main_spritecopy.asm b/main_spritecopy.asm new file mode 100644 index 0000000..67615fe --- /dev/null +++ b/main_spritecopy.asm @@ -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