From f12bc70470177d9dfaa40040cc870b1626788106 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 6 Apr 2019 02:00:53 -0700 Subject: [PATCH] TAPE: Add support for TAR tape format --- README.md | 1 + doc/simh_doc.doc | Bin 268800 -> 264192 bytes scp.c | 2 + sim_defs.h | 1 + sim_tape.c | 118 +++++++++++++++++++++++++++++++++++++++++++---- sim_tape.h | 5 ++ 6 files changed, 118 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b03c5576..1b22e1ac 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,7 @@ Host platforms which have libSDL available can leverage this functionality. #### Tape Extensions AWS format tape support + TAR format tape support #### Embedded ROM support Simulators which have boot commands which load constant files as part of diff --git a/doc/simh_doc.doc b/doc/simh_doc.doc index 5fc390a61e157f116c403f2d9aae2571f1e779d3..611dca55f97206e7fb0fd956dec49e9afdd0bb21 100644 GIT binary patch delta 39443 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 DE{g{F delta 42265 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 fN+m)dynflags); WRITE_I (uptr->wait); WRITE_I (uptr->buf); + WRITE_I (uptr->recsize); WRITE_I (uptr->capac); /* [V3.5] capacity */ fprintf (sfile, "%.0f\n", uptr->usecs_remaining);/* [V4.0] remaining wait */ WRITE_I (uptr->pos); @@ -7530,6 +7531,7 @@ for ( ;; ) { /* device loop */ READ_I (uptr->dynflags); READ_I (uptr->wait); READ_I (uptr->buf); + READ_I (uptr->recsize); } old_capac = uptr->capac; /* save current capacity */ if (v35) { /* [V3.5+] capacity */ diff --git a/sim_defs.h b/sim_defs.h index ce77bf74..f6e085d4 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -591,6 +591,7 @@ struct UNIT { uint16 us9; /* device specific */ uint16 us10; /* device specific */ void *tmxr; /* TMXR linkage */ + uint32 recsize; /* Tape info */ t_bool (*cancel)(UNIT *); double usecs_remaining; /* time balance for long delays */ char *uname; /* Unit name */ diff --git a/sim_tape.c b/sim_tape.c index 77a6899a..5c1253ee 100644 --- a/sim_tape.c +++ b/sim_tape.c @@ -113,7 +113,7 @@ static struct sim_tape_fmt fmts[MTUF_N_FMT] = { { "TPC", UNIT_RO, sizeof (t_tpclnt) - 1, sizeof (t_tpclnt) }, { "P7B", 0, 0, 0 }, { "AWS", 0, 0, 0 }, -/* { "TPF", UNIT_RO, 0 }, */ + { "TAR", 0, 0, 0 }, { NULL, 0, 0 } }; @@ -479,14 +479,31 @@ if ((dptr = find_dev_from_unit (uptr)) == NULL) if (sim_switches & SWMASK ('F')) { /* format spec? */ cptr = get_glyph (cptr, gbuf, 0); /* get spec */ if (*cptr == 0) /* must be more */ - return SCPE_2FARG; + return sim_messagef (SCPE_2FARG, "Missing Format specifier and filename to attach\n"); if (sim_tape_set_fmt (uptr, 0, gbuf, NULL) != SCPE_OK) return sim_messagef (SCPE_ARG, "Invalid Tape Format: %s\n", gbuf); sim_switches = sim_switches & ~(SWMASK ('F')); /* Record Format specifier already processed */ auto_format = TRUE; } -if (MT_GET_FMT (uptr) == MTUF_F_TPC) - sim_switches |= SWMASK ('R'); /* Force ReadOnly attach for TPC tapes */ +if (MT_GET_FMT (uptr) == MTUF_F_TAR) { + if (sim_switches & SWMASK ('B')) { /* Record Size (blocking factor)? */ + uint32 recsize; + + cptr = get_glyph (cptr, gbuf, 0); /* get spec */ + if (*cptr == 0) /* must be more */ + return sim_messagef (SCPE_2FARG, "Missing Record Size and filename to attach\n"); + recsize = (uint32) get_uint (gbuf, 10, 65536, &r); + if ((r != SCPE_OK) || (recsize == 0)) + return sim_messagef (SCPE_ARG, "Invalid Tape Record Size: %s\n", gbuf); + uptr->recsize = recsize; + sim_switches = sim_switches & ~(SWMASK ('B')); /* Record Blocking Factor */ + } + if (uptr->recsize == 0) + uptr->recsize = TAR_DFLT_RECSIZE; + } +if ((MT_GET_FMT (uptr) == MTUF_F_TPC) || + (MT_GET_FMT (uptr) == MTUF_F_TAR)) + sim_switches |= SWMASK ('R'); /* Force ReadOnly attach for TPC and TAR tapes */ r = attach_unit (uptr, (CONST char *)cptr); /* attach unit */ if (r != SCPE_OK) /* error? */ return sim_messagef (r, "Can't open tape image: %s\n", cptr); @@ -522,6 +539,10 @@ switch (MT_GET_FMT (uptr)) { /* case on format */ sim_tape_tpc_map (uptr, (t_addr *) uptr->filebuf, objc);/* fill map */ break; + case MTUF_F_TAR: /* TAR */ + uptr->hwmark = (t_addr)sim_fsize (uptr->fileref); + break; + default: break; } @@ -568,7 +589,7 @@ if (ctx) sim_tape_clr_async (uptr); -MT_CLR_INMRK (uptr); /* Not within an AWS tapemark */ +MT_CLR_INMRK (uptr); /* Not within an AWS or TAR tapemark */ r = detach_unit (uptr); /* detach unit */ if (r != SCPE_OK) return r; @@ -578,12 +599,13 @@ switch (f) { /* case on format */ if (uptr->filebuf) /* free map */ free (uptr->filebuf); uptr->filebuf = NULL; - uptr->hwmark = 0; break; default: break; } +uptr->hwmark = 0; +uptr->recsize = 0; sim_tape_rewind (uptr); free (uptr->tape_ctx); @@ -615,7 +637,11 @@ fprintf (st, " -R Attach Read Only.\n"); fprintf (st, " -E Must Exist (if not specified an attempt to create the indicated\n"); fprintf (st, " virtual tape will be attempted).\n"); fprintf (st, " -F Open the indicated tape container in a specific format (default\n"); -fprintf (st, " is SIMH, alternatives are E11, TPC and P7B)\n"); +fprintf (st, " is SIMH, alternatives are E11, TPC, P7B, AWS and TAR)\n"); +fprintf (st, " -B For TAR format tapes, the record size for data read from the\n"); +fprintf (st, " specified file. This record size will be used for all but\n"); +fprintf (st, " possibly the last record which will be what remains unread.\n"); +fprintf (st, " The default TAR record size is 10240.\n"); fprintf (st, " -V Display some summary information about the record structure\n"); fprintf (st, " contained in the tape structure.\n"); fprintf (st, " -D Causes the internal tape structure information to be displayed\n"); @@ -738,6 +764,7 @@ int32 runaway_counter, sizeof_gap; /* bytes remaining befor t_stat status = MTSE_OK; MT_CLR_PNU (uptr); /* clear the position-not-updated flag */ +*bc = 0; if ((uptr->flags & UNIT_ATT) == 0) /* if the unit is not attached */ return MTSE_UNATT; /* then quit with an error */ @@ -955,7 +982,6 @@ else switch (f) { /* otherwise the read me MT_CLR_INMRK (uptr); /* Not within an AWS tapemark */ memset (&awshdr, 0, sizeof (awshdr)); rdcnt = sim_fread (&awshdr, sizeof (t_awslnt), 3, uptr->fileref); - *bc = 0; if (ferror (uptr->fileref)) { /* error? */ MT_SET_PNU (uptr); /* pos not upd */ @@ -999,6 +1025,26 @@ else switch (f) { /* otherwise the read me } break; + case MTUF_F_TAR: + if (uptr->pos < uptr->hwmark) { + if ((uptr->hwmark - uptr->pos) >= uptr->recsize) + *bc = uptr->recsize; /* TAR record size */ + else + *bc = uptr->hwmark - uptr->pos; /* TAR remnant last record */ + (void)sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); + uptr->pos += *bc; + MT_CLR_INMRK (uptr); + } + else { + if (MT_TST_INMRK (uptr)) + status = MTSE_EOM; + else { + status = MTSE_TMK; + MT_SET_INMRK (uptr); + } + } + break; + default: status = MTSE_FMT; } @@ -1075,6 +1121,7 @@ int32 runaway_counter, sizeof_gap; /* bytes remaining befor t_stat status = MTSE_OK; MT_CLR_PNU (uptr); /* clear the position-not-updated flag */ +*bc = 0; if ((uptr->flags & UNIT_ATT) == 0) /* if the unit is not attached */ return MTSE_UNATT; /* then quit with an error */ @@ -1297,7 +1344,28 @@ else switch (f) { /* otherwise the read me } break; - default: + case MTUF_F_TAR: + if (uptr->pos == uptr->hwmark) { + if (MT_TST_INMRK (uptr)) { + status = MTSE_TMK; + MT_CLR_INMRK (uptr); + } + else { + if (uptr->hwmark % uptr->recsize) + *bc = uptr->hwmark % uptr->recsize; + else + *bc = uptr->recsize; + } + } + else + *bc = uptr->recsize; + if (*bc) { + uptr->pos -= *bc; + (void)sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); + } + break; + + default: status = MTSE_FMT; } @@ -2585,6 +2653,7 @@ if (uptr->flags & UNIT_ATT) { } uptr->pos = 0; MT_CLR_PNU (uptr); +MT_CLR_INMRK (uptr); /* Not within an AWS or TAR tapemark */ return MTSE_OK; } @@ -3198,6 +3267,8 @@ FILE *fE11 = NULL; FILE *fTPC = NULL; FILE *fP7B = NULL; FILE *fAWS = NULL; +FILE *fTAR = NULL; +FILE *fTAR2 = NULL; int i, j, k; t_tpclnt tpclnt; t_mtrlnt mtrlnt; @@ -3245,6 +3316,14 @@ sprintf (name, "%s.p7b", filename); fP7B = fopen (name, "wb"); if (fP7B == NULL) goto Done_Files; +sprintf (name, "%s.tar", filename); +fTAR = fopen (name, "wb"); +if (fTAR == NULL) + goto Done_Files; +sprintf (name, "%s.2.tar", filename); +fTAR2 = fopen (name, "wb"); +if (fTAR2 == NULL) + goto Done_Files; sprintf (name, "%s.aws", filename); fAWS = fopen (name, "wb"); if (fAWS == NULL) @@ -3323,6 +3402,13 @@ tpclnt = 0xffff; (void)sim_fwrite (&mtrlnt, sizeof (mtrlnt), 1, fE11); (void)sim_fwrite (&tpclnt, sizeof (tpclnt), 1, fTPC); (void)sim_fwrite (buf, 1, 1, fP7B); +for (j=0; junits, "TapeTestFile1")); SIM_TEST(sim_tape_test_create_tape_files (dptr->units, "TapeTestFile1", 2, 5, 4096)); +sim_switches = saved_switches; +SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "tar")); + +sim_switches = saved_switches; +SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1.2", "tar")); + sim_switches = saved_switches; SIM_TEST(sim_tape_test_process_tape_file (dptr->units, "TapeTestFile1", "aws")); diff --git a/sim_tape.h b/sim_tape.h index 37be7242..8a676c1a 100644 --- a/sim_tape.h +++ b/sim_tape.h @@ -85,6 +85,9 @@ typedef struct { #define AWS_REC 0x00A0 } t_awshdr; +/* TAR tape format */ +#define TAR_DFLT_RECSIZE 10240 /* Default Fixed record size */ + /* Unit flags */ #define MTUF_V_PNU (UNIT_V_UF + 0) /* position not upd */ @@ -98,6 +101,7 @@ typedef struct { #define MTUF_F_TPC 2 /* TPC format */ #define MTUF_F_P7B 3 /* P7B format */ #define MTUF_F_AWS 4 /* AWS format */ +#define MTUF_F_TAR 5 /* TAR format */ #define MTUF_V_UF (MTUF_V_FMT + MTUF_W_FMT) #define MTUF_PNU (1u << MTUF_V_PNU) #define MTUF_WLK (1u << MTUF_V_WLK) @@ -109,6 +113,7 @@ typedef struct { #define MT_F_TPC (MTUF_F_TPC << MTUF_V_FMT) #define MT_F_P7B (MTUF_F_P7B << MTUF_V_FMT) #define MT_F_AWS (MTUF_F_AWS << MTUF_V_FMT) +#define MT_F_TAR (MTUF_F_TAR << MTUF_V_FMT) #define MT_SET_PNU(u) (u)->flags = (u)->flags | MTUF_PNU #define MT_CLR_PNU(u) (u)->flags = (u)->flags & ~MTUF_PNU