Source: the constants of Bob Supnik’s sim_tape.h (“SIMH/E11 tape format”), read on 2026-11-15 through a summarising fetch tool (“our words”). The six real SIMH tapes of the SIMH source tree on the machine that built this site (a CDC 1700 system tape four times, an IBM 650 SOAP library and a SEL 32 diagnostic tape of 4.1 MB with 5,326 records and 74 tape marks) were walked with the rules below to their last byte.
Items
Every item starts with a 32-bit word, little-endian:
| Word | Item | Size |
|---|---|---|
$00000000 | Tape mark: the end of a tape file. | 4 bytes |
$FFFFFFFF | End of medium: the end of the tape. | 4 bytes |
$FFFFFFFE | Erase gap (the “primary gap”). | 4 bytes |
| anything else | A data record. Bit 31 is the error flag (the record was read with an error); the other bits are the length in bytes. The header names a maximum length of 24 bits, $00FFFFFF; a word with bits 24 to 30 set is not read as a plain record here. | 4 + length + pad + 4 |
A data record is the word, the data, one pad byte when the length is odd (unconfirmed by the format’s own document: it agrees with all six real tapes) and the same word again. The word at the end is how a reader steps backwards over a record. The header also names a few half-gap values ($FFFEFFFF, $FFFF0000 and a range) that are used when overwriting; they are not read specially here.
The registry recognises the format by this structure, because it has no signature: the first 64 items (or all of them, in a short file) must be well formed, with every trailer equal to its word and every record ending inside the file, and at least one of them must be a data record. None of 60,000 random files of nine sizes (22 to 4,096 bytes), none of 20,000 files of random printable text, none of the 32 other .tap files found on the machine (ZX, Oric, C64, Atom, KC and CPC tapes, and three tapes of IBM 704 and CDC 6600 software), was taken for a SIMH tape, and the six real tapes were.