-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcontroller.c
91 lines (81 loc) · 2.07 KB
/
controller.c
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
#include "sega-adapter.h"
controller_t read_controller() {
static controller_t controller;
int8_t three_button = controller.THREE_BUTTON;
int8_t six_button_next = 0;
controller.A = controller.X = controller.Y = controller.Z = 1;
controller.MODE = controller.START = 1;
controller.THREE_BUTTON = 0;
for (int8_t state = 0; state < 8; state++) {
switch (state) {
case 0:
controller.UP = RB0;
controller.DOWN = RB1;
controller.LEFT = RB2;
controller.RIGHT = RB3;
controller.B = RB7;
controller.C = RB5;
break;
case 1:
if (!RB2 && !RB3) {
controller.TWO_BUTTON = 1;
controller.THREE_BUTTON = 1;
controller.A = RB7;
controller.START = RB5;
}
break;
case 5:
if (!RB0 && !RB1 && !RB2 && !RB3) {
six_button_next = 1;
}
break;
case 6:
if (six_button_next) {
six_button_next = 0;
controller.Z = RB0;
controller.Y = RB1;
controller.X = RB2;
controller.MODE = RB3;
}
break;
}
LATB6 = (state % 2) == 1;
}
if (three_button && !controller.THREE_BUTTON) {
controller.TWO_BUTTON = 0;
}
if (!controller.C) {
controller.TWO_BUTTON = 1;
}
if (!controller.START) {
if (!controller.MODE && !(controller.Z && controller.X && controller.C)) {
controller.SNACK_TIME = controller.Z; // inverted
controller.SNACK_RETRO = controller.X; // inverted
controller.MODE = controller.START =
controller.Z = controller.X = controller.C = 1;
controller.START_COUNTER = 0;
}
if (!controller.SNACK_TIME) {
if (controller.START_COUNTER < 200) {
++controller.START_COUNTER;
} else if (controller.START_COUNTER == 200) {
controller.A_IS_UP = !controller.A_IS_UP;
++controller.START_COUNTER;
} else {
controller.START = 1;
}
}
} else {
controller.START_COUNTER = 0;
}
if (++controller.X_COUNTER > af_max || controller.X) {
controller.X_COUNTER = 0;
}
if (++controller.Y_COUNTER > af_max || controller.Y) {
controller.Y_COUNTER = 0;
}
if (++controller.Z_COUNTER > af_max || controller.Z) {
controller.Z_COUNTER = 0;
}
return controller;
}