mirror of
https://github.com/simh/simh.git
synced 2026-01-13 07:19:43 +00:00
TAPE: Added extended SIMH format support
- Improved tape_erase_fwd corrupt image error checking - Added sim_tape_erase global, tape_erase internal functions
This commit is contained in:
parent
980c21e50f
commit
13c9ca5bec
1577
sim_tape.c
1577
sim_tape.c
File diff suppressed because it is too large
Load Diff
107
sim_tape.h
107
sim_tape.h
@ -1,7 +1,7 @@
|
||||
/* sim_tape.h: simulator tape support library definitions
|
||||
|
||||
Copyright (c) 1993-2016, Robert M Supnik
|
||||
Copyright (c) 2017 J. David Bryan
|
||||
Copyright (c) 2017-2021, J. David Bryan
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
@ -24,6 +24,8 @@
|
||||
used in advertising or otherwise to promote the sale, use or other dealings
|
||||
in this Software without prior written authorization from Robert M Supnik.
|
||||
|
||||
15-Dec-21 JDB Added extended SIMH format support
|
||||
06-Oct-21 JDB Added sim_tape_erase global
|
||||
22-Apr-17 JDB Added MTSE_LEOT value for 4.x compatibility
|
||||
18-Jul-16 JDB Added sim_tape_errecf, sim_tape_errecr functions
|
||||
15-Dec-14 JDB Added tape density validity flags
|
||||
@ -39,22 +41,95 @@
|
||||
#ifndef _SIM_TAPE_H_
|
||||
#define _SIM_TAPE_H_ 0
|
||||
|
||||
/* SIMH/E11 tape format */
|
||||
/* SIMH/E11 tape format.
|
||||
|
||||
typedef uint32 t_mtrlnt; /* magtape rec lnt */
|
||||
31 30 29 29 27 26 25 24 23 22 21 [...] 2 1 0
|
||||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
| 0 0 0 0 0 0 0 0 | 0 0 0 [...] 0 0 0 | tape mark
|
||||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
| 0 | 0 0 0 0 0 0 0 | length > 0 | good data record
|
||||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
| 1 | 0 0 0 0 0 0 0 | length > 0 | bad data record
|
||||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
| 1 1 1 1 1 1 1 1 | 1 1 1 [...] 1 1 0 | erase gap
|
||||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
| 1 1 1 1 1 1 1 1 | 1 1 1 [...] 1 1 1 | end of medium
|
||||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
*/
|
||||
|
||||
typedef uint32 t_mtrlnt; /* record length type */
|
||||
|
||||
#define MTR_TMK 0x00000000 /* tape mark */
|
||||
#define MTR_EOM 0xFFFFFFFF /* end of medium */
|
||||
#define MTR_GAP 0xFFFFFFFE /* primary gap */
|
||||
#define MTR_RRGAP 0xFFFFFFFF /* reverse read half gap */
|
||||
#define MTR_FHGAP 0xFFFEFFFF /* fwd half gap (overwrite) */
|
||||
#define MTR_RHGAP 0xFFFF0000 /* rev half gap (overwrite) */
|
||||
#define MTR_M_RHGAP (~0x000080FF) /* range mask for rev gap */
|
||||
#define MTR_MAXLEN 0x00FFFFFF /* max len is 24b */
|
||||
#define MTR_ERF 0x80000000 /* error flag */
|
||||
#define MTR_F(x) ((x) & MTR_ERF) /* record error flg */
|
||||
#define MTR_L(x) ((x) & ~MTR_ERF) /* record length */
|
||||
|
||||
/* Extended SIMH tape format.
|
||||
|
||||
31 30 29 29 27 26 25 24 23 22 21 [...] 2 1 0
|
||||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
| control class | marker-specific value | marker
|
||||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
| control class | data length value | record
|
||||
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|
||||
*/
|
||||
|
||||
#define MTR_V_RECLN 0 /* record length offset */
|
||||
#define MTR_W_RECLN 28 /* record length width */
|
||||
#define MTR_M_RECLN ((1u << MTR_W_RECLN) - 1) /* record length mask */
|
||||
#define MTR_RECLN (MTR_M_RECLN << MTR_V_RECLN) /* record length field mask */
|
||||
|
||||
#define MTR_V_CLASS MTR_W_RECLN /* class field offset */
|
||||
#define MTR_W_CLASS 4 /* class field width */
|
||||
#define MTR_M_CLASS ((1u << MTR_W_CLASS) - 1) /* class number mask */
|
||||
#define MTR_CLASS (MTR_M_CLASS << MTR_V_CLASS) /* class field mask */
|
||||
|
||||
#define MTR_RL(m) ((m) & MTR_RECLN) /* record length */
|
||||
#define MTR_CF(m) ((m) & MTR_CLASS) /* class field */
|
||||
|
||||
#define MTR_NF(cn) ((t_mtrlnt) (((cn) << MTR_V_CLASS) & MTR_CLASS)) /* class number to class field */
|
||||
#define MTR_FN(cf) ((uint32) (((cf) & MTR_CLASS) >> MTR_V_CLASS)) /* class field to class number */
|
||||
|
||||
#define MTCN_GOOD 0u /* good data record class number */
|
||||
#define MTCN_PMARK 7u /* private marker class number */
|
||||
#define MTCN_BAD 8u /* bad data record class number */
|
||||
#define MTCN_DESC 14u /* standard tape description record class number */
|
||||
#define MTCN_SMARK 15u /* standard marker class number */
|
||||
|
||||
#define MTC_GOOD MTR_NF (MTCN_GOOD) /* good data record class field */
|
||||
#define MTC_PMARK MTR_NF (MTCN_PMARK) /* private marker class field */
|
||||
#define MTC_BAD MTR_NF (MTCN_BAD) /* bad data record class field */
|
||||
#define MTC_DESC MTR_NF (MTCN_DESC) /* standard tape description record class field */
|
||||
#define MTC_SMARK MTR_NF (MTCN_SMARK) /* standard marker class field */
|
||||
|
||||
#define MTR_NB(cn) (1u << (cn)) /* class number to class bit */
|
||||
#define MTR_FB(m) (MTR_NB (MTR_FN (m))) /* class field to class bit */
|
||||
|
||||
#define MTB_GOOD MTR_NB (MTCN_GOOD) /* good data record class bit */
|
||||
#define MTB_PMARK MTR_NB (MTCN_PMARK) /* private marker class bit */
|
||||
#define MTB_BAD MTR_NB (MTCN_BAD) /* bad data record class bit */
|
||||
#define MTB_DESC MTR_NB (MTCN_DESC) /* standard tape description record class bit */
|
||||
#define MTB_SMARK MTR_NB (MTCN_SMARK) /* standard marker class bit */
|
||||
|
||||
#define MTB_PRIVREC (MTR_NB (1) | MTR_NB (2) | \
|
||||
MTR_NB (3) | MTR_NB (4) | \
|
||||
MTR_NB (5) | MTR_NB (6)) /* private record class bits */
|
||||
|
||||
#define MTB_RSVDREC (MTR_NB (9) | MTR_NB (10) | \
|
||||
MTR_NB (11) | MTR_NB (12) | \
|
||||
MTR_NB (13)) /* reserved record class bits */
|
||||
|
||||
#define MTB_STANDARD (MTB_GOOD | MTB_BAD) /* standard record class bits */
|
||||
#define MTB_EXTENDED (MTB_STANDARD | MTB_PRIVREC | MTB_DESC) /* extended record class bits */
|
||||
|
||||
#define MTB_MARKERSET (MTB_PMARK | MTB_SMARK) /* all marker class bits */
|
||||
#define MTB_RECORDSET (~MTB_MARKERSET) /* all record class bits */
|
||||
|
||||
/* TPC tape format */
|
||||
|
||||
typedef uint16 t_tpclnt; /* magtape rec lnt */
|
||||
@ -71,17 +146,19 @@ typedef uint16 t_tpclnt; /* magtape rec lnt */
|
||||
|
||||
/* Unit flags */
|
||||
|
||||
#define MTUF_F_STD 0 /* SIMH standard format */
|
||||
#define MTUF_F_E11 1 /* E11 format */
|
||||
#define MTUF_F_TPC 2 /* TPC format */
|
||||
#define MTUF_F_P7B 3 /* P7B format */
|
||||
#define MTUF_F_TDF 4 /* TDF format (not implemented) */
|
||||
#define MTUF_F_EXT 5 /* SIMH extended format */
|
||||
|
||||
#define MTUF_V_PNU (UNIT_V_UF + 0) /* position not upd */
|
||||
#define MTUF_V_WLK (UNIT_V_UF + 1) /* write locked */
|
||||
#define MTUF_V_FMT (UNIT_V_UF + 2) /* tape file format */
|
||||
#define MTUF_W_FMT 3 /* 3b of formats */
|
||||
#define MTUF_N_FMT (1u << MTUF_W_FMT) /* number of formats */
|
||||
#define MTUF_M_FMT ((1u << MTUF_W_FMT) - 1)
|
||||
#define MTUF_F_STD 0 /* SIMH format */
|
||||
#define MTUF_F_E11 1 /* E11 format */
|
||||
#define MTUF_F_TPC 2 /* TPC format */
|
||||
#define MTUF_F_P7B 3 /* P7B format */
|
||||
#define MUTF_F_TDF 4 /* TDF 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)
|
||||
@ -93,6 +170,7 @@ typedef uint16 t_tpclnt; /* magtape rec lnt */
|
||||
#define MT_F_TPC (MTUF_F_TPC << MTUF_V_FMT)
|
||||
#define MT_F_P7B (MTUF_F_P7B << MTUF_V_FMT)
|
||||
#define MT_F_TDF (MTUF_F_TDF << MTUF_V_FMT)
|
||||
#define MT_F_EXT (MTUF_F_EXT << 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
|
||||
@ -130,17 +208,20 @@ typedef uint16 t_tpclnt; /* magtape rec lnt */
|
||||
#define MTSE_WRP 9 /* write protected */
|
||||
#define MTSE_LEOT 10 /* Logical End Of Tape (4.x) */
|
||||
#define MTSE_RUNAWAY 11 /* tape runaway */
|
||||
#define MTSE_RESERVED 12 /* reserved class */
|
||||
|
||||
/* Prototypes */
|
||||
|
||||
t_stat sim_tape_attach (UNIT *uptr, char *cptr);
|
||||
t_stat sim_tape_detach (UNIT *uptr);
|
||||
t_stat sim_tape_rdrecf (UNIT *uptr, uint8 *buf, t_mtrlnt *bc, t_mtrlnt max);
|
||||
t_stat sim_tape_rdrecr (UNIT *uptr, uint8 *buf, t_mtrlnt *bc, t_mtrlnt max);
|
||||
t_stat sim_tape_wrrecf (UNIT *uptr, uint8 *buf, t_mtrlnt bc);
|
||||
t_stat sim_tape_rdrecf (UNIT *uptr, uint8 *buf, t_mtrlnt *clbc, t_mtrlnt max);
|
||||
t_stat sim_tape_rdrecr (UNIT *uptr, uint8 *buf, t_mtrlnt *clbc, t_mtrlnt max);
|
||||
t_stat sim_tape_wrrecf (UNIT *uptr, uint8 *buf, t_mtrlnt clbc);
|
||||
t_stat sim_tape_wrmrk (UNIT *uptr, t_mtrlnt mk);
|
||||
t_stat sim_tape_wrtmk (UNIT *uptr);
|
||||
t_stat sim_tape_wreom (UNIT *uptr);
|
||||
t_stat sim_tape_wrgap (UNIT *uptr, uint32 gaplen);
|
||||
t_stat sim_tape_erase (UNIT *uptr, t_mtrlnt bc);
|
||||
t_stat sim_tape_errecf (UNIT *uptr, t_mtrlnt bc);
|
||||
t_stat sim_tape_errecr (UNIT *uptr, t_mtrlnt bc);
|
||||
t_stat sim_tape_sprecf (UNIT *uptr, t_mtrlnt *bc);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user