summaryrefslogtreecommitdiff
path: root/src/classic_controller.S
blob: 2ba7a9e1b3a52b75c4117172360fb9fb91648b0a (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#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,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	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