Files
psopeeps-newserv/system/quests/hidden/q88530-gc-e.bin.txt
T
2024-08-17 10:39:10 -07:00

60 lines
2.0 KiB
Plaintext

.version GC_V3
.quest_num 88530
.language 1
.episode Episode1
.name "GC v1.2 USA patch enabler"
.short_desc ""
.long_desc ""
start:
// Create quest opcode handlers for F9FE to call flush_code and F9FF to call
// the copied code. Fortunately, quest_call_l leaves the byteswapped value of
// the opcode argument in r4, so as long as the address ends with 00, it will
// be valid as the size argument to flush_code. We'll end up flushing many
// more bytes than needed, but this isn't a problem.
leti r3, 0x80004000 // dest addr
write4 0x804C81C8, 0x801F2A14 // quest_call_l
write4 0x804C81CC, 0x8000C274 // flush_code
write4 0x804C81D0, r3 // written code ptr
read4 r0, 0x805D5E70 // quest_script_base
leto r4, code
read4 r4, r4
add r4, r0 // r4 = address of code label
leto r5, code_end
read4 r5, r5
add r5, r0 // r5 = address of code_end label
// Copy all data from [code, code_end) to 80004000
copy_byte:
jmp_eq r4, r5, copy_done
read1 r0, r4
write1 r3, r0
addi r3, 1
addi r4, 1
jmp copy_byte
copy_done:
// Call flush_code(0x80004000, 0x00400080) to commit it to memory
.data F9FE00400080
// Call the copied native code
.data F9FF
// This script runs on the first frame during the quest loading procedure,
// but this procedure is started from the lobby overview, not from a game!
// To make the result of loading a quest sane, we need to set some extra
// state that will take effect when loading is done.
ba_initial_floor 17 // Make player spawn in lobby (for one frame)
write2 0x805D5CE8, 1 // Leave "game" immediately (sends 98)
// Clean up quest handler table
write4 0x804C81C8, 0
write4 0x804C81CC, 0
write4 0x804C81D0, 0
ret
code:
.include_native q8853x-gc.s
code_end: