1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-04-28 04:46:38 +00:00

KA10: Use keyboard input events for Stanford keyboard.

This commit is contained in:
Lars Brinkhoff
2018-12-16 20:17:18 +01:00
committed by Richard Cornwell
parent b8acf3da75
commit 75291268b8

View File

@@ -24,6 +24,7 @@
*/
#include <time.h>
#include "sim_video.h"
#include "display/display.h"
#include "ka10_defs.h"
@@ -41,6 +42,7 @@
static t_stat stk_svc (UNIT *uptr);
static t_stat stk_devio(uint32 dev, uint64 *data);
static t_stat stk_reset (DEVICE *dptr);
static const char *stk_description (DEVICE *dptr);
static uint64 status = 0;
@@ -58,7 +60,7 @@ MTAB stk_mod[] = {
DEVICE stk_dev = {
"STK", stk_unit, NULL, stk_mod,
1, 8, 0, 1, 8, 36,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, &stk_reset, NULL, NULL, NULL,
&stk_dib, DEV_DISABLE | DEV_DIS | DEV_DEBUG, 0, NULL,
NULL, NULL, NULL, NULL, NULL, &stk_description
};
@@ -93,6 +95,239 @@ static int translate[] = {
030, 031, 032, TOP|017, SHFT|'+',TOP|020, SHFT|'8',BS
};
static int bucky = 0;
static int stk_modifiers (SIM_KEY_EVENT *kev)
{
if (kev->state == SIM_KEYPRESS_DOWN) {
switch (kev->key) {
case SIM_KEY_SHIFT_L:
case SIM_KEY_SHIFT_R:
bucky |= SHFT;
return 1;
case SIM_KEY_CTRL_L:
case SIM_KEY_CTRL_R:
case SIM_KEY_CAPS_LOCK:
bucky |= CTRL;
return 1;
case SIM_KEY_WIN_L:
case SIM_KEY_WIN_R:
bucky |= TOP;
return 1;
case SIM_KEY_ALT_L:
case SIM_KEY_ALT_R:
bucky |= META;
return 1;
}
} else if (kev->state == SIM_KEYPRESS_UP) {
switch (kev->key) {
case SIM_KEY_SHIFT_L:
case SIM_KEY_SHIFT_R:
bucky &= ~SHFT;
return 1;
case SIM_KEY_CTRL_L:
case SIM_KEY_CTRL_R:
case SIM_KEY_CAPS_LOCK:
bucky &= ~CTRL;
return 1;
case SIM_KEY_WIN_L:
case SIM_KEY_WIN_R:
bucky &= ~TOP;
return 1;
case SIM_KEY_ALT_L:
case SIM_KEY_ALT_R:
bucky &= ~META;
return 1;
}
}
return 0;
}
static int stk_keys (SIM_KEY_EVENT *kev)
{
if (kev->state == SIM_KEYPRESS_UP)
return 0;
switch (kev->key) {
case SIM_KEY_0:
key_code = bucky | '+';
return 1;
case SIM_KEY_1:
key_code = bucky | '1';
return 1;
case SIM_KEY_2:
key_code = bucky | '2';
return 1;
case SIM_KEY_3:
key_code = bucky | '3';
return 1;
case SIM_KEY_4:
key_code = bucky | '4';
return 1;
case SIM_KEY_5:
key_code = bucky | '5';
return 1;
case SIM_KEY_6:
key_code = bucky | '6';
return 1;
case SIM_KEY_7:
key_code = bucky | '7';
return 1;
case SIM_KEY_8:
key_code = bucky | '8';
return 1;
case SIM_KEY_9:
key_code = bucky | '9';
return 1;
case SIM_KEY_A:
key_code = bucky | 001;
return 1;
case SIM_KEY_B:
key_code = bucky | 002;
return 1;
case SIM_KEY_C:
key_code = bucky | 003;
return 1;
case SIM_KEY_D:
key_code = bucky | 004;
return 1;
case SIM_KEY_E:
key_code = bucky | 005;
return 1;
case SIM_KEY_F:
key_code = bucky | 006;
return 1;
case SIM_KEY_G:
key_code = bucky | 007;
return 1;
case SIM_KEY_H:
key_code = bucky | 010;
return 1;
case SIM_KEY_I:
key_code = bucky | 011;
return 1;
case SIM_KEY_J:
key_code = bucky | 012;
return 1;
case SIM_KEY_K:
key_code = bucky | 013;
return 1;
case SIM_KEY_L:
key_code = bucky | 014;
return 1;
case SIM_KEY_M:
key_code = bucky | 015;
return 1;
case SIM_KEY_N:
key_code = bucky | 016;
return 1;
case SIM_KEY_O:
key_code = bucky | 017;
return 1;
case SIM_KEY_P:
key_code = bucky | 020;
return 1;
case SIM_KEY_Q:
key_code = bucky | 021;
return 1;
case SIM_KEY_R:
key_code = bucky | 022;
return 1;
case SIM_KEY_S:
key_code = bucky | 023;
return 1;
case SIM_KEY_T:
key_code = bucky | 024;
return 1;
case SIM_KEY_U:
key_code = bucky | 025;
return 1;
case SIM_KEY_V:
key_code = bucky | 026;
return 1;
case SIM_KEY_W:
key_code = bucky | 027;
return 1;
case SIM_KEY_X:
key_code = bucky | 030;
return 1;
case SIM_KEY_Y:
key_code = bucky | 031;
return 1;
case SIM_KEY_Z:
key_code = bucky | 032;
return 1;
case SIM_KEY_BACKQUOTE:
key_code = bucky | '0';
return 1;
case SIM_KEY_MINUS:
key_code = bucky | '-';
return 1;
case SIM_KEY_EQUALS:
key_code = bucky | '*';
return 1;
case SIM_KEY_LEFT_BRACKET:
key_code = bucky | '(';
return 1;
case SIM_KEY_RIGHT_BRACKET:
key_code = bucky | ')';
return 1;
case SIM_KEY_SEMICOLON:
key_code = bucky | ';';
return 1;
case SIM_KEY_SINGLE_QUOTE:
key_code = bucky | ':';
return 1;
case SIM_KEY_BACKSLASH:
key_code = bucky | BKSL;
return 1;
case SIM_KEY_LEFT_BACKSLASH:
key_code = bucky | BKSL;
return 1;
case SIM_KEY_COMMA:
key_code = bucky | ',';
return 1;
case SIM_KEY_PERIOD:
key_code = bucky | '.';
return 1;
case SIM_KEY_SLASH:
key_code = bucky | '/';
return 1;
case SIM_KEY_ESC:
key_code = bucky | ALT;
return 1;
case SIM_KEY_BACKSPACE:
case SIM_KEY_DELETE:
key_code = bucky | BS;
return 1;
case SIM_KEY_TAB:
key_code = bucky | TAB;
return 1;
case SIM_KEY_ENTER:
key_code = bucky | CR;
return 1;
case SIM_KEY_SPACE:
key_code = bucky | ' ';
return 1;
default:
return 0;
}
}
static int stk_keyboard (SIM_KEY_EVENT *kev)
{
if (stk_modifiers (kev))
return 0;
if (stk_keys (kev)) {
status |= STK_DONE;
set_interrupt(STK_DEVNUM, status & STK_PIA);
return 0;
}
return 1;
}
static t_stat stk_svc (UNIT *uptr)
{
int c = SCPE_OK;
@@ -146,6 +381,12 @@ t_stat stk_devio(uint32 dev, uint64 *data)
return SCPE_OK;
}
static t_stat stk_reset (DEVICE *dptr)
{
vid_display_kb_event_process = stk_keyboard;
return SCPE_OK;
}
const char *stk_description (DEVICE *dptr)
{
return "Stanford keyboard";