Top 10k strings from TZXformat.html.orig
in <root> / doc / technical / specifications /
Back to the directory listing
126 <td align="center">-</td> 114 <tr bgcolor="#c0f0ff"> 53 <tr bgcolor="#ffdf90"> 50 <td align="center">BYTE</td> 50 </tbody></table> 49 <td align="center">WORD</td> 46 <table align="center" bgcolor="#000000" border="0" cellpadding="2" cellspacing="1" width="70%"> 41 <td align="center">0x00</td> 40 <td align="center"><strong>Description</strong></td> 38 <tr bgcolor="#c0ffc0"> 38 <td align="center" width="8%"><strong>Offset</strong></td> 37 <td align="center" width="8%"><strong>Value</strong></td> 37 <td align="center" width="15%"><strong>Type</strong></td> 37 <tbody><tr bgcolor="#80a0ff"> 30 <tr bgcolor="#fff000"> 25 <p align="right"><a href="#ID_LIST">Return to ID list</a> - <a href="#INDEX">Return to index</a></p> 21 <tr bgcolor="#f7f7ff"> 15 <td align="center">N</td> 15 <td align="center">DWORD</td> 13 <td align="center">0x04</td> 13 <td align="center">0x02</td> 12 <td align="center">0x01</td> 12 00100000 - 0x20<br> 11 <td align="center">L</td> 11 <td align="center">0x10</td> 11 </td></tr> 8 <td align="center">CHAR[L]</td> 8 <td align="center">BYTE[3]</td> 8 00000000 - 0x00<br> 7 <td>Length of data that follow</td> 7 <td align="center">BYTE[N]</td> 7 <td align="center">0x14</td> 7 <td align="center">0x0A</td> 7 <td align="center">0x06</td> 7 <td align="center" bgcolor="#ff7848" width="10%"><font color="white" size="+2"><b> 7 <p><table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="12" width="100%"><tbody><tr> 7 </font></td></tr></tbody></table> 7 </b></font></td><td><font size="+2"> 6 <td align="center">CHAR[10]</td> 6 <td align="center">2</td> 6 <td align="center">0x0C</td> 6 <td align="center"> 5 <tr bgcolor="#ffc0c0"> 5 <tr bgcolor="#b0e0f0"> 5 <td>Data as in .TAP files</td> 5 <td align="center">0x15</td> 5 <td align="center">0x12</td> 5 <td align="center">0x08</td> 5 <td align="center">0x03</td> 5 <tbody><tr bgcolor="#ffc0c0"> 5 <p align="right"><a href="#DEPRECATED">Return to deprecated ID list</a> - <a href="#INDEX">Return to index</a></p> 5 <br><br><br> 4 <tr bgcolor="#ffff90"> 4 <td align="center">0x11</td> 4 <td align="center">0x0B</td> 4 <td align="center">0</td> 4 <br><p align="right"><font size="+2"><a href="#INDEX">Return to index</a></font></p> 4 </ul></li> 4 01010000 - 0x50<br> 3 <td>Pause after this block in milliseconds (ms.)</td> 3 <td>Pause after this block (ms.)</td> 3 <td>Block length (without these four bytes)</td> 3 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">02</font></strong></td> 3 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">00</font></strong></td> 3 <td align="center">BYTE[L]</td> 3 <td align="center">0x15+L</td> 3 <td align="center">0x0E</td> 3 <td align="center">0x09</td> 3 <td align="center">0x05</td> 3 <table border="0" width="100%"><tbody><tr><td width="10%"></td> 3 </td></tr></tbody></table> 2 <td>Total block length</td> 2 <td>Pause after this block (ms.) {1000}</td> 2 <td>Number of symbols in pilot/sync alphabet</td> 2 <td>Number of symbols in data alphabet</td> 2 <td>Number of pulses</td> 2 <td>Max pulses per symbol</td> 2 <td>Max pulses per data symbol</td> 2 <td>Length of the whole block (without these two bytes)</td> 2 <td>Length of the WHOLE block including the data (extension rule)</td> 2 <td>Length of following data</td> 2 <td>Description of the document in ASCII format</td> 2 <td><br><br> 2 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[00]+01</font></strong></td> 2 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[00,01,02,03]</font></strong></td> 2 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[00,01,02,03]+04</font></strong></td> 2 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">04</font></strong></td> 2 <td align="center">WORD[N]</td> 2 <td align="center">CHAR[N]</td> 2 <td align="center">Bit 0</td> 2 <td align="center">BYTE[]</td> 2 <td align="center">?</td> 2 <td align="center">2800</td> 2 <td align="center">1</td> 2 <td align="center">152 (0x98)</td> 2 <td align="center">1280</td> 2 <td align="center">1000 (0x03E8)</td> 2 <td align="center">0x22</td> 2 <td align="center">0x16</td> 2 <td align="center">0x15+L+1</td> 2 <td align="center">0x0D</td> 2 <td align="center">0x07</td> 2 <td align="center">(2)</td> 2 <tbody><tr bgcolor="#c0a0ff"> 2 <table border="0" width="100%"><tbody><tr><td width="10%"> </td> 2 <p align="right"><a href="#INDEX">Return to index</a></p> 2 <font size="1">This field is present only if TOTP>0</font> 2 11000001 - 0xC1 2 10000000 - 0x80<br> 2 01010011 - 0x53<br> 2 01001010 - 0x4A<br> 2 01000000 - 0x40<br> 2 00011011 - 0x1B<br> 2 00000011 - 0x03<br> 2 (e.g. if this is 6, then the bits used (x) in the last byte are: xxxxxx00, where MSb is the leftmost bit, LSb is the rightmost bit)</td> 1 zero-length pulse in the sequence.<br> 1 you would only include the entry that says that the game uses the 1 you might have to the TZX maintainers so that they can be included. <br><br> 1 you can include a list of sequences to be called. The 'nesting' of call 1 written in 3.5MHz clock. Also, there might be some junk bits (usually 7 1 write their own viewers (yeah, right ;) ). For inlay cards and other 1 would have an alphabet of four symbols, each associated to a specific 1 works on AND uses the hardware of a 128K Spectrum AND the game DOESN'T 1 work on a 48K Spectrum.<br> 1 word) after the ID (this length does not include these 4 length bytes). 1 won't work on any Spectrum or Spectrum variant, so there's no need to 1 with turbo or custom loading routines. Even though some of the newer 1 will be used. 1 while browsing the tape or changing the tape pointer.<br> 1 where each sequence (wave) can contain a different number of pulses 1 whatever) must be able to handle files of at least its major version 1 way to determine it is to calculate it from the timings you get when 1 view the raw data in the TZX file then you will have to mirror each 1 version 1.10 will have the length of the block in first 4 bytes (long 1 variable is given as 'W', the 'H' value is 'W/2'. Of course the best 1 used by their respective ROM loading routines (some of them are not 1 used by the C64. Most of the commercial software uses this type of 1 use the CALL blocks in the LOOP sequences and vice versa. The value is 1 use the 'User inserts the POKE value' feature. You can specify the 1 use it for something else than 'Instructions' - you can use it for 1 use extension .ZED. Also the description is added, in case you want to 1 use a single CR character (13 dec, 0D hex) to separate lines; also 1 us what the text means) and then the ASCII text. To make it possible to 1 tools and emulators to maintain full backward compatibility with old 1 to use this block is to spawn an external viewer, or the authors can 1 to as a 'pulse'.</li> 1 timings will change accordingly. In the above table the value of this 1 time is 0 then the emulator should wait for the user to press a key.<br><br> 1 through the game). Normally you would enter these pokes with the help 1 those blocks. However if this system variable is changed then the 1 this case. This also applies to 'Data' blocks that have some pause 1 this block was not used. All you have to do if you encounter this block 1 they are represented using a very simple RLE encoding structure which 1 there is the PILOT tone, then the two SYNC pulses (one wave) and after 1 the tape.<br> 1 the tape should be used on an Amstrad CPC with 4MHz clock then you 1 the same. </td></tr></tbody></table> 1 the game, author, publisher, year of publication, price (including the 1 the emulators will support this block directly, in which case you could 1 the emulators don't have to bother with finding out the timings and 1 the code itself, this isn't possible if you want to save the file to 1 the byte XOR-ed with the value in this field as the start value.</li> 1 the brackets. Other values are normal numbers. Example: [02,03]+0A 1 the block will be at most 1/8 the size of the equivalent VOC.<br> 1 the actual Tape loading is taking place (which doesn't do much sense). 1 the Sync value another, different, Data byte is sent to signal the 1 that uses two or four pulses (which are the same in pairs) per bit can 1 that the turbo loader block cannot be used. This is not like a VOC 1 that the actual DATA (which can include a FLAG byte at the beginning 1 that load one level at a time in 48K mode, but load the entire tape at 1 that is in Spectrum Video format (that's why the Description is there 1 that could be represented with this file format then let us know.<br> 1 that block. </li><li>Just in case:<br> 1 that are used in the 'Hardware info' block. Please send any additions 1 tape, or to a real Spectrum. And with all this information in the file, 1 sync tones used by some protection schemes.<br> 1 stores the symbol and the number of times it must be repeated.<br> 1 starts, where to rewind to when the game ends, etc. This description is 1 starting to play a TZX file, either from the start or from a certain 1 start of the data. The Data Bits are made from ONE wave only and there 1 standard sampling frequencies of 22050 or 44100 Hz. This will ensure 1 standard ROM and similar tape blocks. It is made so basically anything 1 square brackets [] mean that the value must be read from the offset in 1 speed, and therefore the 'Standard Speed Data' block can be used for 1 specified number of times.<br> 1 sound chip (AY) of the 128K Spectrum and none of its extra memory then 1 skip this block, if needed, the length of the whole block is at the 1 since this is a very important part for emulators.<br> 1 simple pictures (drawing, maps, etc.) use the GIF format. <br><br> 1 should multiply ALL timings with 4/3.5 when you use that tape (this 1 should jump back to the start of the loop if it hasn't been run for the 1 should follow immediately; not even so much as one T state between them.</li> 1 should be trivial). Similarly goes for SAM Coupe, that uses a 6MHz 1 sequence of pulses (wave).<br><br> 1 separately-loadable parts. With this block, you are able to select one 1 separately because the original is either encrypted (like with the 1 sampling the Pilot tone. The values in the table could be by a fraction 1 same tape encoding is used as for the standard speed data block. If a 1 same mechanism is used to replay data for all machines then there will 1 revision 1.13, and then passed to Martijn v.d. Heide. 1 required by a particular emulator, or even poke data. 1 represented with 4 pulses and bit 1 with 8 pulses.<br> 1 represented by one bit only (0 for low, 1 for high) which means that 1 relative for the obvious reasons - so that you can add some blocks in the 1 recommended way of doing this is to include a Pause after each sequence 1 purpose of storing the instructions to the program or game that is in 1 pulses. The number of columns (i.e. pulses) of the table is the length 1 pulse should go to 'low'. At the end of a 'Pause' block the 'current 1 pulse level' is well-defined in every sequence of blocks where this is 1 pulse level' is low (note that the first pulse will therefore not 1 preferable to use a utility to join the two files and ensure that they 1 position. The writer of a TZX file should ensure that the 'current 1 point at which to insert the POKEs in the 'General description' field.<br> 1 please use only up to 80 characters per line. 1 played will be the block after the last CALL block (or the next Call, 1 pictures that have zillions of colours use the JPEG format, for more 1 other things.<br> 1 other formats support. Please inform me of any additions/corrections 1 original value of the address (if you want to restore it some way 1 original loading screen then you can supply it separately within this 1 origin (Original, Budget re-release, ...), etc. This block is built in 1 or when it is a multiload. Of course, to make some use of it the 1 or emulator requests it.<br> 1 or 8) AFTER the checksum (XOR) byte at the end of the block, but they 1 only up to 30 characters per line and separate the lines by one CR (13 1 once if in 128K mode.<br> 1 official). If you know of any other machines that have similar encoding 1 of the real ones, but it should not matter. Note: All timings are 1 of the parts and the utility/emulator will start loading from that 1 of the longest sequence amongst all (MAXP=NPP or NPD, for pilot/sync or 1 of text strings. Each text has its identification number (which tells 1 of some freezer-type tool like Multiface, but hopefully in the future 1 of protection schemes) then use the next three blocks to describe it. <br> 1 of blocks.</li> 1 of blocks, each identified by an ID byte.<br> 1 number. If your program can handle (say) version 1.05 and you encounter 1 not guaranteed to be shown while the tape is playing, but can be read 1 necessary to avoid any ambiguities, e.g. with custom loaders which are level-sensitive.<br> 1 milliseconds. If the value is 0 then the emulator or utility should (in 1 means: get number (a word) from offset 02 and add 0A. All numbers are 1 machine/hardware combination then do not include it in the list.<br> 1 lots of subblocks like Bleepload (which may well have over 160 custom loading 1 look at 'Jump To Block' for reference on the values.<br> 1 loading, so the bit 1 pulse must be read from the pilot tone and bit 0 1 list this information.<br> 1 levels respectively. The 'current pulse level' after playing a Direct 1 just set the description length field to 0 when you use it for that. 1 it, even if it cannot handle all the data in the file.<br> 1 it might contain some information written by a utility, extra settings 1 is the opposite of the last pulse level played, so that a subsequent pulse will produce an edge. </li> 1 is not important, as long as it is done consistently.</li> 1 is made for the ZX Spectrum and complies with the following: 1 is implemented as ear=1 and ear=0 respectively or the other way around 1 is here so that you can easily copy the files together and use them. Of 1 is an 48K Spectrum. This block is to be used for multiloading games 1 is NO XOR checksum either! Trailing byte is played AFTER the DATA has 1 info (like the 'Bleepload' loader). Of course not only loading screens 1 include only machines and hardware for which you are 100% sure that it 1 in the ID 10, ID 11 blocks. You can define how long the pulse is and 1 in hex.</li> 1 important, i.e. in any sequence that includes a 'Direct recording' 1 immediately produce an edge). A 'Pause' block of zero duration is 1 if the Call block had multiple calls).<br> 1 how many pulses are in the tone. 1 have to change in the future; for RISC OS, the current TAP file type 1 have now been deprecated and they should not appear in TZX files v1.20 1 hardware of the 128K Spectrum, then you would just include the 128K 1 from the others. In this way we can have a situation where bit 0 is 1 from the ZX Spectrum files, otherwise the inner structure is totally 1 frequency type encoding. Each bit is represented by one 'wave' of 1 frequencies.<br><br> 1 for), but because the Loading Screen will be the most common you can 1 for custom loading routines that use the same timings as ROM ones do.<br> 1 file. The value is a signed short word (usually 'signed short' in C); 1 file, since the information is much more compact. Each sample value is 1 file too. So cover pictures, maps, etc. can now be included in full 1 extensions.<br> 1 executes a sequence of blocks that are somewhere else and then goes 1 ended.<br> 1 encounters such a block. All offsets are relative signed words.<br> 1 encoding, i.e. the Pilot tone is not made from one type of Wave only, 1 emulators. For now it contains info on everything I could find that 1 emulator/utility has to show a menu with the selections when it 1 either runs (or doesn't run) on or with, or you know it uses (or 1 effect) STOP THE TAPE, i.e. should not continue loading until the user 1 duration included in them.</li> 1 down to about 30 so the programs can show it in one line (where this is 1 doesn't use) the hardware or special features of that machine.<br> 1 distinct waves; for example, imagine a loader which writes two bits at 1 different duration for bit 0 and bit 1. Normally bit 1 is twice as big 1 differences between these machines and a table which displays timings 1 defined for other machines too, e.g. the Amstrad CPC and C64, but they 1 decimal (0D hex).</li> 1 data) is associated to a specific sequence of pulses, 1 data to be MSb first. This might lead to some confusion, but if the 1 data blocks respectively); shorter waves are terminated by a 1 currency), type of software (arcade adventure, puzzle, word processor, 1 course, this means that resulting file would be 10 bytes longer than if 1 correct playback when using PC's soundcards.</li> 1 containing the major and minor version numbers.<br> 1 computers only. Specialized versions of the TZX format have been 1 computers do. It stores the LSb first, but the data blocks require the 1 compression format, see the <a href="http://www.ramsoft.bbk.org/csw.html">CSW documentation</a>.<br> 1 completely ignored, so the 'current pulse level' will NOT change in 1 colour (or whatever the formats supports). The best way for utilities 1 clock and Jupiter ACE that uses 3.2448 MHz and Enterprise that uses 4 1 can vary from 1000 to 2000 baud.<br> 1 can just be ignored.<br> 1 can have several lines, which should be separated by ASCII code 13 1 can be stored here... you can use it to store maps or any other picture 1 can be read from the sync pulses, and is always half the size of bit 1. 1 byte to get the correct values.<br> 1 but it is made from actual Data byte which is repeated many times. As 1 blocks. Header blocks have 8063 and data blocks have 3223 pilot pulses.<br> 1 blocks, you can use this block to tell how many times they should be 1 blocks). You can also give the group a name (example 'Bleepload Block 1').<br> 1 blocks is also not allowed for the simplicity reasons. You can, of course, 1 block. This is also very handy when you want the loading screen stored 1 block. For example you can use it when the game has a separate Trainer 1 block, or that depends on edges generated by 'Pause' blocks. The 1 block should use some non-standard sync or pilot tones (i.e. all sorts 1 block (ID 40). These block IDs are now reserved. 1 beginning of the file without disturbing the call values. Please take a 1 beginning of it.<br> 1 be written with it.<br><br> 1 be no problem. Just store the data as MSb first, but if you want to 1 be at least 1 ms. pause of the opposite level and only after that the 1 back to the next block. Because more than one call can be normally used 1 b0-b1: starting symbol polarity<br> 1 attributes), different type faces, colours, etc. Normally these files 1 as one single (composite) block. This is very handy for tapes that use 1 as bit 0. In the blocks, the timings are presented with Z80 T-states 1 as a consequence, it appears that almost no existing TZX files contain them. 1 are now available as distinct file formats with other filename 1 are both of the higher version number.<br> 1 appropriate).<br> 1 and then continue with the next block.<br> 1 and above. 1 and a CHECKSUM byte at the end).<br><br> 1 and Jupiter ACE use different tape encoding than the others. 1 and 'smarter' emulators can find most of the info about the loader from 1 all the tape blocks (level data, etc.) in the same file. Only .Z80 and 1 additional info on the timings and other important differences. The 1 accurate information then we would be glad to include it here. 1 according to a 3.5MHz clock (the standard Spectrum 16/48K clock), so if 1 a way that allows easy future expansion. The block consists of a series 1 a time by encoding them with four distinct pulse lengths: this loader 1 a file with version number 1.06, your program must be able to handle 1 ZX-Spectrum and its documents can contain text, graphics (with Spectrum 1 ZX-Editor. This utility gives documents the look and feel of 1 ZX-81 Jupiter ACE and Enterprise. Only ZX-81 (or the old Timex 1000) 1 When this block is encountered, the tape will stop ONLY if the machine 1 Use this block at the beginning of the tape to identify the title of 1 To ensure that the last edge produced is properly finished there should 1 To ensure consistency with all other ASCII texts in this format please 1 To be able to use a TZX file, your program (emulator, utility, or 1 Thus the length of the whole data stream in bits is NB*TOTD, or in bytes DS=ceil(NB*TOTD/8). 1 Those bits that are not used by the emulator that stored the info, should be left at their DEFAULT values.<br> 1 This would enable one to snapshot the game at the start and still have 1 This will produce a tone which is basically the same as the pilot tone 1 This will make a silence (low amplitude level (0)) for a given time in 1 This will enable the emulators to display a message for a given time. 1 This should not stop the tape and it should not make silence. If the 1 This should enable programs that can only handle older versions to skip 1 This is the same as in the turbo loading data block, except that it has no pilot or sync pulses.<br> 1 This is the same as BASIC's NEXT statement. It means that the utility 1 This is the list of all hardware types and hardware identification ID's 1 This is meant to identify parts of the tape, so you know where level 1 1 This is a special block that would normally be generated only by 1 This indicates the end of a group. This block has no body.<br> 1 This file format is explicitly targeted to the ZX Spectrum compatible 1 This document has passed W3C HTML 4.0 Validation. 1 This blocks contains information about the hardware that the programs on this tape use. Please 1 This block will enable you to jump from one block to another within the 1 This block sets the current signal level to the specified value (high or low). It should be used whenever it is 1 This block must be replayed with the standard Spectrum ROM timing values - see the values in curly brackets in block ID 11. 1 This block marks the start of a group of blocks which are to be treated 1 This block is very similar to the normal TAP block but with some 1 This block is useful when the tape consists of two or more 1 This block is used for tapes which have some parts in a format such 1 This block is the same as the FOR statement in BASIC.<br> 1 This block is made to support another type of encoding that is commonly 1 This block is generated when you merge two ZX Tape files together. It 1 This block is an analogue of the CALL Subroutine statement. It basically 1 This block indicates the end of the Called Sequence. The next block 1 This block has no body.<br> 1 This block has no body of its own, but follows the extension rule.<br> 1 This block has been specifically developed to represent an extremely wide range of data encoding techniques.<br> 1 This block contains a sequence of raw pulses encoded in CSW format v2 1 This block can hold files created with the new utility called 1 This block can be used to save any information you want. For example, 1 These were only some examples of the usage of this block. 1 These values are in decimal.</li> 1 Their structure is documented here for completeness, to allow general 1 The very same data information encoded to work with the ZX81 would look like this:<br> 1 The text message should: 1 The standard value is 112, which is VERY close to ZX Spectrum loading 1 The replay procedure looks like this: 1 The purpose of this custom block is to hold any amount of different trainers for the game. 1 The preferred sampling frequencies are 22050 or 44100 Hz (158 or 79 1 The pilot tone consists in 8063 pulses if the first data byte (flag byte) is < 128, 1 The numbers in brackets [] represent the values for C64 ROM loader.<br> 1 The list of hardware types and IDs is somewhat large, and may be found at the end of the format description.<br> 1 The information about what hardware the tape uses is in the 'Hardware Type' block, so no need for it here.<br> 1 The format was first started off by Tomaz Kac who was maintainer until 1 The following blocks, which were in the format until revision 1.13 (inclusive), 1 The file is identified with the first 8 bytes being 'ZXTape!' plus the 1 The emulator should take care of that the snapshot is not taken while 1 The description can be up to 255 characters long but please keep it 1 The default format file extension is "TZX" and hopefully this won't 1 The checksum is also different than the other two machines. The speed 1 The basic idea is that each loading component (pilot tone, sync pulses, 1 The alphabet is stored using a table where each symbol is a row of 1 TZX is a file format designed to preserve all (hopefully) of the tapes 1 TZX files. 1 TZX files v1.20 and above: C64 blocks (ID 16 and ID 17), Emulation Info (ID 34), Snapshot 1 TZX file format 1 T-states/sample). Please, if you can, don't use other sampling 1 Spectrum in the list (because by default it has to work on 48K too).<br> 1 Some of the most common uses of the Custom info block (ID 35) have become standardized in the past revisions, although now they are deprecated:<br> 1 Some explanation: 1 Some examples: <ul> 1 SYMDEF[1]:<br> 1 SYMDEF[1]: ( 0, 667, 735) 1 SYMDEF[1]: ( 0, 1710, 1710) 1 SYMDEF[0]:<br> 1 SYMDEF[0]: ( 0, 855, 855 )<br> 1 SYMDEF[0]: ( 0, 2168, 0 )<br> 1 Rules and definitions 1 Revision history 1 Recording block of CSW recording block is the last level played.</li> 1 ROM load/save routine for each of these machines. If you have more 1 Please use this block only if you cannot use any other block.<br> 1 Please use 'Archive Info' block for title, authors, publisher, etc.<br> 1 PRLE[1]: ( 1, 1) 1 PRLE[0]: ( 0, 8063 )<br> 1 NOTE: All ASCII Descriptions can use more than one line. Please use 1 Most commonly, pilot and sync are repetitions of the same pulse, thus 1 Machine specific information 1 MSb = most significant bit<br> 1 MSB = most significant byte<br> 1 MAPs, etc.<br><br> 1 LSb = least significant bit<br> 1 LSB = least significant byte<br> 1 Just skip these 9 bytes and you will end up on the next ID.</td> 1 Introduction 1 If, for example, game works on BOTH ZX 48K and 128K, and uses the 1 If you're looking for TZX files, you can find an extensive collection at Martijn van der Heide's '<a href="http://www.worldofspectrum.org/">World of Spectrum</a>'.<br> 1 If you have any questions about the format, visit the forums at <a href="http://www.worldofspectrum.org/">World of Spectrum</a> and ask.<br> 1 If you have a sequence of identical blocks, or of identical groups of 1 If you do not obey these rules, emulators may display your message in any way they like.<br> 1 If you can avoid using this block for this purpose, then do so; it is 1 If you are not sure or you haven't tested a tape on some particular 1 If the tape runs only on the ZX81 (and TS1000, etc.) then it clearly 1 If the game works on both 48K and 128K Spectrum, but it only uses the 1 If the game is 128K ONLY then you would include two entries: The game 1 If all texts on the tape are in English language then you don't have to supply the 'Language' field<br> 1 ID is to skip next 9 bytes.<br> 1 However note that these blocks have not proven to be useful and, 1 Here is a table showing the pulse timings for each part of the standard 1 Hardware information reference 1 For simplicity reasons don't nest loop blocks!<br> 1 For each group start block, there must be a group end block. Nesting of groups is not allowed.<br> 1 For each POKE entry you can supply the memory page number and/or the 1 Finally you can include any picture (in supported formats) in the TZX 1 Enterprise has two loading speeds so timings for both are included. 1 Each trainer can have its own description and any number of POKEs.<br> 1 Each symbol in the data stream is represented by a string of NB bits of the block data, where NB = ceiling(Log2(ASD)). 1 Deprecated blocks 1 Currently supported machines are: ZX Spectrum, Amstrad CPC, SAM Coupe, 1 By default you don't have to write any of the information if the game 1 At the end of this document you can find a description of encoding 1 Any number of data symbols is allowed, so we can have more than two 1 And when an emulator encounters the snapshot block it should load it 1 Amstrad CPC files should use the extension "CDT" to distinguish them 1 Also the border colour can be specified. <br><br> 1 Also added the following field: 1 All blocks are included in the block count!<br> 1 All Custom info (ID 35) types standardized up to Revision 1.13 are now deprecated.</li> 1 Again, this block has no body.<br> 1 After that, Ramsoft were the maintainers for a brief period during which the v1.20 revision was put together. 1 A typical Spectrum's standard loading header can be represented like this:<br> 1 <tr bgcolor="#8080d0"> 1 <td>ZERO bit pulse</td> 1 <td>ZERO bit 2nd wave pulse length [896]</td> 1 <td>ZERO bit 1st wave pulse length [616]</td> 1 <td>XOR Checksum bit for each Data byte: [1] <br> 1 <td>Value: { "XTape!",0x1A,MajR,MinR } <br> 1 <td>Used bits in the last byte (other bits should be 0) {8}<br> 1 <td>Used bits in last byte (other bits should be 0)<br>(e.g. if this is 6, then the bits used (x) in last byte are: xxxxxx00)</td> 1 <td>Used bits in last byte (other bits should be 0)<br> 1 <td>Used bits in last byte (other bits should be 0) [8]<br>(e.g. if this is 6, then the bits used (x) in last byte are: xxxxxx00)</td> 1 <td>Used bits (samples) in last byte of data (1-8)<br>(e.g. if this is 2, only first two samples of the last byte will be played) 1 <td>Trainer description length</td> 1 <td>Trainer description in ASCII format</td> 1 <td>Trainer definitions</td> 1 <td>Trailing byte</td> 1 <td>Total number of symbols in pilot/sync block</td> 1 <td>Total number of symbols in pilot/sync block (can be 0)</td> 1 <td>Total number of symbols in data stream (can be 0)</td> 1 <td>Total number of symbols (bits, in this case) in data stream</td> 1 <td>Total number of records in pilot/sync block</td> 1 <td>Total number of records in data stream</td> 1 <td>Time (in seconds) for which the message should be displayed</td> 1 <td>The picture itself</td> 1 <td>The ZX-Editor document (.ZED file)</td> 1 <td>Text string in ASCII format</td> 1 <td>Text identification byte:<br> 1 <td>Text description in ASCII format</td> 1 <td>TZX signature</td> 1 <td>TZX minor revision number</td> 1 <td>TZX major revision number</td> 1 <td>TRAILING TONE pulse length [616]</td> 1 <td>Symbol to be represented</td> 1 <td>Symbol flags<br> 1 <td>Snapshot type:<br> 1 <td>Snapshot length</td> 1 <td>Snapshot itself</td> 1 <td>Signal level (0=low, 1=high)</td> 1 <td>Screen refresh delay : 1 - 255 (interrupts between refreshes) [1]<br>(used when screen refresh mode is ON) 1 <td>Screen in standard Spectrum video format</td> 1 <td>Sampling rate</td> 1 <td>Samples data. Each bit represents a state on the EAR port (i.e. one sample).<br>MSb is played first.</td> 1 <td>SYNC first wave pulse length [1176]</td> 1 <td>SYNC 2nd wave pulse length [896]</td> 1 <td>Reserved for future expansion</td> 1 <td>Relative jump value</td> 1 <td>Relative Offset</td> 1 <td>Pulses' lengths</td> 1 <td>Pilot/sync symbol definitions</td> 1 <td>Pilot/sync data block</td> 1 <td>Pilot and sync symbols definition table<br> 1 <td>Pilot and sync data stream<br> 1 <td>Picture format:<br> 1 <td>Pause duration (ms.)</td> 1 <td>Pause after this block (ms)</td> 1 <td>Pause after this block (in ms).</td> 1 <td>POKEs definitions</td> 1 <td>POKE value (leave 0 if 'user inserts' bit set)</td> 1 <td>POKE type:<br> 1 <td>POKE original value (leave 0 if 'unknown' bit set)</td> 1 <td>POKE address</td> 1 <td>PILOT TONE pulse length [616]</td> 1 <td>ONE bit pulse</td> 1 <td>ONE bit 2nd wave pulse length [616]</td> 1 <td>ONE bit 1st wave pulse length [896]</td> 1 <td>Number of waves in TRAILING TONE</td> 1 <td>Number of waves in PILOT TONE</td> 1 <td>Number of trainers</td> 1 <td>Number of trailing bytes</td> 1 <td>Number of text strings</td> 1 <td>Number of stored pulses (after decompression, for validation purposes) 1 <td>Number of selections</td> 1 <td>Number of repetitions</td> 1 <td>Number of repetitions (greater than 1)</td> 1 <td>Number of pokes in this trainer</td> 1 <td>Number of pilot/sync symbols in the alphabet table (0=256)<br> 1 <td>Number of machines and hardware types for which info is supplied</td> 1 <td>Number of lead-in bytes</td> 1 <td>Number of data symbols in the alphabet table (0=256)<br> 1 <td>Number of calls to be made</td> 1 <td>Number of T-states per sample (bit of data)</td> 1 <td>Message that should be displayed in ASCII format</td> 1 <td>Maximum number of pulses per pilot/sync symbol<br> 1 <td>Maximum number of pulses per data symbol<br> 1 <td>List of text strings</td> 1 <td>List of selections</td> 1 <td>List of machines and hardware</td> 1 <td>Length of the text message</td> 1 <td>Length of the group name string</td> 1 <td>Length of the following data</td> 1 <td>Length of the custom info</td> 1 <td>Length of the block without these four bytes (0)</td> 1 <td>Length of text string</td> 1 <td>Length of samples' data</td> 1 <td>Length of one pulse in T-states</td> 1 <td>Length of description text</td> 1 <td>Length of ZERO bit pulse</td> 1 <td>Length of ZERO bit pulse {855}</td> 1 <td>Length of SYNC second pulse {735}</td> 1 <td>Length of SYNC first pulse {667}</td> 1 <td>Length of PILOT tone (number of pulses) {8063 header (flag<128), 3223 data (flag>=128)}</td> 1 <td>Length of PILOT pulse {2168}</td> 1 <td>Length of ONE bit pulse</td> 1 <td>Length of ONE bit pulse {1710}</td> 1 <td>Lead-in byte</td> 1 <td>Interrupt Frequency : 0 - 999 Hz</td> 1 <td>Instructions text in ASCII format</td> 1 <td>Identification string (in ASCII)</td> 1 <td>Hardware type</td> 1 <td>Hardware information:<br> 1 <td>Hardware ID</td> 1 <td>Group name in ASCII format (please keep it under 30 characters long)</td> 1 <td>General purpose (bit-mapped) [0]<br> 1 <td>General emulation flags:<br> 1 <td>General description length</td> 1 <td>General description in ASCII format</td> 1 <td>General Purpose, bit-mapped: [1]<br> 1 <td>FINISH DATA 2nd wave pulse length [616]</td> 1 <td>FINISH DATA 1st wave pulse length [1176]</td> 1 <td>FINISH BYTE 2nd wave pulse length [896]</td> 1 <td>FINISH BYTE 1st wave pulse length [1176]</td> 1 <td>End of text file marker</td> 1 <td>Description text (please use single line and max. 30 chars)</td> 1 <td>Description of the picture in ASCII format</td> 1 <td>Description length (if this is 0 then handle it as 'Loading Screen')</td> 1 <td>Description length (if this is 0 then handle it as 'Instructions')</td> 1 <td>Description length (if this is 0 then handle it as 'Inlay Card')</td> 1 <td>Data symbols definition table<br> 1 <td>Data symbol definitions<br> 1 <td>Data symbol definitions</td> 1 <td>Data stream<br> 1 <td>Data stream</td> 1 <td>Data stream:<br> 1 <td>Custom info</td> 1 <td>Compression type<br> 1 <td>CSW data, encoded according to the CSW file format specification.</td> 1 <td>BORDER Colour in Spectrum colour format (0=black, 1=blue, ...)</td> 1 <td>Array of pulse lengths.</td> 1 <td>Array of call block numbers (relative-signed offsets)</td> 1 <td>Additional bits in bytes (bit-mapped)<br> 1 <td>10 - Graphics</td> 1 <td>0F - EPROM programmers</td> 1 <td>0E - AD/DA converters 1 <td>0D - Keyboards & keypads</td> 1 <td>0C - Network adapters</td> 1 <td>0B - Digitizers</td> 1 <td>0A - Modems</td> 1 <td>09 - Printers</td> 1 <td>08 - Parallel ports</td> 1 <td>07 - Serial ports</td> 1 <td>06 - Other controllers</td> 1 <td>05 - Mice</td> 1 <td>04 - Joysticks</td> 1 <td>03 - Sound devices</td> 1 <td>02 - ROM/RAM type add-ons</td> 1 <td>01 - External storage</td> 1 <td>00 - Computers</td> 1 <td>"ZX-Edit document" (custom block ID)</td> 1 <td>"Spectrum Screen" + 1 spaces (custom block ID)</td> 1 <td>"Picture" + 9 spaces (custom block ID)</td> 1 <td>"POKEs" + 11 spaces (custom block ID)</td> 1 <td>"Instructions" + 4 spaces (custom block ID)</td> 1 <td> Length of the text description</td> 1 <td colspan="4"><strong><font color="#ffffff" size="+2">TRAINER structure format</font></strong></td> 1 <td colspan="4"><strong><font color="#ffffff" size="+2">TEXT structure format</font></strong></td> 1 <td colspan="4"><strong><font color="#ffffff" size="+2">POKE structure format</font></strong></td> 1 <td colspan="4"><strong><font color="#ffffff" size="+2">HWINFO structure format</font></strong></td> 1 <td colspan="4"><font color="#ffffff" size="+2"><strong>SYMDEF structure format</strong></font></td> 1 <td colspan="4"><font color="#ffffff" size="+2"><strong>SELECT structure format</strong></font></td> 1 <td colspan="4"><font color="#ffffff" size="+2"><strong>PRLE structure format</strong></font></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">TZX Header</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 5A - "Glue" block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 40 - Snapshot block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 35 - Custom info block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 34 - Emulation info</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 33 - Hardware type</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 32 - Archive info</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 31 - Message block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 30 - Text description</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 2B - Set signal level</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 22 - Group end</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 21 - Group start</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 20 - Pause (silence) or 'Stop the Tape' command</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 19 - Generalized Data Block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 18 - CSW Recording</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 17 - C64 Turbo Tape Data Block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 16 - C64 ROM Type Data Block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 15 - Direct Recording</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 14 - Pure Data Block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 13 - Pulse sequence</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 12 - Pure Tone</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 11 - Turbo Speed Data Block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#ffffff" size="+2">ID 10 - Standard Speed Data Block</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[10,11,12,13]+14</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[0F,10,11]+12</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[07,08,09]+0A</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[05,06,07]+08</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[02,03]+04</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[01]+02</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[01,02,03]+04</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[00]*03+01</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[00]*02+01</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[00,01]+02</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">[00,01]*02+02</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">10 bytes</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">09</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">08</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2">05</font></strong></td> 1 <td colspan="4" align="center"><strong><font color="#606060" size="-2">length: </font><font color="#ff6060" size="-2"> [00,01]+02</font></strong></td> 1 <td colspan="4" align="center"><font color="#ffffff" size="+2"><strong>ID 2A - Stop the tape if in 48K mode</strong></font></td> 1 <td colspan="4" align="center"><font color="#ffffff" size="+2"><strong>ID 28 - Select block</strong></font></td> 1 <td colspan="4" align="center"><font color="#ffffff" size="+2"><strong>ID 27 - Return from sequence</strong></font></td> 1 <td colspan="4" align="center"><font color="#ffffff" size="+2"><strong>ID 26 - Call sequence</strong></font></td> 1 <td colspan="4" align="center"><font color="#ffffff" size="+2"><strong>ID 25 - Loop end</strong></font></td> 1 <td colspan="4" align="center"><font color="#ffffff" size="+2"><strong>ID 24 - Loop start</strong></font></td> 1 <td colspan="4" align="center"><font color="#ffffff" size="+2"><strong>ID 23 - Jump to block</strong></font></td> 1 <td align="center">ZX Spectrum</td> 1 <td align="center">WORD[MAXP]</td> 1 <td align="center">TRAINER[N]</td> 1 <td align="center">TOTP</td> 1 <td align="center">TOTD</td> 1 <td align="center">TEXT[N]</td> 1 <td align="center">SYMDEF[ASP]</td> 1 <td align="center">SYMDEF[ASD]</td> 1 <td align="center">SELECT[N]</td> 1 <td align="center">SAM Coupe'</td> 1 <td align="center">PRLE[TOTP]</td> 1 <td align="center">POKE[N]</td> 1 <td align="center">NPP</td> 1 <td align="center">NPD</td> 1 <td align="center">HWINFO[N]</td> 1 <td align="center">Enterprise (slow)</td> 1 <td align="center">Enterprise (fast)</td> 1 <td align="center">Bit 1</td> 1 <td align="center">BYTE[DS]</td> 1 <td align="center">BYTE[9]</td> 1 <td align="center">BYTE[6912]</td> 1 <td align="center">Amstrad CPC</td> 1 <td align="center">ASP</td> 1 <td align="center">ASD</td> 1 <td align="center">ASCII[7]</td> 1 <td align="center"><strong>Value</strong></td> 1 <td align="center"><strong>Type</strong></td> 1 <td align="center"><strong>Offset</strong></td> 1 <td align="center"><font color="#ffffff"><strong>Sync2</strong></font></td> 1 <td align="center"><font color="#ffffff"><strong>Sync1</strong></font></td> 1 <td align="center"><font color="#ffffff"><strong>Pilot pulse</strong></font></td> 1 <td align="center"><font color="#ffffff"><strong>Machine</strong></font></td> 1 <td align="center"><font color="#ffffff"><strong>Length</strong></font></td> 1 <td align="center"><font color="#ffffff"><strong>Hardware type</strong></font></td> 1 <td align="center"><font color="#ffffff"><strong>Hardware ID</strong></font></td> 1 <td align="center"><font color="#ffffff"><strong>Description</strong></font></td> 1 <td align="center"><font color="#ffffff"><strong>Bit 1</strong></font></td> 1 <td align="center"><font color="#ffffff"><strong>Bit 0</strong></font></td> 1 <td align="center">882</td> 1 <td align="center">855</td> 1 <td align="center">742</td> 1 <td align="center">735</td> 1 <td align="center">667</td> 1 <td align="center">602 (**)</td> 1 <td align="center">6000</td> 1 <td align="center">59 (0x3B)</td> 1 <td align="center">58+9*W</td> 1 <td align="center">58+19*W</td> 1 <td align="center">42+15*W (*)</td> 1 <td align="center">4096</td> 1 <td align="center">2168</td> 1 <td align="center">20</td> 1 <td align="center">1982</td> 1 <td align="center">18 (0x12)</td> 1 <td align="center">1750</td> 1 <td align="center">1710</td> 1 <td align="center">1400 (**)</td> 1 <td align="center">113+9*W</td> 1 <td align="center">107 (0x6B)</td> 1 <td align="center">10+N</td> 1 <td align="center">10+8*W</td> 1 <td align="center">0x5C</td> 1 <td align="center">0x2C</td> 1 <td align="center">0x28</td> 1 <td align="center">0x25</td> 1 <td align="center">0x23</td> 1 <td align="center">0x21</td> 1 <td align="center">0x1F</td> 1 <td align="center">0x1D</td> 1 <td align="center">0x1C</td> 1 <td align="center">0x1B</td> 1 <td align="center">0x1A</td> 1 <td align="center">0x19</td> 1 <td align="center">0x17</td> 1 <td align="center">0x16+L</td> 1 <td align="center">0x13</td> 1 <td align="center">0x12+<br>(TOTP>0)*((2*NPP+1)*ASP)+<br>TOTP*3</td> 1 <td align="center">0x12+<br>(TOTP>0)*((2*NPP+1)*ASP)+<br>TOTP*3+<br>(2*NPD+1)*ASD</td> 1 <td align="center">0x12+<br>(2*NPP+1)*ASP</td> 1 <td align="center">0x0F</td> 1 <td align="center">0x01+L</td> 1 <td align="center">0x01+L+1</td> 1 <td align="center">(1)</td> 1 <td align="center">"ZXTape!"</td> 1 <td align="center" width="8%"><font color="#ffffff"><strong>Value</strong></font></td> 1 <td align="center" width="8%"><font color="#ffffff"><strong>Offset</strong></font></td> 1 <td align="center" width="42%"><strong>Value</strong></td> 1 <td align="center" width="30%"><strong>Value</strong></td> 1 <td align="center" width="15%"><font color="#ffffff"><strong>Type</strong></font></td> 1 <td align="center" width="10%"><strong>Offset</strong></td> 1 <tbody><tr><td width="10%"></td> 1 <tbody><tr><td align="left"> 1 <tbody><tr><td align="center"><font color="#ffff40" size="+4"><strong>TZX FORMAT</strong></font></td></tr> 1 <tbody><tr bgcolor="#8080df"> 1 <tbody><tr bgcolor="#8080d0"> 1 <table width="40%"> 1 <table border="0" width="100%"><tbody><tr><td width="10%"> </td><td> 1 <table border="0" width="100%"> 1 <table bgcolor="#0040ff" border="0" width="50%"> 1 <strong>TZX block ID list:</strong> 1 <strong>Revision 1.20</strong> 1 <strong>Revision 1.13</strong> 1 <strong>Revision 1.12</strong> 1 <strong>Revision 1.10</strong> 1 <strong>Revision 1.02</strong> 1 <strong>Revision 1.01</strong> 1 <strong>Notes:</strong> 1 <strong>IMPORTANT:</strong> The ZXTape format has ALL timings written 1 <strong>Example</strong><br><br> 1 <strike>1C - Commodore 64<br> 1 <meta name="keywords" content="TZX,ZX Spectrum,Speccy,Sinclair,tech,tape,format,specification"> 1 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>TZX technical specifications</title></head> 1 <li>use single 0x0D (13 decimal) to separate lines;</li> 1 <li>stick to a maximum of 8 lines.</li> 1 <li>stick to a maximum of 30 chars per line;</li> 1 <li>runs on, but doesn't use any of the special hardware of ZX Spectrum 128K</li> 1 <li>runs on ZX Spectrum 48K</li> 1 <li>doesn't run on ZX Spectrum 16K</li> 1 <li>Zeros and ones in 'Direct recording' blocks mean low and high pulse 1 <li>You might interpret 'full-period' as ----____ or ____----, and 1 <li>When creating a 'Direct recording' block please stick to the 1 <li>When all the Data has finished there is an optional Trailer Tone, which is standard for the Repeated Blocks in C64 ROM Loader.</li> 1 <li>Trailing Tone</li> 1 <li>This document refers to 'high' and 'low' pulse levels. Whether this 1 <li>The wave MUST always start with the LOW amplitude, since the C64 can only detect the transition HIGH -> LOW.</li> 1 <li>The values in curly brackets {} are the default values that are used in the Spectrum ROM saving routines. 1 <li>The timings are given in Z80 clock ticks (T states) unless otherwise stated. <b>1 T state = (1/3500000)s</b></li> 1 <li>The length of a block is given in the following format: numbers in 1 <li>The following new blocks have been introduced: ID 24, ID 25, ID 26, ID 27, ID 28, ID 40</li> 1 <li>The following new blocks have been introduced: ID 18, ID 19, ID 2B. Newly added blocks follow the general extension rule.</li> 1 <li>The following new blocks have been introduced: ID 16, ID 17</li> 1 <li>The following blocks have been deprecated and should not appear in 1 <li>The block IDs are given in hex.</li> 1 <li>The XOR checksum (if it is set to 0 or 1) is a XOR of all bits in 1 <li>The Length of ASCII ID in 'Custom Info' block (ID 35) should be 16 and not 15 bytes 1 <li>The 'current pulse level' after playing the blocks ID 10,11,12,13,14 or 19 1 <li>Sync waves</li> 1 <li>Pilot Tone</li> 1 <li>Jump 2 = 'Skip one block'</li> 1 <li>Jump 1 = 'Go to the next block' - it is like NOP in assembler ;)</li> 1 <li>Jump 0 = 'Loop Forever' - this should never happen</li> 1 <li>Jump -1 = 'Go to the previous block'</li> 1 <li>If there is no pause between two data blocks then the second one 1 <li>If some pulse length is 0 then the whole wave must not be present. This applies to DATA too.</li> 1 <li>General Extension Rule: ALL custom blocks that will be added after 1 <li>First three types of 'Custom info' (ID 35) block standardized: 1 <li>Finish Data waves should be ONLY played after last byte of data.</li> 1 <li>Finish Data pulses</li> 1 <li>Finish Byte waves should be played after each byte EXCEPT last one.</li> 1 <li>Data Bytes (with XOR and/or Finish Byte waves)</li> 1 <li>Any value requiring more than one byte is stored in little endian format (i.e. LSB first).</li> 1 <li>An emulator should put the 'current pulse level' to 'low' when 1 <li>Allowed multiple lines in the 'Archive info' (ID 32) block. 1 <li>All unused bits should be set to zero.</li> 1 <li>All ASCII texts use the ISO 8859-1 (Latin 1) encoding; some of them 1 <li>Added two new types of 'Custom info' (ID 35) block: 1 <li>Added the following fields to the 'Archive info' (ID 32) block: 1 <li>Added new entries to the hardware ID list: 00/1E-2D, 01/12-17, 02/06-0A, 03/06-0C, 06/03, 0B/03, 10/00-03</li> 1 <li>Added new entries to the hardware ID list: 00/1C,1D</li> 1 <li>Added new entries to the hardware ID list: 00/1A,1B</li> 1 <li>Added new entries to the hardware ID list: 00/15-19</li> 1 <li>A wave consists of TWO pulses. The structure contains the length of ONE pulse.</li> 1 <li>A 'Pause' block consists of a 'low' pulse level of some duration. 1 <li><strong>ZX-Edit document block</strong> 1 <li><strong>ZX Spectrum, Amstrad CPC, SAM Coupe & Enterprise tape encoding</strong> 1 <li><strong>Spectrum screen block</strong> 1 <li><strong>Picture block</strong> 1 <li><strong>POKEs block</strong> 1 <li><strong>Jupiter ACE encoding</strong> - see <a href="http://www.jupiter-ace.co.uk/doc_AceTapeFormat.html">a dedicated site</a>.</li> 1 <li><strong>Instructions block</strong> 1 <li><b><a href="#TZXFORMAT">TZX file format</a></b></li> 1 <li><b><a href="#RULES">Rules and definitions</a></b></li> 1 <li><b><a href="#MACHINFO">Machine specific information</a></b></li> 1 <li><b><a href="#INTRODUCTION">Introduction</a></b></li> 1 <li><b><a href="#HWINFOREF">Hardware information reference</a></b></li> 1 <li><b><a href="#HISTORY">Revision history</a></b></li> 1 <li><b><a href="#DEPRECATED">Deprecated blocks</a></b></li> 1 <li><a href="#TURBOSPEED">ID 11 - Turbo speed data block</a></li> 1 <li><a href="#TEXTDESCR">ID 30 - Text description</a></li> 1 <li><a href="#STOP48K">ID 2A - Stop the tape if in 48K mode</a></li> 1 <li><a href="#STDSPEED">ID 10 - Standard speed data block</a></li> 1 <li><a href="#SNAPSHOT">ID 40 - Snapshot block</a></li> 1 <li><a href="#SETLEVEL">ID 2B - Set signal level</a></li> 1 <li><a href="#SELBLOCK">ID 28 - Select block</a></li> 1 <li><a href="#RETURNSEQ">ID 27 - Return from sequence</a></li> 1 <li><a href="#PURETONE">ID 12 - Pure tone</a></li> 1 <li><a href="#PUREDATA">ID 14 - Pure data block</a></li> 1 <li><a href="#PULSESEQ">ID 13 - Sequence of pulses of various lengths</a></li> 1 <li><a href="#PAUSEBLOCK">ID 20 - Pause (silence) or 'Stop the tape' command</a></li> 1 <li><a href="#MSGBLOCK">ID 31 - Message block</a></li> 1 <li><a href="#LOOPSTART">ID 24 - Loop start</a></li> 1 <li><a href="#LOOPEND">ID 25 - Loop end</a></li> 1 <li><a href="#JUMPBLOCK">ID 23 - Jump to block</a></li> 1 <li><a href="#HARDTYPE">ID 33 - Hardware type</a></li> 1 <li><a href="#GRPSTART">ID 21 - Group start</a></li> 1 <li><a href="#GRPEND">ID 22 - Group end</a></li> 1 <li><a href="#GLUEBLOCK">ID 5A - "Glue" block (90 dec, ASCII Letter 'Z')</a></li> 1 <li><a href="#GENDATA">ID 19 - Generalized data block</a></li> 1 <li><a href="#EMUINFO">ID 34 - Emulation info</a></li> 1 <li><a href="#DIRECTREC">ID 15 - Direct recording block</a></li> 1 <li><a href="#CUSTOMBLOCK">ID 35 - Custom info block</a></li> 1 <li><a href="#CUSTINFODPR">ID 35 - Custom info deprecated types</a></li> 1 <li><a href="#CSWBLOCK">ID 18 - CSW recording block</a></li> 1 <li><a href="#CALLSEQ">ID 26 - Call sequence</a></li> 1 <li><a href="#C64TURBO">ID 17 - C64 turbo tape data block</a></li> 1 <li><a href="#C64ROM">ID 16 - C64 ROM type data block</a></li> 1 <li><a href="#ARCHINFO">ID 32 - Archive info</a></li> 1 <li>08 - Origin</li> 1 <li>07 - Protection Scheme / Loader</li> 1 <li>06 - Price</li> 1 <li>05 - Game/Utility Type</li> 1 <li>04 - Language</li> 1 <li>'ZX-Edit document' - for .ZED files generated by the great ZX-Editor!</li> 1 <li>'Screen'</li> 1 <li>'Picture ' - for .GIF and .JPEG (.JPG) pictures</li> 1 <li>'POKEs'</li> 1 <li>'Instructions'</li> 1 <html><head> 1 <font size="1">This field is present only if TOTD>0</font></td> 1 <font size="1">This field is present only if TOTD>0</font> 1 <font size="1">0x01: RLE<br> 1 <font size="1">(referred to 3.5MHz clock frequency)</font></td> 1 <font size="1"> 1 <font size="+2"><strong>Format revision: v1.20 1 <div align="center"> 1 <center id="INDEX"> 1 <br><br>Well, this block was created to support the Commodore 64 1 <br><br>This will produce N pulses, each having its own timing. Up to 1 <br><br>This block can hold any general .TXT file, with the main 1 <br><br>These computers share the same tape encoding, which is normal 1 <br><br>The standard data blocks have always the same structure: first 1 <br><br>If the game on the tape is not an original and lacks the 1 <br> Then the main body of the file follows. It consists of a mixture 1 <body alink="#ff0000" bgcolor="#ffffff" link="#0000ff" text="#000000" vlink="#800080"> 1 <basefont face="Verdana" size="0"> 1 <a name="TZXFORMAT"></a> 1 <a name="TURBOSPEED"></a> 1 <a name="TEXTDESCR"></a> 1 <a name="STOP48K"></a> 1 <a name="STDSPEED"></a> 1 <a name="SNAPSHOT"></a> 1 <a name="SETLEVEL"></a> 1 <a name="SELBLOCK"></a> 1 <a name="RULES"></a> 1 <a name="RETURNSEQ"></a> 1 <a name="PURETONE"></a> 1 <a name="PUREDATA"></a> 1 <a name="PULSESEQ"></a> 1 <a name="PAUSEBLOCK"></a> 1 <a name="MSGBLOCK"></a> 1 <a name="MACHINFO"></a> 1 <a name="LOOPSTART"></a> 1 <a name="LOOPEND"></a> 1 <a name="JUMPBLOCK"></a> 1 <a name="INTRODUCTION"></a> 1 <a name="ID_LIST"></a> 1 <a name="HWINFOREF"></a> 1 <a name="HISTORY"></a> 1 <a name="HARDTYPE"></a> 1 <a name="GRPSTART"></a> 1 <a name="GRPEND"></a> 1 <a name="GLUEBLOCK"></a> 1 <a name="GENDATA"></a> 1 <a name="EMUINFO"></a> 1 <a name="DIRECTREC"></a> 1 <a name="DEPRECATED"></a> 1 <a name="CUSTOMBLOCK"></a> 1 <a name="CUSTINFODPR"></a> 1 <a name="CSWBLOCK"></a> 1 <a name="CALLSEQ"></a> 1 <a name="C64TURBO"></a> 1 <a name="C64ROM"></a> 1 <a name="ARCHINFO"></a> 1 <a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-html40" border="0" alt="Valid HTML 4.0 Transitional" height="31" width="88"></a> 1 </tr><tr bgcolor="#ffdf90"> 1 </tr><tr bgcolor="#c0ffc0"> 1 </strong></font> 1 </ol></td></tr></tbody></table> 1 </li></ul> 1 </font></td> 1 </body></html> 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 1 3223 otherwise. This block can be used for the ROM loading routines AND 1 2D - ZX-97 1 2C - TK-65<br> 1 2B - Lambda<br> 1 2A - TS-1500<br> 1 29 - ZX Badaloc<br> 1 28 - Chrome<br> 1 27 - MicroART ATM Turbo 2<br> 1 26 - MicroART ATM<br> 1 255 pulses can be stored in this block; this is useful for non-standard 1 25 - Quorum 128<br> 1 24 - Amaterske RADIO Mistrum<br> 1 23 - Ice Felix HC 2000<br> 1 22 - Ice Felix HC 91<br> 1 21 - Kay 1024<br> 1 20 - GrandRomMax<br> 1 1F - Profi<br> 1 1E - Inves Spectrum+<br> 1 1D - Commodore 128</strike><br> 1 1B - Enterprise<br> 1 1A - Jupiter ACE<br> 1 19 Dec 2006 1 19 - Amstrad CPC 6128+<br> 1 18 - Amstrad CPC 464+<br> 1 17 - Amstrad CPC 6128<br> 1 16 - DivIDE<br> 1 16 - Amstrad CPC 664<br> 1 15 - ZXATASP<br> 1 15 - Amstrad CPC 464<br> 1 14 - ZX Spectrum +3e hard disk<br> 1 14 - ZS Scorpion 256<br> 1 13 - Sandy<br> 1 13 - Elwro 800-3 <br> 1 12 - Kempston disk interface<br> 1 12 - Byte<br> 1 11 - Microdigital TK 95<br> 1 11 - Larken<br> 1 10 - Ramex Millenia<br> 1 10 - Microdigital TK 90-X<br> 1 0x02: Z-RLE</font> 1 0F - Zebra disk drive<br> 1 0F - ZX Spectrum, Arabic version<br> 1 0E - ZX Spectrum 128k, Spanish version<br> 1 0E - Timex FDD3000<br> 1 0D - ZX-81<br> 1 0D - JLO (Oliger) disk interface<br> 1 0C - ZX-80<br> 1 0C - ZX Spectrum +3 disk drive<br> 1 0C - Jupiter ACE 1 0B - QuickSilva AY<br> 1 0B - Didaktik Gama<br> 1 0B - BS-DOS (MB-02)<br> 1 0A - Zon-X AY<br> 1 0A - Standard 8255 chip with ports 31,63,95 1 0A - Memory in 8-16k used 1 0A - Didaktik disk drives<br> 1 0A - Didaktik M<br> 1 09 - Sam Coupe<br> 1 09 - Radofin<br> 1 09 - Opus Discovery<br> 1 09 - Intec Electronics Digital Interface B8001<br> 1 09 - 48k<br> 1 08 - Pentagon 128<br> 1 08 - MultiPrint<br> 1 08 - General Sound<br> 1 08 - FIZ<br> 1 08 - 16k<br> 1 07 - ZX LPrint Interface 3<br> 1 07 - Watsford<br> 1 07 - Timex Sinclair TS-2068<br> 1 07 - Covox<br> 1 07 - 1k<br> 1 06 - Timex Sinclair TC-2048<br> 1 06 - SoftROM<br> 1 06 - RAM Music Machine<br> 1 06 - INES Printerface<br> 1 06 - Byte Drive<br> 1 05 - ZX Spectrum 128k +2A, +3<br> 1 05 - TR-DOS (BetaDisk)<br> 1 05 - MB-02 ROM/RAM expansion<br> 1 05 - Hilderbay<br> 1 05 - AY ABC stereo (A+B=left, B+C=right)<br> 1 04 - ZX Spectrum 128k +2 (grey case)<br> 1 04 - Rotronics Wafadrive<br> 1 04 - MultiPrint<br> 1 04 - Fuller 1 04 - DK'Tronics<br> 1 04 - AY ACB stereo (A+C=left, B+C=right); Melodik<br> 1 03 - ZX Spectrum 128k +(Sinclair)<br> 1 03 - Tasman<br> 1 03 - SpecDrum<br> 1 03 - Sinclair 1 Right (67890)<br> 1 03 - Romantic Robot Videoface</td> 1 03 - Multiface +3<br> 1 03 - MGT Plus-D<br> 1 03 - Lambda Colour 1 03 - Defender Light Gun 1 02 - Zebra Graphics Tablet<br> 1 02 - ZX Spectrum 48k ISSUE 1<br> 1 02 - ZX Spectrum +3<br> 1 02 - Sinclair 2 Left (12345)<br> 1 02 - Multiface 128k<br> 1 02 - Memotech<br> 1 02 - MGT Disciple<br> 1 02 - EPSON compatible 1 02 - Currah microSpeech<br> 1 02 - British MicroGraph Pad<br> 1 01 - ZX Spectrum 48k, Plus<br> 1 01 - ZX Spectrum 128k 1 01 - ZX Light Gun<br> 1 01 - T/S 2050 or Westridge 2050 1 01 - Opus Discovery<br> 1 01 - Multiface ONE<br> 1 01 - Kempston mouse<br> 1 01 - Kempston E<br> 1 01 - Generic printer<br> 1 01 - G007<br> 1 01 - Fuller Box AY sound hardware<br> 1 01 - DK'Tronics Light Pen<br> 1 01 - Cursor, Protek, AGF<br> 1 01 - Blackboard Electronics 1 00 - ZX Spectrum 16k<br> 1 00 - ZX Printer, Alphacom 32 & compatibles<br> 1 00 - ZX Microdrive<br> 1 00 - ZX Interface 1<br> 1 00 - ZX Interface 1 1 00 - WRX Hi-Res<br> 1 00 - Trickstick<br> 1 00 - Sam Ram<br> 1 00 - RD Digital Tracer<br> 1 00 - Prism VTX 5000<br> 1 00 - Orme Electronics 1 00 - Keypad for ZX Spectrum 128k 1 00 - Kempston<br> 1 00 - Kempston S<br> 1 00 - Harley Systems ADC 8.2<br> 1 00 - Classic AY hardware (compatible with 128k ZXs)<br> 1 00 - AMX mouse<br> 1 .SNA snapshots are supported for compatibility reasons!<br> 1 ...), protection scheme it uses (Speedlock 1, Alkatraz, ...) and its 1 (cycles) per pulse. One wave is made from two pulses. 1 (Compressed Square Wave). For a complete description of the CSW 1 (2) Amstrad CPC ROM load/save routine can use variable speed for 1 (1) The Spectrum uses different pilot lengths for header and data 1 (**) The Enterprise stores data in a different way than all other 1 (*) The SAM Coupe' timings can be user selected by a system variable. 1 ( 3, 530, 520, 530, 520, 530, 520, 530, 520, 530, 520, 530, 520, 530, 520, 530, 520, 530, 4689 ) 1 ( 3, 530, 520, 530, 520, 530, 520, 530, 4689, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )<br> 1 'half-period' as ---- or ____. One 'half-period' will also be referred 1 'end of file' byte 26 (1A hex). This is followed by two bytes 1 'Speedlock' or 'Alkatraz' loaders) or it is corrupted by some on-screen 1 'Classic AY hardware (Spectrum 128 sompatible sound device)'.<br> 1 and WAIT when it encounters first DATA block<br> 1 If this is 0 then the emulator should only load the info blocks<br> 1 such as extra memory or a sound chip.<br> 1 or special features of the machine.<br> 1 but may or may not use the hardware or special features of the machine.<br> 1 11: force high level<br> 1 10: force low level<br> 1 01: same as the current level (no edge - prolongs the previous pulse)<br> 1 00: opposite to the current level (make an edge, as usual) - default<br> 1 bits 0-1: number of bits (0-3)<br> 1 bit 9 : auto type LOAD"" or press ENTER when in 128k mode [0] 1 bit 8 : start playing the tape immediately [0]<br> 1 bit 7 : screen refresh mode (1: ON, 0: OFF) [1]<br> 1 bit 6 : border emulation [1]<br> 1 bit 5 : unknown original value 1 bit 5 : fast loading when ROM load routine is used [1]<br> 1 bit 4 : user inserts the POKE value<br> 1 bit 3: value of additional bit(s)</td> 1 bit 3,4 : video synchronisation : 1=high, 3=low, 0,2=normal [0]<br> 1 bit 3 : ignore memory page number<br> 1 bit 2: play additional bit(s) BEFORE (0) or AFTER (1) the byte<br> 1 bit 2 : high resolution colour emulation with true interrupt freq. [1]<br> 1 bit 1 : LDIR emulation [1]<br> 1 bit 0: little (0) or big (1) endian format 1 bit 0-2 : memory page number<br> 1 bit 0 : R-register emulation [1]<br> 1 bit 0 - Data Endianess: 0=LSb first, 1=MSb first</td> 1 FF - No checksum bit</td> 1 FF - Comment(s)<br> 1 C1: checksum<br> 1 8000: autostart (no meaning here)<br> 1 4A,50,53,50,20,20,20,20,20,20: file name ("JPSP")<br> 1 4000: start address<br> 1 1B00: data length<br> 1 08 - Origin<br> 1 07 - Protection scheme/loader<br> 1 06 - Price<br> 1 05 - Game/utility type<br> 1 04 - Language<br> 1 03: data type (0x03 = "Bytes:")<br> 1 03 - Year of publication<br> 1 03 - The tape DOESN'T RUN on this machine or with this hardware.<br> 1 02 - The tape RUNS but it DOESN'T use the hardware<br> 1 02 - Author(s)<br> 1 01: .SNA format<br> 1 01 - The tape USES the hardware or special features of the machine,<br> 1 01 - Start XOR checksum with value 1<br> 1 01 - Software house/publisher<br> 1 01 - JPEG</td> 1 00: loading flag (0x00 = header)<br> 1 00: .Z80 format<br> 1 00 - The tape RUNS on this machine or with this hardware,<br> 1 00 - Start XOR checksum with value 0<br> 1 00 - GIF<br> 1 00 - Full title<br> 1 - even Tomaz Kac doesn't remember if it concerns only documentation or also the implementation; 1 to be sure consider the block ID 35 as newly added in revision 1.01