; read_kpad_button
; 8030EFA8
; r4 holds extType
; r6 holds wiimote bitfield
; r7 holds wiimote+nunchuk bitfield
; r8 holds classic bitfield
NUNCHUK:
cmpwi r4, 0x1
bne- RETURN
; magic
mflr r9
bl GRAB
MAGIC:
ZERO: .float 0.0
ONE: .float 1.0
GRAB:
mflr r4
mtlr r9
lfs f0, ZERO-MAGIC(r4)
lfs f1, ONE-MAGIC(r4)
fneg f2, f1
stfs f0, 0x74(r3)
stfs f0, 0x78(r3)
NUNCHUK_HOME:
andi. r9, r7, 0x8000 ; home
beq- GAMEPLAY_CHECK
ori r8, r8, 0x800
GAMEPLAY_CHECK:
lis r4, 0x8071
lwz r9, 0x6CC0(r4) ; field set up
cmpwi r9, 0
beq- MENU_MODE
lbz r9, 0x73A1(r4) ; out of field
cmpwi r9, 0
bne- MENU_MODE
lis r4, 0x8072
lbz r9, 0x4570(r4) ; quest state
cmpwi r9, 5
beq- MENU_MODE
lwz r4, 0x15D8(r13) ; menus
andis. r9, r4, 0x8000
beq- MENU_MODE
lbz r9, 0x5(r4) ; popup
cmpwi r9, 0x1
beq- MENU_MODE
lbz r9, 0x6(r4) ; supply
cmpwi r9, 0x1
beq- MENU_MODE
lbz r9, 0x7(r4) ; overstuffed
cmpwi r9, 0x0
bne- MENU_MODE
lwz r4, 0x16D0(r13) ; field guide
andis. r9, r4, 0x8000
beq- MENU_MODE
lbz r9, 0x0(r4)
cmpwi r9, 0x1
bne- GAMEPLAY_MODE
MENU_MODE:
MENU_C:
andi. r9, r7, 0x4000
beq- MENU_UP
ori r8, r8, 0x2000 ; l, re-center
MENU_RS_UP:
andi. r9, r7, 0x8
beq- MENU_RS_DOWN
stfs f1, 0x78(r3) ; up
MENU_RS_DOWN:
andi. r9, r7, 0x4
beq- MENU_RS_LEFT
stfs f2, 0x78(r3) ; down
MENU_RS_LEFT:
andi. r9, r7, 0x1
beq- MENU_RS_RIGHT
stfs f2, 0x74(r3) ; left
MENU_RS_RIGHT:
andi. r9, r7, 0x2
beq- MENU_A
stfs f1, 0x74(r3) ; right
b MENU_A
MENU_UP:
andi. r9, r7, 0x8
beq- MENU_DOWN
ori r8, r8, 0x1 ; up
MENU_DOWN:
andi. r9, r7, 0x4
beq- MENU_LEFT
ori r8, r8, 0x4000 ; down
MENU_LEFT:
andi. r9, r7, 0x1
beq- MENU_RIGHT
ori r8, r8, 0x2 ; left
MENU_RIGHT:
andi. r9, r7, 0x2
beq- MENU_A
ori r8, r8, 0x8000 ; right
MENU_A:
andi. r9, r7, 0x800
beq- MENU_B
ori r8, r8, 0x10 ; a, confirm
MENU_B:
andi. r9, r7, 0x400
beq- MENU_1
ori r8, r8, 0x40 ; b, cancel
MENU_1:
andi. r9, r7, 0x200
beq- MENU_2
ori r8, r8, 0x20 ; y, various toggles
MENU_2:
andi. r9, r7, 0x100
beq- MENU_PLUS
ori r8, r8, 0x400 ; plus, menu
MENU_PLUS:
andi. r9, r7, 0x10
beq- MENU_MINUS
ori r8, r8, 0x10 ; a, confirm
MENU_MINUS:
andi. r9, r7, 0x1000
beq- MENU_Z
ori r8, r8, 0x1000 ; minus, sort items
MENU_Z:
andi. r9, r7, 0x2000
beq- NUNCHUK_DONE
ori r8, r8, 0x200 ; r, run
b NUNCHUK_DONE
GAMEPLAY_MODE:
GAMEPLAY_C:
andi. r9, r7, 0x4000
beq- GAMEPLAY_UP
ori r8, r8, 0x2000 ; l, re-center
GAMEPLAY_DPAD_UP:
andi. r9, r7, 0x8
beq- GAMEPLAY_DPAD_DOWN
ori r8, r8, 0x1 ; up
GAMEPLAY_DPAD_DOWN:
andi. r9, r7, 0x4
beq- GAMEPLAY_DPAD_LEFT
ori r8, r8, 0x4000 ; down
GAMEPLAY_DPAD_LEFT:
andi. r9, r7, 0x1
beq- GAMEPLAY_DPAD_RIGHT
ori r8, r8, 0x2 ; left
GAMEPLAY_DPAD_RIGHT:
andi. r9, r7, 0x2
beq- GAMEPLAY_ZL
ori r8, r8, 0x8000 ; right
GAMEPLAY_ZL:
andi. r9, r7, 0x200
beq- GAMEPLAY_ZR
ori r8, r8, 0x80 ; zl, toggle map zoom
GAMEPLAY_ZR:
andi. r9, r7, 0x100
beq- GAMEPLAY_A
ori r8, r8, 0x4 ; zr, read quest notes maybe
b GAMEPLAY_A
GAMEPLAY_UP:
andi. r9, r7, 0x8
beq- GAMEPLAY_DOWN
stfs f1, 0x78(r3) ; right stick up
GAMEPLAY_DOWN:
andi. r9, r7, 0x4
beq- GAMEPLAY_LEFT
stfs f2, 0x78(r3) ; right stick down
GAMEPLAY_LEFT:
andi. r9, r7, 0x1
beq- GAMEPLAY_RIGHT
stfs f2, 0x74(r3) ; right stick left
GAMEPLAY_RIGHT:
andi. r9, r7, 0x2
beq- GAMEPLAY_1
stfs f1, 0x74(r3) ; right stick right
GAMEPLAY_1:
andi. r9, r7, 0x200
beq- GAMEPLAY_2
ori r8, r8, 0x1000 ; minus, kick
GAMEPLAY_2:
andi. r9, r7, 0x100
beq- GAMEPLAY_A
ori r8, r8, 0x400 ; plus, menu
GAMEPLAY_A:
andi. r9, r7, 0x800
beq- GAMEPLAY_B
ori r8, r8, 0x8 ; x, attack
GAMEPLAY_B:
andi. r9, r7, 0x400
beq- GAMEPLAY_PLUS
ori r8, r8, 0x40 ; b, evade
GAMEPLAY_PLUS:
andi. r9, r7, 0x10
beq- GAMEPLAY_MINUS
ori r8, r8, 0x10 ; a, interact/attack 2 (type 1)
GAMEPLAY_MINUS:
andi. r9, r7, 0x1000
beq- GAMEPLAY_Z
ori r8, r8, 0x20 ; y, sheath weapon
GAMEPLAY_Z:
andi. r9, r7, 0x2000
beq- NUNCHUK_DONE
ori r8, r8, 0x200 ; r, run
NUNCHUK_DONE:
li r4, 0x2 ; i'm a classic
RETURN:
andi. r9, r6, 0x9FFF