summaryrefslogtreecommitdiff
path: root/src/classic_controller.S
blob: 86be34f2f58c4f2ecf8c624c4ec1cae0232fc1fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#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

.text
.align 4

.global _switch_buttons
_switch_buttons:
	addi    r1,r1,0x50			# replaced instruction

	mflr    r0
	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)
	mtlr    r0
	blr

map_buttons:
	andi.   r4,r5,0x200		// WPAD_CLASSIC_BUTTON_FULL_R
	beq-    skip_waggle
	lis     r6,0x7fc0		// float
skip_waggle:
	stw     r6,0x10(r26)	// set 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	cr1,f8,f10
	bne		cr1,skip_right_analog
	ori     r6,r6,4			// WPAD_BUTTON_DOWN
skip_right_analog:
	fcmpu	cr1,f9,f10
	bne		cr1,skip_right_analog
	ori     r6,r6,2			// WPAD_BUTTON_RIGHT
skip_up_analog:
	fcmpu	cr1,f9,f11
	bne		cr1,skip_right_analog
	ori     r6,r6,1			// WPAD_BUTTON_LEFT
skip_down_analog:
	fcmpu	cr1,f8,f11
	bne		cr1,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