diff options
Diffstat (limited to 'docs/latest/tasd-spec.txt')
| -rw-r--r-- | docs/latest/tasd-spec.txt | 2364 |
1 files changed, 2364 insertions, 0 deletions
diff --git a/docs/latest/tasd-spec.txt b/docs/latest/tasd-spec.txt new file mode 100644 index 0000000..c845dab --- /dev/null +++ b/docs/latest/tasd-spec.txt @@ -0,0 +1,2364 @@ + + + + +Independent TAS Console Replay Research Group V. Grey + + Bigbass + + rasteri + 16 April 2025 + + + TASD File Format Specification Version 1 + draft-tasd-v0001-00 + +Abstract + + The *TASD* file format is used for storing "Tool Assisted Speedrun" + or "Tool Assisted Superplay" (TAS) input and configuration data for + use with devices (known as "TAS replay devices") that replay inputs + on physical video game 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. + + This document defines the file format specification for *TASD* files. + +Table of Contents + + 1. Introduction + 1.1. Overview and Preliminaries + 1.1.1. Notation and Vocabulary + 1.2. Motivations + 1.2.1. Problems With Existing Formats + 2. Structure + 3. Header + 4. Packets + 4.1. Assigned Packet Keys Without Descriptions + 4.1.1. General Keys + 4.1.2. NES Specific Keys + 4.1.3. SNES Specific Keys + 4.1.4. Genesis Specific Keys + 4.1.5. Input Frame/Timing Keys + 4.1.6. Extraneous Keys + 4.2. Assigned Packet Keys With Descriptions + 4.2.1. General Key Descriptions + 4.2.2. NES Specific Key Descriptions + 4.2.3. SNES Specific Key Descriptions + 4.2.4. Genesis Specific Key Descriptions + 4.2.5. Input Frame/Timing Key Descriptions + 4.2.6. Extraneous Key Descriptions + 4.3. Packet Payload Formats + 4.3.1. General Key Payload Formats + 4.3.1.1. CONSOLE_TYPE Packet + 4.3.1.2. CONSOLE_REGION Packet + 4.3.1.3. GAME_TITLE Packet + 4.3.1.4. ROM_NAME Packet + 4.3.1.5. ATTRIBUTION Packet + 4.3.1.6. CATEGORY Packet + 4.3.1.7. EMULATOR_NAME Packet + 4.3.1.8. EMULATOR_VERSION Packet + 4.3.1.9. EMULATOR_CORE Packet + 4.3.1.10. TAS_LAST_MODIFIED Packet + 4.3.1.11. DUMP_CREATED Packet + 4.3.1.12. DUMP_LAST_MODIFIED Packet + 4.3.1.13. TOTAL_FRAMES Packet + 4.3.1.14. RERECORDS Packet + 4.3.1.15. SOURCE_LINK Packet + 4.3.1.16. BLANK_FRAMES Packet + 4.3.1.17. VERIFIED Packet + 4.3.1.18. MEMORY_INIT Packet + 4.3.1.19. GAME_IDENTIFIER Packet + 4.3.1.20. MOVIE_LICENSE Packet + 4.3.1.21. MOVIE_FILE Packet + 4.3.1.22. PORT_CONTROLLER Packet + 4.3.1.23. PORT_OVERREAD Packet + 4.3.2. NES Specific Key Payload Formats + 4.3.2.1. NES_LATCH_FILTER Packet + 4.3.2.2. NES_CLOCK_FILTER Packet + 4.3.2.3. NES_GAME_GENIE_CODE Packet + 4.3.3. SNES Specific Key Payload Formats + 4.3.3.1. SNES_LATCH_FILTER Packet + 4.3.3.2. SNES_CLOCK_FILTER Packet + 4.3.3.3. SNES_GAME_GENIE_CODE Packet + 4.3.3.4. SNES_LATCH_TRAIN Packet + 4.3.4. Genesis Specific Key Payload Formats + 4.3.4.1. GENESIS_GAME_GENIE_CODE Packet + 4.3.5. Input Frame/Timing Key Payload Formats + 4.3.5.1. INPUT_CHUNK Packet + 4.3.5.2. INPUT_MOMENT Packet + 4.3.5.3. TRANSITION Packet + 4.3.5.4. LAG_FRAME_CHUNK Packet + 4.3.5.5. MOVIE_TRANSITION + 4.3.6. Extraneous Key Payload Formats + 4.3.6.1. COMMENT Packet + 4.3.6.2. EXPERIMENTAL Packet + 4.3.6.3. UNSPECIFIED Packet + 5. Controller Input Formats + 5.1. NES/Famicom Controller Types + 5.1.1. NES Standard Controller + 5.1.2. NES Four Score + 5.2. SNES Controller Types + 5.2.1. SNES Standard Controller + 5.2.2. SNES Super Multitap + 5.2.3. SNES Mouse + 5.3. N64 Controller Types + 5.3.1. N64 Standard Controller + 5.3.2. N64 Standard Controller with Rumble + 5.3.3. N64 Standard Controller with Controller Pak + 5.3.4. N64 Standard Controller with Transfer Pak + 5.3.5. N64 Mouse + 5.3.6. N64 Densha de Go + 5.4. GameCube Controller Types + 5.4.1. GameCube Standard Controller + 5.5. Game Boy Controller Types + 5.5.1. GB Standard Controller + 5.6. Game Boy Color Controller Types + 5.6.1. GBC Standard Controller + 5.7. Game Boy Advance Controller Types + 5.7.1. GBA Standard Controller + 5.8. Genesis Controller Types + 5.8.1. Genesis (Mega Drive) 3-Button + 5.8.2. Genesis (Mega Drive) 6-Button + 5.9. Atari 2600 Controller Types + 5.9.1. A2600 Joystick + 5.9.2. A2600 Keyboard Controller + 6. References + 6.1. Normative References + Copyright Notice + Authors' Addresses + +1. Introduction + + The Tool Assisted Speedrun Dump (*TASD*) interchange format is a file + format for storing data that enables "Tool Assisted Speedruns" or + "Tool Assisted Superplays" to be played on physical video game + 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, they may be unable to provide everything. + Since packets are optional, the file can be expanded later with any + additional data as desired. No intermediary file format is + necessary. + +1.1. Overview and Preliminaries + + 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. + +1.1.1. Notation and Vocabulary + + Data Types: + + (S) = String + (A) = Binary Data + (I) = Signed Integer + (N) = Unsigned Integer + (B) = Boolean + ([]N) = List of Unsigned Integers + + Unless specified otherwise, all multi-octet integers are big-endian. + + We use the terms *byte* and *octet* interchangeably in this document. + + 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 do not make use 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. + + Both 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. + + Variable-length integer encoding (also known as VarInt or VLQ) is not + used in this format. Instead, arbitrarily sized integers, like those + used in Section 4, are prefixed with a single octet that specifies + the number of octets used to contain the integer value. In most + cases, this is less space-efficient than VarInt encoding, but it is + simpler to understand and to parse. + + Boolean values MUST be a single octet with the value of 0 for *FALSE* + or 1 for *TRUE*. + + [N octets] A sequence of octets with a length of N + + [00 7F FF] A sequence of octets 00, 7F, and FF in that order. + + *0-indexed* When counting sequentially, start counting at 0. + + *1-indexed* When counting sequentially, start counting at 1. + + In packet diagrams, a single octet is represented with a box like + this: + + +-----+ + | Var | <-- Vertical bars MAY be missing + +-----+ + + *Var* is a variable name. + + In packet diagrams, an arbitrary number of octets are represented + with a box like this: + + +=====+ + | Var | + +=====+ + + *Var* is a variable name. + + In packet diagrams, boxes can be connected like these examples: + + +-----------+-----------+ + | Var 1 (B) | Var 2 (I) | + +-----------+-----------+ + + In this example, *Var 1* is a 1 octet long boolean value and *Var + 2* is a 1 octet long signed integer. + + +-----+-----+===========+ + | Var 1 (N) | Var 2 (S) | + +-----+-----+===========+ + + In this example, *Var 1* is a 2 octet long unsigned integer and + *Var 2* is an arbitrary octet length string. + + 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) | + +-----+-----+===========+ + + In this example, *Var 1* is a 2 octet long unsigned integer and + *Var 2* is an arbitrary octet length string. + + 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) | + +-----------+===========+ + + In this example, the packet diagram contains enough variable boxes + to require being split into 2 sections, in order to maintain + consistent horizontal spacing in this document. The packet + diagram is separated by an ellipsis (...) on the same text row as + the variable names to signify that the packet diagram is + continuing. + +1.2. Motivations + + This file format's primary goal is to provide a comprehensive and + replay device agnostic TAS input dump format that is usable for any + console. Additional goals include: + + * No intermediary formats + + * Forward compatibility + + * High extensibility + + * Ability to easily generate using lua scripting in emulators + + 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). + +1.2.1. Problems With Existing Formats + + 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. + +2. Structure + + *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] + + *Header* + 7 octet header as defined in Section 3. + + *Packets* + List of 0 or more packets. Refer to Section 4 for packet + definitions. + +3. Header + + 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] + + *Magic Number* + 4 octet value that MUST be [54 41 53 44] (ASCII value TASD). + + *Version* + Version of the *TASD* file format. Version currently MUST be a + value of 1, but SHOULD be incremented in future versions. + + *G_KEYLEN* + Global length of *Key* values of packets. G_KEYLEN currently MUST + be a value of 2. + +4. Packets + + 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] + + *Key* + Packet type (Packet key). + + *PEXP* + Length of *PLEN*. *PEXP* MUST be a value greater than 0. + + *PLEN* + Length of *Payload*. + + *Payload* + Payload/Content of the packet. + + *G_KEYLEN* + Length of *Key* in each packet and is specified in the *TASD* file + header. + + All packets are OPTIONAL. + +4.1. Assigned Packet Keys Without Descriptions + +4.1.1. General Keys + + [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 + +4.1.2. NES Specific Keys + + [01 01] NES_LATCH_FILTER + [01 02] NES_CLOCK_FILTER + [01 04] NES_GAME_GENIE_CODE + +4.1.3. SNES Specific Keys + + [02 01] SNES_LATCH_FILTER + [02 02] SNES_CLOCK_FILTER + [02 04] SNES_GAME_GENIE_CODE + [02 05] SNES_LATCH_TRAIN + +4.1.4. Genesis Specific Keys + + [08 04] GENESIS_GAME_GENIE_CODE + +4.1.5. Input Frame/Timing Keys + + [FE 01] INPUT_CHUNK + [FE 02] INPUT_MOMENT + [FE 03] TRANSITION + [FE 04] LAG_FRAME_CHUNK + [FE 05] MOVIE_TRANSITION + +4.1.6. Extraneous Keys + + [FF 01] COMMENT + [FF FE] EXPERIMENTAL + [FF FF] UNSPECIFIED + +4.2. Assigned Packet Keys With Descriptions + +4.2.1. General Key Descriptions + + [00 01] - CONSOLE_TYPE + Specifies console used on emulator when dumping the TAS controller + inputs. This packet type is OPTIONAL but SHOULD be included in a + *TASD* file and a *TASD* file SHOULD NOT contain more than 1 of + this packet type in direct form. Discussed in (Section 4.3.1.1). + + [00 02] - CONSOLE_REGION + Specifies video region of console used for the TAS. This packet + type is OPTIONAL and a *TASD* file MAY contain more than 1 of this + packet type. Discussed in (Section 4.3.1.2). + + [00 03] - GAME_TITLE + Specifies the name of the game the TAS is written for. This + packet type is OPTIONAL and a *TASD* file MAY contain more than 1 + of this packet type. Discussed in (Section 4.3.1.3). + + [00 04] - ROM_NAME + Specifies the name of the specific ROM file used for the TAS. + This packet type is OPTIONAL and a *TASD* file MAY contain more + than 1 of this packet type. Discussed in (Section 4.3.1.4). + + [00 05] - ATTRIBUTION + Specifies the name of someone involved in the TAS or the creation + or management of the *TASD* file in order to provide proper + attribution for work done. This packet type is OPTIONAL and a + *TASD* file MAY contain more than 1 of this packet type. + Discussed in (Section 4.3.1.5). + + [00 06] - CATEGORY + Specifies the run category of the TAS. This packet type is + OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 of this + packet type in direct form. Discussed in (Section 4.3.1.6). + + [00 07] - EMULATOR_NAME + Specifies the emulator used while dumping TAS controller inputs. + This packet type is OPTIONAL and a *TASD* file SHOULD NOT contain + more than 1 of this packet type in direct form. Discussed in + (Section 4.3.1.7). + + [00 08] - EMULATOR_VERSION + Specifies the version of the emulator used while dump the TAS + controller inputs. This packet type is OPTIONAL and a *TASD* file + SHOULD NOT contain more than 1 of this packet type in direct form. + Discussed in (Section 4.3.1.8). + + [00 09] - EMULATOR_CORE + Specifies the core of the emulator used while dumping the TAS + controller inputs. This packet type is OPTIONAL and a *TASD* file + SHOULD NOT contain more than 1 of this packet type in direct form. + Discussed in (Section 4.3.1.9). + + [00 0A] - TAS_LAST_MODIFIED + Specifies when the TAS was last modified. Frequently used to + specify the date and time when the TAS was published. This packet + type is OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 + of this packet type in direct form. Discussed in + (Section 4.3.1.10). + + [00 0B] - DUMP_CREATED + Specifies when the *TASD* file was first created. This packet is + OPTIONAL but SHOULD be included in a *TASD* file and a *TASD* file + SHOULD NOT contain more than 1 of this packet type. Discussed in + (Section 4.3.1.11). + + [00 0C] - DUMP_LAST_MODIFIED + Specifies when the *TASD* file was last modified. This packet is + OPTIONAL but SHOULD be included in a *TASD* file and a *TASD* file + SHOULD NOT contain more than 1 of this packet type. Discussed in + (Section 4.3.1.12). + + [00 0D] - TOTAL_FRAMES + Specifies the total number of frames in the TAS. This packet type + is OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 of + this packet type in direct form. Discussed in (Section 4.3.1.13). + + [00 0E] - RERECORDS + Specifies the total number of rerecords of the TAS. This packet + type is OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 + of this packet type in direct form. Discussed in + (Section 4.3.1.14). + + [00 0F] - SOURCE_LINK + Specifies the source link for the TAS. This packet type is + OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 of this + packet type. Discussed in (Section 4.3.1.15). + + [00 10] - BLANK_FRAMES + Specifies the number of blank controller inputs or frames to + prepend to the inputs of the TAS when played on hardware. This + packet type is OPTIONAL and a *TASD* file SHOULD NOT contain more + than 1 of this packet type in direct form. Discussed in + (Section 4.3.1.16). + + [00 11] - VERIFIED + Specifies whether the TAS is verified to run on hardware, also + known as "console verified", using the *TASD* file. This packet + type is OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 + of this packet type in direct form. Discussed in + (Section 4.3.1.17). + + [00 12] - MEMORY_INIT + Specifies initial memory values used for the TAS. This packet + type is OPTIONAL and a *TASD* file MAY contain more than 1 of this + packet type. Discussed in (Section 4.3.1.18). + + [00 13] - GAME_IDENTIFIER + Specifies an identifier for the game the TAS is written for. This + can be checksums, hashes, or other identifying data. This packet + type is OPTIONAL and a *TASD* file MAY contain more than 1 of this + packet type. Discussed in (Section 4.3.1.19). + + [00 14] - MOVIE_LICENSE + Specifies a copyright license for the TAS. This packet type is + OPTIONAL and a *TASD* file MAY contain more than 1 of this packet + type. Discussed in (Section 4.3.1.20). + + [00 15] - MOVIE_FILE + Specifies the TAS movie data. This packet type is OPTIONAL and a + *TASD* file SHOULD NOT contain more than 1 of this packet type. + Discussed in (Section 4.3.1.21). + + [00 F0] - PORT_CONTROLLER + Specifies the controller type in specific console controller ports + for the TAS when played on hardware. This packet type is OPTIONAL + and a *TASD* file SHOULD NOT contain more than 1 of this packet + type in direct form. Discussed in (Section 4.3.1.22). + + [00 F1] - PORT_OVERREAD + Specifies whether a high or low signal SHOULD be sent through a + specified controller port of the console if the console requests + more input data from the replay device through that controller + port than expected. This packet type is OPTIONAL. Discussed in + (Section 4.3.1.23). + +4.2.2. NES Specific Key Descriptions + + [01 01] - NES_LATCH_FILTER + Specifies a latch filter time in microseconds for how long how + long to wait after a latch signal until new latch signals SHOULD + be accepted by the replay device. This packet type is OPTIONAL + and a *TASD* file SHOULD NOT contain more than 1 of this packet + type in direct form. Discussed in (Section 4.3.2.1). + + [01 02] - NES_CLOCK_FILTER + Specifies a clock filter time in tenths of a microsecond (0.1 + microseconds or 100 nanoseconds) for how long to wait after a + clock pulse until new clock pulses SHOULD be accepted by the + replay device. This packet type is OPTIONAL and a *TASD* file + SHOULD NOT contain more than 1 of this packet type in direct form. + Discussed in (Section 4.3.2.2). + + [01 04] - NES_GAME_GENIE_CODE + Specifies a Game Genie code for the TAS. This packet type is + OPTIONAL and a *TASD* file MAY contain more than 1 of this packet + type. Discussed in (Section 4.3.2.3). + +4.2.3. SNES Specific Key Descriptions + + [02 01] - SNES_LATCH_FILTER + Specifies a latch filter time in microseconds for how long how + long to wait after a latch signal until new latch signals SHOULD + be accepted by the replay device. This packet type is OPTIONAL + and a *TASD* file SHOULD NOT contain more than 1 of this packet + type in direct form. Discussed in (Section 4.3.3.1). + + [02 02] - SNES_CLOCK_FILTER + Specifies a clock filter time in tenths of a microsecond (0.1 + microseconds or 100 nanoseconds) for how long to wait after a + clock pulse until new clock pulses SHOULD be accepted by the + replay device. This packet type is OPTIONAL and a *TASD* file + SHOULD NOT contain more than 1 of this packet type in direct form. + Discussed in (Section 4.3.3.2). + + [02 04] - SNES_GAME_GENIE_CODE + Specifies a Game Genie code for the TAS. This packet type is + OPTIONAL and a *TASD* file MAY contain more than 1 of this packet + type. Discussed in (Section 4.3.3.3). + + [02 05] - SNES_LATCH_TRAIN + Specifies Latch Trains for TAS. This packet type is OPTIONAL and + a *TASD* file MAY contain more than 1 of this packet type. + Discussed in (Section 4.3.3.4). + +4.2.4. Genesis Specific Key Descriptions + + [08 04] - GENESIS_GAME_GENIE_CODE + Specifies a Game Genie code for the TAS. This packet type is + OPTIONAL and a *TASD* file MAY contain more than 1 of this packet + type. Discussed in (Section 4.3.4.1). + +4.2.5. Input Frame/Timing Key Descriptions + + [FE 01] - INPUT_CHUNK + Specifies a chunk of input data for the TAS when played on + hardware. All data from INPUT_CHUNK packets for each controller + port are concatenated together in order of appearance in the + *TASD* file. This packet type is OPTIONAL and a *TASD* file MAY + contain more than 1 of this packet type. Discussed in + (Section 4.3.5.1). + + [FE 02] - INPUT_MOMENT + Specifies a single instance of input data that is sent from the + replay device to the console with specific timing. This packet + type is OPTIONAL and a *TASD* file MAY contain more than 1 of this + packet type. Discussed in (Section 4.3.5.2). + + [FE 03] - TRANSITION + Specifies when a transition or change occurs during a TAS replay + (example: console reset or changing of controller types). This + packet type is OPTIONAL and a *TASD* file MAY contain more than 1 + of this packet type. Discussed in (Section 4.3.5.3). + + [FE 04] - LAG_FRAME_CHUNK + Specifies a chunk of lag frames in a TAS based on the original TAS + movie. This packet type is OPTIONAL and a *TASD* file MAY contain + more than 1 of this packet type. Discussed in (Section 4.3.5.4). + + [FE 05] - MOVIE_TRANSITION + Specifies when a transition or change occurs in the original TAS + movie (example: console reset or changing of controller types). + This packet type is OPTIONAL and a *TASD* file MAY contain more + than 1 of this packet type. Discussed in (Section 4.3.5.5). + +4.2.6. Extraneous Key Descriptions + + [FF 01] - COMMENT + Comment data. This packet type is OPTIONAL and a *TASD* file MAY + contain more than 1 of this packet type. Discussed in + (Section 4.3.6.1). + + [FF FE] - EXPERIMENTAL + TASD file is using draft/experimental packets. This packet type + is OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 of + this packet type. Discussed in (Section 4.3.6.2). + + [FF FF] - UNSPECIFIED + Unspecified packet data. Can contain any arbitrary data. This + packet type is OPTIONAL and a *TASD* file MAY contain more than 1 + of this packet type. Discussed in (Section 4.3.6.3). + +4.3. Packet Payload Formats + +4.3.1. General Key Payload Formats + +4.3.1.1. CONSOLE_TYPE Packet + + CONSOLE_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] + + *Console* + Game console the TAS movie is for. There are pre-specified + console types, but a *TASD* file MAY use [FF] to specify a console + that is not in the pre-specified console types. + + *Name* + Name of the console the TAS movie is for. SHOULD be empty if + *Console* is not set to [FF]. + + *PLEN* + Length of the packet payload. + +4.3.1.2. CONSOLE_REGION Packet + + 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 + + *Video Signal* + Specifies the video signal of the game console being emulated + while dumping the TAS movie's controller inputs. + +4.3.1.3. GAME_TITLE Packet + + GAME_TITLE packets MUST be in the following format: + + 0... + +===========+ + | Title (S) | + +===========+ + + Title (String) [PLEN octets] + + *Title* + Game title the TAS movie is for (example: "Super Mario Bros. 3"). + + *PLEN* + Length of the packet payload. + +4.3.1.4. ROM_NAME Packet + + ROM_NAME packets MUST be in the following format: + + 0... + +==========+ + | Name (S) | + +==========+ + + Name (String) [PLEN octets] + + *Name* + File name of the ROM used for the TAS movie (example: "Super Mario + Bros. 3 (J) [!].nes"). + + *PLEN* + Length of the packet payload. + +4.3.1.5. ATTRIBUTION Packet + + ATTRIBUTION packets MUST be in the following format: + + 0 1... + +----------+==========+ + | Type (A) | Name (S) | + +----------+==========+ + + Type (Binary Data) [1 octet] + [01] - Author + [02] - Verifier + [03] - TASD File Creator + [04] - TASD File Editor + [FF] - Other + Name (String) [PLEN - 1 octets] + + *Type* + Function of the person who is being attributed. *Author* is meant + for a TAS movie author. *Verifier* is meant for a person who + console verified the TAS movie(s) contained in the *TASD* file. + *TASD File Creator* is meant for the person who initially created + the *TASD* file, such as when dumping inputs from a TAS movie. + *TASD File Editor* is meant for a person who edited the *TASD* + file. + + *Name* + Name of the individual getting the attribution (example: + "OnehundredthCoin"). + + *PLEN* + Length of the packet payload. + +4.3.1.6. CATEGORY Packet + + CATEGORY packets MUST be in the following format: + + 0... + +==============+ + | Category (S) | + +==============+ + + Category (String) [PLEN octets] + + *Category* + Name of the TAS movie run category (example: "any%", "100%", "No + Warps"). + + *PLEN* + Length of the packet payload. + +4.3.1.7. EMULATOR_NAME Packet + + EMULATOR_NAME packets MUST be in the following format: + + 0... + +==========+ + | Name (S) | + +==========+ + + Name (String) [PLEN octets] + + *Name* + Name of the emulator used to play the TAS movie while dumping + controller inputs (example: "FCEUX", "Bizhawk"). The emulator's + version or core name SHOULD NOT be included. + + *PLEN* + Length of the packet payload. + +4.3.1.8. EMULATOR_VERSION Packet + + EMULATOR_VERSION packets MUST be in the following format: + + 0... + +=============+ + | Version (S) | + +=============+ + + Version (String) [PLEN octets] + + *Version* + Version of the emulator used to play the TAS movie while dumping + controller inputs (example: "2.7.0"). + + *PLEN* + Length of the packet payload. + +4.3.1.9. EMULATOR_CORE Packet + + EMULATOR_CORE packets MUST be in the following format: + + 0... + +==========+ + | Core (S) | + +==========+ + + Core (String) [PLEN octets] + + *Core* + Core of the emulator used to play the TAS movie while dumping + controller inputs (example: "NESHawk", "Gambatte"). + + *PLEN* + Length of the packet payload + +4.3.1.10. TAS_LAST_MODIFIED Packet + + 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] + + *Unix Timestamp* + 64-bit Unix timestamp (seconds since Unix Epoch) of when the TAS + movie was last modified. + +4.3.1.11. DUMP_CREATED Packet + + 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] + + *Unix Timestamp* + 64-bit Unix timestamp (seconds since Unix Epoch) of when the + *TASD* file was created. + +4.3.1.12. DUMP_LAST_MODIFIED Packet + + 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] + + *Unix Timestamp* + 64-bit Unix timestamp (seconds since Unix Epoch) of when the + *TASD* file was last modified. + +4.3.1.13. TOTAL_FRAMES Packet + + TOTAL_FRAMES packets MUST be in the following format: + + 0 1 2 3 + +---+---+---+---+ + | Frames (N) | + +---+---+---+---+ + + Frames (Unsigned Integer) [4 octets] + + *Frames* + Total number of frames of the TAS movie. + +4.3.1.14. RERECORDS Packet + + RERECORDS packets MUST be in the following format: + + 0 1 2 3 + +---+---+---+---+ + | Rerecords (N) | + +---+---+---+---+ + + Rerecords (Unsigned Integer) [4 octets] + + *Rerecords* + Total number of rerecords of the TAS movie. + +4.3.1.15. SOURCE_LINK Packet + + SOURCE_LINK packets MUST be in the following format: + + 0... + +==========+ + | Link (S) | + +==========+ + + Link (String) [PLEN octets] + + *Link* + URL that points to the TAS movie file (example: + "https://tasvideos.org/4567M"). + + *PLEN* + Length of the packet payload. + +4.3.1.16. BLANK_FRAMES Packet + + BLANK_FRAMES packets MUST be in the following format: + + 0 1 + +------+------+ + | Frames (I) | + +------+------+ + + Frames (Signed Integer) [2 octets] + + *Frames* + Number of blank frames (of input where no buttons are being + pressed) needed at the beginning of a TAS replay. If *Frames* is + a negative value, the value of *Frames* indicates the number of + frames that should be skipped from the TAS input data. A negative + value is not applicable if there is no way to determine how much + input data should be skipped (e.g. NES with INPUT_CHUNKs where + each input represents a single latch). + +4.3.1.17. VERIFIED Packet + + VERIFIED packets MUST be in the following format: + + 0 + +--------------+ + | Verified (B) | + +--------------+ + + Verified (Boolean) [1 octet] + + *Verified* + Boolean value that is *TRUE* if the *TASD* file has been + successfully console verified and *FALSE* if it has not been + verified. + +4.3.1.18. MEMORY_INIT Packet + + 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] + + *Data Type* + Content type of initial memory. If *Type* is not [FF], *Data* + SHOULD be empty (0 octet length binary data). + + *Device* + Device/Location that is to have memory initialized. + + *Required* + Boolean value that is *TRUE* if this memory initialization data is + known to be required and *FALSE* if the memory initialization data + is not known to be required. + + *NLEN* + Length of *Name* + + *Name* + Label for the memory initialization data (example: "CPU RAM", + "SAVE RAM"). If *Device* is [FF FF], *Name* SHOULD NOT be empty + (0 octet length string). + + *Data* + Raw memory initialization data. If *Data Type* is not [FF], + *Data* SHOULD be empty (0 octet length binary data). + + *PLEN* + Length of the packet payload. + +4.3.1.19. GAME_IDENTIFIER Packet + + GAME_IDENTIFIER packets MUST be in the following format: + + 0 1 2 3... + +----------+--------------+----------+==========+ + | Type (A) | Encoding (A) | NLEN (N) | Name (S) | ... + +----------+--------------+----------+==========+ + 3+NLEN... + +================+ + | 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 - NLEN - + 3 octets] + + *Type* + Hash, checksum, or identifier algorithm used to create the + *Identifier*. + + *Encoding* + Describes the data encoding of *Identifier*. Raw binary indicates + no encoding is used. Base16/32/64 all use the standard RFC 4648 + encodings, without extensions. Base 16 and Base 32 are case- + insensitive. + + *NLEN* + Length of *Name* + + *Name* + Name of the hash, checksum, or identifier algorithm used to create + the *Identifier*. If *Type* is not [FF], *Name* SHOULD be empty (0 + octet length binary data). + + *Identifier* + Game hash, checksum, or identifier data. + + *PLEN* + Length of the packet payload + +4.3.1.20. MOVIE_LICENSE Packet + + MOVIE_LICENSE packets MUST be in the following format: + + 0 + +=============+ + | License (S) | + +=============+ + + License (String) [PLEN octet] + + *License* + License information for the TAS movie (example: "Creative Commons + Attribution 2.0"). + + *PLEN* + Length of the packet payload. + +4.3.1.21. MOVIE_FILE Packet + + 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] + + *NLEN* + Length of *Name*. + + *Name* + Name of the TAS movie. Using the TAS movie's file name is + RECOMMENDED (example: "mranderson-thematrix.bk2"). + + *Data* + TAS movie file data/content. + + *PLEN* + Length of the packet payload. + +4.3.1.22. PORT_CONTROLLER Packet + + 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* + Controller port number (*Port* number MUST be *1-indexed*). + + *Type* + Specifies the controller type connected to the *Port*. + *(RESERVED)* specifies that the controller type is not described + in this document, but the byte values are reserved for a later + version of the *TASD* file format protocol. Input formats for + specific controller types are described in (Section 5). + +4.3.1.23. PORT_OVERREAD Packet + + PORT_OVERREAD packets MUST be in the following format: + + 0 1 + +----------+----------+ + | Port (N) | High (B) | + +----------+----------+ + + Port (N) [1 octet] + High (Boolean) [1 octet] + + *Port* + Controller port number (*Port* number MUST be *1-indexed*). + + *High* + Boolean value that is *TRUE* if overread bits are set to high and + *FALSE* if overread bits are set to low. + +4.3.2. NES Specific Key Payload Formats + +4.3.2.1. NES_LATCH_FILTER Packet + + NES_LATCH_FILTER packets MUST be in the following format: + + 0 1 + +-----+-----+ + | Time (N) | + +-----+-----+ + + Time (Unsigned Integer) [2 octets] + + *Time* + Latch filter length of time in microseconds. + +4.3.2.2. NES_CLOCK_FILTER Packet + + NES_CLOCK_FILTER packets MUST be in the following format: + + 0 + +----------+ + | Time (N) | + +----------+ + + Time (Unsigned Integer) [1 octet] + + *Time* + Clock filter length of time in tenths of a microsecond (units of + 0.1 microseconds or 100 nanoseconds). + +4.3.2.3. NES_GAME_GENIE_CODE Packet + + NES_GAME_GENIE_CODE packets MUST be in the following format: + + 0... + +==========+ + | Code (S) | + +==========+ + + Code (String) [PLEN octets] + + *Code* + Game Genie code (example: "AATOZA"). + + *PLEN* + Length of the packet payload. + +4.3.3. SNES Specific Key Payload Formats + +4.3.3.1. SNES_LATCH_FILTER Packet + + SNES_LATCH_FILTER packets MUST be in the following format: + + 0 1 + +-----+-----+ + | Time (N) | + +-----+-----+ + + Time (Unsigned Integer) [2 octets] + + *Time* + Latch filter length of time in microseconds. + +4.3.3.2. SNES_CLOCK_FILTER Packet + + SNES_CLOCK_FILTER packets MUST be in the following format: + + 0 + +----------+ + | Time (N) | + +----------+ + + Time (Unsigned Integer) [1 octet] + + *Time* + Clock filter length of time in tenths of a microsecond (units of + 0.1 microseconds or 100 nanoseconds). + +4.3.3.3. SNES_GAME_GENIE_CODE Packet + + SNES_GAME_GENIE_CODE packets MUST be in the following format: + + 0... + +==========+ + | Code (S) | + +==========+ + + Code (String) [PLEN octets] + + *Code* + Game Genie code (example: "DDB4-6F07"). + + *PLEN* + Length of the packet payload. + +4.3.3.4. SNES_LATCH_TRAIN Packet + + SNES_LATCH_TRAIN packets MUST be in the following format: + + 0... + +====================+ + | Latch Trains ([]N) | + +====================+ + + Latch Trains (List of Unsigned Integers) [PLEN octets] + + *Latch Trains* + List of 64-bit unsigned integers in which each integer is the + length of one Latch Train. MUST be a multiple of 8 octets in size + + *PLEN* + Length of the packet payload. + + 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. + +4.3.4. Genesis Specific Key Payload Formats + +4.3.4.1. GENESIS_GAME_GENIE_CODE Packet + + GENESIS_GAME_GENIE_CODE packets MUST be in the following format: + + 0... + +==========+ + | Code (S) | + +==========+ + + Code (String) [PLEN octets] + + *Code* + Game Genie code (example: "ATBT-AA32"). + + *PLEN* + Length of the packet payload. + +4.3.5. Input Frame/Timing Key Payload Formats + +4.3.5.1. INPUT_CHUNK 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] + + *Port* + Controller port number (*Port* number MUST be *1-indexed*). + + *Inputs* + Controller input data for controller on *Port*. Input formats for + each controller type is described in Section 5. + + *PLEN* + Length of the packet payload. + + 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. + +4.3.5.2. INPUT_MOMENT Packet + + 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 + [05] - Nanoseconds + Index (Unsigned Integer) [8 octets] + Inputs (Binary Data) [PLEN - 11 octets] + + + *Port* + Controller port number (*Port* number MUST be *1-indexed*). + + *Hold* + If *TRUE*, the *Input* data MUST continue to be held after the + controller state has been read. Otherwise if *FALSE*, the *Input* + data is held only until the data has been used once. + + *Index Type* + Specifies timing methodology of a specific moment when *Input* + data MUST be applied. + + *Index* + Time value in units based on *Index Type*. + + *Input* + A single instance of controller input data for the controller on + the specified *Port*. Input formats for each controller type is + described in Section 5. + + *PLEN* + Length of the packet payload. + + 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. + + If an INPUT_MOMENT overlaps with input data from one or more + INPUT_CHUNKs, the INPUT_MOMENT's *Input* data MUST be used instead of + the data contained in the INPUT_CHUNKs. INPUT_CHUNK data MUST still + be incremented as it normally would. *Hold* MUST still behave as + specified. + +4.3.5.3. TRANSITION Packet + + TRANSITION packets MUST be in the following format: + + 0 1 2 3 4 5 6 7 8 9 + +----------+----------------+--+--+--+--+--+--+--+--+ + | Port (N) | Index Type (A) | Index (N) | ... + +----------+----------------+--+--+--+--+--+--+--+--+ + 10 11... + +----------+============+ + | Type (A) | Packet (A) | + +----------+============+ + + Port (Unsigned Integer) [1 octet] + Index Type (Binary Data): [1 octet] + [01] - Frame + [02] - Cycle Count + [03] - Milliseconds + [04] - Microseconds + [05] - Nanoseconds + [06] - INPUT_CHUNK Byte Index + 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] + + *Port* + Controller port number (*Port* number MUST be *1-indexed*). + + *Input Type* + Determines specific timing type for start of transition. + + *Index* + Time or offset value to start transition. If *Index Type* is + [06], *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 [06], 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.) + + *Type* + Type of transition. If *Type* is [FF], the transition action will + be interpreting a *TASD* packet. + + *Inner Packet* + If *Type* is [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. + + *PLEN* + Length of the packet payload (Not *Inner Packet* length). + +4.3.5.4. LAG_FRAME_CHUNK 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] + + *Movie Frame* + Frame number of the TAS movie where Lag Frames start (*Movie + Frame* MUST be *0-indexed*). + + *Count* + Number of Lag Frames in a row starting from *Movie Frame*. + + Emulators typically consider a "lag frame" to be any frame in which + the emulator believes the game does not poll/read controller inputs. + +4.3.5.5. MOVIE_TRANSITION + + 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] + + *Movie Frame* + Frame number of the TAS movie (*Movie Frame* MUST be *0-indexed*). + + *Type* + Type of transition. If *Type* is [FF], the transition action will + be interpreting a *TASD* packet. + + *Inner Packet* + If *Type* is [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. + + *PLEN* + Length of the packet payload (Not *Inner Packet* length). + +4.3.6. Extraneous Key Payload Formats + +4.3.6.1. COMMENT Packet + + COMMENT packets MUST be in the following format: + + 0 + +=============+ + | Comment (S) | + +=============+ + + Comment (String) [PLEN octet] + + *Comment* + Comment text. + + *PLEN* + Length of the packet payload. + +4.3.6.2. EXPERIMENTAL Packet + + EXPERIMENTAL packets MUST be in the following format: + + 0 + +------------------+ + | Experimental (B) | + +------------------+ + + Experimental (Boolean) [1 octet] + + *Experimental* + Boolean data that is *TRUE* if the TASD file is using draft/ + experimental features (Currently SHOULD be *TRUE*) and *FALSE* if + the TASD file is using only stable features. + + *PLEN* + Length of the packet payload. + +4.3.6.3. UNSPECIFIED Packet + + UNSPECIFIED packets MUST be in the following format: + + 0... + +======================+ + | Unspecified Data (A) | + +======================+ + + Unspecified Data (Binary Data) [PLEN octets] + + *Unspecified Data* + Arbitrary data. Can be used for any data. Because this is + unspecified data, there is no guarantee any software used to + control a TAS replay device will support data in this packet type. + + *PLEN* + Length of the packet payload. + +5. Controller Input Formats + + 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. + +5.1. NES/Famicom Controller Types + +5.1.1. NES Standard Controller + + Single Input Length: 1 Octet + + *Octet 0* + + Bit 7: /A + Bit 6: /B + Bit 5: /Select + Bit 4: /Start + Bit 3: /Up + Bit 2: /Down + Bit 1: /Left + Bit 0: /Right + +5.1.2. NES Four Score + + Single Input Length: 3 Octets + + *Octet 0* + + Bit 7: Controller N-1 /A + Bit 6: Controller N-1 /B + Bit 5: Controller N-1 /Select + Bit 4: Controller N-1 /Start + Bit 3: Controller N-1 /Up + Bit 2: Controller N-1 /Down + Bit 1: Controller N-1 /Left + Bit 0: Controller N-1 /Right + + *Octet 1* + + Bit 7: Controller N-2 /A + Bit 6: Controller N-2 /B + Bit 5: Controller N-2 /Select + Bit 4: Controller N-2 /Start + Bit 3: Controller N-2 /Up + Bit 2: Controller N-2 /Down + Bit 1: Controller N-2 /Left + Bit 0: Controller N-2 /Right + + *Octet 2* + + Bit 7: 1 + Bit 6: 1 + Bit 5: 0 if Controller Port is 2, otherwise 1 + Bit 4: 0 if Controller Port is 1, otherwise 1 + Bit 3: 1 + Bit 2: 1 + Bit 1: 1 + Bit 0: 1 + + *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*. + +5.2. SNES Controller Types + +5.2.1. SNES Standard Controller + + Single Input Length: 2 Octets + + *Octet 0* + + Bit 7: /B + Bit 6: /Y + Bit 5: /Select + Bit 4: /Start + Bit 3: /Up + Bit 2: /Down + Bit 1: /Left + Bit 0: /Right + + *Octet 1* + + Bit 7: /A + Bit 6: /X + Bit 5: /L + Bit 4: /R + Bit 3: 1 + Bit 2: 1 + Bit 1: 1 + Bit 0: 1 + +5.2.2. SNES Super Multitap + + Single Input Length: 5 Octets + + *Octet 0* : + + Bit 7: 1 + Bit 6: 1 + Bit 5: 1 + Bit 4: 1 + Bit 3: 1 + Bit 2: 1 + Bit 1: 1 + Bit 0: I/O Pin State - *1* if Multitap ports *1 and 2* are being + polled, *0* if ports *3 and 4* are. + + *Octet 1* + + Bit 7: Controller N-1 or N-3 /B + Bit 6: Controller N-1 or N-3 /Y + Bit 5: Controller N-1 or N-3 /Select + Bit 4: Controller N-1 or N-3 /Start + Bit 3: Controller N-1 or N-3 /Up + Bit 2: Controller N-1 or N-3 /Down + Bit 1: Controller N-1 or N-3 /Left + Bit 0: Controller N-1 or N-3 /Right + + *Octet 2* + + Bit 7: Controller N-1 or N-3 /A + Bit 6: Controller N-1 or N-3 /X + Bit 5: Controller N-1 or N-3 /L + Bit 4: Controller N-1 or N-3 /R + Bit 3: 1 + Bit 2: 1 + Bit 1: 1 + Bit 0: 1 + + *Octet 3* + + Bit 7: Controller N-2 or N-4 /B + Bit 6: Controller N-2 or N-4 /Y + Bit 5: Controller N-2 or N-4 /Select + Bit 4: Controller N-2 or N-4 /Start + Bit 3: Controller N-2 or N-4 /Up + Bit 2: Controller N-2 or N-4 /Down + Bit 1: Controller N-2 or N-4 /Left + Bit 0: Controller N-2 or N-4 /Right + + *Octet 4* + + Bit 7: Controller N-2 or N-4 /A + Bit 6: Controller N-2 or N-4 /X + Bit 5: Controller N-2 or N-4 /L + Bit 4: Controller N-2 or N-4 /R + Bit 3: 1 + Bit 2: 1 + Bit 1: 1 + Bit 0: 1 + + *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*. + +5.2.3. SNES Mouse + + Single Input Length: 4 Octets + + *Octet 0* + + Bit 7: 1 + Bit 6: 1 + Bit 5: 1 + Bit 4: 1 + Bit 3: 1 + Bit 2: 1 + Bit 1: 1 + Bit 0: 1 + + *Octet 1* + + Bit 7: /Right button + Bit 6: /Left button + Bit 5: Current sensitivity (0: high sensitivity; 1: low or medium + sensitivity) + Bit 4: Current sensitivity (0: medium sensitivity; 1: low or high + sensitivity) + Bit 3: 1 + Bit 2: 1 + Bit 1: 1 + Bit 0: 0 + + *Octet 2* + + Bits 7-1: /Vertical displacement since last read + Bit 0: Direction (0: up; 1: down) + + *Octet 3* + + Bits 7-1: /Horizontal displacement since last read + Bit 0: Direction (0: up; 1: down) + +5.3. N64 Controller Types + +5.3.1. N64 Standard Controller + + Single Input Length: 4 Octets + + *Octet 0* + + Bit 7: A + Bit 6: B + Bit 5: Z + Bit 4: Start + Bit 3: D-Pad Up + Bit 2: D-Pad Down + Bit 1: D-Pad Left + Bit 0: D-Pad Right + + *Octet 1* + + Bit 7: RST (special controller reset bit) + Bit 6: 0 + Bit 5: Left Trigger + Bit 4: Right Trigger + Bit 3: C-Up + Bit 2: C-Down + Bit 1: C-Left + Bit 0: C-Right + + *Octet 2* + + Bits 7-0: Analog Stick X-Axis (signed 8-bit number) + + *Octet 3* + + Bits 7-0: Analog Stick Y-Axis (signed 8-bit number) + +5.3.2. N64 Standard Controller with Rumble + + Single Input Length: 4 Octets + + *Octet 0* + + Bit 7: A + Bit 6: B + Bit 5: Z + Bit 4: Start + Bit 3: D-Pad Up + Bit 2: D-Pad Down + Bit 1: D-Pad Left + Bit 0: D-Pad Right + + *Octet 1* + + Bit 7: RST (special controller reset bit) + Bit 6: 0 + Bit 5: Left Trigger + Bit 4: Right Trigger + Bit 3: C-Up + Bit 2: C-Down + Bit 1: C-Left + Bit 0: C-Right + + *Octet 2* + + Bits 7-0: Analog Stick X-Axis (signed 8-bit number) + + *Octet 3* + + Bits 7-0: Analog Stick Y-Axis (signed 8-bit number) + +5.3.3. N64 Standard Controller with Controller Pak + + Single Input Length: 4 Octets + + *Octet 0* + + Bit 7: A + Bit 6: B + Bit 5: Z + Bit 4: Start + Bit 3: D-Pad Up + Bit 2: D-Pad Down + Bit 1: D-Pad Left + Bit 0: D-Pad Right + + *Octet 1* + + Bit 7: RST (special controller reset bit) + Bit 6: 0 + Bit 5: Left Trigger + Bit 4: Right Trigger + Bit 3: C-Up + Bit 2: C-Down + Bit 1: C-Left + Bit 0: C-Right + + *Octet 2* + + Bits 7-0: Analog Stick X-Axis (signed 8-bit number) + + *Octet 3* + + Bits 7-0: Analog Stick Y-Axis (signed 8-bit number) + +5.3.4. N64 Standard Controller with Transfer Pak + + Single Input Length: 4 Octets + + *Octet 0* + + Bit 7: A + Bit 6: B + Bit 5: Z + Bit 4: Start + Bit 3: D-Pad Up + Bit 2: D-Pad Down + Bit 1: D-Pad Left + Bit 0: D-Pad Right + + *Octet 1* + + Bit 7: RST (special controller reset bit) + Bit 6: 0 + Bit 5: Left Trigger + Bit 4: Right Trigger + Bit 3: C-Up + Bit 2: C-Down + Bit 1: C-Left + Bit 0: C-Right + + *Octet 2* + + Bits 7-0: Analog Stick X-Axis (signed 8-bit number) + + *Octet 3* + + Bits 7-0: Analog Stick Y-Axis (signed 8-bit number) + +5.3.5. N64 Mouse + + Single Input Length: 4 Octets + + *Octet 0* + + Bit 7: A + Bit 6: B + Bit 5: 0 + Bit 4: 0 + Bit 3: 0 + Bit 2: 0 + Bit 1: 0 + Bit 0: 0 + + *Octet 1* + + Bit 7: 0 + Bit 6: 0 + Bit 5: 0 + Bit 4: 0 + Bit 3: 0 + Bit 2: 0 + Bit 1: 0 + Bit 0: 0 + + *Octet 2* + + Bits 7-0: Relative X-Axis position (signed 8-bit number) + + *Octet 3* + + Bits 7-0: Relative Y-Axis position (signed 8-bit number) + +5.3.6. N64 Densha de Go + + Single Input Length: 4 Octets + + *Octet 0* + + Bit 7: A + Bit 6: B + Bit 5: Accelerator + Bit 4: Start + Bit 3: Accelerator + Bit 2: 0 + Bit 1: 0 + Bit 0: Accelerator + + *Octet 1* + + Bit 7: 0 + Bit 6: 0 + Bit 5: C + Bit 4: Select + Bits 3-0: Brake + + *Octet 2* + + Bit 7: 0 + Bit 6: 0 + Bit 5: 0 + Bit 4: 0 + Bit 3: 0 + Bit 2: 0 + Bit 1: 0 + Bit 0: 0 + + *Octet 3* + + Bit 7: 0 + Bit 6: 0 + Bit 5: 0 + Bit 4: 0 + Bit 3: 0 + Bit 2: 0 + Bit 1: 0 + Bit 0: 0 + +5.4. GameCube Controller Types + +5.4.1. GameCube Standard Controller + + Single Input Length: 8 Octets + + *Octet 0* + + Bit 7: 0 + Bit 6: 0 + Bit 5: 0 + Bit 4: Start + Bit 3: Y + Bit 2: X + Bit 1: B + Bit 0: A + + *Octet 1* + + Bit 7: 1 + Bit 6: L + Bit 5: R + Bit 4: Z + Bit 3: D-Pad Up + Bit 2: D-Pad Down + Bit 1: D-Pad Right + Bit 0: D-Pad Left + + *Octet 2* + + Bits 7-0: Analog Stick X-Axis (signed 8-bit number) + + *Octet 3* + + Bits 7-0: Analog Stick Y-Axis (signed 8-bit number) + + *Octet 4* + + Bits 7-0: C-Stick X-Axis (signed 8-bit number) + + *Octet 5* + + Bits 7-0: C-Stick Y-Axis (signed 8-bit number) + + *Octet 6* + + Bits 7-0: L Analog Value (unsigned 8-bit number) + + *Octet 7* + + Bits 7-0: R Analog Value (unsigned 8-bit number) + +5.5. Game Boy Controller Types + +5.5.1. GB Standard Controller + + Single Input Length: 1 Octet + + *Octet 0* + + Bit 7: /Down + Bit 6: /Up + Bit 5: /Left + Bit 4: /Right + Bit 3: /Start + Bit 2: /Select + Bit 1: /B + Bit 0: /A + +5.6. Game Boy Color Controller Types + +5.6.1. GBC Standard Controller + + Single Input Length: 1 Octet + + *Octet 0* + + Bit 7: /Down + Bit 6: /Up + Bit 5: /Left + Bit 4: /Right + Bit 3: /Start + Bit 2: /Select + Bit 1: /B + Bit 0: /A + +5.7. Game Boy Advance Controller Types + +5.7.1. GBA Standard Controller + + Single Input Length: 2 Octets + + *Octet 0* + + Bit 7: 1 + Bit 6: 1 + Bit 5: 1 + Bit 4: 1 + Bit 3: 1 + Bit 2: 1 + Bit 1: /L + Bit 0: /R + + *Octet 1* + + Bit 7: /Down + Bit 6: /Up + Bit 5: /Left + Bit 4: /Right + Bit 3: /Start + Bit 2: /Select + Bit 1: /B + Bit 0: /A + +5.8. Genesis Controller Types + +5.8.1. Genesis (Mega Drive) 3-Button + + Single Input Length: 1 Octet + + *Octet 0* + + Bit 7: /C + Bit 6: /B + Bit 5: /Right + Bit 4: /Left + Bit 3: /Down + Bit 2: /Up + Bit 1: /Start + Bit 0: /A + +5.8.2. Genesis (Mega Drive) 6-Button + + Single Input Length: 2 Octets + + *Octet 0* + + Bit 7: /C + Bit 6: /B + Bit 5: /Right + Bit 4: /Left + Bit 3: /Down + Bit 2: /Up + Bit 1: /Start + Bit 0: /A + + *Octet 1* + + Bit 7: /Mode + Bit 6: /X + Bit 5: /Y + Bit 4: /Z + Bit 3: 1 + Bit 2: 1 + Bit 1: 1 + Bit 0: 1 + +5.9. Atari 2600 Controller Types + +5.9.1. A2600 Joystick + + Single Input Length: 1 Octet + + *Octet 0* + + Bit 7: /Up + Bit 6: /Down + Bit 5: /Left + Bit 4: /Right + Bit 3: 1 + Bit 2: /Button + Bit 1: 1 + Bit 0: 1 + +5.9.2. A2600 Keyboard Controller + + Single Input Length: 1 Octet + + *Octet 0* + + Bit 7: /Row1 (key 1, 2, or 3 pressed) + Bit 6: /Row2 (key 4, 5, or 6 pressed) + Bit 5: /Row3 (key 7, 8, or 9 pressed) + Bit 4: /Row4 (key *, 0, or # pressed) + Bit 3: /Column1 (key 1, 4, 7, or * pressed) + Bit 2: /Column3 (key 3, 6, 9, or # pressed) + Bit 1: /Column2 (key 2, 5, 8, or 0 pressed) + Bit 0: 1 + +6. References + +6.1. Normative References + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + +Copyright Notice + + 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: + + 1. Redistributions of source code (XML format) of this documentation + must retain the above copyright notice, this list of conditions, + and the following disclaimer in the documentation. + + 2. Redistributions in compiled form (Converted to TXT, PDF, HTML, + and other formats) of this documentation must reproduce the above + copyright notice, this list of conditions, and the following + disclaimer in the documentation. + + 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. + +Authors' Addresses + + Vi Grey + Email: vi@vigrey.com + URI: https://vigrey.com + + + Bigbass + URI: https://github.com/bigbass1997 + + + rasteri + URI: https://github.com/rasteri |
