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

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

47
1_IS/4bitPattern.asm Normal file
View File

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

Binary file not shown.

Binary file not shown.

BIN
1_IS/BIN/1097_CODE_ENG.bin Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
1_IS/BIN/F1079.BIN Normal file

Binary file not shown.

BIN
1_IS/BIN/SLPS_021.00 Normal file

Binary file not shown.

BIN
1_IS/BIN/SLPS_021.00.bin Normal file

Binary file not shown.

81
1_IS/BIN/SLPS_021.00.map Normal file
View File

@@ -0,0 +1,81 @@
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
80090244 form_char_data_in_scratch
8009024C rect_cmd_init
80090274 rect_set_x
80090288 rect_set_width
80090290 pageloop
800902C0 rect_copy_scratch_to_ram
800902EC rect_scratch_connect
80090340 cpu2vram_cmd_loop
800903A8 copy_char_data_start
800903C4 copy_char_data_loop
800903EC set_flush_cache_cmd
800903FC cpu2vram_dma_link
80090458 chunk_making_end
80090474 textend
80090490 pagetloop
80090524 .asc:005A
8009057E .byt:0001
8009057F .byt:0001
80090580 make_char_line_in_scratch
8009059C char_data_clear
800905A8 char_data_loop
800905D4 chars_font_loop
800905FC char_lines_loop
8009060C its_not_empty
8009069C not_last
800906A8 divideby4
800906A8 zero_jump
800906B8 spacejump
800906D4 sprite_end
800906EC make_shadow
80090710 shadow_row_loop
80090714 shadow_sprites_loop
80090724 shadow_pixel_loop
80090780 normal_case
800907A4 no_s
800907D0 notshadow
800907E4 _4bit_conversion_table2
800907E4 customnamerender
80090834 make_sprite_size_table2
8009085C read_char
80090888 end_of_name_read
800908F4 returncharsinstring
80090910 ismy1bytestring
8009092C notand1
8009093C getnewchar
80090940 startreading
8009095C calcnextxcustom
80090984 japoldtext
8009098C ihavestringlength
800909A4 retuncharstocity
800909C0 ismy1bytecity
800909D4 retuncharstocitydiv2
800909F0 ismy1bytecitydiv2
80090A0C notand1_2


BIN
1_IS/BIN/SLPS_021.00_1.1 Normal file

Binary file not shown.

BIN
1_IS/BIN/SLPS_021.00_old Normal file

Binary file not shown.

View File

@@ -0,0 +1,81 @@
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
80090244 form_char_data_in_scratch
8009024C rect_cmd_init
80090274 rect_set_x
80090288 rect_set_width
80090290 pageloop
800902C0 rect_copy_scratch_to_ram
800902EC rect_scratch_connect
80090340 cpu2vram_cmd_loop
800903A8 copy_char_data_start
800903C4 copy_char_data_loop
800903EC set_flush_cache_cmd
800903FC cpu2vram_dma_link
80090458 chunk_making_end
80090474 textend
80090490 pagetloop
80090524 .asc:005A
8009057E .byt:0001
8009057F .byt:0001
80090580 make_char_line_in_scratch
8009059C char_data_clear
800905A8 char_data_loop
800905D4 chars_font_loop
800905FC char_lines_loop
8009060C its_not_empty
8009069C not_last
800906A8 divideby4
800906A8 zero_jump
800906B8 spacejump
800906D4 sprite_end
800906EC make_shadow
80090710 shadow_row_loop
80090714 shadow_sprites_loop
80090724 shadow_pixel_loop
80090780 normal_case
800907A4 no_s
800907D0 notshadow
800907E4 _4bit_conversion_table2
800907E4 customnamerender
80090834 make_sprite_size_table2
8009085C read_char
80090888 end_of_name_read
800908F4 returncharsinstring
80090910 ismy1bytestring
8009092C notand1
8009093C getnewchar
80090940 startreading
8009095C calcnextxcustom
80090984 japoldtext
8009098C ihavestringlength
800909A4 retuncharstocity
800909C0 ismy1bytecity
800909D4 retuncharstocitydiv2
800909F0 ismy1bytecitydiv2
80090A0C notand1_2


View File

@@ -0,0 +1,918 @@
; 6 files included
; 1303 lines
; 95 labels
; 0 equations
; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm
; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm
; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm
; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm
; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm
; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm
FFFFFFFF .psx ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 5
800542CC setdrawtpage: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 8
8001B0C8 storecolor: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 9
8001A070 initcopycharchain: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 10
8001A08F makecharpixels: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 11
8001A284 generatesmallchar: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 12
8001A20C makeshadowsmallchar: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 13
80019300 printbigdmatext: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 14
00008009 myaddr: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 16
FFFFFFFF .open ""C:\\Users\\Sergey\\Documents\\GitHub\\Persona2-PSX-asm-sources\\1_IS\\BIN\\SLPS_021.00"",0x8000F800; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 18
8000F800 .org 0x8008F600 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 3
8008F600 lui r2,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 8
8008F604 sw r4,-0x30(r2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 9
8008F608 lhu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 10
8008F60C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 11
8008F610 srl r2,r3,0xD ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 12
8008F614 bne r2,zero,0x8008F66C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 13
8008F618 lhu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 14
8008F61C clear r2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 16
8008F620 addiu r4,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 19
8008F624 next2bytes: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 20
8008F624 sb r3,0x0(r4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 21
8008F628 addiu r4,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 22
8008F62C addiu r5,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 23
8008F630 addiu r2,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 24
8008F634 lhu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 25
8008F638 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 26
8008F63C srl r3,r3,0xC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 27
8008F640 bne r3,zero,0x8008F650 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 28
8008F644 lhu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 29
8008F648 j 0x8008F624 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 30
8008F64C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 31
8008F650 savelengthandexit: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 33
8008F650 ori r2,0x2000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 34
8008F654 lui r3,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 35
8008F658 lw r3,-0x30(r3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 36
8008F65C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 37
8008F660 sh r2,0x0(r3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 38
8008F664 jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 39
8008F668 move r2,r4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 40
8008F66C ismystring: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 43
8008F66C lhu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 44
8008F670 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 45
8008F674 andi r3,r3,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 46
8008F678 addiu r3,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 47
8008F67C nextmybyte: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 48
8008F67C lbu r2,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 49
8008F680 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 50
8008F684 sb r2,0x0(r4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 51
8008F688 addiu r4,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 52
8008F68C addiu r3,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 53
8008F690 bne r3,zero,0x8008F67C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 54
8008F694 addiu r5,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 55
8008F698 jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 56
8008F69C move r2,r4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 57
8008F6A0 .org 0x8008F700 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 60
8008F700 lhu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 62
8008F704 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 63
8008F708 srl r2,r3,0xD ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 65
8008F70C beq r2,zero,0x8008F760 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 66
8008F710 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 67
8008F714 lbu r2,0x0(r4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 69
8008F718 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 70
8008F71C lbu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 71
8008F720 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 72
8008F724 add r2,r3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 73
8008F728 sb r2,0x0(r4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 74
8008F72C addiu r5,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 76
8008F730 sub r2,r3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 77
8008F734 addiu r4,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 78
8008F738 add r4,r2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 79
8008F73C nextmybyte2: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 81
8008F73C lbu r2,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 82
8008F740 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 83
8008F744 sb r2,0x0(r4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 84
8008F748 addiu r4,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 85
8008F74C addiu r3,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 86
8008F750 bne r3,zero,0x8008F67C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 87
8008F754 addiu r5,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 88
8008F758 jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 89
8008F75C move r2,r4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 90
8008F760 secondstrisjap: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 94
8008F760 lbu r3,0x0(r4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 96
8008F764 addiu r4,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 97
8008F768 add r4,r3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 98
8008F76C lhu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 100
8008F770 clear r2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 102
8008F774 next2bytes2: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 106
8008F774 sb r3,0x0(r4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 107
8008F778 addiu r4,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 108
8008F77C addiu r5,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 109
8008F780 addiu r2,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 110
8008F784 lhu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 111
8008F788 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 112
8008F78C srl r3,r3,0xC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 113
8008F790 bne r3,zero,0x8008F7A0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 114
8008F794 lhu r3,0x0(r5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 115
8008F798 j 0x8008F774 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 116
8008F79C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 117
8008F7A0 savelengthandexit2: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 119
8008F7A0 lui r3,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 120
8008F7A4 lw r3,-0x30(r3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 121
8008F7A8 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 122
8008F7AC lhu r3,0x0(r3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 123
8008F7B0 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 124
8008F7B4 add r2,r3,r2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 125
8008F7B8 lui r3,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 129
8008F7BC lw r3,-0x30(r3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 130
8008F7C0 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 131
8008F7C4 sh r2,0x0(r3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 132
8008F7C8 jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 133
8008F7CC move r2,r4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 134
8008F7D0 .org 0x8008F800 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 142
8008F800 move r6,ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 145
8008F804 lui r5,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 147
8008F808 ori r5,0xA7C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 148
8008F80C lui r4,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 149
8008F810 ori r4,-0x5F2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 150
8008F814 jal 0x80015FE0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 151
8008F818 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 152
8008F81C lui r5,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 154
8008F820 ori r5,0xAE4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 155
8008F824 lui r4,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 156
8008F828 ori r4,0xA7E ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 157
8008F82C jal 0x80015FE0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 158
8008F830 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 159
8008F834 lui r5,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 161
8008F838 ori r5,-0x5F4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 162
8008F83C lui r4,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 163
8008F840 ori r4,0xAE6 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 164
8008F844 jal 0x80015FE0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 165
8008F848 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 166
8008F84C move ra,r6 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 168
8008F850 ori r4,r0,0x0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 169
8008F854 j 0x80017A9C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\complex_strings_copy.asm line 171
8008F858 .org 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 22
80090000 externalprint: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 24
80090000 move v1,s3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 26
80090004 move s3,a0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 27
80090008 lhu v0,0x0(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 29
8009000C move s3,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 30
80090010 srl v1,v0,0xD ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 31
80090014 bne v1,zero,0x80090024 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 32
80090018 clear v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 33
8009001C j 0x80019300 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 34
80090020 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 35
80090024 myprintlineroutine: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 37
80090024 addiu sp,sp,-0x50 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 38
80090028 sw ra,0x4C(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 39
8009002C sw s1,0x2C(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 40
80090030 sw s2,0x30(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 41
80090034 sw s3,0x34(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 42
80090038 sw s4,0x38(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 43
8009003C sw s5,0x3C(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 44
80090040 sw s6,0x40(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 45
80090044 sw s8,0x48(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 46
80090048 sw s7,0x44(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 47
8009004C move s6,a0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 49
80090050 move s1,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 50
80090054 move s2,a2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 51
80090058 andi v0,v0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 55
8009005C addiu s6,s6,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 56
80090060 lui s3,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 57
80090064 sh v0,-0x10(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 58
80090068 sh v0,-0xE(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 59
8009006C lui t0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 62
80090070 ori t0,t0,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 63
80090074 sw s0,0x28(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 65
80090078 andi s0,a3,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 66
8009007C move a0,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 67
80090080 lui a3,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 68
80090084 lui a2,-0x100 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 69
80090088 addiu t1,a3,-0x4930 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 72
8009008C lw v1,-0x4930(a3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 73
80090090 lbu a1,0x60(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 74
80090094 lui v0,-0x8000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 75
80090098 and a2,v1,a2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 78
8009009C andi a1,a1,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 79
800900A0 and v1,v1,t0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 80
800900A4 or s4,v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 81
800900A8 lw v0,0x4(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 82
800900AC lw v1,0x0(s4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 83
800900B0 addiu v0,v0,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 84
800900B4 and v1,v1,t0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 85
800900B8 or a2,a2,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 86
800900BC sw v0,0x4(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 87
800900C0 jal 0x8001B0C8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 88
800900C4 sw a2,-0x4930(a3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 89
800900C8 move a0,s4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 90
800900CC sll a1,s1,0x10 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 92
800900D0 sra a1,a1,0x10 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 93
800900D4 sll a2,s2,0x10 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 94
800900D8 sra a2,a2,0x10 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 95
800900DC jal 0x8001A070 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 96
800900E0 move a3,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 97
800900E4 cputovram_scratchpad_template: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 100
800900E4 lui a3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 101
800900E8 ori a3,a3,0x348 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 102
800900EC lui a1,0xF00 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 104
800900F0 sw a1,0x0(a3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 105
800900F4 lui a0,-0x6000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 107
800900F8 sw a0,0x4(a3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 108
800900FC lui v0,0x1F0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 110
80090100 ori v0,0x130 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 111
80090104 sw v0,0x8(a3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 112
80090108 lui v0,0xC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 114
8009010C ori v0,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 115
80090110 sw v0,0xC(a3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 116
80090114 _1bppto4bpp_table_template: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 118
80090114 lui t8,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 120
80090118 ori t8,t8,0x390 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 121
8009011C lui t7,-0x7FFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 122
80090120 ori t7,t7,0x3E8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 123
80090124 lw t5,0x0(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 124
80090128 lw t6,0x4(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 125
8009012C sw t5,0x0(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 126
80090130 sw t6,0x4(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 127
80090134 lw t5,0x8(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 128
80090138 lw t6,0xC(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 129
8009013C sw t5,0x8(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 130
80090140 sw t6,0xC(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 131
80090144 lw t5,0x10(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 132
80090148 lw t6,0x14(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 133
8009014C sw t5,0x10(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 134
80090150 sw t6,0x14(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 135
80090154 lw t5,0x18(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 136
80090158 lw t6,0x1C(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 137
8009015C sw t5,0x18(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 138
80090160 sw t6,0x1C(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 139
80090164 rect_scratchpad_template: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 141
80090164 lui s3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 143
80090168 ori s3,0x3D0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 144
8009016C lui v0,0x400 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 145
80090170 sw v0,0x0(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 146
80090174 lui v0,0x6480 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 147
80090178 ori v0,-0x7F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 148
8009017C sw v0,0x4(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 149
80090180 ori v0,r0,-0xF40 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 150
80090184 sh v0,0xC(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 151
80090188 lhu v1,0xA8(gp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 152
8009018C ori v0,r0,0x0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 154
80090190 sw v0,0x8(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 155
80090194 sh s2,0xA(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 156
80090198 lui v0,0xC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 158
8009019C ori v0,0x8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 159
800901A0 sw v0,0x10(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 160
800901A4 sh v1,0xE(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 161
800901A8 make_sprite_size_table: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 163
800901A8 lui s3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 164
800901AC ori s3,0x3F0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 165
800901B0 lui v0,0x403 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 166
800901B4 ori v0,0x201 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 167
800901B8 sw v0,0x0(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 168
800901BC lui v1,0x706 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 169
800901C0 ori v1,0x504 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 170
800901C4 sw v1,0x4(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 171
800901C8 ori v0,r0,0x807 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 172
800901CC sh v0,0x8(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 173
800901D0 misc_init: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 175
800901D0 move t6,s1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 176
800901D4 textgroupreadloop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 180
800901D4 lui s3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 185
800901D8 ori s3,0x3F0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 186
800901DC lui t1,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 187
800901E0 lh v1,-0xE(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 189
800901E4 lui t2,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 190
800901E8 sltiu a0,v1,0xB ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 191
800901EC bne a0,zero,0x800901F8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 192
800901F0 clear s2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 193
800901F4 ori v1,r0,0xA ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 194
800901F8 readtexttobuffer: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 196
800901F8 lbu a0,0x0(s6) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 197
800901FC addiu s6,s6,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 198
80090200 addiu v1,v1,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 199
80090204 sb a0,-0xC(t2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 200
80090208 addiu s2,s2,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 201
8009020C lh v0,-0xE(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 202
80090210 addiu t2,t2,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 203
80090214 addiu v0,v0,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 204
80090218 bne v1,zero,0x800901F8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 205
8009021C sh v0,-0xE(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 206
80090220 ori a0,r0,0x0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 208
80090224 sb a0,-0xC(t2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 209
80090228 addu s3,s3,s2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 211
8009022C addiu s3,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 212
80090230 lbu a1,0x0(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 213
80090234 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 214
80090238 move t5,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 215
8009023C lui t3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 217
80090240 ori t3,t3,0x1C0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 218
80090244 form_char_data_in_scratch: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 220
80090244 jal 0x80090580 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 221
80090248 move a0,s2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 222
8009024C rect_cmd_init: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 225
8009024C lui s3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 227
80090250 ori s3,0x3D0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 228
80090254 lui s1,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 230
80090258 addiu s5,s1,-0x4930 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 231
8009025C lui s0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 232
80090260 ori s0,s0,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 233
80090264 lui s7,-0x8000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 234
80090268 lui t2,-0x100 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 245
8009026C move t4,s4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 246
80090270 move t1,s4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 247
80090274 rect_set_x: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 248
80090274 sh t6,0x8(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 252
80090278 sll v0,s2,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 254
8009027C addu v0,s2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 255
80090280 sll v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 256
80090284 addu t6,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 257
80090288 rect_set_width: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 258
80090288 sll v0,t5,0x3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 259
8009028C sh v0,0x10(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 260
80090290 pageloop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 262
80090290 lw v0,-0x4930(s1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 264
80090294 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 265
80090298 and a0,v0,t2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 266
8009029C and v0,v0,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 267
800902A0 or a1,v0,s7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 268
800902A4 lw v0,0x4(s5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 269
800902A8 lw v1,0x0(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 270
800902AC addiu v0,v0,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 271
800902B0 and v1,v1,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 272
800902B4 or a0,a0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 273
800902B8 sw v0,0x4(s5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 274
800902BC sw a0,-0x4930(s1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 275
800902C0 rect_copy_scratch_to_ram: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 277
800902C0 lw t8,0x0(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 278
800902C4 lw t7,0x4(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 279
800902C8 sw t8,0x0(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 280
800902CC sw t7,0x4(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 281
800902D0 lw a3,0x8(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 282
800902D4 lw t7,0xC(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 283
800902D8 sw a3,0x8(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 284
800902DC sw t7,0xC(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 285
800902E0 lw t8,0x10(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 286
800902E4 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 287
800902E8 sw t8,0x10(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 288
800902EC rect_scratch_connect: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 290
800902EC lw v1,0x18(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 291
800902F0 lw v0,0x0(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 292
800902F4 lw v1,0x0(v1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 293
800902F8 and v0,v0,t2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 294
800902FC and v1,v1,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 295
80090300 or v0,v0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 296
80090304 sw v0,0x0(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 297
80090308 lw a0,0x18(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 299
8009030C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 300
80090310 lw v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 301
80090314 and v1,a1,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 302
80090318 and v0,v0,t2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 303
8009031C or v0,v0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 304
80090320 sw v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 305
80090324 sw a1,0x18(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 306
80090328 lhu v0,0x4(t4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 307
8009032C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 308
80090330 bne v0,zero,0x80090340 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 309
80090334 clear s8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 310
80090338 sw a1,0x28(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 312
8009033C sw a3,0xC(t4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 313
80090340 cpu2vram_cmd_loop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 315
80090340 lw v0,-0x4930(s1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 318
80090344 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 319
80090348 and a0,v0,t2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 320
8009034C and v0,v0,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 321
80090350 or a3,v0,s7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 322
80090354 move a2,a3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 323
80090358 lw v0,0x4(s5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 324
8009035C lw v1,0x0(a3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 325
80090360 addiu v0,v0,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 326
80090364 and v1,v1,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 327
80090368 or a0,a0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 328
8009036C sw v0,0x4(s5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 329
80090370 sw a0,-0x4930(s1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 333
80090374 lui a1,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 336
80090378 ori a1,a1,0x348 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 337
8009037C lw t8,0x0(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 338
80090380 lw t7,0x4(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 339
80090384 sw t8,0x0(a2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 340
80090388 sw t7,0x4(a2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 341
8009038C lw t8,0x8(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 342
80090390 lw t7,0xC(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 343
80090394 sw t8,0x8(a2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 344
80090398 sw t7,0xC(a2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 345
8009039C sll v1,s8,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 347
800903A0 addiu v0,v1,0x130 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 348
800903A4 sh v0,0x8(a2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 349
800903A8 copy_char_data_start: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 350
800903A8 lui t3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 351
800903AC ori t3,t3,0x1C0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 352
800903B0 addiu a2,0x10 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 354
800903B4 clear v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 355
800903B8 sll v1,t5,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 357
800903BC sll a1,s8,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 358
800903C0 addu a1,t3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 359
800903C4 copy_char_data_loop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 360
800903C4 lw t7,0x0(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 361
800903C8 addu a1,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 362
800903CC sw t7,0x0(a2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 363
800903D0 addiu a2,0x4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 365
800903D4 addiu v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 366
800903D8 ori r1,r0,0xC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 367
800903DC bne v0,r1,0x800903C4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 367
800903E0 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 368
800903E4 bne s8,zero,0x800903FC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 370
800903E8 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 371
800903EC set_flush_cache_cmd: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 373
800903EC ori t8,r0,0x10 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 374
800903F0 sb t8,-0x3D(a2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 375
800903F4 lui t8,0x100 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 376
800903F8 sw t8,0x0(a2) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 377
800903FC cpu2vram_dma_link: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 379
800903FC lw v1,0x18(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 381
80090400 lw v0,0x0(a3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 382
80090404 lw v1,0x0(v1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 383
80090408 and v0,v0,t2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 384
8009040C and v1,v1,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 385
80090410 or v0,v0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 386
80090414 sw v0,0x0(a3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 387
80090418 lw a0,0x18(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 388
8009041C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 389
80090420 lw v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 390
80090424 and v1,a3,s0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 391
80090428 and v0,v0,t2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 392
8009042C or v0,v0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 393
80090430 sw v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 394
80090434 sw a3,0x18(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 395
80090438 addiu s8,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 398
8009043C bne s8,t5,0x80090340 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 399
80090440 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 400
80090444 addiu t1,t1,0x4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 402
80090448 addiu v0,t4,0x8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 403
8009044C sltu v0,t1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 404
80090450 bne v0,zero,0x80090290 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 405
80090454 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 406
80090458 chunk_making_end: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 408
80090458 lhu v0,0x4(s4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 410
8009045C lui t3,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 411
80090460 addiu v0,v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 412
80090464 lhu v1,-0xE(t3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 413
80090468 sh v0,0x4(s4) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 414
8009046C bne v1,zero,0x800901D4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 416
80090470 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 418
80090474 textend: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 420
80090474 clear s2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 421
80090478 lui s3,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 422
8009047C addiu s5,s3,-0x4930 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 423
80090480 lui s1,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 424
80090484 ori s1,s1,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 425
80090488 move s0,s4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 426
8009048C clear a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 427
80090490 pagetloop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 429
80090490 ori a2,r0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 431
80090494 addu s2,s2,a2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 432
80090498 lui v0,-0x8000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 433
8009049C lui a0,-0x100 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 434
800904A0 lw v1,-0x4930(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 435
800904A4 lw a3,0xA4(gp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 436
800904A8 and v1,v1,s1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 437
800904AC or v1,v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 438
800904B0 sw v1,0x30(s0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 439
800904B4 lw v0,-0x4930(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 440
800904B8 lw v1,0x0(v1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 441
800904BC and v0,v0,a0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 442
800904C0 and v1,v1,s1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 443
800904C4 lw a0,0x4(s5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 444
800904C8 or v0,v0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 445
800904CC sw v0,-0x4930(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 446
800904D0 addiu a0,a0,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 447
800904D4 sw a0,0x4(s5) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 448
800904D8 lw a0,0x30(s0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 449
800904DC jal 0x800542CC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 450
800904E0 addiu s0,s0,0x4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 451
800904E4 sltiu v0,s2,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 452
800904E8 bne v0,zero,0x80090490 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 453
800904EC clear a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 454
800904F0 move v0,s4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 456
800904F4 lw ra,0x4C(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 459
800904F8 lw s8,0x48(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 460
800904FC lw s7,0x44(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 461
80090500 lw s6,0x40(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 462
80090504 lw s5,0x3C(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 463
80090508 lw s4,0x38(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 464
8009050C lw s3,0x34(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 465
80090510 lw s2,0x30(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 466
80090514 lw s1,0x2C(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 467
80090518 lw s0,0x28(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 468
8009051C jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 470
80090520 addiu sp,sp,0x50 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 471
80090524 .byte 0x54,0x68,0x69,0x73,0x20,0x67,0x61,0x6D,0x65,0x20,0x77,0x61,0x73,0x20,0x6F,0x66,0x66,0x69,0x63,0x69,0x61,0x6C,0x6C,0x79,0x20,0x63,0x72,0x61,0x63,0x6B,0x65,0x64,0x20,0x62,0x79,0x20,0x53,0x45,0x52,0x47,0x45,0x59,0x20,0x53,0x48,0x45,0x4D,0x45,0x54,0x20,0x32,0x30,0x32,0x31,0x2D,0x32,0x30,0x32,0x35,0x2E,0x20,0x57,0x48,0x41,0x54,0x20,0x41,0x52,0x45,0x20,0x59,0x4F,0x55,0x20,0x44,0x4F,0x49,0x4E,0x47,0x20,0x48,0x45,0x52,0x45,0x2C,0x20,0x42,0x4F,0x59,0x3F; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 472
8009057E .byte 0x00 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 473
8009057F .byte 0x00 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 474
80090580 make_char_line_in_scratch: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 4
80090580 addiu sp,sp,-0x18 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 6
80090584 sw ra,0x10(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 7
80090588 sw t5,0x14(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 8
8009058C move t5,a0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 9
80090590 sll s3,a1,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 11
80090594 lui t7,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 12
80090598 addiu t7,-0xC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 13
8009059C char_data_clear: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 15
8009059C move a1,t3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 16
800905A0 addiu a0,a1,0x184 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 17
800905A4 ori v0,r0,0x0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 18
800905A8 char_data_loop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 19
800905A8 sw v0,0x0(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 20
800905AC addiu a1,0x4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 21
800905B0 bne a1,a0,0x800905A8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 22
800905B4 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 23
800905B8 move s1,t3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 25
800905BC ori a2,r0,0x0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 27
800905C0 lbu v0,0x0(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 28
800905C4 lbu t2,0xAC(gp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 29
800905C8 addiu t7,t7,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 30
800905CC lui a3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 32
800905D0 ori a3,a3,0x390 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 33
800905D4 chars_font_loop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 36
800905D4 addiu v0,-0x20 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 37
800905D8 beq v0,zero,0x800906B8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 39
800905DC nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 40
800905E0 lui v1,-0x7FE1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 42
800905E4 ori v1,v1,-0x5600 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 43
800905E8 sll t0,v0,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 44
800905EC sll v0,v0,0x3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 45
800905F0 addu v0,v0,t0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 46
800905F4 addu t1,v0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 47
800905F8 clear t3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 49
800905FC char_lines_loop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 51
800905FC lbu v1,0x0(t1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 52
80090600 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 53
80090604 beq v1,zero,0x800906A8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 54
80090608 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 55
8009060C its_not_empty: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 57
8009060C andi a0,v1,0xF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 59
80090610 sll a0,a0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 60
80090614 addu a0,a0,a3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 61
80090618 lhu a0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 62
8009061C srl a1,v1,0x4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 64
80090620 andi a1,a1,0xF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 65
80090624 sll a1,a1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 66
80090628 addu a1,a1,a3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 67
8009062C lhu a1,0x0(a1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 68
80090630 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 69
80090634 sll a1,0x10 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 71
80090638 or a0,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 72
8009063C mult a0,t2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 73
80090640 sll a1,a2,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 78
80090644 addu a1,a1,a2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 79
80090648 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 82
8009064C mflo t4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 83
80090650 mult t3,s3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 86
80090654 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 87
80090658 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 88
8009065C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 89
80090660 mflo a0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 90
80090664 addu a0,a0,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 93
80090668 addu a0,a0,s1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 94
8009066C andi v0,t4,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 96
80090670 sb v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 97
80090674 sra v0,t4,0x8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 99
80090678 andi v0,v0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 100
8009067C sb v0,0x1(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 101
80090680 sra v0,t4,0x10 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 103
80090684 andi v0,v0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 104
80090688 sb v0,0x2(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 105
8009068C addiu v0,t5,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 107
80090690 bne a2,v0,0x8009069C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 108
80090694 andi v1,t5,0x3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 109
80090698 beq v1,zero,0x800906A8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 111
8009069C not_last: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 113
8009069C sra v0,t4,0x18 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 114
800906A0 andi v0,v0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 115
800906A4 sb v0,0x3(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 116
800906A8 divideby4: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 118
800906A8 zero_jump: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 120
800906A8 addiu t3,t3,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 121
800906AC ori v0,r0,0xC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 122
800906B0 bne t3,v0,0x800905FC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 123
800906B4 addiu t1,t1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 124
800906B8 spacejump: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 126
800906B8 addiu a2,a2,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 127
800906BC lbu v0,0x0(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 128
800906C0 addiu t7,t7,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 129
800906C4 beq v0,zero,0x800906D4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 131
800906C8 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 132
800906CC bne a2,t5,0x800905D4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 134
800906D0 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 135
800906D4 sprite_end: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 137
800906D4 lbu v1,0xAD(gp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 138
800906D8 ori v0,r0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 139
800906DC bne v1,v0,0x800907D0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 140
800906E0 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 141
800906E4 move a0,s1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 143
800906E8 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 144
800906EC make_shadow: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 147
800906EC move a1,s3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 148
800906F0 sll a1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 149
800906F4 sll v0,s3,0x3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 150
800906F8 addu v0,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 151
800906FC addu a3,a0,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 153
80090700 addu a0,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 154
80090704 lbu t1,0xAC(gp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 156
80090708 ori t2,r0,0xF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 157
8009070C addiu t1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 158
80090710 shadow_row_loop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 161
80090710 clear t5 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 163
80090714 shadow_sprites_loop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 166
80090714 addu t7,a3,t5 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 168
80090718 lw t0,0x0(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 169
8009071C clear a2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 170
80090720 ori a1,r0,0x4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 171
80090724 shadow_pixel_loop: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 174
80090724 move a1,a2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 175
80090728 addiu a1,a1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 176
8009072C sll a1,a1,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 177
80090730 sll v0,a2,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 179
80090734 sllv v0,t2,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 180
80090738 and v0,t0,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 181
8009073C beq v0,zero,0x800907A4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 182
80090740 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 183
80090744 ori v0,r0,0x7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 186
80090748 bne a2,v0,0x80090780 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 187
8009074C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 188
80090750 addu t8,t7,s3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 191
80090754 addiu t8,t8,0x4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 192
80090758 lw v1,0x0(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 193
8009075C ori v0,r0,0xF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 194
80090760 and v0,v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 195
80090764 bne v0,zero,0x800907A4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 196
80090768 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 197
8009076C move v0,t1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 198
80090770 or v0,v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 199
80090774 sw v0,0x0(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 200
80090778 b 0x800907A4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 201
8009077C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 202
80090780 normal_case: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 204
80090780 addu t8,t7,s3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 205
80090784 lw v1,0x0(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 206
80090788 sllv v0,t2,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 207
8009078C and v0,v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 208
80090790 bne v0,zero,0x800907A4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 209
80090794 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 210
80090798 sllv v0,t1,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 211
8009079C or v0,v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 212
800907A0 sw v0,0x0(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 213
800907A4 no_s: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 215
800907A4 addiu a2,a2,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 216
800907A8 sltiu v0,a2,0x8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 217
800907AC bne v0,zero,0x80090724 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 218
800907B0 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 219
800907B4 addiu t5,t5,0x4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 221
800907B8 bne t5,s3,0x80090714 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 222
800907BC nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 223
800907C0 subu a3,s3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 226
800907C4 sltu v0,a3,a0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 227
800907C8 beq v0,zero,0x80090710 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 228
800907CC nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 229
800907D0 notshadow: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 231
800907D0 lw t5,0x14(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 232
800907D4 lw ra,0x10(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 233
800907D8 move v0,s1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 234
800907DC jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 235
800907E0 addiu sp,sp,0x18 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_charload_grouped.asm line 236
800907E4 customnamerender: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 6
800907E4 _4bit_conversion_table2: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 7
800907E4 lui t8,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 8
800907E8 ori t8,t8,0x390 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 9
800907EC lui t7,-0x7FFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 10
800907F0 ori t7,t7,0x3E8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 11
800907F4 lw t5,0x0(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 12
800907F8 lw t6,0x4(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 13
800907FC sw t5,0x0(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 14
80090800 sw t6,0x4(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 15
80090804 lw t5,0x8(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 16
80090808 lw t6,0xC(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 17
8009080C sw t5,0x8(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 18
80090810 sw t6,0xC(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 19
80090814 lw t5,0x10(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 20
80090818 lw t6,0x14(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 21
8009081C sw t5,0x10(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 22
80090820 sw t6,0x14(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 23
80090824 lw t5,0x18(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 24
80090828 lw t6,0x1C(t7) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 25
8009082C sw t5,0x18(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 26
80090830 sw t6,0x1C(t8) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 27
80090834 make_sprite_size_table2: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 29
80090834 lui s3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 30
80090838 ori s3,0x3F0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 31
8009083C lui v0,0x403 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 32
80090840 ori v0,0x201 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 33
80090844 sw v0,0x0(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 34
80090848 lui v1,0x706 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 35
8009084C ori v1,0x504 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 36
80090850 sw v1,0x4(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 37
80090854 clear a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 40
80090858 lui v1,-0x7FF7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 41
8009085C read_char: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 42
8009085C lbu v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 43
80090860 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 44
80090864 sb v0,-0xC(v1) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 46
80090868 beq v0,zero,0x80090888 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 47
8009086C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 48
80090870 addiu v1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 49
80090874 addiu a1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 50
80090878 addiu a0,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 51
8009087C sltiu v0,a1,0x7 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 52
80090880 bne v0,zero,0x8009085C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 53
80090884 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 54
80090888 end_of_name_read: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 56
80090888 move a0,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 57
8009088C addu s3,s3,a0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 58
80090890 addiu s3,-0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 59
80090894 lbu a1,0x0(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 60
80090898 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 61
8009089C lui s3,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 63
800908A0 ori s3,0x3B0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 64
800908A4 lui a2,0x121 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 66
800908A8 ori a2,0x3C8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 67
800908AC sw a2,0x0(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 68
800908B0 lui a2,0xC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 69
800908B4 sll a1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 70
800908B8 or a2,a1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 71
800908BC sw a2,0x4(s3) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 72
800908C0 sra a1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 73
800908C4 lui t3,-0x7FF8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 75
800908C8 ori t3,t3,-0x1000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 76
800908CC jal 0x80090580 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 78
800908D0 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 79
800908D4 lui a0,0x1F80 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 81
800908D8 ori a0,0x3B0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 82
800908DC jal 0x8004F994 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 83
800908E0 move a1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 84
800908E4 jal 0x8004F6E8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 85
800908E8 clear a0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 86
800908EC j 0x800CA148 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 88
800908F0 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\IS_battle_GG_name_render.asm line 89
800908F4 returncharsinstring: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 1
800908F4 lhu v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 4
800908F8 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 5
800908FC srl v0,v0,0xD ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 6
80090900 bne v0,zero,0x80090910 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 7
80090904 clear v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 8
80090908 j 0x80090940 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 11
8009090C nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 12
80090910 ismy1bytestring: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 13
80090910 lhu v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 14
80090914 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 15
80090918 andi v0,v0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 16
8009091C andi v1,v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 18
80090920 beq v1,zero,0x8009092C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 19
80090924 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 20
80090928 addiu v0,v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 21
8009092C notand1: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 23
8009092C sra v0,v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 24
80090930 addiu v0,v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 25
80090934 jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 26
80090938 move v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 27
8009093C getnewchar: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 29
8009093C addiu v1,v1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 30
80090940 startreading: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 31
80090940 lhu v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 32
80090944 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 33
80090948 sltiu v0,v0,0x1000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 34
8009094C bne v0,zero,0x8009093C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 35
80090950 addiu a0,a0,0x2 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 36
80090954 jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 37
80090958 move v0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 38
8009095C calcnextxcustom: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 41
8009095C addiu sp,sp,-0x18 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 42
80090960 sw ra,0x10(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 43
80090964 lhu v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 45
80090968 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 46
8009096C andi v1,v0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 47
80090970 srl v0,v0,0xD ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 48
80090974 beq v0,zero,0x80090984 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 49
80090978 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 50
8009097C j 0x8009098C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 51
80090980 move v0,v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 52
80090984 japoldtext: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 53
80090984 jal 0x800908F4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 54
80090988 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 55
8009098C ihavestringlength: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 56
8009098C sll v1,v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 57
80090990 addu v1,v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 58
80090994 lw ra,0x10(sp) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 59
80090998 sll v0,v1,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 60
8009099C jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 61
800909A0 addiu sp,sp,0x18 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 62
800909A4 retuncharstocity: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 64
800909A4 lhu v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 65
800909A8 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 66
800909AC srl v0,v0,0xD ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 67
800909B0 bne v0,zero,0x800909C0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 68
800909B4 clear v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 69
800909B8 j 0x80090940 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 71
800909BC nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 72
800909C0 ismy1bytecity: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 73
800909C0 lhu v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 74
800909C4 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 75
800909C8 andi v0,v0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 76
800909CC jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 77
800909D0 move v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 78
800909D4 retuncharstocitydiv2: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 81
800909D4 lhu v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 82
800909D8 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 83
800909DC srl v0,v0,0xD ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 84
800909E0 bne v0,zero,0x800909F0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 85
800909E4 clear v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 86
800909E8 j 0x80090940 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 88
800909EC nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 89
800909F0 ismy1bytecitydiv2: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 90
800909F0 lhu v0,0x0(a0) ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 91
800909F4 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 92
800909F8 andi v0,v0,0xFF ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 93
800909FC andi v1,v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 95
80090A00 beq v1,zero,0x80090A0C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 96
80090A04 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 97
80090A08 addiu v0,v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 98
80090A0C notand1_2: ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 100
80090A0C sra v0,v0,0x1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 101
80090A10 jr ra ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 103
80090A14 move v1,v0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\charCalcs.asm line 104
80090A18 .close ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\is_main_grouped.asm line 480
FFFFFFFF .open ""C:\\Users\\Sergey\\Documents\\GitHub\\Persona2-PSX-asm-sources\\1_IS\\BIN\\SLPS_021.00"",0x8000F800; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 7
8000F800 .org 0x8001AEF4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 49
8001AEF4 j 0x800908F4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 50
8001AEF8 clear v1 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 51
8001AEFC .org 0x8001AF1C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 56
8001AF1C j 0x8009095C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 59
8001AF20 nop ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 60
8001AF24 .close ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 62
FFFFFFFF .open ""C:\\Users\\Sergey\\Documents\\GitHub\\Persona2-PSX-asm-sources\\1_IS\\BIN\\1096_J_MENU_Settings_Code.bin"",0x800A2000; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 67
800A2000 .org 0x800A2658 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 69
800A2658 ori a1,r0,0x5C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 70
800A265C .org 0x800A2678 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 71
800A2678 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 72
800A267C .org 0x800A2690 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 73
800A2690 jal 0x8001AFC0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 74
800A2694 .org 0x800A26AC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 77
800A26AC jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 78
800A26B0 .org 0x800A26E8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 79
800A26E8 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 80
800A26EC .org 0x800A298C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 81
800A298C jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 82
800A2990 .org 0x800A29B8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 83
800A29B8 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 84
800A29BC .org 0x800A29F4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 85
800A29F4 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 86
800A29F8 .org 0x800A2A44 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 87
800A2A44 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 88
800A2A48 .org 0x800A2D20 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 89
800A2D20 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 90
800A2D24 .org 0x800A2D4C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 91
800A2D4C jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 92
800A2D50 .org 0x800A2D7C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 93
800A2D7C jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 94
800A2D80 .org 0x800A3090 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 95
800A3090 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 96
800A3094 .org 0x800A30CC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 97
800A30CC jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 98
800A30D0 .org 0x800A35AC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 99
800A35AC jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 100
800A35B0 .org 0x800A35E0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 101
800A35E0 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 102
800A35E4 .org 0x800A3624 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 103
800A3624 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 104
800A3628 .org 0x800A3658 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 105
800A3658 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 106
800A365C .org 0x800A369C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 107
800A369C jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 108
800A36A0 .org 0x800A36D0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 109
800A36D0 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 110
800A36D4 .org 0x800A3704 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 111
800A3704 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 112
800A3708 .org 0x800A3734 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 113
800A3734 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 114
800A3738 .org 0x800A3BA8 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 115
800A3BA8 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 116
800A3BAC .org 0x800A3BDC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 117
800A3BDC jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 118
800A3BE0 .org 0x800A3C20 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 119
800A3C20 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 120
800A3C24 .org 0x800A3C4C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 121
800A3C4C jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 122
800A3C50 .org 0x800A3C90 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 123
800A3C90 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 124
800A3C94 .org 0x800A3CBC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 125
800A3CBC jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 126
800A3CC0 .org 0x800A4310 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 127
800A4310 jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 128
800A4314 .org 0x800A435C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 129
800A435C jal 0x80090000 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 130
800A4360 .close ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 132
FFFFFFFF .open ""C:\\Users\\Sergey\\Documents\\GitHub\\Persona2-PSX-asm-sources\\1_IS\\BIN\\1119_CITY_CODE_patched_2023.bin"",0x800AB000; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 137
800AB000 .org 0x800AD30C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 153
800AD30C jal 0x800909A4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 154
800AD310 .org 0x800AD3AC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 158
800AD3AC jal 0x800909A4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 159
800AD3B0 .org 0x800AF1DC ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 162
800AF1DC jal 0x8001AF1C ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 164
800AF1E0 .close ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 167
FFFFFFFF .open ""C:\\Users\\Sergey\\Documents\\GitHub\\Persona2-PSX-asm-sources\\1_IS\\BIN\\0001_BATTLE_CODE.bin"",0x800AB000; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 205
800AB000 .org 0x800CA0F0 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 208
800CA0F0 j 0x800907E4 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 214
800CA0F4 move a0,s3 ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 215
800CA0F8 .close ; C:\Users\Sergey\Documents\GitHub\Persona2-PSX-asm-sources\1_IS\txtpatches.asm line 217

View File

@@ -0,0 +1,89 @@
//
// Persona 2 Innocent Sin (PSX) JAP / Custom Name Render In Battle
// Author: Sergey Shemet 06/10/2025
customNameRender:
_4bit_conversion_table2:
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)
make_sprite_size_table2:
lui s3, 0x1f80
ori s3, 0x03f0 // Будем серить в scratch
lui v0, 0x0403 // таблицей рассчитанных команд и ширин
ori v0, 0x0201 // необходимых для спрайтов линии (cmdCount << 2)
sw v0, 0x0(s3)
lui v1, 0x0706
ori v1, 0x0504
sw v1, 0x4(s3)
//адрес текста в a0
clear a1
lui v1, MyAddr
read_char:
lbu v0, 0x0(a0)
nop
sb v0, -0x0c(v1) // Запись символа в буфер
beq v0, zero, end_of_name_read
nop
addiu v1, 0x1 //Увеличиваем адрес записи в буфер
addiu a1, 0x1 //Счётчик +1
addiu a0, 0x2 //адрес чтения + 2
sltiu v0, a1, 0x7
bne v0, zero, read_char //Продолжаем 6 символов...
nop
end_of_name_read:
move a0, a1 // Перебрасываем cчётчик символов в a0
addu s3, s3, a0 // получаем адрес количества спрайтов из таблицы
addiu s3, -0x1 // index -1
lbu a1, 0x0(s3) // Читаем количество ширину спрайтов в a1
nop
lui s3, 0x1f80 //Формируем данные rect для команды LoadImage в scratch
ori s3, 0x03b0 // адрес хранения Rect
lui a2, 0x0121 //Y
ori a2, 0x03C8 //X
sw a2, 0x0(s3)
lui a2, 0x000C //Heigth
sll a1, 1 //*2 = Ширина в 16 битах
or a2, a1 //Совмещаем ширину
sw a2, 0x4(s3)
sra a1, 1 //Возвращаем ширину блоков спрайта и передаём в функцию
lui t3, 0x8008
ori t3, t3, 0xf000 // Начало данных спрайта в scratch
jal make_char_line_in_scratch //Формируем символы в scratch
nop
lui a0, 0x1f80 // Формируем аргументы команды LoadImage
ori a0, 0x03b0 // адрес хранения Rect
jal 0x8004f994 //Вызов LoadImage
move a1, v0 //Адрес данных символов
jal 0x8004f6e8 //Тут же вызов DrawSync
clear a0 //Обязательно обнуляем аргумент 0
j 0x800ca148 //Возврат в оригинальную процедуру
nop

View File

@@ -0,0 +1,236 @@
// 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:
move a1, t3 //dest address
addiu a0, a1, 0x184
li v0, 0
char_data_loop:
sw v0, 0x0(a1)
addiu a1, 0x4
bne a1, a0, char_data_loop
nop
move s1, t3 // 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
move a0, s1
nop
make_shadow: //s3 - line width in bytes, a0 - data start
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:
move a1, a2 // a1 = текущий X пиксель
addiu a1, a1, 0x1 // +1 пиксель вправо
sll a1, a1, 0x2 // ×4 (перевод в биты)
sll v0, a2, 0x2 // v0 = смещение исходного пикселя (X * 4)
sllv v0, t2, v0 // v0 = маска для исходного пикселя
and v0, t0, v0 // проверяем есть ли исходный пиксель
beq v0, zero, no_s // если пикселя нет, пропускаем
nop
//Проверяем граничный случай (8-й пиксель)
li v0, 0x7 // последний пиксель (X = 7)
bne a2, v0, normal_case // если не 8-й пиксель - обычная обработка
nop
// Граничный случай: 8-й пиксель исходного спрайта
// Тень будет в позиции a1 = 32 (8 × 4) - это следующий word!
addu t8, t7, s3 // адрес следующей строки
addiu t8, t8, 0x4 // переходим к следующему word
lw v1, 0x0(t8) // загружаем следующий word
li v0, 0xF // маска для ПЕРВОГО пикселя в новом word
and v0, v1, v0 // проверяем занятость (биты 0-3 нового word)
bne v0, zero, no_s // если занято - пропускаем
nop
move v0, t1 // цвет тени (в биты 0-3 нового word)
or v0, v1, v0 // добавляем тень
sw v0, 0x0(t8) // сохраняем
b no_s
nop
normal_case:
addu t8, t7, s3 // этот же word в следующей строке
lw v1, 0x0(t8) // следующая строка
sllv v0, t2, a1 // маска для пикселя тени
and v0, v1, v0 // проверяем занятость
bne v0, zero, no_s // если занято - пропускаем
nop
sllv v0, t1, a1 // цвет тени
or v0, v1, v0 // добавляем тень
sw v0, 0x0(t8) // сохраняем
no_s:
addiu a2, a2, 0x1 // следующий пиксель
sltiu v0, a2, 0x8 // X < 8 (все 8 пикселей!)
bne v0, zero, shadow_pixel_loop
nop
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
move v0, s1
jr ra
addiu sp, sp, 0x18

485
1_IS/IS_main_grouped.asm Normal file
View File

@@ -0,0 +1,485 @@
;
; 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 "1_IS/BIN/SLPS_021.00", 0x8000F800
.include "1_IS/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, 0x0403 // таблицей рассчитанных команд и ширин
ori v0, 0x0201 // необходимых для спрайтов линии (cmdCount << 2)
sw v0, 0x0(s3)
lui v1, 0x0706
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 // Храним количество блоков для спрайта
lui t3, 0x1f80
ori t3, t3, 0x1c0 // Начало данных спрайта в scratch
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:
sll v0, t5, 3 //Количество блоков спрайта * 8 = ширина спрайта
sh v0, 0x10(s3) // Сохраняем ширину спрайта
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 "1_IS/IS_charload_grouped.asm"
.include "1_IS/IS_battle_GG_name_render.asm"
.include "1_IS/charCalcs.asm"
.close
.include "1_IS/txtpatches.asm" // misc text patches
// compile with ./armips -sym 1_IS/BUILD_LOGS/SLPS_021.00.map -temp 1_IS/BUILD_LOGS/SLPS_021.00.txt 1_IS/is_main_grouped.asm

760
1_IS/_OLD_main.asm Normal file
View File

@@ -0,0 +1,760 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 0x8000F800
.include "complex_strings_copy.asm" ;Make complex strings in battles
;;neeeeed to init 8008fff6 = min dma commands
.org 0x80090000
ExternalPrint:
;;;;;;;text routing test routine
move r3,s3
move s3,r4
lhu v0,0x0(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
move s3,r3
srl v1,v0,0xD ;;;;Check 13th bit (1byte system !!!)
bne v1,zero,MyPrintLineRoutine
clear v1
j PrintBigDMAText
nop
;;;;;;;;;;;;;;;;;MyPrintLineRoutine
MyPrintLineRoutine:
addiu sp,sp,-0x50
sw s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
clear r25 ;CURRENT TEXT MODE
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,0x2 ;Moving text read pointer +2bytes
lui s3,MyAddr
sw v0,-0x10(s3) ;store bytecounter @ 8008fff0 and clean charCounter (8008fff2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lui s3,0x1f80
ori s3,s3,0x3d0 ;s3 = 1f8003d0 - copysprite cmd in scratch
lui t0,0xff
ori t0,t0,0xffff ;t0 = 00FFFFFF
sw s0, 0x28(sp) ;save s0 in stack
andi s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(sp)
;;init chains
and r6,v1,r6 ;r6 = r3 & ff000000 = FF000000
andi r5,r5,0xff ;clean text mode (color/shadow)
and v1,v1,t0 ;r3 & 00ffffff
or r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;r3 = next free Chain
addiu v0,v0,-0x1 ;DMA Counter-1
and v1,v1,t0 ; r3 & r8 (00ffffff) cut f.byte
or r6,r6,v1 ; r6 | r3 = ff+r3 = next free Chain (FF...) +
sw v0,0x4(t1) ;save DMACounter
jal storeColor
sw r6,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;SAVE 013001f0 TO SCRATCH
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; Copy Sprite DMA Command Forming
li v0,0x4
sb v0,0x3(s3) ; 04 00 00 00 to 3d0 (sb 04 to 3d3) CHAIN LENGTH
li v0,0x64
sb v0,0x7(s3) ;sb 64 to 3d7 (copySpriteCommand)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,0x3f
LAB_800194fc: ;decoding coords for source sprite
sra v0,t0,0x6 ;r2 = r6 >> 6 = 4
sll v0,v0,0x6 ;r2 << 6 = 100
subu v0,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(gp) ;r3 = load Y half from mem
sll v0,v0,0x2 ;r2 << 2
sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE RECT SRC CHAR SPRITE X BYTE
bgez v1,LAB_80019520 ;if Y r3>=0 - branch & r2=r3
move v0,v1
addiu v0,v1,0xff ;else r2 = ff - r3
LAB_80019520:
sra v0,v0,0x8
sll v0,v0,0x8
subu v0,v1,v0
sb v0,0xd(s3) ; >DAT_1f8003dd ;STORE RECT SRC CHAR SPRITE Y BYTE
lhu v1,0xa8(gp)
;DIFF BETWEEN VERSs::::::::::::::::::::::
li v0,0x8 ; r2 = 8 Sprite WIDTH
sh v0,0x10(s3) ; 3e0 - 0008 save
sh v1,0xe(s3);=>DAT_1f8003de ; *3de = r3 = 7df3 CLUT of RECT
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,0x8000 ;r3 = 8000 0000
NextChar:
addiu r4,r4,-0x20 ;Shift unprintable symbols
li t2, 0xa0 ; минимальное значение оптимизированного кода (a0+20 = 192 (Русская А))
sltu v0,r4,t2
bne v0, zero, NotOptimized ; проверяем на русский текст и перепрыгиваем на старый режим, если нет.
nop
.include "main_spritecopy.asm"
NotOptimized:
;ОБРАБОТКА ПРОБЕЛОВ
bne r4,zero,SpaceCheckBranch ;Если не пробел - перепрыгиваем сразу
nop
lui t2,MyAddr
lh v0,-0xE(t2) ;Load my temp CHAR COUNTER for check
nop
lh t3,-0x10(t2)
addiu v0,v0,1 ;overall chars+1
beq v0,t3,SpaceCheckBranch ;is last char - пробел не проверяем!
nop
sh v0,-0xE(t2) ;Save charcount += 1
lbu r4,0x0(s6) ;LOAD NEXT CHAR
nop
j NextChar
addiu s6,s6,0x1 ;Shift read address +1 byte
SpaceCheckBranch:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; Coords XY init
lw v0,0xb0(gp); =>DAT_8007b240_parms load r2 from r28+0b0 (7b240)(Xoffs)
lui t2,MyAddr
lh v1,-0xE(t2) ;Load my temp CHAR COUNTER for check
; lhu v1,0x4(r20) ; current char = r3 = half *DMAAddr + 4
addiu v0,v0,0x6 ; 0x06 * 6px btw letters!
mult v1,v0 ; r3*r2 = xOffs*charNum
lui t2,0xff00 ; r10 = ld upper ff00 = ff000000
move t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
lhu t5,0x20(sp) ; r13 = ld half (sp+20) = 003A ---X from sp+20 !!
mflo t6 ; r14 = lo
addu v0,t5,t6 ; r2 = r13 + r14 = X + Offset
sh v0,0x8(s3) ;DAT_1f8003d8 save r2 half to 1f8003d8 = X (3A) !!!!!!!!!!!!!!!!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IF Mode is not 0 = load 2 to page counter
PageLoop:
;MAKING COPYSPRITE CHAIN
lw v0,-0x4930(s1); r2 = *freeChainAddr
nop
and r4,v0,t2 ; r4 = r2 & ff00..
and v0,v0,s0 ; r2 & 00FFFFFF
or r5,v0,s7 ; r5 = r2 or r23 (80000000) = 801ADF10
lw v0,0x4(s5) ; CmdCounter r2 = *7b6d0+4 = 705
lw v1,0x0(r5) ; r3 = New Free ChainAddr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut begin byte
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
contStandartDMA:
lui t6,0x500 ; set 4 commands in next chain
nop
sw t6,0x0(r5) ; set 5 commands
nop
lui t6, 0xe100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ori t6,0x0234 ;;;;;;;make changepage command in every command to standart
sw t6,0x4(r5) ;store it before all 6400000 command
addiu r5,4 ;SHIFT DEST ADDR
lw t7,0x4(s3) ;>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd
lw t8,0x8(s3) ;>DAT_1f8003d8 r24 = 001500d1 - xy screen coords
lw t5,0xc(s3); >DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page)
sw t7,0x4(r5) ; *r5+4 = r15
sw t8,0x8(r5) ; *r5+8 = r24
sw t5,0xc(r5) ; *r5+c = r13
lw t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,0x10(r5) ; *r5+10 = r14 - LAST COMMAND SAVE
addiu r5,-0x4 ;SHIFT DEST ADDR MINUS
clear r25 ;clearing r25 (reset current chars status)
lw v1,0x18(t1) ;r3 = *r9+18 (next param???)
lw v0,0x0(r5) ; r2 = *cur New Chainaddr
lw v1,0x0(v1) ; r3 = *r3
and v0,v0,t2 ; r2 & ff000000
and v1,v1,s0 ;r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 04FFFFFF - commands with FFFFFF
sw v0,0x0(r5) ; *curChainAddr r5 = r2 (upd ..04 with ..FF04)
lw r4,0x18(t1) ; r4 = *r8+18 (first chain addr?)
nop
lw v0,0x0(r4) ; r2 = *r4 FIRST CHAIN LINK TO NEXT??
and v1,r5,s0 ; r3 = r5 (cur chain) & 00FFFFFF
and v0,v0,t2 ; r2 & FF000000
or v0,v0,v1 ; r2 | r3 = last chain adr w 10&....
sw v0,0x0(r4) ; *r4 = r2 FIRST CHAIN NEXT ADDR???
sw r5,0x18(t1) ;t0->t1 ; r5 = *r8+18 curChainAddr
lhu v0,0x4(t4) ;t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
clear v0
sb v0,0x3c(r20) ;store first char offset for moving string (is first in new type)
;sh v0,-0x8(t4) ;store first char offset for moving string (is first in new type)
nop
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lw v1,0x0(r7) ; r3 = New Free ChainAddr / currHeader Addr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,0x0(r5);>DAT_1f800348
lwl t7,0x7(r5)
lwr t7,0x4(r5);>DAT_1f80034c
lwl t8,0xb(r5)
lwr t8,0x8(r5);>DAT_1f800350
lwl t5,0xf(r5)
lwr t5,0xc(r5);>DAT_1f800354
swl t6,0x3(r6)
swr t6,0x0(r6)
swl t7,0x7(r6)
swr t7,0x4(r6)
swl t8,0xb(r6)
swr t8,0x8(r6)
swl t5,0xf(r6)
swr t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
lw v1,0x18(t1) ; r3 = current DMACopySprite Chain
lw v0,0x0(r7) ; r2 = current CharChainCommands
lw v1,0x0(v1) ; r3 = *r3 (comNum+FFFFFF(nextLink))
and v0,v0,t2 ; r2 & FF.....
and v1,v1,s0 ; r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 10FFFFFF(cmdNum&FF..)
sw v0,0x0(r7) ; *r7 = r2 saveCurChainCmd
lw r4,0x18(t1) ; r4 = r8+18h - cur CopySpriteCmd hdrAddr
nop
lw v0,0x0(r4) ; r2 = *r4 (04FFFFFF)
and v1,r7,s0 ; r3 = r7 & 00FFFFFF (Copying Cur Char Chain)
and v0,v0,t2 ; r2 & FF000000 (04000000) CmdCount
or v0,v0,v1 ; R2 | R3 = 04(cmd)..+CharChainAddr
sw v0,0x0(r4) ; *r4 = r2 = FullCommand With Link!!!
; (04..CharAddr) + SpriteCopyCommand
sw r7,0x18(t1) ; *r8+18 = Last Char Chain!
addiu t1,t1,0x4 ; r8 (params) += 4 (shift params for NextPage)
addiu v0,t4,0x8 ; r2 = r9+8 (shift first chain param for Page)
sltu v0,t1,v0 ; r2 = r8 < r2(r9+8) (first page pass)
bne v0,zero,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
OptimizedSpriteCopyEnd:
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charDMACount
nop
addiu v0,v0,0x1 ; a += 1
sh v0,0x4(r20) ;save DMAcounter to chain
nop
;DMA OVERFLOW CHECK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (8007b6d4)
lui t3,MyAddr
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lhu v1,-0xC(t3) ;v1 = 8008fff4 = minimum cmd counter
nop
sltu v0,v0,v1 ; v0 = v0 < V1 ?
bne v0,zero,TextEnd ;if v0<>0 then Goto End Text (DMA OVERFLOW!!!!)
nop
;lui t3,MyAddr
lhu v0,-0xE(t3) ; r2 = charCount In string
lhu v1,-0x10(t3) ; r3 = My charOverAll In string
addiu v0,v0,0x1 ; a += 1
lbu r4,0x0(s6) ; load next Char to r4 (byte)
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
addiu s6,s6,0x1 ;Shift CharAddr
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; r16 = r20 (currentTLineParam)
clear r5
clear r25 ;clearing r25 (reset current chars status)
PageTLoop: ;ALMOST FINISH!!!!
li r6,0x1 ; r6=1
addu r18,r18,r6 ; r18(Counter) += r6
lui v0,0x8000 ; r2 = 80000000
lui r4,0xff00 ; r4 = ff00 0000
lw v1,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
;;;;;;;;;;;;;;;;
lw r7,0xa4(gp);>DAT_8007b234 r7 = Texture page = 34
beq r25,zero, lastTextPageDefaul
nop
li r7,0x3f ;IF MODE<>0 then TexturePage = 23F
;;;;;;;;;;;;;;;''
lastTextPageDefaul:
and v1,v1,s1 ; r3 & 00FFFFFF
or v1,v1,v0 ; r3 | r2 = 80.....
sw v1,0x30(s0) ; store last free ChAddr to DMAParams
lw v0,-0x4930(s3);>8007b6d0_freeChain r2 = next free chain
lw v1,0x0(v1) ; r3 = *r3 = last chain - made one more chain
and v0,v0,r4 ; a2 & ff000000
and v1,v1,s1 ; r3 & 00FFFFFF
lw r4,0x4(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>DAT_8007b6d4_CmdCounter Store DMA Count
lw r4,0x30(s0) ; r4 = *DMA params + 30 = Start Of DMA Chain
jal SetDrawTPage ; Set DRAW PAGE
addiu s0,s0,0x4 ; r16 += 4 - Shgift DMAParams for next Page
sltiu v0,r18,0x2 ; r2 = r18<2
bne v0,zero,PageTLoop ; if not r2 then goto Loop
clear r5 ; r5 = 0
move v0,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,0x48(sp)
lw s7,0x44(sp)
lw s6,0x40(sp)
lw s5,0x3c(sp) ;restoring regs from Stack
lw s4,0x38(sp)
lw s3,0x34(sp)
lw s2,0x30(sp)
lw s1,0x2c(sp)
lw s0,0x28(sp)
jr ra
addiu sp,sp,0x50
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chars / 2 Return Func
.include "charload.asm"
.include "charCalcs.asm"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001a7dc
;;;;;text patch for Text MOVING & OFFSET
;make branch videocomand reading
chainSpriteCheck:
lbu v1,0x7(r5)
li r27, 0xe1
beq r27, v1, ShiftedCommandCheck
nop
j 0x8001a7e4 ;return
nop
ShiftedCommandCheck:
lbu v1,0xb(r5) ;my new shifted sprite command
li r27, 0x64
beq r27, v1, ShiftedCommandCheck2
nop
lbu v1,0x7(r5)
nop
j 0x8001a7e4 ;return
nop
ShiftedCommandCheck2:
lbu v1,0xb(r5)
goingback:
j 0x8001a7e4 ;return
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001aa8c
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;text patch for Text MOVING & OFFSET
getRightCoords:
; lw r5, 0x28(t1) ;get chain addr from params
;lhu r3, 0xc(t2) ;get X from params
lbu r4,0x7(r5)
li r2,0xe1 ;if my new 5 commands?
bne r2,r4,oldStyleCommand
nop
addiu r5,4
oldStyleCommand:
lhu r2, 0x8(r5) ;getting cur x (r5 is chain addr) --------!
lhu r4, 0xe(t2) ;;getting Y from param
subu r3,r3,r2 ; get X offset
move r12,r3 ; Saving X offset in r12
lhu r2, 0xa(r5) ;getting cur y from chain ----------!
sll r3,r3,0x10 ;Shift r3 <<< 10 bits
;add r2,r23 ;add
subu r2,r4,r2 ;get Y offset
;clear r23
returnToInnocence:
j 0x8001aaa8 ;continue!
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001ab2c
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movesprite:
lbu r2,0x07(r4)
nop
beq r2, t7, simpleSpriteCmd ;if r2 == t7 = 64
nop
beq r2, t6, simpleSpriteCmd ;if r2 == t6 = 66 --simple move
nop
li r3, 0xe1
beq r2, r3, IsThisMyChain ;ReallyMyChain
nop
j exitmovesprite
nop
ReallyMyChain:
lbu r2,0x03(r4)
li r3, 0x05
beq r2, r3, IsThisMyChain
nop
j exitmovesprite
nop
IsThisMyChain:
lbu r2,0x0b(r4)
nop
beq r2, t7, notSimpleSpriteCommand ;is this my E1 + 64?
nop
j exitmovesprite
nop
notSimpleSpriteCommand:
lbu r3,0x3c(t2) ;get offset X
lhu r2,0x0c(r4)
sra r3, r3, 0x4 ;shift 12 >> 4 = 1 pix (OR 0)
addu r2,r2,t4
addu r2,r2,r3 ;adding myMainOffset X
sh r2,0xC(r4)
lbu r2,0x3c(t2) ;get offset Y
lhu r3,0xE(r4)
andi r2, r2, 0xF ;get Y offset
addu r3,r3,t3
addu r3,r3,r2 ;adding myMainOffset
;addiu r3,r3,2
sh r3,0xE(r4)
nop
j exitmovesprite
nop
simpleSpriteCmd:
lhu r2,0x8(r4)
lhu r3,0xA(r4)
addu r2,r2,t4
addu r3,r3,t3
sh r2,0x8(r4)
sh r3,0xA(r4)
nop
exitmovesprite:
j 0x8001ab5c ;EXIT TO MAIN routine
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SET TEXT BRIGHTNESS
setTextBrightness:
lbu r2,0x07(v1)
nop
beq r2, t1, simpleBright ;if r2 == t7 = 64
nop
beq r2, t0, simpleBright ;if r2 == t6 = 66 --simple move
nop
li r15, 0xe1
beq r2, r15, ItsMyBrigth1 ;ReallyMyChain
nop
j exitbrightsprite
nop
ItsMyBrigth1:
lbu r2,0x0b(v1)
nop
beq r2, t1, ItsMyBrigthMake ;is this my E1 + 64?
nop
j exitbrightsprite
nop
ItsMyBrigthMake:
sb s1,0x8(v1)
sb s2,0x9(v1)
sb s3,0xa(v1)
j 0x8001ad6c
nop
simpleBright:
sb s1,0x4(v1)
sb s2,0x5(v1)
sb s3,0x6(v1)
exitbrightsprite:
j 0x8001ad6c
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Patching main code
.org 0x8001a7dc
;lbu v1,0x7(r5) ;- ORIGINAL load current command
j chainSpriteCheck
nop
.org 0x8001aa8c
;lhu r2, 0x8(r5) ;getting cur x (r5 is chain addr) --------!
;lhu r4, 0xe(t2) ;;getting Y from prarm param
j getRightCoords
nop
.org 0x8001ab2c
;lbu v0,0x07(a0)
j movesprite ;movingsprite routine
nop
.org 0x8001ad48
;lbu v0,0x07(a1)
j setTextBrightness ;textbrightness routine
nop
.close
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
;.include "battle_patch.asm"
.include "txtpatches.asm" ;misc text patches
; COMPILE COMMAND: ./armips -temp 123 main.asm

View File

@@ -0,0 +1,470 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 0x8000F800
.include "complex_strings_copy.asm" ;Make complex strings in battles
.org 0x80090000
ExternalPrint:
;;;;;;;text routing test routine
move r3,s3
move s3,r4
lhu v0,0x0(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
move s3,r3
srl v1,v0,0xD ;;;;Check 13th bit (1byte system !!!)
bne v1,zero,MyPrintLineRoutine
clear v1
j PrintBigDMAText
nop
;;;;;;;;;;;;;;;;;MyPrintLineRoutine
MyPrintLineRoutine:
addiu sp,sp,-0x50
sw s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,0x2 ;Moving text read pointer +2bytes
lui s3,MyAddr
sw v0,-0x10(s3) ;store bytecounter @ 8008fff0 and clean charCounter (8008fff2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lui s3,0x1f80
ori s3,s3,0x3d0 ;s3 = 1f8003d0 - copysprite cmd in scratch
lui t0,0xff
ori t0,t0,0xffff ;t0 = 00FFFFFF
sw s0, 0x28(sp) ;save s0 in stack
andi s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(sp)
;;init chains
and r6,v1,r6 ;r6 = r3 & ff000000 = FF000000
andi r5,r5,0xff ;clean text mode (color/shadow)
and v1,v1,t0 ;r3 & 00ffffff
or r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;r3 = next free Chain
addiu v0,v0,-0x1 ;DMA Counter-1
and v1,v1,t0 ; r3 & r8 (00ffffff) cut f.byte
or r6,r6,v1 ; r6 | r3 = ff+r3 = next free Chain (FF...) +
sw v0,0x4(t1) ;save DMACounter
jal storeColor
sw r6,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA)
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; Copy Sprite DMA Command Forming
li v0,0x4
sb v0,0x3(s3) ; 04 00 00 00 to 3d0 (sb 04 to 3d3) CHAIN LENGTH
li v0,0x64
sb v0,0x7(s3) ;sb 64 to 3d7 (copySpriteCommand)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,0x3f
LAB_800194fc: ;decoding coords for source sprite
sra v0,t0,0x6 ;r2 = r6 >> 6 = 4
sll v0,v0,0x6 ;r2 << 6 = 100
subu v0,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(gp) ;r3 = load Y half from mem
sll v0,v0,0x2 ;r2 << 2
sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE CHAR SPRITE X BYTE
bgez v1,LAB_80019520 ;if Y r3>=0 - branch & r2=r3
move v0,v1
addiu v0,v1,0xff ;else r2 = ff - r3
LAB_80019520:
sra v0,v0,0x8
sll v0,v0,0x8
subu v0,v1,v0
sb v0,0xd(s3) ; >DAT_1f8003dd ;STORE CHAR SPRITE Y BYTE
lhu v1,0xa8(gp)
;DIFF BETWEEN VERSs::::::::::::::::::::::
li v0,0x8 ; r2 = 8 Sprite WIDTH
sh v0,0x10(s3) ; 3e0 - 0008 save
sh v1,0xe(s3);=>DAT_1f8003de ; *3de = r3 = 7df3
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,0x8000 ;r3 = 8000 0000
NextChar:
addiu r4,r4,-0x20 ;Shift unprintable symbols
;ОБРАБОТКА ПРОБЕЛОВ
bne r4,zero,SpaceCheckBranch ;Если не пробел - перепрыгиваем сразу
nop
lui t2,MyAddr
lh v0,-0xE(t2) ;Load my temp CHAR COUNTER for check
nop
lh t3,-0x10(t2)
addiu v0,v0,1 ;overall chars+1
beq v0,t3,SpaceCheckBranch ;is last char - пробел не проверяем!
nop
sh v0,-0xE(t2) ;Save charcount += 1
lbu r4,0x0(s6) ;LOAD NEXT CHAR
nop
j NextChar
addiu s6,s6,0x1 ;Shift read address +1 byte
SpaceCheckBranch:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; Coords XY init
lw v0,0xb0(gp); =>DAT_8007b240_parms load r2 from r28+0b0 (7b240)(Xoffs)
lui t2,MyAddr
lh v1,-0xE(t2) ;Load my temp CHAR COUNTER for check
; lhu v1,0x4(r20) ; current char = r3 = half *DMAAddr + 4
addiu v0,v0,0x6 ; 0x06 * 6px btw letters!
mult v1,v0 ; r3*r2 = xOffs*charNum
lui t2,0xff00 ; r10 = ld upper ff00 = ff000000
move t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
lhu t5,0x20(sp) ; r13 = ld half (sp+20) = 003A ---X from sp+20 !!
mflo t6 ; r14 = lo
addu v0,t5,t6 ; r2 = r13 + r14 = X + Offset
sh v0,0x8(s3) ;DAT_1f8003d8 save r2 half to 1f8003d8 = X (3A) !!!!!!!!!!!!!!!!
PageLoop:
;MAKING COPYSPRITE CHAIN
lw v0,-0x4930(s1); r2 = *freeChainAddr
nop
and r4,v0,t2 ; r4 = r2 & ff00..
and v0,v0,s0 ; r2 & 00FFFFFF
or r5,v0,s7 ; r5 = r2 or r23 (80000000) = 801ADF10
lw v0,0x4(s5) ; CmdCounter r2 = *7b6d0+4 = 705
lw v1,0x0(r5) ; r3 = New Free ChainAddr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut begin byte
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
lw t6,0x0(s3) ;>DAT_1f8003d0 r14 = 04000000 - DMA Commands Count
lw t7,0x4(s3) ;>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd
lw t8,0x8(s3) ;>DAT_1f8003d8 r24 = 001500d1 - xy screen coords
lw t5,0xc(s3); >DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page)
sw t6,0x0(r5) ; *r5 = r14
sw t7,0x4(r5) ; *r5+4 = r15
sw t8,0x8(r5) ; *r5+8 = r24
sw t5,0xc(r5) ; *r5+c = r13
lw t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,0x10(r5) ; *r5+10 = r14 - LAST COMMAND SAVE
; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!!
lw v1,0x18(t1) ;r3 = *r9+18 (next param???)
lw v0,0x0(r5) ; r2 = *cur New Chainaddr
lw v1,0x0(v1) ; r3 = *r3
and v0,v0,t2 ; r2 & ff000000
and v1,v1,s0 ;r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 04FFFFFF - commands with FFFFFF
sw v0,0x0(r5) ; *curChainAddr r5 = r2 (upd ..04 with ..FF04)
lw r4,0x18(t1) ; r4 = *r8+18 (first chain addr?)
nop
lw v0,0x0(r4) ; r2 = *r4 FIRST CHAIN LINK TO NEXT??
and v1,r5,s0 ; r3 = r5 (cur chain) & 00FFFFFF
and v0,v0,t2 ; r2 & FF000000
or v0,v0,v1 ; r2 | r3 = last chain adr w 10&....
sw v0,0x0(r4) ; *r4 = r2 FIRST CHAIN NEXT ADDR???
sw r5,0x18(t1) ;t0->t1 ; r5 = *r8+18 curChainAddr
lhu v0,0x4(t4) ;t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lw v1,0x0(r7) ; r3 = New Free ChainAddr / currHeader Addr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,0x0(r5);>DAT_1f800348
lwl t7,0x7(r5)
lwr t7,0x4(r5);>DAT_1f80034c
lwl t8,0xb(r5)
lwr t8,0x8(r5);>DAT_1f800350
lwl t5,0xf(r5)
lwr t5,0xc(r5);>DAT_1f800354
swl t6,0x3(r6)
swr t6,0x0(r6)
swl t7,0x7(r6)
swr t7,0x4(r6)
swl t8,0xb(r6)
swr t8,0x8(r6)
swl t5,0xf(r6)
swr t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!!
lw v1,0x18(t1) ; r3 = current DMACopySprite Chain
lw v0,0x0(r7) ; r2 = current CharChainCommands
lw v1,0x0(v1) ; r3 = *r3 (comNum+FFFFFF(nextLink))
and v0,v0,t2 ; r2 & FF.....
and v1,v1,s0 ; r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 10FFFFFF(cmdNum&FF..)
sw v0,0x0(r7) ; *r7 = r2 saveCurChainCmd
lw r4,0x18(t1) ; r4 = r8+18h - cur CopySpriteCmd hdrAddr
nop
lw v0,0x0(r4) ; r2 = *r4 (04FFFFFF)
and v1,r7,s0 ; r3 = r7 & 00FFFFFF (Copying Cur Char Chain)
and v0,v0,t2 ; r2 & FF000000 (04000000) CmdCount
or v0,v0,v1 ; R2 | R3 = 04(cmd)..+CharChainAddr
sw v0,0x0(r4) ; *r4 = r2 = FullCommand With Link!!!
; (04..CharAddr) + SpriteCopyCommand
sw r7,0x18(t1) ; *r8+18 = Last Char Chain!
addiu t1,t1,0x4 ; r8 (params) += 4 (shift params for NextPage)
addiu v0,t4,0x8 ; r2 = r9+8 (shift first chain param for Page)
sltu v0,t1,v0 ; r2 = r8 < r2(r9+8) (first page pass)
bne v0,zero,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charDMACount
nop
addiu v0,v0,0x1 ; a += 1
sh v0,0x4(r20) ;save DMAcounter to chain
;DMA NEED CHECK HERE (8007b6d4)
nop
lui t3,MyAddr
lhu v0,-0xE(t3) ; r2 = charCount In string
lhu v1,-0x10(t3) ; r3 = My charOverAll In string
addiu v0,v0,0x1 ; a += 1
lbu r4,0x0(s6) ; load next Char to r4 (byte)
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
addiu s6,s6,0x1 ;Shift CharAddr
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; r16 = r20 (currentTLineParam)
clear r5
PageTLoop: ;ALMOST FINISH!!!!
li r6,0x1 ; r6=1
addu r18,r18,r6 ; r18(Counter) += r6
lui v0,0x8000 ; r2 = 80000000
lui r4,0xff00 ; r4 = ff00 0000
lw v1,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
lw r7,0xa4(gp);>DAT_8007b234 r7 = someParam(почти DMA)gp+a4 = 34
and v1,v1,s1 ; r3 & 00FFFFFF
or v1,v1,v0 ; r3 | r2 = 80.....
sw v1,0x30(s0) ; store last free ChAddr to DMAParams
lw v0,-0x4930(s3);>8007b6d0_freeChain r2 = next free chain
lw v1,0x0(v1) ; r3 = *r3 = last chain - made one more chain
and v0,v0,r4 ; a2 & ff000000
and v1,v1,s1 ; r3 & 00FFFFFF
lw r4,0x4(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>DAT_8007b6d4_CmdCounter Store DMA Count
lw r4,0x30(s0) ; r4 = *DMA params + 30 = Start Of DMA Chain
jal SetDrawTPage ; Set DRAW PAGE
addiu s0,s0,0x4 ; r16 += 4 - Shgift DMAParams for next Page
sltiu v0,r18,0x2 ; r2 = r18<2
bne v0,zero,PageTLoop ; if not r2 then goto Loop
clear r5 ; r5 = 0
move v0,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,0x48(sp)
lw s7,0x44(sp)
lw s6,0x40(sp)
lw s5,0x3c(sp) ;restoring regs from Stack
lw s4,0x38(sp)
lw s3,0x34(sp)
lw s2,0x30(sp)
lw s1,0x2c(sp)
lw s0,0x28(sp)
jr ra
addiu sp,sp,0x50
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chars / 2 Return Func
.include "charload.asm"
.include "charCalcs.asm"
.close
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
.include "battle_patch.asm"
.include "txtpatches.asm" ;misc text patches

View File

@@ -0,0 +1,482 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 0x8000F800
.include "complex_strings_copy.asm" ;Make complex strings in battles
;;neeeeed to init 8008fff6 = min dma commands
.org 0x80090000
ExternalPrint:
;;;;;;;text routing test routine
move r3,s3
move s3,r4
lhu v0,0x0(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
move s3,r3
srl v1,v0,0xD ;;;;Check 13th bit (1byte system !!!)
bne v1,zero,MyPrintLineRoutine
clear v1
j PrintBigDMAText
nop
;;;;;;;;;;;;;;;;;MyPrintLineRoutine
MyPrintLineRoutine:
addiu sp,sp,-0x50
sw s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,0x2 ;Moving text read pointer +2bytes
lui s3,MyAddr
sw v0,-0x10(s3) ;store bytecounter @ 8008fff0 and clean charCounter (8008fff2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lui s3,0x1f80
ori s3,s3,0x3d0 ;s3 = 1f8003d0 - copysprite cmd in scratch
lui t0,0xff
ori t0,t0,0xffff ;t0 = 00FFFFFF
sw s0, 0x28(sp) ;save s0 in stack
andi s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(sp)
;;init chains
and r6,v1,r6 ;r6 = r3 & ff000000 = FF000000
andi r5,r5,0xff ;clean text mode (color/shadow)
and v1,v1,t0 ;r3 & 00ffffff
or r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;r3 = next free Chain
addiu v0,v0,-0x1 ;DMA Counter-1
and v1,v1,t0 ; r3 & r8 (00ffffff) cut f.byte
or r6,r6,v1 ; r6 | r3 = ff+r3 = next free Chain (FF...) +
sw v0,0x4(t1) ;save DMACounter
jal storeColor
sw r6,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA)
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; Copy Sprite DMA Command Forming
li v0,0x4
sb v0,0x3(s3) ; 04 00 00 00 to 3d0 (sb 04 to 3d3) CHAIN LENGTH
li v0,0x64
sb v0,0x7(s3) ;sb 64 to 3d7 (copySpriteCommand)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,0x3f
LAB_800194fc: ;decoding coords for source sprite
sra v0,t0,0x6 ;r2 = r6 >> 6 = 4
sll v0,v0,0x6 ;r2 << 6 = 100
subu v0,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(gp) ;r3 = load Y half from mem
sll v0,v0,0x2 ;r2 << 2
sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE CHAR SPRITE X BYTE
bgez v1,LAB_80019520 ;if Y r3>=0 - branch & r2=r3
move v0,v1
addiu v0,v1,0xff ;else r2 = ff - r3
LAB_80019520:
sra v0,v0,0x8
sll v0,v0,0x8
subu v0,v1,v0
sb v0,0xd(s3) ; >DAT_1f8003dd ;STORE CHAR SPRITE Y BYTE
lhu v1,0xa8(gp)
;DIFF BETWEEN VERSs::::::::::::::::::::::
li v0,0x8 ; r2 = 8 Sprite WIDTH
sh v0,0x10(s3) ; 3e0 - 0008 save
sh v1,0xe(s3);=>DAT_1f8003de ; *3de = r3 = 7df3
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,0x8000 ;r3 = 8000 0000
NextChar:
addiu r4,r4,-0x20 ;Shift unprintable symbols
;ОБРАБОТКА ПРОБЕЛОВ
bne r4,zero,SpaceCheckBranch ;Если не пробел - перепрыгиваем сразу
nop
lui t2,MyAddr
lh v0,-0xE(t2) ;Load my temp CHAR COUNTER for check
nop
lh t3,-0x10(t2)
addiu v0,v0,1 ;overall chars+1
beq v0,t3,SpaceCheckBranch ;is last char - пробел не проверяем!
nop
sh v0,-0xE(t2) ;Save charcount += 1
lbu r4,0x0(s6) ;LOAD NEXT CHAR
nop
j NextChar
addiu s6,s6,0x1 ;Shift read address +1 byte
SpaceCheckBranch:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; Coords XY init
lw v0,0xb0(gp); =>DAT_8007b240_parms load r2 from r28+0b0 (7b240)(Xoffs)
lui t2,MyAddr
lh v1,-0xE(t2) ;Load my temp CHAR COUNTER for check
; lhu v1,0x4(r20) ; current char = r3 = half *DMAAddr + 4
addiu v0,v0,0x6 ; 0x06 * 6px btw letters!
mult v1,v0 ; r3*r2 = xOffs*charNum
lui t2,0xff00 ; r10 = ld upper ff00 = ff000000
move t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
lhu t5,0x20(sp) ; r13 = ld half (sp+20) = 003A ---X from sp+20 !!
mflo t6 ; r14 = lo
addu v0,t5,t6 ; r2 = r13 + r14 = X + Offset
sh v0,0x8(s3) ;DAT_1f8003d8 save r2 half to 1f8003d8 = X (3A) !!!!!!!!!!!!!!!!
PageLoop:
;MAKING COPYSPRITE CHAIN
lw v0,-0x4930(s1); r2 = *freeChainAddr
nop
and r4,v0,t2 ; r4 = r2 & ff00..
and v0,v0,s0 ; r2 & 00FFFFFF
or r5,v0,s7 ; r5 = r2 or r23 (80000000) = 801ADF10
lw v0,0x4(s5) ; CmdCounter r2 = *7b6d0+4 = 705
lw v1,0x0(r5) ; r3 = New Free ChainAddr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut begin byte
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
lw t6,0x0(s3) ;>DAT_1f8003d0 r14 = 04000000 - DMA Commands Count
lw t7,0x4(s3) ;>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd
lw t8,0x8(s3) ;>DAT_1f8003d8 r24 = 001500d1 - xy screen coords
lw t5,0xc(s3); >DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page)
sw t6,0x0(r5) ; *r5 = r14
sw t7,0x4(r5) ; *r5+4 = r15
sw t8,0x8(r5) ; *r5+8 = r24
sw t5,0xc(r5) ; *r5+c = r13
lw t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,0x10(r5) ; *r5+10 = r14 - LAST COMMAND SAVE
; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!!
lw v1,0x18(t1) ;r3 = *r9+18 (next param???)
lw v0,0x0(r5) ; r2 = *cur New Chainaddr
lw v1,0x0(v1) ; r3 = *r3
and v0,v0,t2 ; r2 & ff000000
and v1,v1,s0 ;r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 04FFFFFF - commands with FFFFFF
sw v0,0x0(r5) ; *curChainAddr r5 = r2 (upd ..04 with ..FF04)
lw r4,0x18(t1) ; r4 = *r8+18 (first chain addr?)
nop
lw v0,0x0(r4) ; r2 = *r4 FIRST CHAIN LINK TO NEXT??
and v1,r5,s0 ; r3 = r5 (cur chain) & 00FFFFFF
and v0,v0,t2 ; r2 & FF000000
or v0,v0,v1 ; r2 | r3 = last chain adr w 10&....
sw v0,0x0(r4) ; *r4 = r2 FIRST CHAIN NEXT ADDR???
sw r5,0x18(t1) ;t0->t1 ; r5 = *r8+18 curChainAddr
lhu v0,0x4(t4) ;t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lw v1,0x0(r7) ; r3 = New Free ChainAddr / currHeader Addr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,0x0(r5);>DAT_1f800348
lwl t7,0x7(r5)
lwr t7,0x4(r5);>DAT_1f80034c
lwl t8,0xb(r5)
lwr t8,0x8(r5);>DAT_1f800350
lwl t5,0xf(r5)
lwr t5,0xc(r5);>DAT_1f800354
swl t6,0x3(r6)
swr t6,0x0(r6)
swl t7,0x7(r6)
swr t7,0x4(r6)
swl t8,0xb(r6)
swr t8,0x8(r6)
swl t5,0xf(r6)
swr t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!!
lw v1,0x18(t1) ; r3 = current DMACopySprite Chain
lw v0,0x0(r7) ; r2 = current CharChainCommands
lw v1,0x0(v1) ; r3 = *r3 (comNum+FFFFFF(nextLink))
and v0,v0,t2 ; r2 & FF.....
and v1,v1,s0 ; r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 10FFFFFF(cmdNum&FF..)
sw v0,0x0(r7) ; *r7 = r2 saveCurChainCmd
lw r4,0x18(t1) ; r4 = r8+18h - cur CopySpriteCmd hdrAddr
nop
lw v0,0x0(r4) ; r2 = *r4 (04FFFFFF)
and v1,r7,s0 ; r3 = r7 & 00FFFFFF (Copying Cur Char Chain)
and v0,v0,t2 ; r2 & FF000000 (04000000) CmdCount
or v0,v0,v1 ; R2 | R3 = 04(cmd)..+CharChainAddr
sw v0,0x0(r4) ; *r4 = r2 = FullCommand With Link!!!
; (04..CharAddr) + SpriteCopyCommand
sw r7,0x18(t1) ; *r8+18 = Last Char Chain!
addiu t1,t1,0x4 ; r8 (params) += 4 (shift params for NextPage)
addiu v0,t4,0x8 ; r2 = r9+8 (shift first chain param for Page)
sltu v0,t1,v0 ; r2 = r8 < r2(r9+8) (first page pass)
bne v0,zero,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charDMACount
nop
addiu v0,v0,0x1 ; a += 1
sh v0,0x4(r20) ;save DMAcounter to chain
nop
;DMA OVERFLOW CHECK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (8007b6d4)
lui t3,MyAddr
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lhu v1,-0xC(t3) ;v1 = 8008fff4 = minimum cmd counter
nop
sltu v0,v0,v1 ; v0 = v0 < V1 ?
bne v0,zero,TextEnd ;if v0<>0 then Goto End Text (DMA OVERFLOW!!!!)
nop
;lui t3,MyAddr
lhu v0,-0xE(t3) ; r2 = charCount In string
lhu v1,-0x10(t3) ; r3 = My charOverAll In string
addiu v0,v0,0x1 ; a += 1
lbu r4,0x0(s6) ; load next Char to r4 (byte)
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
addiu s6,s6,0x1 ;Shift CharAddr
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; r16 = r20 (currentTLineParam)
clear r5
PageTLoop: ;ALMOST FINISH!!!!
li r6,0x1 ; r6=1
addu r18,r18,r6 ; r18(Counter) += r6
lui v0,0x8000 ; r2 = 80000000
lui r4,0xff00 ; r4 = ff00 0000
lw v1,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
lw r7,0xa4(gp);>DAT_8007b234 r7 = someParam(почти DMA)gp+a4 = 34
and v1,v1,s1 ; r3 & 00FFFFFF
or v1,v1,v0 ; r3 | r2 = 80.....
sw v1,0x30(s0) ; store last free ChAddr to DMAParams
lw v0,-0x4930(s3);>8007b6d0_freeChain r2 = next free chain
lw v1,0x0(v1) ; r3 = *r3 = last chain - made one more chain
and v0,v0,r4 ; a2 & ff000000
and v1,v1,s1 ; r3 & 00FFFFFF
lw r4,0x4(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>DAT_8007b6d4_CmdCounter Store DMA Count
lw r4,0x30(s0) ; r4 = *DMA params + 30 = Start Of DMA Chain
jal SetDrawTPage ; Set DRAW PAGE
addiu s0,s0,0x4 ; r16 += 4 - Shgift DMAParams for next Page
sltiu v0,r18,0x2 ; r2 = r18<2
bne v0,zero,PageTLoop ; if not r2 then goto Loop
clear r5 ; r5 = 0
move v0,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,0x48(sp)
lw s7,0x44(sp)
lw s6,0x40(sp)
lw s5,0x3c(sp) ;restoring regs from Stack
lw s4,0x38(sp)
lw s3,0x34(sp)
lw s2,0x30(sp)
lw s1,0x2c(sp)
lw s0,0x28(sp)
jr ra
addiu sp,sp,0x50
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chars / 2 Return Func
.include "charload.asm"
.include "charCalcs.asm"
.close
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
.include "battle_patch.asm"
; 69 x 44
;yellow - 976 X 437 white - 976 X 432
.include "txtpatches.asm" ;misc text patches

View File

@@ -0,0 +1,439 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 0x8000F800
.org 0x80090000
ExternalPrint:
;;;;;;;text routing test routine
move r3,s3
move s3,r4
lhu v0,0x0(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
move s3,r3
srl v1,v0,0xD ;;;;Check 13th bit (1byte system !!!)
bne v1,zero,MyPrintLineRoutine
clear v1
j PrintBigDMAText
nop
;;;;;;;;;;;;;;;;;MyPrintLineRoutine
MyPrintLineRoutine:
addiu sp,sp,-0x50
sw s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,0x2 ;Moving text read pointer +2bytes
lui s3,MyAddr
sh v0,-0x10(s3) ;store half bytecounter @ 8008fff0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lui s3,0x1f80
ori s3,s3,0x3d0 ;s3 = 1f8003d0 - copysprite cmd in scratch
lui t0,0xff
ori t0,t0,0xffff ;t0 = 00FFFFFF
sw s0, 0x28(sp) ;save s0 in stack
andi s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(sp)
;;init chains
and r6,v1,r6 ;r6 = r3 & ff000000 = FF000000
andi r5,r5,0xff ;clean text mode (color/shadow)
and v1,v1,t0 ;r3 & 00ffffff
or r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;r3 = next free Chain
addiu v0,v0,-0x1 ;DMA Counter-1
and v1,v1,t0 ; r3 & r8 (00ffffff) cut f.byte
or r6,r6,v1 ; r6 | r3 = ff+r3 = next free Chain (FF...) +
sw v0,0x4(t1) ;save DMACounter
jal storeColor
sw r6,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;DAT_1f800350 load r4 (upper coord 01f6) to r7+8 (DMA)
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; Copy Sprite DMA Command Forming
li v0,0x4
sb v0,0x3(s3) ; 04 00 00 00 to 3d0 (sb 04 to 3d3) CHAIN LENGTH
li v0,0x64
sb v0,0x7(s3) ;sb 64 to 3d7 (copySpriteCommand)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,0x3f
LAB_800194fc: ;decoding coords for source sprite
sra v0,t0,0x6 ;r2 = r6 >> 6 = 4
sll v0,v0,0x6 ;r2 << 6 = 100
subu v0,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(gp) ;r3 = load Y half from mem
sll v0,v0,0x2 ;r2 << 2
sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE CHAR SPRITE X BYTE
bgez v1,LAB_80019520 ;if Y r3>=0 - branch & r2=r3
move v0,v1
addiu v0,v1,0xff ;else r2 = ff - r3
LAB_80019520:
sra v0,v0,0x8
sll v0,v0,0x8
subu v0,v1,v0
sb v0,0xd(s3) ; >DAT_1f8003dd ;STORE CHAR SPRITE Y BYTE
lhu v1,0xa8(gp)
;DIFF BETWEEN VERSs::::::::::::::::::::::
li v0,0x8 ; r2 = 8 Sprite WIDTH
sh v0,0x10(s3) ; 3e0 - 0008 save
sh v1,0xe(s3);=>DAT_1f8003de ; *3de = r3 = 7df3
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,0x8000 ;r3 = 8000 0000
NextChar:
addiu r4,r4,-0x20 ;Shift unprintable symbols
; lhu v1,0x4(r20) ; current char = r3 = half *DMAAddr + 4
; nop
; beq v1,zero,isFirstChar ;check charnum. if 0 - dont check space (string not initializated)
; nop
;check r0 is 0 and jump to next char
; beq r4,zero,SpaceCharJumpHere ;if char=0 (space) = jump to end of charLoop
; nop
isFirstChar:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; Coords XY init
lw v0,0xb0(gp); =>DAT_8007b240_parms load r2 from r28+0b0 (7b240)(Xoffs)
lhu v1,0x4(r20) ; current char = r3 = half *DMAAddr + 4
;NEED TO CUSTOM CHAR COUNT
addiu v0,v0,0x6 ; 0x06 * 6px btw letters!
mult v1,v0 ; r3*r2 = xOffs*charNum
lui t2,0xff00 ; r10 = ld upper ff00 = ff000000
move t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
lhu t5,0x20(sp) ; r13 = ld half (sp+20) = 003A ---X from sp+20 !!
mflo t6 ; r14 = lo
addu v0,t5,t6 ; r2 = r13 + r14 = X + Offset
sh v0,0x8(s3) ;DAT_1f8003d8 save r2 half to 1f8003d8 = X (3A) !!!!!!!!!!!!!!!!
PageLoop:
;MAKING COPYSPRITE CHAIN
lw v0,-0x4930(s1); r2 = *freeChainAddr
nop
and r4,v0,t2 ; r4 = r2 & ff00..
and v0,v0,s0 ; r2 & 00FFFFFF
or r5,v0,s7 ; r5 = r2 or r23 (80000000) = 801ADF10
lw v0,0x4(s5) ; CmdCounter r2 = *7b6d0+4 = 705
lw v1,0x0(r5) ; r3 = New Free ChainAddr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut begin byte
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
lw t6,0x0(s3) ;>DAT_1f8003d0 r14 = 04000000 - DMA Commands Count
lw t7,0x4(s3) ;>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd
lw t8,0x8(s3) ;>DAT_1f8003d8 r24 = 001500d1 - xy screen coords
lw t5,0xc(s3); >DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page)
sw t6,0x0(r5) ; *r5 = r14
sw t7,0x4(r5) ; *r5+4 = r15
sw t8,0x8(r5) ; *r5+8 = r24
sw t5,0xc(r5) ; *r5+c = r13
lw t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,0x10(r5) ; *r5+10 = r14 - LAST COMMAND SAVE
; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!!
lw v1,0x18(t1) ;r3 = *r9+18 (next param???)
lw v0,0x0(r5) ; r2 = *cur New Chainaddr
lw v1,0x0(v1) ; r3 = *r3
and v0,v0,t2 ; r2 & ff000000
and v1,v1,s0 ;r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 04FFFFFF - commands with FFFFFF
sw v0,0x0(r5) ; *curChainAddr r5 = r2 (upd ..04 with ..FF04)
lw r4,0x18(t1) ; r4 = *r8+18 (first chain addr?)
nop
lw v0,0x0(r4) ; r2 = *r4 FIRST CHAIN LINK TO NEXT??
and v1,r5,s0 ; r3 = r5 (cur chain) & 00FFFFFF
and v0,v0,t2 ; r2 & FF000000
or v0,v0,v1 ; r2 | r3 = last chain adr w 10&....
sw v0,0x0(r4) ; *r4 = r2 FIRST CHAIN NEXT ADDR???
sw r5,0x18(t1) ;t0->t1 ; r5 = *r8+18 curChainAddr
lhu v0,0x4(t4) ;t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lw v1,0x0(r7) ; r3 = New Free ChainAddr / currHeader Addr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,0x0(r5);>DAT_1f800348
lwl t7,0x7(r5)
lwr t7,0x4(r5);>DAT_1f80034c
lwl t8,0xb(r5)
lwr t8,0x8(r5);>DAT_1f800350
lwl t5,0xf(r5)
lwr t5,0xc(r5);>DAT_1f800354
swl t6,0x3(r6)
swr t6,0x0(r6)
swl t7,0x7(r6)
swr t7,0x4(r6)
swl t8,0xb(r6)
swr t8,0x8(r6)
swl t5,0xf(r6)
swr t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
; t1 = t0 (small) !!!!
; t4 = t1 (small) !!!!
lw v1,0x18(t1) ; r3 = current DMACopySprite Chain
lw v0,0x0(r7) ; r2 = current CharChainCommands
lw v1,0x0(v1) ; r3 = *r3 (comNum+FFFFFF(nextLink))
and v0,v0,t2 ; r2 & FF.....
and v1,v1,s0 ; r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 10FFFFFF(cmdNum&FF..)
sw v0,0x0(r7) ; *r7 = r2 saveCurChainCmd
lw r4,0x18(t1) ; r4 = r8+18h - cur CopySpriteCmd hdrAddr
nop
lw v0,0x0(r4) ; r2 = *r4 (04FFFFFF)
and v1,r7,s0 ; r3 = r7 & 00FFFFFF (Copying Cur Char Chain)
and v0,v0,t2 ; r2 & FF000000 (04000000) CmdCount
or v0,v0,v1 ; R2 | R3 = 04(cmd)..+CharChainAddr
sw v0,0x0(r4) ; *r4 = r2 = FullCommand With Link!!!
; (04..CharAddr) + SpriteCopyCommand
sw r7,0x18(t1) ; *r8+18 = Last Char Chain!
addiu t1,t1,0x4 ; r8 (params) += 4 (shift params for NextPage)
addiu v0,t4,0x8 ; r2 = r9+8 (shift first chain param for Page)
sltu v0,t1,v0 ; r2 = r8 < r2(r9+8) (first page pass)
bne v0,zero,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
SpaceCharJumpHere:
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charCount
nop
addiu v0,v0,0x1 ; a += 1
lui t3,MyAddr
lhu v1,-0x10(t3) ; r3 = My charCount In string
lbu r4,0x0(s6) ; load next Char to r4 (byte)
addiu s6,s6,0x1 ;Shift CharAddr
sh v0,0x4(r20) ; r2 = save to chain
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; r16 = r20 (currentTLineParam)
clear r5
PageTLoop: ;ALMOST FINISH!!!!
li r6,0x1 ; r6=1
addu r18,r18,r6 ; r18(Counter) += r6
lui v0,0x8000 ; r2 = 80000000
lui r4,0xff00 ; r4 = ff00 0000
lw v1,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
lw r7,0xa4(gp);>DAT_8007b234 r7 = someParam(почти DMA)gp+a4 = 34
and v1,v1,s1 ; r3 & 00FFFFFF
or v1,v1,v0 ; r3 | r2 = 80.....
sw v1,0x30(s0) ; store last free ChAddr to DMAParams
lw v0,-0x4930(s3);>8007b6d0_freeChain r2 = next free chain
lw v1,0x0(v1) ; r3 = *r3 = last chain - made one more chain
and v0,v0,r4 ; a2 & ff000000
and v1,v1,s1 ; r3 & 00FFFFFF
lw r4,0x4(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>DAT_8007b6d4_CmdCounter Store DMA Count
lw r4,0x30(s0) ; r4 = *DMA params + 30 = Start Of DMA Chain
jal SetDrawTPage ; Set DRAW PAGE
addiu s0,s0,0x4 ; r16 += 4 - Shgift DMAParams for next Page
sltiu v0,r18,0x2 ; r2 = r18<2
bne v0,zero,PageTLoop ; if not r2 then goto Loop
clear r5 ; r5 = 0
move v0,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,0x48(sp)
lw s7,0x44(sp)
lw s6,0x40(sp)
lw s5,0x3c(sp) ;restoring regs from Stack
lw s4,0x38(sp)
lw s3,0x34(sp)
lw s2,0x30(sp)
lw s1,0x2c(sp)
lw s0,0x28(sp)
jr ra
addiu sp,sp,0x50
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chars / 2 Return Func
.include "charload.asm"
.include "charCalcs.asm"
.close
.include "txtpatches.asm" ;misc text patches

View File

@@ -0,0 +1,760 @@
;
; Persona 2 Innocent Sin (PSX) JAP / Custom Characters/Data Patch
;
; Author: Sergey Shemet 12/10/2021
.psx
.definelabel SetDrawTPage, 0x800542cc
.definelabel storeColor, 0x8001b0c8
.definelabel initCopyCharChain, 0x8001a070
.definelabel makeCharPixels, 0x8001a08f ;need custom routine with custom font
.definelabel GenerateSmallChar, 0x8001a284 ;need custom routine
.definelabel MakeShadowSmallChar, 0x8001a20c
.definelabel PrintBigDMAText, 0x80019300
.definelabel MyAddr, 0x8009
.open "SLPS_021.00", 0x8000F800
.include "complex_strings_copy.asm" ;Make complex strings in battles
;;neeeeed to init 8008fff6 = min dma commands
.org 0x80090000
ExternalPrint:
;;;;;;;text routing test routine
move r3,s3
move s3,r4
lhu v0,0x0(s3) ;read half 2 bytes of text (r4, not s1+0c!!!!!)
move s3,r3
srl v1,v0,0xD ;;;;Check 13th bit (1byte system !!!)
bne v1,zero,MyPrintLineRoutine
clear v1
j PrintBigDMAText
nop
;;;;;;;;;;;;;;;;;MyPrintLineRoutine
MyPrintLineRoutine:
addiu sp,sp,-0x50
sw s6,0x40(sp)
move s6,r4 ;textReadAddr
sw s1,0x2c(sp)
move s1,r5
sw s2,0x30(sp)
move s2,r6
sw s3,0x34(sp)
clear r25 ;CURRENT TEXT MODE
; NEW COMMAND OBRAB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;lw v1,0x0(s6)
;nop
;v1/r3 - MyChars charcount
andi v0,v0,0xff
addiu s6,s6,0x2 ;Moving text read pointer +2bytes
lui s3,MyAddr
sw v0,-0x10(s3) ;store bytecounter @ 8008fff0 and clean charCounter (8008fff2)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lui s3,0x1f80
ori s3,s3,0x3d0 ;s3 = 1f8003d0 - copysprite cmd in scratch
lui t0,0xff
ori t0,t0,0xffff ;t0 = 00FFFFFF
sw s0, 0x28(sp) ;save s0 in stack
andi s0,r7,0xff ;s0 - cut textMode (color & shadow)
move r4,s0 ;r4 = s0 (cutted color)
lui r7, 0x8008 ;r7 = 8008 0000
lui r6, 0xff00 ;r6 = FF000000
addiu t1,r7,-0x4930 ;t1 = 8007b6d0 - new free CHAIN Here
lw v1, -0x4930(r7) ;r3/v1 = load freeChain
lbu r5,0x60(sp) ;shadow flag from stack to r5
lui v0,0x8000 ;r2 = 8000 0000
sw ra,0x4c(sp)
sw s8,0x48(sp)
sw s7,0x44(sp)
sw s5,0x3c(sp) ; push ra,r30,r23,31,r20
sw s4,0x38(sp)
;;init chains
and r6,v1,r6 ;r6 = r3 & ff000000 = FF000000
andi r5,r5,0xff ;clean text mode (color/shadow)
and v1,v1,t0 ;r3 & 00ffffff
or r20,v1,v0 ;r20 - 80...+r3 = freeChain Main Addr
lw v0,0x4(t1) ;Load DMA Counter
lw v1,0x0(r20) ;r3 = next free Chain
addiu v0,v0,-0x1 ;DMA Counter-1
and v1,v1,t0 ; r3 & r8 (00ffffff) cut f.byte
or r6,r6,v1 ; r6 | r3 = ff+r3 = next free Chain (FF...) +
sw v0,0x4(t1) ;save DMACounter
jal storeColor
sw r6,-0x4930(r7) ;SAVE next free Chain (FF...) to 7b6d0
move r4,r20 ;currentChainAddr
sll r5,s1,0x10 ;r5 = X<<10h (003A0000)
sra r5,r5,0x10 ; r5=r5>>10h 0000003A
sll r6,s2,0x10 ; r6 = Y << 10h
sra r6,r6,0x10 ;r6>>10h - 100% clean coords
jal initCopyCharChain ;init line chains
move r7,s0 ;store textMode _THIS IS FOR INIT
;;;;init ScratchPad
;;;;;;;;;;;;;;;;;; CPU TO VRAM
lui r7,0x1f80
ori r7,r7,0x348 ;r7 = FIRST CHAR START
;lui r6,0x1f80 ;LOWER HALF OF CHAR - DONT NEED!!!
;ori r6,r6,0x38c
li v0,0x2
sh v0,0x1c(sp)
li v0,0xc
lui r4,0xa000 ;r4 = a000 0000
sh v0,0x1e(sp) ; SAVE 000C0002 TO STACK+1c
; INIT CHAR
li r5,0x10 ;cmd count 10 00 00 00 =>DAT_1f80034b
sb r5,0x3(r7) ;SAVE 0d 00 00 00 =>DAT_1f80034c cmdcount\
sw r4,0x4(r7); SAVE a000000 TO DAT_1f80034c
lhu t0,0xa0(gp) ;0310 ;Load x(0310) to r8
lhu v0,0xa2(gp) ;01f0 ;Load y(01F0)to r2
lui v1,0x100 ;0100 0000 flushcache
lui at,0x1f80 ;scrathcpadStart
sw v1,0x388(at) ;save 0x01 00 00 00 to end of 1st CHAR chain
setY1:
move s8,s2 ; r18 to r30 (y) !!!!!!!!!!!!!!!!!!!
lh r5,0xa0(gp) ;for futher sprite X calc
sh t0,0x18(sp)
sh v0,0x1a(sp) ;SAVE CONCAT 013001f0 to stack
lw r4,0x18(sp) ;LOAD 013001f0 from stack
lw v0,0x1c(sp) ; r2 = 000c0002 from stack
sw r4,0x8(r7) ;SAVE 013001f0 TO SCRATCH
sw v0,0xc(r7) ;=>DAT_1f800354 r2 - 000c0002 to 1st char (to r7+0c)
lui v0,0x8001 ;load 80010000 to r2
;4bit table pattern
.include "4bitPattern.asm"
; Copy Sprite DMA Command Forming
li v0,0x4
sb v0,0x3(s3) ; 04 00 00 00 to 3d0 (sb 04 to 3d3) CHAIN LENGTH
li v0,0x64
sb v0,0x7(s3) ;sb 64 to 3d7 (copySpriteCommand)
li v0,0x80
sb v0,0x4(s3)
sb v0,0x5(s3)
sb v0,0x6(s3) ;make 80 80 80 64 (3d4,5,6,7)
bgez r5,LAB_800194fc
SetX1:
sh s1,0x20(sp) ;store X half to sp+10 !!!!!!!!!!!!!!!!!
addiu t0,r5,0x3f
LAB_800194fc: ;decoding coords for source sprite
sra v0,t0,0x6 ;r2 = r6 >> 6 = 4
sll v0,v0,0x6 ;r2 << 6 = 100
subu v0,r5,v0 ;r2 = r6 - r2 = 30
lh v1,0xa2(gp) ;r3 = load Y half from mem
sll v0,v0,0x2 ;r2 << 2
sb v0,0xc(s3) ; >DAT_1f8003dc ;STORE RECT SRC CHAR SPRITE X BYTE
bgez v1,LAB_80019520 ;if Y r3>=0 - branch & r2=r3
move v0,v1
addiu v0,v1,0xff ;else r2 = ff - r3
LAB_80019520:
sra v0,v0,0x8
sll v0,v0,0x8
subu v0,v1,v0
sb v0,0xd(s3) ; >DAT_1f8003dd ;STORE RECT SRC CHAR SPRITE Y BYTE
lhu v1,0xa8(gp)
;DIFF BETWEEN VERSs::::::::::::::::::::::
li v0,0x8 ; r2 = 8 Sprite WIDTH
sh v0,0x10(s3) ; 3e0 - 0008 save
sh v1,0xe(s3);=>DAT_1f8003de ; *3de = r3 = 7df3 CLUT of RECT
li v0,0xc ; r2 = c Sprite HEIGTH
sh v0,0x12(s3) ; 3e2 - 000c save
;TEXT READ START
lbu r4,0x0(s6) ;MAIN READ CHAR COMMAND - Load Byte Unsigned
nop
addiu s6,s6,0x1 ;Shift read address +1 byte
;;;;;;;;;;;;;;;;;;;;;;;;;CHAR CHECK CUTTED!
lui s1,0x8008 ;load 80080000 to r17
addiu s5,s1,-0x4930 ;r21 = r17-4930= 7b6d0 (tempDMA)
lui s0,0xff
ori s0,s0,0xffff ;s0 = 00 ff ff ff
lui s7,0x8000 ;r3 = 8000 0000
NextChar:
addiu r4,r4,-0x20 ;Shift unprintable symbols
li t2, 0xa0 ; минимальное значение оптимизированного кода (a0+20 = 192 (Русская А))
sltu v0,r4,t2
bne v0, zero, NotOptimized ; проверяем на русский текст и перепрыгиваем на старый режим, если нет.
nop
.include "main_spritecopy.asm"
NotOptimized:
;ОБРАБОТКА ПРОБЕЛОВ
bne r4,zero,SpaceCheckBranch ;Если не пробел - перепрыгиваем сразу
nop
lui t2,MyAddr
lh v0,-0xE(t2) ;Load my temp CHAR COUNTER for check
nop
lh t3,-0x10(t2)
addiu v0,v0,1 ;overall chars+1
beq v0,t3,SpaceCheckBranch ;is last char - пробел не проверяем!
nop
sh v0,-0xE(t2) ;Save charcount += 1
lbu r4,0x0(s6) ;LOAD NEXT CHAR
nop
j NextChar
addiu s6,s6,0x1 ;Shift read address +1 byte
SpaceCheckBranch:
jal makeCharPixelsCustom ;MAKE SMALL CHAR IN SCRATCH ___ CUSTOM ROUTINE
clear r18
; Coords XY init
lw v0,0xb0(gp); =>DAT_8007b240_parms load r2 from r28+0b0 (7b240)(Xoffs)
lui t2,MyAddr
lh v1,-0xE(t2) ;Load my temp CHAR COUNTER for check
; lhu v1,0x4(r20) ; current char = r3 = half *DMAAddr + 4
addiu v0,v0,0x6 ; 0x06 * 6px btw letters!
mult v1,v0 ; r3*r2 = xOffs*charNum
lui t2,0xff00 ; r10 = ld upper ff00 = ff000000
move t4,r20 ; r12 = r20 (params)
addiu t3,sp,0x10 ; r11 = sp + 10 = 807ffe50
move t1,r20 ; r12 = r20 (params again)
GetY:
sh s8,0xa(s3) ; DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
GetX:
lhu t5,0x20(sp) ; r13 = ld half (sp+20) = 003A ---X from sp+20 !!
mflo t6 ; r14 = lo
addu v0,t5,t6 ; r2 = r13 + r14 = X + Offset
sh v0,0x8(s3) ;DAT_1f8003d8 save r2 half to 1f8003d8 = X (3A) !!!!!!!!!!!!!!!!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IF Mode is not 0 = load 2 to page counter
PageLoop:
;MAKING COPYSPRITE CHAIN
lw v0,-0x4930(s1); r2 = *freeChainAddr
nop
and r4,v0,t2 ; r4 = r2 & ff00..
and v0,v0,s0 ; r2 & 00FFFFFF
or r5,v0,s7 ; r5 = r2 or r23 (80000000) = 801ADF10
lw v0,0x4(s5) ; CmdCounter r2 = *7b6d0+4 = 705
lw v1,0x0(r5) ; r3 = New Free ChainAddr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut begin byte
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5) ; CmdCounter save DMA Counter
sw r4,-0x4930(s1); freeChain save new freeChain
CopyCmdFromScratch:
; CopyScriptChain copy from scratch
contStandartDMA:
lui t6,0x500 ; set 4 commands in next chain
nop
sw t6,0x0(r5) ; set 5 commands
nop
lui t6, 0xe100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ori t6,0x0234 ;;;;;;;make changepage command in every command to standart
sw t6,0x4(r5) ;store it before all 6400000 command
addiu r5,4 ;SHIFT DEST ADDR
lw t7,0x4(s3) ;>DAT_1f8003d4 r15 = 64808080 - CopySpriteCmd
lw t8,0x8(s3) ;>DAT_1f8003d8 r24 = 001500d1 - xy screen coords
lw t5,0xc(s3); >DAT_1f8003dc r13 = 7fd3f0c0 (CLUT & tex coord page)
sw t7,0x4(r5) ; *r5+4 = r15
sw t8,0x8(r5) ; *r5+8 = r24
sw t5,0xc(r5) ; *r5+c = r13
lw t6,0x10(s3);>DAT_1f8003e0 r14 = 000c0008 - spritesize after copy
nop
sw t6,0x10(r5) ; *r5+10 = r14 - LAST COMMAND SAVE
addiu r5,-0x4 ;SHIFT DEST ADDR MINUS
clear r25 ;clearing r25 (reset current chars status)
lw v1,0x18(t1) ;r3 = *r9+18 (next param???)
lw v0,0x0(r5) ; r2 = *cur New Chainaddr
lw v1,0x0(v1) ; r3 = *r3
and v0,v0,t2 ; r2 & ff000000
and v1,v1,s0 ;r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 04FFFFFF - commands with FFFFFF
sw v0,0x0(r5) ; *curChainAddr r5 = r2 (upd ..04 with ..FF04)
lw r4,0x18(t1) ; r4 = *r8+18 (first chain addr?)
nop
lw v0,0x0(r4) ; r2 = *r4 FIRST CHAIN LINK TO NEXT??
and v1,r5,s0 ; r3 = r5 (cur chain) & 00FFFFFF
and v0,v0,t2 ; r2 & FF000000
or v0,v0,v1 ; r2 | r3 = last chain adr w 10&....
sw v0,0x0(r4) ; *r4 = r2 FIRST CHAIN NEXT ADDR???
sw r5,0x18(t1) ;t0->t1 ; r5 = *r8+18 curChainAddr
lhu v0,0x4(t4) ;t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstChar ; if CharCount<>0 then Goto...
nop
sw r5,0x28(t1) ;t0->t1 ;*curChain+28 = currentChainAddr
sw t8,0xc(t4) ;t1->t4 ; Params+0c = save half X STORE COORDS
clear v0
sb v0,-0x1(r20) ;store first char offset for moving string (is first in new type)
;sh v0,-0x8(t4) ;store first char offset for moving string (is first in new type)
nop
;sh s2,0xe(t4) ;t1->t4 ;Params+0e = save half Y
NotFirstChar:
lui r5,0x1f80 ;;;;;;;;;;;;;;;;;;;;;;;ADDRESS OF CHAR HERe ---> SLL CHARNUM, 6
lw v0,-0x4930(s1);>8007b6d0_freeChain r2 = *nextFreeChain
ori r5,r5,0x348 ; r5 | 1f800348 = Scratch CharData
and r4,v0,t2 ; r4 = r2 & FF000000
and v0,v0,s0 ; r2 & 00FFFFFF
or r7,v0,s7 ;t4->s7 (800...) ; r7 = r2 | r12 = nextChain & 80...
move r6,r7 ; r6 = r7 (nextChain)
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lw v1,0x0(r7) ; r3 = New Free ChainAddr / currHeader Addr
addiu v0,v0,-0x1 ; r2 -= 1 Counter Down
and v1,v1,s0 ; r3 & 00FFFFFF cut commandCount / currHeader
or r4,r4,v1 ; r4 & r3 = ff......
sw v0,0x4(s5);>DAT_8007b6d4_CmdCounter save DMA Counter
andi v0,r7,0x3 ; r2 = r7 & 3 (check destAddr MOD 4)
lui t3,0x1f80
ori t3,t3,0x388 ; Scratch DMAChain CharEndAddr
beq v0,zero,Copy16Bytes ; if r7 MOD 4 = 0 then Branch
sw r4,-0x4930(s1);>8007b6d0_freeChain save new freeChain
;;;;;;;;;;;;;;;Copy from ScratchPad To Chain
CopyBy2Bytes:
lwl t6,0x3(r5) ; if r7 mod4 <> 0 - копируем по 2 байта
lwr t6,0x0(r5);>DAT_1f800348
lwl t7,0x7(r5)
lwr t7,0x4(r5);>DAT_1f80034c
lwl t8,0xb(r5)
lwr t8,0x8(r5);>DAT_1f800350
lwl t5,0xf(r5)
lwr t5,0xc(r5);>DAT_1f800354
swl t6,0x3(r6)
swr t6,0x0(r6)
swl t7,0x7(r6)
swr t7,0x4(r6)
swl t8,0xb(r6)
swr t8,0x8(r6)
swl t5,0xf(r6)
swr t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,CopyBy2Bytes
addiu r6,r6,0x10
j last4BytesCopy
nop
Copy16Bytes:
lw t6,0x0(r5);>DAT_1f800348 r5 - curScratchAddr,r6 -cur DMAAddr
lw t7,0x4(r5)
lw t8,0x8(r5)
lw t5,0xc(r5)
sw t6,0x0(r6)
sw t7,0x4(r6)
sw t8,0x8(r6)
sw t5,0xc(r6)
addiu r5,r5,0x10
bne r5,t3,Copy16Bytes
addiu r6,r6,0x10
last4BytesCopy:
lwl t6,0x3(r5) ; r14 left = 2 bytes from *r5+3
lwr t6,0x0(r5);>DAT_1f800358 r14 right = 2 bytes from *r5
nop
swl t6,0x3(r6) ; *r6 = r14 left
swr t6,0x0(r6) ; *r6+3 = r14 right
; linking DMA char+copysprite
lw v1,0x18(t1) ; r3 = current DMACopySprite Chain
lw v0,0x0(r7) ; r2 = current CharChainCommands
lw v1,0x0(v1) ; r3 = *r3 (comNum+FFFFFF(nextLink))
and v0,v0,t2 ; r2 & FF.....
and v1,v1,s0 ; r3 & 00FFFFFF
or v0,v0,v1 ; r2 | r3 = 10FFFFFF(cmdNum&FF..)
sw v0,0x0(r7) ; *r7 = r2 saveCurChainCmd
lw r4,0x18(t1) ; r4 = r8+18h - cur CopySpriteCmd hdrAddr
nop
lw v0,0x0(r4) ; r2 = *r4 (04FFFFFF)
and v1,r7,s0 ; r3 = r7 & 00FFFFFF (Copying Cur Char Chain)
and v0,v0,t2 ; r2 & FF000000 (04000000) CmdCount
or v0,v0,v1 ; R2 | R3 = 04(cmd)..+CharChainAddr
sw v0,0x0(r4) ; *r4 = r2 = FullCommand With Link!!!
; (04..CharAddr) + SpriteCopyCommand
sw r7,0x18(t1) ; *r8+18 = Last Char Chain!
addiu t1,t1,0x4 ; r8 (params) += 4 (shift params for NextPage)
addiu v0,t4,0x8 ; r2 = r9+8 (shift first chain param for Page)
sltu v0,t1,v0 ; r2 = r8 < r2(r9+8) (first page pass)
bne v0,zero,PageLoop ; if r2<>0 (r8<r2) then goto Next Page Loop
nop
OptimizedSpriteCopyEnd:
;;;CharCount + Check
lhu v0,0x4(r20) ; r2 = current charDMACount
nop
addiu v0,v0,0x1 ; a += 1
sh v0,0x4(r20) ;save DMAcounter to chain
nop
;DMA OVERFLOW CHECK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (8007b6d4)
lui t3,MyAddr
lw v0,0x4(s5) ; CmdCounter r2 = DMA Counter
lhu v1,-0xC(t3) ;v1 = 8008fff4 = minimum cmd counter
nop
sltu v0,v0,v1 ; v0 = v0 < V1 ?
bne v0,zero,TextEnd ;if v0<>0 then Goto End Text (DMA OVERFLOW!!!!)
nop
;lui t3,MyAddr
lhu v0,-0xE(t3) ; r2 = charCount In string
lhu v1,-0x10(t3) ; r3 = My charOverAll In string
addiu v0,v0,0x1 ; a += 1
lbu r4,0x0(s6) ; load next Char to r4 (byte)
sh v0,-0xE(t3) ; store myCharCounter to MyAddr-E
addiu s6,s6,0x1 ;Shift CharAddr
bne v0,v1,NextChar ; if currentChar<>OverallChar - branch
nop
TextEnd:
clear r18
lui s3,0x8008
addiu s5,s3,-0x4930 ; r19 = 80080000, r21 = 7b6d0
lui s1,0xff ; r17 = 00ff0000
ori s1,s1,0xffff ; r17 & ffff = 00ff ffff
move s0,r20 ; r16 = r20 (currentTLineParam)
clear r5
clear r25 ;clearing r25 (reset current chars status)
PageTLoop: ;ALMOST FINISH!!!!
li r6,0x1 ; r6=1
addu r18,r18,r6 ; r18(Counter) += r6
lui v0,0x8000 ; r2 = 80000000
lui r4,0xff00 ; r4 = ff00 0000
lw v1,-0x4930(s3);>8007b6d0_freeChain r3 = next free Chain (*7b6d0)
;;;;;;;;;;;;;;;;
lw r7,0xa4(gp);>DAT_8007b234 r7 = Texture page = 34
beq r25,zero, lastTextPageDefaul
nop
li r7,0x3f ;IF MODE<>0 then TexturePage = 23F
;;;;;;;;;;;;;;;''
lastTextPageDefaul:
and v1,v1,s1 ; r3 & 00FFFFFF
or v1,v1,v0 ; r3 | r2 = 80.....
sw v1,0x30(s0) ; store last free ChAddr to DMAParams
lw v0,-0x4930(s3);>8007b6d0_freeChain r2 = next free chain
lw v1,0x0(v1) ; r3 = *r3 = last chain - made one more chain
and v0,v0,r4 ; a2 & ff000000
and v1,v1,s1 ; r3 & 00FFFFFF
lw r4,0x4(s5);>DAT_8007b6d4_CmdCounter r4 = DMA Counter
or v0,v0,v1 ; r2 | r3
sw v0,-0x4930(s3);>8007b6d0_freeChain new free chain addr add to *7b6b0
addiu r4,r4,-0x1 ; DMA Cunter =- 1
sw r4,0x4(s5);>DAT_8007b6d4_CmdCounter Store DMA Count
lw r4,0x30(s0) ; r4 = *DMA params + 30 = Start Of DMA Chain
jal SetDrawTPage ; Set DRAW PAGE
addiu s0,s0,0x4 ; r16 += 4 - Shgift DMAParams for next Page
sltiu v0,r18,0x2 ; r2 = r18<2
bne v0,zero,PageTLoop ; if not r2 then goto Loop
clear r5 ; r5 = 0
move v0,r20 ; r2 = DMAParamsMain
lw ra,0x4c(sp)
lw s8,0x48(sp)
lw s7,0x44(sp)
lw s6,0x40(sp)
lw s5,0x3c(sp) ;restoring regs from Stack
lw s4,0x38(sp)
lw s3,0x34(sp)
lw s2,0x30(sp)
lw s1,0x2c(sp)
lw s0,0x28(sp)
jr ra
addiu sp,sp,0x50
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chars / 2 Return Func
.include "charload.asm"
.include "charCalcs.asm"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001a7dc
;;;;;text patch for Text MOVING & OFFSET
;make branch videocomand reading
chainSpriteCheck:
lbu v1,0x7(r5)
li r27, 0xe1
beq r27, v1, ShiftedCommandCheck
nop
j 0x8001a7e4 ;return
nop
ShiftedCommandCheck:
lbu v1,0xb(r5) ;my new shifted sprite command
li r27, 0x64
beq r27, v1, ShiftedCommandCheck2
nop
lbu v1,0x7(r5)
nop
j 0x8001a7e4 ;return
nop
ShiftedCommandCheck2:
lbu v1,0xb(r5)
goingback:
j 0x8001a7e4 ;return
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001aa8c
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;text patch for Text MOVING & OFFSET
getRightCoords:
; lw r5, 0x28(t1) ;get chain addr from params
;lhu r3, 0xc(t2) ;get X from params
lbu r4,0x7(r5)
li r2,0xe1 ;if my new 5 commands?
bne r2,r4,oldStyleCommand
nop
addiu r5,4
oldStyleCommand:
lhu r2, 0x8(r5) ;getting cur x (r5 is chain addr) --------!
lhu r4, 0xe(t2) ;;getting Y from param
subu r3,r3,r2 ; get X offset
move r12,r3 ; Saving X offset in r12
lhu r2, 0xa(r5) ;getting cur y from chain ----------!
sll r3,r3,0x10 ;Shift r3 <<< 10 bits
;add r2,r23 ;add
subu r2,r4,r2 ;get Y offset
;clear r23
returnToInnocence:
j 0x8001aaa8 ;continue!
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 0x8001ab2c
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movesprite:
lbu r2,0x07(r4)
nop
beq r2, t7, simpleSpriteCmd ;if r2 == t7 = 64
nop
beq r2, t6, simpleSpriteCmd ;if r2 == t6 = 66 --simple move
nop
li r3, 0xe1
beq r2, r3, IsThisMyChain ;ReallyMyChain
nop
j exitmovesprite
nop
ReallyMyChain:
lbu r2,0x03(r4)
li r3, 0x05
beq r2, r3, IsThisMyChain
nop
j exitmovesprite
nop
IsThisMyChain:
lbu r2,0x0b(r4)
nop
beq r2, t7, notSimpleSpriteCommand ;is this my E1 + 64?
nop
j exitmovesprite
nop
notSimpleSpriteCommand:
; lbu t7,-0x1(t2) ;get offset XY
lhu r2,0x0c(r4) ;load cur sprite X
sra t6, t7, 0x4 ;shift 12 >> 4 = 1 pix (OR 0)
addu r2,r2,t4 ;add chain offset
;addu r2,r2,t6 ;adding myMainOffset X
sh r2,0xC(r4)
lhu r3,0xE(r4)
andi t6, t7, 0xF ;get Y offset
addu r3,r3,t3
;addu r3,r3,t6 ;adding myMainOffset (1,2,0, etc...)
addiu r3,r3,2
sh r3,0xE(r4)
nop
j exitmovesprite
nop
simpleSpriteCmd:
lhu r2,0x8(r4)
lhu r3,0xA(r4)
addu r2,r2,t4
addu r3,r3,t3
sh r2,0x8(r4)
sh r3,0xA(r4)
nop
exitmovesprite:
j 0x8001ab5c ;EXIT TO MAIN routine
;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SET TEXT BRIGHTNESS
setTextBrightness:
lbu r2,0x07(v1)
nop
beq r2, t1, simpleBright ;if r2 == t7 = 64
nop
beq r2, t0, simpleBright ;if r2 == t6 = 66 --simple move
nop
li r15, 0xe1
beq r2, r15, ItsMyBrigth1 ;ReallyMyChain
nop
j exitbrightsprite
nop
ItsMyBrigth1:
lbu r2,0x0b(v1)
nop
beq r2, t1, ItsMyBrigthMake ;is this my E1 + 64?
nop
j exitbrightsprite
nop
ItsMyBrigthMake:
sb s1,0x8(v1)
sb s2,0x9(v1)
sb s3,0xa(v1)
j 0x8001ad6c
nop
simpleBright:
sb s1,0x4(v1)
sb s2,0x5(v1)
sb s3,0x6(v1)
exitbrightsprite:
j 0x8001ad6c
nop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Patching main code
.org 0x8001a7dc
;lbu v1,0x7(r5) ;- ORIGINAL load current command
j chainSpriteCheck
nop
.org 0x8001aa8c
;lhu r2, 0x8(r5) ;getting cur x (r5 is chain addr) --------!
;lhu r4, 0xe(t2) ;;getting Y from prarm param
j getRightCoords
nop
.org 0x8001ab2c
;lbu v0,0x07(a0)
j movesprite ;movingsprite routine
nop
.org 0x8001ad48
;lbu v0,0x07(a1)
j setTextBrightness ;textbrightness routine
nop
.close
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
;.include "battle_patch.asm"
.include "txtpatches.asm" ;misc text patches
; COMPILE COMMAND: ./armips -temp 123 main.asm

View File

@@ -0,0 +1,234 @@
###############################################################
#
# OPTIMIZED RUSSIAN TEXT
#
#
# Это была славная попытка оптимизации русского текста (на манер Gemini), но она провалилась, так как под все возможные алфавиты просто нет места в видеопамяти
# Зато мы научились писать команды копирования спрайтов и кодировать координаты vram и clut
# Coords XY init
lui t2,MyAddr
addiu v0,r4,-0xa0 #shift char code for A is 0
sll v0,2 #charcode * 4
ori v1,r17,0xf900 #current char params start
addu v0,v0,v1 # shift to current char params addr
lw t7,0x0(v0) #t7 = CURRENT CHAR PARAMS load
addiu t8,t2,-0x500 #dest temp scratch addr 8008fb00
clear r18
lh v1,-0xE(t2) #Load my temp CHAR COUNTER for check
lhu t5,0x20(sp) # r13 = ld half (sp+20) = 003A ---X from sp+20
sll t6,v1,0x1 #t6 = charcount*2
addu v1,t6,v1 #v1 = t6+v1 = charcount * 3
sll v1,0x1 #v1 * 2 = charcount * 6
addu v0,v1,t5 #v0 = INIT X + CURCHAR * 6
sh v0,0x8(s3) #DAT_1f8003d8 save r2 half to 1f8003d8 = X (3A) !!!!!!!!!!!!!!!!
#SaveYinScratch:
sh s8,0xa(s3) # DAT_1f8003da *r19(1st scr DMA)+0a = r30 (Y??) !!!!!!!!!!!!!!!!
#lw t5,0x0(s3) #copying COMMAND 00 00 00 04
#nop
lui t5,0x400 #load 4 commands in command
nop
sw t5,0x0(t8) #paste to tempChain...
add5command:
lui t5, 0x0500 # 'its 5 commands'
sw t5,0x0(t8) #paste...
lui t6, 0xe100#################################
ori t6,0x023f #e100023f - TextPage = interfaceTim - BEFORE LAST COMMAND
sw t6,0x4(t8) #paste...
addiu t8, 0x4 #SHIFT temp DMA addr +4 (After TexPage)
IsRusChar:
lw t6,0x4(s3) #copying COMMAND 80 80 80 64
nop
sw t6,0x4(t8) #paste...
#######################DEST X AND Y HERE@@@@@@@@@@@@@@@@@@@@@@@@@
lh t5,0x8(s3) #DEST X HERE
nop # Need to recalculate X
addiu t5, 0x1 #right 1 pixel >
sh t5,0x8(t8) #paste DEST X
lh t6,0xA(s3) #load dest Y
sra v1, t7, 24 ##>> SHIFT 24 bits = Y vertical offset
addu t6,t6,v1 #shift dest y
#addiu t6,0x2
sh t6,0xA(t8) #save dest y
Ori v1,v1,0x10 #Concat X offs (1<< ) and Y vertical offset - 0x1(2)?
sb v1,-0x8(t2) #Store coords to temp
li v1, 0xffff
and v0, t7, v1 #truncate SRC (FFFF) coords from myTable
sh v0,0xc(t8) #Saving source coords to chain
lbu v0, 0xac(gp) #load color
li v1, 0x3d #initial CLUT X
addiu v0,-0x1 # color-1
sra v0, 1 # color /2
addiu v0, 0x1b0 #vertical color shift in VRAM
sll v0, 6 #vertical shift << 6 bits
or t6,v0,V1 # vertical<<6 & horis = CLUT
sh t6,0xe(t8) #save clut
li v1,0xff
li t5,6
sh t5,0x10(t8) #paste...
sra v0, t7, 16 #>> shift by 16 bit right
and t5, v0, v1 #truncate (AND FF)
#NEED TO MAKE DEST SIZE IN T5
sh t5,0x12(t8) #paste...
clear t6
sw t6,0x14(t8)############################################
#Fixing text coords
#lw t7,0x8(t8) #LOAD X,Y TO T7 FOR STORE IN PARAMS!!
lw t7,0x8(s3) #LOAD ORIGINAL X,Y TO T7 FOR STORE IN PARAMS!!
nop
#MAIN COMMAND PAGELOOP INIT
move t4,r20 # r12 = r20 (params)
move t1,r20 # r12 = r20 (params again)
PageLoop2:
lui t2,0xff00 # r10 = ld upper ff00 = ff000000 #DECREASE COUNTER & GET CHAIN ADDR
lw v0,-0x4930(s1)# r2 = *freeChainAddr
nop
and r4,v0,t2 # r4 = r2 & ff00..
and v0,v0,s0 # r2 & 00FFFFFF
or r5,v0,s7 # r5 = r2 or r23 (80000000) = 801ADF10
lw v0,0x4(s5) # CmdCounter r2 = *7b6d0+4 = 705
lw v1,0x0(r5) # r3 = Next Free ChainAddr
addiu v0,v0,-0x1 # r2 -= 1 Counter Down
and v1,v1,s0 # r3 & 00FFFFFF cut begin byte
or r4,r4,v1 # r4 & r3 = ff......
sw v0,0x4(s5) # CmdCounter save DMA Counter
sw r4,-0x4930(s1)# freeChain save new freeChain
lui t8,0x8009
addiu t8,t8,-0x500 #reset temp dma to 8008fb00
CopyCmdFromTemp:
lw t5,0x0(t8) #copying chain (comand count)
lw t6,0x4(t8) #copying (comand id)
sw t5,0x0(r5) #paste...
sw t6,0x4(r5) #paste...
lw t5,0x8(t8) #copying chain (YyyyXxxx)
lw t6,0xc(t8) #copying (clutYyXx) #COPYING FROM TEMP TO MAIN CHAIN
sw t5,0x8(r5) #paste...
sw t6,0xc(r5) #paste...
lw t5,0x10(t8) #copying chain (SizeYSizeX)
lw t6,0x14(t8) #copying (TexPage command???)
sw t5,0x10(r5) #paste...
sw t6,0x14(r5) #paste...
#need to make TexPage on First letter!
lhu v0,0x4(t4) #t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstCharForLastCommand # if CharCount<>0 then Goto...
nop
lui v0,0x0600 #6 COMMANDS! ON FIRST LETTER
sw v0,0x0(r5)
lui t5, 0xe100
ori t5, 0x0234
sw t5,0x018(r5) #store sixth command e100000234
NotFirstCharForLastCommand:
#OR SHIFTED COMMAND
#NEED TO COPY XY TO T8 TO COPY TO PARAMS!!!!
#lw t8,0x8(t8)
###
lw v1,0x18(t1) #r3 = *r9+18 (next param???)
lw v0,0x0(r5) # r2 = *cur New Chainaddr
lw v1,0x0(v1) # r3 = *r3
and v0,v0,t2 # r2 & ff000000
and v1,v1,s0 #r3 & 00FFFFFF
or v0,v0,v1 # r2 | r3 = 04FFFFFF - commands with FFFFFF
sw v0,0x0(r5) # *curChainAddr r5 = r2 (upd ..04 with ..FF04)
lw r4,0x18(t1) # r4 = *r8+18 (first chain addr?)
nop
lw v0,0x0(r4) # r2 = *r4 FIRST CHAIN LINK TO NEXT??
and v1,r5,s0 # r3 = r5 (cur chain) & 00FFFFFF
and v0,v0,t2 # r2 & FF000000
or v0,v0,v1 # r2 | r3 = last chain adr w 10&....
sw v0,0x0(r4) # *r4 = r2 FIRST CHAIN NEXT ADDR???
sw r5,0x18(t1) #t0->t1 # r5 = *r8+18 curChainAddr
lhu v0,0x4(t4) #t1->t4 r2 = half (DMA params)+4 (charCounter)
nop
bne v0,zero,NotFirstChar2 # if CharCount<>0 then Goto...
nop
lui t2,MyAddr
lb v0,-0x8(t2) #load offset coords from temp
nop
sb v0,0x3c(r20) #store first char offset for moving string (is first in new type)
#andi v0, 0xF #V0 and F = Y offset
sw r5,0x28(t1) #t0->t1 #*curChain+28 = currentChainAddr
sw t7,0xc(t4) #t1->t4 # Params+0c = save word X+Y STORE COORDS T7!!!!!
NotFirstChar2:
addiu t1,t1,0x4 # r8 (params) += 4 (shift params for NextPage)
addiu v0,t4,0x8 # r2 = r9+8 (shift first chain param for Page)
sltu v0,t1,v0 # r2 = r8 < r2(r9+8) (first page pass)
bne v0,zero,PageLoop2 # if r2<>0 (r8<r2) then goto Next Page Loop
nop
j OptimizedSpriteCopyEnd
nop

102
1_IS/battle_patch.asm Normal file
View File

@@ -0,0 +1,102 @@
;;;;;;;;;;;;;;;;;;;;;;;;; BOSSNAMECOPY
.psx
.open "1_IS/BIN/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

104
1_IS/charCalcs.asm Normal file
View File

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

88
1_IS/charload.asm Normal file
View File

@@ -0,0 +1,88 @@
; LOADING CHAR FROM CUSTOM FONT
makeCharPixelsCustom:
addiu sp,sp,-0x18
move a1,a0
lui a0,0x1f80
ori a0,a0,0x358
sw ra,0x10(sp)
li a2,1
lbu t2,0xac(gp)
move t0,r4
lui v1,0x801f ; ;load font addr to r3 (801ef000 + BA00)
ori v1,v1,0xaa00 ; ==== 801faa00
sll v0,a1,0x1 ; r2 = r5 << 1 (*2)
addu v0,v0,a1 ; r2 += r5 (it. *3)
sll v0,v0,0x2 ; r2 << 2 (*4) (r2 = r5 *12)
addu t1,v0,v1 ;t1 = char addr ; r9 = r2(offs) + r3 (start)
li r6,0x6 ; r6 = byteslength = 6
move v0,r6 ; r2 = r6 (counter)
beq v0,zero,charLoaded ; if counter=0 then branch
addiu r6,r6,-0x1 ; dec r6
lui a3,0x1f80
ori a3,a3,0x2e0 ; set scratch convert addr r7 = 1f8002e0
CharLoop:
lhu v1,0x0(t1) ;load upperhalf of char to r3
nop
andi r4,v1,0xf ; r4 = r3 & 0f - cutting left semibyte
srl v1,v1,0x4 ; r3 >> 4
andi v0,v1,0xf ; r2 = r3 & 0f
sll v0,v0,0x1 ; r2 << 1
addu v0,v0,a3 ; r2 = r2 + to4bitConvertTableAddr (r7)
lhu v0,0x0(v0);>DAT_1f8002e0 r2 = *r2(half) pixel pattern
nop
mult v0,t2 ; r2*r10. make Color
sll r4,r4,0x1 ; r4 << 1
addu r4,r4,a3 ; r4 += r6 counter
mflo a1 ; load lo to r5
lhu v0,0x0(r4);>DAT_1f8002e0 load table+r4
nop
mult v0,t2 ; r2 * colorIndex r10
srl v1,v1,0x4 ; r3 >> 4, right 4 bits
andi r4,v1,0xf ; r4 = r3 & f0 (cut right semibyte)
srl v1,v1,0x4 ; r3 >> 4
sll v1,v1,0x1 ; r3 << 1 = *2
addu v1,v1,a3 ; r3=r3+Table r7
sll v0,a1,0x10 ; r2 = r5 << 10 bits
mflo t4 ; load r12,low
or v0,t4,v0 ; r2 = r12 | r2
sw v0,0x0(t0) ; load *r8(current Scratch) from r2(result)
lhu v0,0x0(v1);>DAT_1f8002e0 ; load r2 from TablePattern Half from r3
nop
mult v0,t2 ; r2*color r10
sll r4,r4,0x1 ; r4 << 1
addu r4,r4,a3 ; r4 = r4 + TableStart
mflo a1 ; ld r5,lo
lhu v0,0x0(r4);>DAT_1f8002e0 ; ld half r2 from *r4
nop
mult v0,t2 ; r2*col
addiu t1,t1,0x2 ; move charFont + +2
move v1,a2 ; r3 = byteCount (r6)
addiu a2,a2,-0x1 ; r6 -= 1
addiu t0,t0,0x4 ; scrathAddr r8 += 4
sll v0,a1,0x10 ; r2 = r5 << 10 bits (move to hi)
mflo t4 ; ld r12,lo (result)
or v0,t4,v0 ; combine r2 & r 12 (0001 x 1111)
sw v0,0x0(t0) ; store result to scratch r2 to *r8
bne v1,zero,charLoop ; if r3 counter<>0 goto loop
addiu t0,t0,0x4 ; r8 scrath += 4
charLoaded:
lbu v1,0xad(gp) ; >DAT_8007b23d_textMode load curText Shadow?
li v0,0x1
bne v1,v0,NotShadow ;Shadow character check
nop
lui a0,0x1f80
jal MakeShadowSmallChar ;Make shadow in Scratch DMA
ori a0,a0,0x358
NotShadow:
lw ra,0x10(sp) ;Restore stack and exit
nop
jr ra
addiu sp,sp,0x18

View File

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

217
1_IS/txtpatches.asm Normal file
View File

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