TASD File Format Specification | February 2025 | |
Grey, et al. | Informational | [Page] |
The TASD file format is used for storing "Tool Assisted Speedrun" or "Tool Assisted Superplay" (TAS) data for TAS replay devices to replay on physical video game console hardware. The format is defined to be expandable for future needs. The format is also defined to be parsable by programs that do not understand portions of the format, whether that is due to incomplete support of the format specification or due to new features being added to later versions of the specification at a later date.¶
This document defines the file format specification for TASD files.¶
The Tool Assisted Speedrun Dump (TASD) interchange format is a file format for storing data to allow "Tool Assisted Speedruns" or "Tool Assisted Superplays" to be played on physical video game console hardware using TAS replay devices. Created to be hardware and software agnostic, the TASD interchange format uses a key-based, binary, packet format to break up pieces of information into easily-parsable and forward-compatible chunks. The format is extensible by simply defining additional keys or value types as necessary. When parsing the file, software can skip any packets whose key is unknown or unsupported.¶
Packets of a given type can be used multiple times or completely omitted as needed. This reusability eliminates the need of a predefined delimiter to separate pieces of data.¶
While files generated by emulator dump scripts should provide as much information as possible, because packets are optional, the file can be expanded later with any additional data as desired. No intermediary file format is necessary.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
Data Types:¶
We use the terms byte and octet interchangeably in this document.¶
Unless specified otherwise, all multi-octet integers are big-endian.¶
We use the terms Tool Assisted Speedrun, Tool Assisted Superplay and TAS interchangeably in this document.¶
In subsections of (Section 4.2), the term "in direct form" is used. That term is defined to mean a packet in a TASD file directly (first order packet) rather than a packet inside a TRANSITION or MOVIE_TRANSITION packet (second order packet).¶
String values MUST use UTF-8 encoding. As such, string values MAY contain any number of NUL characters and have no concept of "null termination". If an example of a string value is given, the example will be between quotation marks. The quotation marks are not included in the string. Not all content between quotations will be string value examples, so be aware of that when continuing through this document.¶
Unsigned and signed integers can have different bit widths. For instance, an 8-bit integer can be used in one part of the specification and a 64-bit integer can be used in another part of the specification.¶
Boolean values MUST be a single octet with the value of 0
for FALSE or 1
for TRUE.¶
[N octets]
[00 7F FF]
00
, 7F
, and FF
in that order.¶
In packet diagrams, a single octet is represented with a box like this:¶
+-----+ | Var | <-- Vertical bars MAY be missing +-----+¶
In packet diagrams, an arbitrary number of octets are represented with a box like this:¶
+=====+ | Var | +=====+¶
In packet diagrams, boxes can be connected like these examples:¶
+-----------+-----------+ | Var 1 (B) | Var 2 (I) | +-----------+-----------+¶
+-----+-----+===========+ | Var 1 (N) | Var 2 (S) | +-----+-----+===========+¶
In packet diagrams, boxes MAY have relative offset values above them like in the following example:¶
0 1 2... +-----+-----+===========+ | Var 1 (N) | Var 2 (S) | +-----+-----+===========+¶
Packet diagrams MAY be split into multiple lined sections like in the following example:¶
0 1 2 3 +-----------+-----------+-----------+-----------+ | Var 1 (N) | Var 2 (I) | Var 3 (B) | Var 4 (I) | ... +-----------+-----------+-----------+-----------+ 4 5 +-----------+===========+ | Var 5 (N) | Var 6 (S) | +-----------+===========+¶
...
) on the same text row as the variable names to signify that the packet diagram is continuing.¶
This file format's primary goal is to provide a comprehensive and replay device agnostic TAS movie controller input dump format that is usable for any console. Additional goals include:¶
Consideration is also given to how usable the format would be for the software that interacts with replay devices (examples: methods of ingestion/parsing, ease of ingestion/parsing in various languages).¶
Existing formats are either incomplete for some verification needs or don't exist at all for some consoles. For example, a format commonly used for NES console verifications (r08) only encodes 2 standard controllers worth of sequential data. The format doesn't indicate whether those inputs are per latch or per frame. It also doesn't contain RESET timing information, additional settings, or metadata. Non-standard controllers, such as the NES Zapper, aren't supported either.¶
Until now, controller input formats were written in a way that was "good enough" for each use case, but rarely in a "standard" way. Often, any additional data had to be supplied separately as command-line arguments. While that process may work for a specific device, it's less than ideal when it comes time to redistribute the replay data so that others (especially those using different replay devices) can also successfully replay the same TAS.¶
TASD files MUST begin with a header. The header MUST be followed by 0 or more packets.¶
0 1 2 3 4 5 6 7... +-+-+-+-+-+-+-+=============+ | Header (A) | Packets (A) | +-+-+-+-+-+-+-+=============+ Header (Binary Data) [7 octets] Packets (Binary Data) [? octets]¶
The TASD file header MUST be in the following format:¶
0 1 2 3 4 5 6 +----+----+----+----+------+------+--------------+ | Magic Number (A) | Version (N) | G_KEYLEN (N) | +----+----+----+----+------+------+--------------+ Magic Number (Binary Data) [4 octets] Version (Unsigned Integer) [2 octets] G_KEYLEN (Unsigned Integer) [1 octet]¶
Each packet MUST be in the following format:¶
+=========+----------+==========+=============+ | Key (A) | PEXP (N) | PLEN (N) | Payload (A) | +=========+----------+==========+=============+ Key (Binary Data) [G_KEYLEN octets] PEXP (Unsigned Integer) [1 octet] PLEN (Unsigned Integer) [PEXP octets] Payload (Binary Data) [PLEN octets]¶
All packets are OPTIONAL.¶
[00 01]
[00 02]
[00 03]
[00 04]
[00 05]
[00 06]
[00 07]
[00 08]
[00 09]
[00 0A]
[00 0B]
[00 0C]
[00 0D]
[00 0E]
[00 0F]
[00 10]
[00 11]
[00 12]
[00 13]
[00 14]
[00 15]
[00 F0]
[00 F1]
[08 04]
[00 01]
- CONSOLE_TYPE[00 02]
- CONSOLE_REGION[00 03]
- GAME_TITLE[00 04]
- ROM_NAME[00 05]
- ATTRIBUTION[00 06]
- CATEGORY[00 07]
- EMULATOR_NAME[00 08]
- EMULATOR_VERSION[00 09]
- EMULATOR_CORE[00 0A]
- TAS_LAST_MODIFIED[00 0B]
- DUMP_CREATED[00 0C]
- DUMP_LAST_MODIFIED[00 0D]
- TOTAL_FRAMES[00 0E]
- RERECORDS[00 0F]
- SOURCE_LINK[00 10]
- BLANK_FRAMES[00 11]
- VERIFIED[00 12]
- MEMORY_INIT[00 13]
- GAME_IDENTIFIER[00 14]
- MOVIE_LICENSE[00 15]
- MOVIE_FILE[00 F0]
- PORT_CONTROLLER[00 F1]
- PORT_OVERREAD[01 01]
- NES_LATCH_FILTER[01 02]
- NES_CLOCK_FILTER[01 04]
- NES_GAME_GENIE_CODE[02 01]
- SNES_LATCH_FILTER[02 02]
- SNES_CLOCK_FILTER[02 04]
- SNES_GAME_GENIE_CODE[02 05]
- SNES_LATCH_TRAIN[08 04]
- GENESIS_GAME_GENIE_CODE[FE 01]
- INPUT_CHUNK[FE 02]
- INPUT_MOMENT[FE 03]
- TRANSITION[FE 04]
- LAG_FRAME_CHUNK[FE 05]
- MOVIE_TRANSITION[FF 01]
- COMMENT[FF FE]
- EXPERIMENTAL[FF FF]
- UNSPECIFIEDCONSOLE_TYPE packets MUST be in the following format:¶
0 1... +-------------+==========+ | Console (A) | Name (S) | +-------------+==========+ Console (Binary Data): [1 octet] [01] - NES <Nintendo Entertainment System> [02] - SNES <Super Nintendo> [03] - N64 <Nintendo 64> [04] - GC <GameCube> [05] - GB <Game Boy> [06] - GBC <Game Boy Color> [07] - GBA <Game Boy Advance> [08] - Genesis <Sega Genesis/Sega Mega Drive> [09] - A2600 <Atari 2600> [FF] - Custom Name (String) [PLEN - 1 octets]¶
[FF]
to specify a console that is not in the pre-specified console types.¶
[FF]
.¶
CONSOLE_REGION packets MUST be in the following format:¶
0 +------------------+ | Video Signal (A) | +------------------+ Video Signal (Binary Data): [1 octet] [01] - NTSC [02] - PAL [FF] - Other/Unknown¶
GAME_TITLE packets MUST be in the following format:¶
0... +===========+ | Title (S) | +===========+ Title (String) [PLEN octets]¶
ROM_NAME packets MUST be in the following format:¶
0... +==========+ | Name (S) | +==========+ Name (String) [PLEN octets]¶
CATEGORY packets MUST be in the following format:¶
0... +==============+ | Category (S) | +==============+ Category (String) [PLEN octets]¶
EMULATOR_NAME packets MUST be in the following format:¶
0... +==========+ | Name (S) | +==========+ Name (String) [PLEN octets]¶
EMULATOR_VERSION packets MUST be in the following format:¶
0... +=============+ | Version (S) | +=============+ Version (String) [PLEN octets]¶
EMULATOR_CORE packets MUST be in the following format:¶
0... +==========+ | Core (S) | +==========+ Core (String) [PLEN octets]¶
TAS_LAST_MODIFIED packets MUST be in the following format:¶
0 1 2 3 4 5 6 7 +--+--+--+--+--+--+--+--+ | Unix Timestamp (I) | +--+--+--+--+--+--+--+--+ Unix Timestamp (Signed Integer) [8 octets]¶
DUMP_CREATED packets MUST be in the following format:¶
0 1 2 3 4 5 6 7 +--+--+--+--+--+--+--+--+ | Unix Timestamp (I) | +--+--+--+--+--+--+--+--+ Unix Timestamp (Signed Integer) [8 octets]¶
DUMP_LAST_MODIFIED packets MUST be in the following format:¶
0 1 2 3 4 5 6 7 +--+--+--+--+--+--+--+--+ | Unix Timestamp (I) | +--+--+--+--+--+--+--+--+ Unix Timestamp (Signed Integer) [8 octets]¶
TOTAL_FRAMES packets MUST be in the following format:¶
0 1 2 3 +---+---+---+---+ | Frames (N) | +---+---+---+---+ Frames (Unsigned Integer) [4 octets]¶
RERECORDS packets MUST be in the following format:¶
0 1 2 3 +---+---+---+---+ | Rerecords (N) | +---+---+---+---+ Rerecords (Unsigned Integer) [4 octets]¶
SOURCE_LINK packets MUST be in the following format:¶
0... +==========+ | Link (S) | +==========+ Link (String) [PLEN octets]¶
BLANK_FRAMES packets MUST be in the following format:¶
0 1 +------+------+ | Frames (I) | +------+------+ Frames (Signed Integer) [2 octets]¶
VERIFIED packets MUST be in the following format:¶
0 +--------------+ | Verified (B) | +--------------+ Verified (Boolean) [1 octet]¶
MEMORY_INIT packets MUST be in the following format:¶
0 1 2 3 +---------------+------+------+--------------+ | Data Type (A) | Device (A) | Required (B) | ... +---------------+------+------+--------------+ 4 5... 5+NLEN... +----------+==========+==========+ | NLEN (N) | Name (S) | Data (A) | +----------+==========+==========+ Data Type (Binary Data): [1 octet] [01] - No Initialization Required [02] - All [00] [03] - All [FF] [04] - [00 00 00 00 FF FF FF FF] Repeating [05] - Random [FF] - Custom Device (Binary Data): [2 octets] [01 01] - NES CPU RAM [01 02] - NES Cartridge Save Data [02 01] - SNES CPU RAM [02 02] - SNES Cartridge Save Data [05 01] - GB CPU RAM [05 02] - GB Cartridge Save Data [06 01] - GBC CPU RAM [06 02] - GBC Cartridge Save Data [07 01] - GBA CPU RAM [07 02] - GBA Cartridge Save Data [08 01] - Genesis CPU RAM [08 02] - Genesis Cartridge Save Data [09 01] - A2600 CPU RAM [09 02] - A2600 Cartridge Save Data [FF FF] - Custom/Other Device Required (Boolean) [1 octet] NLEN (Unsigned Integer) [1 octet] Name (String) [NLEN octets] Data (Binary Data) [PLEN - NLEN - 5 octets]¶
[FF]
, Data SHOULD be empty (0 octet length binary data).¶
[FF FF]
, Name SHOULD NOT be empty (0 octet length string).¶
[FF]
, Data SHOULD be empty (0 octet length binary data).¶
GAME_IDENTIFIER packets MUST be in the following format:¶
0 1 2 3... 3+NLEN... +----------+--------------+----------+==========+================+ | Type (A) | Encoding (A) | NLEN (N) | Name (S) | Identifier (A) | +----------+--------------+----------+==========+================+ Type (Binary Data): [1 octet] [01] - MD5 Hash [02] - SHA1 Hash [03] - SHA224 Hash [04] - SHA256 Hash [05] - SHA384 Hash [06] - SHA512 Hash [07] - SHA512/224 Hash [08] - SHA512/256 Hash [09] - SHA3-224 Hash [0A] - SHA3-256 Hash [0B] - SHA3-384 Hash [0C] - SHA3-512 Hash [0D] - SHAKE-128 Hash [0E] - SHAKE-256 Hash [FF] - Other Encoding (Binary Data): [1 octet] [01] - Raw Binary [02] - Base 16 (Case Insensitive) [03] - Base 32 (Case Insensitive) [04] - Base 64 NLEN (Unsigned Integer) [1 octet] Name (String) [NLEN octets] Identifier (Binary Data) [PLEN - 2 octets]¶
[FF]
, Name SHOULD be empty (0 octet length binary data).¶
MOVIE_LICENSE packets MUST be in the following format:¶
0 +=============+ | License (S) | +=============+ License (String) [PLEN octet]¶
MOVIE_FILE packets MUST be in the following format:¶
0 1... 1+NLEN... +----------+==========+=============+ | NLEN (N) | Name (S) | Data (A) | +----------+==========+=============+ NLEN (Unsigned Integer) [1 octet] Name (String) [NLEN octets] Data (Binary Data) [PLEN - NLEN - 1 octets]¶
PORT_CONTROLLER packets MUST be in the following format:¶
0 1 2 +----------+-----+-----+ | Port (N) | Type (A) | +----------+-----+-----+ Port (Unsigned Integer) [1 octet] Type (Binary Data): [2 octets] [01 01] - NES Standard Controller [01 02] - NES Four Score [01 03] - (RESERVED) NES Zapper [01 04] - (RESERVED) NES Power Pad [01 05] - (RESERVED) Famicom Family BASIC Keyboard [02 01] - SNES Standard Controller [02 02] - SNES Super Multitap [02 03] - SNES Mouse [02 04] - (RESERVED) SNES Superscope [03 01] - N64 Standard Controller [03 02] - N64 Standard Controller with Rumble Pak [03 03] - N64 Standard Controller with Controller Pak [03 04] - N64 Standard Controller with Transfer Pak [03 05] - N64 Mouse [03 06] - (RESERVED) N64 Voice Recognition Unit (VRU) [03 07] - (RESERVED) N64 RandNet Keyboard [03 08] - N64 Densha de Go [04 01] - GC Standard Controller [04 02] - (RESERVED) GC Keyboard [05 01] - GB Gamepad [06 01] - GBC Gamepad [07 01] - GBA Gamepad [08 01] - Genesis (Mega Drive) 3-Button [08 02] - Genesis (Mega Drive) 6-Button [09 01] - A2600 Joystick [09 02] - (RESERVED) A2600 Paddle [09 03] - A2600 Keyboard Controller [FF FF] - Other/Unspecified¶
PORT_OVERREAD packets MUST be in the following format:¶
0 1 +----------+----------+ | Port (N) | High (B) | +----------+----------+ Port (N) [1 octet] High (Boolean) [1 octet]¶
NES_LATCH_FILTER packets MUST be in the following format:¶
0 1 +-----+-----+ | Time (N) | +-----+-----+ Time (Unsigned Integer) [2 octets]¶
NES_CLOCK_FILTER packets MUST be in the following format:¶
0 +----------+ | Time (N) | +----------+ Time (Unsigned Integer) [1 octet]¶
SNES_LATCH_FILTER packets MUST be in the following format:¶
0 1 +-----+-----+ | Time (N) | +-----+-----+ Time (Unsigned Integer) [2 octets]¶
SNES_CLOCK_FILTER packets MUST be in the following format:¶
0 +----------+ | Time (N) | +----------+ Time (Unsigned Integer) [1 octet]¶
SNES_GAME_GENIE_CODE packets MUST be in the following format:¶
0... +==========+ | Code (S) | +==========+ Code (String) [PLEN octets]¶
SNES_LATCH_TRAIN packets MUST be in the following format:¶
0... +====================+ | Latch Trains ([]N) | +====================+ Latch Trains (List of Unsigned Integers) [PLEN octets]¶
A single SNES_LATCH_TRAIN packet MAY contain up to every Latch Train of a SNES TAS movie console replay and MAY contain fewer than every Latch Train of a SNES TAS movie console replay. There MAY be more than 1 SNES_LATCH_TRAIN packet.¶
INPUT_CHUNK packets MUST be in the following format:¶
0 1... +----------+============+ | Port (N) | Inputs (A) | +----------+============+ Port (Unsigned Integer) [1 octet] Inputs (Binary Data) [PLEN - 1 octets]¶
All INPUT_CHUNK packets with corresponding Port values in the TASD file MUST be in chronological order, where earlier inputs in the TAS movie console replay are earlier in the TASD file and later inputs in the TAS movie console replay are later in the TASD file. If there are more than one INPUT_CHUNK packets for a specific Port, the input data MUST be interpreted as if all their contents were concatenated into a single INPUT_CHUNK packet. As such, a single INPUT_CHUNK packet MAY contain up to every input of a TAS movie console replay and MAY contain fewer than every input of a TAS movie console replay.¶
The input data contained in Inputs is divided up based on the PORT_CONTROLLER type corresponding to the Port number. Refer to Section 5 for each available type and the number of bytes used for each instance of controller input. The PORT_CONTROLLER type MAY be changed using TRANSITION packets, which MAY change the interpretation of the input data until either the end of the replay or until the next PORT_CONTROLLER transition.¶
Each instance of controller input SHOULD remain held until the input has been used according to the current replay configuration. By default, this means each instance of controller input corresponds to a single input "latch" or polling sequence by the console. However, some packet types MAY alter how inputs are used during replay. For example, the NES has the NES_LATCH_FILTER packet available. When NES_LATCH_FILTER is active, each instance of controller input MUST remain held until the end of the filter period.¶
INPUT_MOMENT packets MUST be in the following format:¶
0 1 2 +----------+----------+----------------+ | Port (N) | Hold (B) | Index Type (A) | ... +----------+----------+----------------+ 3 4 5 6 7 8 9 10 11... +--+--+--+--+--+--+--+--+============+ | Index (N) | Inputs (B) | +--+--+--+--+--+--+--+--+============+ Port (Unsigned Integer) [1 octet] Hold (Boolean) [1 octet] Index Type (Binary Data): [1 octet] [01] - Frame [02] - Cycle Count [03] - Milliseconds [04] - Microseconds * 10 Index (Unsigned Integer) [8 octets] Inputs (Binary Data) [PLEN - 11 octets]¶
Each INPUT_MOMENT packet contains a single instance of controller input data for a specific moment during a TAS replay. The input data's format depends on the PORT_CONTROLLER type corresponding to the Port number. Refer to Section 5 for each available type. The PORT_CONTROLLER type MAY be changed using TRANSITION packets, which MAY change the interpretation of the input data.¶
If Hold is TRUE, the controller MUST continually hold the input state until the next INPUT_MOMENT for the same Port number. If Hold is FALSE, the controller MUST hold only until the console reads the input state, or until the next INPUT_MOMENT for the same Port number.¶
TRANSITION packets MUST be in the following format:¶
0 1 2 3 4 5 6 7 8 9 +----------------+----------+--+--+--+--+--+--+--+--+ | Index Type (A) | Port (N) | Index (N) | ... +----------------+----------+--+--+--+--+--+--+--+--+ 10 11... +----------+============+ | Type (A) | Packet (A) | +----------+============+ Index Type (Binary Data): [1 octet] [01] - Frame [02] - Cycle Count [03] - Milliseconds [04] - Microseconds * 10 [05] - INPUT_CHUNK Byte Index Port (Unsigned Integer) [1 octet] Index (Unsigned Integer) [8 octets] Type (Binary Data): [1 octet] [01] - Soft Reset [02] - Power Reset [03] - Restart TASD File [FF] - Packet Derived Inner Packet (Binary Data) [PLEN - 11 octets]¶
[05]
, Index MUST be interpreted as the byte offset (0-indexed) into the concatenated input data from all INPUT_CHUNK packets for the controller port specified by Port. If Index Type is [05]
, the byte offset MUST also point to the first byte of an instance of controller input data (according to the PORT_CONTROLLER format at that moment in the TAS replay.)¶
[FF]
, the transition action will be interpreting a TASD packet.¶
[FF]
, Inner Packet SHOULD be a TASD packet. Inner Packet MUST NOT be a INPUT_CHUNK, INPUT_MOMENT, TRANSITION, LAG_FRAME_CHUNK, or MOVIE_TRANSITION packet.¶
LAG_FRAME_CHUNK packets MUST be in the following format:¶
0 1 2 3 4 5 6 7 +----+----+----+----+--+--+--+--+ | Movie Frame (N) | Count (N) | +----+----+----+----+--+--+--+--+ Movie Frame (Unsigned Integer) [4 octets] Count (Unsigned Integer) [4 octets]¶
Emulators typically consider a "lag frame" to be any frame in which the emulator believes the game does not poll/read controller inputs.¶
MOVIE_TRANSITION packets MUST be in the following format:¶
0 1 2 3 4 5... +----+----+----+----+----------+==================+ | Movie Frame (N) | Type (A) | Inner Packet (A) | +----+----+----+----+----------+==================+ Movie Frame (Unsigned Integer) [4 octets] Type (Binary Data): [1 octet] [01] - Soft Reset [02] - Power Reset [03] - Restart TASD File [FF] - Packet Derived Inner Packet (Binary Data) [PLEN - 5 octets]¶
[FF]
, the transition action will be interpreting a TASD packet.¶
[FF]
, Inner Packet SHOULD be a TASD packet. Inner Packet MUST NOT be a INPUT_CHUNK, INPUT_MOMENT, TRANSITION, LAG_FRAME_CHUNK, or MOVIE_TRANSITION packet.¶
COMMENT packets MUST be in the following format:¶
0 +=============+ | Comment (S) | +=============+ Comment (String) [PLEN octet]¶
EXPERIMENTAL packets MUST be in the following format:¶
0 +------------------+ | Experimental (B) | +------------------+ Experimental (Boolean) [1 octet]¶
UNSPECIFIED packets MUST be in the following format:¶
0... +======================+ | Unspecified Data (A) | +======================+ Unspecified Data (Binary Data) [PLEN octets]¶
A forward slash (/) is used to signify active low. As an example, if a bit is labeled as /A, the bit MUST be 0 if the A button is pressed and MUST be 1 if the A button is not pressed.¶
Multi-octet controller inputs are in little-endian order¶
Bit order for octets in controller inputs are high-order (MSB) (Most significant bit to least significant bit), so bit 7 MUST be the left-most bit of the octet and bit 0 MUST be the right-most bit of the octet.¶
Single Input Length: 1 Octet¶
Octet 0¶
Single Input Length: 3 Octets¶
Octet 0¶
Octet 1¶
Octet 2¶
Controller N is the controller port number. The NES Four Score allows players 1 and 3 to input buttons on controller port 1 and players 2 and 4 to input buttons on controller port 2. Controller N-1 on controller port 1 is Player 1, Controller N-2 on controller port 1 is Player 3, Controller N-1 on controller port 2 is Player 2, and Controller N-2 on controller port 2 is Player 4.¶
Single Input Length: 2 Octets¶
Octet 0¶
Octet 1¶
Single Input Length: 5 Octets¶
Octet 0 :¶
Octet 1¶
Octet 2¶
Octet 3¶
Octet 4¶
Controller N is the controller port number on the console that the Multitap is connected to. Controller N-1...N-4 are the controller ports 1...4 on the Multitap. Two Multitap ports are polled simultaneously by the game - either 1 and 2, or 3 and 4. The I/O Pin state in octet 0 MUST be 1 for multitap ports 1 and 2, or 0 for ports 3 and 4.¶
Single Input Length: 4 Octets¶
Octet 0¶
Octet 1¶
Octet 2¶
Octet 3¶
Single Input Length: 4 Octets¶
Octet 0¶
Octet 1¶
Octet 2¶
Octet 3¶
Single Input Length: 4 Octets¶
Octet 0¶
Octet 1¶
Octet 2¶
Octet 3¶
Single Input Length: 4 Octets¶
Octet 0¶
Octet 1¶
Octet 2¶
Octet 3¶
Single Input Length: 4 Octets¶
Octet 0¶
Octet 1¶
Octet 2¶
Octet 3¶
Single Input Length: 4 Octets¶
Octet 0¶
Octet 1¶
Octet 2¶
Octet 3¶
Single Input Length: 4 Octets¶
Octet 0¶
Octet 1¶
Octet 2¶
Octet 3¶
Single Input Length: 8 Octets¶
Octet 0¶
Octet 1¶
Octet 2¶
Octet 3¶
Octet 4¶
Octet 5¶
Octet 6¶
Octet 7¶
Single Input Length: 1 Octet¶
Octet 0¶
Single Input Length: 1 Octet¶
Octet 0¶
Single Input Length: 2 Octets¶
Octet 0¶
Octet 1¶
Single Input Length: 1 Octet¶
Octet 0¶
Single Input Length: 2 Octets¶
Octet 0¶
Octet 1¶
Single Input Length: 1 Octet¶
Octet 0¶
Single Input Length: 1 Octet¶
Octet 0¶
Copyright (c) 2021-2025, Vi Grey, Bigbass, and rasteri¶
All rights reserved.¶
Redistribution and use of this documentation in source (XML format) and/or "compiled" forms (TXT, PDF, HTML, etc), with or without modification, are permitted provided that the following conditions are met:¶
THIS DOCUMENTATION IS PROVIDED BY THE AUTHOR(S) "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.¶