add research/controller-input.s
This commit is contained in:
parent
b90e1381c5
commit
a2a76298d7
2 changed files with 111 additions and 0 deletions
3
src/research/controller-input.ld
Normal file
3
src/research/controller-input.ld
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
$$ = 0;
|
||||||
|
$C2$.call.PADRead = 0x80011bf4;
|
||||||
|
$C2$.main = 0x800ed2b4;
|
108
src/research/controller-input.s
Normal file
108
src/research/controller-input.s
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
/*
|
||||||
|
9000_0000 [1] status
|
||||||
|
9400_0000 dst
|
||||||
|
*/
|
||||||
|
.set aStatus, 0
|
||||||
|
.set status.preparing, 0
|
||||||
|
.set status.ready, 1
|
||||||
|
.set status.running, 2
|
||||||
|
.set status.done, 3
|
||||||
|
|
||||||
|
.macro .call addr
|
||||||
|
lis r12, \addr@h
|
||||||
|
ori r12, r12, \addr@l
|
||||||
|
mtlr r12
|
||||||
|
blrl
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.call.PADRead:
|
||||||
|
## check enabled
|
||||||
|
lis r12, 0x9000
|
||||||
|
lbz r0, aStatus(r12)
|
||||||
|
cmplwi r0, status.running
|
||||||
|
lis r12, pad.PADRead@h
|
||||||
|
ori r12, r12, pad.PADRead@l
|
||||||
|
mtlr r12
|
||||||
|
bnelrl+
|
||||||
|
|
||||||
|
.set rRet, 31
|
||||||
|
.set rInput, 30
|
||||||
|
.set rDst, 29
|
||||||
|
.set rMario, 28
|
||||||
|
.set rGamePad, 27
|
||||||
|
.set rPadStatus, 26
|
||||||
|
# r23-r31 is restored in orignal code
|
||||||
|
|
||||||
|
.main:
|
||||||
|
## check whether to run
|
||||||
|
lis r12, 0x9000
|
||||||
|
lbz r11, aStatus(r12)
|
||||||
|
cmplwi r11, status.ready
|
||||||
|
bne+ .main.done
|
||||||
|
## init
|
||||||
|
### backup return value
|
||||||
|
mr rRet, r3
|
||||||
|
### set status
|
||||||
|
li r11, status.running
|
||||||
|
stb r11, aStatus(r12)
|
||||||
|
### init variables
|
||||||
|
li rInput, 0
|
||||||
|
lis rDst, 0x9400
|
||||||
|
lwz rMario, gpMarioOriginal$r13(r13)
|
||||||
|
lwz rGamePad, 0x4FC(rMario)
|
||||||
|
lis rPadStatus, mPadStatus@ha
|
||||||
|
la rPadStatus, mPadStatus@l(rPadStatus)
|
||||||
|
.main.loop:
|
||||||
|
## set input
|
||||||
|
sth rInput, 2(rPadStatus)
|
||||||
|
## calculate
|
||||||
|
### JUTGamePad.read()
|
||||||
|
mr r3, rGamePad
|
||||||
|
.call JUTGamePad.read
|
||||||
|
### TMarioGamePad::updateMeaning()
|
||||||
|
mr r3, rGamePad
|
||||||
|
.call TMarioGamePad.updateMeaning
|
||||||
|
### TMario.checkController()
|
||||||
|
mr r3, rMario
|
||||||
|
.call TMario.checkController
|
||||||
|
## record
|
||||||
|
### input (size=2)
|
||||||
|
sthu rInput, -2(rDst)
|
||||||
|
### PadStatus.MStick (size=2)
|
||||||
|
lhz r0, 2(rPadStatus)
|
||||||
|
sthu r0, -2(rDst)
|
||||||
|
### JUTGamePad::CStick (size=0x10)
|
||||||
|
addi r4, rGamePad, 0x48 # &gamepad.MStick
|
||||||
|
li r5, 0x10
|
||||||
|
sub rDst, rDst, r5
|
||||||
|
mr r3, rDst
|
||||||
|
.call memcpy
|
||||||
|
### controllerWork->MStickInt (size=4)
|
||||||
|
lwz r11, 0x108(rMario)
|
||||||
|
lwz r0, 0(r11)
|
||||||
|
stwu r0, -4(rDst)
|
||||||
|
### controllerWork->MStickFloat (size=12)
|
||||||
|
addi r4, r11, 0x10
|
||||||
|
li r5, 12
|
||||||
|
sub rDst, rDst, r5
|
||||||
|
mr r3, rDst
|
||||||
|
.call memcpy
|
||||||
|
## baseAcc, accDir (size=8)
|
||||||
|
lwz r0, 0x8C(rMario)
|
||||||
|
stwu r0, -4(rDst)
|
||||||
|
lwz r0, 0x90(rMario)
|
||||||
|
stwu r0, -4(rDst)
|
||||||
|
.main.loop.next:
|
||||||
|
addi rInput, rInput, 1
|
||||||
|
rlwinm. r0, rInput, 0, 0x0, 0xF
|
||||||
|
beq+ .main.loop
|
||||||
|
.main.epilogue:
|
||||||
|
## set done
|
||||||
|
lis r12, 0x9000
|
||||||
|
li r0, status.done
|
||||||
|
stb r0, aStatus(r12)
|
||||||
|
## restore return value
|
||||||
|
mr r3, rRet
|
||||||
|
.main.done:
|
||||||
|
## orig
|
||||||
|
lmw r23, 0x16C(r1)
|
Loading…
Reference in a new issue