PDP11, VAX: Better support for various positioning operations which different OS drivers use. Fix to properly record/tolerate skip n records reaching a tape mark. Fix to #139
This commit is contained in:
parent
f4771affe7
commit
c0f9c2e86c
4 changed files with 72 additions and 33 deletions
|
@ -524,15 +524,19 @@ MTAB tq_mod[] = {
|
||||||
#define DBG_REG 0x0004 /* trace read/write registers */
|
#define DBG_REG 0x0004 /* trace read/write registers */
|
||||||
#define DBG_REQ 0x0008 /* display transfer requests */
|
#define DBG_REQ 0x0008 /* display transfer requests */
|
||||||
#define DBG_TAP 0x0010 /* display sim_tape activities */
|
#define DBG_TAP 0x0010 /* display sim_tape activities */
|
||||||
#define DBG_DAT 0x0020 /* display transfer data */
|
#define DBG_STR MTSE_DBG_STR /* display tape structure detail */
|
||||||
|
#define DBG_POS MTSE_DBG_POS /* display position activities */
|
||||||
|
#define DBG_DAT MTSE_DBG_DAT /* display transfer data */
|
||||||
|
|
||||||
DEBTAB tq_debug[] = {
|
DEBTAB tq_debug[] = {
|
||||||
{"TRACE", DBG_TRC},
|
{"TRACE", DBG_TRC, "trace routine calls"},
|
||||||
{"INIT", DBG_INI},
|
{"INIT", DBG_INI, "display setup/init sequence info"},
|
||||||
{"REG", DBG_REG},
|
{"REG", DBG_REG, "trace read/write registers"},
|
||||||
{"REQ", DBG_REQ},
|
{"REQ", DBG_REQ, "display transfer requests"},
|
||||||
{"TAPE", DBG_TAP},
|
{"TAPE", DBG_TAP, "display sim_tape activities"},
|
||||||
{"DATA", DBG_DAT},
|
{"STR", DBG_STR, "display tape structure detail"},
|
||||||
|
{"POS", DBG_POS, "display position activities"},
|
||||||
|
{"DATA", DBG_DAT, "display transfer data"},
|
||||||
{0}
|
{0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1468,7 +1472,7 @@ switch (cmd) { /* case on command */
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
res->sts = tq_map_status (uptr, res->io_status);
|
res->sts = tq_map_status (uptr, res->io_status);
|
||||||
if ((res->io_status != MTSE_OK) && (res->io_status != MTSE_BOT) && (res->io_status != MTSE_LEOT))
|
if ((res->io_status != MTSE_OK) && (res->io_status != MTSE_TMK) && (res->io_status != MTSE_BOT) && (res->io_status != MTSE_LEOT))
|
||||||
return tq_mot_err (uptr, 0); /* log, end */
|
return tq_mot_err (uptr, 0); /* log, end */
|
||||||
sim_debug (DBG_REQ, &tq_dev, "Position Done: mdf=0x%04X, nrec=%d, ntmk=%d, skrec=%d, sktmk=%d, skobj=%d\n",
|
sim_debug (DBG_REQ, &tq_dev, "Position Done: mdf=0x%04X, nrec=%d, ntmk=%d, skrec=%d, sktmk=%d, skobj=%d\n",
|
||||||
mdf, nrec, ntmk, res->skrec, res->sktmk, res->objupd);
|
mdf, nrec, ntmk, res->skrec, res->sktmk, res->objupd);
|
||||||
|
|
|
@ -637,6 +637,7 @@ struct sim_brktab {
|
||||||
struct sim_debtab {
|
struct sim_debtab {
|
||||||
char *name; /* control name */
|
char *name; /* control name */
|
||||||
uint32 mask; /* control bit */
|
uint32 mask; /* control bit */
|
||||||
|
char *desc; /* description */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEBUG_PRS(d) (sim_deb && d.dctrl)
|
#define DEBUG_PRS(d) (sim_deb && d.dctrl)
|
||||||
|
|
78
sim_tape.c
78
sim_tape.c
|
@ -607,11 +607,13 @@ if (ctx->dptr->dctrl & reason) {
|
||||||
|
|
||||||
t_stat sim_tape_rdlntf (UNIT *uptr, t_mtrlnt *bc)
|
t_stat sim_tape_rdlntf (UNIT *uptr, t_mtrlnt *bc)
|
||||||
{
|
{
|
||||||
|
struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx;
|
||||||
uint8 c;
|
uint8 c;
|
||||||
t_bool all_eof;
|
t_bool all_eof;
|
||||||
uint32 f = MT_GET_FMT (uptr);
|
uint32 f = MT_GET_FMT (uptr);
|
||||||
t_mtrlnt sbc;
|
t_mtrlnt sbc;
|
||||||
t_tpclnt tpcbc;
|
t_tpclnt tpcbc;
|
||||||
|
t_stat r = MTSE_OK;
|
||||||
|
|
||||||
MT_CLR_PNU (uptr);
|
MT_CLR_PNU (uptr);
|
||||||
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
|
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
|
||||||
|
@ -629,11 +631,14 @@ switch (f) { /* switch on fmt */
|
||||||
}
|
}
|
||||||
if (feof (uptr->fileref) || (*bc == MTR_EOM)) { /* eof or eom? */
|
if (feof (uptr->fileref) || (*bc == MTR_EOM)) { /* eof or eom? */
|
||||||
MT_SET_PNU (uptr); /* pos not upd */
|
MT_SET_PNU (uptr); /* pos not upd */
|
||||||
return MTSE_EOM;
|
r = MTSE_EOM;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
uptr->pos = uptr->pos + sizeof (t_mtrlnt); /* spc over rec lnt */
|
uptr->pos = uptr->pos + sizeof (t_mtrlnt); /* spc over rec lnt */
|
||||||
if (*bc == MTR_TMK) /* tape mark? */
|
if (*bc == MTR_TMK) { /* tape mark? */
|
||||||
return MTSE_TMK;
|
r = MTSE_TMK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (*bc == MTR_FHGAP) { /* half gap? */
|
if (*bc == MTR_FHGAP) { /* half gap? */
|
||||||
uptr->pos = uptr->pos + sizeof (t_mtrlnt) / 2; /* half space fwd */
|
uptr->pos = uptr->pos + sizeof (t_mtrlnt) / 2; /* half space fwd */
|
||||||
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* resync */
|
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* resync */
|
||||||
|
@ -654,11 +659,12 @@ switch (f) { /* switch on fmt */
|
||||||
}
|
}
|
||||||
if (feof (uptr->fileref)) { /* eof? */
|
if (feof (uptr->fileref)) { /* eof? */
|
||||||
MT_SET_PNU (uptr); /* pos not upd */
|
MT_SET_PNU (uptr); /* pos not upd */
|
||||||
return MTSE_EOM;
|
r = MTSE_EOM;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
uptr->pos = uptr->pos + sizeof (t_tpclnt); /* spc over reclnt */
|
uptr->pos = uptr->pos + sizeof (t_tpclnt); /* spc over reclnt */
|
||||||
if (tpcbc == TPC_TMK) /* tape mark? */
|
if (tpcbc == TPC_TMK) /* tape mark? */
|
||||||
return MTSE_TMK;
|
r = MTSE_TMK;
|
||||||
uptr->pos = uptr->pos + ((tpcbc + 1) & ~1); /* spc over record */
|
uptr->pos = uptr->pos + ((tpcbc + 1) & ~1); /* spc over record */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -683,14 +689,14 @@ switch (f) { /* switch on fmt */
|
||||||
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */
|
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */
|
||||||
uptr->pos = uptr->pos + sbc; /* spc over record */
|
uptr->pos = uptr->pos + sbc; /* spc over record */
|
||||||
if (all_eof) /* tape mark? */
|
if (all_eof) /* tape mark? */
|
||||||
return MTSE_TMK;
|
r = MTSE_TMK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return MTSE_FMT;
|
return MTSE_FMT;
|
||||||
}
|
}
|
||||||
|
sim_debug (MTSE_DBG_STR, ctx->dptr, "rd_lnt: st: %d, lnt: %d, pos: %d\n", r, *bc, uptr->pos);
|
||||||
return MTSE_OK;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read record length reverse (internal routine)
|
/* Read record length reverse (internal routine)
|
||||||
|
@ -716,12 +722,14 @@ return MTSE_OK;
|
||||||
|
|
||||||
t_stat sim_tape_rdlntr (UNIT *uptr, t_mtrlnt *bc)
|
t_stat sim_tape_rdlntr (UNIT *uptr, t_mtrlnt *bc)
|
||||||
{
|
{
|
||||||
|
struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx;
|
||||||
uint8 c;
|
uint8 c;
|
||||||
t_bool all_eof;
|
t_bool all_eof;
|
||||||
uint32 f = MT_GET_FMT (uptr);
|
uint32 f = MT_GET_FMT (uptr);
|
||||||
t_addr ppos;
|
t_addr ppos;
|
||||||
t_mtrlnt sbc;
|
t_mtrlnt sbc;
|
||||||
t_tpclnt tpcbc;
|
t_tpclnt tpcbc;
|
||||||
|
t_stat r = MTSE_OK;
|
||||||
|
|
||||||
MT_CLR_PNU (uptr);
|
MT_CLR_PNU (uptr);
|
||||||
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
|
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
|
||||||
|
@ -737,13 +745,19 @@ switch (f) { /* switch on fmt */
|
||||||
sbc = MTR_L (*bc);
|
sbc = MTR_L (*bc);
|
||||||
if (ferror (uptr->fileref)) /* error? */
|
if (ferror (uptr->fileref)) /* error? */
|
||||||
return sim_tape_ioerr (uptr);
|
return sim_tape_ioerr (uptr);
|
||||||
if (feof (uptr->fileref)) /* eof? */
|
if (feof (uptr->fileref)) { /* eof? */
|
||||||
return MTSE_EOM;
|
r = MTSE_EOM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
uptr->pos = uptr->pos - sizeof (t_mtrlnt); /* spc over rec lnt */
|
uptr->pos = uptr->pos - sizeof (t_mtrlnt); /* spc over rec lnt */
|
||||||
if (*bc == MTR_EOM) /* eom? */
|
if (*bc == MTR_EOM) { /* eom? */
|
||||||
return MTSE_EOM;
|
r = MTSE_EOM;
|
||||||
if (*bc == MTR_TMK) /* tape mark? */
|
break;
|
||||||
|
}
|
||||||
|
if (*bc == MTR_TMK) { /* tape mark? */
|
||||||
return MTSE_TMK;
|
return MTSE_TMK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if ((*bc & MTR_M_RHGAP) == MTR_RHGAP) { /* half gap? */
|
if ((*bc & MTR_M_RHGAP) == MTR_RHGAP) { /* half gap? */
|
||||||
uptr->pos = uptr->pos + sizeof (t_mtrlnt) / 2; /* half space rev */
|
uptr->pos = uptr->pos + sizeof (t_mtrlnt) / 2; /* half space rev */
|
||||||
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* resync */
|
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* resync */
|
||||||
|
@ -753,8 +767,10 @@ switch (f) { /* switch on fmt */
|
||||||
((f == MTUF_F_STD)? ((sbc + 1) & ~1): sbc);
|
((f == MTUF_F_STD)? ((sbc + 1) & ~1): sbc);
|
||||||
sim_fseek (uptr->fileref, uptr->pos + sizeof (t_mtrlnt), SEEK_SET);
|
sim_fseek (uptr->fileref, uptr->pos + sizeof (t_mtrlnt), SEEK_SET);
|
||||||
}
|
}
|
||||||
else if (sim_tape_bot (uptr)) /* backed into BOT? */
|
else if (sim_tape_bot (uptr)) { /* backed into BOT? */
|
||||||
return MTSE_BOT;
|
r = MTSE_BOT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
while ((*bc == MTR_GAP) || (*bc == MTR_RHGAP));
|
while ((*bc == MTR_GAP) || (*bc == MTR_RHGAP));
|
||||||
break;
|
break;
|
||||||
|
@ -766,11 +782,15 @@ switch (f) { /* switch on fmt */
|
||||||
*bc = tpcbc; /* save rec lnt */
|
*bc = tpcbc; /* save rec lnt */
|
||||||
if (ferror (uptr->fileref)) /* error? */
|
if (ferror (uptr->fileref)) /* error? */
|
||||||
return sim_tape_ioerr (uptr);
|
return sim_tape_ioerr (uptr);
|
||||||
if (feof (uptr->fileref)) /* eof? */
|
if (feof (uptr->fileref)) { /* eof? */
|
||||||
return MTSE_EOM;
|
r = MTSE_EOM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
uptr->pos = ppos; /* spc over record */
|
uptr->pos = ppos; /* spc over record */
|
||||||
if (*bc == MTR_TMK) /* tape mark? */
|
if (*bc == MTR_TMK) { /* tape mark? */
|
||||||
return MTSE_TMK;
|
r = MTSE_TMK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
sim_fseek (uptr->fileref, uptr->pos + sizeof (t_tpclnt), SEEK_SET);
|
sim_fseek (uptr->fileref, uptr->pos + sizeof (t_tpclnt), SEEK_SET);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -780,8 +800,10 @@ switch (f) { /* switch on fmt */
|
||||||
sim_fread (&c, sizeof (uint8), 1, uptr->fileref);
|
sim_fread (&c, sizeof (uint8), 1, uptr->fileref);
|
||||||
if (ferror (uptr->fileref)) /* error? */
|
if (ferror (uptr->fileref)) /* error? */
|
||||||
return sim_tape_ioerr (uptr);
|
return sim_tape_ioerr (uptr);
|
||||||
if (feof (uptr->fileref)) /* eof? */
|
if (feof (uptr->fileref)) { /* eof? */
|
||||||
return MTSE_EOM;
|
r = MTSE_EOM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if ((c & P7B_DPAR) != P7B_EOF)
|
if ((c & P7B_DPAR) != P7B_EOF)
|
||||||
all_eof = 0;
|
all_eof = 0;
|
||||||
if (c & P7B_SOR) /* start of record? */
|
if (c & P7B_SOR) /* start of record? */
|
||||||
|
@ -791,14 +813,14 @@ switch (f) { /* switch on fmt */
|
||||||
*bc = sbc; /* save rec lnt */
|
*bc = sbc; /* save rec lnt */
|
||||||
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */
|
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */
|
||||||
if (all_eof) /* tape mark? */
|
if (all_eof) /* tape mark? */
|
||||||
return MTSE_TMK;
|
r = MTSE_TMK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return MTSE_FMT;
|
return MTSE_FMT;
|
||||||
}
|
}
|
||||||
|
sim_debug (MTSE_DBG_STR, ctx->dptr, "rd_lnt: st: %d, lnt: %d, pos: %d\n", r, *bc, uptr->pos);
|
||||||
return MTSE_OK;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read record forward
|
/* Read record forward
|
||||||
|
@ -851,6 +873,7 @@ for ( ; i < rbc; i++) /* fill with 0's */
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if (f == MTUF_F_P7B) /* p7b? strip SOR */
|
if (f == MTUF_F_P7B) /* p7b? strip SOR */
|
||||||
buf[0] = buf[0] & P7B_DPAR;
|
buf[0] = buf[0] & P7B_DPAR;
|
||||||
|
sim_tape_data_trace(uptr, buf, rbc, "Record Read", ctx->dptr->dctrl & MTSE_DBG_DAT, MTSE_DBG_STR);
|
||||||
return (MTR_F (tbc)? MTSE_RECE: MTSE_OK);
|
return (MTR_F (tbc)? MTSE_RECE: MTSE_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -907,6 +930,7 @@ for ( ; i < rbc; i++) /* fill with 0's */
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if (f == MTUF_F_P7B) /* p7b? strip SOR */
|
if (f == MTUF_F_P7B) /* p7b? strip SOR */
|
||||||
buf[0] = buf[0] & P7B_DPAR;
|
buf[0] = buf[0] & P7B_DPAR;
|
||||||
|
sim_tape_data_trace(uptr, buf, rbc, "Record Read Reverse", ctx->dptr->dctrl & MTSE_DBG_DAT, MTSE_DBG_STR);
|
||||||
return (MTR_F (tbc)? MTSE_RECE: MTSE_OK);
|
return (MTR_F (tbc)? MTSE_RECE: MTSE_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -944,6 +968,7 @@ t_mtrlnt sbc;
|
||||||
|
|
||||||
sim_debug (ctx->dbit, ctx->dptr, "sim_tape_wrrecf(unit=%d, buf=%p, bc=%d)\n", uptr-ctx->dptr->units, buf, bc);
|
sim_debug (ctx->dbit, ctx->dptr, "sim_tape_wrrecf(unit=%d, buf=%p, bc=%d)\n", uptr-ctx->dptr->units, buf, bc);
|
||||||
|
|
||||||
|
sim_tape_data_trace(uptr, buf, bc, "Record Write", ctx->dptr->dctrl & MTSE_DBG_DAT, MTSE_DBG_STR);
|
||||||
MT_CLR_PNU (uptr);
|
MT_CLR_PNU (uptr);
|
||||||
sbc = MTR_L (bc);
|
sbc = MTR_L (bc);
|
||||||
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
|
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
|
||||||
|
@ -979,7 +1004,7 @@ switch (f) { /* case on format */
|
||||||
uptr->pos = uptr->pos + sbc; /* move tape */
|
uptr->pos = uptr->pos + sbc; /* move tape */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
sim_tape_data_trace(uptr, buf, sbc, "Record Written", ctx->dptr->dctrl & MTSE_DBG_DAT, MTSE_DBG_STR);
|
||||||
return MTSE_OK;
|
return MTSE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -996,6 +1021,8 @@ return r;
|
||||||
|
|
||||||
t_stat sim_tape_wrdata (UNIT *uptr, uint32 dat)
|
t_stat sim_tape_wrdata (UNIT *uptr, uint32 dat)
|
||||||
{
|
{
|
||||||
|
struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx;
|
||||||
|
|
||||||
MT_CLR_PNU (uptr);
|
MT_CLR_PNU (uptr);
|
||||||
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
|
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
|
||||||
return MTSE_UNATT;
|
return MTSE_UNATT;
|
||||||
|
@ -1007,6 +1034,7 @@ if (ferror (uptr->fileref)) { /* error? */
|
||||||
MT_SET_PNU (uptr);
|
MT_SET_PNU (uptr);
|
||||||
return sim_tape_ioerr (uptr);
|
return sim_tape_ioerr (uptr);
|
||||||
}
|
}
|
||||||
|
sim_debug (MTSE_DBG_STR, ctx->dptr, "wr_lnt: lnt: %d, pos: %d\n", dat, uptr->pos);
|
||||||
uptr->pos = uptr->pos + sizeof (t_mtrlnt); /* move tape */
|
uptr->pos = uptr->pos + sizeof (t_mtrlnt); /* move tape */
|
||||||
return MTSE_OK;
|
return MTSE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,6 +119,12 @@ typedef uint16 t_tpclnt; /* magtape rec lnt */
|
||||||
|
|
||||||
typedef void (*TAPE_PCALLBACK)(UNIT *unit, t_stat status);
|
typedef void (*TAPE_PCALLBACK)(UNIT *unit, t_stat status);
|
||||||
|
|
||||||
|
/* Tape Internal Debug flags */
|
||||||
|
|
||||||
|
#define MTSE_DBG_DAT 0x0400000 /* Debug Data */
|
||||||
|
#define MTSE_DBG_POS 0x0800000 /* Debug Positioning activities */
|
||||||
|
#define MTSE_DBG_STR 0x1000000 /* Debug Tape Structure */
|
||||||
|
|
||||||
/* Prototypes */
|
/* Prototypes */
|
||||||
|
|
||||||
t_stat sim_tape_attach_ex (UNIT *uptr, char *cptr, uint32 dbit, int completion_delay);
|
t_stat sim_tape_attach_ex (UNIT *uptr, char *cptr, uint32 dbit, int completion_delay);
|
||||||
|
|
Loading…
Add table
Reference in a new issue