diff options
Diffstat (limited to '')
-rw-r--r-- | src/classic_controller.S | 148 |
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 |