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_REQ 0x0008 /* display transfer requests */
#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[] = {
{"TRACE", DBG_TRC},
{"INIT", DBG_INI},
{"REG", DBG_REG},
{"REQ", DBG_REQ},
{"TAPE", DBG_TAP},
{"DATA", DBG_DAT},
{"TRACE", DBG_TRC, "trace routine calls"},
{"INIT", DBG_INI, "display setup/init sequence info"},
{"REG", DBG_REG, "trace read/write registers"},
{"REQ", DBG_REQ, "display transfer requests"},
{"TAPE", DBG_TAP, "display sim_tape activities"},
{"STR", DBG_STR, "display tape structure detail"},
{"POS", DBG_POS, "display position activities"},
{"DATA", DBG_DAT, "display transfer data"},
{0}
};
@ -1468,7 +1472,7 @@ switch (cmd) { /* case on command */
return SCPE_OK;
}
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 */
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);

View file

@ -637,6 +637,7 @@ struct sim_brktab {
struct sim_debtab {
char *name; /* control name */
uint32 mask; /* control bit */
char *desc; /* description */
};
#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)
{
struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx;
uint8 c;
t_bool all_eof;
uint32 f = MT_GET_FMT (uptr);
t_mtrlnt sbc;
t_tpclnt tpcbc;
t_stat r = MTSE_OK;
MT_CLR_PNU (uptr);
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? */
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 */
if (*bc == MTR_TMK) /* tape mark? */
return MTSE_TMK;
if (*bc == MTR_TMK) { /* tape mark? */
r = MTSE_TMK;
break;
}
if (*bc == MTR_FHGAP) { /* half gap? */
uptr->pos = uptr->pos + sizeof (t_mtrlnt) / 2; /* half space fwd */
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* resync */
@ -654,11 +659,12 @@ switch (f) { /* switch on fmt */
}
if (feof (uptr->fileref)) { /* eof? */
MT_SET_PNU (uptr); /* pos not upd */
return MTSE_EOM;
r = MTSE_EOM;
break;
}
uptr->pos = uptr->pos + sizeof (t_tpclnt); /* spc over reclnt */
if (tpcbc == TPC_TMK) /* tape mark? */
return MTSE_TMK;
r = MTSE_TMK;
uptr->pos = uptr->pos + ((tpcbc + 1) & ~1); /* spc over record */
break;
@ -683,14 +689,14 @@ switch (f) { /* switch on fmt */
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */
uptr->pos = uptr->pos + sbc; /* spc over record */
if (all_eof) /* tape mark? */
return MTSE_TMK;
r = MTSE_TMK;
break;
default:
return MTSE_FMT;
}
return MTSE_OK;
sim_debug (MTSE_DBG_STR, ctx->dptr, "rd_lnt: st: %d, lnt: %d, pos: %d\n", r, *bc, uptr->pos);
return r;
}
/* Read record length reverse (internal routine)
@ -716,12 +722,14 @@ return MTSE_OK;
t_stat sim_tape_rdlntr (UNIT *uptr, t_mtrlnt *bc)
{
struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx;
uint8 c;
t_bool all_eof;
uint32 f = MT_GET_FMT (uptr);
t_addr ppos;
t_mtrlnt sbc;
t_tpclnt tpcbc;
t_stat r = MTSE_OK;
MT_CLR_PNU (uptr);
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
@ -737,13 +745,19 @@ switch (f) { /* switch on fmt */
sbc = MTR_L (*bc);
if (ferror (uptr->fileref)) /* error? */
return sim_tape_ioerr (uptr);
if (feof (uptr->fileref)) /* eof? */
return MTSE_EOM;
if (feof (uptr->fileref)) { /* eof? */
r = MTSE_EOM;
break;
}
uptr->pos = uptr->pos - sizeof (t_mtrlnt); /* spc over rec lnt */
if (*bc == MTR_EOM) /* eom? */
return MTSE_EOM;
if (*bc == MTR_TMK) /* tape mark? */
if (*bc == MTR_EOM) { /* eom? */
r = MTSE_EOM;
break;
}
if (*bc == MTR_TMK) { /* tape mark? */
return MTSE_TMK;
break;
}
if ((*bc & MTR_M_RHGAP) == MTR_RHGAP) { /* half gap? */
uptr->pos = uptr->pos + sizeof (t_mtrlnt) / 2; /* half space rev */
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);
sim_fseek (uptr->fileref, uptr->pos + sizeof (t_mtrlnt), SEEK_SET);
}
else if (sim_tape_bot (uptr)) /* backed into BOT? */
return MTSE_BOT;
else if (sim_tape_bot (uptr)) { /* backed into BOT? */
r = MTSE_BOT;
break;
}
}
while ((*bc == MTR_GAP) || (*bc == MTR_RHGAP));
break;
@ -766,11 +782,15 @@ switch (f) { /* switch on fmt */
*bc = tpcbc; /* save rec lnt */
if (ferror (uptr->fileref)) /* error? */
return sim_tape_ioerr (uptr);
if (feof (uptr->fileref)) /* eof? */
return MTSE_EOM;
if (feof (uptr->fileref)) { /* eof? */
r = MTSE_EOM;
break;
}
uptr->pos = ppos; /* spc over record */
if (*bc == MTR_TMK) /* tape mark? */
return MTSE_TMK;
if (*bc == MTR_TMK) { /* tape mark? */
r = MTSE_TMK;
break;
}
sim_fseek (uptr->fileref, uptr->pos + sizeof (t_tpclnt), SEEK_SET);
break;
@ -780,8 +800,10 @@ switch (f) { /* switch on fmt */
sim_fread (&c, sizeof (uint8), 1, uptr->fileref);
if (ferror (uptr->fileref)) /* error? */
return sim_tape_ioerr (uptr);
if (feof (uptr->fileref)) /* eof? */
return MTSE_EOM;
if (feof (uptr->fileref)) { /* eof? */
r = MTSE_EOM;
break;
}
if ((c & P7B_DPAR) != P7B_EOF)
all_eof = 0;
if (c & P7B_SOR) /* start of record? */
@ -791,14 +813,14 @@ switch (f) { /* switch on fmt */
*bc = sbc; /* save rec lnt */
sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */
if (all_eof) /* tape mark? */
return MTSE_TMK;
r = MTSE_TMK;
break;
default:
return MTSE_FMT;
}
return MTSE_OK;
sim_debug (MTSE_DBG_STR, ctx->dptr, "rd_lnt: st: %d, lnt: %d, pos: %d\n", r, *bc, uptr->pos);
return r;
}
/* Read record forward
@ -851,6 +873,7 @@ for ( ; i < rbc; i++) /* fill with 0's */
buf[i] = 0;
if (f == MTUF_F_P7B) /* p7b? strip SOR */
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);
}
@ -907,6 +930,7 @@ for ( ; i < rbc; i++) /* fill with 0's */
buf[i] = 0;
if (f == MTUF_F_P7B) /* p7b? strip SOR */
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);
}
@ -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_tape_data_trace(uptr, buf, bc, "Record Write", ctx->dptr->dctrl & MTSE_DBG_DAT, MTSE_DBG_STR);
MT_CLR_PNU (uptr);
sbc = MTR_L (bc);
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
@ -979,7 +1004,7 @@ switch (f) { /* case on format */
uptr->pos = uptr->pos + sbc; /* move tape */
break;
}
sim_tape_data_trace(uptr, buf, sbc, "Record Written", ctx->dptr->dctrl & MTSE_DBG_DAT, MTSE_DBG_STR);
return MTSE_OK;
}
@ -996,6 +1021,8 @@ return r;
t_stat sim_tape_wrdata (UNIT *uptr, uint32 dat)
{
struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx;
MT_CLR_PNU (uptr);
if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */
return MTSE_UNATT;
@ -1007,6 +1034,7 @@ if (ferror (uptr->fileref)) { /* error? */
MT_SET_PNU (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 */
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);
/* 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 */
t_stat sim_tape_attach_ex (UNIT *uptr, char *cptr, uint32 dbit, int completion_delay);