summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/classic_controller.S102
1 files changed, 74 insertions, 28 deletions
diff --git a/src/classic_controller.S b/src/classic_controller.S
index 6fe057e..ccc073c 100644
--- a/src/classic_controller.S
+++ b/src/classic_controller.S
@@ -10,6 +10,34 @@
.set f30,30; .set f31,31
#endif
+#define WPAD_BUTTON_2 0x0001
+#define WPAD_BUTTON_1 0x0002
+#define WPAD_BUTTON_B 0x0004
+#define WPAD_BUTTON_A 0x0008
+#define WPAD_BUTTON_MINUS 0x0010
+#define WPAD_BUTTON_HOME 0x0080
+#define WPAD_BUTTON_LEFT 0x0100
+#define WPAD_BUTTON_RIGHT 0x0200
+#define WPAD_BUTTON_DOWN 0x0400
+#define WPAD_BUTTON_UP 0x0800
+#define WPAD_BUTTON_PLUS 0x1000
+
+#define WPAD_CLASSIC_BUTTON_UP 0x0001
+#define WPAD_CLASSIC_BUTTON_LEFT 0x0002
+#define WPAD_CLASSIC_BUTTON_ZR 0x0004
+#define WPAD_CLASSIC_BUTTON_X 0x0008
+#define WPAD_CLASSIC_BUTTON_A 0x0010
+#define WPAD_CLASSIC_BUTTON_Y 0x0020
+#define WPAD_CLASSIC_BUTTON_B 0x0040
+#define WPAD_CLASSIC_BUTTON_ZL 0x0080
+#define WPAD_CLASSIC_BUTTON_FULL_R 0x0200
+#define WPAD_CLASSIC_BUTTON_PLUS 0x0400
+#define WPAD_CLASSIC_BUTTON_HOME 0x0800
+#define WPAD_CLASSIC_BUTTON_MINUS 0x1000
+#define WPAD_CLASSIC_BUTTON_FULL_L 0x2000
+#define WPAD_CLASSIC_BUTTON_DOWN 0x4000
+#define WPAD_CLASSIC_BUTTON_RIGHT 0x8000
+
.set stackSize,0x30;
.set r4Place,0x10;
.set r5Place,0x14;
@@ -23,6 +51,9 @@
.text
.align 4
+;TODO - check that classic controller is attached
+;TODO - add tilt to right analog
+;TODO - add R/L to be full tilt
.global _switch_buttons
_switch_buttons:
addi r1,r1,0x50 # replaced instruction
@@ -38,22 +69,27 @@ _switch_buttons:
stfs f10,f10Place(r1)
stfs f11,f11Place(r1)
- lwz r5,0x60(r26) # wiimote cc data
+ lbz r5,0x5C(r26) # wiimote extension type
+ cmpwi r5, 2 # classic controller
+ beq cleanup
+
+ lwz r5,0x60(r26) # wiimote cc data ; KPADInsideStatus->KPADEXStatus_bl->hold
bl map_buttons
- lwz r4,0(r26)
+ lwz r4,0(r26) # wiimote ; KPADInsideStatus->hold
or r5,r5,r4
- stw r5,0(r26)
- lwz r5,0x64(r26)
+ stw r5,0(r26) # wiimote ; KPADInsideStatus->hold
+ lwz r5,0x64(r26) # wiimote cc data ; KPADInsideStatus->KPADEXStatus_bl->trig
bl map_buttons
- lwz r4,4(r26)
+ lwz r4,4(r26) # wiimote ; KPADInsideStatus->trig
or r5,r5,r4
- stw r5,4(r26)
- lwz r5,0x68(r26)
+ stw r5,4(r26) # wiimote ; KPADInsideStatus->trig
+ lwz r5,0x68(r26) # wiimote cc data ; KPADInsideStatus->KPADEXStatus_bl->release
bl map_buttons
- lwz r4,8(r26)
+ lwz r4,8(r26) # wiimote ; KPADInsideStatus->release
or r5,r5,r4
- stw r5,8(r26)
+ stw r5,8(r26) # wiimote ; KPADInsideStatus->release
+cleanup:
lwz r4,r4Place(r1)
lwz r5,r5Place(r1)
lwz r6,r6Place(r1)
@@ -66,12 +102,14 @@ _switch_buttons:
addi r1,r1,stackSize
blr
+; r5 == CC data
+; r5 returns the wpad data
map_buttons:
andi. r4,r5,0x10 // WPAD_CLASSIC_BUTTON_A
cmpwi r4,0
beq- skip_waggle
lis r6,0x7fc0 // float
- stw r6,0x10(r26) // set waggle
+ stw r6,0x10(r26) // set waggle ; KPADInsideStatus->acc->y
skip_waggle:
li r6,0
andi. r4,r5,0x800 // WPAD_CLASSIC_BUTTON_HOME
@@ -90,6 +128,14 @@ skip_run_two:
beq- skip_jump
ori r6,r6,0x100 // WPAD_BUTTON_2
skip_jump:
+ andi. r4,r5,0x80 // WPAD_CLASSIC_BUTTON_ZL
+ beq- skip_bubble1
+ ori r6,r6,0x8 // WPAD_BUTTON_A
+skip_bubble1:
+ andi. r4,r5,0x4 // WPAD_CLASSIC_BUTTON_ZR
+ beq- skip_bubble2
+ ori r6,r6,0x8 // WPAD_BUTTON_A
+skip_bubble2:
andi. r4,r5,1 // WPAD_CLASSIC_BUTTON_UP
beq- skip_right
ori r6,r6,2 // WPAD_BUTTON_RIGHT
@@ -114,27 +160,27 @@ skip_plus:
beq- skip_minus
ori r6,r6,0x1000 // WPAD_BUTTON_MINUS
skip_minus:
- lfs f8,0x6c(r26) // left analog x
- lfs f9,0x70(r26) // left analog y
+ lfs f8,0x6c(r26) // left analog x ; KPADInsideStatus->KPADEXStatus_cl->lstick
+ lfs f9,0x70(r26) // left analog y ; KPADInsideStatus->KPADEXStatus_cl->rstick
lis r5,float_one@h
lfs f10,float_one@l(r5)
lfs f11,float_neg_one@l(r5)
-# fcmpu cr0,f8,f10
-# bne skip_right_analog
-# ori r6,r6,4 // WPAD_BUTTON_DOWN
-#skip_right_analog:
-# fcmpu cr0,f9,f10
-# bne skip_right_analog
-# ori r6,r6,2 // WPAD_BUTTON_RIGHT
-#skip_up_analog:
-# fcmpu cr0,f9,f11
-# bne skip_right_analog
-# ori r6,r6,1 // WPAD_BUTTON_LEFT
-#skip_down_analog:
-# fcmpu cr0,f8,f11
-# bne skip_right_analog
-# ori r6,r6,8 // WPAD_BUTTON_UP
-#skip_left_analog:
+; fcmpu cr0,f8,f10
+; bne skip_right_analog
+; ori r6,r6,4 // WPAD_BUTTON_DOWN
+;skip_right_analog:
+; fcmpu cr0,f9,f10
+; bne skip_right_analog
+; ori r6,r6,2 // WPAD_BUTTON_RIGHT
+;skip_up_analog:
+; fcmpu cr0,f9,f11
+; bne skip_right_analog
+; ori r6,r6,1 // WPAD_BUTTON_LEFT
+;skip_down_analog:
+; fcmpu cr0,f8,f11
+; bne skip_right_analog
+; ori r6,r6,8 // WPAD_BUTTON_UP
+;skip_left_analog:
mr r5,r6
blr