Skip to content

Commit

Permalink
ColecoVision input support (fixes #1)
Browse files Browse the repository at this point in the history
Smaller sound buffer to reduce sound delay
  • Loading branch information
0xe1f committed Feb 24, 2015
1 parent 7cb6e18 commit 754c021
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 100 deletions.
243 changes: 144 additions & 99 deletions Src/Pi/PiInput.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,128 +29,173 @@


#include "Language.h"
#include "Properties.h"
#include "InputEvent.h"
#include <stdio.h>
#include <SDL.h>

static int kbdTable[SDLK_LAST];
static int kbdTable[3][SDLK_LAST];

static int inputTypeScanStart = 0;
static int inputTypeScanEnd = 1;

static void initKbdTable()
{
memset (kbdTable, 0, sizeof(kbdTable));

kbdTable[SDLK_0] = EC_0;
kbdTable[SDLK_1] = EC_1;
kbdTable[SDLK_2] = EC_2;
kbdTable[SDLK_3] = EC_3;
kbdTable[SDLK_4] = EC_4;
kbdTable[SDLK_5] = EC_5;
kbdTable[SDLK_6] = EC_6;
kbdTable[SDLK_7] = EC_7;
kbdTable[SDLK_8] = EC_8;
kbdTable[SDLK_9] = EC_9;
kbdTable[0][SDLK_0] = EC_0;
kbdTable[0][SDLK_1] = EC_1;
kbdTable[0][SDLK_2] = EC_2;
kbdTable[0][SDLK_3] = EC_3;
kbdTable[0][SDLK_4] = EC_4;
kbdTable[0][SDLK_5] = EC_5;
kbdTable[0][SDLK_6] = EC_6;
kbdTable[0][SDLK_7] = EC_7;
kbdTable[0][SDLK_8] = EC_8;
kbdTable[0][SDLK_9] = EC_9;

kbdTable[0][SDLK_MINUS ] = EC_NEG;
kbdTable[0][SDLK_EQUALS ] = EC_CIRCFLX;
kbdTable[0][SDLK_BACKSLASH ] = EC_BKSLASH;
kbdTable[0][SDLK_LEFTBRACKET ] = EC_AT;
kbdTable[0][SDLK_RIGHTBRACKET] = EC_LBRACK;
kbdTable[0][SDLK_SEMICOLON ] = EC_SEMICOL;
kbdTable[0][SDLK_QUOTE ] = EC_COLON;
kbdTable[0][SDLK_CARET ] = EC_RBRACK;
kbdTable[0][SDLK_COMMA ] = EC_COMMA;
kbdTable[0][SDLK_PERIOD ] = EC_PERIOD;
kbdTable[0][SDLK_SLASH ] = EC_DIV;
kbdTable[0][SDLK_RCTRL ] = EC_UNDSCRE;

kbdTable[0][SDLK_a] = EC_A;
kbdTable[0][SDLK_b] = EC_B;
kbdTable[0][SDLK_c] = EC_C;
kbdTable[0][SDLK_d] = EC_D;
kbdTable[0][SDLK_e] = EC_E;
kbdTable[0][SDLK_f] = EC_F;
kbdTable[0][SDLK_g] = EC_G;
kbdTable[0][SDLK_h] = EC_H;
kbdTable[0][SDLK_i] = EC_I;
kbdTable[0][SDLK_j] = EC_J;
kbdTable[0][SDLK_k] = EC_K;
kbdTable[0][SDLK_l] = EC_L;
kbdTable[0][SDLK_m] = EC_M;
kbdTable[0][SDLK_n] = EC_N;
kbdTable[0][SDLK_o] = EC_O;
kbdTable[0][SDLK_p] = EC_P;
kbdTable[0][SDLK_q] = EC_Q;
kbdTable[0][SDLK_r] = EC_R;
kbdTable[0][SDLK_s] = EC_S;
kbdTable[0][SDLK_t] = EC_T;
kbdTable[0][SDLK_u] = EC_U;
kbdTable[0][SDLK_v] = EC_V;
kbdTable[0][SDLK_w] = EC_W;
kbdTable[0][SDLK_x] = EC_X;
kbdTable[0][SDLK_y] = EC_Y;
kbdTable[0][SDLK_z] = EC_Z;

kbdTable[SDLK_MINUS ] = EC_NEG;
kbdTable[SDLK_EQUALS ] = EC_CIRCFLX;
kbdTable[SDLK_BACKSLASH ] = EC_BKSLASH;
kbdTable[SDLK_LEFTBRACKET ] = EC_AT;
kbdTable[SDLK_RIGHTBRACKET] = EC_LBRACK;
kbdTable[SDLK_SEMICOLON ] = EC_SEMICOL;
kbdTable[SDLK_QUOTE ] = EC_COLON;
kbdTable[SDLK_CARET ] = EC_RBRACK;
kbdTable[SDLK_COMMA ] = EC_COMMA;
kbdTable[SDLK_PERIOD ] = EC_PERIOD;
kbdTable[SDLK_SLASH ] = EC_DIV;
kbdTable[SDLK_RCTRL ] = EC_UNDSCRE;
kbdTable[0][SDLK_F1 ] = EC_F1;
kbdTable[0][SDLK_F2 ] = EC_F2;
kbdTable[0][SDLK_F3 ] = EC_F3;
kbdTable[0][SDLK_F4 ] = EC_F4;
kbdTable[0][SDLK_F5 ] = EC_F5;
kbdTable[0][SDLK_ESCAPE ] = EC_ESC;
kbdTable[0][SDLK_TAB ] = EC_TAB;
kbdTable[0][SDLK_PAGEUP ] = EC_STOP;
kbdTable[0][SDLK_BACKSPACE] = EC_BKSPACE;
kbdTable[0][SDLK_END ] = EC_SELECT;
kbdTable[0][SDLK_RETURN ] = EC_RETURN;
kbdTable[0][SDLK_SPACE ] = EC_SPACE;
kbdTable[0][SDLK_HOME ] = EC_CLS;
kbdTable[0][SDLK_INSERT ] = EC_INS;
kbdTable[0][SDLK_DELETE ] = EC_DEL;
kbdTable[0][SDLK_LEFT ] = EC_LEFT;
kbdTable[0][SDLK_UP ] = EC_UP;
kbdTable[0][SDLK_RIGHT ] = EC_RIGHT;
kbdTable[0][SDLK_DOWN ] = EC_DOWN;

kbdTable[SDLK_a] = EC_A;
kbdTable[SDLK_b] = EC_B;
kbdTable[SDLK_c] = EC_C;
kbdTable[SDLK_d] = EC_D;
kbdTable[SDLK_e] = EC_E;
kbdTable[SDLK_f] = EC_F;
kbdTable[SDLK_g] = EC_G;
kbdTable[SDLK_h] = EC_H;
kbdTable[SDLK_i] = EC_I;
kbdTable[SDLK_j] = EC_J;
kbdTable[SDLK_k] = EC_K;
kbdTable[SDLK_l] = EC_L;
kbdTable[SDLK_m] = EC_M;
kbdTable[SDLK_n] = EC_N;
kbdTable[SDLK_o] = EC_O;
kbdTable[SDLK_p] = EC_P;
kbdTable[SDLK_q] = EC_Q;
kbdTable[SDLK_r] = EC_R;
kbdTable[SDLK_s] = EC_S;
kbdTable[SDLK_t] = EC_T;
kbdTable[SDLK_u] = EC_U;
kbdTable[SDLK_v] = EC_V;
kbdTable[SDLK_w] = EC_W;
kbdTable[SDLK_x] = EC_X;
kbdTable[SDLK_y] = EC_Y;
kbdTable[SDLK_z] = EC_Z;
kbdTable[0][SDLK_KP_MULTIPLY] = EC_NUMMUL;
kbdTable[0][SDLK_KP_PLUS ] = EC_NUMADD;
kbdTable[0][SDLK_KP_DIVIDE ] = EC_NUMDIV;
kbdTable[0][SDLK_KP_MINUS ] = EC_NUMSUB;
kbdTable[0][SDLK_KP_PERIOD ] = EC_NUMPER;
kbdTable[0][SDLK_PAGEDOWN ] = EC_NUMCOM;
kbdTable[0][SDLK_KP0] = EC_NUM0;
kbdTable[0][SDLK_KP1] = EC_NUM1;
kbdTable[0][SDLK_KP2] = EC_NUM2;
kbdTable[0][SDLK_KP3] = EC_NUM3;
kbdTable[0][SDLK_KP4] = EC_NUM4;
kbdTable[0][SDLK_KP5] = EC_NUM5;
kbdTable[0][SDLK_KP6] = EC_NUM6;
kbdTable[0][SDLK_KP7] = EC_NUM7;
kbdTable[0][SDLK_KP8] = EC_NUM8;
kbdTable[0][SDLK_KP9] = EC_NUM9;

kbdTable[SDLK_F1 ] = EC_F1;
kbdTable[SDLK_F2 ] = EC_F2;
kbdTable[SDLK_F3 ] = EC_F3;
kbdTable[SDLK_F4 ] = EC_F4;
kbdTable[SDLK_F5 ] = EC_F5;
kbdTable[SDLK_ESCAPE ] = EC_ESC;
kbdTable[SDLK_TAB ] = EC_TAB;
kbdTable[SDLK_PAGEUP ] = EC_STOP;
kbdTable[SDLK_BACKSPACE] = EC_BKSPACE;
kbdTable[SDLK_END ] = EC_SELECT;
kbdTable[SDLK_RETURN ] = EC_RETURN;
kbdTable[SDLK_SPACE ] = EC_SPACE;
kbdTable[SDLK_HOME ] = EC_CLS;
kbdTable[SDLK_INSERT ] = EC_INS;
kbdTable[SDLK_DELETE ] = EC_DEL;
kbdTable[SDLK_LEFT ] = EC_LEFT;
kbdTable[SDLK_UP ] = EC_UP;
kbdTable[SDLK_RIGHT ] = EC_RIGHT;
kbdTable[SDLK_DOWN ] = EC_DOWN;
kbdTable[0][SDLK_LSUPER ] = EC_TORIKE;
kbdTable[0][SDLK_RSUPER ] = EC_JIKKOU;
kbdTable[0][SDLK_LSHIFT ] = EC_LSHIFT;
kbdTable[0][SDLK_RSHIFT ] = EC_RSHIFT;
kbdTable[0][SDLK_LCTRL ] = EC_CTRL;
kbdTable[0][SDLK_LALT ] = EC_GRAPH;
kbdTable[0][SDLK_RALT ] = EC_CODE;
kbdTable[0][SDLK_CAPSLOCK] = EC_CAPS;
kbdTable[0][SDLK_KP_ENTER] = EC_PAUSE;
kbdTable[0][SDLK_SYSREQ ] = EC_PRINT;

kbdTable[SDLK_KP_MULTIPLY] = EC_NUMMUL;
kbdTable[SDLK_KP_PLUS ] = EC_NUMADD;
kbdTable[SDLK_KP_DIVIDE ] = EC_NUMDIV;
kbdTable[SDLK_KP_MINUS ] = EC_NUMSUB;
kbdTable[SDLK_KP_PERIOD ] = EC_NUMPER;
kbdTable[SDLK_PAGEDOWN ] = EC_NUMCOM;
kbdTable[SDLK_KP0] = EC_NUM0;
kbdTable[SDLK_KP1] = EC_NUM1;
kbdTable[SDLK_KP2] = EC_NUM2;
kbdTable[SDLK_KP3] = EC_NUM3;
kbdTable[SDLK_KP4] = EC_NUM4;
kbdTable[SDLK_KP5] = EC_NUM5;
kbdTable[SDLK_KP6] = EC_NUM6;
kbdTable[SDLK_KP7] = EC_NUM7;
kbdTable[SDLK_KP8] = EC_NUM8;
kbdTable[SDLK_KP9] = EC_NUM9;
kbdTable[1][SDLK_SPACE ] = EC_JOY1_BUTTON1;
kbdTable[1][SDLK_LCTRL ] = EC_JOY1_BUTTON2;
kbdTable[1][SDLK_LEFT ] = EC_JOY1_LEFT;
kbdTable[1][SDLK_UP ] = EC_JOY1_UP;
kbdTable[1][SDLK_RIGHT ] = EC_JOY1_RIGHT;
kbdTable[1][SDLK_DOWN ] = EC_JOY1_DOWN;
kbdTable[1][SDLK_0 ] = EC_COLECO1_0;
kbdTable[1][SDLK_1 ] = EC_COLECO1_1;
kbdTable[1][SDLK_2 ] = EC_COLECO1_2;
kbdTable[1][SDLK_3 ] = EC_COLECO1_3;
kbdTable[1][SDLK_4 ] = EC_COLECO1_4;
kbdTable[1][SDLK_5 ] = EC_COLECO1_5;
kbdTable[1][SDLK_6 ] = EC_COLECO1_6;
kbdTable[1][SDLK_7 ] = EC_COLECO1_7;
kbdTable[1][SDLK_8 ] = EC_COLECO1_8;
kbdTable[1][SDLK_9 ] = EC_COLECO1_9;
kbdTable[1][SDLK_MINUS ] = EC_COLECO1_STAR;
kbdTable[1][SDLK_EQUALS ] = EC_COLECO1_HASH;

kbdTable[SDLK_LSUPER ] = EC_TORIKE;
kbdTable[SDLK_RSUPER ] = EC_JIKKOU;
kbdTable[SDLK_LSHIFT ] = EC_LSHIFT;
kbdTable[SDLK_RSHIFT ] = EC_RSHIFT;
kbdTable[SDLK_LCTRL ] = EC_CTRL;
kbdTable[SDLK_LALT ] = EC_GRAPH;
kbdTable[SDLK_RALT ] = EC_CODE;
kbdTable[SDLK_CAPSLOCK] = EC_CAPS;
kbdTable[SDLK_KP_ENTER] = EC_PAUSE;
kbdTable[SDLK_SYSREQ ] = EC_PRINT;
kbdTable[2][SDLK_KP0 ] = EC_COLECO2_0;
kbdTable[2][SDLK_KP1 ] = EC_COLECO2_1;
kbdTable[2][SDLK_KP2 ] = EC_COLECO2_2;
kbdTable[2][SDLK_KP3 ] = EC_COLECO2_3;
kbdTable[2][SDLK_KP4 ] = EC_COLECO2_4;
kbdTable[2][SDLK_KP5 ] = EC_COLECO2_5;
kbdTable[2][SDLK_KP6 ] = EC_COLECO2_6;
kbdTable[2][SDLK_KP7 ] = EC_COLECO2_7;
kbdTable[2][SDLK_KP8 ] = EC_COLECO2_8;
kbdTable[2][SDLK_KP9 ] = EC_COLECO2_9;
kbdTable[2][SDLK_KP_MULTIPLY ] = EC_COLECO2_STAR;
kbdTable[2][SDLK_KP_DIVIDE ] = EC_COLECO2_HASH;
}

void keyboardInit()
void keyboardInit(Properties *properties)
{
if (strncmp(properties->emulation.machineName, "COL", 3) == 0) {
inputTypeScanStart = 1;
inputTypeScanEnd = 2;
fprintf(stderr, "Initializing ColecoVision input\n");
}

initKbdTable();
inputEventReset();
}

void keyboardUpdate(SDL_KeyboardEvent *event)
{
if (event->type == SDL_KEYUP) {
inputEventUnset(kbdTable[event->keysym.sym]);
} else if (event->type == SDL_KEYDOWN) {
inputEventSet(kbdTable[event->keysym.sym]);
int i;
for (i = inputTypeScanStart; i <= inputTypeScanEnd; i++) {
if (event->type == SDL_KEYUP) {
inputEventUnset(kbdTable[i][event->keysym.sym]);
} else if (event->type == SDL_KEYDOWN) {
inputEventSet(kbdTable[i][event->keysym.sym]);
}
}
}

Expand Down
5 changes: 4 additions & 1 deletion Src/Pi/PiMain.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,10 @@ int main(int argc, char **argv)

dpyUpdateAckEvent = archEventCreate(0);

keyboardInit();
keyboardInit(properties);

// Larger buffers cause sound delay
properties->sound.bufSize = 40;

mixer = mixerCreate();
for (i = 0; i < MIXER_CHANNEL_TYPE_COUNT; i++) {
Expand Down

0 comments on commit 754c021

Please sign in to comment.