diff options
| -rw-r--r-- | CHANGELOG.md | 22 | ||||
| -rw-r--r-- | docs/latest/draft-tasd-spec.html | 216 | ||||
| -rw-r--r-- | docs/latest/draft-tasd-spec.txt | 150 | ||||
| -rw-r--r-- | docs/tasd-spec-0001/draft-tasd-spec-0001.html | 216 | ||||
| -rw-r--r-- | docs/tasd-spec-0001/draft-tasd-spec-0001.txt | 150 | ||||
| -rw-r--r-- | src/docs/draft-tasd-spec-0001.xml | 114 | ||||
| -rw-r--r-- | tools/lua/tasd-fceux-dumpscript.lua | 22 |
7 files changed, 476 insertions, 414 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fdcaea..d654b09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), although currently without version numbers added. +## 2023-09-24 + +### Changed +- Specify INPUT_CHUNK offset for Index Value of TRANSITION packet + +### Fixed +- EXPERIMENTAL packet drawing error and packet value length + +### Added +- SNES_LATCH_FILTER +- Port value to TRANSITION packet + +### Removed +- SNES_OVERREAD and NES_OVERREAD + + ## 2023-09-18 ### Changed - Specify that PEXP MUST be greater than 0 @@ -50,15 +66,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## 2023-07-03 ### Added -- SNES\_LATCH\_TRAIN to spec +- SNES_LATCH_TRAIN to spec ### Removed - PDF files from `docs/` - PDF file generation via Makefile ### Fixed -- Correct length for Data of MEMORY\_INIT in spec -- Correct length of Name of MOVIE\_FILE packet in spec +- Correct length for Data of MEMORY_INIT in spec +- Correct length of Name of MOVIE_FILE packet in spec ## 2022-09-26 diff --git a/docs/latest/draft-tasd-spec.html b/docs/latest/draft-tasd-spec.html index 5a35421..7fec116 100644 --- a/docs/latest/draft-tasd-spec.html +++ b/docs/latest/draft-tasd-spec.html @@ -1207,7 +1207,7 @@ li > p:last-of-type:only-child { <dd class="workgroup">Independent TAS Console Replay Research Group</dd> <dt class="label-published">Published:</dt> <dd class="published"> -<time datetime="2023-09-18" class="published">18 September 2023</time> +<time datetime="2023-09-24" class="published">24 September 2023</time> </dd> <dt class="label-authors">Authors:</dt> <dd class="authors"> @@ -1383,6 +1383,9 @@ li > p:last-of-type:only-child { <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.1.2.22"> <p id="section-toc.1-1.4.2.3.2.1.2.22.1"><a href="#section-4.3.1.22" class="auto internal xref">4.3.1.22</a>. <a href="#name-port_controller-packet" class="internal xref">PORT_CONTROLLER Packet</a></p> </li> + <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.1.2.23"> + <p id="section-toc.1-1.4.2.3.2.1.2.23.1"><a href="#section-4.3.1.23" class="auto internal xref">4.3.1.23</a>. <a href="#name-port_overread-packet" class="internal xref">PORT_OVERREAD Packet</a></p> +</li> </ul> </li> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.2"> @@ -1395,10 +1398,7 @@ li > p:last-of-type:only-child { <p id="section-toc.1-1.4.2.3.2.2.2.2.1"><a href="#section-4.3.2.2" class="auto internal xref">4.3.2.2</a>. <a href="#name-nes_clock_filter-packet" class="internal xref">NES_CLOCK_FILTER Packet</a></p> </li> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.2.2.3"> - <p id="section-toc.1-1.4.2.3.2.2.2.3.1"><a href="#section-4.3.2.3" class="auto internal xref">4.3.2.3</a>. <a href="#name-nes_overread-packet" class="internal xref">NES_OVERREAD Packet</a></p> -</li> - <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.2.2.4"> - <p id="section-toc.1-1.4.2.3.2.2.2.4.1"><a href="#section-4.3.2.4" class="auto internal xref">4.3.2.4</a>. <a href="#name-nes_game_genie_code-packet" class="internal xref">NES_GAME_GENIE_CODE Packet</a></p> + <p id="section-toc.1-1.4.2.3.2.2.2.3.1"><a href="#section-4.3.2.3" class="auto internal xref">4.3.2.3</a>. <a href="#name-nes_game_genie_code-packet" class="internal xref">NES_GAME_GENIE_CODE Packet</a></p> </li> </ul> </li> @@ -1406,10 +1406,10 @@ li > p:last-of-type:only-child { <p id="section-toc.1-1.4.2.3.2.3.1"><a href="#section-4.3.3" class="auto internal xref">4.3.3</a>. <a href="#name-snes-specific-key-payload-f" class="internal xref">SNES Specific Key Payload Formats</a></p> <ul class="compact toc ulBare ulEmpty"> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.3.2.1"> - <p id="section-toc.1-1.4.2.3.2.3.2.1.1"><a href="#section-4.3.3.1" class="auto internal xref">4.3.3.1</a>. <a href="#name-snes_clock_filter-packet" class="internal xref">SNES_CLOCK_FILTER Packet</a></p> + <p id="section-toc.1-1.4.2.3.2.3.2.1.1"><a href="#section-4.3.3.1" class="auto internal xref">4.3.3.1</a>. <a href="#name-snes_latch_filter-packet" class="internal xref">SNES_LATCH_FILTER Packet</a></p> </li> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.3.2.2"> - <p id="section-toc.1-1.4.2.3.2.3.2.2.1"><a href="#section-4.3.3.2" class="auto internal xref">4.3.3.2</a>. <a href="#name-snes_overread-packet" class="internal xref">SNES_OVERREAD Packet</a></p> + <p id="section-toc.1-1.4.2.3.2.3.2.2.1"><a href="#section-4.3.3.2" class="auto internal xref">4.3.3.2</a>. <a href="#name-snes_clock_filter-packet" class="internal xref">SNES_CLOCK_FILTER Packet</a></p> </li> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.3.2.3"> <p id="section-toc.1-1.4.2.3.2.3.2.3.1"><a href="#section-4.3.3.3" class="auto internal xref">4.3.3.3</a>. <a href="#name-snes_game_genie_code-packet" class="internal xref">SNES_GAME_GENIE_CODE Packet</a></p> @@ -1952,6 +1952,10 @@ li > p:last-of-type:only-child { <dt id="section-4.1.1-1.43"><code>[00 F0]</code></dt> <dd style="margin-left: 1.5em" id="section-4.1.1-1.44">PORT_CONTROLLER<a href="#section-4.1.1-1.44" class="pilcrow">¶</a> </dd> + <dd class="break"></dd> +<dt id="section-4.1.1-1.45"><code>[00 F1]</code></dt> + <dd style="margin-left: 1.5em" id="section-4.1.1-1.46">PORT_OVERREAD<a href="#section-4.1.1-1.46" class="pilcrow">¶</a> +</dd> <dd class="break"></dd> </dl> </section> @@ -1968,12 +1972,8 @@ li > p:last-of-type:only-child { <dd style="margin-left: 1.5em" id="section-4.1.2-1.4">NES_CLOCK_FILTER<a href="#section-4.1.2-1.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.1.2-1.5"><code>[01 03]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.2-1.6">NES_OVERREAD<a href="#section-4.1.2-1.6" class="pilcrow">¶</a> -</dd> - <dd class="break"></dd> -<dt id="section-4.1.2-1.7"><code>[01 04]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.2-1.8">NES_GAME_GENIE_CODE<a href="#section-4.1.2-1.8" class="pilcrow">¶</a> +<dt id="section-4.1.2-1.5"><code>[01 04]</code></dt> + <dd style="margin-left: 1.5em" id="section-4.1.2-1.6">NES_GAME_GENIE_CODE<a href="#section-4.1.2-1.6" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -1987,16 +1987,12 @@ li > p:last-of-type:only-child { <dd style="margin-left: 1.5em" id="section-4.1.3-1.2">SNES_CLOCK_FILTER<a href="#section-4.1.3-1.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.1.3-1.3"><code>[02 03]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.3-1.4">SNES_OVERREAD<a href="#section-4.1.3-1.4" class="pilcrow">¶</a> -</dd> - <dd class="break"></dd> -<dt id="section-4.1.3-1.5"><code>[02 04]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.3-1.6">SNES_GAME_GENIE_CODE<a href="#section-4.1.3-1.6" class="pilcrow">¶</a> +<dt id="section-4.1.3-1.3"><code>[02 04]</code></dt> + <dd style="margin-left: 1.5em" id="section-4.1.3-1.4">SNES_GAME_GENIE_CODE<a href="#section-4.1.3-1.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.1.3-1.7"><code>[02 05]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.3-1.8">SNES_LATCH_TRAIN<a href="#section-4.1.3-1.8" class="pilcrow">¶</a> +<dt id="section-4.1.3-1.5"><code>[02 05]</code></dt> + <dd style="margin-left: 1.5em" id="section-4.1.3-1.6">SNES_LATCH_TRAIN<a href="#section-4.1.3-1.6" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -2178,6 +2174,11 @@ li > p:last-of-type:only-child { <code>[00 F0]</code> - PORT_CONTROLLER</dt> <dd style="margin-left: 1.5em" id="section-4.2.1-1.44">Specifies the controller type in specific console controller ports for the TAS when played on hardware. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#port_controller" class="auto internal xref">Section 4.3.1.22</a>).<a href="#section-4.2.1-1.44" class="pilcrow">¶</a> </dd> + <dd class="break"></dd> +<dt id="section-4.2.1-1.45"> +<code>[00 F1]</code> - PORT_OVERREAD</dt> + <dd style="margin-left: 1.5em" id="section-4.2.1-1.46">Specifies whether a high or low signal <span class="bcp14">SHOULD</span> be sent through a specified controller port of the console if the console requests more input data from the replay device through that controller port than expected. This packet type is <span class="bcp14">OPTIONAL</span>. Discussed in (<a href="#port_overread" class="auto internal xref">Section 4.3.1.23</a>).<a href="#section-4.2.1-1.46" class="pilcrow">¶</a> +</dd> <dd class="break"></dd> </dl> </section> @@ -2197,13 +2198,8 @@ li > p:last-of-type:only-child { </dd> <dd class="break"></dd> <dt id="section-4.2.2-1.5"> -<code>[01 03]</code> - NES_OVERREAD</dt> - <dd style="margin-left: 1.5em" id="section-4.2.2-1.6">Specifies whether a high or low signal <span class="bcp14">SHOULD</span> 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 <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#nes_overread" class="auto internal xref">Section 4.3.2.3</a>).<a href="#section-4.2.2-1.6" class="pilcrow">¶</a> -</dd> - <dd class="break"></dd> -<dt id="section-4.2.2-1.7"> <code>[01 04]</code> - NES_GAME_GENIE_CODE</dt> - <dd style="margin-left: 1.5em" id="section-4.2.2-1.8">Specifies a Game Genie code for the TAS. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">MAY</span> contain more than 1 of this packet type. Discussed in (<a href="#nes_game_genie_code" class="auto internal xref">Section 4.3.2.4</a>).<a href="#section-4.2.2-1.8" class="pilcrow">¶</a> + <dd style="margin-left: 1.5em" id="section-4.2.2-1.6">Specifies a Game Genie code for the TAS. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">MAY</span> contain more than 1 of this packet type. Discussed in (<a href="#nes_game_genie_code" class="auto internal xref">Section 4.3.2.3</a>).<a href="#section-4.2.2-1.6" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -2214,13 +2210,13 @@ li > p:last-of-type:only-child { </h4> <span class="break"></span><dl class="dlNewline" id="section-4.2.3-1"> <dt id="section-4.2.3-1.1"> -<code>[02 02]</code> - SNES_CLOCK_FILTER</dt> - <dd style="margin-left: 1.5em" id="section-4.2.3-1.2">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 <span class="bcp14">SHOULD</span> be accepted by the replay device. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#snes_clock_filter" class="auto internal xref">Section 4.3.3.1</a>).<a href="#section-4.2.3-1.2" class="pilcrow">¶</a> +<code>[01 01]</code> - SNES_LATCH_FILTER</dt> + <dd style="margin-left: 1.5em" id="section-4.2.3-1.2">Specifies a latch filter time in microseconds for how long how long to wait after a latch signal until new latch signals <span class="bcp14">SHOULD</span> be accepted by the replay device. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#snes_latch_filter" class="auto internal xref">Section 4.3.3.1</a>).<a href="#section-4.2.3-1.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> <dt id="section-4.2.3-1.3"> -<code>[02 03]</code> - SNES_OVERREAD</dt> - <dd style="margin-left: 1.5em" id="section-4.2.3-1.4">Specifies whether a high or low signal <span class="bcp14">SHOULD</span> 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 <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#snes_overread" class="auto internal xref">Section 4.3.3.2</a>).<a href="#section-4.2.3-1.4" class="pilcrow">¶</a> +<code>[02 02]</code> - SNES_CLOCK_FILTER</dt> + <dd style="margin-left: 1.5em" id="section-4.2.3-1.4">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 <span class="bcp14">SHOULD</span> be accepted by the replay device. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#snes_clock_filter" class="auto internal xref">Section 4.3.3.2</a>).<a href="#section-4.2.3-1.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> <dt id="section-4.2.3-1.5"> @@ -2875,7 +2871,7 @@ li > p:last-of-type:only-child { | Type (A) | Base (A) | Identifier (A) | +----------+----------+================+ - Type (Binary Data): [1 octet] + Type (Binary Data): [1 octet] [01] - CRC-8 Checksum [02] - CRC-16 Checksum [03] - CRC-32 Checksum @@ -3047,6 +3043,35 @@ li > p:last-of-type:only-child { </dl> </section> </div> +<div id="port_overread"> +<section id="section-4.3.1.23"> + <h5 id="name-port_overread-packet"> +<a href="#section-4.3.1.23" class="section-number selfRef">4.3.1.23. </a><a href="#name-port_overread-packet" class="section-name selfRef">PORT_OVERREAD Packet</a> + </h5> +<p id="section-4.3.1.23-1">PORT_OVERREAD packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.1.23-1" class="pilcrow">¶</a></p> +<div class="alignLeft art-text artwork" id="section-4.3.1.23-2"> +<pre> + 0 1 + +----------+----------+ + | Port (N) | High (B) | + +----------+----------+ + + Port (N) [1 octet] + High (Boolean) [1 octet] +</pre><a href="#section-4.3.1.23-2" class="pilcrow">¶</a> +</div> +<span class="break"></span><dl class="dlNewline" id="section-4.3.1.23-3"> + <dt id="section-4.3.1.23-3.1"><strong>Port</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.1.23-3.2">Controller port number (<strong>Port</strong> number <span class="bcp14">MUST</span> be <strong>1-indexed</strong>).<a href="#section-4.3.1.23-3.2" class="pilcrow">¶</a> +</dd> + <dd class="break"></dd> +<dt id="section-4.3.1.23-3.3"><strong>High</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.1.23-3.4">Boolean value that is <strong>TRUE</strong> if overread bits are set to high and <strong>FALSE</strong> if overread bits are set to low.<a href="#section-4.3.1.23-3.4" class="pilcrow">¶</a> +</dd> + <dd class="break"></dd> +</dl> +</section> +</div> </section> <section id="section-4.3.2"> <h4 id="name-nes-specific-key-payload-fo"> @@ -3100,37 +3125,13 @@ li > p:last-of-type:only-child { </dl> </section> </div> -<div id="nes_overread"> -<section id="section-4.3.2.3"> - <h5 id="name-nes_overread-packet"> -<a href="#section-4.3.2.3" class="section-number selfRef">4.3.2.3. </a><a href="#name-nes_overread-packet" class="section-name selfRef">NES_OVERREAD Packet</a> - </h5> -<p id="section-4.3.2.3-1">NES_OVERREAD packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.2.3-1" class="pilcrow">¶</a></p> -<div class="alignLeft art-text artwork" id="section-4.3.2.3-2"> -<pre> - 0 - +----------+ - | High (B) | - +----------+ - - High (Boolean) [1 octet] -</pre><a href="#section-4.3.2.3-2" class="pilcrow">¶</a> -</div> -<span class="break"></span><dl class="dlNewline" id="section-4.3.2.3-3"> - <dt id="section-4.3.2.3-3.1"><strong>High</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.2.3-3.2">Boolean value that is <strong>TRUE</strong> if overread bits are set to high and <strong>FALSE</strong> if overread bits are set to low.<a href="#section-4.3.2.3-3.2" class="pilcrow">¶</a> -</dd> - <dd class="break"></dd> -</dl> -</section> -</div> <div id="nes_game_genie_code"> -<section id="section-4.3.2.4"> +<section id="section-4.3.2.3"> <h5 id="name-nes_game_genie_code-packet"> -<a href="#section-4.3.2.4" class="section-number selfRef">4.3.2.4. </a><a href="#name-nes_game_genie_code-packet" class="section-name selfRef">NES_GAME_GENIE_CODE Packet</a> +<a href="#section-4.3.2.3" class="section-number selfRef">4.3.2.3. </a><a href="#name-nes_game_genie_code-packet" class="section-name selfRef">NES_GAME_GENIE_CODE Packet</a> </h5> -<p id="section-4.3.2.4-1">NES_GAME_GENIE_CODE packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.2.4-1" class="pilcrow">¶</a></p> -<div class="alignLeft art-text artwork" id="section-4.3.2.4-2"> +<p id="section-4.3.2.3-1">NES_GAME_GENIE_CODE packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.2.3-1" class="pilcrow">¶</a></p> +<div class="alignLeft art-text artwork" id="section-4.3.2.3-2"> <pre> 0... +==========+ @@ -3138,15 +3139,15 @@ li > p:last-of-type:only-child { +==========+ Code (String) [PLEN octets] -</pre><a href="#section-4.3.2.4-2" class="pilcrow">¶</a> +</pre><a href="#section-4.3.2.3-2" class="pilcrow">¶</a> </div> -<span class="break"></span><dl class="dlNewline" id="section-4.3.2.4-3"> - <dt id="section-4.3.2.4-3.1"><strong>Code</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.2.4-3.2">Game Genie code (example: "AATOZA").<a href="#section-4.3.2.4-3.2" class="pilcrow">¶</a> +<span class="break"></span><dl class="dlNewline" id="section-4.3.2.3-3"> + <dt id="section-4.3.2.3-3.1"><strong>Code</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.2.3-3.2">Game Genie code (example: "AATOZA").<a href="#section-4.3.2.3-3.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.2.4-3.3"><strong>PLEN</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.2.4-3.4">Length of the packet payload.<a href="#section-4.3.2.4-3.4" class="pilcrow">¶</a> +<dt id="section-4.3.2.3-3.3"><strong>PLEN</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.2.3-3.4">Length of the packet payload.<a href="#section-4.3.2.3-3.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -3157,49 +3158,49 @@ li > p:last-of-type:only-child { <h4 id="name-snes-specific-key-payload-f"> <a href="#section-4.3.3" class="section-number selfRef">4.3.3. </a><a href="#name-snes-specific-key-payload-f" class="section-name selfRef">SNES Specific Key Payload Formats</a> </h4> -<div id="snes_clock_filter"> +<div id="snes_latch_filter"> <section id="section-4.3.3.1"> - <h5 id="name-snes_clock_filter-packet"> -<a href="#section-4.3.3.1" class="section-number selfRef">4.3.3.1. </a><a href="#name-snes_clock_filter-packet" class="section-name selfRef">SNES_CLOCK_FILTER Packet</a> + <h5 id="name-snes_latch_filter-packet"> +<a href="#section-4.3.3.1" class="section-number selfRef">4.3.3.1. </a><a href="#name-snes_latch_filter-packet" class="section-name selfRef">SNES_LATCH_FILTER Packet</a> </h5> -<p id="section-4.3.3.1-1">SNES_CLOCK_FILTER packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.3.1-1" class="pilcrow">¶</a></p> +<p id="section-4.3.3.1-1">SNES_LATCH_FILTER packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.3.1-1" class="pilcrow">¶</a></p> <div class="alignLeft art-text artwork" id="section-4.3.3.1-2"> <pre> - 0 - +----------+ - | Time (N) | - +----------+ + 0 1 + +-----+-----+ + | Time (N) | + +-----+-----+ - Time (Unsigned Integer) [1 octet] + Time (Unsigned Integer) [2 octets] </pre><a href="#section-4.3.3.1-2" class="pilcrow">¶</a> </div> <span class="break"></span><dl class="dlNewline" id="section-4.3.3.1-3"> <dt id="section-4.3.3.1-3.1"><strong>Time</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.3.1-3.2">Clock filter length of time in tenths of a microsecond (units of 0.1 microseconds or 100 nanoseconds).<a href="#section-4.3.3.1-3.2" class="pilcrow">¶</a> + <dd style="margin-left: 1.5em" id="section-4.3.3.1-3.2">Latch filter length of time in microseconds.<a href="#section-4.3.3.1-3.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> </section> </div> -<div id="snes_overread"> +<div id="snes_clock_filter"> <section id="section-4.3.3.2"> - <h5 id="name-snes_overread-packet"> -<a href="#section-4.3.3.2" class="section-number selfRef">4.3.3.2. </a><a href="#name-snes_overread-packet" class="section-name selfRef">SNES_OVERREAD Packet</a> + <h5 id="name-snes_clock_filter-packet"> +<a href="#section-4.3.3.2" class="section-number selfRef">4.3.3.2. </a><a href="#name-snes_clock_filter-packet" class="section-name selfRef">SNES_CLOCK_FILTER Packet</a> </h5> -<p id="section-4.3.3.2-1">SNES_OVERREAD packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.3.2-1" class="pilcrow">¶</a></p> +<p id="section-4.3.3.2-1">SNES_CLOCK_FILTER packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.3.2-1" class="pilcrow">¶</a></p> <div class="alignLeft art-text artwork" id="section-4.3.3.2-2"> <pre> 0 +----------+ - | High (B) | + | Time (N) | +----------+ - High (Boolean) [1 octet] + Time (Unsigned Integer) [1 octet] </pre><a href="#section-4.3.3.2-2" class="pilcrow">¶</a> </div> <span class="break"></span><dl class="dlNewline" id="section-4.3.3.2-3"> - <dt id="section-4.3.3.2-3.1"><strong>High</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.3.2-3.2">Boolean value that is <strong>TRUE</strong> if overread bits are set to high and <strong>FALSE</strong> if overread bits are set to low.<a href="#section-4.3.3.2-3.2" class="pilcrow">¶</a> + <dt id="section-4.3.3.2-3.1"><strong>Time</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.3.2-3.2">Clock filter length of time in tenths of a microsecond (units of 0.1 microseconds or 100 nanoseconds).<a href="#section-4.3.3.2-3.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -3394,14 +3395,14 @@ li > p:last-of-type:only-child { <p id="section-4.3.5.3-1">TRANSITION packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.5.3-1" class="pilcrow">¶</a></p> <div class="alignLeft art-text artwork" id="section-4.3.5.3-2"> <pre> - 0 1 2 3 4 5 6 7 8 9 - +----------------+--+--+--+--+--+--+--+--+----------+ - | Index Type (A) | Index (N) | Type (A) | ... - +----------------+--+--+--+--+--+--+--+--+----------+ - 10... - +============+ - | Packet (A) | - +============+ + 0 1 2 3 4 5 6 7 8 9 + +----------------+----------+--+--+--+--+--+--+--+--+ + | Index Type (A) | Port (N) | Index (N) | ... + +----------------+----------+--+--+--+--+--+--+--+--+ + 10 11... + +----------+============+ + | Type (A) | Packet (A) | + +----------+============+ Index Type (Binary Data): [1 octet] [01] - Frame @@ -3409,13 +3410,14 @@ li > p:last-of-type:only-child { [03] - Milliseconds [04] - Microseconds * 10 [05] - INPUT_CHUNK Index + Port (Unsigned Integer) [1 octet] Index (Unsigned Integer) [8 octets] Type (Binary Data): [1 octet] [01] - Soft Reset [02] - Power Reset [03] - Restart TASD File [FF] - Packet Derived - Inner Packet (Binary Data) [PLEN - 10 octets] + Inner Packet (Binary Data) [PLEN - 11 octets] </pre><a href="#section-4.3.5.3-2" class="pilcrow">¶</a> </div> <span class="break"></span><dl class="dlNewline" id="section-4.3.5.3-3"> @@ -3423,20 +3425,24 @@ li > p:last-of-type:only-child { <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.2">Determines specific timing type for start of transition.<a href="#section-4.3.5.3-3.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.5.3-3.3"><strong>Index</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.4">Time or offset value to start transition.<a href="#section-4.3.5.3-3.4" class="pilcrow">¶</a> +<dt id="section-4.3.5.3-3.3"><strong>Port</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.4">Controller port number of input index. If <strong>Index Type</strong> is <code>[05]</code>, <strong>Port</strong> <span class="bcp14">MUST</span> be <strong>1-indexed</strong> Port number, otherwise <strong>Port</strong> <span class="bcp14">MAY</span> be any value.<a href="#section-4.3.5.3-3.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.5.3-3.5"><strong>Type</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.6">Type of transition. If <strong>Type</strong> is <code>[FF]</code>, the transition action will be interpreting a <strong>TASD</strong> packet.<a href="#section-4.3.5.3-3.6" class="pilcrow">¶</a> +<dt id="section-4.3.5.3-3.5"><strong>Index</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.6">Time or offset value to start transition. If <strong>Index Type</strong> is <code>[05]</code>, <strong>Index</strong> <span class="bcp14">MUST</span> be the byte offset of <strong>INPUT_CHUNK</strong> data from <strong>INPUT_CHUNK</strong> packets for the controller port specified by <strong>Port</strong>.<a href="#section-4.3.5.3-3.6" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.5.3-3.7"><strong>Inner Packet</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.8">If <strong>Type</strong> is <code>[FF]</code>, <strong>Inner Packet</strong> <span class="bcp14">SHOULD</span> be a <strong>TASD</strong> packet. <strong>Inner Packet</strong> <span class="bcp14">MUST NOT</span> be a <strong>INPUT_CHUNK</strong>, <strong>INPUT_MOMENT</strong>, <strong>TRANSITION</strong>, <strong>LAG_FRAME_CHUNK</strong>, or <strong>MOVIE_TRANSITION</strong> packet.<a href="#section-4.3.5.3-3.8" class="pilcrow">¶</a> +<dt id="section-4.3.5.3-3.7"><strong>Type</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.8">Type of transition. If <strong>Type</strong> is <code>[FF]</code>, the transition action will be interpreting a <strong>TASD</strong> packet.<a href="#section-4.3.5.3-3.8" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.5.3-3.9"><strong>PLEN</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.10">Length of the packet payload (Not <strong>Inner Packet</strong> length).<a href="#section-4.3.5.3-3.10" class="pilcrow">¶</a> +<dt id="section-4.3.5.3-3.9"><strong>Inner Packet</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.10">If <strong>Type</strong> is <code>[FF]</code>, <strong>Inner Packet</strong> <span class="bcp14">SHOULD</span> be a <strong>TASD</strong> packet. <strong>Inner Packet</strong> <span class="bcp14">MUST NOT</span> be a <strong>INPUT_CHUNK</strong>, <strong>INPUT_MOMENT</strong>, <strong>TRANSITION</strong>, <strong>LAG_FRAME_CHUNK</strong>, or <strong>MOVIE_TRANSITION</strong> packet.<a href="#section-4.3.5.3-3.10" class="pilcrow">¶</a> +</dd> + <dd class="break"></dd> +<dt id="section-4.3.5.3-3.11"><strong>PLEN</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.12">Length of the packet payload (Not <strong>Inner Packet</strong> length).<a href="#section-4.3.5.3-3.12" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -3554,12 +3560,12 @@ li > p:last-of-type:only-child { <p id="section-4.3.6.2-1">EXPERIMENTAL packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.6.2-1" class="pilcrow">¶</a></p> <div class="alignLeft art-text artwork" id="section-4.3.6.2-2"> <pre> - 0... - +==================+ + 0 + +------------------+ | Experimental (B) | - +==================+ + +------------------+ - Experimental (Boolean) [PLEN octet] + Experimental (Boolean) [1 octet] </pre><a href="#section-4.3.6.2-2" class="pilcrow">¶</a> </div> <span class="break"></span><dl class="dlNewline" id="section-4.3.6.2-3"> diff --git a/docs/latest/draft-tasd-spec.txt b/docs/latest/draft-tasd-spec.txt index f751bd2..f309c4b 100644 --- a/docs/latest/draft-tasd-spec.txt +++ b/docs/latest/draft-tasd-spec.txt @@ -7,7 +7,7 @@ Independent TAS Console Replay Research Group V. Grey Bigbass rasteri - 18 September 2023 + 24 September 2023 TASD File Format Specification Version 1 @@ -74,14 +74,14 @@ Table of Contents 4.3.1.20. MOVIE_LICENSE Packet 4.3.1.21. MOVIE_FILE Packet 4.3.1.22. PORT_CONTROLLER Packet + 4.3.1.23. PORT_OVERREAD Packet 4.3.2. NES Specific Key Payload Formats 4.3.2.1. NES_LATCH_FILTER Packet 4.3.2.2. NES_CLOCK_FILTER Packet - 4.3.2.3. NES_OVERREAD Packet - 4.3.2.4. NES_GAME_GENIE_CODE Packet + 4.3.2.3. NES_GAME_GENIE_CODE Packet 4.3.3. SNES Specific Key Payload Formats - 4.3.3.1. SNES_CLOCK_FILTER Packet - 4.3.3.2. SNES_OVERREAD Packet + 4.3.3.1. SNES_LATCH_FILTER Packet + 4.3.3.2. SNES_CLOCK_FILTER Packet 4.3.3.3. SNES_GAME_GENIE_CODE Packet 4.3.3.4. SNES_LATCH_TRAIN Packet 4.3.4. Genesis Specific Key Payload Formats @@ -406,18 +406,17 @@ Table of Contents [00 14] MOVIE_LICENSE [00 15] MOVIE_FILE [00 F0] PORT_CONTROLLER + [00 F1] PORT_OVERREAD 4.1.2. NES Specific Keys [01 01] NES_LATCH_FILTER [01 02] NES_CLOCK_FILTER - [01 03] NES_OVERREAD [01 04] NES_GAME_GENIE_CODE 4.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 @@ -570,6 +569,13 @@ Table of Contents and a *TASD* file SHOULD NOT contain more than 1 of this packet type in direct form. Discussed in (Section 4.3.1.22). + [00 F1] - PORT_OVERREAD + Specifies whether a high or low signal SHOULD be sent through a + specified controller port of the console if the console requests + more input data from the replay device through that controller + port than expected. This packet type is OPTIONAL. Discussed in + (Section 4.3.1.23). + 4.2.2. NES Specific Key Descriptions [01 01] - NES_LATCH_FILTER @@ -587,34 +593,27 @@ Table of Contents SHOULD NOT contain more than 1 of this packet type in direct form. Discussed in (Section 4.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 4.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 4.3.2.4). + type. Discussed in (Section 4.3.2.3). 4.2.3. SNES Specific Key Descriptions + [01 01] - SNES_LATCH_FILTER + Specifies a latch filter time in microseconds for how long how + long to wait after a latch signal until new latch signals SHOULD + be accepted by the replay device. This packet type is OPTIONAL + and a *TASD* file SHOULD NOT contain more than 1 of this packet + type in direct form. Discussed in (Section 4.3.3.1). + [02 02] - SNES_CLOCK_FILTER Specifies a clock filter time in tenths of a microsecond (0.1 microseconds or 100 nanoseconds) for how long to wait after a clock pulse until new clock pulses SHOULD be accepted by the replay device. This packet type is OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 of this packet type in direct form. - Discussed in (Section 4.3.3.1). - - [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 4.3.3.2). + Discussed in (Section 4.3.3.2). [02 04] - SNES_GAME_GENIE_CODE Specifies a Game Genie code for the TAS. This packet type is @@ -1084,7 +1083,7 @@ Table of Contents | Type (A) | Base (A) | Identifier (A) | +----------+----------+================+ - Type (Binary Data): [1 octet] + Type (Binary Data): [1 octet] [01] - CRC-8 Checksum [02] - CRC-16 Checksum [03] - CRC-32 Checksum @@ -1218,6 +1217,25 @@ Table of Contents version of the *TASD* file format protocol. Input formats for specific controller types are described in (Section 5). +4.3.1.23. PORT_OVERREAD Packet + + PORT_OVERREAD packets MUST be in the following format: + + 0 1 + +----------+----------+ + | Port (N) | High (B) | + +----------+----------+ + + Port (N) [1 octet] + High (Boolean) [1 octet] + + *Port* + Controller port number (*Port* number MUST be *1-indexed*). + + *High* + Boolean value that is *TRUE* if overread bits are set to high and + *FALSE* if overread bits are set to low. + 4.3.2. NES Specific Key Payload Formats 4.3.2.1. NES_LATCH_FILTER Packet @@ -1249,22 +1267,7 @@ Table of Contents Clock filter length of time in tenths of a microsecond (units of 0.1 microseconds or 100 nanoseconds). -4.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. - -4.3.2.4. NES_GAME_GENIE_CODE Packet +4.3.2.3. NES_GAME_GENIE_CODE Packet NES_GAME_GENIE_CODE packets MUST be in the following format: @@ -1283,35 +1286,34 @@ Table of Contents 4.3.3. SNES Specific Key Payload Formats -4.3.3.1. SNES_CLOCK_FILTER Packet +4.3.3.1. SNES_LATCH_FILTER Packet - SNES_CLOCK_FILTER packets MUST be in the following format: + SNES_LATCH_FILTER packets MUST be in the following format: - 0 - +----------+ - | Time (N) | - +----------+ + 0 1 + +-----+-----+ + | Time (N) | + +-----+-----+ - Time (Unsigned Integer) [1 octet] + Time (Unsigned Integer) [2 octets] *Time* - Clock filter length of time in tenths of a microsecond (units of - 0.1 microseconds or 100 nanoseconds). + Latch filter length of time in microseconds. -4.3.3.2. SNES_OVERREAD Packet +4.3.3.2. SNES_CLOCK_FILTER Packet - SNES_OVERREAD packets MUST be in the following format: + SNES_CLOCK_FILTER packets MUST be in the following format: 0 +----------+ - | High (B) | + | Time (N) | +----------+ - High (Boolean) [1 octet] + Time (Unsigned Integer) [1 octet] - *High* - Boolean value that is *TRUE* if overread bits are set to high and - *FALSE* if overread bits are set to low. + *Time* + Clock filter length of time in tenths of a microsecond (units of + 0.1 microseconds or 100 nanoseconds). 4.3.3.3. SNES_GAME_GENIE_CODE Packet @@ -1449,14 +1451,14 @@ Table of Contents 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) | - +============+ + 0 1 2 3 4 5 6 7 8 9 + +----------------+----------+--+--+--+--+--+--+--+--+ + | Index Type (A) | Port (N) | Index (N) | ... + +----------------+----------+--+--+--+--+--+--+--+--+ + 10 11... + +----------+============+ + | Type (A) | Packet (A) | + +----------+============+ Index Type (Binary Data): [1 octet] [01] - Frame @@ -1464,19 +1466,27 @@ Table of Contents [03] - Milliseconds [04] - Microseconds * 10 [05] - INPUT_CHUNK Index + Port (Unsigned Integer) [1 octet] Index (Unsigned Integer) [8 octets] Type (Binary Data): [1 octet] [01] - Soft Reset [02] - Power Reset [03] - Restart TASD File [FF] - Packet Derived - Inner Packet (Binary Data) [PLEN - 10 octets] + Inner Packet (Binary Data) [PLEN - 11 octets] *Input Type* Determines specific timing type for start of transition. + *Port* + Controller port number of input index. If *Index Type* is [05], + *Port* MUST be *1-indexed* Port number, otherwise *Port* MAY be + any value. + *Index* - Time or offset value to start transition. + Time or offset value to start transition. If *Index Type* is + [05], *Index* MUST be the byte offset of *INPUT_CHUNK* data from + *INPUT_CHUNK* packets for the controller port specified by *Port*. *Type* Type of transition. If *Type* is [FF], the transition action will @@ -1564,12 +1574,12 @@ Table of Contents EXPERIMENTAL packets MUST be in the following format: - 0... - +==================+ + 0 + +------------------+ | Experimental (B) | - +==================+ + +------------------+ - Experimental (Boolean) [PLEN octet] + Experimental (Boolean) [1 octet] *Experimental* Boolean data that is *TRUE* if the TASD file is using draft/ diff --git a/docs/tasd-spec-0001/draft-tasd-spec-0001.html b/docs/tasd-spec-0001/draft-tasd-spec-0001.html index 5a35421..7fec116 100644 --- a/docs/tasd-spec-0001/draft-tasd-spec-0001.html +++ b/docs/tasd-spec-0001/draft-tasd-spec-0001.html @@ -1207,7 +1207,7 @@ li > p:last-of-type:only-child { <dd class="workgroup">Independent TAS Console Replay Research Group</dd> <dt class="label-published">Published:</dt> <dd class="published"> -<time datetime="2023-09-18" class="published">18 September 2023</time> +<time datetime="2023-09-24" class="published">24 September 2023</time> </dd> <dt class="label-authors">Authors:</dt> <dd class="authors"> @@ -1383,6 +1383,9 @@ li > p:last-of-type:only-child { <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.1.2.22"> <p id="section-toc.1-1.4.2.3.2.1.2.22.1"><a href="#section-4.3.1.22" class="auto internal xref">4.3.1.22</a>. <a href="#name-port_controller-packet" class="internal xref">PORT_CONTROLLER Packet</a></p> </li> + <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.1.2.23"> + <p id="section-toc.1-1.4.2.3.2.1.2.23.1"><a href="#section-4.3.1.23" class="auto internal xref">4.3.1.23</a>. <a href="#name-port_overread-packet" class="internal xref">PORT_OVERREAD Packet</a></p> +</li> </ul> </li> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.2"> @@ -1395,10 +1398,7 @@ li > p:last-of-type:only-child { <p id="section-toc.1-1.4.2.3.2.2.2.2.1"><a href="#section-4.3.2.2" class="auto internal xref">4.3.2.2</a>. <a href="#name-nes_clock_filter-packet" class="internal xref">NES_CLOCK_FILTER Packet</a></p> </li> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.2.2.3"> - <p id="section-toc.1-1.4.2.3.2.2.2.3.1"><a href="#section-4.3.2.3" class="auto internal xref">4.3.2.3</a>. <a href="#name-nes_overread-packet" class="internal xref">NES_OVERREAD Packet</a></p> -</li> - <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.2.2.4"> - <p id="section-toc.1-1.4.2.3.2.2.2.4.1"><a href="#section-4.3.2.4" class="auto internal xref">4.3.2.4</a>. <a href="#name-nes_game_genie_code-packet" class="internal xref">NES_GAME_GENIE_CODE Packet</a></p> + <p id="section-toc.1-1.4.2.3.2.2.2.3.1"><a href="#section-4.3.2.3" class="auto internal xref">4.3.2.3</a>. <a href="#name-nes_game_genie_code-packet" class="internal xref">NES_GAME_GENIE_CODE Packet</a></p> </li> </ul> </li> @@ -1406,10 +1406,10 @@ li > p:last-of-type:only-child { <p id="section-toc.1-1.4.2.3.2.3.1"><a href="#section-4.3.3" class="auto internal xref">4.3.3</a>. <a href="#name-snes-specific-key-payload-f" class="internal xref">SNES Specific Key Payload Formats</a></p> <ul class="compact toc ulBare ulEmpty"> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.3.2.1"> - <p id="section-toc.1-1.4.2.3.2.3.2.1.1"><a href="#section-4.3.3.1" class="auto internal xref">4.3.3.1</a>. <a href="#name-snes_clock_filter-packet" class="internal xref">SNES_CLOCK_FILTER Packet</a></p> + <p id="section-toc.1-1.4.2.3.2.3.2.1.1"><a href="#section-4.3.3.1" class="auto internal xref">4.3.3.1</a>. <a href="#name-snes_latch_filter-packet" class="internal xref">SNES_LATCH_FILTER Packet</a></p> </li> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.3.2.2"> - <p id="section-toc.1-1.4.2.3.2.3.2.2.1"><a href="#section-4.3.3.2" class="auto internal xref">4.3.3.2</a>. <a href="#name-snes_overread-packet" class="internal xref">SNES_OVERREAD Packet</a></p> + <p id="section-toc.1-1.4.2.3.2.3.2.2.1"><a href="#section-4.3.3.2" class="auto internal xref">4.3.3.2</a>. <a href="#name-snes_clock_filter-packet" class="internal xref">SNES_CLOCK_FILTER Packet</a></p> </li> <li class="compact toc ulBare ulEmpty" id="section-toc.1-1.4.2.3.2.3.2.3"> <p id="section-toc.1-1.4.2.3.2.3.2.3.1"><a href="#section-4.3.3.3" class="auto internal xref">4.3.3.3</a>. <a href="#name-snes_game_genie_code-packet" class="internal xref">SNES_GAME_GENIE_CODE Packet</a></p> @@ -1952,6 +1952,10 @@ li > p:last-of-type:only-child { <dt id="section-4.1.1-1.43"><code>[00 F0]</code></dt> <dd style="margin-left: 1.5em" id="section-4.1.1-1.44">PORT_CONTROLLER<a href="#section-4.1.1-1.44" class="pilcrow">¶</a> </dd> + <dd class="break"></dd> +<dt id="section-4.1.1-1.45"><code>[00 F1]</code></dt> + <dd style="margin-left: 1.5em" id="section-4.1.1-1.46">PORT_OVERREAD<a href="#section-4.1.1-1.46" class="pilcrow">¶</a> +</dd> <dd class="break"></dd> </dl> </section> @@ -1968,12 +1972,8 @@ li > p:last-of-type:only-child { <dd style="margin-left: 1.5em" id="section-4.1.2-1.4">NES_CLOCK_FILTER<a href="#section-4.1.2-1.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.1.2-1.5"><code>[01 03]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.2-1.6">NES_OVERREAD<a href="#section-4.1.2-1.6" class="pilcrow">¶</a> -</dd> - <dd class="break"></dd> -<dt id="section-4.1.2-1.7"><code>[01 04]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.2-1.8">NES_GAME_GENIE_CODE<a href="#section-4.1.2-1.8" class="pilcrow">¶</a> +<dt id="section-4.1.2-1.5"><code>[01 04]</code></dt> + <dd style="margin-left: 1.5em" id="section-4.1.2-1.6">NES_GAME_GENIE_CODE<a href="#section-4.1.2-1.6" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -1987,16 +1987,12 @@ li > p:last-of-type:only-child { <dd style="margin-left: 1.5em" id="section-4.1.3-1.2">SNES_CLOCK_FILTER<a href="#section-4.1.3-1.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.1.3-1.3"><code>[02 03]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.3-1.4">SNES_OVERREAD<a href="#section-4.1.3-1.4" class="pilcrow">¶</a> -</dd> - <dd class="break"></dd> -<dt id="section-4.1.3-1.5"><code>[02 04]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.3-1.6">SNES_GAME_GENIE_CODE<a href="#section-4.1.3-1.6" class="pilcrow">¶</a> +<dt id="section-4.1.3-1.3"><code>[02 04]</code></dt> + <dd style="margin-left: 1.5em" id="section-4.1.3-1.4">SNES_GAME_GENIE_CODE<a href="#section-4.1.3-1.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.1.3-1.7"><code>[02 05]</code></dt> - <dd style="margin-left: 1.5em" id="section-4.1.3-1.8">SNES_LATCH_TRAIN<a href="#section-4.1.3-1.8" class="pilcrow">¶</a> +<dt id="section-4.1.3-1.5"><code>[02 05]</code></dt> + <dd style="margin-left: 1.5em" id="section-4.1.3-1.6">SNES_LATCH_TRAIN<a href="#section-4.1.3-1.6" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -2178,6 +2174,11 @@ li > p:last-of-type:only-child { <code>[00 F0]</code> - PORT_CONTROLLER</dt> <dd style="margin-left: 1.5em" id="section-4.2.1-1.44">Specifies the controller type in specific console controller ports for the TAS when played on hardware. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#port_controller" class="auto internal xref">Section 4.3.1.22</a>).<a href="#section-4.2.1-1.44" class="pilcrow">¶</a> </dd> + <dd class="break"></dd> +<dt id="section-4.2.1-1.45"> +<code>[00 F1]</code> - PORT_OVERREAD</dt> + <dd style="margin-left: 1.5em" id="section-4.2.1-1.46">Specifies whether a high or low signal <span class="bcp14">SHOULD</span> be sent through a specified controller port of the console if the console requests more input data from the replay device through that controller port than expected. This packet type is <span class="bcp14">OPTIONAL</span>. Discussed in (<a href="#port_overread" class="auto internal xref">Section 4.3.1.23</a>).<a href="#section-4.2.1-1.46" class="pilcrow">¶</a> +</dd> <dd class="break"></dd> </dl> </section> @@ -2197,13 +2198,8 @@ li > p:last-of-type:only-child { </dd> <dd class="break"></dd> <dt id="section-4.2.2-1.5"> -<code>[01 03]</code> - NES_OVERREAD</dt> - <dd style="margin-left: 1.5em" id="section-4.2.2-1.6">Specifies whether a high or low signal <span class="bcp14">SHOULD</span> 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 <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#nes_overread" class="auto internal xref">Section 4.3.2.3</a>).<a href="#section-4.2.2-1.6" class="pilcrow">¶</a> -</dd> - <dd class="break"></dd> -<dt id="section-4.2.2-1.7"> <code>[01 04]</code> - NES_GAME_GENIE_CODE</dt> - <dd style="margin-left: 1.5em" id="section-4.2.2-1.8">Specifies a Game Genie code for the TAS. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">MAY</span> contain more than 1 of this packet type. Discussed in (<a href="#nes_game_genie_code" class="auto internal xref">Section 4.3.2.4</a>).<a href="#section-4.2.2-1.8" class="pilcrow">¶</a> + <dd style="margin-left: 1.5em" id="section-4.2.2-1.6">Specifies a Game Genie code for the TAS. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">MAY</span> contain more than 1 of this packet type. Discussed in (<a href="#nes_game_genie_code" class="auto internal xref">Section 4.3.2.3</a>).<a href="#section-4.2.2-1.6" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -2214,13 +2210,13 @@ li > p:last-of-type:only-child { </h4> <span class="break"></span><dl class="dlNewline" id="section-4.2.3-1"> <dt id="section-4.2.3-1.1"> -<code>[02 02]</code> - SNES_CLOCK_FILTER</dt> - <dd style="margin-left: 1.5em" id="section-4.2.3-1.2">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 <span class="bcp14">SHOULD</span> be accepted by the replay device. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#snes_clock_filter" class="auto internal xref">Section 4.3.3.1</a>).<a href="#section-4.2.3-1.2" class="pilcrow">¶</a> +<code>[01 01]</code> - SNES_LATCH_FILTER</dt> + <dd style="margin-left: 1.5em" id="section-4.2.3-1.2">Specifies a latch filter time in microseconds for how long how long to wait after a latch signal until new latch signals <span class="bcp14">SHOULD</span> be accepted by the replay device. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#snes_latch_filter" class="auto internal xref">Section 4.3.3.1</a>).<a href="#section-4.2.3-1.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> <dt id="section-4.2.3-1.3"> -<code>[02 03]</code> - SNES_OVERREAD</dt> - <dd style="margin-left: 1.5em" id="section-4.2.3-1.4">Specifies whether a high or low signal <span class="bcp14">SHOULD</span> 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 <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#snes_overread" class="auto internal xref">Section 4.3.3.2</a>).<a href="#section-4.2.3-1.4" class="pilcrow">¶</a> +<code>[02 02]</code> - SNES_CLOCK_FILTER</dt> + <dd style="margin-left: 1.5em" id="section-4.2.3-1.4">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 <span class="bcp14">SHOULD</span> be accepted by the replay device. This packet type is <span class="bcp14">OPTIONAL</span> and a <strong>TASD</strong> file <span class="bcp14">SHOULD NOT</span> contain more than 1 of this packet type in direct form. Discussed in (<a href="#snes_clock_filter" class="auto internal xref">Section 4.3.3.2</a>).<a href="#section-4.2.3-1.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> <dt id="section-4.2.3-1.5"> @@ -2875,7 +2871,7 @@ li > p:last-of-type:only-child { | Type (A) | Base (A) | Identifier (A) | +----------+----------+================+ - Type (Binary Data): [1 octet] + Type (Binary Data): [1 octet] [01] - CRC-8 Checksum [02] - CRC-16 Checksum [03] - CRC-32 Checksum @@ -3047,6 +3043,35 @@ li > p:last-of-type:only-child { </dl> </section> </div> +<div id="port_overread"> +<section id="section-4.3.1.23"> + <h5 id="name-port_overread-packet"> +<a href="#section-4.3.1.23" class="section-number selfRef">4.3.1.23. </a><a href="#name-port_overread-packet" class="section-name selfRef">PORT_OVERREAD Packet</a> + </h5> +<p id="section-4.3.1.23-1">PORT_OVERREAD packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.1.23-1" class="pilcrow">¶</a></p> +<div class="alignLeft art-text artwork" id="section-4.3.1.23-2"> +<pre> + 0 1 + +----------+----------+ + | Port (N) | High (B) | + +----------+----------+ + + Port (N) [1 octet] + High (Boolean) [1 octet] +</pre><a href="#section-4.3.1.23-2" class="pilcrow">¶</a> +</div> +<span class="break"></span><dl class="dlNewline" id="section-4.3.1.23-3"> + <dt id="section-4.3.1.23-3.1"><strong>Port</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.1.23-3.2">Controller port number (<strong>Port</strong> number <span class="bcp14">MUST</span> be <strong>1-indexed</strong>).<a href="#section-4.3.1.23-3.2" class="pilcrow">¶</a> +</dd> + <dd class="break"></dd> +<dt id="section-4.3.1.23-3.3"><strong>High</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.1.23-3.4">Boolean value that is <strong>TRUE</strong> if overread bits are set to high and <strong>FALSE</strong> if overread bits are set to low.<a href="#section-4.3.1.23-3.4" class="pilcrow">¶</a> +</dd> + <dd class="break"></dd> +</dl> +</section> +</div> </section> <section id="section-4.3.2"> <h4 id="name-nes-specific-key-payload-fo"> @@ -3100,37 +3125,13 @@ li > p:last-of-type:only-child { </dl> </section> </div> -<div id="nes_overread"> -<section id="section-4.3.2.3"> - <h5 id="name-nes_overread-packet"> -<a href="#section-4.3.2.3" class="section-number selfRef">4.3.2.3. </a><a href="#name-nes_overread-packet" class="section-name selfRef">NES_OVERREAD Packet</a> - </h5> -<p id="section-4.3.2.3-1">NES_OVERREAD packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.2.3-1" class="pilcrow">¶</a></p> -<div class="alignLeft art-text artwork" id="section-4.3.2.3-2"> -<pre> - 0 - +----------+ - | High (B) | - +----------+ - - High (Boolean) [1 octet] -</pre><a href="#section-4.3.2.3-2" class="pilcrow">¶</a> -</div> -<span class="break"></span><dl class="dlNewline" id="section-4.3.2.3-3"> - <dt id="section-4.3.2.3-3.1"><strong>High</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.2.3-3.2">Boolean value that is <strong>TRUE</strong> if overread bits are set to high and <strong>FALSE</strong> if overread bits are set to low.<a href="#section-4.3.2.3-3.2" class="pilcrow">¶</a> -</dd> - <dd class="break"></dd> -</dl> -</section> -</div> <div id="nes_game_genie_code"> -<section id="section-4.3.2.4"> +<section id="section-4.3.2.3"> <h5 id="name-nes_game_genie_code-packet"> -<a href="#section-4.3.2.4" class="section-number selfRef">4.3.2.4. </a><a href="#name-nes_game_genie_code-packet" class="section-name selfRef">NES_GAME_GENIE_CODE Packet</a> +<a href="#section-4.3.2.3" class="section-number selfRef">4.3.2.3. </a><a href="#name-nes_game_genie_code-packet" class="section-name selfRef">NES_GAME_GENIE_CODE Packet</a> </h5> -<p id="section-4.3.2.4-1">NES_GAME_GENIE_CODE packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.2.4-1" class="pilcrow">¶</a></p> -<div class="alignLeft art-text artwork" id="section-4.3.2.4-2"> +<p id="section-4.3.2.3-1">NES_GAME_GENIE_CODE packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.2.3-1" class="pilcrow">¶</a></p> +<div class="alignLeft art-text artwork" id="section-4.3.2.3-2"> <pre> 0... +==========+ @@ -3138,15 +3139,15 @@ li > p:last-of-type:only-child { +==========+ Code (String) [PLEN octets] -</pre><a href="#section-4.3.2.4-2" class="pilcrow">¶</a> +</pre><a href="#section-4.3.2.3-2" class="pilcrow">¶</a> </div> -<span class="break"></span><dl class="dlNewline" id="section-4.3.2.4-3"> - <dt id="section-4.3.2.4-3.1"><strong>Code</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.2.4-3.2">Game Genie code (example: "AATOZA").<a href="#section-4.3.2.4-3.2" class="pilcrow">¶</a> +<span class="break"></span><dl class="dlNewline" id="section-4.3.2.3-3"> + <dt id="section-4.3.2.3-3.1"><strong>Code</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.2.3-3.2">Game Genie code (example: "AATOZA").<a href="#section-4.3.2.3-3.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.2.4-3.3"><strong>PLEN</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.2.4-3.4">Length of the packet payload.<a href="#section-4.3.2.4-3.4" class="pilcrow">¶</a> +<dt id="section-4.3.2.3-3.3"><strong>PLEN</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.2.3-3.4">Length of the packet payload.<a href="#section-4.3.2.3-3.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -3157,49 +3158,49 @@ li > p:last-of-type:only-child { <h4 id="name-snes-specific-key-payload-f"> <a href="#section-4.3.3" class="section-number selfRef">4.3.3. </a><a href="#name-snes-specific-key-payload-f" class="section-name selfRef">SNES Specific Key Payload Formats</a> </h4> -<div id="snes_clock_filter"> +<div id="snes_latch_filter"> <section id="section-4.3.3.1"> - <h5 id="name-snes_clock_filter-packet"> -<a href="#section-4.3.3.1" class="section-number selfRef">4.3.3.1. </a><a href="#name-snes_clock_filter-packet" class="section-name selfRef">SNES_CLOCK_FILTER Packet</a> + <h5 id="name-snes_latch_filter-packet"> +<a href="#section-4.3.3.1" class="section-number selfRef">4.3.3.1. </a><a href="#name-snes_latch_filter-packet" class="section-name selfRef">SNES_LATCH_FILTER Packet</a> </h5> -<p id="section-4.3.3.1-1">SNES_CLOCK_FILTER packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.3.1-1" class="pilcrow">¶</a></p> +<p id="section-4.3.3.1-1">SNES_LATCH_FILTER packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.3.1-1" class="pilcrow">¶</a></p> <div class="alignLeft art-text artwork" id="section-4.3.3.1-2"> <pre> - 0 - +----------+ - | Time (N) | - +----------+ + 0 1 + +-----+-----+ + | Time (N) | + +-----+-----+ - Time (Unsigned Integer) [1 octet] + Time (Unsigned Integer) [2 octets] </pre><a href="#section-4.3.3.1-2" class="pilcrow">¶</a> </div> <span class="break"></span><dl class="dlNewline" id="section-4.3.3.1-3"> <dt id="section-4.3.3.1-3.1"><strong>Time</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.3.1-3.2">Clock filter length of time in tenths of a microsecond (units of 0.1 microseconds or 100 nanoseconds).<a href="#section-4.3.3.1-3.2" class="pilcrow">¶</a> + <dd style="margin-left: 1.5em" id="section-4.3.3.1-3.2">Latch filter length of time in microseconds.<a href="#section-4.3.3.1-3.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> </section> </div> -<div id="snes_overread"> +<div id="snes_clock_filter"> <section id="section-4.3.3.2"> - <h5 id="name-snes_overread-packet"> -<a href="#section-4.3.3.2" class="section-number selfRef">4.3.3.2. </a><a href="#name-snes_overread-packet" class="section-name selfRef">SNES_OVERREAD Packet</a> + <h5 id="name-snes_clock_filter-packet"> +<a href="#section-4.3.3.2" class="section-number selfRef">4.3.3.2. </a><a href="#name-snes_clock_filter-packet" class="section-name selfRef">SNES_CLOCK_FILTER Packet</a> </h5> -<p id="section-4.3.3.2-1">SNES_OVERREAD packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.3.2-1" class="pilcrow">¶</a></p> +<p id="section-4.3.3.2-1">SNES_CLOCK_FILTER packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.3.2-1" class="pilcrow">¶</a></p> <div class="alignLeft art-text artwork" id="section-4.3.3.2-2"> <pre> 0 +----------+ - | High (B) | + | Time (N) | +----------+ - High (Boolean) [1 octet] + Time (Unsigned Integer) [1 octet] </pre><a href="#section-4.3.3.2-2" class="pilcrow">¶</a> </div> <span class="break"></span><dl class="dlNewline" id="section-4.3.3.2-3"> - <dt id="section-4.3.3.2-3.1"><strong>High</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.3.2-3.2">Boolean value that is <strong>TRUE</strong> if overread bits are set to high and <strong>FALSE</strong> if overread bits are set to low.<a href="#section-4.3.3.2-3.2" class="pilcrow">¶</a> + <dt id="section-4.3.3.2-3.1"><strong>Time</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.3.2-3.2">Clock filter length of time in tenths of a microsecond (units of 0.1 microseconds or 100 nanoseconds).<a href="#section-4.3.3.2-3.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -3394,14 +3395,14 @@ li > p:last-of-type:only-child { <p id="section-4.3.5.3-1">TRANSITION packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.5.3-1" class="pilcrow">¶</a></p> <div class="alignLeft art-text artwork" id="section-4.3.5.3-2"> <pre> - 0 1 2 3 4 5 6 7 8 9 - +----------------+--+--+--+--+--+--+--+--+----------+ - | Index Type (A) | Index (N) | Type (A) | ... - +----------------+--+--+--+--+--+--+--+--+----------+ - 10... - +============+ - | Packet (A) | - +============+ + 0 1 2 3 4 5 6 7 8 9 + +----------------+----------+--+--+--+--+--+--+--+--+ + | Index Type (A) | Port (N) | Index (N) | ... + +----------------+----------+--+--+--+--+--+--+--+--+ + 10 11... + +----------+============+ + | Type (A) | Packet (A) | + +----------+============+ Index Type (Binary Data): [1 octet] [01] - Frame @@ -3409,13 +3410,14 @@ li > p:last-of-type:only-child { [03] - Milliseconds [04] - Microseconds * 10 [05] - INPUT_CHUNK Index + Port (Unsigned Integer) [1 octet] Index (Unsigned Integer) [8 octets] Type (Binary Data): [1 octet] [01] - Soft Reset [02] - Power Reset [03] - Restart TASD File [FF] - Packet Derived - Inner Packet (Binary Data) [PLEN - 10 octets] + Inner Packet (Binary Data) [PLEN - 11 octets] </pre><a href="#section-4.3.5.3-2" class="pilcrow">¶</a> </div> <span class="break"></span><dl class="dlNewline" id="section-4.3.5.3-3"> @@ -3423,20 +3425,24 @@ li > p:last-of-type:only-child { <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.2">Determines specific timing type for start of transition.<a href="#section-4.3.5.3-3.2" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.5.3-3.3"><strong>Index</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.4">Time or offset value to start transition.<a href="#section-4.3.5.3-3.4" class="pilcrow">¶</a> +<dt id="section-4.3.5.3-3.3"><strong>Port</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.4">Controller port number of input index. If <strong>Index Type</strong> is <code>[05]</code>, <strong>Port</strong> <span class="bcp14">MUST</span> be <strong>1-indexed</strong> Port number, otherwise <strong>Port</strong> <span class="bcp14">MAY</span> be any value.<a href="#section-4.3.5.3-3.4" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.5.3-3.5"><strong>Type</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.6">Type of transition. If <strong>Type</strong> is <code>[FF]</code>, the transition action will be interpreting a <strong>TASD</strong> packet.<a href="#section-4.3.5.3-3.6" class="pilcrow">¶</a> +<dt id="section-4.3.5.3-3.5"><strong>Index</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.6">Time or offset value to start transition. If <strong>Index Type</strong> is <code>[05]</code>, <strong>Index</strong> <span class="bcp14">MUST</span> be the byte offset of <strong>INPUT_CHUNK</strong> data from <strong>INPUT_CHUNK</strong> packets for the controller port specified by <strong>Port</strong>.<a href="#section-4.3.5.3-3.6" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.5.3-3.7"><strong>Inner Packet</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.8">If <strong>Type</strong> is <code>[FF]</code>, <strong>Inner Packet</strong> <span class="bcp14">SHOULD</span> be a <strong>TASD</strong> packet. <strong>Inner Packet</strong> <span class="bcp14">MUST NOT</span> be a <strong>INPUT_CHUNK</strong>, <strong>INPUT_MOMENT</strong>, <strong>TRANSITION</strong>, <strong>LAG_FRAME_CHUNK</strong>, or <strong>MOVIE_TRANSITION</strong> packet.<a href="#section-4.3.5.3-3.8" class="pilcrow">¶</a> +<dt id="section-4.3.5.3-3.7"><strong>Type</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.8">Type of transition. If <strong>Type</strong> is <code>[FF]</code>, the transition action will be interpreting a <strong>TASD</strong> packet.<a href="#section-4.3.5.3-3.8" class="pilcrow">¶</a> </dd> <dd class="break"></dd> -<dt id="section-4.3.5.3-3.9"><strong>PLEN</strong></dt> - <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.10">Length of the packet payload (Not <strong>Inner Packet</strong> length).<a href="#section-4.3.5.3-3.10" class="pilcrow">¶</a> +<dt id="section-4.3.5.3-3.9"><strong>Inner Packet</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.10">If <strong>Type</strong> is <code>[FF]</code>, <strong>Inner Packet</strong> <span class="bcp14">SHOULD</span> be a <strong>TASD</strong> packet. <strong>Inner Packet</strong> <span class="bcp14">MUST NOT</span> be a <strong>INPUT_CHUNK</strong>, <strong>INPUT_MOMENT</strong>, <strong>TRANSITION</strong>, <strong>LAG_FRAME_CHUNK</strong>, or <strong>MOVIE_TRANSITION</strong> packet.<a href="#section-4.3.5.3-3.10" class="pilcrow">¶</a> +</dd> + <dd class="break"></dd> +<dt id="section-4.3.5.3-3.11"><strong>PLEN</strong></dt> + <dd style="margin-left: 1.5em" id="section-4.3.5.3-3.12">Length of the packet payload (Not <strong>Inner Packet</strong> length).<a href="#section-4.3.5.3-3.12" class="pilcrow">¶</a> </dd> <dd class="break"></dd> </dl> @@ -3554,12 +3560,12 @@ li > p:last-of-type:only-child { <p id="section-4.3.6.2-1">EXPERIMENTAL packets <span class="bcp14">MUST</span> be in the following format:<a href="#section-4.3.6.2-1" class="pilcrow">¶</a></p> <div class="alignLeft art-text artwork" id="section-4.3.6.2-2"> <pre> - 0... - +==================+ + 0 + +------------------+ | Experimental (B) | - +==================+ + +------------------+ - Experimental (Boolean) [PLEN octet] + Experimental (Boolean) [1 octet] </pre><a href="#section-4.3.6.2-2" class="pilcrow">¶</a> </div> <span class="break"></span><dl class="dlNewline" id="section-4.3.6.2-3"> diff --git a/docs/tasd-spec-0001/draft-tasd-spec-0001.txt b/docs/tasd-spec-0001/draft-tasd-spec-0001.txt index f751bd2..f309c4b 100644 --- a/docs/tasd-spec-0001/draft-tasd-spec-0001.txt +++ b/docs/tasd-spec-0001/draft-tasd-spec-0001.txt @@ -7,7 +7,7 @@ Independent TAS Console Replay Research Group V. Grey Bigbass rasteri - 18 September 2023 + 24 September 2023 TASD File Format Specification Version 1 @@ -74,14 +74,14 @@ Table of Contents 4.3.1.20. MOVIE_LICENSE Packet 4.3.1.21. MOVIE_FILE Packet 4.3.1.22. PORT_CONTROLLER Packet + 4.3.1.23. PORT_OVERREAD Packet 4.3.2. NES Specific Key Payload Formats 4.3.2.1. NES_LATCH_FILTER Packet 4.3.2.2. NES_CLOCK_FILTER Packet - 4.3.2.3. NES_OVERREAD Packet - 4.3.2.4. NES_GAME_GENIE_CODE Packet + 4.3.2.3. NES_GAME_GENIE_CODE Packet 4.3.3. SNES Specific Key Payload Formats - 4.3.3.1. SNES_CLOCK_FILTER Packet - 4.3.3.2. SNES_OVERREAD Packet + 4.3.3.1. SNES_LATCH_FILTER Packet + 4.3.3.2. SNES_CLOCK_FILTER Packet 4.3.3.3. SNES_GAME_GENIE_CODE Packet 4.3.3.4. SNES_LATCH_TRAIN Packet 4.3.4. Genesis Specific Key Payload Formats @@ -406,18 +406,17 @@ Table of Contents [00 14] MOVIE_LICENSE [00 15] MOVIE_FILE [00 F0] PORT_CONTROLLER + [00 F1] PORT_OVERREAD 4.1.2. NES Specific Keys [01 01] NES_LATCH_FILTER [01 02] NES_CLOCK_FILTER - [01 03] NES_OVERREAD [01 04] NES_GAME_GENIE_CODE 4.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 @@ -570,6 +569,13 @@ Table of Contents and a *TASD* file SHOULD NOT contain more than 1 of this packet type in direct form. Discussed in (Section 4.3.1.22). + [00 F1] - PORT_OVERREAD + Specifies whether a high or low signal SHOULD be sent through a + specified controller port of the console if the console requests + more input data from the replay device through that controller + port than expected. This packet type is OPTIONAL. Discussed in + (Section 4.3.1.23). + 4.2.2. NES Specific Key Descriptions [01 01] - NES_LATCH_FILTER @@ -587,34 +593,27 @@ Table of Contents SHOULD NOT contain more than 1 of this packet type in direct form. Discussed in (Section 4.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 4.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 4.3.2.4). + type. Discussed in (Section 4.3.2.3). 4.2.3. SNES Specific Key Descriptions + [01 01] - SNES_LATCH_FILTER + Specifies a latch filter time in microseconds for how long how + long to wait after a latch signal until new latch signals SHOULD + be accepted by the replay device. This packet type is OPTIONAL + and a *TASD* file SHOULD NOT contain more than 1 of this packet + type in direct form. Discussed in (Section 4.3.3.1). + [02 02] - SNES_CLOCK_FILTER Specifies a clock filter time in tenths of a microsecond (0.1 microseconds or 100 nanoseconds) for how long to wait after a clock pulse until new clock pulses SHOULD be accepted by the replay device. This packet type is OPTIONAL and a *TASD* file SHOULD NOT contain more than 1 of this packet type in direct form. - Discussed in (Section 4.3.3.1). - - [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 4.3.3.2). + Discussed in (Section 4.3.3.2). [02 04] - SNES_GAME_GENIE_CODE Specifies a Game Genie code for the TAS. This packet type is @@ -1084,7 +1083,7 @@ Table of Contents | Type (A) | Base (A) | Identifier (A) | +----------+----------+================+ - Type (Binary Data): [1 octet] + Type (Binary Data): [1 octet] [01] - CRC-8 Checksum [02] - CRC-16 Checksum [03] - CRC-32 Checksum @@ -1218,6 +1217,25 @@ Table of Contents version of the *TASD* file format protocol. Input formats for specific controller types are described in (Section 5). +4.3.1.23. PORT_OVERREAD Packet + + PORT_OVERREAD packets MUST be in the following format: + + 0 1 + +----------+----------+ + | Port (N) | High (B) | + +----------+----------+ + + Port (N) [1 octet] + High (Boolean) [1 octet] + + *Port* + Controller port number (*Port* number MUST be *1-indexed*). + + *High* + Boolean value that is *TRUE* if overread bits are set to high and + *FALSE* if overread bits are set to low. + 4.3.2. NES Specific Key Payload Formats 4.3.2.1. NES_LATCH_FILTER Packet @@ -1249,22 +1267,7 @@ Table of Contents Clock filter length of time in tenths of a microsecond (units of 0.1 microseconds or 100 nanoseconds). -4.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. - -4.3.2.4. NES_GAME_GENIE_CODE Packet +4.3.2.3. NES_GAME_GENIE_CODE Packet NES_GAME_GENIE_CODE packets MUST be in the following format: @@ -1283,35 +1286,34 @@ Table of Contents 4.3.3. SNES Specific Key Payload Formats -4.3.3.1. SNES_CLOCK_FILTER Packet +4.3.3.1. SNES_LATCH_FILTER Packet - SNES_CLOCK_FILTER packets MUST be in the following format: + SNES_LATCH_FILTER packets MUST be in the following format: - 0 - +----------+ - | Time (N) | - +----------+ + 0 1 + +-----+-----+ + | Time (N) | + +-----+-----+ - Time (Unsigned Integer) [1 octet] + Time (Unsigned Integer) [2 octets] *Time* - Clock filter length of time in tenths of a microsecond (units of - 0.1 microseconds or 100 nanoseconds). + Latch filter length of time in microseconds. -4.3.3.2. SNES_OVERREAD Packet +4.3.3.2. SNES_CLOCK_FILTER Packet - SNES_OVERREAD packets MUST be in the following format: + SNES_CLOCK_FILTER packets MUST be in the following format: 0 +----------+ - | High (B) | + | Time (N) | +----------+ - High (Boolean) [1 octet] + Time (Unsigned Integer) [1 octet] - *High* - Boolean value that is *TRUE* if overread bits are set to high and - *FALSE* if overread bits are set to low. + *Time* + Clock filter length of time in tenths of a microsecond (units of + 0.1 microseconds or 100 nanoseconds). 4.3.3.3. SNES_GAME_GENIE_CODE Packet @@ -1449,14 +1451,14 @@ Table of Contents 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) | - +============+ + 0 1 2 3 4 5 6 7 8 9 + +----------------+----------+--+--+--+--+--+--+--+--+ + | Index Type (A) | Port (N) | Index (N) | ... + +----------------+----------+--+--+--+--+--+--+--+--+ + 10 11... + +----------+============+ + | Type (A) | Packet (A) | + +----------+============+ Index Type (Binary Data): [1 octet] [01] - Frame @@ -1464,19 +1466,27 @@ Table of Contents [03] - Milliseconds [04] - Microseconds * 10 [05] - INPUT_CHUNK Index + Port (Unsigned Integer) [1 octet] Index (Unsigned Integer) [8 octets] Type (Binary Data): [1 octet] [01] - Soft Reset [02] - Power Reset [03] - Restart TASD File [FF] - Packet Derived - Inner Packet (Binary Data) [PLEN - 10 octets] + Inner Packet (Binary Data) [PLEN - 11 octets] *Input Type* Determines specific timing type for start of transition. + *Port* + Controller port number of input index. If *Index Type* is [05], + *Port* MUST be *1-indexed* Port number, otherwise *Port* MAY be + any value. + *Index* - Time or offset value to start transition. + Time or offset value to start transition. If *Index Type* is + [05], *Index* MUST be the byte offset of *INPUT_CHUNK* data from + *INPUT_CHUNK* packets for the controller port specified by *Port*. *Type* Type of transition. If *Type* is [FF], the transition action will @@ -1564,12 +1574,12 @@ Table of Contents EXPERIMENTAL packets MUST be in the following format: - 0... - +==================+ + 0 + +------------------+ | Experimental (B) | - +==================+ + +------------------+ - Experimental (Boolean) [PLEN octet] + Experimental (Boolean) [1 octet] *Experimental* Boolean data that is *TRUE* if the TASD file is using draft/ diff --git a/src/docs/draft-tasd-spec-0001.xml b/src/docs/draft-tasd-spec-0001.xml index d541237..e63af21 100644 --- a/src/docs/draft-tasd-spec-0001.xml +++ b/src/docs/draft-tasd-spec-0001.xml @@ -248,6 +248,7 @@ <dt><tt>[00 14]</tt></dt> <dd>MOVIE_LICENSE</dd> <dt><tt>[00 15]</tt></dt> <dd>MOVIE_FILE</dd> <dt><tt>[00 F0]</tt></dt> <dd>PORT_CONTROLLER</dd> + <dt><tt>[00 F1]</tt></dt> <dd>PORT_OVERREAD</dd> </dl> </section> <section numbered="true" toc="default"> @@ -255,7 +256,6 @@ <dl spacing="compact"> <dt><tt>[01 01]</tt></dt> <dd>NES_LATCH_FILTER</dd> <dt><tt>[01 02]</tt></dt> <dd>NES_CLOCK_FILTER</dd> - <dt><tt>[01 03]</tt></dt> <dd>NES_OVERREAD</dd> <dt><tt>[01 04]</tt></dt> <dd>NES_GAME_GENIE_CODE</dd> </dl> </section> @@ -263,7 +263,6 @@ <name>SNES Specific Keys</name> <dl spacing="compact"> <dt><tt>[02 02]</tt></dt> <dd>SNES_CLOCK_FILTER</dd> - <dt><tt>[02 03]</tt></dt> <dd>SNES_OVERREAD</dd> <dt><tt>[02 04]</tt></dt> <dd>SNES_GAME_GENIE_CODE</dd> <dt><tt>[02 05]</tt></dt> <dd>SNES_LATCH_TRAIN</dd> </dl> @@ -342,6 +341,8 @@ <dd>Specifies the TAS movie data. This packet type is <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>SHOULD NOT</bcp14> contain more than 1 of this packet type. Discussed in (<xref target="movie_file"/>).</dd> <dt><tt>[00 F0]</tt> - PORT_CONTROLLER</dt> <dd>Specifies the controller type in specific console controller ports for the TAS when played on hardware. This packet type is <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>SHOULD NOT</bcp14> contain more than 1 of this packet type in direct form. Discussed in (<xref target="port_controller"/>).</dd> + <dt><tt>[00 F1]</tt> - PORT_OVERREAD</dt> + <dd>Specifies whether a high or low signal <bcp14>SHOULD</bcp14> be sent through a specified controller port of the console if the console requests more input data from the replay device through that controller port than expected. This packet type is <bcp14>OPTIONAL</bcp14>. Discussed in (<xref target="port_overread"/>).</dd> </dl> </section> <section numbered="true" toc="default"> @@ -351,8 +352,6 @@ <dd>Specifies a latch filter time in microseconds for how long how long to wait after a latch signal until new latch signals <bcp14>SHOULD</bcp14> be accepted by the replay device. This packet type is <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>SHOULD NOT</bcp14> contain more than 1 of this packet type in direct form. Discussed in (<xref target="nes_latch_filter"/>).</dd> <dt><tt>[01 02]</tt> - NES_CLOCK_FILTER</dt> <dd>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 <bcp14>SHOULD</bcp14> be accepted by the replay device. This packet type is <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>SHOULD NOT</bcp14> contain more than 1 of this packet type in direct form. Discussed in (<xref target="nes_clock_filter"/>).</dd> - <dt><tt>[01 03]</tt> - NES_OVERREAD</dt> - <dd>Specifies whether a high or low signal <bcp14>SHOULD</bcp14> 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 <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>SHOULD NOT</bcp14> contain more than 1 of this packet type in direct form. Discussed in (<xref target="nes_overread"/>).</dd> <dt><tt>[01 04]</tt> - NES_GAME_GENIE_CODE</dt> <dd>Specifies a Game Genie code for the TAS. This packet type is <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>MAY</bcp14> contain more than 1 of this packet type. Discussed in (<xref target="nes_game_genie_code"/>).</dd> </dl> @@ -360,10 +359,10 @@ <section numbered="true" toc="default"> <name>SNES Specific Key Descriptions</name> <dl newline="true"> + <dt><tt>[01 01]</tt> - SNES_LATCH_FILTER</dt> + <dd>Specifies a latch filter time in microseconds for how long how long to wait after a latch signal until new latch signals <bcp14>SHOULD</bcp14> be accepted by the replay device. This packet type is <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>SHOULD NOT</bcp14> contain more than 1 of this packet type in direct form. Discussed in (<xref target="snes_latch_filter"/>).</dd> <dt><tt>[02 02]</tt> - SNES_CLOCK_FILTER</dt> <dd>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 <bcp14>SHOULD</bcp14> be accepted by the replay device. This packet type is <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>SHOULD NOT</bcp14> contain more than 1 of this packet type in direct form. Discussed in (<xref target="snes_clock_filter"/>).</dd> - <dt><tt>[02 03]</tt> - SNES_OVERREAD</dt> - <dd>Specifies whether a high or low signal <bcp14>SHOULD</bcp14> 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 <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>SHOULD NOT</bcp14> contain more than 1 of this packet type in direct form. Discussed in (<xref target="snes_overread"/>).</dd> <dt><tt>[02 04]</tt> - SNES_GAME_GENIE_CODE</dt> <dd>Specifies a Game Genie code for the TAS. This packet type is <bcp14>OPTIONAL</bcp14> and a <strong>TASD</strong> file <bcp14>MAY</bcp14> contain more than 1 of this packet type. Discussed in (<xref target="snes_game_genie_code"/>).</dd> <dt><tt>[02 05]</tt> - SNES_LATCH_TRAIN</dt> @@ -790,7 +789,7 @@ | Type (A) | Base (A) | Identifier (A) | +----------+----------+================+ - Type (Binary Data): [1 octet] + Type (Binary Data): [1 octet] [01] - CRC-8 Checksum [02] - CRC-16 Checksum [03] - CRC-32 Checksum @@ -918,6 +917,25 @@ <dd>Specifies the controller type connected to the <strong>Port</strong>. <strong>(RESERVED)</strong> specifies that the controller type is not described in this document, but the byte values are reserved for a later version of the <strong>TASD</strong> file format protocol. Input formats for specific controller types are described in (<xref target="controller_inputs"/>).</dd> </dl> </section> + <section numbered="true" toc="default" anchor="port_overread"> + <name>PORT_OVERREAD Packet</name> + <t>PORT_OVERREAD packets <bcp14>MUST</bcp14> be in the following format:</t> + <artwork><![CDATA[ + 0 1 + +----------+----------+ + | Port (N) | High (B) | + +----------+----------+ + + Port (N) [1 octet] + High (Boolean) [1 octet]]]> + </artwork> + <dl newline="true"> + <dt><strong>Port</strong></dt> + <dd>Controller port number (<strong>Port</strong> number <bcp14>MUST</bcp14> be <strong>1-indexed</strong>).</dd> + <dt><strong>High</strong></dt> + <dd>Boolean value that is <strong>TRUE</strong> if overread bits are set to high and <strong>FALSE</strong> if overread bits are set to low.</dd> + </dl> + </section> </section> <section numbered="true" toc="default"> <name>NES Specific Key Payload Formats</name> @@ -953,22 +971,6 @@ <dd>Clock filter length of time in tenths of a microsecond (units of 0.1 microseconds or 100 nanoseconds).</dd> </dl> </section> - <section numbered="true" toc="default" anchor="nes_overread"> - <name>NES_OVERREAD Packet</name> - <t>NES_OVERREAD packets <bcp14>MUST</bcp14> be in the following format:</t> - <artwork><![CDATA[ - 0 - +----------+ - | High (B) | - +----------+ - - High (Boolean) [1 octet]]]> - </artwork> - <dl newline="true"> - <dt><strong>High</strong></dt> - <dd>Boolean value that is <strong>TRUE</strong> if overread bits are set to high and <strong>FALSE</strong> if overread bits are set to low.</dd> - </dl> - </section> <section numbered="true" toc="default" anchor="nes_game_genie_code"> <name>NES_GAME_GENIE_CODE Packet</name> <t>NES_GAME_GENIE_CODE packets <bcp14>MUST</bcp14> be in the following format:</t> @@ -990,36 +992,36 @@ </section> <section numbered="true" toc="default"> <name>SNES Specific Key Payload Formats</name> - <section numbered="true" toc="default" anchor="snes_clock_filter"> - <name>SNES_CLOCK_FILTER Packet</name> - <t>SNES_CLOCK_FILTER packets <bcp14>MUST</bcp14> be in the following format:</t> + <section numbered="true" toc="default" anchor="snes_latch_filter"> + <name>SNES_LATCH_FILTER Packet</name> + <t>SNES_LATCH_FILTER packets <bcp14>MUST</bcp14> be in the following format:</t> <artwork><![CDATA[ - 0 - +----------+ - | Time (N) | - +----------+ + 0 1 + +-----+-----+ + | Time (N) | + +-----+-----+ - Time (Unsigned Integer) [1 octet]]]> + Time (Unsigned Integer) [2 octets]]]> </artwork> <dl newline="true"> <dt><strong>Time</strong></dt> - <dd>Clock filter length of time in tenths of a microsecond (units of 0.1 microseconds or 100 nanoseconds).</dd> + <dd>Latch filter length of time in microseconds.</dd> </dl> </section> - <section numbered="true" toc="default" anchor="snes_overread"> - <name>SNES_OVERREAD Packet</name> - <t>SNES_OVERREAD packets <bcp14>MUST</bcp14> be in the following format:</t> + <section numbered="true" toc="default" anchor="snes_clock_filter"> + <name>SNES_CLOCK_FILTER Packet</name> + <t>SNES_CLOCK_FILTER packets <bcp14>MUST</bcp14> be in the following format:</t> <artwork><![CDATA[ 0 +----------+ - | High (B) | + | Time (N) | +----------+ - High (Boolean) [1 octet]]]> + Time (Unsigned Integer) [1 octet]]]> </artwork> <dl newline="true"> - <dt><strong>High</strong></dt> - <dd>Boolean value that is <strong>TRUE</strong> if overread bits are set to high and <strong>FALSE</strong> if overread bits are set to low.</dd> + <dt><strong>Time</strong></dt> + <dd>Clock filter length of time in tenths of a microsecond (units of 0.1 microseconds or 100 nanoseconds).</dd> </dl> </section> <section numbered="true" toc="default" anchor="snes_game_genie_code"> @@ -1145,14 +1147,14 @@ <name>TRANSITION Packet</name> <t>TRANSITION packets <bcp14>MUST</bcp14> be in the following format:</t> <artwork><![CDATA[ - 0 1 2 3 4 5 6 7 8 9 - +----------------+--+--+--+--+--+--+--+--+----------+ - | Index Type (A) | Index (N) | Type (A) | ... - +----------------+--+--+--+--+--+--+--+--+----------+ - 10... - +============+ - | Packet (A) | - +============+ + 0 1 2 3 4 5 6 7 8 9 + +----------------+----------+--+--+--+--+--+--+--+--+ + | Index Type (A) | Port (N) | Index (N) | ... + +----------------+----------+--+--+--+--+--+--+--+--+ + 10 11... + +----------+============+ + | Type (A) | Packet (A) | + +----------+============+ Index Type (Binary Data): [1 octet] [01] - Frame @@ -1160,20 +1162,22 @@ [03] - Milliseconds [04] - Microseconds * 10 [05] - INPUT_CHUNK Index + Port (Unsigned Integer) [1 octet] Index (Unsigned Integer) [8 octets] Type (Binary Data): [1 octet] [01] - Soft Reset [02] - Power Reset [03] - Restart TASD File [FF] - Packet Derived - Inner Packet (Binary Data) [PLEN - 10 octets]]]> + Inner Packet (Binary Data) [PLEN - 11 octets]]]> </artwork> <dl newline="true"> <dt><strong>Input Type</strong></dt> <dd>Determines specific timing type for start of transition.</dd> - + <dt><strong>Port</strong></dt> + <dd>Controller port number of input index. If <strong>Index Type</strong> is <tt>[05]</tt>, <strong>Port</strong> <bcp14>MUST</bcp14> be <strong>1-indexed</strong> Port number, otherwise <strong>Port</strong> <bcp14>MAY</bcp14> be any value.</dd> <dt><strong>Index</strong></dt> - <dd>Time or offset value to start transition.</dd> + <dd>Time or offset value to start transition. If <strong>Index Type</strong> is <tt>[05]</tt>, <strong>Index</strong> <bcp14>MUST</bcp14> be the byte offset of <strong>INPUT_CHUNK</strong> data from <strong>INPUT_CHUNK</strong> packets for the controller port specified by <strong>Port</strong>.</dd> <dt><strong>Type</strong></dt> <dd>Type of transition. If <strong>Type</strong> is <tt>[FF]</tt>, the transition action will be interpreting a <strong>TASD</strong> packet.</dd> <dt><strong>Inner Packet</strong></dt> @@ -1255,12 +1259,12 @@ <name>EXPERIMENTAL Packet</name> <t>EXPERIMENTAL packets <bcp14>MUST</bcp14> be in the following format:</t> <artwork><![CDATA[ - 0... - +==================+ + 0 + +------------------+ | Experimental (B) | - +==================+ + +------------------+ - Experimental (Boolean) [PLEN octet]]]> + Experimental (Boolean) [1 octet]]]> </artwork> <dl newline="true"> <dt><strong>Experimental</strong></dt> @@ -1914,6 +1918,8 @@ </section> <!-- Change Log +draft 11 - 2023-09-24 VG Made OVERREAD packets generic and added Port to it, now is PORT_OVERREAD. Fixed packet drawing error in EXPERIMENTAL. Added SNES_LATCH_FILTER. Added Port to TRANSITION packet. Specify meaning of INPUT_CHUNK offset for Index value of TRANSITION packet. + draft 10 - 2023-09-18 VG Specify that PEXP MUST be greater than 0 draft 09 - 2023-09-17 Bigbass Added "Structure" section to better define the overall structure of a TASD file diff --git a/tools/lua/tasd-fceux-dumpscript.lua b/tools/lua/tasd-fceux-dumpscript.lua index 27f9c71..e5d968d 100644 --- a/tools/lua/tasd-fceux-dumpscript.lua +++ b/tools/lua/tasd-fceux-dumpscript.lua @@ -38,10 +38,10 @@ local RERECORDS = 0x000e -- Done local MEMORY_INIT = 0x0012 -- Done local GAME_IDENTIFIER = 0x0013 -- Done local PORT_CONTROLLER = 0x00f0 -- Done (More to handle later) +local PORT_OVERREAD = 0x00f1 -- Done local NES_LATCH_FILTER = 0x0101 -- Done local NES_CLOCK_FILTER = 0x0102 -- Done -local NES_OVERREAD = 0x0103 -- Done local INPUT_CHUNK = 0xfe01 -- Done (More to handle later) local TRANSITION = 0xfe03 -- Done @@ -60,6 +60,7 @@ local cpuCyclesLastFrame = 0 local region = "" local tasdFile +local lastController local nesControls = {"right", "left", "down", "up", "start", "select", "B", "A"} @@ -172,6 +173,17 @@ function getPortControllerPacket(playerCount, controllerType) return finishedPackets end +function getPortOverreadPacket(playerCount, controllerType) + local finishedPackets = "" + for x = 1, playerCount, 1 do + local packetPayload = intToBytes(x, 1) + packetPayload = packetPayload .. intToBytes(0x00, 1) + finishedPackets = finishedPackets .. makePacket(PORT_OVERREAD, packetPayload) + end + return finishedPackets +end + + function getNESLatchFilterPacket() local packetPayload = intToBytes(8000, 2) return makePacket(NES_LATCH_FILTER, packetPayload) @@ -182,11 +194,6 @@ function getNESClockFilterPacket() return makePacket(NES_CLOCK_FILTER, packetPayload) end -function getNESOverreadPacket() - local packetPayload = intToBytes(0, 1) - return makePacket(NES_OVERREAD, packetPayload) -end - function getInputChunkPacket(player, inputs, controllerType) local payloadLen = 1 if (controllerType == NES_STANDARD_CONTROLLER) then @@ -205,6 +212,7 @@ end function getTransitionPacket() local packetPayload = intToBytes(0x01, 1) + packetPayload = packetPayload .. intToBytes(0x00, 1) packetPayload = packetPayload .. intToBytes(movie.framecount(), 8) packetPayload = packetPayload .. intToBytes(0x01, 1) return makePacket(TRANSITION, packetPayload) @@ -237,9 +245,9 @@ function startDump() tasdFile:write(getTotalFramesPacket()) tasdFile:write(getRerecordsPacket()) tasdFile:write(getPortControllerPacket(2, NES_STANDARD_CONTROLLER)) + tasdFile:write(getPortOverreadPacket(2)) tasdFile:write(getNESLatchFilterPacket()) tasdFile:write(getNESClockFilterPacket()) - tasdFile:write(getNESOverreadPacket()) -- Rest CPU cycle count to 0 debugger.resetcyclescount() movie.playbeginning() |
