mirror of
https://github.com/simh/simh.git
synced 2026-04-26 03:57:11 +00:00
Notes For V3.5-0
The source set has been extensively overhauled. For correct viewing, set Visual C++ or Emacs to have tab stops every 4 characters. 1. New Features in 3.4-1 1.1 All Ethernet devices - Added Windows user-defined adapter names (from Timothe Litt) 1.2 Interdata, SDS, HP, PDP-8, PDP-18b terminal multiplexors - Added support for SET <unit>n DISCONNECT 1.3 VAX - Added latent QDSS support - Revised autoconfigure to handle QDSS 1.4 PDP-11 - Revised autoconfigure to handle more casees 2. Bugs Fixed in 3.4-1 2.1 SCP and libraries - Trim trailing spaces on all input (for example, attach file names) - Fixed sim_sock spurious SIGPIPE error in Unix/Linux - Fixed sim_tape misallocation of TPC map array for 64b simulators 2.2 1401 - Fixed bug, CPU reset was clearing SSB through SSG 2.3 PDP-11 - Fixed bug in VH vector display routine - Fixed XU runt packet processing (found by Tim Chapman) 2.4 Interdata - Fixed bug in SHOW PAS CONN/STATS - Fixed potential integer overflow exception in divide 2.5 SDS - Fixed bug in SHOW MUX CONN/STATS 2.6 HP - Fixed bug in SHOW MUX CONN/STATS 2.7 PDP-8 - Fixed bug in SHOW TTIX CONN/STATS - Fixed bug in SET/SHOW TTOXn LOG 2.8 PDP-18b - Fixed bug in SHOW TTIX CONN/STATS - Fixed bug in SET/SHOW TTOXn LOG 2.9 Nova, Eclipse - Fixed potential integer overflow exception in divide
This commit is contained in:
committed by
Mark Pizzolato
parent
ec60bbf329
commit
b7c1eae41f
162
PDP11/pdp11_lp.c
162
PDP11/pdp11_lp.c
@@ -1,6 +1,6 @@
|
||||
/* pdp11_lp.c: PDP-11 line printer simulator
|
||||
|
||||
Copyright (c) 1993-2004, Robert M Supnik
|
||||
Copyright (c) 1993-2005, Robert M Supnik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
@@ -19,41 +19,41 @@
|
||||
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 name of Robert M Supnik shall not
|
||||
be used in advertising or otherwise to promote the sale, use or other dealings
|
||||
Except as contained in this notice, the name of Robert M Supnik shall not be
|
||||
used in advertising or otherwise to promote the sale, use or other dealings
|
||||
in this Software without prior written authorization from Robert M Supnik.
|
||||
|
||||
lpt LP11 line printer
|
||||
lpt LP11 line printer
|
||||
|
||||
19-May-03 RMS Revised for new conditional compilation scheme
|
||||
25-Apr-03 RMS Revised for extended file support
|
||||
29-Sep-02 RMS Added vector change/display support
|
||||
New data structures
|
||||
30-May-02 RMS Widened POS to 32b
|
||||
06-Jan-02 RMS Added enable/disable support
|
||||
09-Nov-01 RMS Added VAX support
|
||||
07-Sep-01 RMS Revised interrupt mechanism
|
||||
30-Oct-00 RMS Standardized register naming
|
||||
07-Jul-05 RMS Removed extraneous externs
|
||||
19-May-03 RMS Revised for new conditional compilation scheme
|
||||
25-Apr-03 RMS Revised for extended file support
|
||||
29-Sep-02 RMS Added vector change/display support
|
||||
New data structures
|
||||
30-May-02 RMS Widened POS to 32b
|
||||
06-Jan-02 RMS Added enable/disable support
|
||||
09-Nov-01 RMS Added VAX support
|
||||
07-Sep-01 RMS Revised interrupt mechanism
|
||||
30-Oct-00 RMS Standardized register naming
|
||||
*/
|
||||
|
||||
#if defined (VM_PDP10) /* PDP10 version */
|
||||
#if defined (VM_PDP10) /* PDP10 version */
|
||||
#error "LP11 is not supported on the PDP-10!"
|
||||
|
||||
#elif defined (VM_VAX) /* VAX version */
|
||||
#elif defined (VM_VAX) /* VAX version */
|
||||
#include "vax_defs.h"
|
||||
|
||||
#else /* PDP-11 version */
|
||||
#else /* PDP-11 version */
|
||||
#include "pdp11_defs.h"
|
||||
#endif
|
||||
|
||||
#define LPTCSR_IMP (CSR_ERR + CSR_DONE + CSR_IE) /* implemented */
|
||||
#define LPTCSR_RW (CSR_IE) /* read/write */
|
||||
#define LPTCSR_IMP (CSR_ERR + CSR_DONE + CSR_IE) /* implemented */
|
||||
#define LPTCSR_RW (CSR_IE) /* read/write */
|
||||
|
||||
extern int32 int_req[IPL_HLVL];
|
||||
extern int32 int_vec[IPL_HLVL][32];
|
||||
|
||||
int32 lpt_csr = 0; /* control/status */
|
||||
int32 lpt_stopioe = 0; /* stop on error */
|
||||
int32 lpt_csr = 0; /* control/status */
|
||||
int32 lpt_stopioe = 0; /* stop on error */
|
||||
|
||||
DEVICE lpt_dev;
|
||||
t_stat lpt_rd (int32 *data, int32 PA, int32 access);
|
||||
@@ -65,76 +65,85 @@ t_stat lpt_detach (UNIT *uptr);
|
||||
|
||||
/* LPT data structures
|
||||
|
||||
lpt_dev LPT device descriptor
|
||||
lpt_unit LPT unit descriptor
|
||||
lpt_reg LPT register list
|
||||
lpt_dev LPT device descriptor
|
||||
lpt_unit LPT unit descriptor
|
||||
lpt_reg LPT register list
|
||||
*/
|
||||
|
||||
DIB lpt_dib = { IOBA_LPT, IOLN_LPT, &lpt_rd, &lpt_wr,
|
||||
1, IVCL (LPT), VEC_LPT, { NULL } };
|
||||
DIB lpt_dib = {
|
||||
IOBA_LPT, IOLN_LPT, &lpt_rd, &lpt_wr,
|
||||
1, IVCL (LPT), VEC_LPT, { NULL }
|
||||
};
|
||||
|
||||
UNIT lpt_unit = {
|
||||
UDATA (&lpt_svc, UNIT_SEQ+UNIT_ATTABLE, 0), SERIAL_OUT_WAIT };
|
||||
UDATA (&lpt_svc, UNIT_SEQ+UNIT_ATTABLE, 0), SERIAL_OUT_WAIT
|
||||
};
|
||||
|
||||
REG lpt_reg[] = {
|
||||
{ GRDATA (BUF, lpt_unit.buf, DEV_RDX, 8, 0) },
|
||||
{ GRDATA (CSR, lpt_csr, DEV_RDX, 16, 0) },
|
||||
{ FLDATA (INT, IREQ (LPT), INT_V_LPT) },
|
||||
{ FLDATA (ERR, lpt_csr, CSR_V_ERR) },
|
||||
{ FLDATA (DONE, lpt_csr, CSR_V_DONE) },
|
||||
{ FLDATA (IE, lpt_csr, CSR_V_IE) },
|
||||
{ DRDATA (POS, lpt_unit.pos, T_ADDR_W), PV_LEFT },
|
||||
{ DRDATA (TIME, lpt_unit.wait, 24), PV_LEFT },
|
||||
{ FLDATA (STOP_IOE, lpt_stopioe, 0) },
|
||||
{ GRDATA (DEVADDR, lpt_dib.ba, DEV_RDX, 32, 0), REG_HRO },
|
||||
{ GRDATA (DEVVEC, lpt_dib.vec, DEV_RDX, 16, 0), REG_HRO },
|
||||
{ NULL } };
|
||||
{ GRDATA (BUF, lpt_unit.buf, DEV_RDX, 8, 0) },
|
||||
{ GRDATA (CSR, lpt_csr, DEV_RDX, 16, 0) },
|
||||
{ FLDATA (INT, IREQ (LPT), INT_V_LPT) },
|
||||
{ FLDATA (ERR, lpt_csr, CSR_V_ERR) },
|
||||
{ FLDATA (DONE, lpt_csr, CSR_V_DONE) },
|
||||
{ FLDATA (IE, lpt_csr, CSR_V_IE) },
|
||||
{ DRDATA (POS, lpt_unit.pos, T_ADDR_W), PV_LEFT },
|
||||
{ DRDATA (TIME, lpt_unit.wait, 24), PV_LEFT },
|
||||
{ FLDATA (STOP_IOE, lpt_stopioe, 0) },
|
||||
{ GRDATA (DEVADDR, lpt_dib.ba, DEV_RDX, 32, 0), REG_HRO },
|
||||
{ GRDATA (DEVVEC, lpt_dib.vec, DEV_RDX, 16, 0), REG_HRO },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
MTAB lpt_mod[] = {
|
||||
{ MTAB_XTD|MTAB_VDV, 004, "ADDRESS", "ADDRESS",
|
||||
&set_addr, &show_addr, NULL },
|
||||
{ MTAB_XTD|MTAB_VDV, 0, "VECTOR", "VECTOR",
|
||||
&set_vec, &show_vec, NULL },
|
||||
{ 0 } };
|
||||
{ MTAB_XTD|MTAB_VDV, 004, "ADDRESS", "ADDRESS",
|
||||
&set_addr, &show_addr, NULL },
|
||||
{ MTAB_XTD|MTAB_VDV, 0, "VECTOR", "VECTOR",
|
||||
&set_vec, &show_vec, NULL },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
DEVICE lpt_dev = {
|
||||
"LPT", &lpt_unit, lpt_reg, lpt_mod,
|
||||
1, 10, 31, 1, DEV_RDX, 8,
|
||||
NULL, NULL, &lpt_reset,
|
||||
NULL, &lpt_attach, &lpt_detach,
|
||||
&lpt_dib, DEV_DISABLE | DEV_UBUS | DEV_QBUS };
|
||||
|
||||
"LPT", &lpt_unit, lpt_reg, lpt_mod,
|
||||
1, 10, 31, 1, DEV_RDX, 8,
|
||||
NULL, NULL, &lpt_reset,
|
||||
NULL, &lpt_attach, &lpt_detach,
|
||||
&lpt_dib, DEV_DISABLE | DEV_UBUS | DEV_QBUS
|
||||
};
|
||||
|
||||
/* Line printer routines
|
||||
|
||||
lpt_rd I/O page read
|
||||
lpt_wr I/O page write
|
||||
lpt_svc process event (printer ready)
|
||||
lpt_reset process reset
|
||||
lpt_attach process attach
|
||||
lpt_detach process detach
|
||||
lpt_rd I/O page read
|
||||
lpt_wr I/O page write
|
||||
lpt_svc process event (printer ready)
|
||||
lpt_reset process reset
|
||||
lpt_attach process attach
|
||||
lpt_detach process detach
|
||||
*/
|
||||
|
||||
t_stat lpt_rd (int32 *data, int32 PA, int32 access)
|
||||
{
|
||||
if ((PA & 02) == 0) *data = lpt_csr & LPTCSR_IMP; /* csr */
|
||||
else *data = lpt_unit.buf; /* buffer */
|
||||
if ((PA & 02) == 0) *data = lpt_csr & LPTCSR_IMP; /* csr */
|
||||
else *data = lpt_unit.buf; /* buffer */
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
t_stat lpt_wr (int32 data, int32 PA, int32 access)
|
||||
{
|
||||
if ((PA & 02) == 0) { /* csr */
|
||||
if (PA & 1) return SCPE_OK;
|
||||
if ((data & CSR_IE) == 0) CLR_INT (LPT);
|
||||
else if ((lpt_csr & (CSR_DONE + CSR_IE)) == CSR_DONE)
|
||||
SET_INT (LPT);
|
||||
lpt_csr = (lpt_csr & ~LPTCSR_RW) | (data & LPTCSR_RW); }
|
||||
else { if ((PA & 1) == 0) lpt_unit.buf = data & 0177; /* buffer */
|
||||
lpt_csr = lpt_csr & ~CSR_DONE;
|
||||
CLR_INT (LPT);
|
||||
if ((lpt_unit.buf == 015) || (lpt_unit.buf == 014) ||
|
||||
(lpt_unit.buf == 012)) sim_activate (&lpt_unit, lpt_unit.wait);
|
||||
else sim_activate (&lpt_unit, 0); }
|
||||
if ((PA & 02) == 0) { /* csr */
|
||||
if (PA & 1) return SCPE_OK;
|
||||
if ((data & CSR_IE) == 0) CLR_INT (LPT);
|
||||
else if ((lpt_csr & (CSR_DONE + CSR_IE)) == CSR_DONE)
|
||||
SET_INT (LPT);
|
||||
lpt_csr = (lpt_csr & ~LPTCSR_RW) | (data & LPTCSR_RW);
|
||||
}
|
||||
else {
|
||||
if ((PA & 1) == 0) lpt_unit.buf = data & 0177; /* buffer */
|
||||
lpt_csr = lpt_csr & ~CSR_DONE;
|
||||
CLR_INT (LPT);
|
||||
if ((lpt_unit.buf == 015) || (lpt_unit.buf == 014) ||
|
||||
(lpt_unit.buf == 012)) sim_activate (&lpt_unit, lpt_unit.wait);
|
||||
else sim_activate (&lpt_unit, 0);
|
||||
}
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
@@ -143,23 +152,24 @@ t_stat lpt_svc (UNIT *uptr)
|
||||
lpt_csr = lpt_csr | CSR_ERR | CSR_DONE;
|
||||
if (lpt_csr & CSR_IE) SET_INT (LPT);
|
||||
if ((lpt_unit.flags & UNIT_ATT) == 0)
|
||||
return IORETURN (lpt_stopioe, SCPE_UNATT);
|
||||
return IORETURN (lpt_stopioe, SCPE_UNATT);
|
||||
if (putc (lpt_unit.buf & 0177, lpt_unit.fileref) == EOF) {
|
||||
perror ("LPT I/O error");
|
||||
clearerr (lpt_unit.fileref);
|
||||
return SCPE_IOERR; }
|
||||
perror ("LPT I/O error");
|
||||
clearerr (lpt_unit.fileref);
|
||||
return SCPE_IOERR;
|
||||
}
|
||||
lpt_csr = lpt_csr & ~CSR_ERR;
|
||||
lpt_unit.pos = lpt_unit.pos + 1;
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
|
||||
t_stat lpt_reset (DEVICE *dptr)
|
||||
{
|
||||
lpt_unit.buf = 0;
|
||||
lpt_csr = CSR_DONE;
|
||||
if ((lpt_unit.flags & UNIT_ATT) == 0) lpt_csr = lpt_csr | CSR_ERR;
|
||||
CLR_INT (LPT);
|
||||
sim_cancel (&lpt_unit); /* deactivate unit */
|
||||
sim_cancel (&lpt_unit); /* deactivate unit */
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user