From 269d3ed460487b43a339dcc80d8f4c9d2bff5078 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Sat, 19 Mar 2022 19:14:54 +0100 Subject: [PATCH] Support for reading tape errors and gaps. --- tape-word.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tape-word.c b/tape-word.c index 4640b94..9cf7a6f 100644 --- a/tape-word.c +++ b/tape-word.c @@ -23,6 +23,8 @@ static int reclen = 0; static int beginning_of_tape = 1; static int marks = 0; +static int get_tape_record (FILE *f, word_t **buffer); + static int get_byte (FILE *f) { @@ -79,6 +81,18 @@ static void write_reclen (FILE *f, int n) fputc ((n >> 24) & 0377, f); } +static int tape_error (int code, FILE *f, word_t **buffer) +{ + fprintf (stderr, "Tape error %06x.\n", code); + return get_tape_record (f, buffer); +} + +static int tape_gap (int code, FILE *f, word_t **buffer) +{ + fprintf (stderr, "Tape gap (%06x).\n", code); + return get_tape_record (f, buffer); +} + int get_9track_record (FILE *f, word_t **buffer) { int i, x, reclen; @@ -87,6 +101,11 @@ int get_9track_record (FILE *f, word_t **buffer) reclen = get_reclen (f); if (reclen == 0) return 0; + else if (((reclen >> 24) & 0xFF) == 0x80) + return tape_error (reclen & 0xFFFFFF, f, buffer); + else if (((reclen >> 24) & 0xFF) == 0xFF) + return tape_gap (reclen & 0xFFFFFF, f, buffer); + if (reclen % 5) { fprintf (stderr, "Not a CORE DUMP tape image.\n" @@ -185,6 +204,11 @@ int get_7track_record (FILE *f, word_t **buffer) reclen = get_reclen (f); if (reclen == 0) return 0; + else if (((reclen >> 24) & 0xFF) == 0x80) + return tape_error (reclen & 0xFFFFFF, f, buffer); + else if (((reclen >> 24) & 0xFF) == 0xFF) + return tape_gap (reclen & 0xFFFFFF, f, buffer); + if (reclen % 6) { fprintf (stderr, "Not a 7-track tape image.\n"