1
2#------------------------------------------------------------------------------
3# $File: spectrum,v 1.10 2023/05/08 01:33:36 christos Exp $
4# spectrum:  file(1) magic for Spectrum emulator files.
5#
6# John Elliott <jce@seasip.demon.co.uk>
7
8#
9# Spectrum +3DOS header
10#
110       string          PLUS3DOS\032    Spectrum +3 data
12>15     byte            0               - BASIC program
13>15     byte            1               - number array
14>15     byte            2               - character array
15>15     byte            3               - memory block
16>>16    belong          0x001B0040      (screen)
17>15     byte            4               - Tasword document
18>15     string          TAPEFILE        - ZXT tapefile
19#
20# Tape file. This assumes the .TAP starts with a Spectrum-format header,
21# which nearly all will.
22#
23# Update: Sanity-check string contents to be printable.
24#  -Adam Buchbinder <adam.buchbinder@gmail.com>
25# Update: Joerg Jenderek 2023 May
26# URL:              http://fileformats.archiveteam.org/wiki/TAP_(ZX_Spectrum)
27# Reference:        http://web.archive.org/web/20110711141601/http://www.zxmodules.de/fileformats/tapformat.html
28#                   http://mark0.net/download/triddefs_xml.7z/defs/t/tap-zx.trid.xml
29# Note:             called "ZX Spectrum Tape image" by TrID and "TAP (ZX Spectrum)" by DROID via PUID fmt/801
30#                   verified by fuse-emulator-utils `tzxlist EXAMPLES.TAP`
31#
32# headers length 19=023 and flag byte 0 indicating a standard ROM loading header
330       string          \023\000\000
34>4      string          >\0
35# skip {85CEE8D6-0F90-4492-B484-98E38862B28D}.2.ver0x0000000000000004.db {DDF571F2-BE98-426D-8288-1A9A39C3FDA2}.2.ver0x0000000000000001.db
36# inside c:\ProgramData\Microsoft\Windows\Caches according to TrID and DROID
37>>23      ubyte               =0xFF
38# skip DROID fmt-801-signature-id-1166.tap with invalid name \253\253\253\253\253\253\253\253\253\253
39# which looks like: "TF COPY II" "screen    " "\023\001TF" "  1943    "
40>>>4     string          <\177           Spectrum .TAP data "%-10.10s"
41#!:mime   application/octet-stream
42!:mime    application/x-spectrum-tap
43!:ext     tap
44>>>>3     byte                0         - BASIC program
45# autostart line; 0..9999 are valid; 32768 means "no auto-loading"
46>>>>>16   uleshort  x         \b, autostart line %u
47# program length; length of BASIC program
48>>>>>18   uleshort  x         \b, program length %u
49>>>>3     byte                1         - number array
50>>>>3     byte                2         - character array
51>>>>3     byte                3         - memory block
52# length of the following data 1B00h=6912 and start address 4000h=16384 in case of a SCREEN$ header
53>>>>>14 belong          0x001B0040      (screen)
54# unused 32768=8000h
55>>>>>18   uleshort  !32768    \b, unused %u
56# zxlength; length of the following data after the header
57>>>>14    uleshort  x         \b, data length %u
58#>>14     uleshort  x         \b, data length %#x
59# checksum byte; simply all bytes (including flag byte) XORed
60#>>>>20   ubyte               x         \b, checksum %#x
61
62# The following three blocks are from pak21-spectrum@srcf.ucam.org
63# TZX tape images
64# Update: Joerg Jenderek 2023 May
65# URL:              http://fileformats.archiveteam.org/wiki/TZX
66# Reference:        https://worldofspectrum.net/TZXformat.html
67#                   http://mark0.net/download/triddefs_xml.7z/defs/t/tzx.trid.xml
68# Note:             called "ZX Spectrum Tape image" by TrID and "TZX Format" by DROID via PUID fmt/1000
690      string          ZXTape!\x1a     Spectrum .TZX data
70#!:mime   application/octet-stream
71!:mime    application/x-spectrum-tzx
72# CDT is used for Amstrad tapes
73!:ext     tzx/cdt
74>8     byte            x               version %d
75>9     byte            x               \b.%d
76# ID of first block
77>10       ubyte               x                   \b; ID %#x
78# turbo speed data block
79>10       ubyte               =0x11               (turbo)
80# length of PILOT tone (number of pulses)
81>>21      uleshort  x                   \b, %u pilot pulses
82# length of PILOT pulse
83>>11      uleshort  x                   with %u tstates
84# length of SYNC first pulse
85>>13      uleshort  x                   \b, %u and
86# length of SYNC second pulse
87>>15      uleshort  x                   %u sync tstates
88# length of ZERO bit pulse
89>>17      uleshort  x                   \b, %u zero tstates
90# length of ONE bit pulse
91>>19      uleshort  x                   \b, %u one tstates
92# used bits in the last byte
93>>23      ubyte               x                   \b, use %u bit
94# plural s
95>>23      ubyte               >1                  \bs
96# pause after this block in milliseconds
97>>24      uleshort  x                   \b, %u ms pause
98# BYTE[3]; length of data that follow
99>>26      ulelong&0x00FFffFF x                    \b, %u data bytes
100>10       ubyte               =0x20               (pause)
101# pause duration in milliseconds
102>>11      uleshort  x                   %u ms
103# text description
104>10       ubyte               =0x30               (text)
105# length of the text description
106#>>11     ubyte               x                   L=%u
107>>11      pstring             x                   "%s"
108# archive text description in ASCII format
109>10       ubyte               =0x32               (archive info)
110# length of archive text
111>>11      uleshort  x                   \b, %#x bytes
112# number of text strings
113>>13      ubyte               x                   with %u (type) text parts
114# text type identification byte: 0~title 1~publisher 2~author 3~year 4~language 5~type 6~price 7~protection 8~origin ff~comment
115>>14      byte                <9                  (%d)
116>>>14     byte                >-2
117# length of text string
118#>>>>15   ubyte               x                   L=%u
119>>>>15    pstring             x                   %s
120# 2nd possible text description
121>>>>>&0   byte                <9                  (%d)
122>>>>>>&-1 byte      >-2
123>>>>>>>&0 pstring   x                   %s
124# 3rd possible text description
125>>>>>>>>&0          byte      <9                  (%d)
126>>>>>>>>>&-1        byte      >-2
127>>>>>>>>>>&0        pstring   x                   %s
128# 4th possible text description
129>>>>>>>>>>>&0       byte      <9                  (%d)
130>>>>>>>>>>>>&-1     byte      >-2
131>>>>>>>>>>>>>&0     pstring   x                   %s
132# 5th possible text description
133>>>>>>>>>>>>>>&0    byte      <9        (%d)
134>>>>>>>>>>>>>>>&-1  byte      >-2
135>>>>>>>>>>>>>>>>&0  pstring   x         %s
136# 6th possible text description
137>>>>>>>>>>>>>>>>>&0 byte      <9        (%d)
138>>>>>>>>>>>>>>>>>>&-1         byte      >-2
139>>>>>>>>>>>>>>>>>>>&0         pstring   x         %s
140# 7th possible text description
141>>>>>>>>>>>>>>>>>>>>&0        byte      <9        (%d)
142>>>>>>>>>>>>>>>>>>>>>&-1 byte >-2
143>>>>>>>>>>>>>>>>>>>>>>&0 pstring x      %s
144
145# RZX input recording files
1460      string          RZX!            Spectrum .RZX data
147>4     byte            x               version %d
148>5     byte            x               \b.%d
149
150# Floppy disk images
1510      string          MV\ -\ CPCEMU\ Disk-Fil Amstrad/Spectrum .DSK data
1520      string          MV\ -\ CPC\ format\ Dis Amstrad/Spectrum DU54 .DSK data
1530      string          EXTENDED\ CPC\ DSK\ Fil Amstrad/Spectrum Extended .DSK data
1540      string          SINCLAIR        Spectrum .SCL Betadisk image
155
156# Hard disk images
1570      string          RS-IDE\x1a      Spectrum .HDF hard disk image
158>7     byte            x               \b, version %#02x
159
160# SZX snapshots (fuse and spectaculator)
161# Martin M. S. Pedersen <martin@linux.com>
162# http://www.spectaculator.com/docs/zx-state/header.shtml
163#
1640      string                 ZXST             zx-state snapshot
165>4     byte                   x                version %d
166>5     byte                   x                \b.%d
167>>6    byte                   0                16k ZX Spectrum
168>>6    byte                   1                48k ZX Spectrum/ZX Spectrum+
169>>6    byte                   2                ZX Spectrum 128
170>>6    byte                   3                ZX Spectrum +2
171>>6    byte                   4                ZX Spectrum +2A/+2B
172>>6    byte                   5                ZX Spectrum +3
173>>6    byte                   6                ZX Spectrum +3e
174>>6    byte                   7                Pentagon 128
175>>6    byte                   8                Timex Sinclair TC2048
176>>6    byte                   9                Timex Sinclair TC2068
177>>6    byte                10        Scorpion ZS-256
178>>6    byte                11        ZX Spectrum SE
179>>6    byte                12        Timex Sinclair TS2068
180>>6    byte                13        Pentagon 512
181>>6    byte                14        Pentagon 1024
182>>6    byte                15        48k ZX Spectrum (NTSC)
183>>6    byte                16        ZX Spectrum 12Ke
184>>>7   byte                   1                (alternate timings)
185