1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-11 23:52:48 +00:00

KA10: Updated support for Stanford III display.

This commit is contained in:
Richard Cornwell 2020-02-22 15:28:12 -05:00
parent f94ef3dc8c
commit f50190ba5e
9 changed files with 969 additions and 338 deletions

View File

@ -1,6 +1,6 @@
/* ka10_dkb.c:Stanford Microswitch scanner.
Copyright (c) 2013-2017, Richard Cornwell
Copyright (c) 2019-2020, Richard Cornwell
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
@ -32,20 +32,40 @@
#if NUM_DEVS_DKB > 0
t_stat dkb_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr);
const char *dkb_description (DEVICE *dptr);
#include "sim_video.h"
#define DKB_DEVNUM 0310
#define DONE 010 /* Device has character */
#define SPW 020 /* Scanner in SPW mode */
#define VALID 010000
#define SPW_FLG 020000
#define CHAR 001777
#define SHFT 000100
#define TOP 000200
#define META 000400
#define CTRL 001000
#define STATUS u3
#define DATA u4
#define PIA u5
#define LINE u6
t_stat dkb_devio(uint32 dev, uint64 *data);
int dkb_keyboard (SIM_KEY_EVENT *kev);
t_stat dkb_svc(UNIT *uptr);
t_stat dkb_reset(DEVICE *dptr);
t_stat dkb_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr);
const char *dkb_description (DEVICE *dptr);
int dkb_kmod = 0;
DIB dkb_dib = { DKB_DEVNUM, 1, dkb_devio, NULL};
UNIT dkb_unit[] = {
{UDATA (&dkb_svc, UNIT_IDLE, 0) },
{ 0 }
};
@ -57,42 +77,367 @@ MTAB dkb_mod[] = {
DEVICE dkb_dev = {
"DKB", dkb_unit, NULL, dkb_mod,
2, 10, 31, 1, 8, 8,
NULL, NULL, NULL,
NULL, NULL, dkb_reset,
NULL, NULL, NULL, &dkb_dib, DEV_DEBUG | DEV_DISABLE | DEV_DIS, 0, dev_debug,
NULL, NULL, &dkb_help, NULL, NULL, &dkb_description
};
int status;
t_stat dkb_devio(uint32 dev, uint64 *data) {
/* uint64 res; */
UNIT *uptr = &dkb_unit[0];
switch(dev & 3) {
case CONI:
*data = status;
*data = (uint64)(uptr->STATUS|uptr->PIA);
sim_debug(DEBUG_CONI, &dkb_dev, "DKB %03o CONI %06o\n", dev, (uint32)*data);
break;
case CONO:
status = (int)(*data&7);
uptr->PIA = (int)(*data&7);
if (*data & DONE)
uptr->STATUS = 0;
clr_interrupt(DKB_DEVNUM);
sim_debug(DEBUG_CONO, &dkb_dev, "DKB %03o CONO %06o\n", dev, (uint32)*data);
break;
case DATAI:
*data = (uint64)((uptr->LINE << 18) | (uptr->DATA));
uptr->STATUS = 0;
clr_interrupt(DKB_DEVNUM);
sim_debug(DEBUG_DATAIO, &dkb_dev, "DKB %03o DATAI %06o\n", dev, (uint32)*data);
break;
case DATAO:
if (*data & 010000) {
uptr->STATUS |= SPW;
uptr->LINE = (int)(*data & 077);
}
sim_debug(DEBUG_DATAIO, &dkb_dev, "DKB %03o DATAO %06o\n", dev, (uint32)*data);
break;
}
return SCPE_OK;
}
int dkb_modifiers (SIM_KEY_EVENT *kev)
{
if (kev->state == SIM_KEYPRESS_UP) {
switch (kev->key) {
case SIM_KEY_SHIFT_L:
case SIM_KEY_SHIFT_R:
case SIM_KEY_CAPS_LOCK:
dkb_kmod |= SHFT;
return 1;
case SIM_KEY_CTRL_L:
case SIM_KEY_CTRL_R:
dkb_kmod |= CTRL;
return 1;
case SIM_KEY_WIN_L:
case SIM_KEY_WIN_R:
dkb_kmod |= TOP;
return 1;
case SIM_KEY_ALT_L:
case SIM_KEY_ALT_R:
dkb_kmod |= META;
return 1;
}
return 0;
}
if (kev->state == SIM_KEYPRESS_DOWN) {
switch (kev->key) {
case SIM_KEY_SHIFT_L:
case SIM_KEY_SHIFT_R:
case SIM_KEY_CAPS_LOCK:
dkb_kmod &= ~SHFT;
return 1;
case SIM_KEY_CTRL_L:
case SIM_KEY_CTRL_R:
dkb_kmod &= ~CTRL;
return 1;
case SIM_KEY_WIN_L:
case SIM_KEY_WIN_R:
dkb_kmod &= ~TOP;
return 1;
case SIM_KEY_ALT_L:
case SIM_KEY_ALT_R:
dkb_kmod &= ~META;
return 1;
}
return 0;
}
return 0;
}
int dkb_keys (SIM_KEY_EVENT *kev, UNIT *uptr)
{
if (kev->state == SIM_KEYPRESS_UP)
return 0;
switch (kev->key) {
case SIM_KEY_0:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|TOP|SHFT) | 051; /* ( */
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 060;
return 1;
case SIM_KEY_1:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 054; /* ! */
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 061;
return 1;
case SIM_KEY_2:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 052; /* Circle Star */
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 062;
return 1;
case SIM_KEY_3:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 022; /* # */
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 063;
return 1;
case SIM_KEY_4:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 066; /* $ */
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 064;
return 1;
case SIM_KEY_5:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 067; /* % */
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 065;
return 1;
case SIM_KEY_6:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 021; /* ^ */
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 066;
return 1;
case SIM_KEY_7:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 024 ; /* & */
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 067;
return 1;
case SIM_KEY_8:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 052;
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 070;
return 1;
case SIM_KEY_9:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|TOP|SHFT) | 050;
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 071;
return 1;
case SIM_KEY_A:
uptr->DATA = dkb_kmod | 001;
return 1;
case SIM_KEY_B:
uptr->DATA = dkb_kmod | 002;
return 1;
case SIM_KEY_C:
uptr->DATA = dkb_kmod | 003;
return 1;
case SIM_KEY_D:
uptr->DATA = dkb_kmod | 004;
return 1;
case SIM_KEY_E:
uptr->DATA = dkb_kmod | 005;
return 1;
case SIM_KEY_F:
uptr->DATA = dkb_kmod | 006;
return 1;
case SIM_KEY_G:
uptr->DATA = dkb_kmod | 007;
return 1;
case SIM_KEY_H:
uptr->DATA = dkb_kmod | 010;
return 1;
case SIM_KEY_I:
uptr->DATA = dkb_kmod | 011;
return 1;
case SIM_KEY_J:
uptr->DATA = dkb_kmod | 012;
return 1;
case SIM_KEY_K:
uptr->DATA = dkb_kmod | 013;
return 1;
case SIM_KEY_L:
uptr->DATA = dkb_kmod | 014;
return 1;
case SIM_KEY_M:
uptr->DATA = dkb_kmod | 015;
return 1;
case SIM_KEY_N:
uptr->DATA = dkb_kmod | 016;
return 1;
case SIM_KEY_O:
uptr->DATA = dkb_kmod | 017;
return 1;
case SIM_KEY_P:
uptr->DATA = dkb_kmod | 020;
return 1;
case SIM_KEY_Q:
uptr->DATA = dkb_kmod | 021;
return 1;
case SIM_KEY_R:
uptr->DATA = dkb_kmod | 022;
return 1;
case SIM_KEY_S:
uptr->DATA = dkb_kmod | 023;
return 1;
case SIM_KEY_T:
uptr->DATA = dkb_kmod | 024;
return 1;
case SIM_KEY_U:
uptr->DATA = dkb_kmod | 025;
return 1;
case SIM_KEY_V:
uptr->DATA = dkb_kmod | 026;
return 1;
case SIM_KEY_W:
uptr->DATA = dkb_kmod | 027;
return 1;
case SIM_KEY_X:
uptr->DATA = dkb_kmod | 030;
return 1;
case SIM_KEY_Y:
uptr->DATA = dkb_kmod | 031;
return 1;
case SIM_KEY_Z:
uptr->DATA = dkb_kmod | 032;
return 1;
case SIM_KEY_BACKQUOTE:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|TOP|SHFT) |043 ;
else
uptr->DATA = (META|CTRL|SHFT) | 00;
return 1;
case SIM_KEY_MINUS:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 055 ;
else
uptr->DATA = (META|CTRL|TOP) | 055;
return 1;
case SIM_KEY_EQUALS:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 053;
else
uptr->DATA = (META|CTRL|SHFT) | 010;
return 1;
case SIM_KEY_LEFT_BRACKET:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 017;
else
uptr->DATA = (META|CTRL|SHFT) | 050;
return 1;
case SIM_KEY_RIGHT_BRACKET:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT)| 020;
else
uptr->DATA = (META|CTRL|SHFT) | 051;
return 1;
case SIM_KEY_SEMICOLON:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|TOP|SHFT) | 072;
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 073;
return 1;
case SIM_KEY_SINGLE_QUOTE:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 031;
else
uptr->DATA = (META|CTRL|SHFT) | 011;
return 1;
case SIM_KEY_BACKSLASH:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|SHFT) | 053;
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 034;
return 1;
case SIM_KEY_LEFT_BACKSLASH:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|TOP|SHFT) | 034;
else
uptr->DATA = (META|CTRL|SHFT) | 011;
return 1;
case SIM_KEY_COMMA:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|TOP|SHFT) | 034;
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 054;
return 1;
case SIM_KEY_PERIOD:
if ((dkb_kmod & SHFT) == 0)
uptr->DATA = (META|CTRL|TOP|SHFT) | 034;
else
uptr->DATA = (META|CTRL|TOP|SHFT) | 056;
return 1;
case SIM_KEY_SLASH:
uptr->DATA = dkb_kmod | 057;
return 1;
case SIM_KEY_ESC:
uptr->DATA = dkb_kmod | 042;
return 1;
case SIM_KEY_BACKSPACE:
uptr->DATA = dkb_kmod | 074;
return 1;
case SIM_KEY_DELETE:
uptr->DATA = dkb_kmod | 044;
return 1;
case SIM_KEY_TAB:
uptr->DATA = dkb_kmod | 045;
return 1;
case SIM_KEY_ENTER:
uptr->DATA = dkb_kmod | 033;
return 1;
case SIM_KEY_SPACE:
uptr->DATA = dkb_kmod | 040;
return 1;
default:
return 0;
}
}
int dkb_keyboard (SIM_KEY_EVENT *kev)
{
sim_debug(DEBUG_DETAIL, &dkb_dev, "DKB key %d %o\n", kev->key, kev->state);
if (dkb_modifiers (kev))
return 0;
if (dkb_keys (kev, &dkb_unit[0])) {
dkb_unit[0].DATA |= VALID;
dkb_unit[0].STATUS |= DONE;
set_interrupt(DKB_DEVNUM, dkb_unit[0].PIA);
return 0;
}
return 1;
}
t_stat dkb_svc( UNIT *uptr)
{
return SCPE_OK;
}
t_stat dkb_reset( DEVICE *dptr)
{
if ((dkb_dev.flags & DEV_DIS) == 0)
vid_display_kb_event_process = dkb_keyboard;
dkb_kmod = SHFT|TOP|META|CTRL;
return SCPE_OK;
}
t_stat dkb_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr)
{
return SCPE_OK;
fprintf (stderr, "This is the keyboard input for the Stanford III display\n");
return SCPE_OK;
}
const char *dkb_description (DEVICE *dptr)
{
return "Console TTY Line";
return "Keyboard scanner for III display devices";
}
#endif

View File

@ -1,6 +1,6 @@
/* ka10_iii.c: Triple III display processor.
Copyright (c) 2013-2019, Richard Cornwell
Copyright (c) 2019-2020, Richard Cornwell
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
@ -30,9 +30,9 @@
#define NUM_DEVS_III 0
#endif
#if NUM_DEVS_III > 0
#if NUM_DEVS_III > 0
#include "display/display.h"
#include "display/iii.h"
#define III_DEVNUM 0430
@ -51,19 +51,21 @@
/* CONI Bits */
#define PIA_MSK 000000007
#define INST_HLT 000000010 /* Halt instruction */
#define WRAP_ENB 000000020 /* Wrap around mask */
#define EDGE_ENB 000000040 /* Edge interrupt mask */
#define LIGH_ENB 000000100 /* Light pen enable mask */
#define CLK_STOP 000000200 /* Clock stop */
#define CLK_BIT 000001000 /* Clock */
#define NXM_BIT 000002000 /* Non-existent memory */
#define IRQ_BIT 000004000 /* Interrupt pending */
#define DATAO_LK 000010000 /* PDP10 gave DATAO when running */
#define LIGHT_FLG 000020000 /* Light pen flag */
#define WRAP_FLG 000040000 /* Wrap around flag */
#define EDGE_FLG 000100000 /* Edge overflow */
#define HLT_FLG 000200000 /* Not running */
#define INST_HLT 000000010 /* 32 - Halt instruction */
#define WRAP_ENB 000000020 /* 31 - Wrap around mask */
#define EDGE_ENB 000000040 /* 30 - Edge interrupt mask */
#define LIGH_ENB 000000100 /* 29 - Light pen enable mask */
#define CLK_STOP 000000200 /* 28 - Clock stop */
/* 27 - Not used */
#define CLK_BIT 000001000 /* 26 - Clock */
#define NXM_BIT 000002000 /* 25 - Non-existent memory */
#define IRQ_BIT 000004000 /* 24 - Interrupt pending */
#define DATAO_LK 000010000 /* 23 - PDP10 gave DATAO when running */
#define CONT_BIT 000020000 /* 22 - Control bit */
#define LIGHT_FLG 000040000 /* 21 - Light pen flag */
#define WRAP_FLG 000100000 /* 20 - Wrap around flag */
#define EDGE_FLG 000200000 /* 19 - Edge overflow */
#define HLT_FLG 000400000 /* 18 - Not running */
#define WRAP_MSK 00001
#define EDGE_MSK 00002
@ -86,14 +88,14 @@
#define RES_INST 014 /* Restore */
#define SEL_INST 010 /* Select instruction */
#define CSIZE 00000000007 /* Current char size */
#define CBRT 00000000070 /* Current brightness */
#define POS_Y 00000377700
#define POS_X 01777400000
#define CSIZE_V 0
#define POS_Y 00000377700
#define CBRT 00000000070 /* Current brightness */
#define CSIZE 00000000007 /* Current char size */
#define POS_X_V 16
#define POS_Y_V 6
#define CBRT_V 3
#define POS_X_V 6
#define POS_Y_V 16
#define CSIZE_V 0
/*
* Character map.
@ -101,168 +103,198 @@
* V(x,y) draws a vector between current pointer and x,y.
* All characters start at 0,6 and end at 8,6.
* In the map there are up to 18 points per character. For a character a M(0,0) indicates
* that drawing is done and a move to 8,6 should be done.
* that drawing is done and a move to 8,6 should be done.
*/
#define M(x,y) (x << 4)|y|0000
#define V(x,y) (x << 4)|y|0200
uint8 map[128][18] = {
{ 0 },
{ M(0,9), V(3,6), V(3,14), M(3,6), V(6,9) },
{ M(6,6), V(3,9), V(1,9), V(0,8), V(0,7), V(1,6), V(3,6), V(6,9) },
{ V(2,8), V(2,13), V(3,14), V(5,14), V(6,13), V(6,12), V(5,11), V(2,11), M(5,11),
V(6,10), V(6,9), V(5,8), V(3,8), V(2,9) },
{ M(0,8), V(3,11), V(6,8) },
{ M(0,10), V(6,10), V(6,7) },
{ M(3,9), V(2,10), V(1,10), V(0,9), V(0,7), V(1,6), V(2,6), V(3,7), M(2,8), V(0,8) },
{ M(0,10), V(6,10), M(4,10), V(4,6), M(2,6), V(2,10) },
{ V(3,9), M(0,11), V(1,11), V(6,6) },
{ M(0,11), V(1,12), V(2,12), V(5,9), V(5,7), V(4,6), V(3,6), V(2,7), V(2,8), V(6,12) },
{ M(2,10), V(1,10), V(0,9), V(0,7), V(1,6), V(3,6), V(4,7), V(4,9), V(3,10), V(2,10),
V(2,12), V(4,12) },
{ M(0,7), V(1,6), V(2,6), V(3,7), V(3,12), V(4,13), V(5,13), V(6,12) },
{ M(0,9), V(4,9), M(2,11), V(2,7), M(0,7), V(4,7) },
{ M(0,8), V(0,7), V(1,6), V(3,6), V(4,7), V(4,9), V(3,10), V(1,10), V(0,9), V(0,8),
V(4,8), M(2,10), V(2,6) },
{ M(0,10), V(1,9), V(2,9), V(4,11), V(5,11), V(6,10), V(5,9), V(4,9), V(2,11), V(1,11),
V(0,10) },
{ M(4,8), V(3,9), V(1,9), V(0,8), V(0,7), V(1,6), V(3,6), V(4,7), V(4,10), V(2,12),
V(1,12) },
{ M(3,11), V(1,11), V(0,10), V(0,8), V(1,7), V(3,7) },
{ M(0,11), V(2,11), V(3,10), V(3,8), V(2,7), V(0,7) },
{ M(0,7), V(0,9), V(1,10), V(3,10), V(4,9), V(4,7) },
{ M(0,10), V(0,8), V(1,7), V(3,7), V(4,8), V(4,10) },
{ M(0,13), V(0,8), V(2,6), V(4,6), V(6,8), V(6,13), M(0,10), V(6,10) },
{ V(6,6), V(6,14), V(0,14), M(2,10), V(6,10) },
{ V(4,10), M(0,10), V(4,6), M(3,6), V(1,6), V(0,7), V(0,9), V(1,10), V(3,10), V(4,9),
V(4,7), V(3,6) },
{ M(2,8), V(0,10), V(2,12), M(0,10), V(6,10), M(4,12), V(6,10), V(4,8) },
{ M(0,5), V(6,5) },
{ M(0,10), V(6,10), M(3,13), V(6,10), V(3,7) },
{ M(0,12), V(2,14), V(4,12), V(6,14) },
{ V(6,12), M(0,10), V(6,10), M(0,8), V(6,8) },
{ V(3,6), M(3,7), V(0,10), V(3,13) },
{ V(3,6), M(0,7), V(3,10), V(0,13) },
{ M(0,7), V(6,7), M(6,9), V(0,9), M(0,11), V(6,11) },
{ M(0,11), V(3,8), V(6,11) },
{ 0, },
{ M(2,6), V(2,7), M(2,8), V(2,13) },
{ M(2,12), V(2,14), M(4,14), V(4,12) },
{ M(2,7), V(2,13), M(4,13), V(4,7), M(6,9), V(0,9), M(0,11), V(6,11) },
{ M(0,8), V(2,6), V(4,6), V(6,8), V(4,10), V(2,10), V(0,12), V(2,14), V(4,14), V(6,12),
M(4,14), V(4,6), M(2,6), V(2,14) },
{ V(6,12), V(1,12), V(0,11), V(0,10), V(1,9), V(2,9), V(3,10), V(3,11), V(2,12), M(4,9),
V(3,8), V(3,7), V(4,6), V(5,6), V(6,7), V(6,8), V(5,9), V(4,9) },
{ M(6,6), V(1,11), V(1,13), V(2,14), V(3,14), V(4,13), V(0,9), V(0,7), V(1,6), V(3,6),
V(5,8) },
{ M(2,12), V(4,14) },
{ M(2,6), V(0,8), V(0,12), V(2,14) },
{ V(2,8), V(2,12), V(0,14) },
{ M(1,8), V(5,12), M(3,13), V(3,7), M(5,8), V(1,12), M(0,10), V(6,10) },
{ M(2,7), V(2,11), M(0,9), V(4,9) },
{ M(0,7), V(1,6), V(1,5), V(0,4) },
{ M(0,9), V(4,9) },
{ M(2,6), V(3,6), V(3,7), V(2,7), V(2,6) },
{ V(6,12) },
{ M(0,7), V(6,13), M(6,12), V(4,14), V(2,14), V(0,12), V(0,8), V(2,6), V(4,6), V(6,8),
V(6,12) },
{ M(1,12), V(3,14), V(3,6) },
{ M(0,13), V(1,14), V(4,14), V(6,12), V(6,11), V(5,10), V(2,10), V(0,8), V(0,6), V(6,6) },
{ M(0,14), V(6,14), V(6,12), V(4,10), V(5,10), V(6,9), V(6,7), V(5,6), V(0,6) },
{ M(5,6), V(5,14), V(0,9), V(6,9) },
{ M(0,7), V(1,6), V(4,6), V(6,8), V(6,9), V(5,10), V(1,10), V(0,9), V(0,14), V(6,14) },
{ M(0,9), V(1,10), V(5,10), V(6,9), V(6,7), V(5,6), V(1,6), V(0,7), V(0,10), V(4,14) },
{ V(6,12), V(6,14), V(0,14) },
{ M(1,10), V(0,9), V(0,7), V(1,6), V(5,6), V(6,7), V(6,9), V(5,10), V(6,11), V(6,13),
V(5,14), V(1,14), V(0,13), V(0,11), V(1,10), V(5,10) },
{ M(2,6), V(6,10), V(6,13), V(5,14), V(1,14), V(0,13), V(0,11), V(1,10), V(5,10),
V(6,11) },
{ M(2,6), V(3,6), V(3,7), V(2,7), V(2,6), M(2,10), V(3,10), V(3,11), V(2,11), V(2,10) },
{ M(2,7), V(3,6), V(3,5), V(2,4), M(2,10), V(3,10), V(3,11), V(2,11), V(2,10) },
{ M(3,7), V(0,10), V(3,13) },
{ M(0,8), V(6,8), M(6,10), V(0,10) },
{ M(0,7), V(3,10), V(0,13) },
{ M(0,13), V(1,14), V(2,13), V(2,12), V(1,11), V(1,8), M(1,7), V(1,6) },
{ M(1,6), V(0,7), V(0,11), V(1,12), V(5,12), V(6,11), V(6,8), V(5,7), V(4,8), V(4,11),
M(4,10), V(3,11), V(2,11), V(1,10), V(1,9), V(2,8), V(3,8), V(4,9) },
{ V(0,12), V(2,14), V(4,14), V(6,12), V(6,9), V(0,9), V(6,9), V(6,6) },
{ V(0,14), V(5,14), V(6,13), V(6,11), V(5,10), V(0,10), V(5,10), V(6,9), V(6,7), V(5,6),
V(0,6) },
{ M(6,13), V(5,14), V(2,14), V(0,12), V(0,8), V(2,6), V(5,6), V(6,7) },
{ V(0,14), V(4,14), V(6,12), V(6,8), V(4,6), V(0,6) },
{ M(6,6), V(0,6), V(0,10), V(4,10), V(0,10), V(0,14), V(6,14) },
{ V(0,10), V(4,10), V(0,10), V(0,14), V(6,14) },
{ M(6,13), V(5,14), V(2,14), V(0,12), V(0,8), V(2,6), V(4,6), V(6,8), V(6,10), V(4,10) },
{ V(0,14), V(0,10), V(6,10), V(6,14), V(6,6) },
{ M(1,6), V(5,6), V(3,6), V(3,14), V(1,14), V(5,14) },
{ M(1,9), V(1,7), V(2,6), V(3,6), V(4,7), V(4,14), V(2,14), V(6,14) },
{ V(0,14), V(0,8), V(6,14), V(2,10), V(6,6) },
{ M(0,14), V(0,6), V(6,6) },
{ V(0,14), V(3,11), V(6,14), V(6,6) },
{ V(0,14), V(0,13), V(6,7), V(6,6), V(6,14) },
{ M(0,8), V(0,12), V(2,14), V(4,14), V(6,12), V(6,8), V(4,6), V(2,6), V(0,8) },
{ V(0,14), V(5,14), V(6,13), V(6,11), V(5,10), V(0,10) },
{ M(0,8), V(0,12), V(2,14), V(4,14), V(6,12), V(6,8), V(4,6), V(2,6), V(0,8), M(3,9),
V(6,6) },
{ V(0,14), V(5,14), V(6,13), V(6,11), V(5,10), V(0,10), V(2,10), V(6,6) },
{ M(0,8), V(2,6), V(4,6), V(6,8), V(4,10), V(2,10), V(0,12), V(2,14), V(4,14), V(6,12) },
{ M(3,6), V(3,14), V(0,14), V(6,14) },
{ M(0,14), V(0,7), V(1,6), V(5,6), V(6,7), V(6,14) },
{ M(0,14), V(0,9), V(3,6), V(6,9), V(6,14) },
{ M(0,14), V(0,6), V(3,9), V(6,6), V(6,14) },
{ V(0,7), V(6,13), V(6,14), M(0,14), V(0,13), V(6,7), V(6,6) },
{ M(0,14), V(3,11), V(6,14), V(3,11), V(3,6) },
{ M(0,14), V(6,14), V(6,13), V(0,7), V(0,6), V(6,6) },
{ M(3,5), V(0,5), V(0,15), V(3,15) },
{ M(0,12), V(6,6) },
{ M(0,5), V(3,5), V(3,15), V(0,15) },
{ M(0,11), V(3,14), V(6,11), M(3,14), V(3,6) },
{ M(3,7), V(0,10), V(3,13), M(0,10), V(6,10) },
{ M(2,14), V(4,12) },
{ M(0,9), V(1,10), V(3,10), V(4,9), V(4,6), M(4,8), V(3,9), V(1,9), V(0,8), V(0,7),
V(1,6), V(3,6), V(4,7) },
{ V(0,13), M(0,9), V(1,10), V(3,10), V(4,9), V(4,7), V(3,6), V(1,6), V(0,7) },
{ M(4,9), V(3,10), V(1,10), V(0,9), V(0,7), V(1,6), V(3,6), V(4,7) },
{ M(0,7), V(0,9), V(1,10), V(3,10), V(4,9), V(4,7), V(3,6), V(1,6), V(0,7), M(4,6),
V(4,13) },
{ M(4,7), V(3,6), V(1,6), V(0,7), V(0,9), V(1,10), V(3,10), V(4,9), V(4,8), V(0,8) },
{ M(2,6), V(2,12), V(3,13), V(4,13), V(5,12), M(0,11), V(4,11) },
{ M(4,9), V(3,10), V(1,10), V(0,9), V(0,7), V(1,6), V(3,6), V(4,7), M(4,10), V(4,5),
V(3,4), V(1,4), V(0,5) },
{ V(0,13), M(0,9), V(1,10), V(3,10), V(4,9), V(4,6) },
{ M(3,12), V(3,11), M(3,10), V(3,7), V(4,6), V(5,6) },
{ M(3,12), V(3,11), M(3,10), V(3,5), V(2,4), V(1,3) },
{ V(0,13), M(0,8), V(2,10), M(0,8), V(2,6) },
{ M(2,6), V(2,13) },
{ V(0,10), M(0,9), V(1,10), V(2,10), V(3,9), V(3,6), M(3,9), V(4,10), V(5,10), V(6,9),
V(6,6) },
{ V(0,10), M(0,9), V(1,10), V(2,10), V(3,9), V(3,6) },
{ M(0,7), V(0,9), V(1,10), V(3,10), V(4,9), V(4,7), V(3,6), V(1,6), V(0,7) },
{ M(0,4), V(0,10), M(0,9), V(1,10), V(3,10), V(4,9), V(4,7), V(3,6), V(1,6), V(0,7) },
{ M(4,9), V(3,10), V(1,10), V(0,9), V(0,7), V(1,6), V(3,6), V(4,7), M(4,10), V(4,4) },
{ V(0,10), M(0,9), V(1,10), V(3,10), V(4,9) },
{ M(0,7), V(1,6), V(3,6), V(4,7), V(3,8), V(1,8), V(0,9), V(1,10), V(3,10), V(4,9) },
{ M(2,13), V(2,7), V(3,6), V(4,6), V(5,7), M(1,11), V(3,11) },
{ M(0,10), V(0,7), V(1,6), V(3,6), V(4,7), V(4,10), V(4,6) },
{ M(0,9), V(3,6), V(6,9) },
{ M(0,10), V(0,6), V(2,8), V(4,6), V(4,10) },
{ V(4,10), M(0,10), V(4,6) },
{ M(0,9), V(3,6), M(6,9), V(1,4), V(0,4) },
{ M(0,10), V(4,10), V(0,6), V(4,6) },
{ M(3,15), V(2,14), V(2,12), V(0,10), V(2,8), V(2,6), V(3,5) },
{ M(2,4), V(2,14) },
{ M(3,6), V(0,9), V(3,12), V(6,9), V(3,6) },
{ M(0,15), V(1,14), V(1,12), V(3,10), V(1,8), V(1,6), V(0,5) },
{ M(0,12), V(6,6) },
/* Blank */ { 0 },
/* Down */ { M(0,9), V(3,6), V(3,14), M(3,6), V(6,9) },
/* Alpha */ { M(6,6), V(3,9), V(1,9), V(0,8), V(0,7), V(1,6), V(3,6), V(6,9) },
/* Beta */ { V(2,8), V(2,13), V(3,14), V(5,14), V(6,13), V(6,12), V(5,11),
V(2,11), M(5,11), V(6,10), V(6,9), V(5,8), V(3,8), V(2,9) },
/* ^ */ { M(0,8), V(3,11), V(6,8) },
/* Not */ { M(0,10), V(6,10), V(6,7) },
/* Epsilon */ { M(3,9), V(2,10), V(1,10), V(0,9), V(0,7), V(1,6), V(2,6), V(3,7),
M(2,8), V(0,8) },
/* Pi */ { M(0,10), V(6,10), M(4,10), V(4,6), M(2,6), V(2,10) },
/* Lambda */ { V(3,9), M(0,11), V(1,11), V(6,6) },
/* ?? */ { M(0,11), V(1,12), V(2,12), V(5,9), V(5,7), V(4,6), V(3,6), V(2,7),
V(2,8), V(6,12) },
/* Delta */ { M(2,10), V(1,10), V(0,9), V(0,7), V(1,6), V(3,6), V(4,7), V(4,9),
V(3,10), V(2,10), V(2,12), V(4,12) },
/* Integ */ { M(0,7), V(1,6), V(2,6), V(3,7), V(3,12), V(4,13), V(5,13), V(6,12) },
/* PlusMinus */{ M(0,9), V(4,9), M(2,11), V(2,7), M(0,7), V(4,7) },
/* Circross */ { M(0,8), V(0,7), V(1,6), V(3,6), V(4,7), V(4,9), V(3,10), V(1,10),
V(0,9), V(0,8), V(4,8), M(2,10), V(2,6) },
/* Sigma */ { M(0,10), V(1,9), V(2,9), V(4,11), V(5,11), V(6,10), V(5,9), V(4,9),
V(2,11), V(1,11), V(0,10) },
/* Union */ { M(4,8), V(3,9), V(1,9), V(0,8), V(0,7), V(1,6), V(3,6), V(4,7),
V(4,10), V(2,12), V(1,12) },
/* Intersect */{ M(3,11), V(1,11), V(0,10), V(0,8), V(1,7), V(3,7) },
/* Cap */ { M(0,11), V(2,11), V(3,10), V(3,8), V(2,7), V(0,7) },
/* Cup */ { M(0,7), V(0,9), V(1,10), V(3,10), V(4,9), V(4,7) },
/* A */ { M(0,10), V(0,8), V(1,7), V(3,7), V(4,8), V(4,10) },
/* E */ { M(0,13), V(0,8), V(2,6), V(4,6), V(6,8), V(6,13), M(0,10), V(6,10) },
/* cx */ { V(6,6), V(6,14), V(0,14), M(2,10), V(6,10) },
{ V(4,10), M(0,10), V(4,6), M(3,6), V(1,6), V(0,7), V(0,9), V(1,10),
V(3,10), V(4,9), V(4,7), V(3,6) },
/* Dbl arrow */{ M(2,8), V(0,10), V(2,12), M(0,10), V(6,10), M(4,12), V(6,10),
V(4,8)},
/* Under */ { M(0,5), V(6,5) },
{ M(0,10), V(6,10), M(3,13), V(6,10), V(3,7) },
{ M(0,12), V(2,14), V(4,12), V(6,14) },
{ V(6,12), M(0,10), V(6,10), M(0,8), V(6,8) },
{ V(3,6), M(3,7), V(0,10), V(3,13) },
{ V(3,6), M(0,7), V(3,10), V(0,13) },
{ M(0,7), V(6,7), M(6,9), V(0,9), M(0,11), V(6,11) },
{ M(0,11), V(3,8), V(6,11) },
/* Blank */ { 0, },
/* ! */ { M(2,6), V(2,7), M(2,8), V(2,13) },
/* " */ { M(2,12), V(2,14), M(4,14), V(4,12) },
/* # */ { M(2,7), V(2,13), M(4,13), V(4,7), M(6,9), V(0,9), M(0,11), V(6,11) },
/* $ */ { M(0,8), V(2,6), V(4,6), V(6,8), V(4,10), V(2,10), V(0,12), V(2,14),
V(4,14), V(6,12), M(4,14), V(4,6), M(2,6), V(2,14) },
/* % */ { V(6,12), V(1,12), V(0,11), V(0,10), V(1,9), V(2,9), V(3,10), V(3,11),
V(2,12), M(4,9), V(3,8), V(3,7), V(4,6), V(5,6), V(6,7), V(6,8),
V(5,9), V(4,9) },
/* & */ { M(6,6), V(1,11), V(1,13), V(2,14), V(3,14), V(4,13), V(0,9), V(0,7),
V(1,6), V(3,6), V(5,8) },
/* ' */ { M(2,12), V(4,14) },
/* ( */ { M(2,6), V(0,8), V(0,12), V(2,14) },
/* ) */ { V(2,8), V(2,12), V(0,14) },
/* * */ { M(1,8), V(5,12), M(3,13), V(3,7), M(5,8), V(1,12), M(0,10),
V(6,10) },
/* + */ { M(2,7), V(2,11), M(0,9), V(4,9) },
/* , */ { M(0,7), V(1,6), V(1,5), V(0,4) },
/* - */ { M(0,9), V(4,9) },
/* . */ { M(2,6), V(3,6), V(3,7), V(2,7), V(2,6) },
/* / */ { V(6,12) },
/* 0 */ { M(0,7), V(6,13), M(6,12), V(4,14), V(2,14), V(0,12), V(0,8), V(2,6),
V(4,6), V(6,8), V(6,12) },
/* 1 */ { M(1,12), V(3,14), V(3,6) },
/* 2 */ { M(0,13), V(1,14), V(4,14), V(6,12), V(6,11), V(5,10), V(2,10),
V(0,8), V(0,6), V(6,6) },
/* 3 */ { M(0,14), V(6,14), V(6,12), V(4,10), V(5,10), V(6,9), V(6,7), V(5,6),
V(0,6) },
/* 4 */ { M(5,6), V(5,14), V(0,9), V(6,9) },
/* 5 */ { M(0,7), V(1,6), V(4,6), V(6,8), V(6,9), V(5,10), V(1,10), V(0,9),
V(0,14), V(6,14) },
/* 6 */ { M(0,9), V(1,10), V(5,10), V(6,9), V(6,7), V(5,6), V(1,6), V(0,7),
V(0,10), V(4,14) },
/* 7 */ { V(6,12), V(6,14), V(0,14) },
/* 8 */ { M(1,10), V(0,9), V(0,7), V(1,6), V(5,6), V(6,7), V(6,9), V(5,10),
V(6,11), V(6,13), V(5,14), V(1,14), V(0,13), V(0,11), V(1,10),
V(5,10) },
/* 9 */ { M(2,6), V(6,10), V(6,13), V(5,14), V(1,14), V(0,13), V(0,11),
V(1,10), V(5,10), V(6,11) },
/* : */ { M(2,6), V(3,6), V(3,7), V(2,7), V(2,6), M(2,10), V(3,10), V(3,11),
V(2,11), V(2,10) },
/* ; */ { M(2,7), V(3,6), V(3,5), V(2,4), M(2,10), V(3,10), V(3,11), V(2,11),
V(2,10) },
/* < */ { M(3,7), V(0,10), V(3,13) },
/* = */ { M(0,8), V(6,8), M(6,10), V(0,10) },
/* > */ { M(0,7), V(3,10), V(0,13) },
/* ? */ { M(0,13), V(1,14), V(2,13), V(2,12), V(1,11), V(1,8), M(1,7),
V(1,6) },
/* @ */ { M(1,6), V(0,7), V(0,11), V(1,12), V(5,12), V(6,11), V(6,8), V(5,7),
V(4,8), V(4,11), M(4,10), V(3,11), V(2,11), V(1,10), V(1,9), V(2,8),
V(3,8), V(4,9) },
/* A */ { V(0,12), V(2,14), V(4,14), V(6,12), V(6,9), V(0,9), V(6,9), V(6,6) },
/* B */ { V(0,14), V(5,14), V(6,13), V(6,11), V(5,10), V(0,10), V(5,10),
V(6,9), V(6,7), V(5,6), V(0,6) },
/* C */ { M(6,13), V(5,14), V(2,14), V(0,12), V(0,8), V(2,6), V(5,6), V(6,7) },
/* D */ { V(0,14), V(4,14), V(6,12), V(6,8), V(4,6), V(0,6) },
/* E */ { M(6,6), V(0,6), V(0,10), V(4,10), V(0,10), V(0,14), V(6,14) },
/* F */ { V(0,10), V(4,10), V(0,10), V(0,14), V(6,14) },
/* G */ { M(6,13), V(5,14), V(2,14), V(0,12), V(0,8), V(2,6), V(4,6), V(6,8),
V(6,10), V(4,10) },
/* H */ { V(0,14), V(0,10), V(6,10), V(6,14), V(6,6) },
/* I */ { M(1,6), V(5,6), V(3,6), V(3,14), V(1,14), V(5,14) },
/* J */ { M(1,9), V(1,7), V(2,6), V(3,6), V(4,7), V(4,14), V(2,14), V(6,14) },
/* K */ { V(0,14), V(0,8), V(6,14), V(2,10), V(6,6) },
/* L */ { M(0,14), V(0,6), V(6,6) },
/* M */ { V(0,14), V(3,11), V(6,14), V(6,6) },
/* N */ { V(0,14), V(0,13), V(6,7), V(6,6), V(6,14) },
/* O */ { M(0,8), V(0,12), V(2,14), V(4,14), V(6,12), V(6,8), V(4,6), V(2,6),
V(0,8) },
/* P */ { V(0,14), V(5,14), V(6,13), V(6,11), V(5,10), V(0,10) },
/* Q */ { M(0,8), V(0,12), V(2,14), V(4,14), V(6,12), V(6,8), V(4,6), V(2,6),
V(0,8), M(3,9), V(6,6) },
/* R */ { V(0,14), V(5,14), V(6,13), V(6,11), V(5,10), V(0,10), V(2,10),
V(6,6) },
/* S */ { M(0,8), V(2,6), V(4,6), V(6,8), V(4,10), V(2,10), V(0,12), V(2,14),
V(4,14), V(6,12) },
/* T */ { M(3,6), V(3,14), V(0,14), V(6,14) },
/* U */ { M(0,14), V(0,7), V(1,6), V(5,6), V(6,7), V(6,14) },
/* V */ { M(0,14), V(0,9), V(3,6), V(6,9), V(6,14) },
/* W */ { M(0,14), V(0,6), V(3,9), V(6,6), V(6,14) },
/* X */ { V(0,7), V(6,13), V(6,14), M(0,14), V(0,13), V(6,7), V(6,6) },
/* Y */ { M(0,14), V(3,11), V(6,14), V(3,11), V(3,6) },
/* Z */ { M(0,14), V(6,14), V(6,13), V(0,7), V(0,6), V(6,6) },
/* [ */ { M(3,5), V(0,5), V(0,15), V(3,15) },
/* \ */ { M(0,12), V(6,6) },
/* ] */ { M(0,5), V(3,5), V(3,15), V(0,15) },
{ M(0,11), V(3,14), V(6,11), M(3,14), V(3,6) },
{ M(3,7), V(0,10), V(3,13), M(0,10), V(6,10) },
{ M(2,14), V(4,12) },
{ M(0,9), V(1,10), V(3,10), V(4,9), V(4,6), M(4,8), V(3,9), V(1,9), V(0,8), V(0,7),
V(1,6), V(3,6), V(4,7) },
{ V(0,13), M(0,9), V(1,10), V(3,10), V(4,9), V(4,7), V(3,6), V(1,6), V(0,7) },
{ M(4,9), V(3,10), V(1,10), V(0,9), V(0,7), V(1,6), V(3,6), V(4,7) },
{ M(0,7), V(0,9), V(1,10), V(3,10), V(4,9), V(4,7), V(3,6), V(1,6), V(0,7), M(4,6),
V(4,13) },
{ M(4,7), V(3,6), V(1,6), V(0,7), V(0,9), V(1,10), V(3,10), V(4,9), V(4,8), V(0,8) },
{ M(2,6), V(2,12), V(3,13), V(4,13), V(5,12), M(0,11), V(4,11) },
{ M(4,9), V(3,10), V(1,10), V(0,9), V(0,7), V(1,6), V(3,6), V(4,7), M(4,10), V(4,5),
V(3,4), V(1,4), V(0,5) },
{ V(0,13), M(0,9), V(1,10), V(3,10), V(4,9), V(4,6) },
{ M(3,12), V(3,11), M(3,10), V(3,7), V(4,6), V(5,6) },
{ M(3,12), V(3,11), M(3,10), V(3,5), V(2,4), V(1,3) },
{ V(0,13), M(0,8), V(2,10), M(0,8), V(2,6) },
{ M(2,6), V(2,13) },
{ V(0,10), M(0,9), V(1,10), V(2,10), V(3,9), V(3,6), M(3,9), V(4,10), V(5,10), V(6,9),
V(6,6) },
{ V(0,10), M(0,9), V(1,10), V(2,10), V(3,9), V(3,6) },
{ M(0,7), V(0,9), V(1,10), V(3,10), V(4,9), V(4,7), V(3,6), V(1,6), V(0,7) },
{ M(0,4), V(0,10), M(0,9), V(1,10), V(3,10), V(4,9), V(4,7), V(3,6), V(1,6), V(0,7) },
{ M(4,9), V(3,10), V(1,10), V(0,9), V(0,7), V(1,6), V(3,6), V(4,7), M(4,10), V(4,4) },
{ V(0,10), M(0,9), V(1,10), V(3,10), V(4,9) },
{ M(0,7), V(1,6), V(3,6), V(4,7), V(3,8), V(1,8), V(0,9), V(1,10), V(3,10), V(4,9) },
{ M(2,13), V(2,7), V(3,6), V(4,6), V(5,7), M(1,11), V(3,11) },
{ M(0,10), V(0,7), V(1,6), V(3,6), V(4,7), V(4,10), V(4,6) },
{ M(0,9), V(3,6), V(6,9) },
{ M(0,10), V(0,6), V(2,8), V(4,6), V(4,10) },
{ V(4,10), M(0,10), V(4,6) },
{ M(0,9), V(3,6), M(6,9), V(1,4), V(0,4) },
{ M(0,10), V(4,10), V(0,6), V(4,6) },
{ M(3,15), V(2,14), V(2,12), V(0,10), V(2,8), V(2,6), V(3,5) },
{ M(2,4), V(2,14) },
{ M(3,6), V(0,9), V(3,12), V(6,9), V(3,6) },
{ M(0,15), V(1,14), V(1,12), V(3,10), V(1,8), V(1,6), V(0,5) },
{ M(0,12), V(6,6) },
};
float scale[] = { 1.0,
1.0, /* 128 chars per line */
1.3, /* 96 chars per line */
2.0, /* 64 chars per line */
2.5, /* 48 chars per line */
4.0, /* 32 chars per line */
5.3, /* 24 chars per line */
8.0 /* 16 chars per line */
};
uint64 iii_instr; /* Currently executing instruction */
int iii_sel; /* Select mask */
t_stat iii_devio(uint32 dev, uint64 *data);
t_stat iii_svc(UNIT *uptr);
static void draw_point(int x, int y, int b);
static void draw_line(int x1, int y1, int x2, int y2, int b);
t_stat iii_reset(DEVICE *dptr);
static void draw_point(int x, int y, int b, UNIT *uptr);
static void draw_line(int x1, int y1, int x2, int y2, int b, UNIT *uptr);
t_stat iii_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr);
const char *iii_description (DEVICE *dptr);
@ -281,7 +313,7 @@ MTAB iii_mod[] = {
DEVICE iii_dev = {
"III", iii_unit, NULL, iii_mod,
2, 10, 31, 1, 8, 8,
NULL, NULL, NULL,
NULL, NULL, iii_reset,
NULL, NULL, NULL, &iii_dib, DEV_DEBUG | DEV_DISABLE | DEV_DIS, 0, dev_debug,
NULL, NULL, &iii_help, NULL, NULL, &iii_description
};
@ -301,15 +333,18 @@ t_stat iii_devio(uint32 dev, uint64 *data) {
*data |= DATAO_LK;
if ((uptr->STATUS & RUN_FLG) == 0)
*data |= HLT_FLG;
if (uptr->STATUS & CTL_FBIT)
*data |= CONT_BIT;
if (uptr->STATUS & WRP_FBIT)
*data |= WRAP_FLG;
if (uptr->STATUS & EDG_FBIT)
*data |= EDGE_FLG;
if (uptr->STATUS & LIT_FBIT)
*data |= LIGHT_FLG;
sim_debug(DEBUG_CONI, &iii_dev, "III %03o CONI %06o\n", dev, (uint32)*data);
sim_debug(DEBUG_CONI, &iii_dev, "III %03o CONI %06o %06o\n", dev, (uint32)*data, PC);
break;
case CONO:
clr_interrupt(III_DEVNUM);
if (*data & SET_PIA)
uptr->PIA = (int)(*data&PIA_MSK);
if (*data & F)
@ -317,13 +352,17 @@ t_stat iii_devio(uint32 dev, uint64 *data) {
uptr->STATUS &= ~(017 & ((*data >> 14) ^ (*data >> 10)));
uptr->STATUS ^= (017 & (*data >> 10));
if (*data & STOP)
uptr->STATUS |= RUN_FLG;
if (*data & CONT) {
uptr->STATUS &= ~RUN_FLG;
if (*data & CONT) {
uptr->STATUS |= RUN_FLG;
iii_instr = M[uptr->MAR];
sim_activate(uptr, 10);
}
sim_debug(DEBUG_CONO, &iii_dev, "III %03o CONO %06o\n", dev, (uint32)*data);
}
if (((uptr->STATUS >> 3) & (uptr->STATUS & (WRAP_MSK|EDGE_MSK|LIGH_MSK))) != 0)
set_interrupt(III_DEVNUM, uptr->PIA);
if (uptr->STATUS & HLT_MSK)
set_interrupt(III_DEVNUM, uptr->PIA);
sim_debug(DEBUG_CONO, &iii_dev, "III %03o CONO %06o %06o\n", dev, (uint32)*data, PC);
break;
case DATAI:
sim_debug(DEBUG_DATAIO, &iii_dev, "III %03o DATAI %06o\n", dev, (uint32)*data);
@ -348,14 +387,30 @@ iii_svc (UNIT *uptr)
int A;
int ox, oy, nx, ny, br, sz;
int i, j, ch;
float ch_sz;
iii_cycle(10,0);
/* Extract X,Y,Bright and Size */
sz = (uptr->POS & CSIZE) >> CSIZE_V;
br = (uptr->POS & CBRT) >> CBRT_V;
ox = (uptr->POS & POS_X) >> POS_X_V;
oy = (uptr->POS & POS_Y) >> POS_Y_V;
nx = ox = (ox ^ 02000) - 02000;
ny = oy = (oy ^ 02000) - 02000;
ch_sz = scale[sz];
sim_debug(DEBUG_DETAIL, &iii_dev, "III: pos %d %d %d %d %o\n", ox, oy, br, sz, uptr->STATUS );
switch(iii_instr & 017) {
case 000: /* JMP and HLT */
if (iii_instr & 020) {
uptr->MAR = (iii_instr >> 18) & RMASK;
} else {
uptr->STATUS &= ~RUN_FLG;
if (uptr->STATUS & HLT_MSK)
set_interrupt(III_DEVNUM, uptr->PIA);
return SCPE_OK;
}
break;
goto skip_up;
case 001:
case 003:
case 005:
@ -364,84 +419,89 @@ iii_svc (UNIT *uptr)
case 013:
case 015:
case 017: /* Draw 4 characters */
/* Extract X,Y,Bright and Size */
sz = (uptr->POS & CSIZE) >> CSIZE_V;
br = (uptr->POS & CBRT) >> CBRT_V;
ox = (uptr->POS & POS_X) >> POS_X_V;
oy = (uptr->POS & POS_Y) >> POS_Y_V;
for (i = 29; i >= 1; i -= 7) {
/* Extract character and compute initial point */
int cx, cy;
uint8 v;
int lx, ly;
ch = (iii_instr >> i) & 0177;
cx = ox;
cy = oy + (6 * sz);
/* Scan map and draw lines as needed */
for(j = 0; j < 18; j++) {
v = map[i][j];
if (v == 0)
break;
nx = cx + (((v >> 4) & 07) * sz);
ny = cy + ((v & 017) * sz);
if (v & 0200)
draw_line(cx, cy, nx, ny, br);
cx = nx;
cy = ny;
cx = 0;
cy = (int)(6.0 * ch_sz);
lx = ox;
ly = oy + cy;
sim_debug(DEBUG_DATA, &iii_dev, "III: ch %d %d %o %o %o\n", lx, ly, ch, sz, br);
if (ch == '\r') {
ox = -512;
continue;
}
ox += 8 * sz;
if (ch == '\n') {
oy -= (int)(16.0 * ch_sz);
continue;
}
/* Scan map and draw lines as needed */
if ((iii_sel & 04000) != 0) {
for(j = 0; j < 18; j++) {
uint8 v = map[ch][j];
if (v == 0)
break;
cx = (int)((float)((v >> 4) & 07) * ch_sz);
cy = (int)((float)(v & 017) * ch_sz);
nx = ox + cx;
ny = oy + cy;
sim_debug(DEBUG_DATA, &iii_dev, "III: map %d %d %d %d %02x\n", lx, ly, nx, ny, v);
if (v & 0200)
draw_line(lx, ly, nx, ny, br, uptr);
lx = nx;
ly = ny;
}
}
ox += (int)(8.0 * ch_sz);
}
/* Repack to new position. */
uptr->POS = (POS_X & (nx << POS_X_V)) |
(POS_Y & (ny << POS_Y_V)) |
(uptr->POS & (CBRT|CSIZE));
nx = ox;
ny = oy;
break;
case 002: /* Short Vector */
/* Extract X,Y,Bright and Size */
sz = (uptr->POS & CSIZE) >> CSIZE_V;
br = (uptr->POS & CBRT) >> CBRT_V;
ox = (uptr->POS & POS_X) >> POS_X_V;
oy = (uptr->POS & POS_Y) >> POS_Y_V;
if ((iii_sel & 04000) == 0)
break;
/* Do first point */
nx = (iii_instr >> 29) & 077;
ny = (iii_instr >> 22) & 077;
nx = (iii_instr >> 26) & 077;
ny = (iii_instr >> 20) & 077;
/* Sign extend */
if (nx & 0100)
nx |= 03700;
if (ny & 0100)
ny |= 03700;
nx = (nx ^ 040) - 040;
ny = (ny ^ 040) - 040;
/* Compute relative position. */
sim_debug(DEBUG_DATA, &iii_dev, "III: short %d %d %o %d\n", nx, ny, sz, br);
nx += ox;
ny += oy;
if ((iii_instr & 010000000LL) == 0) { /* Check if visible */
if ((iii_instr & 004000000LL) == 0) { /* Draw a line */
draw_line(ox, oy, nx, ny, br);
i = (int)((iii_instr >> 18) & 3);
if ((i & 02) == 0 && (iii_sel & 04000) != 0) { /* Check if visible */
if ((i & 01) == 0) { /* Draw a line */
draw_line(ox, oy, nx, ny, br, uptr);
} else {
draw_point(nx, ny, br);
draw_point(nx, ny, br, uptr);
}
}
ox = nx;
oy = ny;
/* Do second point */
nx = (iii_instr >> 13) & 0177;
nx = (iii_instr >> 12) & 0177;
ny = (iii_instr >> 6) & 0177;
/* Sign extend */
if (nx & 0100)
nx |= 03700;
if (ny & 0100)
ny |= 03700;
nx = (nx ^ 040) - 040;
ny = (ny ^ 040) - 040;
sim_debug(DEBUG_DATA, &iii_dev, "III: short2 %d %d %o %d\n", nx, ny, sz, br);
/* Compute relative position. */
nx += ox;
ny += oy;
if ((iii_instr & 040) == 0) { /* Check if visible */
if (nx < -512 || nx > 512 || ny < -512 || ny > 512)
uptr->STATUS |= EDG_FBIT;
if ((iii_instr & 040) == 0 && (iii_sel & 04000) != 0) { /* Check if visible */
if ((iii_instr & 020) == 0) { /* Draw a line */
draw_line(ox, oy, nx, ny, br);
draw_line(ox, oy, nx, ny, br, uptr);
} else {
draw_point(nx, ny, br);
draw_point(nx, ny, br, uptr);
}
}
/* Repack to new position. */
uptr->POS = (POS_X & (nx << POS_X_V)) |
(POS_Y & (ny << POS_Y_V)) |
(uptr->POS & (CBRT|CSIZE));
break;
case 004: /* JSR, JMS, SAVE */
@ -460,48 +520,53 @@ iii_svc (UNIT *uptr)
if ((iii_instr & 030) != 030) {
uptr->MAR = A;
}
break;
goto skip_up;
case 006: /* Long Vector */
/* Extract X,Y,Bright and Size */
sz = (uptr->POS & CSIZE) >> CSIZE_V;
br = (uptr->POS & CBRT) >> CBRT_V;
ox = (uptr->POS & POS_X) >> POS_X_V;
oy = (uptr->POS & POS_Y) >> POS_Y_V;
/* Update sizes if needed */
if (((iii_instr >> 9) & CSIZE) != 0)
sz = (iii_instr >> 9) & CSIZE;
if (((iii_instr >> 12) & 7) != 0)
br = (iii_instr > 12) & 7;
if (((iii_instr >> 8) & CSIZE) != 0)
sz = (iii_instr >> 8) & CSIZE;
if (((iii_instr >> 11) & 7) != 0)
br = (iii_instr > 11) & 7;
nx = (iii_instr >> 25) & 03777;
ny = (iii_instr >> 15) & 03777;
ny = (iii_instr >> 14) & 03777;
nx = (nx ^ 02000) - 02000;
ny = (ny ^ 02000) - 02000;
sim_debug(DEBUG_DATA, &iii_dev, "III: long %d %d %o %o\n", nx, ny, sz, br);
if (nx < -512 || nx > 512 || ny < -512 || ny > 512)
uptr->STATUS |= EDG_FBIT;
if ((iii_instr & 0100) == 0) { /* Relative mode */
nx += ox;
ny += oy;
}
if ((iii_instr & 040) == 0) { /* Check if visible */
if (nx < -512 || nx > 512 || ny < -512 || ny > 512)
uptr->STATUS |= EDG_FBIT;
if ((iii_instr & 040) == 0 && (iii_sel & 04000) != 0) { /* Check if visible */
if ((iii_instr & 020) == 0) /* Draw a line */
draw_line(ox, oy, nx, ny, br);
draw_line(ox, oy, nx, ny, br, uptr);
else
draw_point(nx, ny, br);
draw_point(nx, ny, br, uptr);
}
/* Repack to new position. */
uptr->POS = (POS_X & (nx << POS_X_V)) |
(POS_Y & (ny << POS_Y_V)) |
(CBRT & (br << CBRT_V)) |
(CSIZE & (sz << CSIZE_V));
break;
case 010: /* Select instruction */
break;
i = (iii_instr >> 24) & 07777; /* Set mask */
j = (iii_instr >> 12) & 07777; /* Reset mask */
ch = i & j; /* Compliment mask */
i &= ~ch;
j &= ~ch;
iii_sel = ((iii_sel | i) & ~j) ^ ch;
goto skip_up;
case 012: /* Test instruction */
A = (uptr->STATUS & (int32)(iii_instr >> 12) & 0377) != 0;
uptr->STATUS &= ~(0377 & ((iii_instr >> 28) ^ (iii_instr >> 20)));
uptr->STATUS ^= (0377 & (iii_instr >> 20));
if (A ^ ((iii_instr & 020) != 0))
j = (int)((iii_instr >> 20) & 0377); /* set mask */
i = (int)((iii_instr >> 28) & 0377); /* Reset */
uptr->STATUS &= ~(i ^ j);
uptr->STATUS ^= j;
if (A ^ ((iii_instr & 020) != 0))
uptr->MAR++;
break;
goto skip_up;
case 014: /* Restore */
A = (iii_instr >> 18) & RMASK;
@ -513,102 +578,70 @@ iii_svc (UNIT *uptr)
if ((iii_instr & 040) != 0) {
uptr->POS = (temp >> 8) & (POS_X|POS_Y|CBRT|CSIZE);
}
break;
goto skip_up;
case 016: /* Nop */
break;
}
/* Repack to new position. */
sim_debug(DEBUG_DATA, &iii_dev, "III: update %d %d %8o ", nx, ny, uptr->POS);
uptr->POS = (POS_X & ((nx & 03777) << POS_X_V)) |
(POS_Y & ((ny & 03777) << POS_Y_V)) |
(CBRT & (br << CBRT_V)) |
(CSIZE & (sz << CSIZE_V));
sim_debug(DEBUG_DATA, &iii_dev, "-> %8o\n", uptr->POS);
skip_up:
if (uptr->STATUS & RUN_FLG) {
iii_instr = M[uptr->MAR];
sim_debug(DEBUG_DETAIL, &iii_dev, "III: fetch %06o %012llo\n", uptr->MAR, iii_instr);
uptr->MAR++;
uptr->MAR &= RMASK;
sim_activate(uptr, 10);
}
if (((uptr->STATUS >> 3) & (uptr->STATUS & (WRAP_MSK|EDGE_MSK|LIGH_MSK))) != 0)
set_interrupt(III_DEVNUM, uptr->PIA);
return SCPE_OK;
}
t_stat iii_reset (DEVICE *dptr)
{
if (dptr->flags & DEV_DIS) {
display_close(dptr);
} else {
display_reset();
dptr->units[0].POS = 0;
iii_init(dptr, 1);
}
return SCPE_OK;
}
/* Draw a point at x,y with intensity b. */
/* X and Y runs from -512 to 512. */
static void
draw_point(int x, int y, int b)
draw_point(int x, int y, int b, UNIT *uptr)
{
display_point(x, y, b, 0);
if (x < -512 || x > 512 || y < -512 || y > 512)
uptr->STATUS |= WRP_FBIT;
iii_point(x, y, b);
}
/* Draw a line between two points */
static void
draw_line(int x1, int y1, int x2, int y2, int b)
draw_line(int x1, int y1, int x2, int y2, int b, UNIT *uptr)
{
int dx, px;
int dy, py;
int i, p;
int minx, miny;
int maxx, maxy;
int dx, ax;
int dy, ay;
int i, j;
int pu, pd, ws, et;
int ipc, fpc;
dx = x1 - x2;
dy = y1 - y2;
if (x1 < 0) {
dx = -1;
px = -x1;
} else if (x1 > 0) {
dx = 1;
px = x1;
} else {
dx = 0;
px = 0;
}
if (y1 < 0) {
dy = -1;
py = -y1;
} else if (y1 > 0) {
dy = 1;
py = y1;
} else {
dy = 0;
py = 0;
}
if (dx == 0) {
/* Vertical line */
for (i = 1; i < py; i++) {
dy += dy;
draw_point(dx, dy, b);
}
} else if (dy == 0) {
/* Horizontal line */
for (i = 1; i < px; i++) {
dx += dx;
draw_point(dx, dy, b);
}
} else if (py > px) {
/* More horizontal */
p = 2 * px - py;
for (i = 1; i < py; i++) {
if (p > 0) {
dx += dx;
p += (2 * px) - (2 * py);
} else {
p += 2 * px;
}
dy += dy;
draw_point(dx, dy, b);
}
} else {
/* More vertical */
p = 2 * py - px;
for (i = 1; i < px; i++) {
if (p > 0) {
dy += dy;
p += (2 * py) - (2 * px);
} else {
p += 2 * py;
}
dx += dx;
draw_point(dx, dy, b);
}
}
if (x1 < -512 || x1 > 512 || y1 < -512 || y1 > 512)
uptr->STATUS |= WRP_FBIT;
if (x2 < -512 || x2 > 512 || y2 < -512 || y2 > 512)
uptr->STATUS |= WRP_FBIT;
iii_draw_line(x1, y1, x2, y2, b);
}
t_stat iii_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr)

View File

@ -387,7 +387,8 @@ t_stat stk_devio(uint32 dev, uint64 *data)
static t_stat stk_reset (DEVICE *dptr)
{
vid_display_kb_event_process = stk_keyboard;
if ((stk_dev.flags & DEV_DIS) == 0)
vid_display_kb_event_process = stk_keyboard;
return SCPE_OK;
}

View File

@ -431,6 +431,14 @@
RelativePath="..\display\sim_ws.c"
>
</File>
<File
RelativePath="..\display\iii.c"
>
</File>
<File
RelativePath="..\display\iii.h"
>
</File>
<File
RelativePath="..\display\type340.c"
>

View File

@ -127,6 +127,10 @@ struct color color_p29 = { p29, ELEMENTS(p29), 25000 };
static struct phosphor p31[] = {{0.0, 1.0, 0.77, 0.5, .1}};
struct color color_p31 = { p31, ELEMENTS(p31), 25000 };
/* green phosphor for III */
static struct phosphor p39[] = {{0.2, 1.0, 0.0, 0.5, 0.10}};
struct color color_p39 = { p39, ELEMENTS(p39), 25000 };
static struct phosphor p40[] = {
/* P40 blue-white spot with yellow-green decay (.045s to 10%?) */
{0.4, 0.2, 0.924, 0.5, 0.0135},
@ -241,7 +245,13 @@ static struct display displays[] = {
* 512x512, out of 800x600
* 0,0 at middle
*/
{ DIS_NG, "NG Display", &color_p31, NULL, 512, 512 }
{ DIS_NG, "NG Display", &color_p31, NULL, 512, 512 },
/*
* III display
* on PDP-10
*/
{ DIS_III, "III Display", &color_p39, NULL, 1024, 1024 }
};
/*

View File

@ -47,6 +47,7 @@ enum display_type {
DIS_VR20 = 20,
DIS_TYPE30 = 30,
DIS_VR48 = 48,
DIS_III = 111,
DIS_TYPE340 = 340,
DIS_NG = 999,
};

192
display/iii.c Normal file
View File

@ -0,0 +1,192 @@
/*
* Copyright (c) 2020 Lars Brinkhoff
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Except as contained in this notice, the names of the authors shall
* not be used in advertising or otherwise to promote the sale, use or
* other dealings in this Software without prior written authorization
* from the authors.
*/
#include "display.h" /* XY plot interface */
#include "iii.h"
#if defined(__cplusplus)
extern "C" {
#endif
int iii_init(void *dev, int debug)
{
return display_init(DIS_III, 1, dev);
}
void iii_point (int x, int y, int l)
{
display_point(x + 512, y + 512, l, 0);
}
int iii_cycle(int us, int slowdown)
{
return display_age(us, slowdown);
}
/* Draw a line between two points */
void
iii_draw_line(int x1, int y1, int x2, int y2, int l)
{
int dx, ax;
int dy, ay;
int i, j;
int pu, pd, ws, et;
int ipc, fpc;
/* Origin us to 0 */
x1 += 512;
y1 += 512;
x2 += 512;
y2 += 512;
/* Always draw top to bottom */
if (y1 > y2) {
int temp;
temp = y1;
y1 = y2;
y2 = temp;
temp = x1;
x1 = x2;
x2 = temp;
}
/* Figure out distances */
dx = x2 - x1;
dy = y2 - y1;
/* Figure out whether we're going left or right */
if (dx < 0) {
ax = -1;
dx = -dx;
} else {
ax = 1;
}
/* Vertical line */
if (dx == 0) {
for (i = 1; i < dy; i++) {
display_point(x1, y1, l, 0);
y1++;
}
return;
}
/* Horizontal line */
if (dy == 0) {
for (i = 1; i < dx; i++) {
display_point(x1, y1, l, 0);
x1+=ax;
}
return;
}
/* Diagnonal line */
if (dx == dy) {
for (i = 1; i < dx; i++) {
display_point(x1, y1, l, 0);
x1 += ax;
y1 ++;
}
return;
}
/* Determine whether the line is X or Y major */
if (dx >= dy) {
/* X major line */
ws = dx / dy;
/* Adjust for each y by 1 step */
pu = (dx % dy) * 2;
/* Overrun error */
pd = dy * 2;
et = (dx % dy) - (dy * 2);
ipc = (ws / 2) + 1;
fpc = ipc;
if ((pu == 0) && (ws & 1) == 0)
ipc--;
if ((ws & 1) != 0)
et += dy;
/* Draw run in x direction */
for (j = 0; j < ipc; j++) {
display_point(x1, y1, l, 0);
x1 += ax;
}
y1++;
/* Draw rest */
for (i = 0; i< (dy-1); i++) {
int rl = ws;
if ((et += pu) > 0) {
rl++;
et -= pd;
}
for (j = 0; j < rl; j++) {
display_point(x1, y1, l, 0);
x1 += ax;
}
y1++;
}
for (j = 0; j < fpc; j++) {
display_point(x1, y1, l, 0);
x1 += ax;
}
} else {
ws = dy / dx;
pu = (dy % dx) * 2;
pd = dx * 2;
et = (dy % dx) - (dx * 2);
ipc = (ws / 2) + 1;
fpc = ipc;
if ((pu == 0) && ((ws & 1) == 0))
ipc--;
if ((ws & 1) != 0)
et += dx;
/* Draw run in y direction */
for (j = 0; j < ipc; j++) {
display_point(x1, y1, l, 0);
y1 ++;
}
x1 += ax;
/* Draw rest */
for (i = 0; i< (dx-1); i++) {
int rl = ws;
if ((et += pu) > 0) {
rl++;
et -= pd;
}
for (j = 0; j < rl; j++) {
display_point(x1, y1, l, 0);
y1 ++;
}
x1 += ax;
}
for (j = 0; j < fpc; j++) {
display_point(x1, y1, l, 0);
y1 ++;
}
}
}
#if defined(__cplusplus)
}
#endif

38
display/iii.h Normal file
View File

@ -0,0 +1,38 @@
/*
* Copyright (c) 2020 Lars Brinkhoff
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Except as contained in this notice, the names of the authors shall
* not be used in advertising or otherwise to promote the sale, use or
* other dealings in this Software without prior written authorization
* from the authors.
*/
#if defined(__cplusplus)
extern "C" {
#endif
extern int iii_init(void *, int);
extern int iii_cycle(int, int);
extern void iii_point(int, int, int);
extern void iii_draw_line(int x1, int y1, int x2, int y2, int l);
#if defined(__cplusplus)
}
#endif

View File

@ -587,6 +587,7 @@ ifeq (${WIN32},) #*nix Environments (&& cygwin)
DISPLAYVT = ${DISPLAYD}/vt11.c
DISPLAY340 = ${DISPLAYD}/type340.c
DISPLAYNG = ${DISPLAYD}/ng.c
DISPLAYIII = ${DISPLAYD}/iii.c
DISPLAY_OPT += -DUSE_DISPLAY $(VIDEO_CCDEFS) $(VIDEO_LDFLAGS)
$(info using libSDL2: $(call find_include,SDL2/SDL))
ifeq (Darwin,$(OSTYPE))
@ -612,6 +613,7 @@ ifeq (${WIN32},) #*nix Environments (&& cygwin)
DISPLAYVT = ${DISPLAYD}/vt11.c
DISPLAY340 = ${DISPLAYD}/type340.c
DISPLAYNG = ${DISPLAYD}/ng.c
DISPLAYIII = ${DISPLAYD}/iii.c
DISPLAY_OPT += -DUSE_DISPLAY $(VIDEO_CCDEFS) $(VIDEO_LDFLAGS)
$(info using libSDL: $(call find_include,SDL/SDL))
ifeq (Darwin,$(OSTYPE))
@ -2029,7 +2031,8 @@ KA10 = ${KA10D}/kx10_cpu.c ${KA10D}/kx10_sys.c ${KA10D}/kx10_df.c \
$(KA10D)/ka10_pmp.c ${KA10D}/ka10_dkb.c ${KA10D}/pdp6_dct.c \
${KA10D}/pdp6_dtc.c ${KA10D}/pdp6_mtc.c ${KA10D}/pdp6_dsk.c \
${KA10D}/pdp6_dcs.c ${KA10D}/ka10_dpk.c ${KA10D}/kx10_dpy.c \
${PDP10D}/ka10_ai.c ${KA10D}/ka10_iii.c ${DISPLAYL} ${DISPLAY340}
${PDP10D}/ka10_ai.c ${KA10D}/ka10_iii.c ${DISPLAYL} ${DISPLAY340} \
${DISPLAYIII}
KA10_OPT = -DKA=1 -DUSE_INT64 -I ${KA10D} -DUSE_SIM_CARD ${NETWORK_OPT} ${DISPLAY_OPT} ${KA10_DISPLAY_OPT}
ifneq (${PANDA_LIGHTS},)
# ONLY for Panda display.