1
0
mirror of https://github.com/open-simh/simh.git synced 2026-05-20 04:50:56 +00:00

PDP18b: Add Type 34 display.

This commit is contained in:
Lars Brinkhoff
2026-04-29 10:26:52 +02:00
committed by rms47
parent 9deb11417e
commit ead27b6d9b

View File

@@ -1,6 +1,6 @@
/* pdp18b_dpy.c: PDP-7 Type 340 interface
/* pdp18b_dpy.c: PDP-7 Type 34 and Type 340 interface
Copyright (c) 2019, Lars Brinkhoff
Copyright (c) 2019, 2026, Lars Brinkhoff
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
@@ -38,6 +38,11 @@
#define DBG_IOT 001 /* IOT instructions. */
#define DBG_IRQ 002 /* Interrupts. */
#define DBG_INS 004 /* 340 instructions. */
#define DBG_PLT 010 /* Points plotted. */
#define UNIT_V_TYPE34 (UNIT_V_UF + 0) /* Type 34 */
#define UNIT_TYPE34 (1 << UNIT_V_TYPE34)
#define TYPE34 (dpy_unit[0].flags & UNIT_TYPE34)
/*
* Number of microseconds between svc calls. Used to age display and
@@ -63,11 +68,18 @@ DEBTAB dpy_deb[] = {
{ "IOT", DBG_IOT },
{ "IRQ", DBG_IRQ },
{ "INS", DBG_INS },
{ "PLT", DBG_PLT },
{ NULL, 0 }
};
MTAB dpy_mod[] = {
{ UNIT_TYPE34, UNIT_TYPE34, "Type 34", "TYPE34", NULL },
{ UNIT_TYPE34, 0, "Type 340", "TYPE340", NULL },
{ 0 }
};
DEVICE dpy_dev = {
"DPY", dpy_unit, NULL, NULL,
"DPY", dpy_unit, NULL, dpy_mod,
1, 8, 12, 1, 8, 18,
NULL, NULL, &dpy_reset,
NULL, NULL, NULL,
@@ -75,11 +87,14 @@ DEVICE dpy_dev = {
dpy_deb, NULL, NULL
};
static uint16 dpy_x, dpy_y, dpy_i;
t_stat dpy_svc (UNIT *uptr)
{
sim_activate_after(uptr, DPY_CYCLE_US);
display_age(DPY_CYCLE_US, 0);
ty340_cycle();
if (!TYPE34)
ty340_cycle();
return SCPE_OK;
}
@@ -95,7 +110,10 @@ t_stat dpy_reset (DEVICE *dptr)
display_reset();
ty340_reset(dptr);
}
sim_cancel (&dpy_unit[0]);
if (TYPE34)
sim_activate_abs (dpy_unit, 0);
else
sim_cancel (&dpy_unit[0]);
return SCPE_OK;
}
@@ -132,18 +150,34 @@ int32 dpy05 (int32 dev, int32 pulse, int32 dat)
{
sim_debug(DBG_IOT, &dpy_dev, "7005%02o, %06o\n", pulse, dat);
if (pulse & 001) {
if ((pulse & 001) != 0 && !TYPE34) {
if (ty340_sense(ST340_VEDGE))
dat |= IOT_SKP;
}
if (pulse & 002) {
dat |= ty340_get_dac();
if (TYPE34) {
sim_debug(DBG_IOT, &dpy_dev, "Clear X\n");
dpy_x = 0;
} else {
dat |= ty340_get_dac();
}
}
if (pulse & 004) {
ty340_clear (ST340_LPHIT);
sim_activate_abs (dpy_unit, 0);
if (TYPE34) {
dpy_x |= dat & 01777;
sim_debug(DBG_IOT, &dpy_dev, "Set X to %04o\n", dpy_x);
} else {
ty340_clear (ST340_LPHIT);
sim_activate_abs (dpy_unit, 0);
}
}
if ((pulse & 040) != 0 && TYPE34) {
sim_debug(DBG_PLT, &dpy_dev, "Plot %04o,%04o intensity %o\n",
dpy_x, dpy_y, dpy_i);
display_point (dpy_x, dpy_y, (dpy_i * DISPLAY_INT_MAX) / 7, 0);
}
return dat;
@@ -153,20 +187,36 @@ int32 dpy06 (int32 dev, int32 pulse, int32 dat)
{
sim_debug(DBG_IOT, &dpy_dev, "7006%02o, %06o\n", pulse, dat);
if (pulse & 001) {
if ((pulse & 001) != 0 && !TYPE34) {
if (ty340_sense(ST340_STOPPED))
dat |= IOT_SKP;
}
if (pulse & 002) {
ty340_set_dac (0);
if (TYPE34) {
sim_debug(DBG_IOT, &dpy_dev, "Clear Y\n");
dpy_y = 0;
} else {
ty340_set_dac (0);
}
}
if (pulse & 004) {
if ((pulse & 010) == 0)
ty340_set_dac (dat & 07777);
ty340_clear (ST340_STOPPED|ST340_STOP_INT);
sim_activate_abs (dpy_unit, 0);
if (TYPE34) {
dpy_y |= dat & 01777;
sim_debug(DBG_IOT, &dpy_dev, "Set Y to %04o\n", dpy_y);
} else {
if ((pulse & 010) == 0)
ty340_set_dac (dat & 07777);
ty340_clear (ST340_STOPPED|ST340_STOP_INT);
sim_activate_abs (dpy_unit, 0);
}
}
if ((pulse & 040) != 0 && TYPE34) {
sim_debug(DBG_PLT, &dpy_dev, "Plot %04o,%04o intensity %o\n",
dpy_x, dpy_y, dpy_i);
display_point (dpy_x, dpy_y, (dpy_i * DISPLAY_INT_MAX) / 7, 0);
}
return dat;
@@ -176,6 +226,15 @@ int32 dpy07 (int32 dev, int32 pulse, int32 dat)
{
sim_debug(DBG_IOT, &dpy_dev, "7007%02o, %06o\n", pulse, dat);
if (TYPE34) {
if (dat & 4)
dpy_i = 7 - (dat & 7);
else
dpy_i = (dat & 3) + 4;
sim_debug(DBG_IOT, &dpy_dev, "Set intensity to %06o\n", dpy_i);
return dat;
}
if (pulse & 001) {
if (ty340_sense(ST340_LPHIT))
dat |= IOT_SKP;
@@ -196,6 +255,9 @@ int32 dpy10 (int32 dev, int32 pulse, int32 dat)
{
sim_debug(DBG_IOT, &dpy_dev, "7010%02o, %06o\n", pulse, dat);
if (TYPE34)
return dat;
if (pulse & 001) {
if (ty340_sense(ST340_HEDGE))
dat |= IOT_SKP;