2021-08-14 15:10:56 +02:00
|
|
|
#include "cgdoom.h"
|
2021-09-30 11:08:38 +02:00
|
|
|
#include "cgdoom-kbd.h"
|
2021-08-14 15:10:56 +02:00
|
|
|
#include "doomdef.h"
|
|
|
|
|
2021-09-30 11:08:38 +02:00
|
|
|
/* Dynamic keymap */
|
2021-09-30 10:09:13 +02:00
|
|
|
static uint16_t Keymap[] = {
|
2021-09-30 11:08:38 +02:00
|
|
|
KEY_LEFTARROW, -1,
|
|
|
|
KEY_RIGHTARROW, -1,
|
|
|
|
KEY_UPARROW, -1,
|
|
|
|
KEY_DOWNARROW, -1,
|
|
|
|
' ', -1, /* Open doors etc */
|
|
|
|
KEY_RCTRL, -1, /* Shoot */
|
|
|
|
'1', -1,
|
|
|
|
'2', -1,
|
|
|
|
'3', -1,
|
|
|
|
'4', -1,
|
|
|
|
'5', -1,
|
|
|
|
'6', -1,
|
|
|
|
'7', -1,
|
|
|
|
KEY_TAB, -1,
|
|
|
|
KEY_PAUSE, -1,
|
|
|
|
KEY_SLEFTARROW, -1,
|
|
|
|
KEY_SRIGHTARROW, -1,
|
|
|
|
KEY_RSHIFT, -1, /* Speed toggle */
|
2021-09-30 10:09:13 +02:00
|
|
|
/* Special CGDoom keys */
|
2021-09-30 11:08:38 +02:00
|
|
|
SKEY_DECVP, -1,
|
|
|
|
SKEY_INCVP, -1,
|
|
|
|
SKEY_CHEAT, -1,
|
|
|
|
SKEY_NOCLIP, -1,
|
|
|
|
SKEY_GAMMA, -1,
|
|
|
|
SKEY_FREEMEM, -1,
|
|
|
|
SKEY_FPSCOUNTER, -1,
|
|
|
|
SKEY_FRAMESKIP, -1,
|
|
|
|
SKEY_PROFILER, -1,
|
2021-09-30 10:09:13 +02:00
|
|
|
0,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Default keymap: CGDoom 0.3 */
|
2021-09-30 11:08:38 +02:00
|
|
|
const uint16_t CGD_Keymap_CGDoom_0_3[] = {
|
2021-09-30 10:09:13 +02:00
|
|
|
KEYCODE_LEFT,
|
|
|
|
KEYCODE_RIGHT,
|
|
|
|
KEYCODE_UP,
|
|
|
|
KEYCODE_DOWN,
|
|
|
|
KEYCODE_EXE,
|
|
|
|
KEYCODE_ALPHA,
|
|
|
|
KEYCODE_F1,
|
|
|
|
KEYCODE_F2,
|
|
|
|
KEYCODE_F3,
|
|
|
|
KEYCODE_F4,
|
|
|
|
KEYCODE_F5,
|
|
|
|
KEYCODE_F6,
|
|
|
|
KEYCODE_SHIFT,
|
|
|
|
KEYCODE_EXIT,
|
|
|
|
KEYCODE_OPTN,
|
|
|
|
KEYCODE_0,
|
|
|
|
KEYCODE_DOT,
|
|
|
|
KEYCODE_MINUS,
|
|
|
|
KEYCODE_PLUS,
|
|
|
|
KEYCODE_POWER,
|
|
|
|
KEYCODE_ARROW,
|
|
|
|
KEYCODE_FRAC,
|
|
|
|
KEYCODE_FD,
|
|
|
|
KEYCODE_LEFTP,
|
|
|
|
KEYCODE_VARS,
|
|
|
|
KEYCODE_RIGHTP,
|
|
|
|
0,
|
|
|
|
};
|
|
|
|
/* Default keymap: thumbs only */
|
2021-09-30 11:08:38 +02:00
|
|
|
const uint16_t CGD_Keymap_ThumbsOnly[] = {
|
2021-09-30 10:09:13 +02:00
|
|
|
KEYCODE_LEFT,
|
|
|
|
KEYCODE_RIGHT,
|
|
|
|
KEYCODE_UP,
|
|
|
|
KEYCODE_DOWN,
|
|
|
|
KEYCODE_SQUARE,
|
|
|
|
KEYCODE_ALPHA,
|
|
|
|
KEYCODE_F1,
|
|
|
|
KEYCODE_F2,
|
|
|
|
KEYCODE_F3,
|
|
|
|
KEYCODE_F4,
|
|
|
|
KEYCODE_F5,
|
|
|
|
KEYCODE_F6,
|
|
|
|
KEYCODE_SHIFT,
|
|
|
|
KEYCODE_EXIT,
|
|
|
|
KEYCODE_OPTN,
|
|
|
|
KEYCODE_LOG,
|
|
|
|
KEYCODE_LN,
|
|
|
|
KEYCODE_XOT,
|
|
|
|
KEYCODE_MINUS,
|
|
|
|
KEYCODE_PLUS,
|
|
|
|
KEYCODE_COMMA,
|
|
|
|
KEYCODE_ARROW,
|
|
|
|
KEYCODE_FRAC,
|
|
|
|
KEYCODE_FD,
|
|
|
|
KEYCODE_LEFTP,
|
|
|
|
KEYCODE_VARS,
|
|
|
|
KEYCODE_RIGHTP,
|
|
|
|
0,
|
|
|
|
};
|
|
|
|
/* Default keymap: full-hands */
|
2021-09-30 11:08:38 +02:00
|
|
|
const uint16_t CGD_Keymap_FullHands[] = {
|
2021-09-30 10:09:13 +02:00
|
|
|
KEYCODE_F5,
|
|
|
|
KEYCODE_F6,
|
|
|
|
KEYCODE_OPTN,
|
|
|
|
KEYCODE_SQUARE,
|
|
|
|
KEYCODE_MUL,
|
|
|
|
KEYCODE_DEL,
|
|
|
|
KEYCODE_1,
|
|
|
|
KEYCODE_2,
|
|
|
|
KEYCODE_3,
|
|
|
|
KEYCODE_4,
|
|
|
|
KEYCODE_5,
|
|
|
|
KEYCODE_6,
|
|
|
|
KEYCODE_7,
|
|
|
|
KEYCODE_TAN,
|
|
|
|
KEYCODE_ACON,
|
|
|
|
KEYCODE_ALPHA,
|
|
|
|
KEYCODE_POWER,
|
|
|
|
KEYCODE_COS,
|
|
|
|
KEYCODE_MINUS,
|
|
|
|
KEYCODE_PLUS,
|
|
|
|
KEYCODE_COMMA,
|
|
|
|
KEYCODE_ARROW,
|
|
|
|
KEYCODE_FRAC,
|
|
|
|
KEYCODE_FD,
|
|
|
|
KEYCODE_LEFTP,
|
|
|
|
KEYCODE_SIN,
|
|
|
|
KEYCODE_RIGHTP,
|
|
|
|
0,
|
|
|
|
};
|
|
|
|
|
2021-08-14 15:10:56 +02:00
|
|
|
/* Current keyboard state. */
|
2021-09-30 11:08:38 +02:00
|
|
|
static CGD_KeyboardState st_prev={0}, st_now={0};
|
2021-08-14 15:10:56 +02:00
|
|
|
|
2021-09-30 11:08:38 +02:00
|
|
|
#ifndef CG_EMULATOR
|
|
|
|
void CGD_ScanKeyboard(CGD_KeyboardState state)
|
2021-08-14 15:10:56 +02:00
|
|
|
{
|
|
|
|
volatile uint16_t *KEYSC = (void *)0xa44b0000;
|
|
|
|
uint16_t *array = (void *)state;
|
|
|
|
for(int i = 0; i < 6; i++) array[i] = KEYSC[i];
|
|
|
|
}
|
2021-09-30 11:08:38 +02:00
|
|
|
#endif
|
2021-08-14 15:10:56 +02:00
|
|
|
|
2021-09-30 11:08:38 +02:00
|
|
|
void CGD_LoadKeymap(const uint16_t *template)
|
2021-09-30 10:09:13 +02:00
|
|
|
{
|
2021-09-30 11:08:38 +02:00
|
|
|
for(int i = 0; Keymap[2*i] != 0; i++) {
|
|
|
|
Keymap[2*i+1] = template[i];
|
2021-09-30 10:09:13 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static int DecodeKeymap(uint16_t *map, int key)
|
|
|
|
{
|
|
|
|
for(int i = 0; map[2*i] != 0; i++) {
|
|
|
|
if(map[2*i] == key)
|
|
|
|
return map[2*i+1];
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2021-08-14 15:10:56 +02:00
|
|
|
static int DoomKeyToKeycode(int key)
|
|
|
|
{
|
2021-09-30 10:09:13 +02:00
|
|
|
int code = DecodeKeymap(Keymap, key);
|
|
|
|
if(code != -1)
|
|
|
|
return code;
|
|
|
|
|
2021-08-14 15:10:56 +02:00
|
|
|
switch(key)
|
|
|
|
{
|
2021-09-30 10:09:13 +02:00
|
|
|
/* Interface constants */
|
2021-08-14 15:10:56 +02:00
|
|
|
case KEY_ESCAPE: return KEYCODE_MENU;
|
|
|
|
case KEY_ENTER: return KEYCODE_EXE;
|
|
|
|
|
2021-09-18 19:03:21 +02:00
|
|
|
/* Alphabetic keys */
|
|
|
|
case 'A': return KEYCODE_XOT;
|
|
|
|
case 'B': return KEYCODE_LOG;
|
|
|
|
case 'C': return KEYCODE_LN;
|
|
|
|
case 'D': return KEYCODE_SIN;
|
|
|
|
case 'E': return KEYCODE_COS;
|
|
|
|
case 'F': return KEYCODE_TAN;
|
|
|
|
case 'G': return KEYCODE_FRAC;
|
|
|
|
case 'H': return KEYCODE_FD;
|
|
|
|
case 'I': return KEYCODE_LEFTP;
|
|
|
|
case 'J': return KEYCODE_RIGHTP;
|
|
|
|
case 'K': return KEYCODE_COMMA;
|
|
|
|
case 'L': return KEYCODE_ARROW;
|
|
|
|
case 'M': return KEYCODE_7;
|
|
|
|
case 'N': return KEYCODE_8;
|
|
|
|
case 'O': return KEYCODE_9;
|
|
|
|
case 'P': return KEYCODE_4;
|
|
|
|
case 'Q': return KEYCODE_5;
|
|
|
|
case 'R': return KEYCODE_6;
|
|
|
|
case 'S': return KEYCODE_MUL;
|
|
|
|
case 'T': return KEYCODE_DIV;
|
|
|
|
case 'U': return KEYCODE_1;
|
|
|
|
case 'V': return KEYCODE_2;
|
|
|
|
case 'W': return KEYCODE_3;
|
|
|
|
case 'X': return KEYCODE_PLUS;
|
|
|
|
case 'Y': return KEYCODE_MINUS;
|
|
|
|
case 'Z': return KEYCODE_0;
|
2021-09-19 16:17:14 +02:00
|
|
|
case -' ': return KEYCODE_DOT;
|
2021-09-18 19:03:21 +02:00
|
|
|
case KEY_BACKSPACE: return KEYCODE_DEL;
|
|
|
|
|
2021-09-19 16:17:14 +02:00
|
|
|
/* Numeric keys (handled differently, require a modifier) */
|
|
|
|
case -'0': return KEYCODE_0;
|
|
|
|
case -'1': return KEYCODE_1;
|
|
|
|
case -'2': return KEYCODE_2;
|
|
|
|
case -'3': return KEYCODE_3;
|
|
|
|
case -'4': return KEYCODE_4;
|
|
|
|
case -'5': return KEYCODE_5;
|
|
|
|
case -'6': return KEYCODE_6;
|
|
|
|
case -'7': return KEYCODE_7;
|
|
|
|
case -'8': return KEYCODE_8;
|
|
|
|
case -'9': return KEYCODE_9;
|
|
|
|
|
2021-08-14 15:10:56 +02:00
|
|
|
default: return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-30 11:08:38 +02:00
|
|
|
static int KeycodeDown(CGD_KeyboardState state, int code)
|
2021-08-14 15:10:56 +02:00
|
|
|
{
|
|
|
|
if(code < 0) return 0;
|
|
|
|
int row = (code >> 4) ^ 1;
|
|
|
|
int col = 0x80 >> (code & 0x7);
|
|
|
|
return (state[row] & col) != 0;
|
|
|
|
}
|
|
|
|
|
2021-09-30 11:08:38 +02:00
|
|
|
static int KeyDown(CGD_KeyboardState state, int key)
|
2021-09-19 16:17:14 +02:00
|
|
|
{
|
|
|
|
int code = DoomKeyToKeycode(key);
|
|
|
|
|
2021-09-19 21:09:24 +02:00
|
|
|
/* For alphanumeric keys, watch the status of ALPHA */
|
2021-09-19 16:17:14 +02:00
|
|
|
if(key >= -'9' && key <= -'0')
|
|
|
|
return KeycodeDown(state, code) && KeycodeDown(state, KEYCODE_ALPHA);
|
2021-09-19 21:09:24 +02:00
|
|
|
else if((key >= 'A' && key <= 'Z') || key == -' ')
|
2021-09-19 16:17:14 +02:00
|
|
|
return KeycodeDown(state, code) && !KeycodeDown(state, KEYCODE_ALPHA);
|
2021-09-19 21:09:24 +02:00
|
|
|
else
|
|
|
|
return KeycodeDown(state, code);
|
2021-09-19 16:17:14 +02:00
|
|
|
}
|
|
|
|
|
2021-08-14 15:10:56 +02:00
|
|
|
void UpdateKeyboardState(void)
|
|
|
|
{
|
|
|
|
memcpy(st_prev, st_now, sizeof st_now);
|
2021-09-30 11:08:38 +02:00
|
|
|
CGD_ScanKeyboard(st_now);
|
2021-08-14 15:10:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int KeyWasJustPressed(int key)
|
|
|
|
{
|
|
|
|
return !KeyDown(st_prev, key) && KeyDown(st_now, key);
|
|
|
|
}
|
|
|
|
|
|
|
|
int KeyWasJustReleased(int key)
|
|
|
|
{
|
|
|
|
return KeyDown(st_prev, key) && !KeyDown(st_now, key);
|
|
|
|
}
|