39 lines
657 B
ArmAsm
39 lines
657 B
ArmAsm
|
.include "./macros.s"
|
||
|
|
||
|
.macro .rwbl src dst
|
||
|
li32 r3, \src
|
||
|
li32 r4, \dst
|
||
|
bl replace_with_bl
|
||
|
.endm
|
||
|
|
||
|
.globl _start
|
||
|
_start: # right after gci loaded into RAM
|
||
|
mflr r11 # need to make sure r11 is not destroyed
|
||
|
|
||
|
## replace original instruction @src with `bl dst`
|
||
|
## TODO version
|
||
|
.rwbl 0x800f9a10, _gameLoop
|
||
|
.rwbl 0x800ecde0, _getQFSync
|
||
|
|
||
|
## return
|
||
|
mtlr r11
|
||
|
blr
|
||
|
|
||
|
/**
|
||
|
* r3 = address of original code
|
||
|
* r4 = address of practice code function
|
||
|
*/
|
||
|
replace_with_bl:
|
||
|
## bl from r3 to r4
|
||
|
sub r4, r4, r3
|
||
|
rlwinm r4, r4, 0, 6, 29
|
||
|
oris r4, r4, 0x4800
|
||
|
ori r4, r4, 0x1
|
||
|
stw r4, 0(r3)
|
||
|
## invalidate cache
|
||
|
dcbst 0, r3
|
||
|
sync
|
||
|
icbi 0, r3
|
||
|
isync
|
||
|
blr
|