summaryrefslogtreecommitdiff
path: root/src/classic_controller.S
diff options
context:
space:
mode:
Diffstat (limited to 'src/classic_controller.S')
-rw-r--r--src/classic_controller.S148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/classic_controller.S b/src/classic_controller.S
new file mode 100644
index 0000000..6fe057e
--- /dev/null
+++ b/src/classic_controller.S
@@ -0,0 +1,148 @@
+#ifndef __MWERKS__
+.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3
+.set f1,1; .set f8,8; .set f9,9; .set f10,10; .set f11,11;
+.set f30,30; .set f31,31
+#endif
+
+.set stackSize,0x30;
+.set r4Place,0x10;
+.set r5Place,0x14;
+.set r6Place,0x18;
+.set r26Place,0x1c;
+.set f8Place,0x20;
+.set f9Place,0x24;
+.set f10Place,0x28;
+.set f11Place,0x2c;
+
+.text
+.align 4
+
+.global _switch_buttons
+_switch_buttons:
+ addi r1,r1,0x50 # replaced instruction
+
+ stwu r1,-stackSize(r1) # provide new stack for saving regs
+ mflr r0
+ stw r4,r4Place(r1)
+ stw r5,r5Place(r1)
+ stw r6,r6Place(r1)
+ stw r26,r26Place(r1)
+ stfs f8,f8Place(r1)
+ stfs f9,f9Place(r1)
+ stfs f10,f10Place(r1)
+ stfs f11,f11Place(r1)
+
+ lwz r5,0x60(r26) # wiimote cc data
+ bl map_buttons
+ lwz r4,0(r26)
+ or r5,r5,r4
+ stw r5,0(r26)
+ lwz r5,0x64(r26)
+ bl map_buttons
+ lwz r4,4(r26)
+ or r5,r5,r4
+ stw r5,4(r26)
+ lwz r5,0x68(r26)
+ bl map_buttons
+ lwz r4,8(r26)
+ or r5,r5,r4
+ stw r5,8(r26)
+
+ lwz r4,r4Place(r1)
+ lwz r5,r5Place(r1)
+ lwz r6,r6Place(r1)
+ lwz r26,r26Place(r1)
+ lfs f8,f8Place(r1)
+ lfs f9,f9Place(r1)
+ lfs f10,f10Place(r1)
+ lfs f11,f11Place(r1)
+ mtlr r0
+ addi r1,r1,stackSize
+ blr
+
+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
+skip_waggle:
+ li r6,0
+ andi. r4,r5,0x800 // WPAD_CLASSIC_BUTTON_HOME
+ beq- skip_home
+ ori r6,r6,0x8000 // WPAD_BUTTON_HOME
+skip_home:
+ andi. r4,r5,0x20 // WPAD_CLASSIC_BUTTON_Y
+ beq- skip_run_one
+ ori r6,r6,0x200 // WPAD_BUTTON_1
+skip_run_one:
+ andi. r4,r5,0x8 // WPAD_CLASSIC_BUTTON_X
+ beq- skip_run_two
+ ori r6,r6,0x200 // WPAD_BUTTON_1
+skip_run_two:
+ andi. r4,r5,0x40 // WPAD_CLASSIC_BUTTON_B
+ beq- skip_jump
+ ori r6,r6,0x100 // WPAD_BUTTON_2
+skip_jump:
+ andi. r4,r5,1 // WPAD_CLASSIC_BUTTON_UP
+ beq- skip_right
+ ori r6,r6,2 // WPAD_BUTTON_RIGHT
+skip_right:
+ andi. r4,r5,2 // WPAD_CLASSIC_BUTTON_LEFT
+ beq- skip_up
+ ori r6,r6,8 // WPAD_BUTTON_UP
+skip_up:
+ andi. r4,r5,0x8000 // WPAD_CLASSIC_BUTTON_RIGHT
+ beq- skip_down
+ ori r6,r6,4 // WPAD_BUTTON_DOWN
+skip_down:
+ andi. r4,r5,0x4000 // WPAD_CLASSIC_BUTTON_DOWN
+ beq- skip_left
+ ori r6,r6,1 // WPAD_BUTTON_LEFT
+skip_left:
+ andi. r4,r5,0x400 // WPAD_CLASSIC_BUTTON_PLUS
+ beq- skip_plus
+ ori r6,r6,0x10 // WPAD_BUTTON_PLUS
+skip_plus:
+ andi. r4,r5,0x1000 // WPAD_CLASSIC_BUTTON_MINUS
+ 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
+ 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:
+ mr r5,r6
+ blr
+
+.data
+
+float_one:
+.float 1.0
+float_neg_one:
+.float -1.0
+float_zero:
+.float 0.0