Skip to content

Commit 754c021

Browse files
committedFeb 24, 2015
ColecoVision input support (fixes #1)
Smaller sound buffer to reduce sound delay
1 parent 7cb6e18 commit 754c021

File tree

2 files changed

+148
-100
lines changed

2 files changed

+148
-100
lines changed
 

‎Src/Pi/PiInput.c

+144-99
Original file line numberDiff line numberDiff line change
@@ -29,128 +29,173 @@
2929

3030

3131
#include "Language.h"
32+
#include "Properties.h"
3233
#include "InputEvent.h"
3334
#include <stdio.h>
3435
#include <SDL.h>
3536

36-
static int kbdTable[SDLK_LAST];
37+
static int kbdTable[3][SDLK_LAST];
38+
39+
static int inputTypeScanStart = 0;
40+
static int inputTypeScanEnd = 1;
3741

3842
static void initKbdTable()
3943
{
4044
memset (kbdTable, 0, sizeof(kbdTable));
4145

42-
kbdTable[SDLK_0] = EC_0;
43-
kbdTable[SDLK_1] = EC_1;
44-
kbdTable[SDLK_2] = EC_2;
45-
kbdTable[SDLK_3] = EC_3;
46-
kbdTable[SDLK_4] = EC_4;
47-
kbdTable[SDLK_5] = EC_5;
48-
kbdTable[SDLK_6] = EC_6;
49-
kbdTable[SDLK_7] = EC_7;
50-
kbdTable[SDLK_8] = EC_8;
51-
kbdTable[SDLK_9] = EC_9;
46+
kbdTable[0][SDLK_0] = EC_0;
47+
kbdTable[0][SDLK_1] = EC_1;
48+
kbdTable[0][SDLK_2] = EC_2;
49+
kbdTable[0][SDLK_3] = EC_3;
50+
kbdTable[0][SDLK_4] = EC_4;
51+
kbdTable[0][SDLK_5] = EC_5;
52+
kbdTable[0][SDLK_6] = EC_6;
53+
kbdTable[0][SDLK_7] = EC_7;
54+
kbdTable[0][SDLK_8] = EC_8;
55+
kbdTable[0][SDLK_9] = EC_9;
56+
57+
kbdTable[0][SDLK_MINUS ] = EC_NEG;
58+
kbdTable[0][SDLK_EQUALS ] = EC_CIRCFLX;
59+
kbdTable[0][SDLK_BACKSLASH ] = EC_BKSLASH;
60+
kbdTable[0][SDLK_LEFTBRACKET ] = EC_AT;
61+
kbdTable[0][SDLK_RIGHTBRACKET] = EC_LBRACK;
62+
kbdTable[0][SDLK_SEMICOLON ] = EC_SEMICOL;
63+
kbdTable[0][SDLK_QUOTE ] = EC_COLON;
64+
kbdTable[0][SDLK_CARET ] = EC_RBRACK;
65+
kbdTable[0][SDLK_COMMA ] = EC_COMMA;
66+
kbdTable[0][SDLK_PERIOD ] = EC_PERIOD;
67+
kbdTable[0][SDLK_SLASH ] = EC_DIV;
68+
kbdTable[0][SDLK_RCTRL ] = EC_UNDSCRE;
69+
70+
kbdTable[0][SDLK_a] = EC_A;
71+
kbdTable[0][SDLK_b] = EC_B;
72+
kbdTable[0][SDLK_c] = EC_C;
73+
kbdTable[0][SDLK_d] = EC_D;
74+
kbdTable[0][SDLK_e] = EC_E;
75+
kbdTable[0][SDLK_f] = EC_F;
76+
kbdTable[0][SDLK_g] = EC_G;
77+
kbdTable[0][SDLK_h] = EC_H;
78+
kbdTable[0][SDLK_i] = EC_I;
79+
kbdTable[0][SDLK_j] = EC_J;
80+
kbdTable[0][SDLK_k] = EC_K;
81+
kbdTable[0][SDLK_l] = EC_L;
82+
kbdTable[0][SDLK_m] = EC_M;
83+
kbdTable[0][SDLK_n] = EC_N;
84+
kbdTable[0][SDLK_o] = EC_O;
85+
kbdTable[0][SDLK_p] = EC_P;
86+
kbdTable[0][SDLK_q] = EC_Q;
87+
kbdTable[0][SDLK_r] = EC_R;
88+
kbdTable[0][SDLK_s] = EC_S;
89+
kbdTable[0][SDLK_t] = EC_T;
90+
kbdTable[0][SDLK_u] = EC_U;
91+
kbdTable[0][SDLK_v] = EC_V;
92+
kbdTable[0][SDLK_w] = EC_W;
93+
kbdTable[0][SDLK_x] = EC_X;
94+
kbdTable[0][SDLK_y] = EC_Y;
95+
kbdTable[0][SDLK_z] = EC_Z;
5296

53-
kbdTable[SDLK_MINUS ] = EC_NEG;
54-
kbdTable[SDLK_EQUALS ] = EC_CIRCFLX;
55-
kbdTable[SDLK_BACKSLASH ] = EC_BKSLASH;
56-
kbdTable[SDLK_LEFTBRACKET ] = EC_AT;
57-
kbdTable[SDLK_RIGHTBRACKET] = EC_LBRACK;
58-
kbdTable[SDLK_SEMICOLON ] = EC_SEMICOL;
59-
kbdTable[SDLK_QUOTE ] = EC_COLON;
60-
kbdTable[SDLK_CARET ] = EC_RBRACK;
61-
kbdTable[SDLK_COMMA ] = EC_COMMA;
62-
kbdTable[SDLK_PERIOD ] = EC_PERIOD;
63-
kbdTable[SDLK_SLASH ] = EC_DIV;
64-
kbdTable[SDLK_RCTRL ] = EC_UNDSCRE;
97+
kbdTable[0][SDLK_F1 ] = EC_F1;
98+
kbdTable[0][SDLK_F2 ] = EC_F2;
99+
kbdTable[0][SDLK_F3 ] = EC_F3;
100+
kbdTable[0][SDLK_F4 ] = EC_F4;
101+
kbdTable[0][SDLK_F5 ] = EC_F5;
102+
kbdTable[0][SDLK_ESCAPE ] = EC_ESC;
103+
kbdTable[0][SDLK_TAB ] = EC_TAB;
104+
kbdTable[0][SDLK_PAGEUP ] = EC_STOP;
105+
kbdTable[0][SDLK_BACKSPACE] = EC_BKSPACE;
106+
kbdTable[0][SDLK_END ] = EC_SELECT;
107+
kbdTable[0][SDLK_RETURN ] = EC_RETURN;
108+
kbdTable[0][SDLK_SPACE ] = EC_SPACE;
109+
kbdTable[0][SDLK_HOME ] = EC_CLS;
110+
kbdTable[0][SDLK_INSERT ] = EC_INS;
111+
kbdTable[0][SDLK_DELETE ] = EC_DEL;
112+
kbdTable[0][SDLK_LEFT ] = EC_LEFT;
113+
kbdTable[0][SDLK_UP ] = EC_UP;
114+
kbdTable[0][SDLK_RIGHT ] = EC_RIGHT;
115+
kbdTable[0][SDLK_DOWN ] = EC_DOWN;
65116

66-
kbdTable[SDLK_a] = EC_A;
67-
kbdTable[SDLK_b] = EC_B;
68-
kbdTable[SDLK_c] = EC_C;
69-
kbdTable[SDLK_d] = EC_D;
70-
kbdTable[SDLK_e] = EC_E;
71-
kbdTable[SDLK_f] = EC_F;
72-
kbdTable[SDLK_g] = EC_G;
73-
kbdTable[SDLK_h] = EC_H;
74-
kbdTable[SDLK_i] = EC_I;
75-
kbdTable[SDLK_j] = EC_J;
76-
kbdTable[SDLK_k] = EC_K;
77-
kbdTable[SDLK_l] = EC_L;
78-
kbdTable[SDLK_m] = EC_M;
79-
kbdTable[SDLK_n] = EC_N;
80-
kbdTable[SDLK_o] = EC_O;
81-
kbdTable[SDLK_p] = EC_P;
82-
kbdTable[SDLK_q] = EC_Q;
83-
kbdTable[SDLK_r] = EC_R;
84-
kbdTable[SDLK_s] = EC_S;
85-
kbdTable[SDLK_t] = EC_T;
86-
kbdTable[SDLK_u] = EC_U;
87-
kbdTable[SDLK_v] = EC_V;
88-
kbdTable[SDLK_w] = EC_W;
89-
kbdTable[SDLK_x] = EC_X;
90-
kbdTable[SDLK_y] = EC_Y;
91-
kbdTable[SDLK_z] = EC_Z;
117+
kbdTable[0][SDLK_KP_MULTIPLY] = EC_NUMMUL;
118+
kbdTable[0][SDLK_KP_PLUS ] = EC_NUMADD;
119+
kbdTable[0][SDLK_KP_DIVIDE ] = EC_NUMDIV;
120+
kbdTable[0][SDLK_KP_MINUS ] = EC_NUMSUB;
121+
kbdTable[0][SDLK_KP_PERIOD ] = EC_NUMPER;
122+
kbdTable[0][SDLK_PAGEDOWN ] = EC_NUMCOM;
123+
kbdTable[0][SDLK_KP0] = EC_NUM0;
124+
kbdTable[0][SDLK_KP1] = EC_NUM1;
125+
kbdTable[0][SDLK_KP2] = EC_NUM2;
126+
kbdTable[0][SDLK_KP3] = EC_NUM3;
127+
kbdTable[0][SDLK_KP4] = EC_NUM4;
128+
kbdTable[0][SDLK_KP5] = EC_NUM5;
129+
kbdTable[0][SDLK_KP6] = EC_NUM6;
130+
kbdTable[0][SDLK_KP7] = EC_NUM7;
131+
kbdTable[0][SDLK_KP8] = EC_NUM8;
132+
kbdTable[0][SDLK_KP9] = EC_NUM9;
92133

93-
kbdTable[SDLK_F1 ] = EC_F1;
94-
kbdTable[SDLK_F2 ] = EC_F2;
95-
kbdTable[SDLK_F3 ] = EC_F3;
96-
kbdTable[SDLK_F4 ] = EC_F4;
97-
kbdTable[SDLK_F5 ] = EC_F5;
98-
kbdTable[SDLK_ESCAPE ] = EC_ESC;
99-
kbdTable[SDLK_TAB ] = EC_TAB;
100-
kbdTable[SDLK_PAGEUP ] = EC_STOP;
101-
kbdTable[SDLK_BACKSPACE] = EC_BKSPACE;
102-
kbdTable[SDLK_END ] = EC_SELECT;
103-
kbdTable[SDLK_RETURN ] = EC_RETURN;
104-
kbdTable[SDLK_SPACE ] = EC_SPACE;
105-
kbdTable[SDLK_HOME ] = EC_CLS;
106-
kbdTable[SDLK_INSERT ] = EC_INS;
107-
kbdTable[SDLK_DELETE ] = EC_DEL;
108-
kbdTable[SDLK_LEFT ] = EC_LEFT;
109-
kbdTable[SDLK_UP ] = EC_UP;
110-
kbdTable[SDLK_RIGHT ] = EC_RIGHT;
111-
kbdTable[SDLK_DOWN ] = EC_DOWN;
134+
kbdTable[0][SDLK_LSUPER ] = EC_TORIKE;
135+
kbdTable[0][SDLK_RSUPER ] = EC_JIKKOU;
136+
kbdTable[0][SDLK_LSHIFT ] = EC_LSHIFT;
137+
kbdTable[0][SDLK_RSHIFT ] = EC_RSHIFT;
138+
kbdTable[0][SDLK_LCTRL ] = EC_CTRL;
139+
kbdTable[0][SDLK_LALT ] = EC_GRAPH;
140+
kbdTable[0][SDLK_RALT ] = EC_CODE;
141+
kbdTable[0][SDLK_CAPSLOCK] = EC_CAPS;
142+
kbdTable[0][SDLK_KP_ENTER] = EC_PAUSE;
143+
kbdTable[0][SDLK_SYSREQ ] = EC_PRINT;
112144

113-
kbdTable[SDLK_KP_MULTIPLY] = EC_NUMMUL;
114-
kbdTable[SDLK_KP_PLUS ] = EC_NUMADD;
115-
kbdTable[SDLK_KP_DIVIDE ] = EC_NUMDIV;
116-
kbdTable[SDLK_KP_MINUS ] = EC_NUMSUB;
117-
kbdTable[SDLK_KP_PERIOD ] = EC_NUMPER;
118-
kbdTable[SDLK_PAGEDOWN ] = EC_NUMCOM;
119-
kbdTable[SDLK_KP0] = EC_NUM0;
120-
kbdTable[SDLK_KP1] = EC_NUM1;
121-
kbdTable[SDLK_KP2] = EC_NUM2;
122-
kbdTable[SDLK_KP3] = EC_NUM3;
123-
kbdTable[SDLK_KP4] = EC_NUM4;
124-
kbdTable[SDLK_KP5] = EC_NUM5;
125-
kbdTable[SDLK_KP6] = EC_NUM6;
126-
kbdTable[SDLK_KP7] = EC_NUM7;
127-
kbdTable[SDLK_KP8] = EC_NUM8;
128-
kbdTable[SDLK_KP9] = EC_NUM9;
145+
kbdTable[1][SDLK_SPACE ] = EC_JOY1_BUTTON1;
146+
kbdTable[1][SDLK_LCTRL ] = EC_JOY1_BUTTON2;
147+
kbdTable[1][SDLK_LEFT ] = EC_JOY1_LEFT;
148+
kbdTable[1][SDLK_UP ] = EC_JOY1_UP;
149+
kbdTable[1][SDLK_RIGHT ] = EC_JOY1_RIGHT;
150+
kbdTable[1][SDLK_DOWN ] = EC_JOY1_DOWN;
151+
kbdTable[1][SDLK_0 ] = EC_COLECO1_0;
152+
kbdTable[1][SDLK_1 ] = EC_COLECO1_1;
153+
kbdTable[1][SDLK_2 ] = EC_COLECO1_2;
154+
kbdTable[1][SDLK_3 ] = EC_COLECO1_3;
155+
kbdTable[1][SDLK_4 ] = EC_COLECO1_4;
156+
kbdTable[1][SDLK_5 ] = EC_COLECO1_5;
157+
kbdTable[1][SDLK_6 ] = EC_COLECO1_6;
158+
kbdTable[1][SDLK_7 ] = EC_COLECO1_7;
159+
kbdTable[1][SDLK_8 ] = EC_COLECO1_8;
160+
kbdTable[1][SDLK_9 ] = EC_COLECO1_9;
161+
kbdTable[1][SDLK_MINUS ] = EC_COLECO1_STAR;
162+
kbdTable[1][SDLK_EQUALS ] = EC_COLECO1_HASH;
129163

130-
kbdTable[SDLK_LSUPER ] = EC_TORIKE;
131-
kbdTable[SDLK_RSUPER ] = EC_JIKKOU;
132-
kbdTable[SDLK_LSHIFT ] = EC_LSHIFT;
133-
kbdTable[SDLK_RSHIFT ] = EC_RSHIFT;
134-
kbdTable[SDLK_LCTRL ] = EC_CTRL;
135-
kbdTable[SDLK_LALT ] = EC_GRAPH;
136-
kbdTable[SDLK_RALT ] = EC_CODE;
137-
kbdTable[SDLK_CAPSLOCK] = EC_CAPS;
138-
kbdTable[SDLK_KP_ENTER] = EC_PAUSE;
139-
kbdTable[SDLK_SYSREQ ] = EC_PRINT;
164+
kbdTable[2][SDLK_KP0 ] = EC_COLECO2_0;
165+
kbdTable[2][SDLK_KP1 ] = EC_COLECO2_1;
166+
kbdTable[2][SDLK_KP2 ] = EC_COLECO2_2;
167+
kbdTable[2][SDLK_KP3 ] = EC_COLECO2_3;
168+
kbdTable[2][SDLK_KP4 ] = EC_COLECO2_4;
169+
kbdTable[2][SDLK_KP5 ] = EC_COLECO2_5;
170+
kbdTable[2][SDLK_KP6 ] = EC_COLECO2_6;
171+
kbdTable[2][SDLK_KP7 ] = EC_COLECO2_7;
172+
kbdTable[2][SDLK_KP8 ] = EC_COLECO2_8;
173+
kbdTable[2][SDLK_KP9 ] = EC_COLECO2_9;
174+
kbdTable[2][SDLK_KP_MULTIPLY ] = EC_COLECO2_STAR;
175+
kbdTable[2][SDLK_KP_DIVIDE ] = EC_COLECO2_HASH;
140176
}
141177

142-
void keyboardInit()
178+
void keyboardInit(Properties *properties)
143179
{
180+
if (strncmp(properties->emulation.machineName, "COL", 3) == 0) {
181+
inputTypeScanStart = 1;
182+
inputTypeScanEnd = 2;
183+
fprintf(stderr, "Initializing ColecoVision input\n");
184+
}
185+
144186
initKbdTable();
145187
inputEventReset();
146188
}
147189

148190
void keyboardUpdate(SDL_KeyboardEvent *event)
149191
{
150-
if (event->type == SDL_KEYUP) {
151-
inputEventUnset(kbdTable[event->keysym.sym]);
152-
} else if (event->type == SDL_KEYDOWN) {
153-
inputEventSet(kbdTable[event->keysym.sym]);
192+
int i;
193+
for (i = inputTypeScanStart; i <= inputTypeScanEnd; i++) {
194+
if (event->type == SDL_KEYUP) {
195+
inputEventUnset(kbdTable[i][event->keysym.sym]);
196+
} else if (event->type == SDL_KEYDOWN) {
197+
inputEventSet(kbdTable[i][event->keysym.sym]);
198+
}
154199
}
155200
}
156201

‎Src/Pi/PiMain.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,10 @@ int main(int argc, char **argv)
287287

288288
dpyUpdateAckEvent = archEventCreate(0);
289289

290-
keyboardInit();
290+
keyboardInit(properties);
291+
292+
// Larger buffers cause sound delay
293+
properties->sound.bufSize = 40;
291294

292295
mixer = mixerCreate();
293296
for (i = 0; i < MIXER_CHANNEL_TYPE_COUNT; i++) {

0 commit comments

Comments
 (0)
Please sign in to comment.