diff options
| author | Vi Grey <vi@vigrey.com> | 2022-09-26 04:47:20 -0500 |
|---|---|---|
| committer | Vi Grey <vi@vigrey.com> | 2022-09-26 04:47:20 -0500 |
| commit | d4e3218b05362c27acd2d9f80aa57a54d3d36173 (patch) | |
| tree | 6de45514754e27c7598135f45da15cba4748f220 /docs/tasd-spec-0001/draft-tasd-spec-0001.txt | |
| parent | ede5eec5144048e420a265ac5baecc4ea29ff27c (diff) | |
| download | tasd-d4e3218b05362c27acd2d9f80aa57a54d3d36173.tar.gz tasd-d4e3218b05362c27acd2d9f80aa57a54d3d36173.zip | |
Remove `draft-` from `docs/draft-tasd-spec-0001`
Rename `docs/draft-tasd-spec-0001/` to `docs/tasd-spec-0001/`
Use correct path for compiled documents for Makefile contribution rule
Diffstat (limited to 'docs/tasd-spec-0001/draft-tasd-spec-0001.txt')
| -rw-r--r-- | docs/tasd-spec-0001/draft-tasd-spec-0001.txt | 2158 |
1 files changed, 2158 insertions, 0 deletions
diff --git a/docs/tasd-spec-0001/draft-tasd-spec-0001.txt b/docs/tasd-spec-0001/draft-tasd-spec-0001.txt new file mode 100644 index 0000000..892e66c --- /dev/null +++ b/docs/tasd-spec-0001/draft-tasd-spec-0001.txt @@ -0,0 +1,2158 @@ + + + + +Independent TAS Console Replay Research Group V. Grey + VG Interactive + Bigbass + 26 September 2022 + + + 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) 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. + +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. Header + 3. Packets + 3.1. Assigned Packet Keys Without Descriptions + 3.1.1. General Keys + 3.1.2. NES Specific Keys + 3.1.3. SNES Specific Keys + 3.1.4. Genesis Specific Keys + 3.1.5. Input Frame/Timing Keys + 3.1.6. Extraneous Keys + 3.2. Assigned Packet Keys With Descriptions + 3.2.1. General Key Descriptions + 3.2.2. NES Specific Key Descriptions + 3.2.3. SNES Specific Key Descriptions + 3.2.4. Genesis Specific Key Descriptions + 3.2.5. Input Frame/Timing Key Descriptions + 3.2.6. Extraneous Key Descriptions + 3.3. Packet Payload Formats + 3.3.1. General Key Payload Formats + 3.3.1.1. CONSOLE_TYPE Packet + 3.3.1.2. CONSOLE_REGION Packet + 3.3.1.3. GAME_TITLE Packet + 3.3.1.4. ROM_NAME Packet + 3.3.1.5. ATTRIBUTION Packet + 3.3.1.6. CATEGORY Packet + 3.3.1.7. EMULATOR_NAME Packet + 3.3.1.8. EMULATOR_VERSION Packet + 3.3.1.9. EMULATOR_CORE Packet + 3.3.1.10. TAS_LAST_MODIFIED Packet + 3.3.1.11. DUMP_CREATED Packet + 3.3.1.12. DUMP_LAST_MODIFIED Packet + 3.3.1.13. TOTAL_FRAMES Packet + 3.3.1.14. RERECORDS Packet + 3.3.1.15. SOURCE_LINK Packet + 3.3.1.16. BLANK_FRAMES Packet + 3.3.1.17. VERIFIED Packet + 3.3.1.18. MEMORY_INIT Packet + 3.3.1.19. GAME_IDENTIFIER Packet + 3.3.1.20. MOVIE_LICENSE Packet + 3.3.1.21. MOVIE_FILE Packet + 3.3.1.22. PORT_CONTROLLER Packet + 3.3.2. NES Specific Key Payload Formats + 3.3.2.1. NES_LATCH_FILTER Packet + 3.3.2.2. NES_CLOCK_FILTER Packet + 3.3.2.3. NES_OVERREAD Packet + 3.3.2.4. NES_GAME_GENIE_CODE Packet + 3.3.3. SNES Specific Key Payload Formats + 3.3.3.1. SNES_CLOCK_FILTER Packet + 3.3.3.2. SNES_OVERREAD Packet + 3.3.3.3. SNES_GAME_GENIE_CODE Packet + 3.3.3.4. SNES_LATCH_TRAIN Packet (RESERVED) + 3.3.4. Genesis Specific Key Payload Formats + 3.3.4.1. GENESIS_GAME_GENIE_CODE Packet + 3.3.5. Input Frame/Timing Key Payload Formats + 3.3.5.1. INPUT_CHUNK Packet + 3.3.5.2. INPUT_MOMENT Packet + 3.3.5.3. TRANSITION Packet + 3.3.5.4. LAG_FRAME_CHUNK Packet + 3.3.5.5. MOVIE_TRANSITION + 3.3.6. Extraneous Key Payload Formats + 3.3.6.1. COMMENT Packet + 3.3.6.2. EXPERIMENTAL Packet + 3.3.6.3. UNSPECIFIED Packet + 4. Controller Input Formats + 4.1. NES/Famicom Controller Types + 4.1.1. NES Standard Controller + 4.1.2. NES Four Score + 4.2. SNES Controller Types + 4.2.1. SNES Standard Controller + 4.2.2. SNES Mouse + 4.3. N64 Controller Types + 4.3.1. N64 Standard Controller + 4.3.2. N64 Standard Controller with Rumble + 4.3.3. N64 Standard Controller with Controller Pak + 4.3.4. N64 Standard Controller with Transfer Pak + 4.3.5. N64 Mouse + 4.3.6. N64 Densha de Go + 4.4. GameCube Controller Types + 4.4.1. GameCube Standard Controller + 4.5. Game Boy Controller Types + 4.5.1. GB Standard Controller + 4.6. Game Boy Color Controller Types + 4.6.1. GBC Standard Controller + 4.7. Game Boy Advance Controller Types + 4.7.1. GBA Standard Controller + 4.8. Genesis Controller Types + 4.8.1. Genesis (Mega Drive) 3-Button + 4.8.2. Genesis (Mega Drive) 6-Button + 4.9. Atari 2600 Controller Types + 4.9.1. A2600 Joystick + 4.9.2. A2600 Keyboard Controller + 5. References + 5.1. Normative References + Copyright Notice + Authors' Addresses + +1. Introduction + + The Tool Assisted Speedrun Dump (*TASD*) interchange format is a file + format for storing data to allow "Tool Assisted Speedruns" or "Tool + Assited 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. + + Keys can be used multiple times or completely omitted as needed. + This reusability eliminates the need of a predefined delimiter to + separate pieces of data such as a list of TAS authors. + + While files generated by emulator dump scripts should provide as much + information as possible, because keys 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 + + 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 3.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. 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] 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, enough variable boxes are in the packet diagram + to require being split into 2 sections to take up less horizontal + space in this documentation. The packet diagram is seperated 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 movie controller 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 was 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 + + Most existing formats are either incomplete for some verification + needs or don't exist at all for some consoles. A format commonly + used for NES console verifications (r08) only encodes 2 standard + controllers worth of sequential data and a format commonly used for + SNES console verifications (r16m) only encodes up to 8 standard + controllers worth of sequential data. There is no built in way to + store *RESET* press timing information or indicate additional + settings/information. Non-standard controllers are also not + supported in commonly used formats. + + For consoles not as popular as the NES and SNES, controller input + formats would frequently be written in a way that is meant only to + work and not in a "standard" way. While that process works, it's + less than ideal for redistribution of console replays so that others + (especially with differing TAS replay devices) can also verify the + same TAS. + +2. Header + + *TASD* files MUST include a header, which 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. + + *G_KEYLEN* + Global length of *Key* values of packets. G_KEYLEN currently MUST + be a value of 2. + +3. Packets + + Packets 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*. + + *PLEN* + Length of *Payload*. + + *Payload* + Payload/Content of the packet. + + *G_KEYLEN* + Length of *Key* in packets and is specified in the *TASD* file + header. + + All packets are OPTIONAL. + +3.1. Assigned Packet Keys Without Descriptions + +3.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_IDENIFIER + [00 14] MOVIE_LICENSE + [00 15] MOVIE_FILE + [00 F0] PORT_CONTROLLER + +3.1.2. NES Specific Keys + + [01 01] NES_LATCH_FILTER + [01 02] NES_CLOCK_FILTER + [01 03] NES_OVERREAD + [01 04] NES_GAME_GENIE_CODE + +3.1.3. SNES Specific Keys + + [02 02] SNES_CLOCK_FILTER + [02 03] SNES_OVERREAD + [02 04] SNES_GAME_GENIE_CODE + [02 05] SNES_LATCH_TRAIN (RESERVED) + +3.1.4. Genesis Specific Keys + + [08 04] GENESIS_GAME_GENIE_CODE + +3.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 + +3.1.6. Extraneous Keys + + [FF 01] COMMENT + [FF FE] EXPERIMENTAL + [FF FF] UNSPECIFIED + +3.2. Assigned Packet Keys With Descriptions + +3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.3.1.10). + + [00 0B] - DUMP_CREATEED + 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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.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 3.3.1.22). + +3.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 3.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 3.3.2.2). + + [01 03] - NES_OVERREAD + Specifies whether a high or low signal SHOULD be sent to the NES + console if the console clocks the replay device for more input + buttons than are expected for the latch. 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 3.3.2.3). + + [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 3.3.2.4). + +3.2.3. SNES Specific Key Descriptions + + [02 02] - SNES_CLOCK_FILTER + Specifies a clock filter time in tenths of a microsecond (0.1 + microseconds or 100 nanoseconds) for long how to wait after a + clock pulse before 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 3.3.2.2). + + [02 03] - SNES_OVERREAD + Specifies whether a high or low signal SHOULD be sent to the SNES + console if the console clocks the replay device for more input + buttons than are expected for the latch. 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 3.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 3.3.3.3). + + [02 05] - SNES_LATCH_TRAIN (RESERVED) + This packet type is not yet designed and is intended to be + described in the future. Discussed in (Section 3.3.3.4). + +3.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 3.3.4.1). + +3.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 are concatenated + together in order of appearance in the *TASD* file. If the + INPUT_CHUNK packet type is used, the PORT_CONTROLLER packet type + MUST be used. If the INPUT_CHUNK packet type is used, the + INPUT_MOMENT packet type SHOULD NOT be used. This packet type is + OPTIONAL and a *TASD* file MAY contain more than 1 of this packet + type. Discussed in (Section 3.3.5.1). + + [FE 02] - INPUT_MOMENT + Specifies input data that is sent from the replay device to the + console with specific timing. If the INPUT_MOMENT packet type is + used, the PORT_CONTROLLER packet type MUST be used. If the + INPUT_MOMENT packet type is used, the INPUT_CHUNK packet type + SHOULD NOT be used. This packet type is OPTIONAL and a *TASD* + file MAY contain more than 1 of this packet type. Discussed in + (Section 3.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 3.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 3.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 3.3.5.5). + +3.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 3.3.6.1). + + [FF FE] - EXPERIMENTAL + TASD file is using experimental packets. This packet type is + OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 of this + packet type. Discussed in (Section 3.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 3.3.6.3). + +3.3. Packet Payload Formats + +3.3.1. General Key Payload Formats + +3.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. + +3.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 controller inputs. + +3.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. + +3.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. + +3.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 + initially console verified the the TAS movie using the *TASD + file*. *TASD File Creator* is meant for the person who initially + dumped the TAS movie controller inputs into the *TASD* file. + *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. + +3.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. + +3.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"). + + *PLEN* + Length of the packet payload. + +3.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. + +3.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 + +3.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 of when the TAS movie was last modified. + +3.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 of when the *TASD* file was created. + +3.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 of when the *TASD* file was last modified. + +3.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. + +3.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. + +3.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 or submission (example: + "https://tasvideos.org/4567M"). + + *PLEN* + Length of the packet payload. + +3.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 (inputs where no buttons are being pressed) + needed at the beginning of a TAS console replay of the TAS movie. + If *Frames* is a negative value, the value of *Frames* amount of + inputs of the TAS console replay of the TAS movie should be + removed. + +3.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. + +3.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... 6... + +----------+==========+==========+ + | 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 - + 4 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. + +3.3.1.19. GAME_IDENTIFIER Packet + + GAME_IDENTIFIER packets MUST be in the following format: + + 0 1 2... + +----------+----------+================+ + | Type (A) | Base (A) | Identifier (A) | + +----------+----------+================+ + + Type (Binary Data): [1 octet] + [01] - CRC-8 Checksum + [02] - CRC-16 Checksum + [03] - CRC-32 Checksum + [04] - MD5 Hash + [05] - SHA1 Hash + [06] - SHA224 Hash + [07] - SHA256 Hash + [08] - SHA384 Hash + [09] - SHA512 Hash + [0A] - SHA512/224 Hash + [0B] - SHA512/256 Hash + [0C] - SHA3-224 Hash + [0D] - SHA3-256 Hash + [0E] - SHA3-384 Hash + [0F] - SHA3-512 Hash + [10] - SHAKE-128 Hash + [11] - SHAKE-256 Hash + [FF] - Other + Base (Binary Data): [1 octet] + [01] - Raw Binary + [02] - Case Insensitive Base 16 (Hex) - RFC 4648 + [03] - Case Insensitive Base 32 - RFC 4648 + [04] - Base 64 - RFC 4648 + [FF] - Other + Identifier (Binary Data) [PLEN - 2 octets] + + *Type* + Hash, checksum, or identifier algorithm *Identifier* is using. + + *Base* + Describes the data encoding of *Identifier*. + + *Identifier* + Game hash, checksum, or identifier data. + + *PLEN* + Length of the packet payload + +3.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. + +3.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 + 1 octets] + Data (Binary Data) [PLEN - NLEN - + 1 octets] + + *NLEN* + Length of *Name*. + + *Name* + Name of the TAS movie (RECOMMENDED to use TAS movie file name, for + example: "100thcoinv2-smb3j-geg.bk2"). + + *Data* + TAS movie file data/content. + + *PLEN* + Length of the packet payload. + +3.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 4). + +3.3.2. NES Specific Key Payload Formats + +3.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. + +3.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). + +3.3.2.3. NES_OVERREAD Packet + + NES_OVERREAD packets MUST be in the following format: + + 0 + +----------+ + | High (B) | + +----------+ + + High (Boolean) [1 octet] + + *High* + Boolean value that is *TRUE* if overread bits are set to high and + *FALSE* if overread bits are set to low. + +3.3.2.4. 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. + +3.3.3. SNES Specific Key Payload Formats + +3.3.3.1. 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). + +3.3.3.2. SNES_OVERREAD Packet + + SNES_OVERREAD packets MUST be in the following format: + + 0 + +----------+ + | High (B) | + +----------+ + + High (Boolean) [1 octet] + + *High* + Boolean value that is *TRUE* if overread bits are set to high and + *FALSE* if overread bits are set to low. + +3.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. + +3.3.3.4. SNES_LATCH_TRAIN Packet (RESERVED) + + This packet type is not yet designed and is intended to be described + in the future. + +3.3.4. Genesis Specific Key Payload Formats + +3.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. + +3.3.5. Input Frame/Timing Key Payload Formats + +3.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 values are + usually in native format (usually active-low). Input formats for + specific controller types are described in (Section 4). + + *PLEN* + Length of the packet payload. + + 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. If there are more than 1 INPUT_CHUNK packets, + the INPUT_CHUNK packets MUST be in order of the TAS movie console + replay inputs, 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. + +3.3.5.2. INPUT_MOMENT Packet + + INPUT_MOMENT packets MUST be in the following format: + + 0 1 2 3 4 5 7 8 9 10 + +----------+----------------+--+--+--+--+--+--+--+--+ + | Port (N) | Index Type (A) | Index (N) | ... + +----------+----------------+--+--+--+--+--+--+--+--+ + 11... + +============+ + | Inputs (B) | + +============+ + + Port (Unsigned Integer) [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 - 10 octets] + + + *Port* + Controller port number (*Port* number MUST be *1-indexed*). + + *Type* + Determines specific timing type for start of *Inputs*. + + *Index* + Time value to start sending *Inputs* data. + + *Inputs* + Controller input data for controller on *Port*. Input values are + usually in native format (usually active-low). Input formats for + specific controller types are described in (Section 4). + + *PLEN* + Length of the packet payload. + +3.3.5.3. TRANSITION Packet + + TRANSITION packets MUST be in the following format: + + 0 1 2 3 4 5 6 7 8 9 + +----------------+--+--+--+--+--+--+--+--+----------+ + | Index Type (A) | Index (N) | Type (A) | ... + +----------------+--+--+--+--+--+--+--+--+----------+ + 10... + +============+ + | Packet (A) | + +============+ + + Index Type (Binary Data): [1 octet] + [01] - Frame + [02] - Cycle Count + [03] - Milliseconds + [04] - Microseconds * 10 + [05] - INPUT_CHUNK 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 - 10 octets] + + *Input Type* + Determines specific timing type for start of transition. + + *Index* + Time or offset value to start transition. + + *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). + +3.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*. + +3.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). + +3.3.6. Extraneous Key Payload Formats + +3.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. + +3.3.6.2. EXPERIMENTAL Packet + + EXPERIMENTAL packets MUST be in the following format: + + 0... + +==================+ + | Experimental (B) | + +==================+ + + Experimental (Boolean) [PLEN octet] + + *Experimental* + Boolean data that is *TRUE* if the TASD file is using experimental + features (Currently SHOULD be TRUE). + + *PLEN* + Length of the packet payload. + +3.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 there is no guarantee any software to + control a TAS replay device will support data in this packet type. + + *PLEN* + Length of the packet payload. + +4. 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. + +4.1. NES/Famicom Controller Types + +4.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 + +4.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*. + +4.2. SNES Controller Types + +4.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 + +4.2.2. 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) + +4.3. N64 Controller Types + +4.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) + +4.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) + +4.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) + +4.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) + +4.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) + +4.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 + +4.4. GameCube Controller Types + +4.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) + +4.5. Game Boy Controller Types + +4.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 + +4.6. Game Boy Color Controller Types + +4.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 + +4.7. Game Boy Advance Controller Types + +4.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 + +4.8. Genesis Controller Types + +4.8.1. Genesis (Mega Drive) 3-Button + + Single Input Length: 1 Octet + + *Octet 0* + + Bit 7: /A + Bit 6: /Start + Bit 5: /Up + Bit 4: /Down + Bit 3: /Left + Bit 2: /Right + Bit 1: /B + Bit 0: /C + +4.8.2. Genesis (Mega Drive) 6-Button + + Single Input Length: 2 Octets + + *Octet 0* + + Bit 7: /A + Bit 6: /Start + Bit 5: /Up + Bit 4: /Down + Bit 3: /Left + Bit 2: /Right + Bit 1: /B + Bit 0: /C + + *Octet 1* + + Bit 7: /Z + Bit 6: /Y + Bit 5: /X + Bit 4: /Mode + Bit 3: 1 + Bit 2: 1 + Bit 1: 1 + Bit 0: 1 + +4.9. Atari 2600 Controller Types + +4.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 + +4.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 + +5. References + +5.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-2022, Vi Grey and Bigbass + + 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 + VG Interactive + Email: vi@vigrey.com + URI: https://vigrey.com + + + Bigbass + URI: https://github.com/bigbass1997 |
