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 | 
