mirror of
https://github.com/simh/simh.git
synced 2026-05-02 06:15:23 +00:00
Notes For V3.0-0
Because some key files have changed, V3.0 should be unzipped to a clean directory. 1. New Features in 3.0-0 1.1 SCP and Libraries - Added ASSIGN/DEASSIGN (logical name) commands. - Changed RESTORE to unconditionally detach files. - Added E11 and TPC format support to magtape library. - Fixed bug in SHOW CONNECTIONS. - Added USE_ADDR64 support 1.2 All magtapes - Magtapes support SIMH format, E11 format, and TPC format (read only). - SET <tape_unit> FORMAT=format sets the specified tape unit's format. - SHOW <tape_unit> FORMAT displays the specified tape unit's format. - Tape format can also be set as part of the ATTACH command, using the -F switch. 1.3 VAX - VAX can be compiled without USE_INT64. - If compiled with USE_INT64 and USE_ADDR64, RQ and TQ controllers support files > 2GB. - VAX ROM has speed control (SET ROM DELAY/NODELAY). 2. Bugs Fixed in 3.01-0 2.1 VAX - Fixed CVTfi bug: integer overflow not set if exponent out of range - Fixed EMODx bugs: o First and second operands reversed o Separated fraction received wrong exponent o Overflow calculation on separated integer incorrect o Fraction not set to zero if exponent out of range - Fixed interval timer and ROM access to pass power-up self-test even on very fast host processors (fixes from Mark Pizzolato). 2.2 1401 - Fixed mnemonic, instruction lengths, and reverse scan length check bug for MCS. - Fixed MCE bug, BS off by 1 if zero suppress. - Fixed chaining bug, D lost if return to SCP. - Fixed H branch, branch occurs after continue. - Added check for invalid 8 character MCW, LCA. - Fixed magtape load-mode end of record response. 2.3 Nova - Fixed DSK variable size interaction with restore. 2.4 PDP-1 - Fixed DT variable size interaction with restore. 2.5 PDP-11 - Fixed DT variable size interaction with restore. - Fixed bug in MMR1 update (found by Tim Stark). - Added XQ features and fixed bugs: o Corrected XQ interrupts on IE state transition (code by Tom Evans). o Added XQ interrupt clear on soft reset. o Removed XQ interrupt when setting XL or RL (multiple people). o Added SET/SHOW XQ STATS. o Added SHOW XQ FILTERS. o Added ability to split received packet into multiple buffers. o Added explicit runt and giant packet processing. 2.6 PDP-18B - Fixed DT, RF variable size interaction with restore. - Fixed MT bug in MTTR. 2.7 PDP-8 - Fixed DT, DF, RF, RX variable size interaction with restore. - Fixed MT bug in SKTR. 2.8 HP2100 - Fixed bug in DP (13210A controller only), DQ read status. - Fixed bug in DP, DQ seek complete. 2.9 GRI - Fixed bug in SC queue pointer management. 3. New Features in 3.0 vs prior releases N/A 4. Bugs Fixed in 3.0 vs prior releases N/A 5. General Notes WARNING: The RESTORE command has changed. RESTORE will now detach an attached file on a unit, if that unit did not have an attached file in the saved configuration. This is required to assure that the unit flags and the file state are consistent. WARNING: The compilation scheme for the PDP-10, PDP-11, and VAX has changed. Use one of the supplied build files, or read the documentation carefully, before compiling any of these simulators.
This commit is contained in:
committed by
Mark Pizzolato
parent
43385c9616
commit
4ffd3be790
@@ -1,4 +1,4 @@
|
||||
/* pdp11_tq.c: TQK50 tape controller simulator
|
||||
/* pdp11_tq.c: TMSCP tape controller simulator
|
||||
|
||||
Copyright (c) 2002-2003, Robert M Supnik
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
|
||||
tq TQK50 tape controller
|
||||
|
||||
19-May-03 RMS Revised for new conditional compilation scheme
|
||||
25-Apr-03 RMS Revised for extended file support
|
||||
28-Mar-03 RMS Added multiformat support
|
||||
28-Feb-03 RMS Added variable controller, user-defined drive support
|
||||
26-Feb-03 RMS Fixed bug in vector calculation for VAXen
|
||||
22-Feb-03 RMS Fixed ordering bug in queue process
|
||||
@@ -33,15 +36,18 @@
|
||||
17-Oct-02 RMS Fixed bug in read reverse (found by Hans Pufal)
|
||||
*/
|
||||
|
||||
#if defined (USE_INT64)
|
||||
#include "vax_defs.h"
|
||||
#define VM_VAX 1
|
||||
#define TQ_RDX 16
|
||||
#if defined (VM_PDP10) /* PDP10 version */
|
||||
#error "TQK50 not supported on PDP-10!"
|
||||
|
||||
#else
|
||||
#elif defined (VM_VAX) /* VAX version */
|
||||
#include "vax_defs.h"
|
||||
extern int32 int_req[IPL_HLVL];
|
||||
extern int32 int_vec[IPL_HLVL][32];
|
||||
|
||||
#else /* PDP-11 version */
|
||||
#include "pdp11_defs.h"
|
||||
#define VM_PDP11 1
|
||||
#define TQ_RDX 8
|
||||
extern int32 int_req[IPL_HLVL];
|
||||
extern int32 int_vec[IPL_HLVL][32];
|
||||
extern int32 cpu_18b, cpu_ubm;
|
||||
#endif
|
||||
|
||||
@@ -167,6 +173,7 @@ struct tqpkt {
|
||||
#define TQU_FMT (TF_CTP|TF_CTP_LO) /* menu */
|
||||
#define TQU_MINC 30 /* min cap MB */
|
||||
#define TQU_MAXC 2000 /* max cap MB */
|
||||
#define TQU_EMAXC 2000000000 /* ext max cap MB */
|
||||
|
||||
#define TQ_DRV(d) \
|
||||
d##_UQPM, \
|
||||
@@ -180,7 +187,7 @@ struct drvtyp {
|
||||
uint32 cmod; /* ctrl model */
|
||||
uint32 med; /* MSCP media */
|
||||
uint32 fmt; /* flags */
|
||||
uint32 cap; /* capacity */
|
||||
t_addr cap; /* capacity */
|
||||
uint32 umod; /* unit model */
|
||||
uint32 cver;
|
||||
uint32 fver;
|
||||
@@ -202,6 +209,7 @@ extern int32 tmr_poll, clk_tps;
|
||||
extern int32 cpu_log;
|
||||
extern UNIT cpu_unit;
|
||||
extern FILE *sim_log;
|
||||
extern uint32 sim_taddr_64;
|
||||
|
||||
uint8 *tqxb = NULL; /* xfer buffer */
|
||||
uint32 tq_sa = 0; /* status, addr */
|
||||
@@ -353,28 +361,28 @@ UNIT tq_unit[] = {
|
||||
#define TQ_QUEUE (TQ_TIMER + 1)
|
||||
|
||||
REG tq_reg[] = {
|
||||
{ GRDATA (SA, tq_sa, TQ_RDX, 16, 0) },
|
||||
{ GRDATA (SAW, tq_saw, TQ_RDX, 16, 0) },
|
||||
{ GRDATA (S1DAT, tq_s1dat, TQ_RDX, 16, 0) },
|
||||
{ GRDATA (CQBA, tq_cq.ba, TQ_RDX, 22, 0) },
|
||||
{ GRDATA (CQLNT, tq_cq.lnt, TQ_RDX, 8, 2), REG_NZ },
|
||||
{ GRDATA (CQIDX, tq_cq.idx, TQ_RDX, 8, 2) },
|
||||
{ GRDATA (TQBA, tq_rq.ba, TQ_RDX, 22, 0) },
|
||||
{ GRDATA (TQLNT, tq_rq.lnt, TQ_RDX, 8, 2), REG_NZ },
|
||||
{ GRDATA (TQIDX, tq_rq.idx, TQ_RDX, 8, 2) },
|
||||
{ GRDATA (SA, tq_sa, DEV_RDX, 16, 0) },
|
||||
{ GRDATA (SAW, tq_saw, DEV_RDX, 16, 0) },
|
||||
{ GRDATA (S1DAT, tq_s1dat, DEV_RDX, 16, 0) },
|
||||
{ GRDATA (CQBA, tq_cq.ba, DEV_RDX, 22, 0) },
|
||||
{ GRDATA (CQLNT, tq_cq.lnt, DEV_RDX, 8, 2), REG_NZ },
|
||||
{ GRDATA (CQIDX, tq_cq.idx, DEV_RDX, 8, 2) },
|
||||
{ GRDATA (TQBA, tq_rq.ba, DEV_RDX, 22, 0) },
|
||||
{ GRDATA (TQLNT, tq_rq.lnt, DEV_RDX, 8, 2), REG_NZ },
|
||||
{ GRDATA (TQIDX, tq_rq.idx, DEV_RDX, 8, 2) },
|
||||
{ DRDATA (FREE, tq_freq, 5) },
|
||||
{ DRDATA (RESP, tq_rspq, 5) },
|
||||
{ DRDATA (PBSY, tq_pbsy, 5) },
|
||||
{ GRDATA (CFLGS, tq_cflgs, TQ_RDX, 16, 0) },
|
||||
{ GRDATA (CSTA, tq_csta, TQ_RDX, 4, 0) },
|
||||
{ GRDATA (PERR, tq_perr, TQ_RDX, 9, 0) },
|
||||
{ GRDATA (CFLGS, tq_cflgs, DEV_RDX, 16, 0) },
|
||||
{ GRDATA (CSTA, tq_csta, DEV_RDX, 4, 0) },
|
||||
{ GRDATA (PERR, tq_perr, DEV_RDX, 9, 0) },
|
||||
{ DRDATA (CRED, tq_credits, 5) },
|
||||
{ DRDATA (HAT, tq_hat, 17) },
|
||||
{ DRDATA (HTMO, tq_htmo, 17) },
|
||||
{ URDATA (CPKT, tq_unit[0].cpkt, 10, 5, 0, TQ_NUMDR, 0) },
|
||||
{ URDATA (PKTQ, tq_unit[0].pktq, 10, 5, 0, TQ_NUMDR, 0) },
|
||||
{ URDATA (UFLG, tq_unit[0].uf, TQ_RDX, 16, 0, TQ_NUMDR, 0) },
|
||||
{ URDATA (POS, tq_unit[0].pos, 10, 32, 0, TQ_NUMDR, 0) },
|
||||
{ URDATA (UFLG, tq_unit[0].uf, DEV_RDX, 16, 0, TQ_NUMDR, 0) },
|
||||
{ URDATA (POS, tq_unit[0].pos, 10, T_ADDR_W, 0, TQ_NUMDR, 0) },
|
||||
{ URDATA (OBJP, tq_unit[0].objp, 10, 32, 0, TQ_NUMDR, 0) },
|
||||
{ FLDATA (PRGI, tq_prgi, 0), REG_HIDDEN },
|
||||
{ FLDATA (PIP, tq_pip, 0), REG_HIDDEN },
|
||||
@@ -383,11 +391,11 @@ REG tq_reg[] = {
|
||||
{ DRDATA (I4TIME, tq_itime4, 24), PV_LEFT + REG_NZ },
|
||||
{ DRDATA (QTIME, tq_qtime, 24), PV_LEFT + REG_NZ },
|
||||
{ DRDATA (XTIME, tq_xtime, 24), PV_LEFT + REG_NZ },
|
||||
{ BRDATA (PKTS, tq_pkt, TQ_RDX, 16, TQ_NPKTS * (TQ_PKT_SIZE_W + 1)) },
|
||||
{ BRDATA (PKTS, tq_pkt, DEV_RDX, 16, TQ_NPKTS * (TQ_PKT_SIZE_W + 1)) },
|
||||
{ DRDATA (DEVTYPE, tq_typ, 2), REG_HRO },
|
||||
{ DRDATA (DEVCAP, drv_tab[TQU_TYPE].cap, 31), REG_HRO },
|
||||
{ GRDATA (DEVADDR, tq_dib.ba, TQ_RDX, 32, 0), REG_HRO },
|
||||
{ GRDATA (DEVVEC, tq_dib.vec, TQ_RDX, 16, 0), REG_HRO },
|
||||
{ DRDATA (DEVCAP, drv_tab[TQU_TYPE].cap, T_ADDR_W), PV_LEFT | REG_HRO },
|
||||
{ GRDATA (DEVADDR, tq_dib.ba, DEV_RDX, 32, 0), REG_HRO },
|
||||
{ GRDATA (DEVVEC, tq_dib.vec, DEV_RDX, 16, 0), REG_HRO },
|
||||
{ NULL } };
|
||||
|
||||
MTAB tq_mod[] = {
|
||||
@@ -415,6 +423,8 @@ MTAB tq_mod[] = {
|
||||
NULL, &tq_show_ctrl, NULL },
|
||||
{ MTAB_XTD | MTAB_VUN | MTAB_NMO, 0, "UNITQ", NULL,
|
||||
NULL, &tq_show_unitq, NULL },
|
||||
{ MTAB_XTD|MTAB_VUN, 0, "FORMAT", "FORMAT",
|
||||
&sim_tape_set_fmt, &sim_tape_show_fmt, NULL },
|
||||
#if defined (VM_PDP11)
|
||||
{ MTAB_XTD|MTAB_VDV, 004, "ADDRESS", "ADDRESS",
|
||||
&set_addr, &show_addr, NULL },
|
||||
@@ -428,7 +438,7 @@ MTAB tq_mod[] = {
|
||||
|
||||
DEVICE tq_dev = {
|
||||
"TQ", tq_unit, tq_reg, tq_mod,
|
||||
TQ_NUMDR + 2, 10, 31, 1, TQ_RDX, 8,
|
||||
TQ_NUMDR + 2, 10, 31, 1, DEV_RDX, 8,
|
||||
NULL, NULL, &tq_reset,
|
||||
&tq_boot, &tq_attach, &tq_detach,
|
||||
&tq_dib, DEV_DISABLE | DEV_UBUS | DEV_QBUS };
|
||||
@@ -478,7 +488,7 @@ return SCPE_OK;
|
||||
t_bool tq_step4 (void)
|
||||
{
|
||||
int32 i, lnt;
|
||||
t_addr base;
|
||||
uint32 base;
|
||||
uint16 zero[SA_COMM_MAX >> 1];
|
||||
|
||||
tq_rq.ioff = SA_COMM_RI; /* set intr offset */
|
||||
@@ -1246,7 +1256,7 @@ uint32 st, skrec;
|
||||
|
||||
*skipped = 0;
|
||||
while (*skipped < cnt) { /* loop */
|
||||
st = tq_spacef (uptr, INT_MAX, &skrec, TRUE); /* rec spc fwd */
|
||||
st = tq_spacef (uptr, 0x7FFFFFFF, &skrec, TRUE);/* rec spc fwd */
|
||||
if (st == ST_TMK) *skipped = *skipped + 1; /* count files */
|
||||
else if (st != ST_SUC) return st; }
|
||||
return ST_SUC;
|
||||
@@ -1274,7 +1284,7 @@ uint32 st, skrec;
|
||||
|
||||
*skipped = 0;
|
||||
while (*skipped < cnt) { /* loopo */
|
||||
st = tq_spacer (uptr, INT_MAX, &skrec, TRUE); /* rec spc rev */
|
||||
st = tq_spacer (uptr, 0x7FFFFFFF, &skrec, TRUE);/* rec spc rev */
|
||||
if (st == ST_TMK) *skipped = *skipped + 1; /* tape mark? */
|
||||
else if (st != 0) return st; } /* error? */
|
||||
return ST_SUC;
|
||||
@@ -1459,8 +1469,7 @@ return;
|
||||
|
||||
t_bool tq_getpkt (int32 *pkt)
|
||||
{
|
||||
uint32 desc;
|
||||
t_addr addr;
|
||||
uint32 addr, desc;
|
||||
|
||||
if (!tq_getdesc (&tq_cq, &desc)) return ERR; /* get cmd desc */
|
||||
if ((desc & UQ_DESC_OWN) == 0) { /* none */
|
||||
@@ -1481,8 +1490,7 @@ return tq_putdesc (&tq_cq, desc); /* release desc */
|
||||
|
||||
t_bool tq_putpkt (int32 pkt, t_bool qt)
|
||||
{
|
||||
uint32 desc, lnt, cr;
|
||||
t_addr addr;
|
||||
uint32 addr, desc, lnt, cr;
|
||||
|
||||
if (pkt == 0) return OK; /* any packet? */
|
||||
if (DBG_LOG (LOG_TQ)) {
|
||||
@@ -1517,7 +1525,7 @@ return tq_putdesc (&tq_rq, desc); /* release desc */
|
||||
|
||||
t_bool tq_getdesc (struct uq_ring *ring, uint32 *desc)
|
||||
{
|
||||
t_addr addr = ring->ba + ring->idx;
|
||||
uint32 addr = ring->ba + ring->idx;
|
||||
uint16 d[2];
|
||||
|
||||
if (Map_ReadW (addr, 4, d, MAP)) /* fetch desc */
|
||||
@@ -1535,7 +1543,7 @@ return OK;
|
||||
t_bool tq_putdesc (struct uq_ring *ring, uint32 desc)
|
||||
{
|
||||
uint32 prvd, newd = (desc & ~UQ_DESC_OWN) | UQ_DESC_F;
|
||||
t_addr prva, addr = ring->ba + ring->idx;
|
||||
uint32 prva, addr = ring->ba + ring->idx;
|
||||
uint16 d[2];
|
||||
|
||||
d[0] = newd & 0xFFFF; /* 32b to 16b */
|
||||
@@ -1638,7 +1646,7 @@ return;
|
||||
|
||||
void tq_ring_int (struct uq_ring *ring)
|
||||
{
|
||||
t_addr iadr = tq_comm + ring->ioff; /* addr intr wd */
|
||||
uint32 iadr = tq_comm + ring->ioff; /* addr intr wd */
|
||||
uint16 flag = 1;
|
||||
|
||||
Map_WriteW (iadr, 2, &flag, MAP); /* write flag */
|
||||
@@ -1976,7 +1984,8 @@ return SCPE_OK;
|
||||
|
||||
tq_set_type (UNIT *uptr, int32 val, char *cptr, void *desc)
|
||||
{
|
||||
int32 i, cap;
|
||||
uint32 i, cap;
|
||||
uint32 max = sim_taddr_64? TQU_EMAXC: TQU_MAXC;
|
||||
t_stat r;
|
||||
|
||||
if ((val < 0) || (val > TQU_TYPE) || ((val != TQU_TYPE) && cptr))
|
||||
@@ -1984,9 +1993,9 @@ if ((val < 0) || (val > TQU_TYPE) || ((val != TQU_TYPE) && cptr))
|
||||
for (i = 0; i < TQ_NUMDR; i++) {
|
||||
if (tq_unit[i].flags & UNIT_ATT) return SCPE_ALATT; }
|
||||
if (cptr) {
|
||||
cap = (int32) get_uint (cptr, 10, TQU_MAXC, &r);
|
||||
cap = (uint32) get_uint (cptr, 10, max, &r);
|
||||
if ((r != SCPE_OK) || (cap < TQU_MINC)) return SCPE_ARG;
|
||||
drv_tab[TQU_TYPE].cap = cap << 20; }
|
||||
drv_tab[TQU_TYPE].cap = ((t_addr) cap) << 20; }
|
||||
tq_typ = val;
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user