usbloadergx/source/patches/patchhook.S
giantpune 30535c6f5d *code beautification*
formatted the code to make it easier to read.  no functional changes at all.

i didn't put anything from the libwiigui folder or banner folder in the beautifier.

my automated .bat seems to have done a good job.  the only places i see it fucked up was on (GXColor){blablabla}.  it treated the brackets in the color like all the other brackets and put the color on a new line and indented it.  i think i fixed most of them.  not sure if it messed up anywhere else.  also not sure about how it handled different linebreaks.  it looks fine on windows.  if it looks messed up on linux, it can be reverted.

the code still compiles and runs fine.
2009-07-30 05:41:12 +00:00

509 lines
26 KiB
ArmAsm

# (c) Nuke www.usbgecko.com. Licensed under GPL V2
.text
#include "ppc.h"
.globl patchhook # r3 address
patchhook:
mtctr r4
lis r6, 0x4E80
ori r6, r6, 0x0020 # blr
findblr:
lwz r5, 0(r3)
cmpw r6, r5
beq writebranch
addi r3, r3, 4 # next word
bdnz findblr # loop length
b exit # stop unhooked game hanging
writebranch:
lis r4, 0x8000 # 800018A0 hook location (source)
ori r4, r4, 0x18A8
subf r4, r3, r4 # subtract r3 from r4 and place in r4
lis r5, 0x3FF
ori r5, r5, 0xFFFF # 0x3FFFFFF
and r4, r4, r5
lis r5, 0x4800 # 0x48000000
or r4, r4, r5
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exit:
blr # return
.globl patchhook2 # r3 address
patchhook2:
mtctr r4
lis r6, 0x4E80
ori r6, r6, 0x0020 # blr
findblr2:
lwz r5, 0(r3)
cmpw r6, r5
beq writebranch2
addi r3, r3, 4 # next word
bdnz findblr2 # loop length
b exit2 # stop unhooked game hanging
writebranch2:
lis r4, 0x8000 # 81700000 our temp patcher
ori r4, r4, 0x18a8
subf r4, r3, r4 # subtract r3 from r4 and place in r4
lis r5, 0x3FF
ori r5, r5, 0xFFFF # 0x3FFFFFF
and r4, r4, r5
lis r5, 0x4800 # 0x48000000
or r4, r4, r5
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exit2:
blr # return
.globl patchhook3 # r3 address
patchhook3:
mtctr r4
lis r6, 0x4BFF
ori r6, r6, 0xE955 # blr
findbne:
lwz r5, 0(r3)
cmpw r6, r5
beq writebl
addi r3, r3, 4 # next word
bdnz findbne # loop length
b exit3 # stop unhooked game hanging
writebl:
lis r4, 0x4BFF # 81700000 our temp patcher
ori r4, r4, 0xEA91
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exit3:
blr # return
.globl patchhook4 # r3 address
patchhook4:
mtctr r4
lis r6, 0x4082
ori r6, r6, 0x001C # blr
findregion:
lwz r5, 0(r3)
cmpw r6, r5
beq writebr
addi r3, r3, 4 # next word
bdnz findregion # loop length
b exit4 # stop unhooked game hanging
writebr:
lis r4, 0x4800
ori r4, r4, 0x001C
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exit4:
blr # return
.globl multidolpatchone # r3 address
multidolpatchone:
mtctr r4
lis r6, 0x3800
ori r6, r6, 0x0001 # (li r0,1)
findmulti:
lwz r5, 0(r3)
cmpw r6, r5
beq writemulti
subi r3, r3, 4 # go back
bdnz findmulti # loop length
b exit5 # stop unhooked game hanging
writemulti:
lis r4, 0x8170 # 81700000
ori r4, r4, 0x0020
subf r18, r3, r4 # subf r18,(source),(dest)
lis r6, 0x4800
ori r6,r6,1
rlwimi r6,r18,0,6,29
stw r6,0(r3)
stw r6,0(r19)
stw r3,4(r19)
dcbf r0, r3
sync
icbi r0, r3
isync
exit5:
blr # return
.globl multidolpatchtwo # r3 address
multidolpatchtwo:
mtctr r4
lis r6, 0x3F60
ori r6, r6, 0x8000 # (lis r27,-32768)
findmulti2:
lwz r5, 0(r3)
cmpw r6, r5
beq writemulti2
addi r3, r3, 4 # go forward
bdnz findmulti2 # loop length
b exit6 # stop unhooked game hanging
writemulti2:
lis r4, 0x8170 # 81700020
ori r4, r4, 0x0000
subf r18, r3, r4 # subf r18,(source),(dest)
lis r6, 0x4800
ori r6,r6,1
rlwimi r6,r18,0,6,29
stw r6,0(r3)
stw r6,0(r19)
stw r3,4(r19)
dcbf r0, r3
sync
icbi r0, r3
isync
exit6:
blr # return
.globl langvipatch # r3 address, r4 len, r5 lang byte
langvipatch:
mtctr r4
lis r6, 0x8861
ori r6, r6, 0x0008 # lbz r3, 8(sp)
findlang:
lwz r7, 0(r3)
cmpw r6, r7
beq patchlang
addi r3, r3, 4 # next word
bdnz findlang # loop length
b exitlang # stop unhooked game hanging
patchlang:
lis r4, 0x3860 # 0x38600001 li %r3, 1 # eng
add r4, r4, r5
gofinal:
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitlang:
blr # return
.globl vipatch # r3 address
vipatch:
mtctr r4
lis r6, 0x5400
ori r6, r6, 0xFFFE
findvi:
lwz r5, 0(r3)
cmpw r6, r5
beq patchvi
addi r3, r3, 4 # next word
bdnz findvi # loop length
b exitvi # stop unhooked game hanging
patchvi:
lis r4, 0x8000
ori r4, r4, 0x0003
lbz r5, 0(r4)
cmpwi r5, 0x45 # USA
beq patchusa
cmpwi r5, 0x4A
beq patchjap2 # JAP
b exitvi
patchjap2:
lis r4, 0x3800
ori r4, r4, 0x0001
b gofinal2
patchusa:
lis r4, 0x3800
ori r4, r4, 0x0000
gofinal2:
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitvi:
blr # return
.globl regionfreejap # r3 address
regionfreejap:
mtctr r4
lis r6, 0x2C1B
ori r6, r6, 0x0000 # blr
findjap:
lwz r5, 0(r3)
cmpw r6, r5
beq writenop
addi r3, r3, 4 # next word
bdnz findjap # loop length
b exitjap # stop unhooked game hanging
writenop:
addi r3, r3, 4 # next word
lis r4, 0x6000 # nop
ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitjap:
blr # return
.globl regionfreeusa # r3 address
regionfreeusa:
mtctr r4
lis r6, 0x281B
ori r6, r6, 0x0001 # blr
findusa:
lwz r5, 0(r3)
cmpw r6, r5
beq writenop1
addi r3, r3, 4 # next word
bdnz findusa # loop length
b exitusa # stop unhooked game hanging
writenop1:
addi r3, r3, 4 # next word
lis r4, 0x6000 # nop
ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitusa:
blr # return
.globl regionfreepal # r3 address
regionfreepal:
mtctr r4
lis r6, 0x281B
ori r6, r6, 0x0002 # blr
findpal:
lwz r5, 0(r3)
cmpw r6, r5
beq writenop2
addi r3, r3, 4 # next word
bdnz findpal # loop length
b exitpal # stop unhooked game hanging
writenop2:
addi r3, r3, 4 # next word
lis r4, 0x6000 # nop
ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
lis r6, 0x4082
ori r6, r6, 0x001C # bne loc_81377A2C
findextra: #this is just the bne to b patch
lwz r5, 0(r3)
cmpw r6, r5
beq writeb
addi r3, r3, 4 # next word
bdnz findextra # loop length
b exitpal # stop unhooked game hanging
writeb:
addi r3, r3, 4 # next word
lis r4, 0x4800
ori r4, r4, 0x001c # b loc_81377A2C
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitpal:
blr # return
.globl removehealthcheck # r3 address
removehealthcheck:
mtctr r4
lis r6, 0x4182
ori r6, r6, 0x004C # blr
findhe:
lwz r5, 0(r3)
cmpw r6, r5
beq writebhe
addi r3, r3, 4 # next word
bdnz findhe # loop length
b exithe # stop unhooked game hanging
writebhe:
lis r4, 0x6000
ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exithe:
blr # return
.globl patchupdatecheck # r3 address
patchupdatecheck:
mtctr r4
lis r6, 0x4082
ori r6, r6, 0x0020 # blr
finduc:
lwz r5, 0(r3)
cmpw r6, r5
beq writenopuc
addi r3, r3, 4 # next word
bdnz finduc # loop length
b exituc # stop unhooked game hanging
writenopuc:
lis r4, 0x6000
ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exituc:
blr # return
.globl copyflagcheck1 # r3 address
copyflagcheck1:
mtctr r4
lis r6, 0x5400
ori r6, r6, 0x07FF
findncf1:
lwz r5, 0(r3)
cmpw r6, r5
beq writencf1
subi r3, r3, 4 # next word
bdnz findncf1 # loop length
b exitncf1 # stop unhooked game hanging
writencf1:
lis r4, 0x7C00
ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitncf1:
blr # return
.globl copyflagcheck2 # r3 address
copyflagcheck2:
mtctr r4
lis r6, 0x5400
ori r6, r6, 0x07FF
findncf2:
lwz r5, 0(r3)
cmpw r6, r5
beq writencf2
subi r3, r3, 4 # next word
bdnz findncf2 # loop length
b exitncf2 # stop unhooked game hanging
writencf2:
lis r4, 0x7C00
ori r4, r4, 0x0000
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitncf2:
blr # return
.globl copyflagcheck3 # r3 address
copyflagcheck3:
findncf3:
addi r3, r3, 20 # go back one dword (4 bytes)
lwz r5, 0(r3)
writencf3:
lis r4, 0x3860
ori r4, r4, 0x0001 # li r3,1
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitncf3:
blr # return
.globl copyflagcheck4 # r3 address
copyflagcheck4:
mtctr r4
lis r6, 0x3BE0
ori r6, r6, 0x0001 # li r31,1
findncf4:
lwz r5, 0(r3)
cmpw r6, r5
beq writencf4
addi r3, r3, 4 # next word
bdnz findncf4 # loop length
b exitncf4 # stop unhooked game hanging
writencf4:
lis r4, 0x3BE0
ori r4, r4, 0x0000 # change this to 3BE00000 (li r31,0)
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitncf4:
blr # return
.globl copyflagcheck5 # r3 address
copyflagcheck5:
mtctr r4
lis r6, 0x4182
ori r6, r6, 0x0024 # beq loc_8134AA60
findncf5:
lwz r5, 0(r3)
cmpw r6, r5
beq writencf5
addi r3, r3, 4 # next word
bdnz findncf5 # loop length
b exitncf5 # stop unhooked game hanging
writencf5:
#addi r3, r3, 8 # skip 2
lis r4, 0x801D
ori r4, r4, 0x0024 # change to 801D0024 (lwz r0,36(r29))
stw r4, 0(r3)
dcbf r0, r3
icbi r0, r3
addi r3, r3, 4 # next word
lis r4, 0x5400
ori r4, r4, 0x003C # change to 5400003C (rlwinm r0,r0,0,0,30)
stw r4, 0(r3)
dcbf r0, r3
icbi r0, r3
addi r3, r3, 4 # next word
lis r4, 0x901D
ori r4, r4, 0x0024 # change to 901D0024 (stw r0,36(r29))
stw r4, 0(r3)
dcbf r0, r3
icbi r0, r3
addi r3, r3, 4 # next word
lis r4, 0x4800
ori r4, r4, 0x0018 # change to 48000018 (b 0x8134aa60)
stw r4, 0(r3)
dcbf r0, r3
icbi r0, r3
exitncf5:
blr # return
.globl movedvdhooks # r3 address
movedvdhooks:
lis r6, 0x4182
ori r6, r6, 0x0120 # beq loc_813A7938
findmd1:
addi r3, r3, 4 # next word
lwz r5, 0(r3)
writemd1:
lis r4, 0x6000
ori r4, r4, 0x0000 # nop
stw r4, 0(r3) # result in r3
dcbf r0, r3 # data cache block flush
icbi r0, r3
exitmd1:
blr # return