KA10: Moved over older changed to ITS and WAITS devices.

This commit is contained in:
Richard Cornwell 2023-09-27 12:41:48 -04:00 committed by Paul Koning
parent 0c77f8c832
commit 19c6b30e8e
5 changed files with 115 additions and 48 deletions

View file

@ -44,8 +44,8 @@
#define CHAR 001777 #define CHAR 001777
#define SHFT 000100 #define SHFT 000100
#define TOP 000200 #define TOP 000200
#define META 000400 #define CTRL 000400
#define CTRL 001000 #define META 001000
#define STATUS u3 #define STATUS u3
#define DATA u4 #define DATA u4
@ -53,6 +53,7 @@
#define LINE u6 #define LINE u6
t_stat dkb_devio(uint32 dev, uint64 *data); t_stat dkb_devio(uint32 dev, uint64 *data);
t_stat dkb_svc(UNIT *uptr);
int dkb_keyboard (SIM_KEY_EVENT *kev); int dkb_keyboard (SIM_KEY_EVENT *kev);
t_stat dkb_reset(DEVICE *dptr); t_stat dkb_reset(DEVICE *dptr);
t_stat dkb_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); t_stat dkb_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr);
@ -64,8 +65,7 @@ int dkb_kmod = 0;
DIB dkb_dib = { DKB_DEVNUM, 1, dkb_devio, NULL}; DIB dkb_dib = { DKB_DEVNUM, 1, dkb_devio, NULL};
UNIT dkb_unit[] = { UNIT dkb_unit[] = {
{UDATA (NULL, UNIT_IDLE, 0) }, {UDATA (&dkb_svc, UNIT_IDLE, 0) },
{ 0 }
}; };
@ -75,7 +75,7 @@ MTAB dkb_mod[] = {
DEVICE dkb_dev = { DEVICE dkb_dev = {
"DKB", dkb_unit, NULL, dkb_mod, "DKB", dkb_unit, NULL, dkb_mod,
2, 10, 31, 1, 8, 8, 1, 10, 31, 1, 8, 8,
NULL, NULL, dkb_reset, NULL, NULL, dkb_reset,
NULL, NULL, NULL, &dkb_dib, DEV_DEBUG | DEV_DISABLE | DEV_DIS, 0, dev_debug, NULL, NULL, NULL, &dkb_dib, DEV_DEBUG | DEV_DISABLE | DEV_DIS, 0, dev_debug,
NULL, NULL, &dkb_help, NULL, NULL, &dkb_description NULL, NULL, &dkb_help, NULL, NULL, &dkb_description
@ -127,11 +127,11 @@ int dkb_modifiers (SIM_KEY_EVENT *kev)
return 1; return 1;
case SIM_KEY_WIN_L: case SIM_KEY_WIN_L:
case SIM_KEY_WIN_R: case SIM_KEY_WIN_R:
dkb_kmod |= META; dkb_kmod |= TOP;
return 1; return 1;
case SIM_KEY_ALT_L: case SIM_KEY_ALT_L:
case SIM_KEY_ALT_R: case SIM_KEY_ALT_R:
dkb_kmod |= TOP; dkb_kmod |= META;
return 1; return 1;
} }
return 0; return 0;
@ -149,11 +149,11 @@ int dkb_modifiers (SIM_KEY_EVENT *kev)
return 1; return 1;
case SIM_KEY_WIN_L: case SIM_KEY_WIN_L:
case SIM_KEY_WIN_R: case SIM_KEY_WIN_R:
dkb_kmod &= ~META; dkb_kmod &= ~TOP;
return 1; return 1;
case SIM_KEY_ALT_L: case SIM_KEY_ALT_L:
case SIM_KEY_ALT_R: case SIM_KEY_ALT_R:
dkb_kmod &= ~TOP; dkb_kmod &= ~META;
return 1; return 1;
} }
return 0; return 0;
@ -163,8 +163,11 @@ int dkb_modifiers (SIM_KEY_EVENT *kev)
int dkb_keys (SIM_KEY_EVENT *kev, UNIT *uptr) int dkb_keys (SIM_KEY_EVENT *kev, UNIT *uptr)
{ {
if (kev->state == SIM_KEYPRESS_UP) if (kev->state == SIM_KEYPRESS_UP) {
if (kev->key == SIM_KEY_F11)
vid_set_fullscreen_window (kev->vptr, !vid_is_fullscreen_window (kev->vptr));
return 0; return 0;
}
switch (kev->key) { switch (kev->key) {
case SIM_KEY_0: /* ok */ case SIM_KEY_0: /* ok */
@ -181,7 +184,7 @@ int dkb_keys (SIM_KEY_EVENT *kev, UNIT *uptr)
return 1; return 1;
case SIM_KEY_2: case SIM_KEY_2:
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = (dkb_kmod | 052) & ~TOP; /* Circle Star */ uptr->DATA = (dkb_kmod | 005) & ~TOP; /* @ */
else else
uptr->DATA = dkb_kmod | 062; uptr->DATA = dkb_kmod | 062;
return 1; return 1;
@ -211,19 +214,19 @@ int dkb_keys (SIM_KEY_EVENT *kev, UNIT *uptr)
return 1; return 1;
case SIM_KEY_7: case SIM_KEY_7:
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = (dkb_kmod | 024) & ~TOP; /* & */ uptr->DATA = (dkb_kmod | 024) & ~TOP; /* & (TOP+T) */
else else
uptr->DATA = dkb_kmod | 067; uptr->DATA = dkb_kmod | 067;
return 1; return 1;
case SIM_KEY_8: /* ok */ case SIM_KEY_8: /* ok */
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = (dkb_kmod | 052) & ~TOP; /* * */ uptr->DATA = dkb_kmod | 052 | SHFT; /* * */
else else
uptr->DATA = dkb_kmod | 070; uptr->DATA = dkb_kmod | 070;
return 1; return 1;
case SIM_KEY_9: /* ok */ case SIM_KEY_9: /* ok */
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = dkb_kmod | 050; /* ( */ uptr->DATA = dkb_kmod | 050 | SHFT; /* ( */
else else
uptr->DATA = dkb_kmod | 071; uptr->DATA = dkb_kmod | 071;
return 1; return 1;
@ -308,38 +311,41 @@ int dkb_keys (SIM_KEY_EVENT *kev, UNIT *uptr)
case SIM_KEY_Z: case SIM_KEY_Z:
uptr->DATA = dkb_kmod | 032; uptr->DATA = dkb_kmod | 032;
return 1; return 1;
case SIM_KEY_BACKQUOTE: /* ` ~ */ case SIM_KEY_BACKQUOTE:
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = dkb_kmod | 043; uptr->DATA = (dkb_kmod | 025) & ~TOP; //` (TOP+U)
else else
uptr->DATA = dkb_kmod | 00; uptr->DATA = (dkb_kmod | 070) & ~TOP; //~ (TOP+8)
return 1; return 1;
case SIM_KEY_MINUS: /* - not */ case SIM_KEY_MINUS: /* - not */
uptr->DATA = dkb_kmod | 055; if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = (dkb_kmod | 071) & ~TOP; //_ (TOP+9)
else
uptr->DATA = dkb_kmod | 055;
return 1; return 1;
case SIM_KEY_EQUALS: /* = + */ case SIM_KEY_EQUALS: /* = + */
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = dkb_kmod | 053; uptr->DATA = dkb_kmod | 053 | SHFT;
else else
uptr->DATA = (dkb_kmod | 010) & ~TOP; uptr->DATA = (dkb_kmod | 010) & ~TOP; //TOP+H
return 1; return 1;
case SIM_KEY_LEFT_BRACKET: /* [ { */ case SIM_KEY_LEFT_BRACKET: /* [ { */
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = (dkb_kmod | 017) & ~TOP; uptr->DATA = (dkb_kmod | 017) & ~TOP; //TOP+P
else else
uptr->DATA = (dkb_kmod | 050) & ~TOP;; uptr->DATA = (dkb_kmod | 050) & ~TOP; //TOP+(
return 1; return 1;
case SIM_KEY_RIGHT_BRACKET: /* ] } */ case SIM_KEY_RIGHT_BRACKET: /* ] } */
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = (dkb_kmod | 020) & ~TOP; uptr->DATA = (dkb_kmod | 020) & ~TOP; //TOP+O
else else
uptr->DATA = (dkb_kmod | 051) & ~TOP;; uptr->DATA = (dkb_kmod | 051) & ~TOP; //TOP+)
return 1; return 1;
case SIM_KEY_SEMICOLON: /* ; : */ case SIM_KEY_SEMICOLON: /* ; : */
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
uptr->DATA = dkb_kmod | 072 | TOP; uptr->DATA = dkb_kmod | 072 | SHFT;
else else
uptr->DATA = dkb_kmod | 073 | TOP; uptr->DATA = dkb_kmod | 073;
return 1; return 1;
case SIM_KEY_SINGLE_QUOTE: /* ok */ /* ' " */ case SIM_KEY_SINGLE_QUOTE: /* ok */ /* ' " */
if ((dkb_kmod & (TOP|SHFT)) == TOP) if ((dkb_kmod & (TOP|SHFT)) == TOP)
@ -349,35 +355,33 @@ int dkb_keys (SIM_KEY_EVENT *kev, UNIT *uptr)
return 1; return 1;
case SIM_KEY_BACKSLASH: /* Ok */ case SIM_KEY_BACKSLASH: /* Ok */
if ((dkb_kmod & (TOP|SHFT)) == TOP) /* \ | */ if ((dkb_kmod & (TOP|SHFT)) == TOP) /* \ | */
uptr->DATA = (dkb_kmod | 053) & ~TOP; uptr->DATA = (dkb_kmod | 053) & ~TOP; //TOP++
else if ((dkb_kmod & (TOP|SHFT)) == SHFT)
uptr->DATA = (dkb_kmod | 034) & ~TOP;
else else
uptr->DATA = dkb_kmod | 034 | TOP; uptr->DATA = dkb_kmod | 034;
return 1; return 1;
case SIM_KEY_LEFT_BACKSLASH: case SIM_KEY_LEFT_BACKSLASH:
uptr->DATA = dkb_kmod | 034; uptr->DATA = dkb_kmod | 034;
return 1; return 1;
case SIM_KEY_COMMA: /* ok */ case SIM_KEY_COMMA: /* ok */
if ((dkb_kmod & (TOP|SHFT)) == TOP) /* , < */ if ((dkb_kmod & (TOP|SHFT)) == TOP) /* , < */
uptr->DATA = (dkb_kmod | 04) & ~TOP; uptr->DATA = (dkb_kmod | 04) & ~TOP; //TOP+D
else else
uptr->DATA = dkb_kmod | 054 | TOP; uptr->DATA = dkb_kmod | 054;
return 1; return 1;
case SIM_KEY_PERIOD: /* Ok */ case SIM_KEY_PERIOD: /* Ok */
if ((dkb_kmod & (TOP|SHFT)) == TOP) /* . > */ if ((dkb_kmod & (TOP|SHFT)) == TOP) /* . > */
uptr->DATA = (dkb_kmod | 06) & ~TOP; uptr->DATA = (dkb_kmod | 06) & ~TOP; //TOP+F
else else
uptr->DATA = dkb_kmod | 056; uptr->DATA = dkb_kmod | 056;
return 1; return 1;
case SIM_KEY_SLASH: /* Ok */ case SIM_KEY_SLASH: /* Ok */
if ((dkb_kmod & (TOP|SHFT)) == TOP) /* / ? */ if ((dkb_kmod & (TOP|SHFT)) == TOP) /* / ? */
uptr->DATA = (dkb_kmod | 056) & ~TOP; uptr->DATA = (dkb_kmod | 056) & ~TOP; //TOP+.
else else
uptr->DATA = dkb_kmod | 057; uptr->DATA = dkb_kmod | 057;
return 1; return 1;
case SIM_KEY_ESC: case SIM_KEY_ESC:
uptr->DATA = dkb_kmod | 042; uptr->DATA = dkb_kmod | 075; //ALT
return 1; return 1;
case SIM_KEY_BACKSPACE: case SIM_KEY_BACKSPACE:
uptr->DATA = dkb_kmod | 074; uptr->DATA = dkb_kmod | 074;
@ -394,20 +398,65 @@ int dkb_keys (SIM_KEY_EVENT *kev, UNIT *uptr)
case SIM_KEY_SPACE: case SIM_KEY_SPACE:
uptr->DATA = dkb_kmod | 040; uptr->DATA = dkb_kmod | 040;
return 1; return 1;
case SIM_KEY_F1:
uptr->DATA = dkb_kmod | 043; //CALL
return 1;
case SIM_KEY_F2:
uptr->DATA = dkb_kmod | 042; //ESC
return 1;
case SIM_KEY_F3:
uptr->DATA = dkb_kmod | 041; //BREAK
return 1;
case SIM_KEY_F4:
uptr->DATA = dkb_kmod | 035; //LINE
return 1;
case SIM_KEY_F5:
uptr->DATA = dkb_kmod | 046; //FORM
return 1;
case SIM_KEY_F6:
uptr->DATA = dkb_kmod | 047; //VT
return 1;
case SIM_KEY_LEFT:
uptr->DATA = (dkb_kmod | 012) & ~TOP; //Left arrow (TOP+J)
return 1;
case SIM_KEY_RIGHT:
uptr->DATA = (dkb_kmod | 013) & ~TOP; //Right arrow (TOP+K)
return 1;
case SIM_KEY_DOWN:
uptr->DATA = (dkb_kmod | 072 ) & ~TOP; //Down arrow (TOP+;)
return 1;
case SIM_KEY_UP:
uptr->DATA = (dkb_kmod | 073) & ~TOP; //Up arrow (TOP+:)
return 1;
default: default:
return 0; return 0;
} }
} }
uint32 dkb_line (SIM_KEY_EVENT *kev)
{
#if NUM_DEVS_III
if (kev->dev == &iii_dev)
return iii_keyboard_line ((void *)kev->vptr);
#endif
#if NUM_DEVS_DD
if (kev->dev == &dd_dev)
return dd_keyboard_line ((void *)kev->vptr);
#endif
return ~0U;
}
int dkb_keyboard (SIM_KEY_EVENT *kev) int dkb_keyboard (SIM_KEY_EVENT *kev)
{ {
sim_debug(DEBUG_DETAIL, &dkb_dev, "DKB key %d %o\n", kev->key, kev->state); sim_debug(DEBUG_DETAIL, &dkb_dev, "DKB key %d %o\n", kev->key, kev->state);
if (dkb_modifiers (kev)) if (dkb_modifiers (kev))
return 0; return 0;
if (dkb_keys (kev, &dkb_unit[0])) { dkb_unit[0].LINE = dkb_line (kev);
if (dkb_unit[0].LINE != ~0U && dkb_keys (kev, &dkb_unit[0])) {
dkb_unit[0].DATA |= VALID; dkb_unit[0].DATA |= VALID;
dkb_unit[0].STATUS |= DONE; dkb_unit[0].STATUS |= DONE;
sim_debug(DEBUG_DETAIL, &dkb_dev, "DKB interrupt, data %o\n", dkb_unit[0].DATA);
set_interrupt(DKB_DEVNUM, dkb_unit[0].PIA); set_interrupt(DKB_DEVNUM, dkb_unit[0].PIA);
return 0; return 0;
} }
@ -415,11 +464,19 @@ int dkb_keyboard (SIM_KEY_EVENT *kev)
return 1; return 1;
} }
t_stat dkb_svc(UNIT *uptr)
{
SIM_KEY_EVENT ev;
sim_activate_after (uptr, 10000);
if (vid_poll_kb (&ev) == SCPE_OK)
dkb_keyboard (&ev);
return SCPE_OK;
}
t_stat dkb_reset( DEVICE *dptr) t_stat dkb_reset( DEVICE *dptr)
{ {
if ((dkb_dev.flags & DEV_DIS) == 0) if ((dkb_dev.flags & DEV_DIS) == 0)
vid_display_kb_event_process = dkb_keyboard; sim_activate_abs (dkb_unit, 0);
dkb_kmod = SHFT|TOP|META|CTRL; dkb_kmod = SHFT|TOP|META|CTRL;
return SCPE_OK; return SCPE_OK;
} }
@ -427,12 +484,12 @@ t_stat dkb_reset( DEVICE *dptr)
t_stat dkb_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) t_stat dkb_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr)
{ {
fprintf (stderr, "This is the keyboard input for the Stanford III display\n"); fprintf (stderr, "Keyboard input for the Stanford III and Data Disc displays\n");
return SCPE_OK; return SCPE_OK;
} }
const char *dkb_description (DEVICE *dptr) const char *dkb_description (DEVICE *dptr)
{ {
return "Keyboard scanner for III display devices"; return "Keyboard scanner for III and DD display devices";
} }
#endif #endif

View file

@ -635,6 +635,12 @@ skip_up:
return SCPE_OK; return SCPE_OK;
} }
uint32 iii_keyboard_line (void *p)
{
/* III keyboards are 0 to 5, but only one is supported now. */
return 0;
}
t_stat iii_reset (DEVICE *dptr) t_stat iii_reset (DEVICE *dptr)
{ {
if (dptr->flags & DEV_DIS) { if (dptr->flags & DEV_DIS) {

View file

@ -31,8 +31,6 @@
#endif #endif
#if (NUM_DEVS_TEN11 > 0) #if (NUM_DEVS_TEN11 > 0)
#include <fcntl.h>
#include <sys/types.h>
/* Rubin 10-11 pager. */ /* Rubin 10-11 pager. */
static uint64 ten11_pager[256]; static uint64 ten11_pager[256];

View file

@ -843,6 +843,12 @@ extern UNIT auxcpu_unit[];
//int slave_write (t_addr addr, uint64); //int slave_write (t_addr addr, uint64);
//extern UNIT slave_unit[]; //extern UNIT slave_unit[];
#endif #endif
#if NUM_DEVS_III
extern uint32 iii_keyboard_line (void *);
#endif
#if NUM_DEVS_DD
extern uint32 dd_keyboard_line (void *);
#endif
#if PIDP10 #if PIDP10
void pi_panel_start(); void pi_panel_start();

View file

@ -613,13 +613,13 @@ MTAB imp_mod[] = {
{ MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, NULL, "ARP=ddd.ddd.ddd.ddd=XX:XX:XX:XX:XX:XX", { MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, NULL, "ARP=ddd.ddd.ddd.ddd=XX:XX:XX:XX:XX:XX",
&imp_set_arp, NULL, NULL, "Create a static ARP Entry" }, &imp_set_arp, NULL, NULL, "Create a static ARP Entry" },
#if KS #if KS
{MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "addr", "addr", &uba_set_addr, uba_show_addr, {MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "ADDR", "ADDR", &uba_set_addr, uba_show_addr,
NULL, "Sets address of IMP11" }, NULL, "Sets address of IMP11" },
{MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "vect", "vect", &uba_set_vect, uba_show_vect, {MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "VECT", "VECT", &uba_set_vect, uba_show_vect,
NULL, "Sets vect of IMP11" }, NULL, "Sets vect of IMP11" },
{MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "br", "br", &uba_set_br, uba_show_br, {MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "BR", "BR", &uba_set_br, uba_show_br,
NULL, "Sets br of IMP11" }, NULL, "Sets br of IMP11" },
{MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "ctl", "ctl", &uba_set_ctl, uba_show_ctl, {MTAB_XTD|MTAB_VDV|MTAB_VALR, 0, "CTL", "CTL", &uba_set_ctl, uba_show_ctl,
NULL, "Sets uba of IMP11" }, NULL, "Sets uba of IMP11" },
#endif #endif
{ 0 } { 0 }
@ -2352,14 +2352,14 @@ t_stat imp_set_arp (UNIT* uptr, int32 val, CONST char* cptr, void* desc)
cptr = get_glyph (cptr, abuf, '='); cptr = get_glyph (cptr, abuf, '=');
if (cptr && *cptr) { if (cptr && *cptr) {
if (SCPE_OK != eth_mac_scan (&mac_addr, cptr)) /* scan string for mac, put in mac */ if (SCPE_OK != eth_mac_scan (&mac_addr, cptr)) /* scan string for mac, put in mac */
return sim_messagef(SCPE_ARG, "Invalid MAC address: %s", cptr); return sim_messagef(SCPE_ARG, "Invalid MAC address: %s\n", abuf);
} else } else
return sim_messagef(SCPE_ARG, "Invalid MAC address: %s", cptr); return sim_messagef(SCPE_ARG, "MAC address empty\n");
if (ipv4_inet_aton (abuf, (struct in_addr *)&ip)) { if (ipv4_inet_aton (abuf, (struct in_addr *)&ip)) {
imp_arp_update(&imp_data, ip, &mac_addr, ARP_DONT_AGE); imp_arp_update(&imp_data, ip, &mac_addr, ARP_DONT_AGE);
return SCPE_OK; return SCPE_OK;
} }
return sim_messagef(SCPE_ARG, "Invalid IP Address: %s", abuf); return sim_messagef(SCPE_ARG, "Invalid IP Address: %s\n", abuf);
} }
t_stat imp_show_arp (FILE *st, UNIT *uptr, int32 val, CONST void *desc) t_stat imp_show_arp (FILE *st, UNIT *uptr, int32 val, CONST void *desc)