#------------------------------------------------------------------------------
# $File: spectrum,v 1.10 2023/05/08 01:33:36 christos Exp $
# spectrum:  file(1) magic for Spectrum emulator files.
#
# John Elliott <[email protected]>

#
# Spectrum +3DOS header
#
0       string          PLUS3DOS\032    Spectrum +3 data
>15     byte            0               - BASIC program
>15     byte            1               - number array
>15     byte            2               - character array
>15     byte            3               - memory block
>>16    belong          0x001B0040      (screen)
>15     byte            4               - Tasword document
>15     string          TAPEFILE        - ZXT tapefile
#
# Tape file. This assumes the .TAP starts with a Spectrum-format header,
# which nearly all will.
#
# Update: Sanity-check string contents to be printable.
#  -Adam Buchbinder <[email protected]>
# Update:       Joerg Jenderek 2023 May
# URL:          http://fileformats.archiveteam.org/wiki/TAP_(ZX_Spectrum)
# Reference:    http://web.archive.org/web/20110711141601/http://www.zxmodules.de/fileformats/tapformat.html
#               http://mark0.net/download/triddefs_xml.7z/defs/t/tap-zx.trid.xml
# Note:         called "ZX Spectrum Tape image" by TrID and "TAP (ZX Spectrum)" by DROID via PUID fmt/801
#               verified by fuse-emulator-utils `tzxlist EXAMPLES.TAP`
#
# headers length 19=023 and flag byte 0 indicating a standard ROM loading header
0       string          \023\000\000
>4      string          >\0
# skip {85CEE8D6-0F90-4492-B484-98E38862B28D}.2.ver0x0000000000000004.db {DDF571F2-BE98-426D-8288-1A9A39C3FDA2}.2.ver0x0000000000000001.db
# inside c:\ProgramData\Microsoft\Windows\Caches according to TrID and DROID
>>23    ubyte           =0xFF
# skip DROID fmt-801-signature-id-1166.tap with invalid name \253\253\253\253\253\253\253\253\253\253
# which looks like: "TF COPY II" "screen    " "\023\001TF" "  1943    "
>>>4     string          <\177           Spectrum .TAP data "%-10.10s"
#!:mime application/octet-stream
!:mime  application/x-spectrum-tap
!:ext   tap
>>>>3   byte            0       - BASIC program
# autostart line; 0..9999 are valid; 32768 means "no auto-loading"
>>>>>16 uleshort        x       \b, autostart line %u
# program length; length of BASIC program
>>>>>18 uleshort        x       \b, program length %u
>>>>3   byte            1       - number array
>>>>3   byte            2       - character array
>>>>3   byte            3       - memory block
# length of the following data 1B00h=6912 and start address 4000h=16384 in case of a SCREEN$ header
>>>>>14 belong          0x001B0040      (screen)
# unused 32768=8000h
>>>>>18 uleshort        !32768  \b, unused %u
# zxlength; length of the following data after the header
>>>>14  uleshort        x       \b, data length %u
#>>14   uleshort        x       \b, data length %#x
# checksum byte; simply all bytes (including flag byte) XORed
#>>>>20 ubyte           x       \b, checksum %#x

# The following three blocks are from [email protected]
# TZX tape images
# Update:       Joerg Jenderek 2023 May
# URL:          http://fileformats.archiveteam.org/wiki/TZX
# Reference:    https://worldofspectrum.net/TZXformat.html
#               http://mark0.net/download/triddefs_xml.7z/defs/t/tzx.trid.xml
# Note:         called "ZX Spectrum Tape image" by TrID and "TZX Format" by DROID via PUID fmt/1000
0      string          ZXTape!\x1a     Spectrum .TZX data
#!:mime application/octet-stream
!:mime  application/x-spectrum-tzx
# CDT is used for Amstrad tapes
!:ext   tzx/cdt
>8     byte            x               version %d
>9     byte            x               \b.%d
# ID of first block
>10     ubyte           x               \b; ID %#x
# turbo speed data block
>10     ubyte           =0x11           (turbo)
# length of PILOT tone (number of pulses)
>>21    uleshort        x               \b, %u pilot pulses
# length of PILOT pulse
>>11    uleshort        x               with %u tstates
# length of SYNC first pulse
>>13    uleshort        x               \b, %u and
# length of SYNC second pulse
>>15    uleshort        x               %u sync tstates
# length of ZERO bit pulse
>>17    uleshort        x               \b, %u zero tstates
# length of ONE bit pulse
>>19    uleshort        x               \b, %u one tstates
# used bits in the last byte
>>23    ubyte           x               \b, use %u bit
# plural s
>>23    ubyte           >1              \bs
# pause after this block in milliseconds
>>24    uleshort        x               \b, %u ms pause
# BYTE[3]; length of data that follow
>>26    ulelong&0x00FFffFF x            \b, %u data bytes
>10     ubyte           =0x20           (pause)
# pause duration in milliseconds
>>11    uleshort        x               %u ms
# text description
>10     ubyte           =0x30           (text)
# length of the text description
#>>11   ubyte           x               L=%u
>>11    pstring         x               "%s"
# archive text description in ASCII format
>10     ubyte           =0x32           (archive info)
# length of archive text
>>11    uleshort        x               \b, %#x bytes
# number of text strings
>>13    ubyte           x               with %u (type) text parts
# text type identification byte: 0~title 1~publisher 2~author 3~year 4~language 5~type 6~price 7~protection 8~origin ff~comment
>>14    byte            <9              (%d)
>>>14   byte            >-2
# length of text string
#>>>>15 ubyte           x               L=%u
>>>>15  pstring         x               %s
# 2nd possible text description
>>>>>&0 byte            <9              (%d)
>>>>>>&-1       byte    >-2
>>>>>>>&0       pstring x               %s
# 3rd possible text description
>>>>>>>>&0      byte    <9              (%d)
>>>>>>>>>&-1    byte    >-2
>>>>>>>>>>&0    pstring x               %s
# 4th possible text description
>>>>>>>>>>>&0   byte    <9              (%d)
>>>>>>>>>>>>&-1 byte    >-2
>>>>>>>>>>>>>&0 pstring x               %s
# 5th possible text description
>>>>>>>>>>>>>>&0        byte    <9      (%d)
>>>>>>>>>>>>>>>&-1      byte    >-2
>>>>>>>>>>>>>>>>&0      pstring x       %s
# 6th possible text description
>>>>>>>>>>>>>>>>>&0     byte    <9      (%d)
>>>>>>>>>>>>>>>>>>&-1   byte    >-2
>>>>>>>>>>>>>>>>>>>&0   pstring x       %s
# 7th possible text description
>>>>>>>>>>>>>>>>>>>>&0  byte    <9      (%d)
>>>>>>>>>>>>>>>>>>>>>&-1 byte   >-2
>>>>>>>>>>>>>>>>>>>>>>&0 pstring x      %s

# RZX input recording files
0      string          RZX!            Spectrum .RZX data
>4     byte            x               version %d
>5     byte            x               \b.%d

# Floppy disk images
0      string          MV\ -\ CPCEMU\ Disk-Fil Amstrad/Spectrum .DSK data
0      string          MV\ -\ CPC\ format\ Dis Amstrad/Spectrum DU54 .DSK data
0      string          EXTENDED\ CPC\ DSK\ Fil Amstrad/Spectrum Extended .DSK data
0      string          SINCLAIR        Spectrum .SCL Betadisk image

# Hard disk images
0      string          RS-IDE\x1a      Spectrum .HDF hard disk image
>7     byte            x               \b, version %#02x

# SZX snapshots (fuse and spectaculator)
# Martin M. S. Pedersen <[email protected]>
# http://www.spectaculator.com/docs/zx-state/header.shtml
#
0      string           ZXST           zx-state snapshot
>4     byte             x              version %d
>5     byte             x              \b.%d
>>6    byte             0              16k ZX Spectrum
>>6    byte             1              48k ZX Spectrum/ZX Spectrum+
>>6    byte             2              ZX Spectrum 128
>>6    byte             3              ZX Spectrum +2
>>6    byte             4              ZX Spectrum +2A/+2B
>>6    byte             5              ZX Spectrum +3
>>6    byte             6              ZX Spectrum +3e
>>6    byte             7              Pentagon 128
>>6    byte             8              Timex Sinclair TC2048
>>6    byte             9              Timex Sinclair TC2068
>>6    byte            10              Scorpion ZS-256
>>6    byte            11              ZX Spectrum SE
>>6    byte            12              Timex Sinclair TS2068
>>6    byte            13              Pentagon 512
>>6    byte            14              Pentagon 1024
>>6    byte            15              48k ZX Spectrum (NTSC)
>>6    byte            16              ZX Spectrum 12Ke
>>>7   byte             1              (alternate timings)