1 #include "burnint.h"
2 #include "joyprocess.h"
3
4 // Digital Processing
ProcessJoystick(UINT8 * input,INT8 playernum,INT8 up_bit,INT8 down_bit,INT8 left_bit,INT8 right_bit,UINT8 flags)5 void ProcessJoystick(UINT8 *input, INT8 playernum, INT8 up_bit, INT8 down_bit, INT8 left_bit, INT8 right_bit, UINT8 flags)
6 { // limitations: 4 players max., processes 8-bit inputs only!
7 static INT32 fourway[4] = { 0, 0, 0, 0 }; // 4-way buffer
8 static UINT8 DrvInputPrev[4] = { 0, 0, 0, 0 }; // 4-way buffer
9
10 if (flags & INPUT_ISACTIVELOW) {
11 *input ^= 0xff;
12 }
13
14 UINT8 ud = (1 << up_bit) | (1 << down_bit);
15 UINT8 rl = (1 << right_bit) | (1 << left_bit);
16
17 UINT8 udrlmask = ud | rl; // bitmask to process
18 UINT8 othermask = udrlmask ^ 0xff; // bitmask to preserve (invert of udrlmask)
19
20 if (flags & INPUT_4WAY) {
21 playernum &= 3; // just incase.
22 if(*input != DrvInputPrev[playernum]) {
23 fourway[playernum] = *input & udrlmask;
24
25 if((fourway[playernum] & rl) && (fourway[playernum] & ud))
26 fourway[playernum] ^= (fourway[playernum] & (DrvInputPrev[playernum] & udrlmask));
27
28 if((fourway[playernum] & rl) && (fourway[playernum] & ud))
29 fourway[playernum] &= ud | ud; // diagonals aren't allowed w/INPUT_4WAY
30 }
31
32 DrvInputPrev[playernum] = *input;
33
34 *input = fourway[playernum] | (DrvInputPrev[playernum] & othermask); // add back the unprocessed/other bits
35 }
36
37 if (flags & INPUT_CLEAROPPOSITES) {
38 if ((*input & rl) == rl) {
39 *input &= ~rl;
40 }
41 if ((*input & ud) == ud) {
42 *input &= ~ud;
43 }
44 }
45
46 if (flags & INPUT_MAKEACTIVELOW || flags & INPUT_ISACTIVELOW) {
47 *input ^= 0xff;
48 }
49 }
50
CompileInput(UINT8 ** input,void * output,INT32 num,INT32 bits,UINT32 * init)51 void CompileInput(UINT8 **input, void *output, INT32 num, INT32 bits, UINT32 *init)
52 {
53 for (INT32 j = 0; j < num; j++) {
54 if (bits > 16) ((UINT32*)output)[j] = init[j];
55 if (bits > 8 && bits < 17) ((UINT16*)output)[j] = init[j];
56 if (bits < 9) ((UINT8*)output)[j] = init[j];
57
58 for (INT32 i = 0; i < bits; i++) {
59 if (bits > 16) ((UINT32*)output)[j] ^= (input[j][i] & 1) << i;
60 if (bits > 8 && bits < 17) ((UINT16*)output)[j] ^= (input[j][i] & 1) << i;
61 if (bits < 9) ((UINT8*)output)[j] ^= (input[j][i] & 1) << i;
62 }
63 }
64 }
65
66 // Analog Processing
AnalogDeadZone(INT16 anaval)67 INT16 AnalogDeadZone(INT16 anaval)
68 {
69 INT32 negative = (anaval < 0);
70
71 anaval = abs(anaval);
72
73 // < 160 is usually "noise" with modern gamepad thumbsticks
74 // (mouse movements are usually above 200)
75 if (anaval < 160) {
76 anaval = 0;
77 } else {
78 anaval -= 160;
79 }
80
81 return (negative) ? -anaval : anaval;
82 }
83
scalerange(UINT32 x,UINT32 in_min,UINT32 in_max,UINT32 out_min,UINT32 out_max)84 static UINT32 scalerange(UINT32 x, UINT32 in_min, UINT32 in_max, UINT32 out_min, UINT32 out_max) {
85 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
86 }
87
ProcessAnalog(INT16 anaval,INT32 reversed,INT32 flags,UINT8 scalemin,UINT8 scalemax)88 UINT8 ProcessAnalog(INT16 anaval, INT32 reversed, INT32 flags, UINT8 scalemin, UINT8 scalemax)
89 {
90 UINT8 linear_min = 0, linear_max = 0;
91
92 if (flags & INPUT_MIGHTBEDIGITAL && (UINT16)anaval == 0xffff) {
93 anaval = 0x3fc; // digital button mapped here & pressed.
94 }
95
96 if (flags & INPUT_LINEAR) {
97 anaval = abs(anaval);
98 linear_min = scalemin;
99 linear_max = scalemax;
100 scalemin = 0x00;
101 scalemax = 0xff;
102 }
103
104 INT32 DeadZone = (flags & INPUT_DEADZONE) ? 10 : 0;
105 INT16 Temp = (reversed) ? (0x7f - (anaval / 16)) : (0x7f + (anaval / 16)); // - for reversed, + for normal
106
107 if (flags & INPUT_DEADZONE) { // deadzones
108 if (flags & INPUT_LINEAR) {
109 if (Temp < DeadZone) Temp = 0;
110 } else {
111 // 0x7f is center, 0x3f right, 0xbe left. 0x7f +-10 is noise.
112 if (!(Temp < 0x7f-DeadZone || Temp > 0x7f+DeadZone)) {
113 Temp = 0x7f; // we hit a dead-zone, return mid-range
114 } else {
115 // so we don't jump between 0x7f (center) and next value after deadzone
116 if (Temp < 0x7f-DeadZone) Temp += DeadZone;
117 else if (Temp > 0x7f+DeadZone) Temp -= DeadZone;
118 }
119 }
120 }
121
122 if (Temp < 0x3f + DeadZone) Temp = 0x3f + DeadZone; // clamping for happy scalerange()
123 if (Temp > 0xbe - DeadZone) Temp = 0xbe - DeadZone;
124 Temp = scalerange(Temp, 0x3f + DeadZone, 0xbe - DeadZone, scalemin, scalemax);
125
126 if (flags & INPUT_LINEAR) {
127 Temp -= 0x80;
128 Temp = scalerange(Temp, 0, 0x7f, linear_min, linear_max);
129 }
130
131 return Temp;
132 }
133