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:
Mark Pizzolato 2014-05-16 12:46:08 -07:00
parent f4771affe7
commit c0f9c2e86c
4 changed files with 72 additions and 33 deletions

View file

@ -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);

View file

@ -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)

View file

@ -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;
} }

View file

@ -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);