diff options
| author | Vi Grey <vi@vigrey.com> | 2022-09-26 04:02:25 -0500 |
|---|---|---|
| committer | Vi Grey <vi@vigrey.com> | 2022-09-26 04:02:25 -0500 |
| commit | ede5eec5144048e420a265ac5baecc4ea29ff27c (patch) | |
| tree | 0f80240756ade1be989a51bf1fc8d4b6a2060cd5 /docs/draft-tasd-0001.txt | |
| parent | b984d238f3b2d65553e45a7d430ee9e23b8b2e90 (diff) | |
| download | tasd-ede5eec5144048e420a265ac5baecc4ea29ff27c.tar.gz tasd-ede5eec5144048e420a265ac5baecc4ea29ff27c.zip | |
Change RFC file locations and add CONTRIBUTING.md
Add `latest/` and `tasd-spec-{version}/` directories to `docs/`
Add "contribution" rule in `Makefile` to automate the process of adding updated documents to the `docs/` directory
Add "Keep a Changelog" link and sentence to this `CHANGELOG.md` file
Add Initial `CONTRIBUTING.md` file
Rename `draft-tasd-{version}` to `draft-tasd-spec-{version}`
Clean up documents rule in `Makefile` to avoid using `cd` and `mv`
Diffstat (limited to 'docs/draft-tasd-0001.txt')
| -rw-r--r-- | docs/draft-tasd-0001.txt | 2158 |
1 files changed, 0 insertions, 2158 deletions
diff --git a/docs/draft-tasd-0001.txt b/docs/draft-tasd-0001.txt deleted file mode 100644 index 613263c..0000000 --- a/docs/draft-tasd-0001.txt +++ /dev/null @@ -1,2158 +0,0 @@ - - - - -Independent TAS Console Replay Research Group V. Grey - VG Interactive - Bigbass - 24 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 |
