60 lines
2.0 KiB
Plaintext
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:
|