FAQ Archive

These items were removed from this FAQ as part of this update. If you feel these items should be restored, please contact us with an updated entry, and we'll include it in the next revision. Items listed in this section are included as a courtesy to their author(s) and will be removed after two subsequent revisions of the FAQ have taken place with no alteration to the entry shown. Entries marked as 'Expired' will remain in the archive, but will no longer be maintained.

Emulators - Acorn / RISC OS:
2 emulators for the Acorn / RISC OS platform appear to no longer be actively maintained and will be removed during later revisions.

  • MZX v1.10 - Pending Removal

    Emulates: 48K ZX Spectrum.
    Tape/Disk Formats: Loads and Saves .sna files.
    Requirements: Unknown.
    Created by: Graham Willmott.
    Last updated: Unknown.

  • Speculator - Pending Removal

    Emulates: 48K ZX Spectrum.
    Tape/Disk Formats: Emulator specific.
    Requirements: Unknown.
    Created by: Dave Lawrence.
    Last updated: Unknown.

Emulators - AmigaOS:
7 emulators for the AmigaOS appear to no longer be actively maintained and will be removed during later revisions.

  • CB Speccy v0.25b - Pending Removal

    Emulates: 128K ZX Spectrum.
    Tape/Disk Formats: Unknown.
    Requirements: Unknown.
    Created by: Code Busters.
    Last updated: May 24th, 1999.

  • KGB v1.3 - Pending Removal

    Emulates: Unknown.
    Tape/Disk Formats: Unknown.
    Requirements: Unknown.
    Created by: KGB support BBS.
    Last updated: September 30th, 1997.

  • Spectrum 128K Emulator v0.2 - Pending Removal

    Emulates: 48K / 128K ZX Spectrums.
    Tape/Disk Formats: Unknown.
    Requirements: Unknown.
    Created by: Alberto Ordóñez.
    Last updated: March 24th, 1999.

  • Spectrum v1.7 - Pending Removal

    Emulates: Unknown.
    Tape/Disk Formats: Unknown.
    Requirements: Unknown.
    Created by: Peter McGavin.
    Last updated: September 30th, 1997.

  • Speculator '97 - Pending Removal

    Emulates: 48K ZX Spectrum, partial 128K emulation.
    Tape/Disk Formats: .zx82 (Emulator specific), .kgb, .z80, .zx, .sp, .sna
    Requirements: Kickstart 2.04 and 68020 or above.
    Created by: William James.
    Last updated: 1997 or before.

  • Speccylator v1.0 - Pending Removal

    Emulates: 48K ZX Spectrum, partial 128K emulation.
    Tape/Disk Formats: Loads and Saves .sna files.
    Requirements: Kickstart 2.04.
    Created by: Richard Carlsson.
    Last updated: September 1996.

  • ZX-Spectrum v4.71 - Pending Removal

    Emulates: Unknown.
    Tape/Disk Formats: Unknown.
    Requirements: Unknown.
    Created by: Jeroen Kwast.
    Last updated: September 30th, 1997.

Emulators - Atari ST/TT:
2 emulators for the Atari ST and TT appear to no longer be actively maintained and will be removed during later revisions.

  • Specci v2.07 - Pending Removal

    Emulates: 48K Spectrum, ZX Interface I.
    Tape/Disk Formats: Loads and Saves .sna and .snx files.
    Requirements: Atari ST / TT.
    Created by: Christian Gandler.
    Last updated: Unknown.

    Comments: Not full speed. All documentation in German.

  • Speccy - Pending Removal

    Emulates: 48K Spectrum.
    Tape/Disk Formats: Unknown.
    Requirements: Unknown.
    Created by: Hansjoerg Oppermann.
    Last updated: Unknown.

Emulators - BeOS:
2 emulators for BeOS systems appear to no longer be actively maintained and will be removed during later revisions.

  • Beccy - Pending Removal

    Emulates: Unknown.
    Tape/Disk Formats: .tap and .sna files.
    Requirements: BeOS x86.
    Created by: Max Gontcharov.
    Last updated: March 5th, 2000

    Comments: Development preview (incomplete).

  • BeZX v1.1 - Pending Removal

    Emulates: Unknown.
    Tape/Disk Formats: .tap files.
    Requirements: Unknown.
    Created by: Jens Kilian.
    Last updated: April 5th, 2000

    Comments: A BeOS port of XZX-Pro. Available for PPC and x86 platforms. Source code is available.

Emulators - Macintosh:
1 emulator for the Macintosh appears to no longer be actively maintained and will be removed during later revisions.

  • MacSpeccy v1.1 - Pending Removal

    Emulates: 48K ZX Spectrum.
    Tape/Disk Formats: Loads .sna and .z80 files.
    Hardware requirements: 68040.
    Created by: Danny Keogan.
    Last updated: 1997 or before.

Emulators - MSX:
1 emulator for the MSX platform appears to no longer be actively maintained and will be removed during later revisions.

  • ROMU6 v2.07 - Pending Removal

    Emulates: 48K ZX Spectrum (BASIC only).
    Tape/Disk Formats: Direct tape loading.
    Requirements: MSX I / II with 128Kb Memory mapper.
    Created by: Cesar Hernandez and Juan Hernandez.
    Last updated: Unknown.

Emulators - Unix / Linux:
4 emulators available for Linux / UNIX systems appear to no longer be actively maintained and will be removed during later revisions.

  • SpectEmu v0.94 - Pending Removal

    Emulates: 48K ZX Spectrum.
    Tape/Disk Formats: .sna, .tzx, .tap and .z80 files.
    Requirements: Linux or other UNIX OS. Color X11 server and/or SVGALIB console graphics library on Linux.
    Created by: Miklos Szeredi.
    Last updated: May 18th, 1998.

  • Spectrum - Pending Removal

    Emulates: 48K ZX Spectrum.
    Tape/Disk Formats: .sna and .z80 files.
    Requirements: Intel 386 or above. Linux with XLib, sound card using /dev/audio at 8000 Hz.
    Created by: Lozevis Jean-Francois.
    Last updated: August 6th, 1996.

  • x128 v0.5 - Pending Removal

    Emulates: 128K ZX Spectrum.
    Tape/Disk Formats: .z80, .sna, .voc, .tap and .slt files.
    Requirements: Unix based machine running X-Windows.
    Created by: James McKay.
    Last updated: July 1996

  • xz80 v0.1d - Pending Removal

    Emulates: 48K ZX Spectrum.
    Tape/Disk Formats: .sna, .tap and .z80 files.
    Requirements: Tested on SunOS 4.1.1, HPUX 9.01, IRIX 5.2, AIX 3.2.5 and Linux 1.2.11.
    Created by: Ian Collier.
    Last updated: August 10th, 1995.

File Formats:
These entries were removed during this update. The formats are either emulator-specific, infrequently used, exceptionally well documented by their developers, or used primarily by emulators that have also been archived with this revision.

  • SP Format - Expired
       Offset   Size   Description
       ------------------------------------------------------------------------
       0        2      byte   "SP" (signature)
       2        2      word   Program length in bytes (normally 49152 for 48K
                              snaps, or 16384 for 16K snaps)
       4        2      word   Program location (normally 16384)
       6        8      word   BC,DE,HL,AF
       14       4      word   IX,IY
       18       8      word   BC',DE',HL',AF'
       26       2      byte   R,I
       28       4      word   SP,PC
       32       2      word   0 (reserved for future use)
       34       1      byte   Border color
       35       1      byte   0 (reserved for future use)
       36       2      word   Status word
       ------------------------------------------------------------------------
    
       Status word:
       Bit     Description
       ------------------------------------------------------------------------
       15-8    Reserved for future use
        7-6    Reserved for internal use (0)
          5    Flash: 0=INK/1=PAPER
          4    Interrupt pending for execution
          3    If 1, IM 0; if 0, bit 1 determines interrupt mode
               (Spectrum v 0.99e had this behaviour reversed, and this
               bit was not used in versions previous to v 0.99e)
          2    IFF2 (internal use)
          1    Interrupt Mode (if bit 3 reset): 0=>IM1, 1=>IM2
          0    IFF1: 0=DI/1=EI
  • ZX Format - Expired
    All values stored in big-endian format; on 680x0 the most significant byte goes first.
       Offset   Size   Description
       ------------------------------------------------------------------------
       0        49284  bytes  RAM dump 16252..65535
       49284    132    bytes  unused, make 0
       49416    10     word   10,10,4,1,1 (different settings)
       49426    1      byte   InterruptStatus (0=DI/1=EI)
       49427    2      byte   0,3
       49429    1      byte   ColorMode (0=BW/1=Color)
       49430    4      long   0
       49434    16     word   BC,BC',DE,DE',HL,HL',IX,IY
       49450    2      byte   I,R
       49452    2      word   0
       49454    8      byte   0,A',0,A,0,F',0,F
       49462    8      word   0,PC,0,SP
       49470    2      word   SoundMode (0=Simple/1=Pitch/2=RomOnly)
       49472    2      word   HaltMode  (0=NoHalt/1=Halt)
       49474    2      word   IntMode   (-1=IM0/0=IM1/1=IM2)
       49476    10     bytes  unused, make 0
       ------------------------------------------------------------------------
       Total: 49486 bytes
  • ZX82 Format - Pending Removal
    Amiga Speculator has its own file format called ZX82 format because it contains a file identifier in the first four bytes consisting of the ASCII characters "ZX82". The format has a 12 byte header which contains the normal Spectrum type file information like length, type, start etc. as well as a compression flag which is set if the file is byte run compressed. Snapshot files have a further 32 bytes of register values and border colour information. Listed below are the offset definitions taken from the Speculator source code in case you need to write a conversion utility. All registers and other values are in Motorola format (High, Low). I have defined everything in bytes to avoid any possible confusion.
    * The Standard ZX82 Header
    ZX_ID           rs.l    1       Identifier for a Speculator file "ZX82"
    ZX_Type         rs.b    1       0:BASIC 1:Numeric 2:String 3:Code 4:Snapshot
    ZX_Comp         rs.b    1       Is data block byte run compressed ? $00=No $FF=Yes
    ZX_Length_H     rs.b    1       File length up to 64k (ELINE-PROG for BASIC)
    ZX_Length_L     rs.b    1
    ZX_Start_H      rs.b    1       Start address for code (AUTOSTART for BASIC)
    ZX_Start_L      rs.b    1
    ZX_ProgLen_H    rs.b    1       Array name (VARS-PROG for BASIC)
    ZX_ProgLen_L    rs.b    1
    ZX_ZXHdrLen     rs.b    0       Length of ZX file header
    ZX_ZXData       rs.b    0       Start of Data block for standard ZX file
    
    * The extended Snapshot ZX82 Header
    ZX_Border       rs.b    1       Border colour
    ZX_IntMode      rs.b    1       IntMode over-ride (0=use i_reg, 1=im1 and 2=im2)
    ZX_Registers    rs.b    0       Z80 register values for Snapshot Files
    ZX_iy_H_reg     rs.b    1       (High then Low i.e. Motorola format)
    ZX_iy_L_reg     rs.b    1
    ZX_ix_H_reg     rs.b    1
    ZX_ix_L_reg     rs.b    1
    ZX_de_H_reg     rs.b    1
    ZX_de_L_reg     rs.b    1
    ZX_bc_H_reg     rs.b    1
    ZX_bc_L_reg     rs.b    1
    ZX_hl_H_reg     rs.b    1
    ZX_hl_L_reg     rs.b    1
    ZX_af_H_reg     rs.b    1
    ZX_af_L_reg     rs.b    1
    ZX_de_H_alt     rs.b    1
    ZX_de_L_alt     rs.b    1
    ZX_bc_H_alt     rs.b    1
    ZX_bc_L_alt     rs.b    1
    ZX_hl_H_alt     rs.b    1
    ZX_hl_L_alt     rs.b    1
    ZX_af_H_alt     rs.b    1
    ZX_af_L_alt     rs.b    1
    ZX_sp_H_reg     rs.b    1
    ZX_sp_L_reg     rs.b    1
    ZX_if_H_reg     rs.b    1
    ZX_if_L_reg     rs.b    1
    ZX_rf_H_reg     rs.b    1
    ZX_rf_L_reg     rs.b    1
    ZX_pc_H_reg     rs.b    1
    ZX_pc_L_reg     rs.b    1
    ZX_SnpHdrLen    rs.b    0       Length of Snapshot file header
    ZX_SnpData      rs.b    65496   Start of data block for Snapshot type file
    The ZX_Type field is derived from the MGT disciple directory MGT_Type-1, so further file types may be supported in this way in the future.

    The compression used is the standard byte run compression as used by ILBM IFF files. The whole 48k data block is compressed as if it were one long row. See Amiga ROM Kernel Reference Manual: Devices Third Edition, Appendix A - IFF Specification (P347), Appendix C - Example Packer C code (P538).

  • ITM and PAN Formats - Pending Removal
    These tape formats, used by the MSX Spectrum emulator, start with a two byte header; the first byte specifies the number of tape blocks in this file, and the second specifies which block has some data contained in the supplementary .pan file. (This byte is zero if there is no data in the .pan file).

    A sequence of tape blocks then follows; each block has a four byte header. The first byte of the header is the LSB of the length of the block, excluding the four byte header), the second byte is the MSB of the length, the third byte is unknown (the high nibble is always 0110), and the fourth byte is the block number (the first block is number 1). The data then follows; this is exactly as would be produced by the Spectrum's ROM routine, apart from the fact that there is no checksum byte at the end.

    For the block which is marked in the second byte of the file as having data in the .pan file, the actual block length is 12295 (0x3007) bytes longer than specified in the .itm file. The final 12295 bytes of the data block are stored as the first 12295 bytes of the .pan file.

    Finally, note that both the .itm and .pan files have apparently random bytes at the end. A converter for converting .itm/.pan files to .tap format is available, however.

  • NET Format - Pending Removal
    NET files are used by Warajevo to emulate the Interface I Network, which allowed up to 8 different Spectrums to communicate.

    The format of the network files is very simple. They have 260 bytes (or more, but excess bytes will not be used), with the following structure:
       Byte    Length  Description
    
         0       2     Package ID (used for fast checking whether content of the
                       Net file is changed)
         2       2     Reserved; not yet used          
         4     256     Content of the package
  • PAL Format - Pending Removal
    The WARAJEVO.PAL file is used by Warajevo to set its colour palette. They have a very simple 48-byte format: the first three bytes correspond to R, G and B value for color 0, next three bytes correspond to RGB for color 1, etc; the first 24 bytes are related to BRIGHT 0 colors, and next 24 bytes are related to BRIGHT 1. All values must be in the range 0-63.

  • TAP (Warajevo) Format - Pending Removal
    Warajevo's tape files (TAP) has the format as follows:

    At the beginning of the file there are four bytes with the pointer to the first block. Then follow four bytes with pointer to the last block. The next four bytes contain #FFFFFFFF. So, empty tape has a format:
    #04 #00 #00 #00 #00 #00 #00 #00 #FF #FF #FF #FF
    Sequence #00 #00 #00 #00 #FF #FF #FF #FF is, in fact, a EOF (end of file) marker. Every block contains following:

    • 4 bytes, a pointer to the previous block, which is 0 for first block;
    • 4 bytes, a pointer to the next block or to the EOF marker for last block;
    • 2 bytes, block size;
    • 1 byte, a flag byte;
    • the data bytes.

    If the block size is 65534, it is a block which contains tone record samples. The structure is:

    • 4 bytes, a pointer to the previous block, which is 0 for first block.
    • 4 bytes, pointer to the next block, or to the EOF marker for last block.
    • 2 bytes, value 65534.
    • 1 byte, a status byte; bits B0-B2 in this byte contain informations which tell how many bits in the last byte in the block are used (number of used bits is, in fact, number stored in B0-B2 increased by one), bits B3-B4 contain information about the sampling frequency (with meaning 00 - 15000 Hz, 01 - 22050 Hz, 10 - 30303 Hz, 11 - 44100 Hz), and bits B5-B7 are not used.
    • 2 bytes, decompressed (logical) block size.
    • 2 bytes, compressed (psychical) block size; if these 2 lengths are equal, the block is not compressed.
    • 2 bytes, signature length (internal, for compressed blocks).
    • the samples (binary), 8 samples are packed into one byte (starting from B7 to B0); whole package of such sample bytes may be either compressed or uncompressed (the last byte need not contain all 8 bits).

    If bytes 9, 10, 11 and 12 into a TAP file are not equal to #FF, this is TAP file which is not in native Warajevo TAP format. In this case, Warajevo assumes Z80's .tap format.

    If the block size is 65535, it is a compressed block. It looks like:

    • 4 bytes, a pointer to the previous block;
    • 4 bytes, pointer to next block;
    • 2 bytes, 65535;
    • 1 byte, a flag byte;
    • 2 bytes, decompressed size;
    • 2 bytes, compressed size;
    • 2 bytes, signature length (internal);
    • the data bytes.

    Signatures are important for the imploding algorithm used by Warajevo. This algorithm, when decompressing, copies bytes from the source file, or returns for a few bytes, and copies some bytes from a destination file.

    The explanation of compressed data bytes is rather complex. We used format similar to those in PKLITE, but unlike PKLITE where signature bytes are mixed with data bytes, authors divided them in two parts, for easier debugging.

    Remember elements of Imploding (LZ77) algorithm. It depends on copying of some byte sequences. For example:
    3D 18 2E 42 3D 18 2E 15 42 3D 19
    will be encoded as:
    3D 18 2E 42 [return for 4 bytes and copy 3 bytes]
       15 [return for 5,copy 2] 19
    The archivers differs on way of encoding of this special 'Return for...' code.

    In Warajevo compressed format, there are two parts: signatures and data. In our example coding of signatures will be (binary):
    00001001 010100xx
    while data bytes will be:
    3D 18 2E 42 04 15 05 19
    The signatures are finite automat that describe what to do with data bytes. If the bit is 0, this is simple data byte, if the bit is 1 this is code for returning.

    In our example, four zeros in signatures means that four bytes can be simply copied (3D, 18, 2E, 42) to output buffer. The next bit is 1. This means: Return for xxxx bytes and copy yyyy.

    The value of yyyy (size of string to be copied) is in signatures if less than 10 or in signatures and data bytes if >= 10.

    The size depends on next 2-4 signature bits:
        010: size=2
         00: size=3
        100: size=4
        101: size=5
        011: size>=10
       1100: size=6
       1101: size=7
       1110: size=8
       1111: size=9
    If size is greater or equal than 10, the next data byte contains actual size-10. That means: maximal string size is 265.

    The next data byte determine lower byte of distance of string to be copied (lower byte of xxxx). If size=2, higher bit is always zero (so for this size distance can be maximally 255). If size differs from 2 the next 1-6 signature bits determine higher byte:
            1: higher byte=0
         0000: higher byte=1
         0001: higher byte=2
        00100: higher byte=3
        00101: higher byte=4
        00110: higher byte=5
        00111: higher byte=6
       01nnnn: higher byte=7+nnnn
    Experiment with some ASCII text compressed. There is algorithm in Pascal for decompressing to understand the format:
    procedure decompress_b;
    label
      lb,b0,b1,b11,b01,b10,b110,b111,b010,b00,b100,b101,b011,b1100,
      b1101,b1110,b1111,v,v0,v1,v00,v01,v000,v001,v0000,v0001,v00100,v00101,
      v00110,v00111,v0010,v0011,izlaz;
    
    var
      b,put:byte;
      bytes,return_for,i,auxilary:word;
      finished:Boolean;
    begin
      OutputBufEnd:=0;
      CurrPosInputBuffer:=SignatureSize+1;
      CurrentSignaturePosition:=0;
      CurrentSignature:=InputBuffer^[CurrentSignaturePosition];
      BitCounter:=0;
      if duzina_ul_dek=0 then finished:=true else finished:=false;
      while not finished do begin
        if nextbit=0 then begin
          TakeFromInputBuffer(b,finished);
          PutToOutputBuffer(b);
        end
         else begin
           I know, it is  goto, but more readable than
            nested if then else sequences
            lb: if nextbit=0 then goto b0 else goto b1;
            b0: if nextbit=0 then goto b00 else goto b01;
            b1: if nextbit=0 then goto b10 else goto b11;
            b11: if nextbit=0 then goto b110 else goto b111;
            b01: if nextbit=0 then goto b010 else goto b011;
            b10: if nextbit=0 then goto b100 else goto b101;
            b110: if nextbit=0 then goto b1100 else goto b1101;
            b111: if nextbit=0 then goto b1110 else goto b1111;
            b010: bytes:=2;
              TakeFromInputBuffer(b,finished);
              return_for:=b;
              goto izlaz;
            b00: bytes:=3;goto v;
            b100: bytes:=4;goto v;
            b101: bytes:=5;goto v;
            b011: TakeFromInputBuffer(b,finished);
              bytes:=b+10;goto v;
            b1100: bytes:=6;goto v;
            b1101: bytes:=7;goto v;
            b1110: bytes:=8;goto v;
            b1111: bytes:=9;goto v;
            v: TakeFromInputBuffer(b,finished);
            return_for:=b;
            if nextbit=0 then goto v0 else goto v1;
            v0: if nextbit=0 then goto v00 else goto v01;
            v1:goto izlaz;
            v00: if nextbit=0 then goto v000 else goto v001;
            v01: Auxiliary:=7;
              if nextbit=1 then Auxiliary:=Auxiliary+8;
              if nextbit=1 then Auxiliary:=Auxiliary+4;
              if nextbit=1 then Auxiliary:=Auxiliary+2;
              if nextbit=1 then Auxiliary:=Auxiliary+1;
              return_for:=return_for+256*Auxiliary;
              goto izlaz;
            v000: if nextbit=0 then goto v0000 else goto v0001;
            v001: if nextbit=0 then goto v0010 else goto v0011;
            v0010: if nextbit=0 then goto v00100 else goto v00101;
            v0011: if nextbit=0 then goto v00110 else goto v00111;
            v0000: return_for:=return_for+1*256;goto izlaz;
            v0001: return_for:=return_for+2*256;goto izlaz;
            v00100: return_for:=return_for+3*256;goto izlaz;
            v00101: return_for:=return_for+4*256;goto izlaz;
            v00110: return_for:=return_for+5*256;goto izlaz;
            v00111: return_for:=return_for+6*256;goto izlaz;
            izlaz:
            for i:=1 to bytes do begin
              put:=OutputBuffer^[OutputBufEnd-return_for+1];
              PutToOutputBuffer(put)
            end;
         end else
      end while
    end; decompress_b