<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://moddingwiki.shikadi.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=VorticonCmdr</id>
	<title>ModdingWiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://moddingwiki.shikadi.net/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=VorticonCmdr"/>
	<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/wiki/Special:Contributions/VorticonCmdr"/>
	<updated>2026-11-10T07:42:00Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.11</generator>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack&amp;diff=13052</id>
		<title>Deathtrack</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack&amp;diff=13052"/>
		<updated>2026-11-02T20:58:25Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Game Infobox&lt;br /&gt;
 | Levels = Edit&lt;br /&gt;
 | Tiles = None&lt;br /&gt;
 | Sprites = Some&lt;br /&gt;
 | Fullscreen = Some&lt;br /&gt;
 | Sound = Some&lt;br /&gt;
 | Music = Some&lt;br /&gt;
 | Text = No&lt;br /&gt;
 | Story = Some&lt;br /&gt;
 | Interface = No&lt;br /&gt;
 | Demo = None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Deathtrack&#039;&#039;&#039; is a first-person combat racing game by Dynamix, published by Activision for DOS in 1989. The player races armed cars through ten American cities (Bay Area, Boston, Chicago, Houston, Los Angeles, New York, Orlando, Phoenix, Seattle and St. Louis) against nine named rivals. The game runs in 16-colour EGA or in CGA, and can play music on an AdLib or a Roland MT-32. Sound effects always use the PC speaker.&lt;br /&gt;
&lt;br /&gt;
Most data files use the Dynamix [[Deathtrack Chunk Format|resource chunk format]] with [[Deathtrack Compression|LZW or RLE compression]], an early form of the resource format of Dynamix&#039;s later games. The 3D cars and roadside objects are stored as polygon tables, the roads as lists of 3D points and the horizons as 1920&amp;amp;times;25 skyline panoramas. Game logic, menu text and the car statistics are inside &amp;lt;tt&amp;gt;DTRACK.EXE&amp;lt;/tt&amp;gt; and have not been documented as file formats.&lt;br /&gt;
&lt;br /&gt;
The extension identifies the format reliably, but the names can mislead: &amp;lt;tt&amp;gt;.MAP&amp;lt;/tt&amp;gt; files are skylines (not road maps), &amp;lt;tt&amp;gt;.TRK&amp;lt;/tt&amp;gt; files are the roads and &amp;lt;tt&amp;gt;.BMP&amp;lt;/tt&amp;gt; files are not Windows bitmaps.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name!!Platform!!Archives!!Levels!!Graphics!!Music!!Sounds!!Text!!Saves!!.exe patch!!Notes&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/VorticonCmdr/re-deathtrack re-deathtrack]||Web browser||No||Edit||Export||Export||Export||No||No||No||Open-source HTML5 port of the game, translated function by function from &amp;lt;tt&amp;gt;DTRACK.EXE&amp;lt;/tt&amp;gt; ([https://www.decompile.tools/re-deathtrack/ play it]). Includes an [https://www.decompile.tools/re-deathtrack/viewer.html asset viewer] (images to PNG, 3D models, tracks, skylines, sound effects to WAV, music to MIDI, title script and high scores) and a [https://www.decompile.tools/re-deathtrack/editor.html track editor] (reshape roads, set heights, place roadside objects; saves &amp;lt;tt&amp;gt;.TRK&amp;lt;/tt&amp;gt; files). Needs your own copy of the game files.&lt;br /&gt;
|-&lt;br /&gt;
|re-deathtrack Vehicle Foundry||Node.js + web browser||No||No||Edit||No||No||No||No||No||Part of re-deathtrack, runs locally. Edits the 3D vehicle models and saves &amp;lt;tt&amp;gt;.TBL&amp;lt;/tt&amp;gt; files; also has an MCP server for scripted editing. See [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/vehicle-editor.md its documentation].&lt;br /&gt;
|-&lt;br /&gt;
|[[Westwood Font Editor]]||Windows||No||No||Edit||No||No||No||No||No||Edits [[Dynamix Font Format v2-v3|Dynamix v3 fonts]] and lists Deathtrack among its supported games&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File formats ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Filename!!Format!!Details&lt;br /&gt;
|-&lt;br /&gt;
|All chunk-based files||[[Deathtrack Chunk Format]]||Tagged chunk tree used by &amp;lt;tt&amp;gt;.BMP&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.SCR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.BLK&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.MUS&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.TTM&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;activisi&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Compressed chunks, &amp;lt;tt&amp;gt;*.MAP&amp;lt;/tt&amp;gt;||[[Deathtrack Compression]]||Stored, RLE or LZW&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.BMP&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;BITMAPS.BLK&amp;lt;/tt&amp;gt;, bitmap in &amp;lt;tt&amp;gt;PALS.BLK&amp;lt;/tt&amp;gt;||[[Deathtrack Bitmap Format]]||Sprites, car parts and menu graphics (179 frames in total)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.SCR&amp;lt;/tt&amp;gt;, screen in &amp;lt;tt&amp;gt;activisi&amp;lt;/tt&amp;gt;||[[Deathtrack Screen Format]]||320&amp;amp;times;200 full-screen pictures (dashboards, cars, city picture)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;FONTS.BLK&amp;lt;/tt&amp;gt;||[[Dynamix Font Format v2-v3]] (v3)||Three fonts, see the notes below&lt;br /&gt;
|-&lt;br /&gt;
|Palettes in &amp;lt;tt&amp;gt;PALS.BLK&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;activisi&amp;lt;/tt&amp;gt;||[[Deathtrack Palette Format]]||EGA palette words plus CGA dither tables&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.MAP&amp;lt;/tt&amp;gt;||[[Deathtrack Skyline Map Format]]||Horizon skyline of each city (&#039;&#039;not&#039;&#039; a road map)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.TRK&amp;lt;/tt&amp;gt;||[[Deathtrack Track Format]]||Road centreline points and roadside objects&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;SHAPE.TBL&amp;lt;/tt&amp;gt;, driver and car &amp;lt;tt&amp;gt;*.TBL&amp;lt;/tt&amp;gt;||[[Deathtrack Model Format]]||3D polygon models&lt;br /&gt;
|-&lt;br /&gt;
|Sound effects in &amp;lt;tt&amp;gt;PALS.BLK&amp;lt;/tt&amp;gt;||[[Deathtrack Sound Effect Format]]||PC-speaker effect programs&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;DANGER.MUS&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;TRAX.MUS&amp;lt;/tt&amp;gt;||[[Deathtrack Music Format]]||Compressed [[MID Format|Standard MIDI Files]] for the MT-32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;TITLE.TTM&amp;lt;/tt&amp;gt;||[[Deathtrack Title Script Format]]||Script for the title sequence&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;HI_SCORE&amp;lt;/tt&amp;gt;||[[Deathtrack High Score Format]]||Ten names and winnings&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.RCT&amp;lt;/tt&amp;gt;||[[Deathtrack Save Game Format]]||Saved games, written by the game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* Integer fields are little-endian, except for the MIDI data inside the music files.&lt;br /&gt;
* A &amp;lt;tt&amp;gt;.BLK&amp;lt;/tt&amp;gt; file is a bundle of several resources, of the same type or of different types: &amp;lt;tt&amp;gt;PALS.BLK&amp;lt;/tt&amp;gt; holds the sound effects, two palettes and the mouse-pointer bitmap.&lt;br /&gt;
* &amp;lt;tt&amp;gt;FONTS.BLK&amp;lt;/tt&amp;gt; holds three consecutive uncompressed &amp;lt;tt&amp;gt;FNT:&amp;lt;/tt&amp;gt; chunks of 96 glyphs each, starting at character 32: 4&amp;amp;times;5, 6&amp;amp;times;6 and 8&amp;amp;times;8 pixels. The game uses the 8&amp;amp;times;8 font by default. The loader copies font data in 80-byte reads with an 8-bit loop counter, so a font smaller than 80 bytes would not load correctly (the shipped fonts are all larger).&lt;br /&gt;
* The game writes only two files: &amp;lt;tt&amp;gt;HI_SCORE&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;*.RCT&amp;lt;/tt&amp;gt; saved games. &amp;lt;tt&amp;gt;HI_SCORE&amp;lt;/tt&amp;gt; must exist, or the game will not get past the start.&lt;br /&gt;
* The chunk files, the compression and the model, track and skyline layouts have been checked against all shipped files: 92 files, 179 image frames, 136 models, ten tracks and 88 title-script commands.&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.decompile.tools/re-deathtrack/ re-deathtrack] &amp;amp;ndash; play the HTML5 port in your browser (load your own copy of the game files)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack re-deathtrack on GitHub] &amp;amp;ndash; source code, plus detailed reverse-engineering notes in the &amp;lt;tt&amp;gt;docs/&amp;lt;/tt&amp;gt; folder&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Intro Page]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Save_Game_Format&amp;diff=13051</id>
		<title>Deathtrack Save Game Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Save_Game_Format&amp;diff=13051"/>
		<updated>2026-11-02T20:57:11Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Playerdata Infobox  | Savegame = Yes  | Where = Hub  | Elements = Cash, per-driver records (most fields not yet identified)  | Games =    {{Game|Deathtrack}} }}  Saved games (&amp;#039;&amp;#039;race cards&amp;#039;&amp;#039;) are &amp;lt;code&amp;gt;.RCT&amp;lt;/code&amp;gt; files written to the current directory. The file is a plain 428-byte dump of the game&amp;#039;s data arrays. It is not compressed, does not use the chunk format, and has no checksum or encryption. No &amp;lt;code&amp;gt;.RCT&amp;lt;/code&amp;gt; file ships with the ga...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Playerdata Infobox&lt;br /&gt;
 | Savegame = Yes&lt;br /&gt;
 | Where = Hub&lt;br /&gt;
 | Elements = Cash, per-driver records (most fields not yet identified)&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Saved games (&#039;&#039;race cards&#039;&#039;) are &amp;lt;code&amp;gt;.RCT&amp;lt;/code&amp;gt; files written to the current directory. The file is a plain 428-byte dump of the game&#039;s data arrays. It is not compressed, does not use the [[Deathtrack Chunk Format|chunk format]], and has no checksum or encryption. No &amp;lt;code&amp;gt;.RCT&amp;lt;/code&amp;gt; file ships with the game.&lt;br /&gt;
&lt;br /&gt;
Most of the fields have not been given a meaning yet. The table below documents the layout; the &amp;quot;source&amp;quot; column lists the offsets in the game&#039;s data segment (DGROUP) that the values are copied from or to.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| char[4] || signature || &amp;lt;code&amp;gt;RAC:&amp;lt;/code&amp;gt;. On loading, only the first byte (&amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt;) and the fourth (&amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;) are checked&lt;br /&gt;
|-&lt;br /&gt;
| BYTE[424] || body || See below&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Body ===&lt;br /&gt;
&lt;br /&gt;
The body starts with ten records of 36 bytes (one per driver; index 0 is the player), each made of values taken from parallel arrays:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Record offset !! Data type !! Source (DS:) !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || UINT16LE || 96dc || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 2 || UINT16LE || 8e5c || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 4 || UINT16LE || 9b0e || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 6 || UINT16LE || a8c4 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 8 || UINT16LE || 9238 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 10 || UINT16LE || 9a86 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 12 || UINT16LE || 5c04 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 14 || UINT32LE || a22a || Cash/winnings&lt;br /&gt;
|-&lt;br /&gt;
| 18 || UINT16LE || 1c5c || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 20 || UINT16LE || 9aa6 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 22 || BYTE[10] || 9926 || Column of a 10&amp;amp;times;10 byte matrix&lt;br /&gt;
|-&lt;br /&gt;
| 32 || UINT16LE || 9b6c || unknown&lt;br /&gt;
|-&lt;br /&gt;
| 34 || UINT16LE || 1c48 || unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
At body offset 360 follow:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[6] || Words from DS:1fc8&amp;amp;ndash;1fd2&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[9] || Words from DS:1fd4&amp;amp;ndash;1fe4&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[10] || Words from DS:0d24, 8eb8, 9b0c, 115e, 1160, 0d28, a670, 8dac, 8eb6, aa9e. The word at 0d28 is incremented once per race; 8eb8 is shown as a two-digit number after a successful save&lt;br /&gt;
|-&lt;br /&gt;
| char[14] || Player name (the terminating NUL is not saved)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* The same routine reads and writes the body, selected through a function pointer, so the layout is symmetric.&lt;br /&gt;
* The game&#039;s file picker lists directories (marked &amp;lt;code&amp;gt;(DIR)&amp;lt;/code&amp;gt;) and &amp;lt;code&amp;gt;*.RCT&amp;lt;/code&amp;gt; files, up to 220 entries and without a bounds check.&lt;br /&gt;
* Error handling is incomplete: if the open fails the game still closes a null handle, and a short transfer leaves the file open. The result of the final 14-byte transfer is not checked.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#rct-save-file-428-bytes-static &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; save/load routine &amp;lt;code&amp;gt;1000:5368&amp;lt;/code&amp;gt;, picker &amp;lt;code&amp;gt;1000:4f28&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/game/flow.js &amp;lt;code&amp;gt;src/game/flow.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; translated implementation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_High_Score_Format&amp;diff=13050</id>
		<title>Deathtrack High Score Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_High_Score_Format&amp;diff=13050"/>
		<updated>2026-11-02T20:56:57Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Playerdata Infobox  | Config = Yes  | Storing = Scores  | Games =    {{Game|Deathtrack}} }}  &amp;lt;code&amp;gt;HI_SCORE&amp;lt;/code&amp;gt; stores the ten best players&amp;#039; names and winnings. It is one of the two files the game writes. The file is not compressed and has no header; the game refuses to dispatch to any screen if it is missing, so a copy must always be supplied.  == File format ==  The file is exactly 190 bytes: ten records of 19 bytes in file order.  {| class=&amp;quot;wikitable&amp;quot; ! Data type...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Playerdata Infobox&lt;br /&gt;
 | Config = Yes&lt;br /&gt;
 | Storing = Scores&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HI_SCORE&amp;lt;/code&amp;gt; stores the ten best players&#039; names and winnings. It is one of the two files the game writes. The file is not compressed and has no header; the game refuses to dispatch to any screen if it is missing, so a copy must always be supplied.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The file is exactly 190 bytes: ten records of 19 bytes in file order.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| char[15] || name || Player name, NUL-terminated within the field. Bytes after the NUL are leftovers of earlier names&lt;br /&gt;
|-&lt;br /&gt;
| UINT32LE || winnings || Money won, compared as an unsigned number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The game&#039;s built-in defaults are ten entries named &amp;lt;code&amp;gt;NEW KID&amp;lt;/code&amp;gt; (padded with spaces) with winnings 0.&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
* The table is &#039;&#039;&#039;not sorted&#039;&#039;&#039;. When a new score is added, the game looks for the lowest winnings (scanning from slot 9 down to slot 0, using a strict &amp;quot;less than&amp;quot;, so ties go to the highest index) and replaces that slot if it is lower than the new score.&lt;br /&gt;
* The name written is the 14-byte player name that is also saved in [[Deathtrack Save Game Format|saved games]].&lt;br /&gt;
* The game reads the file with &amp;lt;code&amp;gt;open(path, O_RDONLY|O_BINARY)&amp;lt;/code&amp;gt; and writes it with &amp;lt;code&amp;gt;O_WRONLY|O_CREAT|O_TRUNC|O_BINARY&amp;lt;/code&amp;gt;. Read results are not checked.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/decode.js &amp;lt;code&amp;gt;src/viewer/decode.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;highScores()&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#writes-save-games-and-hi_score &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; load &amp;lt;code&amp;gt;1000:5136&amp;lt;/code&amp;gt;, save &amp;lt;code&amp;gt;1000:51bc&amp;lt;/code&amp;gt;, insert &amp;lt;code&amp;gt;1000:25bc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Title_Script_Format&amp;diff=13049</id>
		<title>Deathtrack Title Script Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Title_Script_Format&amp;diff=13049"/>
		<updated>2026-11-02T20:56:27Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Cutscene Infobox  | Hardware1 = EGA  | Resolution = 320&amp;amp;times;200  | Games =    {{Game|Deathtrack}} }}  &amp;lt;code&amp;gt;TITLE.TTM&amp;lt;/code&amp;gt; is the script that drives the title sequence: it loads the Dynamix logo, the city skyline and the title picture, sets up palettes and fonts, and then draws, fades and dissolves them with timed steps. The file is a single compressed &amp;lt;code&amp;gt;TTM:&amp;lt;/code&amp;gt; leaf chunk of the resource chunk format. Decoded, it is 477 bytes lo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Cutscene Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Resolution = 320&amp;amp;times;200&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TITLE.TTM&amp;lt;/code&amp;gt; is the script that drives the title sequence: it loads the Dynamix logo, the city skyline and the title picture, sets up palettes and fonts, and then draws, fades and dissolves them with timed steps. The file is a single compressed &amp;lt;code&amp;gt;TTM:&amp;lt;/code&amp;gt; leaf chunk of the [[Deathtrack Chunk Format|resource chunk format]]. Decoded, it is 477 bytes long and consists of 88 commands in 13 parts.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| char[4] || tag || &amp;lt;code&amp;gt;TTM:&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UINT32LE || length || Payload length (bit 31 clear)&lt;br /&gt;
|-&lt;br /&gt;
| BYTE[length] || payload || [[Deathtrack Compression|Compression envelope]] followed by the encoded script&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
&lt;br /&gt;
The decoded script is a sequence of commands. Each begins with an opcode byte that is usually an ASCII character; operands follow immediately. A script is split into &#039;&#039;parts&#039;&#039; by the &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; command; the interpreter runs one part at a time.&lt;br /&gt;
&lt;br /&gt;
There are three operand shapes:&lt;br /&gt;
&lt;br /&gt;
* a NUL-terminated file name (resource commands),&lt;br /&gt;
* no operands,&lt;br /&gt;
* a fixed number (1, 2 or 4) of INT16LE words.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode !! Name !! Operands&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || Load screen || NUL-terminated name, e.g. &amp;lt;code&amp;gt;CITYPIC.SCR&amp;lt;/code&amp;gt; ([[Deathtrack Screen Format]])&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || Load bitmap || NUL-terminated name, e.g. &amp;lt;code&amp;gt;DYNAMIX.BMP&amp;lt;/code&amp;gt; ([[Deathtrack Bitmap Format]])&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || Load font || NUL-terminated name ([[Dynamix Font Format v2-v3]])&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || Load palette || NUL-terminated name ([[Deathtrack Palette Format]])&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || Select bitmap slot || 1 word&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt; || Select palette slot || 1 word&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt; || Select font slot || 1 word&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0B&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x0C&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x0D&amp;lt;/code&amp;gt; || Free palette / bitmap / font || none&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; || Activision logo || 2 words (the interpreter skips them and runs the logo routine, which loads the &amp;lt;code&amp;gt;activisi&amp;lt;/code&amp;gt; file)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; || Set frame delay || 1 word&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt; || Set step delay || 1 word&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Clip rectangle || 4 words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt; || Select frame || 1 word&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Draw frame || 4 words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Circle outline || 4 words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Filled circle || 4 words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Line || 4 words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Fill rectangle || 4 words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Fill rectangle (solid) || 4 words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt;&amp;amp;ndash;&amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Screen transitions || 4 words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt; || Set foreground/background colour || 2 words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt; || Border colour || 1 word&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; || Present page || none&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt; || Dissolve screen || none&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; || No-op || 1 word&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; || End of part || none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The commands &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; take no operands. Any other opcode from &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; takes four words and is treated as an indexed drawing opcode; the runtime may stop on opcodes that it does not implement.&lt;br /&gt;
&lt;br /&gt;
The decoded &amp;lt;code&amp;gt;TITLE.TTM&amp;lt;/code&amp;gt; references &amp;lt;code&amp;gt;DYNAMIX.BMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CITYLINE.BMP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TITLE.BMP&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;CITYPIC.SCR&amp;lt;/code&amp;gt;. All 477 bytes are consumed by the command sizes above.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/decode.js &amp;lt;code&amp;gt;src/viewer/decode.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;titleScript()&amp;lt;/code&amp;gt; disassembler&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/game/seg2524.js &amp;lt;code&amp;gt;src/game/seg2524.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; translated indexer (&amp;lt;code&amp;gt;2524:0a7c&amp;lt;/code&amp;gt;) and interpreter (&amp;lt;code&amp;gt;2524:0c66&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#ttm-script-titlettm &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;loadTtm&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;2524:08de&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Music_Format&amp;diff=13048</id>
		<title>Deathtrack Music Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Music_Format&amp;diff=13048"/>
		<updated>2026-11-02T20:56:04Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Music Infobox  | Type = MIDI  | Instruments = Roland  | Instruments2 = OPL  | NumChannels = 16  | NumTracks = 1  | NumPatterns = 1  | NumOrders = 0  | Tags = None  | Games =    {{Game|Deathtrack}} }}  &amp;lt;code&amp;gt;DANGER.MUS&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TRAX.MUS&amp;lt;/code&amp;gt; are the two music tracks of Deathtrack. Each file is a single compressed chunk containing a complete Standard MIDI File written for the Roland MT-32. The game has separate music drivers for the MPU-401/M...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Music Infobox&lt;br /&gt;
 | Type = MIDI&lt;br /&gt;
 | Instruments = Roland&lt;br /&gt;
 | Instruments2 = OPL&lt;br /&gt;
 | NumChannels = 16&lt;br /&gt;
 | NumTracks = 1&lt;br /&gt;
 | NumPatterns = 1&lt;br /&gt;
 | NumOrders = 0&lt;br /&gt;
 | Tags = None&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DANGER.MUS&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TRAX.MUS&amp;lt;/code&amp;gt; are the two music tracks of [[Deathtrack]]. Each file is a single compressed chunk containing a complete [[MID Format|Standard MIDI File]] written for the Roland MT-32. The game has separate music drivers for the MPU-401/MT-32 and for AdLib; both are fed from this data.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The file is a top-level leaf chunk (not a container) of the [[Deathtrack Chunk Format|resource chunk format]]:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| char[4] || tag || &amp;lt;code&amp;gt;SND:&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UINT32LE || length || Payload length (bit 31 clear)&lt;br /&gt;
|-&lt;br /&gt;
| BYTE[length] || payload || [[Deathtrack Compression|Compression envelope]] followed by the encoded MIDI file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The decoded data is a Standard MIDI File, format 0, one track, 96 ticks per quarter note. MIDI header fields are big-endian. The files contain Roland SysEx to program MT-32 timbres, so on General MIDI synthesisers the instruments sound different.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! MIDI bytes !! Notes !! Duration&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DANGER.MUS&amp;lt;/code&amp;gt; || 2,807 || 299 || 32.2 s&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TRAX.MUS&amp;lt;/code&amp;gt; || 44,814 || 5,924 || 99.5 s&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The decoded file must fit in 64 KiB: the game reads it with a single 16-bit read. The MT-32 driver forwards the MIDI bytes through the MPU-401 UART. How the AdLib driver maps the MIDI events to OPL2 instruments is documented in the port&#039;s hardware notes.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/game/music.js &amp;lt;code&amp;gt;src/game/music.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; translated music sequencer&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/audio.js &amp;lt;code&amp;gt;src/audio.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;midiNotes()&amp;lt;/code&amp;gt;, note extraction and audition&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#music-mus &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;loadMusic&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;2524:4b34&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/hardware-paths.md &amp;lt;code&amp;gt;docs/re/hardware-paths.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; AdLib and MT-32 paths&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Sound_Effect_Format&amp;diff=13047</id>
		<title>Deathtrack Sound Effect Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Sound_Effect_Format&amp;diff=13047"/>
		<updated>2026-11-02T20:55:45Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Sound Infobox  | Type = PC Speaker  | Count = 11  | Rate = N/A  | NumChannels = 1  | Compressed = Y  | Tags = None  | Games =    {{Game|Deathtrack}} }}  The eleven sound effects of Deathtrack are small programs for a PC-speaker interpreter, stored in the &amp;lt;code&amp;gt;SND:&amp;lt;/code&amp;gt; container at the start of &amp;lt;code&amp;gt;PALS.BLK&amp;lt;/code&amp;gt;. They are &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; samples. Even when AdLib or MT-32 music is selected, effects play on the PC speaker; only the interpreter&amp;#039;s tick rate differs be...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Sound Infobox&lt;br /&gt;
 | Type = PC Speaker&lt;br /&gt;
 | Count = 11&lt;br /&gt;
 | Rate = N/A&lt;br /&gt;
 | NumChannels = 1&lt;br /&gt;
 | Compressed = Y&lt;br /&gt;
 | Tags = None&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The eleven sound effects of [[Deathtrack]] are small programs for a PC-speaker interpreter, stored in the &amp;lt;code&amp;gt;SND:&amp;lt;/code&amp;gt; container at the start of &amp;lt;code&amp;gt;PALS.BLK&amp;lt;/code&amp;gt;. They are &#039;&#039;&#039;not&#039;&#039;&#039; samples. Even when AdLib or MT-32 music is selected, effects play on the PC speaker; only the interpreter&#039;s tick rate differs between the devices.&lt;br /&gt;
&lt;br /&gt;
The container is the [[Deathtrack Chunk Format|resource chunk format]].&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PALS.BLK&amp;lt;/code&amp;gt; starts with the following chunks:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Chunk !! Contents&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SND:INF:&amp;lt;/code&amp;gt; (6 bytes) || Three UINT16LE words&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SND:IBM:&amp;lt;/code&amp;gt; (506 bytes) || [[Deathtrack Compression|Enveloped]] bank, 501 bytes after decoding&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SND:ITM:&amp;lt;/code&amp;gt; || Optional second bank; &#039;&#039;not present&#039;&#039; in the shipped file&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SND:INF: ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || unused || Discarded by the loader (&amp;lt;code&amp;gt;0x59D9&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || count || Number of effects (11)&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || reserved || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SND:IBM: (decoded) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT32LE[count] || offsets || Offset of each effect stream from the start of the decoded block. The game adds the block&#039;s address to every non-zero entry&lt;br /&gt;
|-&lt;br /&gt;
| STREAM[count] || streams || Effect streams&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Stream ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || type || 0 in all effects&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || length || Length field (see the source code for how it is used)&lt;br /&gt;
|-&lt;br /&gt;
| UINT32LE || reserved || 0&lt;br /&gt;
|-&lt;br /&gt;
| COMMAND[] || commands || Voice program, ends when a &#039;&#039;duration&#039;&#039; command with value 0 is executed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Commands ===&lt;br /&gt;
&lt;br /&gt;
A command is a byte whose value is masked with &amp;lt;code&amp;gt;0x7E&amp;lt;/code&amp;gt; to give the opcode; all commands except &#039;&#039;hold&#039;&#039; are followed by a UINT16LE operand. The effect interpreter is a four-voice priority system that runs on every timer interrupt.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Opcode !! Name !! Operand&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || Duration || UINT16LE; a value of 0 ends the voice&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || PIT divisor || UINT16LE&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || Pitch slide || UINT16LE (signed)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || Gate || UINT16LE&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || Gate slide || UINT16LE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || Phase step || UINT16LE&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || Wave depth || UINT16LE&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || Loop counter || UINT16LE&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || Wave select || UINT16LE&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || Relative call || UINT16LE (relative offset)&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || Hold || &#039;&#039;none&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || Relative loop || UINT16LE (relative offset)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The names are those used by the port&#039;s analysis; the exact per-tick behaviour of each field is defined by the translated interpreter in &amp;lt;code&amp;gt;src/game/sfx.js&amp;lt;/code&amp;gt; and the notes in &amp;lt;code&amp;gt;docs/re/input-timer-sound.md&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Comparisons and wrap-around are signed or unsigned depending on the opcode, so an exact implementation should follow the translated interpreter. The wave-select command reads a table (&amp;lt;code&amp;gt;ITM&amp;lt;/code&amp;gt;) that is missing in the shipped bank; the original reads bytes relocated from the &amp;lt;code&amp;gt;IBM&amp;lt;/code&amp;gt; block instead.&lt;br /&gt;
&lt;br /&gt;
All eleven effects end. Streams 7 and 10 have trailing unreachable bytes. The tick rate depends on the music device: PC speaker 1193182/4096 Hz, AdLib 1193182/8192 Hz, MT-32 1193182/512 Hz.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/game/sfx.js &amp;lt;code&amp;gt;src/game/sfx.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; translated interpreter (&amp;lt;code&amp;gt;334e&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/decode.js &amp;lt;code&amp;gt;src/viewer/decode.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;soundBank()&amp;lt;/code&amp;gt; command listing&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/effects.js &amp;lt;code&amp;gt;src/viewer/effects.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; effect audition and WAV export&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#sound-effect-bank-palsblk-snd &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; loader &amp;lt;code&amp;gt;32e3:009a&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/input-timer-sound.md &amp;lt;code&amp;gt;docs/re/input-timer-sound.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; effect tick&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Model_Format&amp;diff=13046</id>
		<title>Deathtrack Model Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Model_Format&amp;diff=13046"/>
		<updated>2026-11-02T20:55:24Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{3D Model Infobox  | Type = Polygon  | MaxVertices = 255  | Games =    {{Game|Deathtrack}} }}  All 3D objects in Deathtrack &amp;amp;ndash; cars, buildings, roadside objects &amp;amp;ndash; are polygon meshes stored in &amp;lt;code&amp;gt;.TBL&amp;lt;/code&amp;gt; files. &amp;lt;code&amp;gt;SHAPE.TBL&amp;lt;/code&amp;gt; holds 124 models; each of the nine driver files (&amp;lt;code&amp;gt;SLY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MEGA&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ANGEL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LURKER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MENACE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CRIMSON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MANIAC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WRECKER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{3D Model Infobox&lt;br /&gt;
 | Type = Polygon&lt;br /&gt;
 | MaxVertices = 255&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
All 3D objects in [[Deathtrack]] &amp;amp;ndash; cars, buildings, roadside objects &amp;amp;ndash; are polygon meshes stored in &amp;lt;code&amp;gt;.TBL&amp;lt;/code&amp;gt; files. &amp;lt;code&amp;gt;SHAPE.TBL&amp;lt;/code&amp;gt; holds 124 models; each of the nine driver files (&amp;lt;code&amp;gt;SLY&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MEGA&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ANGEL&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LURKER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MENACE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CRIMSON&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MANIAC&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WRECKER&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MELISSA&amp;lt;/code&amp;gt;) and the three player-car files (&amp;lt;code&amp;gt;MYCAR0&amp;amp;ndash;2&amp;lt;/code&amp;gt;) holds one model. The 13 files contain 136 models, 1,195 groups and 3,525 faces in total.&lt;br /&gt;
&lt;br /&gt;
In a race, every car and object is taken from &amp;lt;code&amp;gt;SHAPE.TBL&amp;lt;/code&amp;gt;; the driver and car files are only used for the previews in the shops. The files do not contain car statistics.&lt;br /&gt;
&lt;br /&gt;
The files are not compressed and do not use the [[Deathtrack Chunk Format|chunk format]]. The [[Deathtrack Track Format|&amp;lt;code&amp;gt;.TRK&amp;lt;/code&amp;gt; files]] refer to the models of &amp;lt;code&amp;gt;SHAPE.TBL&amp;lt;/code&amp;gt; by index.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
=== Model table ===&lt;br /&gt;
&lt;br /&gt;
The file starts with a table of far pointers, ended by a zero dword:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || offset || Offset part&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || paragraph || Paragraph part. The model&#039;s file offset is &amp;lt;code&amp;gt;paragraph &amp;amp;times; 16 + offset&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SHAPE.TBL&amp;lt;/code&amp;gt; has 124 entries (&amp;lt;code&amp;gt;paragraph:0000&amp;lt;/code&amp;gt;, the table is padded to 0x200); a car or driver file has one entry (&amp;lt;code&amp;gt;0001:0000&amp;lt;/code&amp;gt;). The game relocates the table to real segments after loading.&lt;br /&gt;
&lt;br /&gt;
=== Model ===&lt;br /&gt;
&lt;br /&gt;
All offsets below are relative to the start of the model.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || INT16LE || radius || Bounding radius&lt;br /&gt;
|-&lt;br /&gt;
| 2 || UINT8 || reserved || Always 0&lt;br /&gt;
|-&lt;br /&gt;
| 3 || UINT8 || vertexCount || Number of vertices including normal vectors&lt;br /&gt;
|-&lt;br /&gt;
| 4 || UINT16LE || vertexOffset || Offset of the vertex array (always the last block)&lt;br /&gt;
|-&lt;br /&gt;
| 6 || LOD[] || lods || Level-of-detail entries, ended by &amp;lt;code&amp;gt;0xFFFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LOD entry ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| INT16LE || threshold || The first entry whose threshold is less than or equal to the current detail setting is used&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || detailOffset || Offset of the detail block&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Every shipped model has exactly one entry: &amp;lt;code&amp;gt;(1, 0x000C)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Vertex array ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vertexCount&amp;lt;/code&amp;gt; records of three INT16LE values (x, y, z). Normal vectors are stored as vertices too and are referenced by faces.&lt;br /&gt;
&lt;br /&gt;
==== Detail block ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || flags || Bit 7 = draw nothing&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || referenceVertex || Reference vertex&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[] || groupOffsets || Offsets of the groups, ended by &amp;lt;code&amp;gt;0xFFFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || flags || 0, 0x80 or 0xC0; no reader has been found&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || sortVertex || Vertex used to sort the groups from far to near (32-bit dot product)&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[] || faceOffsets || Offsets of the faces, ended by &amp;lt;code&amp;gt;0xFFFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Face ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || normal || Index of the normal vertex used for the back-face test; &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt; = two-sided&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || colour1 || Colour, through the model&#039;s colour map&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || colour2 || Second colour (dither pair)&lt;br /&gt;
|-&lt;br /&gt;
| UINT8[] || indices || Vertex indices, ended by &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A face is drawn when the dot product of the normal with the viewing vector is negative.&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
&lt;br /&gt;
Vertices are rotated with a Q14 3&amp;amp;times;3 matrix and projected with &amp;lt;code&amp;gt;sx = cx + (x&#039; &amp;lt;&amp;lt; s) / y&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sy = cy &amp;amp;minus; (z&#039; &amp;lt;&amp;lt; s) / y&#039;&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; is set to 7 when &amp;lt;code&amp;gt;SHAPE.TBL&amp;lt;/code&amp;gt; is loaded); faces nearer than the near plane are clipped.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/decode.js &amp;lt;code&amp;gt;src/viewer/decode.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;models()&amp;lt;/code&amp;gt; validating parser&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/geometry.js &amp;lt;code&amp;gt;src/viewer/geometry.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; orthographic inspection renderer&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/game/render3d.js &amp;lt;code&amp;gt;src/game/render3d.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; translated transform and projection (&amp;lt;code&amp;gt;2c46&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#tbl-shapetbl-driver-and-car-tables &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;]&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/vehicle-editor.md &amp;lt;code&amp;gt;docs/vehicle-editor.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; Vehicle Foundry editor&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Track_Format&amp;diff=13045</id>
		<title>Deathtrack Track Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Track_Format&amp;diff=13045"/>
		<updated>2026-11-02T20:55:10Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Map Infobox  | Type = 3D road centreline (closed loop of points)  | Layers = 1  | Games =    {{Game|Deathtrack}} }}  Each of the ten cities has a &amp;lt;code&amp;gt;.TRK&amp;lt;/code&amp;gt; file that holds the road&amp;#039;s centreline as a series of 3D points, plus a list of roadside objects. The file is not compressed and does not use the chunk format: the &amp;lt;code&amp;gt;TRK:&amp;lt;/code&amp;gt; signature is just a four-byte tag. The skyline is in the Deathtrack Skyline Map Format|&amp;lt;code&amp;gt;.MAP&amp;lt;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Map Infobox&lt;br /&gt;
 | Type = 3D road centreline (closed loop of points)&lt;br /&gt;
 | Layers = 1&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Each of the ten cities has a &amp;lt;code&amp;gt;.TRK&amp;lt;/code&amp;gt; file that holds the road&#039;s centreline as a series of 3D points, plus a list of roadside objects. The file is not compressed and does not use the [[Deathtrack Chunk Format|chunk format]]: the &amp;lt;code&amp;gt;TRK:&amp;lt;/code&amp;gt; signature is just a four-byte tag. The skyline is in the [[Deathtrack Skyline Map Format|&amp;lt;code&amp;gt;.MAP&amp;lt;/code&amp;gt; file]] of the same name and the objects are models from &amp;lt;code&amp;gt;SHAPE.TBL&amp;lt;/code&amp;gt; ([[Deathtrack Model Format]]).&lt;br /&gt;
&lt;br /&gt;
The file size is exactly &amp;lt;code&amp;gt;6 + 4&amp;amp;times;N + 6&amp;amp;times;P&amp;lt;/code&amp;gt; bytes, with &#039;&#039;N&#039;&#039; objects and &#039;&#039;P&#039;&#039; point records.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| char[4] || signature || &amp;lt;code&amp;gt;TRK:&amp;lt;/code&amp;gt;. The game only checks that the first byte is &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; and the fourth is &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| INT16LE || objectCount || Number of roadside objects &#039;&#039;N&#039;&#039; (11&amp;amp;ndash;19 in the shipped tracks)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Object list ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;N&#039;&#039; records follow:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || pointIndex || Index of the track point the object is attached to&lt;br /&gt;
|-&lt;br /&gt;
| INT16LE || shape || Sign selects the side (positive = left, zero or negative = right); the absolute value is an index into &amp;lt;code&amp;gt;SHAPE.TBL&amp;lt;/code&amp;gt; (0&amp;amp;ndash;123)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Points ===&lt;br /&gt;
&lt;br /&gt;
The rest of the file is a list of 6-byte records up to the end of the file:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| INT16LE || x || Position&lt;br /&gt;
|-&lt;br /&gt;
| INT16LE || y || Position&lt;br /&gt;
|-&lt;br /&gt;
| INT16LE || z || Height (&amp;amp;minus;1 to 200)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* The points form a closed loop, about 30 units apart. The shipped tracks have 877&amp;amp;ndash;1,892 retained points.&lt;br /&gt;
* From the third record onward, a record in which all three words are zero is dropped by the loader and not counted.&lt;br /&gt;
* The game does not check the number of points. The space reserved for them holds 1,908 points; the largest track (&amp;lt;code&amp;gt;orlando&amp;lt;/code&amp;gt;) has 1,892.&lt;br /&gt;
&lt;br /&gt;
=== Object placement ===&lt;br /&gt;
&lt;br /&gt;
For the object at point &#039;&#039;p&#039;&#039; with successor &#039;&#039;q&#039;&#039;, the position is&lt;br /&gt;
&lt;br /&gt;
* left side: x = p.x + 8&amp;amp;times;(p.y &amp;amp;minus; q.y), y = p.y + 8&amp;amp;times;(q.x &amp;amp;minus; p.x)&lt;br /&gt;
* right side: the lateral displacement has the opposite sign&lt;br /&gt;
* z = p.z&lt;br /&gt;
&lt;br /&gt;
The pitch is derived from the height difference to the next point, the heading is the track heading minus 90&amp;amp;deg;. Models with an index of 11 or lower are replaced by model 3 beyond a distance of 50 units.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/decode.js &amp;lt;code&amp;gt;src/viewer/decode.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;track()&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/game/flow.js &amp;lt;code&amp;gt;src/game/flow.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; loader (&amp;lt;code&amp;gt;1000:4fae&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#trk &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;]&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/track-editor.md &amp;lt;code&amp;gt;docs/track-editor.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; Circuit Lab track editor&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Skyline_Map_Format&amp;diff=13044</id>
		<title>Deathtrack Skyline Map Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Skyline_Map_Format&amp;diff=13044"/>
		<updated>2026-11-02T20:54:54Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = EGA  | Hardware2 = CGA  | Depth = 4-bit (EGA)  | MinSize = 1920&amp;amp;times;25  | MaxSize = 1920&amp;amp;times;25  | Palette = Shared  | NumPlanes = 1  | HasTransparency = N  | HasHitmap = No  | Games =    {{Game|Deathtrack}} }}  Despite the name, the ten &amp;lt;code&amp;gt;.MAP&amp;lt;/code&amp;gt; files (one per city) are &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; road maps. Each file holds the horizon skyline that is drawn behind the road during a race. The road itself is described by the Deathtrack Track Fo...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = CGA&lt;br /&gt;
 | Depth = 4-bit (EGA)&lt;br /&gt;
 | MinSize = 1920&amp;amp;times;25&lt;br /&gt;
 | MaxSize = 1920&amp;amp;times;25&lt;br /&gt;
 | Palette = Shared&lt;br /&gt;
 | NumPlanes = 1&lt;br /&gt;
 | HasTransparency = N&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Despite the name, the ten &amp;lt;code&amp;gt;.MAP&amp;lt;/code&amp;gt; files (one per city) are &#039;&#039;&#039;not&#039;&#039;&#039; road maps. Each file holds the horizon skyline that is drawn behind the road during a race. The road itself is described by the [[Deathtrack Track Format|&amp;lt;code&amp;gt;.TRK&amp;lt;/code&amp;gt; file]] of the same name.&lt;br /&gt;
&lt;br /&gt;
The whole file is one [[Deathtrack Compression|compression envelope]] (method 2, LZW); there are no chunk headers.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The decoded data is always 24,026 bytes.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || count || Number of strips &#039;&#039;N&#039;&#039; (6)&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[N] || widths || Strip width in &#039;&#039;&#039;bytes&#039;&#039;&#039; (160 = 320 pixels)&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[N] || heights || Strip height in pixels (25)&lt;br /&gt;
|-&lt;br /&gt;
| BYTE[N][width &amp;amp;times; height] || strips || Packed 4-bpp pixels, high nibble first, 160 bytes per row; 4,000 bytes per strip&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The six strips are 320&amp;amp;times;25 each. Placed side by side they form a 1920&amp;amp;times;25 panorama; the renderer picks the strip from the camera heading (&amp;lt;code&amp;gt;x / 320 mod 6&amp;lt;/code&amp;gt;), so the skyline wraps around.&lt;br /&gt;
&lt;br /&gt;
In the original, the heights overwrite the width table in memory after loading (a harmless quirk).&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/decode.js &amp;lt;code&amp;gt;src/viewer/decode.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;skyline()&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/game/flow.js &amp;lt;code&amp;gt;src/game/flow.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; loader (&amp;lt;code&amp;gt;1000:1208&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/game/render3d.js &amp;lt;code&amp;gt;src/game/render3d.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; strip drawing (&amp;lt;code&amp;gt;2f73:000f&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#map &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Screen_Format&amp;diff=13043</id>
		<title>Deathtrack Screen Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Screen_Format&amp;diff=13043"/>
		<updated>2026-11-02T20:54:35Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = EGA  | Hardware2 = CGA  | Depth = 4-bit (EGA)  | MinSize = 320&amp;amp;times;200  | MaxSize = 320&amp;amp;times;200  | Palette = Shared  | NumPlanes = 1  | HasTransparency = N  | HasHitmap = No  | Games =    {{Game|Deathtrack}} }}  &amp;lt;code&amp;gt;.SCR&amp;lt;/code&amp;gt; files hold full-screen pictures: the dashboards (&amp;lt;code&amp;gt;DASH0&amp;amp;ndash;2.SCR&amp;lt;/code&amp;gt;), the car selection screens (&amp;lt;code&amp;gt;CAR1&amp;amp;ndash;3.SCR&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;CITYPIC.SCR&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;POSTWAR.SCR&amp;lt;/code&amp;gt;. The Activision...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = CGA&lt;br /&gt;
 | Depth = 4-bit (EGA)&lt;br /&gt;
 | MinSize = 320&amp;amp;times;200&lt;br /&gt;
 | MaxSize = 320&amp;amp;times;200&lt;br /&gt;
 | Palette = Shared&lt;br /&gt;
 | NumPlanes = 1&lt;br /&gt;
 | HasTransparency = N&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;.SCR&amp;lt;/code&amp;gt; files hold full-screen pictures: the dashboards (&amp;lt;code&amp;gt;DASH0&amp;amp;ndash;2.SCR&amp;lt;/code&amp;gt;), the car selection screens (&amp;lt;code&amp;gt;CAR1&amp;amp;ndash;3.SCR&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;CITYPIC.SCR&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;POSTWAR.SCR&amp;lt;/code&amp;gt;. The Activision logo screen in the file &amp;lt;code&amp;gt;activisi&amp;lt;/code&amp;gt; uses the same chunk after a [[Deathtrack Palette Format|palette]].&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
An &amp;lt;code&amp;gt;SCR:&amp;lt;/code&amp;gt; container has a single leaf chunk, &amp;lt;code&amp;gt;BIN:&amp;lt;/code&amp;gt;. There is no &amp;lt;code&amp;gt;INF:&amp;lt;/code&amp;gt; chunk &amp;amp;ndash; the size is fixed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || method || [[Deathtrack Compression|Compression envelope]]&lt;br /&gt;
|-&lt;br /&gt;
| UINT32LE || decodedSize || Always 32000&lt;br /&gt;
|-&lt;br /&gt;
| BYTE[32000] || pixels || 320&amp;amp;times;200 pixels, 4 bits per pixel, high nibble first, 160 bytes per row, top to bottom&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The game reads the data in blocks of whole rows and copies them to the display page. The &amp;lt;code&amp;gt;SCR:VGA:&amp;lt;/code&amp;gt; chunk that the loader can look for is not present in any shipped file and is skipped on EGA.&lt;br /&gt;
&lt;br /&gt;
The colours are indices into the active [[Deathtrack Palette Format|palette]]; &amp;lt;code&amp;gt;pals.blk&amp;lt;/code&amp;gt; supplies the default one.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/formats.js &amp;lt;code&amp;gt;src/formats.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;images()&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#screen-scr-activisi-scr &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;loadScreen&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1ff8:2fca&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Palette_Format&amp;diff=13042</id>
		<title>Deathtrack Palette Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Palette_Format&amp;diff=13042"/>
		<updated>2026-11-02T20:54:12Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Palette Infobox  | Hardware = EGA  | Depth = 4-bit (IRGB)  | Count = 16  | Games =    {{Game|Deathtrack}} }}  Palettes are stored as &amp;lt;code&amp;gt;PAL:&amp;lt;/code&amp;gt; containers in &amp;lt;code&amp;gt;PALS.BLK&amp;lt;/code&amp;gt; (two palettes) and in the &amp;lt;code&amp;gt;activisi&amp;lt;/code&amp;gt; logo file (one palette). Each palette has an &amp;lt;code&amp;gt;EGA:&amp;lt;/code&amp;gt; chunk and a &amp;lt;code&amp;gt;CGA:&amp;lt;/code&amp;gt; chunk; the game reads the one that matches the video adapter. Both leaves are stored without compression. The container is the Deathtrack Chunk...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Palette Infobox&lt;br /&gt;
 | Hardware = EGA&lt;br /&gt;
 | Depth = 4-bit (IRGB)&lt;br /&gt;
 | Count = 16&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Palettes are stored as &amp;lt;code&amp;gt;PAL:&amp;lt;/code&amp;gt; containers in &amp;lt;code&amp;gt;PALS.BLK&amp;lt;/code&amp;gt; (two palettes) and in the &amp;lt;code&amp;gt;activisi&amp;lt;/code&amp;gt; logo file (one palette). Each palette has an &amp;lt;code&amp;gt;EGA:&amp;lt;/code&amp;gt; chunk and a &amp;lt;code&amp;gt;CGA:&amp;lt;/code&amp;gt; chunk; the game reads the one that matches the video adapter. Both leaves are stored without compression. The container is the [[Deathtrack Chunk Format|resource chunk format]].&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
=== PAL:EGA: ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[64] || words || 64 palette words (128 bytes)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On loading, the game transforms each word to &amp;lt;code&amp;gt;(lo &amp;amp; 0x0F) | ((hi &amp;gt;&amp;gt; 4) &amp;lt;&amp;lt; 8)&amp;lt;/code&amp;gt; and stores words 0&amp;amp;ndash;31 and words 32&amp;amp;ndash;63 in two separate tables.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Words 0&amp;amp;ndash;15&#039;&#039;&#039; are the 16 EGA colours. The low nibble is a 4-bit IRGB value (intensity, red, green, blue); the colour 6 is brown, as on a real EGA. Values 8&amp;amp;ndash;15 are programmed as the intensified attribute codes 0x10&amp;amp;ndash;0x17 in the 200-line mode.&lt;br /&gt;
* &#039;&#039;&#039;Words 16&amp;amp;ndash;31&#039;&#039;&#039; (and 48&amp;amp;ndash;63) provide logical colours 16&amp;amp;ndash;31, which the renderer uses as 2&amp;amp;times;2 ordered dither pairs: the high and low bytes select the even/odd column, the two tables select the even/odd row.&lt;br /&gt;
&lt;br /&gt;
The first 16 colours are activated through the BIOS attribute registers (INT 10h AX=1000h). Standard EGA colours are #000000, #0000AA, #00AA00, #00AAAA, #AA0000, #AA00AA, #AA5500, #AAAAAA, #555555, #5555FF, #55FF55, #55FFFF, #FF5555, #FF55FF, #FFFF55, #FFFFFF for indices 0&amp;amp;ndash;15.&lt;br /&gt;
&lt;br /&gt;
=== PAL:CGA: ===&lt;br /&gt;
&lt;br /&gt;
162 bytes, read only by the CGA driver (&amp;lt;code&amp;gt;2fd2:0004&amp;lt;/code&amp;gt;) and ignored on EGA. The CGA path dithers the game&#039;s colours into 2-bit CGA pixel patterns. The tables fill the same colour-table slots as the words of &amp;lt;code&amp;gt;PAL:EGA:&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || unknown1 || Stored per palette; its use has not been documented&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || unknown2 || Stored per palette; its use has not been documented&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[32] || table1 || 16 words for even rows, then 16 words for odd rows (the slots of EGA words 0&amp;amp;ndash;31). The low byte of each word holds two 2-bit pixel patterns&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[32] || table2 || Same layout (the slots of EGA words 32&amp;amp;ndash;63)&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[16] || pixelBytes || Pixel bytes, one word per colour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Selecting a palette copies its three tables over the active ones. How each table is used by the drawing routines is described in the port&#039;s CGA driver source.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/decode.js &amp;lt;code&amp;gt;src/viewer/decode.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;palettes()&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/formats.js &amp;lt;code&amp;gt;src/formats.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;EGA&amp;lt;/code&amp;gt; colour table&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/game/cgadrv.js &amp;lt;code&amp;gt;src/game/cgadrv.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; CGA palette reader &amp;lt;code&amp;gt;2fd2:0004&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#palette-pal &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; loader &amp;lt;code&amp;gt;1ff8:3b7a&amp;lt;/code&amp;gt;, EGA driver &amp;lt;code&amp;gt;29f6:225b&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;29f6:22c9&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Bitmap_Format&amp;diff=13041</id>
		<title>Deathtrack Bitmap Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Bitmap_Format&amp;diff=13041"/>
		<updated>2026-11-02T20:53:58Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = EGA  | Hardware2 = CGA  | Depth = 4-bit (EGA)  | Palette = Shared  | NumPlanes = 1  | HasTransparency = P  | HasHitmap = No  | Games =    {{Game|Deathtrack}} }}  Sprites, car parts, menu graphics and panels in Deathtrack are stored as &amp;#039;&amp;#039;frame sets&amp;#039;&amp;#039; in &amp;lt;code&amp;gt;.BMP&amp;lt;/code&amp;gt; files. These are &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; Windows bitmaps. The same &amp;lt;code&amp;gt;BMP:&amp;lt;/code&amp;gt; container also appears five times in &amp;lt;code&amp;gt;BITMAPS.BLK&amp;lt;/code&amp;gt; (78 frames in total) and once in &amp;lt;co...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = CGA&lt;br /&gt;
 | Depth = 4-bit (EGA)&lt;br /&gt;
 | Palette = Shared&lt;br /&gt;
 | NumPlanes = 1&lt;br /&gt;
 | HasTransparency = P&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Sprites, car parts, menu graphics and panels in [[Deathtrack]] are stored as &#039;&#039;frame sets&#039;&#039; in &amp;lt;code&amp;gt;.BMP&amp;lt;/code&amp;gt; files. These are &#039;&#039;&#039;not&#039;&#039;&#039; Windows bitmaps. The same &amp;lt;code&amp;gt;BMP:&amp;lt;/code&amp;gt; container also appears five times in &amp;lt;code&amp;gt;BITMAPS.BLK&amp;lt;/code&amp;gt; (78 frames in total) and once in &amp;lt;code&amp;gt;PALS.BLK&amp;lt;/code&amp;gt; (three mouse-pointer frames). The 92 shipped files contain 179 frames altogether, counting the &amp;lt;code&amp;gt;SCR&amp;lt;/code&amp;gt; screens separately.&lt;br /&gt;
&lt;br /&gt;
The container is the [[Deathtrack Chunk Format|resource chunk format]]. Colours are indices into a [[Deathtrack Palette Format|palette]]; the image data itself has no palette.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;BMP:&amp;lt;/code&amp;gt; container holds two leaf chunks:&lt;br /&gt;
&lt;br /&gt;
=== BMP:INF: ===&lt;br /&gt;
&lt;br /&gt;
Not compressed. &#039;&#039;N&#039;&#039; is the number of frames.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE || count || Number of frames &#039;&#039;N&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[N] || widths || Width of each frame in pixels (all shipped widths are even)&lt;br /&gt;
|-&lt;br /&gt;
| UINT16LE[N] || heights || Height of each frame in pixels&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The widths are &#039;&#039;&#039;not&#039;&#039;&#039; interleaved with the heights: all widths come first, then all heights. The chunk length is therefore &amp;lt;code&amp;gt;2 + 4&amp;amp;times;N&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
&lt;br /&gt;
=== BMP:BIN: ===&lt;br /&gt;
&lt;br /&gt;
The chunk has the [[Deathtrack Compression|compression envelope]]. The decoded data is the pixel data of all frames, one after the other, with no padding between frames.&lt;br /&gt;
&lt;br /&gt;
* 4 bits per pixel, two pixels per byte, &#039;&#039;&#039;high nibble first&#039;&#039;&#039;.&lt;br /&gt;
* Rows are stored top to bottom with &amp;lt;code&amp;gt;width / 2&amp;lt;/code&amp;gt; bytes per row.&lt;br /&gt;
* Frame &#039;&#039;i&#039;&#039; occupies &amp;lt;code&amp;gt;width[i] / 2 &amp;amp;times; height[i]&amp;lt;/code&amp;gt; bytes.&lt;br /&gt;
* Colour 0&amp;amp;ndash;15 is the logical EGA colour; there is no separate transparency mask in the file. Colour 0 is transparent: the game&#039;s EGA conversion builds a one-bit mask for each frame as the NOR of the four bit planes, so exactly the pixels with colour 0 let the background through. (Full-screen pictures in the [[Deathtrack Screen Format|screen format]] are drawn opaque.)&lt;br /&gt;
&lt;br /&gt;
The game converts the data into EGA bit planes in video-memory scratch space, producing a 10-byte frame record per frame (segment, plane offset, mask offset, width, height). That in-memory record is not part of the file.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/viewer/decode.js &amp;lt;code&amp;gt;src/viewer/decode.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;packedImage()&amp;lt;/code&amp;gt; unpacks nibbles&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/formats.js &amp;lt;code&amp;gt;src/formats.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;images()&amp;lt;/code&amp;gt; reads &amp;lt;code&amp;gt;INF:&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;BIN:&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#bitmap-bmp-bitmapsblk-palsblk-bmp &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;loadBitmap&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;1ff8:0006&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Compression&amp;diff=13040</id>
		<title>Deathtrack Compression</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Compression&amp;diff=13040"/>
		<updated>2026-11-02T20:53:33Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Compression Infobox  | Type = Stream  | UnitSize = 1-byte (RLE), 1-bit (LZW)  | Games =    {{Game|Deathtrack}} }}  Compressed leaf chunks and the whole &amp;lt;code&amp;gt;.MAP&amp;lt;/code&amp;gt; files in Deathtrack start with a five-byte &amp;#039;&amp;#039;envelope&amp;#039;&amp;#039; that selects one of three methods: stored, RLE or a variable-width LZW. The scheme belongs to the same Dynamix family as the DGDS engine&amp;#039;s decompressors.  == File format ==  === Envelope ===  {| class=&amp;quot;wikitable&amp;quot; ! Data type !! Name !! Descrip...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Compression Infobox&lt;br /&gt;
 | Type = Stream&lt;br /&gt;
 | UnitSize = 1-byte (RLE), 1-bit (LZW)&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Compressed leaf chunks and the whole &amp;lt;code&amp;gt;.MAP&amp;lt;/code&amp;gt; files in [[Deathtrack]] start with a five-byte &#039;&#039;envelope&#039;&#039; that selects one of three methods: stored, RLE or a variable-width LZW. The scheme belongs to the same Dynamix family as the DGDS engine&#039;s decompressors.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
=== Envelope ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| UINT8 || method || 0 = stored, 1 = RLE, 2 = LZW; any other value makes the game&#039;s stream open fail&lt;br /&gt;
|-&lt;br /&gt;
| UINT32LE || decodedSize || Number of bytes after decompression&lt;br /&gt;
|-&lt;br /&gt;
| BYTE[] || data || Encoded stream (the rest of the chunk, or of the file for &amp;lt;code&amp;gt;.MAP&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The game&#039;s input limit includes the five header bytes. It stops when the input is exhausted and never checks the declared size; callers compare the result with &amp;lt;code&amp;gt;decodedSize&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Method 0: stored ===&lt;br /&gt;
&lt;br /&gt;
The bytes are copied unchanged.&lt;br /&gt;
&lt;br /&gt;
=== Method 1: RLE ===&lt;br /&gt;
&lt;br /&gt;
Read a control byte &#039;&#039;c&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Control !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0 || No operation&lt;br /&gt;
|-&lt;br /&gt;
| 1&amp;amp;ndash;127 || Copy the next &#039;&#039;c&#039;&#039; bytes literally&lt;br /&gt;
|-&lt;br /&gt;
| 128 || No operation&lt;br /&gt;
|-&lt;br /&gt;
| 129&amp;amp;ndash;255 || Read one byte and repeat it (&#039;&#039;c&#039;&#039; &amp;amp; 0x7F) times&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Method 2: LZW ===&lt;br /&gt;
&lt;br /&gt;
* Codes are packed least-significant bit first.&lt;br /&gt;
* The code width starts at 9 bits and grows to a maximum of 12 bits. The width grows when the next free dictionary index reaches the current limit.&lt;br /&gt;
* Codes 0&amp;amp;ndash;255 are literals, 256 is the &#039;&#039;reset&#039;&#039; code, and the first dictionary entry is 257.&lt;br /&gt;
* The &amp;quot;KwKwK&amp;quot; case (a code that is not yet in the dictionary) is handled in the usual way: the previous string plus its own first byte.&lt;br /&gt;
* Entries are added only while the dictionary has fewer than 4096 entries.&lt;br /&gt;
* The original reads codes in groups of &#039;&#039;width&#039;&#039; bytes (eight codes). Unread bits of a group are discarded when the width grows and after a reset code. In practice the width changes happen at multiples of eight codes, so only the reset code skips real padding bits &amp;amp;ndash; the padding after a reset is not the same as in GIF.&lt;br /&gt;
* After a reset code the width returns to 9 bits and the dictionary restarts. The original adds one unused dictionary slot (index 256) with the pre-reset code as prefix; since code 256 is always treated as a reset it is never referenced.&lt;br /&gt;
&lt;br /&gt;
All 58 LZW streams of the shipped game (every LZW leaf plus the ten maps, containing two reset codes) decode identically with the simple reference decoder in the source code below and with the translated original routines.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/formats.js &amp;lt;code&amp;gt;src/formats.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; &amp;lt;code&amp;gt;unpack()&amp;lt;/code&amp;gt;, a reference decoder (stops at the declared size)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#stream-codec-1ff805d2-20fe &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; analysis of the original stream codec at &amp;lt;code&amp;gt;1ff8:05d2&amp;amp;ndash;20fe&amp;lt;/code&amp;gt;&lt;br /&gt;
* ScummVM&#039;s [https://github.com/scummvm/scummvm/blob/master/engines/dgds/decompress.cpp DGDS decompressor] was consulted during the initial investigation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Chunk_Format&amp;diff=13039</id>
		<title>Deathtrack Chunk Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack_Chunk_Format&amp;diff=13039"/>
		<updated>2026-11-02T20:53:12Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Archive Infobox  | MaxFiles = Unlimited  | FAT = Embedded  | Names = N  | Metadata = None  | Subdirectories = Y  | Compressed = Y  | Encrypted = N  | Hidden = N  | Games =    {{Game|Deathtrack}} }}  The Dynamix resource chunk container is used by almost every data file in Deathtrack: bitmaps (&amp;lt;code&amp;gt;.BMP&amp;lt;/code&amp;gt;), full-screen images (&amp;lt;code&amp;gt;.SCR&amp;lt;/code&amp;gt;), the multi-resource &amp;lt;code&amp;gt;.BLK&amp;lt;/code&amp;gt; files, music (&amp;lt;code&amp;gt;.MUS&amp;lt;/code&amp;gt;), the title script (&amp;lt;code&amp;gt;.TTM&amp;lt;/code&amp;gt;) and the...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Archive Infobox&lt;br /&gt;
 | MaxFiles = Unlimited&lt;br /&gt;
 | FAT = Embedded&lt;br /&gt;
 | Names = N&lt;br /&gt;
 | Metadata = None&lt;br /&gt;
 | Subdirectories = Y&lt;br /&gt;
 | Compressed = Y&lt;br /&gt;
 | Encrypted = N&lt;br /&gt;
 | Hidden = N&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Deathtrack}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The Dynamix resource chunk container is used by almost every data file in [[Deathtrack]]: bitmaps (&amp;lt;code&amp;gt;.BMP&amp;lt;/code&amp;gt;), full-screen images (&amp;lt;code&amp;gt;.SCR&amp;lt;/code&amp;gt;), the multi-resource &amp;lt;code&amp;gt;.BLK&amp;lt;/code&amp;gt; files, music (&amp;lt;code&amp;gt;.MUS&amp;lt;/code&amp;gt;), the title script (&amp;lt;code&amp;gt;.TTM&amp;lt;/code&amp;gt;) and the &amp;lt;code&amp;gt;activisi&amp;lt;/code&amp;gt; logo file. A file is a sequence of top-level &#039;&#039;chunks&#039;&#039;; chunks flagged as containers hold further chunks, forming a tree at most five levels deep.&lt;br /&gt;
&lt;br /&gt;
Only the files listed above use this framing. The [[Deathtrack Skyline Map Format|&amp;lt;code&amp;gt;.MAP&amp;lt;/code&amp;gt;]], [[Deathtrack Track Format|&amp;lt;code&amp;gt;.TRK&amp;lt;/code&amp;gt;]], [[Deathtrack Model Format|&amp;lt;code&amp;gt;.TBL&amp;lt;/code&amp;gt;]], [[Deathtrack High Score Format|&amp;lt;code&amp;gt;HI_SCORE&amp;lt;/code&amp;gt;]] and [[Deathtrack Save Game Format|&amp;lt;code&amp;gt;.RCT&amp;lt;/code&amp;gt;]] files do &#039;&#039;not&#039;&#039; use it.&lt;br /&gt;
&lt;br /&gt;
The leaf payloads of many chunks are wrapped in the [[Deathtrack Compression|compression envelope]].&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
=== Chunk header ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| char[4] || tag || ASCII tag that ends in a colon, e.g. &amp;lt;code&amp;gt;BMP:&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UINT32LE || size || Bit 31 set: the chunk is a &#039;&#039;container&#039;&#039; and its payload is a list of child chunks. Bits 0&amp;amp;ndash;30: payload length in bytes, excluding this 8-byte header&lt;br /&gt;
|-&lt;br /&gt;
| BYTE[size &amp;amp; 0x7FFFFFFF] || payload || Child chunks (container) or raw data (leaf)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A file may contain several top-level chunks one after the other (for example &amp;lt;code&amp;gt;PALS.BLK&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;BITMAPS.BLK&amp;lt;/code&amp;gt;). The next sibling starts at &amp;lt;code&amp;gt;offset + 8 + length&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Tags ===&lt;br /&gt;
&lt;br /&gt;
A path through the tree is written by concatenating the tags, e.g. &amp;lt;code&amp;gt;BMP:INF:&amp;lt;/code&amp;gt;. The game&#039;s chunk library searches for such paths.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Path !! Leaf? !! Contents&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BMP:INF:&amp;lt;/code&amp;gt; || yes || [[Deathtrack Bitmap Format|Frame count, widths, heights]] (raw)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BMP:BIN:&amp;lt;/code&amp;gt; || yes || Packed 4-bpp pixels ([[Deathtrack Compression|enveloped]])&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BMP:VGA:&amp;lt;/code&amp;gt; || &amp;amp;ndash; || Only read when a VGA flag is set; never present in the shipped files&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SCR:BIN:&amp;lt;/code&amp;gt; || yes || [[Deathtrack Screen Format|320&amp;amp;times;200 screen]] (enveloped)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FNT:&amp;lt;/code&amp;gt; || yes || [[Dynamix Font Format v2-v3|Font]] (raw, no envelope)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PAL:EGA:&amp;lt;/code&amp;gt; || yes || [[Deathtrack Palette Format|64 EGA palette words]] (raw)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PAL:CGA:&amp;lt;/code&amp;gt; || yes || CGA mapping data (162 bytes; not read on EGA)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SND:INF:&amp;lt;/code&amp;gt; || yes || [[Deathtrack Sound Effect Format|Sound-effect bank header]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SND:IBM:&amp;lt;/code&amp;gt; || yes || PC-speaker effect programs (enveloped)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SND:ITM:&amp;lt;/code&amp;gt; || yes || Optional; absent in the shipped &amp;lt;code&amp;gt;PALS.BLK&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SND:&amp;lt;/code&amp;gt; (leaf) || yes || In &amp;lt;code&amp;gt;.MUS&amp;lt;/code&amp;gt; files: [[Deathtrack Music Format|Standard MIDI file]] (enveloped)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TTM:&amp;lt;/code&amp;gt; || yes || [[Deathtrack Title Script Format|Title script]] (enveloped)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Searching ===&lt;br /&gt;
&lt;br /&gt;
The game&#039;s search routine (&amp;lt;code&amp;gt;chunkSeek&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1ff8:4ade&amp;lt;/code&amp;gt;) does a depth-first walk and has some constraints that matter when writing a parser:&lt;br /&gt;
&lt;br /&gt;
* The path must have a length that is a multiple of four.&lt;br /&gt;
* A chunk whose length is zero makes the whole search fail.&lt;br /&gt;
* A chunk&#039;s length must be strictly less than the file length.&lt;br /&gt;
* At most five levels of nesting are supported.&lt;br /&gt;
* Several resources of the same type are read in file order (&amp;lt;code&amp;gt;PALS.BLK&amp;lt;/code&amp;gt; holds &amp;lt;code&amp;gt;SND:&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PAL:&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PAL:&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BMP:&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Deathtrack#Tools|re-deathtrack]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/src/formats.js &amp;lt;code&amp;gt;src/formats.js&amp;lt;/code&amp;gt;] &amp;amp;ndash; independent JavaScript chunk parser (&amp;lt;code&amp;gt;chunks()&amp;lt;/code&amp;gt;)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/re/resources.md#chunk-file-library-1ff84748-4de0 &amp;lt;code&amp;gt;docs/re/resources.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; analysis of the original chunk library&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/asset-formats.md &amp;lt;code&amp;gt;docs/asset-formats.md&amp;lt;/code&amp;gt;] &amp;amp;ndash; inspector notes&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack&amp;diff=13038</id>
		<title>Deathtrack</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Deathtrack&amp;diff=13038"/>
		<updated>2026-11-02T20:52:54Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Game Infobox  | Levels = Edit  | Tiles = None  | Sprites = Some  | Fullscreen = Some  | Sound = Some  | Music = Some  | Text = No  | Story = Some  | Interface = No  | Demo = None }}  &amp;#039;&amp;#039;&amp;#039;Deathtrack&amp;#039;&amp;#039;&amp;#039; is a first-person combat racing game by Dynamix, published by Activision for DOS in 1989. The player races armed cars through ten American cities (Bay Area, Boston, Chicago, Houston, Los Angeles, New York, Orlando, Phoenix, Seattle and St. Louis) against nine named rivals....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Game Infobox&lt;br /&gt;
 | Levels = Edit&lt;br /&gt;
 | Tiles = None&lt;br /&gt;
 | Sprites = Some&lt;br /&gt;
 | Fullscreen = Some&lt;br /&gt;
 | Sound = Some&lt;br /&gt;
 | Music = Some&lt;br /&gt;
 | Text = No&lt;br /&gt;
 | Story = Some&lt;br /&gt;
 | Interface = No&lt;br /&gt;
 | Demo = None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Deathtrack&#039;&#039;&#039; is a first-person combat racing game by Dynamix, published by Activision for DOS in 1989. The player races armed cars through ten American cities (Bay Area, Boston, Chicago, Houston, Los Angeles, New York, Orlando, Phoenix, Seattle and St. Louis) against nine named rivals. The game runs in 16-colour EGA or in CGA, and can play music on an AdLib or a Roland MT-32. Sound effects always use the PC speaker.&lt;br /&gt;
&lt;br /&gt;
Most data files use the Dynamix [[Deathtrack Chunk Format|resource chunk format]] with [[Deathtrack Compression|LZW or RLE compression]], an early form of the resource format of Dynamix&#039;s later games. The 3D cars and roadside objects are stored as polygon tables, the roads as lists of 3D points and the horizons as 1920&amp;amp;times;25 skyline panoramas. Game logic, menu text and the car statistics are inside &amp;lt;tt&amp;gt;DTRACK.EXE&amp;lt;/tt&amp;gt; and have not been documented as file formats.&lt;br /&gt;
&lt;br /&gt;
The extension identifies the format reliably, but the names can mislead: &amp;lt;tt&amp;gt;.MAP&amp;lt;/tt&amp;gt; files are skylines (not road maps), &amp;lt;tt&amp;gt;.TRK&amp;lt;/tt&amp;gt; files are the roads and &amp;lt;tt&amp;gt;.BMP&amp;lt;/tt&amp;gt; files are not Windows bitmaps.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name!!Platform!!Archives!!Levels!!Graphics!!Music!!Sounds!!Text!!Saves!!.exe patch!!Notes&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/VorticonCmdr/re-deathtrack re-deathtrack]||Web browser||No||Edit||Export||Export||Export||No||No||No||Open-source HTML5 port of the game, translated function by function from &amp;lt;tt&amp;gt;DTRACK.EXE&amp;lt;/tt&amp;gt; ([https://www.decompile.tools/re-deathtrack/ play it]). Includes an [https://www.decompile.tools/re-deathtrack/viewer.html asset viewer] (images to PNG, 3D models, tracks, skylines, sound effects to WAV, music to MIDI, title script and high scores) and a [https://www.decompile.tools/re-deathtrack/editor.html track editor] (reshape roads, set heights, place roadside objects; saves &amp;lt;tt&amp;gt;.TRK&amp;lt;/tt&amp;gt; files). Needs your own copy of the game files.&lt;br /&gt;
|-&lt;br /&gt;
|re-deathtrack Vehicle Foundry||Node.js + web browser||No||No||Edit||No||No||No||No||No||Part of re-deathtrack, runs locally. Edits the 3D vehicle models and saves &amp;lt;tt&amp;gt;.TBL&amp;lt;/tt&amp;gt; files; also has an MCP server for scripted editing. See [https://github.com/VorticonCmdr/re-deathtrack/blob/main/docs/vehicle-editor.md its documentation].&lt;br /&gt;
|-&lt;br /&gt;
|[[Westwood Font Editor]]||Windows||No||No||Edit||No||No||No||No||No||Edits [[Dynamix Font Format v2-v3|Dynamix v3 fonts]] and lists Deathtrack among its supported games&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File formats ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Filename!!Format!!Details&lt;br /&gt;
|-&lt;br /&gt;
|All chunk-based files||[[Deathtrack Chunk Format]]||Tagged chunk tree used by &amp;lt;tt&amp;gt;.BMP&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.SCR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.BLK&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.MUS&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;.TTM&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;activisi&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Compressed chunks, &amp;lt;tt&amp;gt;*.MAP&amp;lt;/tt&amp;gt;||[[Deathtrack Compression]]||Stored, RLE or LZW&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.BMP&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;BITMAPS.BLK&amp;lt;/tt&amp;gt;, bitmap in &amp;lt;tt&amp;gt;PALS.BLK&amp;lt;/tt&amp;gt;||[[Deathtrack Bitmap Format]]||Sprites, car parts and menu graphics (179 frames in total)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.SCR&amp;lt;/tt&amp;gt;, screen in &amp;lt;tt&amp;gt;activisi&amp;lt;/tt&amp;gt;||[[Deathtrack Screen Format]]||320&amp;amp;times;200 full-screen pictures (dashboards, cars, city picture)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;FONTS.BLK&amp;lt;/tt&amp;gt;||[[Dynamix Font Format v2-v3]] (v3)||Three fonts, see the notes below&lt;br /&gt;
|-&lt;br /&gt;
|Palettes in &amp;lt;tt&amp;gt;PALS.BLK&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;activisi&amp;lt;/tt&amp;gt;||[[Deathtrack Palette Format]]||EGA palette words plus CGA dither tables&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.MAP&amp;lt;/tt&amp;gt;||[[Deathtrack Skyline Map Format]]||Horizon skyline of each city (&#039;&#039;not&#039;&#039; a road map)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.TRK&amp;lt;/tt&amp;gt;||[[Deathtrack Track Format]]||Road centreline points and roadside objects&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;SHAPE.TBL&amp;lt;/tt&amp;gt;, driver and car &amp;lt;tt&amp;gt;*.TBL&amp;lt;/tt&amp;gt;||[[Deathtrack Model Format]]||3D polygon models&lt;br /&gt;
|-&lt;br /&gt;
|Sound effects in &amp;lt;tt&amp;gt;PALS.BLK&amp;lt;/tt&amp;gt;||[[Deathtrack Sound Effect Format]]||PC-speaker effect programs&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;DANGER.MUS&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;TRAX.MUS&amp;lt;/tt&amp;gt;||[[Deathtrack Music Format]]||Compressed [[MID Format|Standard MIDI Files]] for the MT-32&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;TITLE.TTM&amp;lt;/tt&amp;gt;||[[Deathtrack Title Script Format]]||Script for the title sequence&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;HI_SCORE&amp;lt;/tt&amp;gt;||[[Deathtrack High Score Format]]||Ten names and winnings&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;*.RCT&amp;lt;/tt&amp;gt;||[[Deathtrack Save Game Format]]||Saved games, written by the game&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;DTRACK.EXE&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;D.EXE&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;INT.EXE&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;*.BAT&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;FILE_ID.DIZ&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;TETRIS.PST&amp;lt;/tt&amp;gt; ...||[[Deathtrack Distribution Files]]||Executables, batch files and text files of the distribution&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* Integer fields are little-endian, except for the MIDI data inside the music files.&lt;br /&gt;
* A &amp;lt;tt&amp;gt;.BLK&amp;lt;/tt&amp;gt; file is a bundle of several resources, of the same type or of different types: &amp;lt;tt&amp;gt;PALS.BLK&amp;lt;/tt&amp;gt; holds the sound effects, two palettes and the mouse-pointer bitmap.&lt;br /&gt;
* &amp;lt;tt&amp;gt;FONTS.BLK&amp;lt;/tt&amp;gt; holds three consecutive uncompressed &amp;lt;tt&amp;gt;FNT:&amp;lt;/tt&amp;gt; chunks of 96 glyphs each, starting at character 32: 4&amp;amp;times;5, 6&amp;amp;times;6 and 8&amp;amp;times;8 pixels. The game uses the 8&amp;amp;times;8 font by default. The loader copies font data in 80-byte reads with an 8-bit loop counter, so a font smaller than 80 bytes would not load correctly (the shipped fonts are all larger).&lt;br /&gt;
* The game writes only two files: &amp;lt;tt&amp;gt;HI_SCORE&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;*.RCT&amp;lt;/tt&amp;gt; saved games. &amp;lt;tt&amp;gt;HI_SCORE&amp;lt;/tt&amp;gt; must exist, or the game will not get past the start.&lt;br /&gt;
* The chunk files, the compression and the model, track and skyline layouts have been checked against all shipped files: 92 files, 179 image frames, 136 models, ten tracks and 88 title-script commands.&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.decompile.tools/re-deathtrack/ re-deathtrack] &amp;amp;ndash; play the HTML5 port in your browser (load your own copy of the game files)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-deathtrack re-deathtrack on GitHub] &amp;amp;ndash; source code, plus detailed reverse-engineering notes in the &amp;lt;tt&amp;gt;docs/&amp;lt;/tt&amp;gt; folder&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Intro Page]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=ModdingWiki_talk:Contributing&amp;diff=13037</id>
		<title>ModdingWiki talk:Contributing</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=ModdingWiki_talk:Contributing&amp;diff=13037"/>
		<updated>2026-10-28T19:50:51Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;I have currently problems adding new pages. I wanted to add Deathtrack and as before I wanted to include links to my Github pages but for some reason I get into a Captcha loop. Maybe someone can look into that? ~~~~&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have currently problems adding new pages. I wanted to add Deathtrack and as before I wanted to include links to my Github pages but for some reason I get into a Captcha loop. Maybe someone can look into that? [[User:VorticonCmdr|VorticonCmdr]] ([[User talk:VorticonCmdr|talk]]) 19:50, 28 October 2026 (GMT)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=User:VorticonCmdr&amp;diff=13036</id>
		<title>User:VorticonCmdr</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=User:VorticonCmdr&amp;diff=13036"/>
		<updated>2026-10-27T20:35:43Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi! My name is Valentin from Germany and I am working in the news publishing business. I recently started to get interested in reverse engineering old DOS games with the help of AI. After working on yet another Lemmings HTML port I worked on Pushover. This wiki is incredible and I hope to add to it.&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=File:Mod-Pushover.png&amp;diff=13035</id>
		<title>File:Mod-Pushover.png</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=File:Mod-Pushover.png&amp;diff=13035"/>
		<updated>2026-10-20T06:59:23Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Configuration_Format&amp;diff=13034</id>
		<title>Pushover Configuration Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Configuration_Format&amp;diff=13034"/>
		<updated>2026-10-20T06:55:49Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;&amp;lt;tt&amp;gt;PUSH.CFG&amp;lt;/tt&amp;gt; is the installation/configuration file mentioned in the research in Pushover.  == File format ==  The repository lists &amp;lt;tt&amp;gt;PUSH.CFG&amp;lt;/tt&amp;gt; among the files which are not RNC-compressed. It does not supply a verified byte layout, signature, field table or dedicated parser for this file.  The notes propose a role in launcher-to-game setup and video/sound/control configuration, but do not verify individual settings or offsets. Do not treat the proposed re...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;PUSH.CFG&amp;lt;/tt&amp;gt; is the installation/configuration file mentioned in the research in [[Pushover]].&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The repository lists &amp;lt;tt&amp;gt;PUSH.CFG&amp;lt;/tt&amp;gt; among the files which are not RNC-compressed. It does not supply a verified byte layout, signature, field table or dedicated parser for this file.&lt;br /&gt;
&lt;br /&gt;
The notes propose a role in launcher-to-game setup and video/sound/control configuration, but do not verify individual settings or offsets. Do not treat the proposed relationship to the “Please run PUSH.exe” guard as established.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/rnc.md docs/formats/rnc.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/flx.md docs/formats/flx.md] – reverse-engineering documentation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
Known file information is documented by [[User:VorticonCmdr|VorticonCmdr]] in the repository linked above. The binary layout has not yet been reverse engineered there. Please credit that research and link back to this wiki when using it.&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Icon_Format&amp;diff=13033</id>
		<title>Pushover Icon Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Icon_Format&amp;diff=13033"/>
		<updated>2026-10-20T06:55:25Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;&amp;lt;tt&amp;gt;QUAVERS.ICN&amp;lt;/tt&amp;gt; is a standalone asset associated by the research with the Quavers graphics/bonus content in Pushover.  == File format ==  The repository lists &amp;lt;tt&amp;gt;QUAVERS.ICN&amp;lt;/tt&amp;gt; among the files which are not RNC-compressed. It does not supply a verified byte layout, signature, field table or dedicated parser for this file.  The extension alone does not establish compatibility with Windows ICO or any other icon format. Dimensions, palette, transparency and inte...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;QUAVERS.ICN&amp;lt;/tt&amp;gt; is a standalone asset associated by the research with the Quavers graphics/bonus content in [[Pushover]].&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The repository lists &amp;lt;tt&amp;gt;QUAVERS.ICN&amp;lt;/tt&amp;gt; among the files which are not RNC-compressed. It does not supply a verified byte layout, signature, field table or dedicated parser for this file.&lt;br /&gt;
&lt;br /&gt;
The extension alone does not establish compatibility with Windows ICO or any other icon format. Dimensions, palette, transparency and internal record structure remain undocumented.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/rnc.md docs/formats/rnc.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/flx.md docs/formats/flx.md] – reverse-engineering documentation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
Known file information is documented by [[User:VorticonCmdr|VorticonCmdr]] in the repository linked above. The binary layout has not yet been reverse engineered there. Please credit that research and link back to this wiki when using it.&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Protection_Format&amp;diff=13032</id>
		<title>Pushover Protection Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Protection_Format&amp;diff=13032"/>
		<updated>2026-10-20T06:54:51Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;&amp;lt;tt&amp;gt;THEMES/THEME.DAT&amp;lt;/tt&amp;gt; is an encrypted real-mode x86 copy-protection payload used by Pushover. Despite its location and name, it contains no theme graphics. It is not RNC-compressed.  == File format ==  The examined file is 7025 bytes. Decrypt every byte using a 15-bit Fibonacci LFSR seeded with &amp;lt;tt&amp;gt;0x0ACE&amp;lt;/tt&amp;gt;. Advance the state before using its low byte: &amp;lt;pre&amp;gt;state = 0x0ACE for each byte:     feedback = (state &amp;amp; 1) ^ ((state &amp;gt;&amp;gt; 1) &amp;amp; 1)     state = (state &amp;gt;&amp;gt; 1) |...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;THEMES/THEME.DAT&amp;lt;/tt&amp;gt; is an encrypted real-mode x86 copy-protection payload used by [[Pushover]]. Despite its location and name, it contains no theme graphics. It is not RNC-compressed.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The examined file is 7025 bytes. Decrypt every byte using a 15-bit Fibonacci LFSR seeded with &amp;lt;tt&amp;gt;0x0ACE&amp;lt;/tt&amp;gt;. Advance the state before using its low byte:&lt;br /&gt;
&amp;lt;pre&amp;gt;state = 0x0ACE&lt;br /&gt;
for each byte:&lt;br /&gt;
    feedback = (state &amp;amp; 1) ^ ((state &amp;gt;&amp;gt; 1) &amp;amp; 1)&lt;br /&gt;
    state = (state &amp;gt;&amp;gt; 1) | (feedback &amp;lt;&amp;lt; 14)&lt;br /&gt;
    output = input XOR (state &amp;amp; 0xFF)&amp;lt;/pre&amp;gt;&lt;br /&gt;
The same operation encrypts and decrypts. This cipher is distinct from RNC&#039;s &amp;lt;tt&amp;gt;0x1984&amp;lt;/tt&amp;gt; literal-run key.&lt;br /&gt;
&lt;br /&gt;
The result contains executable disk-media checks. Research identifies DOS media descriptor comparisons against 0xFD and 0xF9 and a protection canary involving 0x8035. Gameplay later checks the canary, producing a delayed failure rather than necessarily refusing at startup. There is no established image, tile or music structure inside this file.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
The repository includes a decrypted research dump, but no general theme-data parser because this is executable protection code. The relationship between the P00000 screen and protection failure remains a separate hypothesis.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/theme-dat.md docs/formats/theme-dat.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/re-notes/function-renames.md docs/re-notes/function-renames.md] – named loader and protection routines&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Intro_Music_Format&amp;diff=13031</id>
		<title>Pushover Intro Music Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Intro_Music_Format&amp;diff=13031"/>
		<updated>2026-10-20T06:54:20Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;&amp;lt;tt&amp;gt;MUSIC/CDEMO_AD.BIX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CDEMO_PC.BIX&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CDEMO_RL.BIX&amp;lt;/tt&amp;gt; are music-driver files loaded by Pushover’s front end.  == File format ==  The outer layer is RNC compression. The repository identifies these as the front-end equivalents of the resident &amp;lt;tt&amp;gt;OVER_*.BIN&amp;lt;/tt&amp;gt; drivers, for AdLib, PC speaker and Roland respectively.  The internal BIX layout has not been independently mapped in the repository. A shared architecture...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;MUSIC/CDEMO_AD.BIX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CDEMO_PC.BIX&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CDEMO_RL.BIX&amp;lt;/tt&amp;gt; are music-driver files loaded by [[Pushover]]’s front end.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The outer layer is [[Pushover RNC Compression|RNC compression]]. The repository identifies these as the front-end equivalents of the resident &amp;lt;tt&amp;gt;OVER_*.BIN&amp;lt;/tt&amp;gt; drivers, for AdLib, PC speaker and Roland respectively.&lt;br /&gt;
&lt;br /&gt;
The internal BIX layout has not been independently mapped in the repository. A shared architecture is likely, but the specific OVER_AD offsets, instrument tables and command semantics must not be assumed to apply. There is no dedicated BIX parser in the examined source tree.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
This page records the format family and the boundary of current knowledge. See [[Pushover Music Format]] for the much more complete gameplay AdLib-driver research.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/audio.md docs/formats/audio.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/re-notes/FRNTEND_file_manifest.md docs/re-notes/FRNTEND_file_manifest.md] – front-end filenames and loading evidence&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
Known file information is documented by [[User:VorticonCmdr|VorticonCmdr]] in the repository linked above. The binary layout has not yet been reverse engineered there. Please credit that research and link back to this wiki when using it.&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Music_Format&amp;diff=13030</id>
		<title>Pushover Music Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Music_Format&amp;diff=13030"/>
		<updated>2026-10-20T06:53:59Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Music Infobox  | Type = Custom event streams in executable driver  | Instruments = OPL (AdLib variant)  | NumTracks = 13 pointer slots; slot 0 invalid  | Tags = Embedded driver credit  | Games =    {{Game|Pushover}} }}  &amp;lt;tt&amp;gt;MUSIC/OVER_AD.BIN&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;OVER_PC.BIN&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;OVER_RLD.BIN&amp;lt;/tt&amp;gt; are Pushover resident sound drivers containing code, instruments and event streams. They are RNC-compressed. The detailed offsets below apply to...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Music Infobox&lt;br /&gt;
 | Type = Custom event streams in executable driver&lt;br /&gt;
 | Instruments = OPL (AdLib variant)&lt;br /&gt;
 | NumTracks = 13 pointer slots; slot 0 invalid&lt;br /&gt;
 | Tags = Embedded driver credit&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Pushover}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;MUSIC/OVER_AD.BIN&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;OVER_PC.BIN&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;OVER_RLD.BIN&amp;lt;/tt&amp;gt; are [[Pushover]] resident sound drivers containing code, instruments and event streams. They are [[Pushover RNC Compression|RNC-compressed]]. The detailed offsets below apply to the examined AdLib binary, not automatically to other drivers.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00||Real-mode entry stub: CALL rel16; RETF&lt;br /&gt;
|-&lt;br /&gt;
|0x04||Second entry stub; PC-speaker variant has a bare RETF&lt;br /&gt;
|-&lt;br /&gt;
|0x08||Music-command mailbox; cleared by driver to acknowledge&lt;br /&gt;
|-&lt;br /&gt;
|0x0A||Sound-effect mailbox&lt;br /&gt;
|-&lt;br /&gt;
|0x08–0x18||Control/scratch region; not all bytes have established meanings&lt;br /&gt;
|-&lt;br /&gt;
|0x19||NUL-terminated embedded music credit&lt;br /&gt;
|-&lt;br /&gt;
|later||Driver code and tables, addressed by embedded offsets&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== AdLib tables ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x4D2||Nine 20-byte runtime voice records&lt;br /&gt;
|-&lt;br /&gt;
|0x60A||F-number data, indexed with 32-byte stride&lt;br /&gt;
|-&lt;br /&gt;
|0x78A||Note octave/block lookup&lt;br /&gt;
|-&lt;br /&gt;
|0x7EA||Note frequency-index lookup&lt;br /&gt;
|-&lt;br /&gt;
|0x83A||32 instrument slots, 16 bytes per slot&lt;br /&gt;
|-&lt;br /&gt;
|0xA3A||Tempo divider reload&lt;br /&gt;
|-&lt;br /&gt;
|0xA3B||13 little-endian track-descriptor pointers; slot zero is invalid/overlaps runtime storage&lt;br /&gt;
|-&lt;br /&gt;
|0x4B53||Sound-effect pointer table&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A track descriptor begins with a tempo byte and a voice-count byte, followed by that many UINT16LE pointers to voice-info blocks. The first word of a voice-info block points to its event stream; subsequent words supply the loop/jump cursor. These are offsets within the decompressed blob.&lt;br /&gt;
&lt;br /&gt;
=== Event stream ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opcode!!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|0x00–0x7F||Note-on&lt;br /&gt;
|-&lt;br /&gt;
|0x80–0x87||Loop/control commands; see the driver implementation for exact state changes&lt;br /&gt;
|-&lt;br /&gt;
|0x88–0xAF||No established valid handler&lt;br /&gt;
|-&lt;br /&gt;
|0xB0–0xBF||Carrier-volume/expression operation with one following byte&lt;br /&gt;
|-&lt;br /&gt;
|0xC0–0xDF||Select instrument: opcode &amp;amp; 0x1F&lt;br /&gt;
|-&lt;br /&gt;
|0xE0–0xFF||Set pending delay to opcode − 0xDF; continue reading&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Music service runs at approximately 50.16 Hz (PIT divisor 23788). Music voices use a tempo divider; effect voices are processed every service tick. Note lengths also depend on per-voice countdown state and instrument auto-release. A byte-stream dump alone is insufficient for faithful playback; &amp;lt;tt&amp;gt;audioSim.js&amp;lt;/tt&amp;gt; implements these state transitions and emits OPL2 register writes.&lt;br /&gt;
&lt;br /&gt;
=== Control opcodes ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Opcode!!Operands!!Effect&lt;br /&gt;
|-&lt;br /&gt;
|0x80||None in the event stream||Follow the separate loop/jump cursor associated with this voice&lt;br /&gt;
|-&lt;br /&gt;
|0x81||None||Key off this voice, keep it active, reload its delay and return&lt;br /&gt;
|-&lt;br /&gt;
|0x82||None||Reload delay and return without a note change&lt;br /&gt;
|-&lt;br /&gt;
|0x83||None||Stop the active voices&lt;br /&gt;
|-&lt;br /&gt;
|0x84||UINT8||Set transpose and continue reading&lt;br /&gt;
|-&lt;br /&gt;
|0x85||None||Key off and deactivate this voice&lt;br /&gt;
|-&lt;br /&gt;
|0x86||None||Set pitch-slide step to +1&lt;br /&gt;
|-&lt;br /&gt;
|0x87||None||Set pitch-slide step to −1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A note-on also reloads the pending delay and returns from command processing. Instrument, volume, transpose and duration operations continue reading until a command yields. The invalid 0x88–0xAF range is not safe padding: the original dispatch can enter unrelated code.&lt;br /&gt;
&lt;br /&gt;
=== Other drivers ===&lt;br /&gt;
&lt;br /&gt;
The PC-speaker and Roland variants share the resident-driver architecture, but their hardware paths and internal offsets are not interchangeable with the AdLib layout. &amp;lt;tt&amp;gt;MUSIC/CDEMO_AD.BIX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CDEMO_PC.BIX&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CDEMO_RL.BIX&amp;lt;/tt&amp;gt; are front-end drivers; see [[Pushover Intro Music Format]] for their research status.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
The documented AdLib slot-zero pointer leads into entry code, so it must not be played as a valid song. The existence of 13 pointer slots does not mean 13 usable tracks. Preserve embedded code/table relationships when editing; this is not a standalone MIDI or tracker module.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/audio.md docs/formats/audio.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/engine/src/core/audioSim.js engine/src/core/audioSim.js] – driver and event-stream implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/engine/viewer/music.js engine/viewer/music.js] – track inspection&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Theme_Table_Format&amp;diff=13029</id>
		<title>Pushover Theme Table Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Theme_Table_Format&amp;diff=13029"/>
		<updated>2026-10-20T06:53:29Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;&amp;lt;tt&amp;gt;THEMES/THEME.KEY&amp;lt;/tt&amp;gt; is a 320-byte uncompressed table used by Pushover for menu/level counts and theme-to-music selection. It is not an encryption key.  == File format ==  {|class=&amp;quot;wikitable&amp;quot; !Offset!!Data type!!Description |- |0x00||UINT16BE[26]||Menu/count values |- |0x34||BYTE[12]||Zero padding |- |0x40||CHAR[12][16]||NUL-padded name records |- |0x100||BYTE[64]||Zero tail; four further empty name-sized slots |}  === Count values === &amp;lt;pre&amp;gt;1 2 3 4 5 6 7 8 1 2 3...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;THEMES/THEME.KEY&amp;lt;/tt&amp;gt; is a 320-byte uncompressed table used by [[Pushover]] for menu/level counts and theme-to-music selection. It is not an encryption key.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset!!Data type!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00||UINT16BE[26]||Menu/count values&lt;br /&gt;
|-&lt;br /&gt;
|0x34||BYTE[12]||Zero padding&lt;br /&gt;
|-&lt;br /&gt;
|0x40||CHAR[12][16]||NUL-padded name records&lt;br /&gt;
|-&lt;br /&gt;
|0x100||BYTE[64]||Zero tail; four further empty name-sized slots&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Count values ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1 2 3 4 5 6 7 8&lt;br /&gt;
1 2 3 4 5 6 7 10&lt;br /&gt;
11 20 29 43 55 62 77 88 99 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
The ten words starting at 0x20 are cumulative world boundaries. The first word, masked with 0x7F, is used as a seed by the menu logic. Do not interpret all 26 values as one monotonic list.&lt;br /&gt;
&lt;br /&gt;
=== Music names ===&lt;br /&gt;
&lt;br /&gt;
Slots 0–11 are &amp;lt;tt&amp;gt;OPTION, MECHANIC, TITLE, CASTLE, JAPANESE, PRIZE, GREEK, AZTEC, SPACE, TOXCITY, ELECTRO, DUNGEON&amp;lt;/tt&amp;gt;. A name match at slot &#039;&#039;i&#039;&#039; sets pending selection &#039;&#039;i&#039;&#039;+1; the game subsequently sends &amp;lt;tt&amp;gt;(pending−1) % 13&amp;lt;/tt&amp;gt; to the driver. See [[Pushover Music Format]] for the AdLib driver&#039;s invalid slot-zero caveat.&lt;br /&gt;
&lt;br /&gt;
These names are not an ordered list of worlds. CAVERN has real art but no matching name here; the documented scan found no CAVERN theme among the 103 screen files examined. The ten world buckets also need not correspond one-to-one with distinct art themes.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
The music-name interpretation was confirmed with live SPACE and TOXCITY selections. Older notes identifying the same runtime buffer as permanently containing staff credits were superseded: the buffer is reused.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/theme-key.md docs/formats/theme-key.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/level-order.md docs/formats/level-order.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/engine/src/core/levelOrder.js engine/src/core/levelOrder.js] – level mapping&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/engine/viewer/music.js engine/viewer/music.js] – music explorer&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Preview_Animation_Format&amp;diff=13028</id>
		<title>Pushover Preview Animation Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Preview_Animation_Format&amp;diff=13028"/>
		<updated>2026-10-20T06:53:05Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = EGA  | Hardware2 = VGA  | Depth = 8-bit colour  | Palette = Internal  | NumPlanes = 1 (packed pixels)  | HasTransparency = N  | HasHitmap = No  | MinSize = 320&amp;amp;times;200  | MaxSize = 320&amp;amp;times;200  | Games =    {{Game|Pushover}} }}  &amp;lt;tt&amp;gt;DATA/PUSHOVER.FLX&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CC0.FLX&amp;lt;/tt&amp;gt;–&amp;lt;tt&amp;gt;CC5.FLX&amp;lt;/tt&amp;gt; contain front-end preview/animation data for Pushover. They are RNC-compressed. They do not contain the playabl...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = VGA&lt;br /&gt;
 | Depth = 8-bit colour&lt;br /&gt;
 | Palette = Internal&lt;br /&gt;
 | NumPlanes = 1 (packed pixels)&lt;br /&gt;
 | HasTransparency = N&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | MinSize = 320&amp;amp;times;200&lt;br /&gt;
 | MaxSize = 320&amp;amp;times;200&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Pushover}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;DATA/PUSHOVER.FLX&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CC0.FLX&amp;lt;/tt&amp;gt;–&amp;lt;tt&amp;gt;CC5.FLX&amp;lt;/tt&amp;gt; contain front-end preview/animation data for [[Pushover]]. They are [[Pushover RNC Compression|RNC-compressed]]. They do not contain the playable grids, which are in [[Pushover Map Format|.SCR files]].&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
Multi-byte fields are little-endian. The decompressed preamble is 128 bytes:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset!!Data type!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00||UINT32LE||Total decompressed file size&lt;br /&gt;
|-&lt;br /&gt;
|0x04||UINT16LE||Signature 0xAF11&lt;br /&gt;
|-&lt;br /&gt;
|0x06||UINT16LE||Preview-slot count after the initial shared keyframe&lt;br /&gt;
|-&lt;br /&gt;
|0x08||UINT16LE||320 (image width)&lt;br /&gt;
|-&lt;br /&gt;
|0x0A||UINT16LE||200 (image height)&lt;br /&gt;
|-&lt;br /&gt;
|0x0C||UINT16LE||8 (consistent with 8-bit screen pixels; original field semantics not separately traced)&lt;br /&gt;
|-&lt;br /&gt;
|0x0E||UINT16LE||3; precise meaning unconfirmed&lt;br /&gt;
|-&lt;br /&gt;
|0x10||BYTE[112]||Reserved/padding; zero in the closely inspected sample&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Frame blocks ===&lt;br /&gt;
&lt;br /&gt;
At offset 0x80, read consecutive blocks. Each begins with a self-inclusive UINT32LE size, UINT16LE signature &amp;lt;tt&amp;gt;0xF1FA&amp;lt;/tt&amp;gt;, UINT16LE subrecord count, and eight padding bytes. The first block carries the shared palette/keyframe. The header slot count counts subsequent blocks, including empty 16-byte blocks.&lt;br /&gt;
&lt;br /&gt;
A subrecord has UINT16LE self-inclusive length, UINT16LE flags, UINT16LE type, then its payload. This is the interpretation used by the repository&#039;s exploratory parser; it does not establish a generic parser for every similarly signed animation format.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Type!!Operation&lt;br /&gt;
|-&lt;br /&gt;
|0x0B||Partial palette update: skip/write runs of RGB triples&lt;br /&gt;
|-&lt;br /&gt;
|0x0C||Partial image update with row offset/count and signed-control RLE&lt;br /&gt;
|-&lt;br /&gt;
|0x0D||Clear 64000 screen bytes (handler present)&lt;br /&gt;
|-&lt;br /&gt;
|0x0F||Full-image signed-control RLE&lt;br /&gt;
|-&lt;br /&gt;
|0x10||Raw 64000-byte image (handler present)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The documented RLE uses positive controls for repeated values and negative controls for literal runs. The research establishes these operations but the supplied structural parser does not fully decode their payloads; consult the traced handlers before implementing a writer.&lt;br /&gt;
&lt;br /&gt;
All seven examined files contain types 0x0B, 0x0C and 0x0F. No type 0x0E occurs. Slot counts are 148 for PUSHOVER, then 18, 56, 29, 12, 18 and 42 for CC0–CC5.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Early “level archive” descriptions and the proposed bytes-per-grid-cell meaning of header value 8 were superseded by the rendering-command investigation. Preserve the distinction between confirmed structural fields and incompletely documented payload encodings.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/flx.md docs/formats/flx.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/flx-explore.js tools/asset-convert/flx-explore.js] – decoder / format implementation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Language_Format&amp;diff=13027</id>
		<title>Pushover Language Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Language_Format&amp;diff=13027"/>
		<updated>2026-10-20T06:52:37Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;&amp;lt;tt&amp;gt;DATA/LANG0.DAX&amp;lt;/tt&amp;gt; through &amp;lt;tt&amp;gt;LANG3.DAX&amp;lt;/tt&amp;gt; contain Pushover’s user-interface messages. They are RNC-compressed on disk; references to plain-text copies in the research describe already-decompressed files.  == File format ==  The payload is a sequence of 78 strings in a fixed order, without a count header or offset table. A carriage return (&amp;lt;tt&amp;gt;0x0D&amp;lt;/tt&amp;gt;) terminates each entry; an immediately following line feed (&amp;lt;tt&amp;gt;0x0A&amp;lt;/tt&amp;gt;) i...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;DATA/LANG0.DAX&amp;lt;/tt&amp;gt; through &amp;lt;tt&amp;gt;LANG3.DAX&amp;lt;/tt&amp;gt; contain [[Pushover]]’s user-interface messages. They are [[Pushover RNC Compression|RNC-compressed]] on disk; references to plain-text copies in the research describe already-decompressed files.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The payload is a sequence of 78 strings in a fixed order, without a count header or offset table. A carriage return (&amp;lt;tt&amp;gt;0x0D&amp;lt;/tt&amp;gt;) terminates each entry; an immediately following line feed (&amp;lt;tt&amp;gt;0x0A&amp;lt;/tt&amp;gt;) is folded into the delimiter. A tilde (&amp;lt;tt&amp;gt;~&amp;lt;/tt&amp;gt;) represents a space. Preserve entry order, empty entries, and intentional leading/trailing spaces when authoring replacements.&lt;br /&gt;
&lt;br /&gt;
The parser reads bytes as Latin-1. This is its lossless byte-to-character choice, not proof that all extended characters map directly to the game&#039;s font.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!File!!Language&lt;br /&gt;
|-&lt;br /&gt;
|LANG0.DAX||English&lt;br /&gt;
|-&lt;br /&gt;
|LANG1.DAX||French&lt;br /&gt;
|-&lt;br /&gt;
|LANG2.DAX||German&lt;br /&gt;
|-&lt;br /&gt;
|LANG3.DAX||Spanish&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Entry groups ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Indices (zero-based)!!Purpose&lt;br /&gt;
|-&lt;br /&gt;
|0–7||Startup, disk/file errors and protection&lt;br /&gt;
|-&lt;br /&gt;
|8–12||Puzzle instructions&lt;br /&gt;
|-&lt;br /&gt;
|13–17||Confirmation and joystick calibration&lt;br /&gt;
|-&lt;br /&gt;
|18–27||Ten domino names, in type order&lt;br /&gt;
|-&lt;br /&gt;
|28–35||Token, replay and quit choices&lt;br /&gt;
|-&lt;br /&gt;
|36–42||Result, exit and code-entry messages&lt;br /&gt;
|-&lt;br /&gt;
|43–58||Failure reasons, time limit and token reward&lt;br /&gt;
|-&lt;br /&gt;
|59–69||Quavers bonus/pickup messages&lt;br /&gt;
|-&lt;br /&gt;
|70–75||Disk-insertion prompts&lt;br /&gt;
|-&lt;br /&gt;
|76–77||Space/fire prompts&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Level-specific hints are stored separately in [[Pushover Map Format|.SCR files]]. Changing this table does not translate those hints.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/lang-dax.md docs/formats/lang-dax.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/lang-dax-to-json.js tools/asset-convert/lang-dax-to-json.js] – decoder / format implementation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Delta_Animation_Format&amp;diff=13026</id>
		<title>Pushover Delta Animation Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Delta_Animation_Format&amp;diff=13026"/>
		<updated>2026-10-20T06:51:56Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = EGA  | Hardware2 = VGA  | Depth = 4-bit colour  | Palette = External (.PIX)  | NumPlanes = 4  | HasTransparency = N  | HasHitmap = No  | MinSize = 320&amp;amp;times;200  | MaxSize = 320&amp;amp;times;200  | Games =    {{Game|Pushover}} }}  &amp;lt;tt&amp;gt;DATA/ANI??.DLX&amp;lt;/tt&amp;gt; stores XOR image updates used with .PIX backdrops. Files are RNC-compressed. These are visual animation data, not gameplay levels.  == File f...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = VGA&lt;br /&gt;
 | Depth = 4-bit colour&lt;br /&gt;
 | Palette = External (.PIX)&lt;br /&gt;
 | NumPlanes = 4&lt;br /&gt;
 | HasTransparency = N&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | MinSize = 320&amp;amp;times;200&lt;br /&gt;
 | MaxSize = 320&amp;amp;times;200&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Pushover}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;DATA/ANI??.DLX&amp;lt;/tt&amp;gt; stores XOR image updates used with [[Pushover Image Format|.PIX]] backdrops. Files are [[Pushover RNC Compression|RNC-compressed]]. These are visual animation data, not gameplay levels.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
All words below are big-endian. A stream consists of batches, each beginning with a signed 16-bit count. A count less than or equal to zero ends the stream. A positive count is the number of six-byte records, including both halves of a combined record.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Relative offset!!Data type!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0||UINT16BE||Header H: position plus plane-pair flag&lt;br /&gt;
|-&lt;br /&gt;
|2||UINT16BE||First plane word&lt;br /&gt;
|-&lt;br /&gt;
|4||UINT16BE||Second plane word&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The destination offset in a 320×200, one-byte-per-pixel buffer is &amp;lt;tt&amp;gt;(H &amp;amp;amp; 0x7FF8) * 2&amp;lt;/tt&amp;gt;. Each record affects 16 consecutive pixels. Header bit &amp;lt;tt&amp;gt;0x0004&amp;lt;/tt&amp;gt; selects planes 2 and 3; when clear, the words are planes 0 and 1. Missing planes contribute zero.&lt;br /&gt;
&lt;br /&gt;
If the flag is clear and the next record has the same masked position, the decoder consumes both records as a combined 12-byte update: the first pair supplies planes 0/1, the second planes 2/3. This consumes two count units. Check that another record remains before looking ahead.&lt;br /&gt;
&lt;br /&gt;
For each pixel, combine the four MSB-first plane bits into a nibble, then XOR it with the existing palette index. Applying the identical update twice restores the previous pixels. Keep the .PIX palette throughout. The linked decoder applies all batches in sequence; it does not by itself specify presentation timing between batches.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Older prose mentions a &amp;lt;tt&amp;gt;0x400&amp;lt;/tt&amp;gt; flag and ambiguous short/long records. The current byte-level decoder uses &amp;lt;tt&amp;gt;0x0004&amp;lt;/tt&amp;gt; and counts six-byte units as documented here. Any trailing data after a terminating count remains an open question in the notes.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/ani-pix-dlx.md docs/formats/ani-pix-dlx.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/dlx-decode.js tools/asset-convert/dlx-decode.js] – decoder / format implementation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Image_Format&amp;diff=13025</id>
		<title>Pushover Image Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Image_Format&amp;diff=13025"/>
		<updated>2026-10-20T06:51:22Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = EGA  | Hardware2 = VGA  | Depth = 4-bit colour  | Palette = Internal  | NumPlanes = 4  | HasTransparency = N  | HasHitmap = No  | MinSize = 320&amp;amp;times;200  | MaxSize = 320&amp;amp;times;200  | Games =    {{Game|Pushover}} }}  &amp;lt;tt&amp;gt;DATA/ANI??.PIX&amp;lt;/tt&amp;gt; contains full-screen backdrop graphics for Pushover. Related title/reward screens use this asset family. Files are RNC-compressed; the expected decompressed size is 32034...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = VGA&lt;br /&gt;
 | Depth = 4-bit colour&lt;br /&gt;
 | Palette = Internal&lt;br /&gt;
 | NumPlanes = 4&lt;br /&gt;
 | HasTransparency = N&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | MinSize = 320&amp;amp;times;200&lt;br /&gt;
 | MaxSize = 320&amp;amp;times;200&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Pushover}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;DATA/ANI??.PIX&amp;lt;/tt&amp;gt; contains full-screen backdrop graphics for [[Pushover]]. Related title/reward screens use this asset family. Files are [[Pushover RNC Compression|RNC-compressed]]; the expected decompressed size is 32034 bytes.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset!!Data type!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00||UINT16BE[16]||Internal RGB444 palette (0RGB words)&lt;br /&gt;
|-&lt;br /&gt;
|0x20||BYTE[2]||Unidentified header bytes&lt;br /&gt;
|-&lt;br /&gt;
|0x22||BYTE[32000]||320×200 image, four interleaved bitplanes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Palette ===&lt;br /&gt;
&lt;br /&gt;
Decode the 16 colours as in [[Pushover Palette Format]], scaling each nibble by 17. Unlike .PAL files, this header has only two bytes after the colours, not 32 padding bytes.&lt;br /&gt;
&lt;br /&gt;
=== Bitmap ===&lt;br /&gt;
&lt;br /&gt;
Each horizontal run of 16 pixels occupies eight bytes: two bytes from plane 0, two from plane 1, two from plane 2 and two from plane 3. Bits are MSB-first. Combine planes 0–3 with weights 1, 2, 4 and 8. There are 20 runs per row and 200 rows, in row-major order.&lt;br /&gt;
&lt;br /&gt;
This is word-interleaved storage, unlike the plane-major sprite banks. The matching [[Pushover Delta Animation Format|.DLX]] applies XOR changes to the decoded palette-index image.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
The presence of a TITLE asset is not proof that the examined executable loads it. The repository records unresolved title-screen call paths.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/ani-pix-dlx.md docs/formats/ani-pix-dlx.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/ani-pix-decode.js tools/asset-convert/ani-pix-decode.js] – decoder / format implementation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Ant_Animation_Format&amp;diff=13024</id>
		<title>Pushover Ant Animation Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Ant_Animation_Format&amp;diff=13024"/>
		<updated>2026-10-20T06:50:59Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = EGA  | Hardware2 = VGA  | Depth = 4-bit colour + transparency  | Palette = External  | NumPlanes = 5  | HasTransparency = Y  | HasHitmap = No  | Games =    {{Game|Pushover}} }}  &amp;lt;tt&amp;gt;DATA/ANT00_16.ANX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ANT17_30.ANX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ANT31_46.ANX&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ANT47_65.ANX&amp;lt;/tt&amp;gt; contain G.I. Ant’s animation graphics in Pushover. Decompress RNC first.  == File format ==  {|class=&amp;quot;wikitable&amp;quot; !Data type!!Name!!D...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = VGA&lt;br /&gt;
 | Depth = 4-bit colour + transparency&lt;br /&gt;
 | Palette = External&lt;br /&gt;
 | NumPlanes = 5&lt;br /&gt;
 | HasTransparency = Y&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Pushover}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;DATA/ANT00_16.ANX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ANT17_30.ANX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ANT31_46.ANX&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ANT47_65.ANX&amp;lt;/tt&amp;gt; contain G.I. Ant’s animation graphics in [[Pushover]]. Decompress [[Pushover RNC Compression|RNC]] first.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Data type!!Name!!Description&lt;br /&gt;
|-&lt;br /&gt;
|UINT16BE||frameCount||Number of frames in this block&lt;br /&gt;
|-&lt;br /&gt;
|INT8[frameCount]||yOffsets||Per-frame vertical offsets&lt;br /&gt;
|-&lt;br /&gt;
|BYTE[frameCount % 2]||padding||Round offset table length to an even number&lt;br /&gt;
|-&lt;br /&gt;
|FRAME[frameCount]||frames||Frames in the shared SPX bitmap layout&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Blocks are concatenated with no file-level directory. Each FRAME uses the two-byte header, placement mask and five-plane bitmap described in [[Pushover Sprite Format]]. Its byte size is &amp;lt;tt&amp;gt;2 + widthUnits * 2 * height * 5&amp;lt;/tt&amp;gt;. After the final frame, the next big-endian count starts the next block.&lt;br /&gt;
&lt;br /&gt;
The signed offset byte is a vertical positioning adjustment, not a frame-duration field. The documented body anchor is &amp;lt;tt&amp;gt;X = column * 16 + 8&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Y = row * 16 + 6 + frameOffset + activityAdjustment&amp;lt;/tt&amp;gt;. The blitter subtracts height from Y for the top edge.&lt;br /&gt;
&lt;br /&gt;
=== Pose numbering ===&lt;br /&gt;
&lt;br /&gt;
The filenames describe pose ranges, but not every pose has a separately stored block. Some states reverse or alias previously loaded frames. Use the port&#039;s pose-mapping tables instead of assigning one consecutive pose number to every block. The export pipeline resolves 66 poses; its pose-32 alias is explicitly an approximation of a more complicated original construction.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Frame timing belongs to the executable’s animation state machine. The low width bits alone are insufficient for positioning, and treating the per-frame offset table as timing data produces incorrect movement.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/ant-sprites.md docs/formats/ant-sprites.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/ant-rendering.md docs/formats/ant-rendering.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/anx-decode.js tools/asset-convert/anx-decode.js] – decoder / format implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/export-viewer-data.js tools/asset-convert/export-viewer-data.js] – decoder / format implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/lib/sprite-unit-mask.js tools/lib/sprite-unit-mask.js] – shared frame placement&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Sprite_Format&amp;diff=13023</id>
		<title>Pushover Sprite Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Sprite_Format&amp;diff=13023"/>
		<updated>2026-10-20T06:50:32Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = EGA  | Hardware2 = VGA  | Depth = 4-bit colour + transparency  | Palette = External  | NumPlanes = 5  | HasTransparency = Y  | HasHitmap = No  | Games =    {{Game|Pushover}} }}  &amp;lt;tt&amp;gt;DATA/DOMINOE0.SPX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;DOMINOE1.SPX&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ANT10B29.SPX&amp;lt;/tt&amp;gt; contain Pushover domino and carried-domino graphics. Decompress RNC first. These are consecutive frame streams with counts supplied by the executable, not se...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = VGA&lt;br /&gt;
 | Depth = 4-bit colour + transparency&lt;br /&gt;
 | Palette = External&lt;br /&gt;
 | NumPlanes = 5&lt;br /&gt;
 | HasTransparency = Y&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Pushover}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;DATA/DOMINOE0.SPX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;DOMINOE1.SPX&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ANT10B29.SPX&amp;lt;/tt&amp;gt; contain [[Pushover]] domino and carried-domino graphics. Decompress [[Pushover RNC Compression|RNC]] first. These are consecutive frame streams with counts supplied by the executable, not self-describing animation containers.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
Each frame begins with two bytes:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Data type!!Name!!Description&lt;br /&gt;
|-&lt;br /&gt;
|UINT8||layout||Low 3 bits: number of stored 16-pixel units; high 5 bits: placement mask&lt;br /&gt;
|-&lt;br /&gt;
|UINT8||height||Height in rows&lt;br /&gt;
|-&lt;br /&gt;
|BYTE[widthUnits * 2 * height * 5]||planes||Five plane-major bitmaps&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A plane contains &amp;lt;tt&amp;gt;height&amp;lt;/tt&amp;gt; rows of &amp;lt;tt&amp;gt;2 * widthUnits&amp;lt;/tt&amp;gt; bytes. Bits run MSB-first. Assemble the five bits into a value 0–31: zero is transparent; otherwise the low four bits select the active palette. Value 16 is opaque palette colour 0.&lt;br /&gt;
&lt;br /&gt;
=== Placement mask ===&lt;br /&gt;
&lt;br /&gt;
The frame occupies selected units in an 80-pixel slot centred on the blitter&#039;s X argument. Header bit 7 selects the leftmost unit (X−40); bit 3 selects the rightmost (X+24). The population count of these five bits must match the low-three-bit unit count. Store units in left-to-right order. All observed runs are contiguous; a decoder must not discard the placement bits or assume that stored pixels begin at the slot&#039;s left edge. Y is a bottom-edge anchor, so the frame&#039;s top is Y−height.&lt;br /&gt;
&lt;br /&gt;
=== Domino banks ===&lt;br /&gt;
&lt;br /&gt;
Family frame counts, in executable order, are:&lt;br /&gt;
&amp;lt;pre&amp;gt;15,15,14,8,15,15,15,15,15,17,6,6,6,6,6,6,8,1&amp;lt;/pre&amp;gt;&lt;br /&gt;
Families 0–10 are in &amp;lt;tt&amp;gt;DOMINOE0.SPX&amp;lt;/tt&amp;gt;; 11–17 are in &amp;lt;tt&amp;gt;DOMINOE1.SPX&amp;lt;/tt&amp;gt;. Restart at byte zero when changing files. There is no family header on disk.&lt;br /&gt;
&lt;br /&gt;
=== Carried-domino bank ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;ANT10B29.SPX&amp;lt;/tt&amp;gt; contains 110 frames, arranged as eleven groups of ten (17720 decompressed bytes). Groups map to icon states &amp;lt;tt&amp;gt;0,1,2,3,4,5,6,12,13,14,15&amp;lt;/tt&amp;gt;. States 7–9 alias 6, while 10 and 11 alias 0 and 1. Within a group, domino type 1–10 selects &amp;lt;tt&amp;gt;(type−1) % 10&amp;lt;/tt&amp;gt;. The bank is used both by menu decoration and by the gameplay carried-domino overlay.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
The older &amp;lt;tt&amp;gt;spx.md&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;spx-to-png.js&amp;lt;/tt&amp;gt; describe a heuristic marker/monochrome interpretation. The fixed-count five-plane decoder consumes the gameplay banks exactly; do not combine the two interpretations into an invented second file region.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/domino-gameplay-sprites.md docs/formats/domino-gameplay-sprites.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/ant-sprites.md docs/formats/ant-sprites.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/domino-spx-decode.js tools/asset-convert/domino-spx-decode.js] – decoder / format implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/ant-carry-icon-decode.js tools/asset-convert/ant-carry-icon-decode.js] – decoder / format implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/lib/sprite-unit-mask.js tools/lib/sprite-unit-mask.js] – placement-mask decoder&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Decoration_Format&amp;diff=13022</id>
		<title>Pushover Decoration Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Decoration_Format&amp;diff=13022"/>
		<updated>2026-10-20T06:50:04Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Tileset Infobox  | Hardware1 = EGA  | Hardware2 = VGA  | MaxTiles = 24  | Palette = External  | Names = N  | TileMinSize = 16&amp;amp;times;16  | TileMaxSize = 16&amp;amp;times;16  | NumPlanes = 5  | PlaneArrangement = Plane-major, MSB-first  | HasTransparency = Y  | HasHitmap = N  | Metadata = None  | Subtilesets = N  | Compressed = Y  | Hidden = N  | Games =    {{Game|Pushover}} }}  &amp;lt;tt&amp;gt;THEMES/*.PLX&amp;lt;/tt&amp;gt; contains foreground and decorative icons for Pushover. Files are Pushover...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tileset Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = VGA&lt;br /&gt;
 | MaxTiles = 24&lt;br /&gt;
 | Palette = External&lt;br /&gt;
 | Names = N&lt;br /&gt;
 | TileMinSize = 16&amp;amp;times;16&lt;br /&gt;
 | TileMaxSize = 16&amp;amp;times;16&lt;br /&gt;
 | NumPlanes = 5&lt;br /&gt;
 | PlaneArrangement = Plane-major, MSB-first&lt;br /&gt;
 | HasTransparency = Y&lt;br /&gt;
 | HasHitmap = N&lt;br /&gt;
 | Metadata = None&lt;br /&gt;
 | Subtilesets = N&lt;br /&gt;
 | Compressed = Y&lt;br /&gt;
 | Hidden = N&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Pushover}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;THEMES/*.PLX&amp;lt;/tt&amp;gt; contains foreground and decorative icons for [[Pushover]]. Files are [[Pushover RNC Compression|RNC-compressed]] and use the matching [[Pushover Palette Format|.PAL]] palette. The decompressed icon layout is shared by .BCX and .PLX.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Relative offset!!Size!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00||32||Plane A (pixel bit 0)&lt;br /&gt;
|-&lt;br /&gt;
|0x20||32||Plane B (bit 1)&lt;br /&gt;
|-&lt;br /&gt;
|0x40||32||Plane C (bit 2)&lt;br /&gt;
|-&lt;br /&gt;
|0x60||32||Plane D (bit 3)&lt;br /&gt;
|-&lt;br /&gt;
|0x80||32||Plane E (bit 4)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
There is no header or offset table. Each icon occupies 160 bytes and measures 16×16 pixels. Icon &#039;&#039;i&#039;&#039; begins at &amp;lt;tt&amp;gt;i * 160&amp;lt;/tt&amp;gt;. Each plane has sixteen rows of two bytes; the most significant bit is the leftmost pixel.&lt;br /&gt;
&lt;br /&gt;
Combine the five corresponding bits into &amp;lt;tt&amp;gt;v = A | B&amp;amp;lt;&amp;amp;lt;1 | C&amp;amp;lt;&amp;amp;lt;2 | D&amp;amp;lt;&amp;amp;lt;3 | E&amp;amp;lt;&amp;amp;lt;4&amp;lt;/tt&amp;gt;. The repository decoders treat &amp;lt;tt&amp;gt;v == 0&amp;lt;/tt&amp;gt; as transparent and otherwise use palette index &amp;lt;tt&amp;gt;v &amp;amp;amp; 15&amp;lt;/tt&amp;gt;. Thus value 16 draws opaque palette colour 0. There are 16 displayed colours, not 32 independent palette entries.&lt;br /&gt;
&lt;br /&gt;
=== Tile numbering ===&lt;br /&gt;
&lt;br /&gt;
The eleven named theme banks contain 24 icons each. The foreground renderer selects these separately from the SCR background indices. &amp;lt;tt&amp;gt;THEMES/BOX.PLX&amp;lt;/tt&amp;gt; is an exception with nine icons (1440 bytes), forming a box frame; it has no matching .PAL and uses a supplied/active palette.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/plx-bcx.md docs/formats/plx-bcx.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/bcx-plx-to-png.js tools/asset-convert/bcx-plx-to-png.js] – decoder / format implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/theme-format-writer.js tools/asset-convert/theme-format-writer.js] – decoder / format implementation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Tileset_Format&amp;diff=13021</id>
		<title>Pushover Tileset Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Tileset_Format&amp;diff=13021"/>
		<updated>2026-10-20T06:49:36Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Tileset Infobox  | Hardware1 = EGA  | Hardware2 = VGA  | MaxTiles = 400  | Palette = External  | Names = N  | TileMinSize = 16&amp;amp;times;16  | TileMaxSize = 16&amp;amp;times;16  | NumPlanes = 5  | PlaneArrangement = Plane-major, MSB-first  | HasTransparency = Y  | HasHitmap = N  | Metadata = None  | Subtilesets = N  | Compressed = Y  | Hidden = N  | Games =    {{Game|Pushover}} }}  &amp;lt;tt&amp;gt;THEMES/*.BCX&amp;lt;/tt&amp;gt; contains background/architecture tiles for Pushover. Files are Pushover...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tileset Infobox&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | Hardware2 = VGA&lt;br /&gt;
 | MaxTiles = 400&lt;br /&gt;
 | Palette = External&lt;br /&gt;
 | Names = N&lt;br /&gt;
 | TileMinSize = 16&amp;amp;times;16&lt;br /&gt;
 | TileMaxSize = 16&amp;amp;times;16&lt;br /&gt;
 | NumPlanes = 5&lt;br /&gt;
 | PlaneArrangement = Plane-major, MSB-first&lt;br /&gt;
 | HasTransparency = Y&lt;br /&gt;
 | HasHitmap = N&lt;br /&gt;
 | Metadata = None&lt;br /&gt;
 | Subtilesets = N&lt;br /&gt;
 | Compressed = Y&lt;br /&gt;
 | Hidden = N&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Pushover}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;THEMES/*.BCX&amp;lt;/tt&amp;gt; contains background/architecture tiles for [[Pushover]]. Files are [[Pushover RNC Compression|RNC-compressed]] and use the matching [[Pushover Palette Format|.PAL]] palette. The decompressed icon layout is shared by .BCX and .PLX.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Relative offset!!Size!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00||32||Plane A (pixel bit 0)&lt;br /&gt;
|-&lt;br /&gt;
|0x20||32||Plane B (bit 1)&lt;br /&gt;
|-&lt;br /&gt;
|0x40||32||Plane C (bit 2)&lt;br /&gt;
|-&lt;br /&gt;
|0x60||32||Plane D (bit 3)&lt;br /&gt;
|-&lt;br /&gt;
|0x80||32||Plane E (bit 4)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
There is no header or offset table. Each icon occupies 160 bytes and measures 16×16 pixels. Icon &#039;&#039;i&#039;&#039; begins at &amp;lt;tt&amp;gt;i * 160&amp;lt;/tt&amp;gt;. Each plane has sixteen rows of two bytes; the most significant bit is the leftmost pixel.&lt;br /&gt;
&lt;br /&gt;
Combine the five corresponding bits into &amp;lt;tt&amp;gt;v = A | B&amp;amp;lt;&amp;amp;lt;1 | C&amp;amp;lt;&amp;amp;lt;2 | D&amp;amp;lt;&amp;amp;lt;3 | E&amp;amp;lt;&amp;amp;lt;4&amp;lt;/tt&amp;gt;. The repository decoders treat &amp;lt;tt&amp;gt;v == 0&amp;lt;/tt&amp;gt; as transparent and otherwise use palette index &amp;lt;tt&amp;gt;v &amp;amp;amp; 15&amp;lt;/tt&amp;gt;. Thus value 16 draws opaque palette colour 0. There are 16 displayed colours, not 32 independent palette entries.&lt;br /&gt;
&lt;br /&gt;
=== Tile numbering ===&lt;br /&gt;
&lt;br /&gt;
The SCR background word directly selects a zero-based .BCX icon. The loader supports up to 400 icons. Documented bank sizes are Aztec 392, Castle 286, Cavern 173, Dungeon 151, Electro 281, Greek 308, Japanese 341, Mechanic 373, Option 340, Space 400 and Toxcity 271.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/plx-bcx.md docs/formats/plx-bcx.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/bcx-plx-to-png.js tools/asset-convert/bcx-plx-to-png.js] – decoder / format implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/theme-format-writer.js tools/asset-convert/theme-format-writer.js] – decoder / format implementation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Palette_Format&amp;diff=13020</id>
		<title>Pushover Palette Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Palette_Format&amp;diff=13020"/>
		<updated>2026-10-20T06:49:04Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;&amp;lt;tt&amp;gt;THEMES/*.PAL&amp;lt;/tt&amp;gt; stores the 16-colour palettes used by Pushover theme graphics and sprites. These files are uncompressed.  == File format ==  {|class=&amp;quot;wikitable&amp;quot; !Offset!!Data type!!Description |- |0x00||UINT16BE[16]||Sixteen RGB444 colours, each stored as 0RGB |- |0x20||BYTE[32]||Zero padding in all 11 documented palettes |}  For a colour word &amp;lt;tt&amp;gt;w&amp;lt;/tt&amp;gt;, red is &amp;lt;tt&amp;gt;(w &amp;gt;&amp;gt; 8) &amp;amp; 15&amp;lt;/tt&amp;gt;, green is &amp;lt;tt&amp;gt;(w &amp;gt;&amp;gt; 4) &amp;amp; 15&amp;lt;/tt&amp;gt;, and blue is &amp;lt;tt&amp;gt;w &amp;amp; 15&amp;lt;/tt&amp;gt;. Multiply each...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;THEMES/*.PAL&amp;lt;/tt&amp;gt; stores the 16-colour palettes used by [[Pushover]] theme graphics and sprites. These files are uncompressed.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset!!Data type!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00||UINT16BE[16]||Sixteen RGB444 colours, each stored as 0RGB&lt;br /&gt;
|-&lt;br /&gt;
|0x20||BYTE[32]||Zero padding in all 11 documented palettes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For a colour word &amp;lt;tt&amp;gt;w&amp;lt;/tt&amp;gt;, red is &amp;lt;tt&amp;gt;(w &amp;gt;&amp;gt; 8) &amp;amp; 15&amp;lt;/tt&amp;gt;, green is &amp;lt;tt&amp;gt;(w &amp;gt;&amp;gt; 4) &amp;amp; 15&amp;lt;/tt&amp;gt;, and blue is &amp;lt;tt&amp;gt;w &amp;amp; 15&amp;lt;/tt&amp;gt;. Multiply each component by 17 to obtain an 8-bit channel. For example &amp;lt;tt&amp;gt;08 AE&amp;lt;/tt&amp;gt; decodes to RGB(136,170,238).&lt;br /&gt;
&lt;br /&gt;
The file is 64 bytes. Its second half is not another palette. Shared ant and domino sprites use the active theme palette; there is no separate colour table per sprite frame.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
The 0RGB interpretation was established by comparative rendering across the palettes, rather than a traced palette-loader instruction. Transparency is determined by the image format, not by the palette colour alone.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/pal.md docs/formats/pal.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/pal-to-json.js tools/asset-convert/pal-to-json.js] – decoder / format implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/theme-format-writer.js tools/asset-convert/theme-format-writer.js] – decoder / format implementation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Map_Format&amp;diff=13019</id>
		<title>Pushover Map Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_Map_Format&amp;diff=13019"/>
		<updated>2026-10-20T06:48:32Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Map Infobox  | Type = 2D tile-based  | Layers = 3 (background, structure, dominoes)  | Tile size = 16&amp;amp;times;16  | Viewport = 320&amp;amp;times;200  | Games =    {{Game|Pushover}} }}  &amp;lt;tt&amp;gt;SCREENS/*.SCR&amp;lt;/tt&amp;gt; contains the playable levels and menu backgrounds of Pushover. Files are RNC-compressed. All offsets below refer to decompressed bytes. Numbered levels are 3958 bytes (&amp;lt;tt&amp;gt;0xF76&amp;lt;/tt&amp;gt;); menu backgrounds can have shorter tails.  == File format...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Map Infobox&lt;br /&gt;
 | Type = 2D tile-based&lt;br /&gt;
 | Layers = 3 (background, structure, dominoes)&lt;br /&gt;
 | Tile size = 16&amp;amp;times;16&lt;br /&gt;
 | Viewport = 320&amp;amp;times;200&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Pushover}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;SCREENS/*.SCR&amp;lt;/tt&amp;gt; contains the playable levels and menu backgrounds of [[Pushover]]. Files are [[Pushover RNC Compression|RNC-compressed]]. All offsets below refer to decompressed bytes. Numbered levels are 3958 bytes (&amp;lt;tt&amp;gt;0xF76&amp;lt;/tt&amp;gt;); menu backgrounds can have shorter tails.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset!!Size!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x000||1560||20×13 row-major grid, 260 records of 6 bytes&lt;br /&gt;
|-&lt;br /&gt;
|0x618||8||NUL-padded ASCII theme name&lt;br /&gt;
|-&lt;br /&gt;
|0x620||2||Unidentified; zero in checked samples&lt;br /&gt;
|-&lt;br /&gt;
|0x622||8||NUL-padded music-name field; do not confuse with theme-to-track selection&lt;br /&gt;
|-&lt;br /&gt;
|0x62A||2||Unidentified; zero in checked samples&lt;br /&gt;
|-&lt;br /&gt;
|0x62C||4||Entry X, entry Y, exit X, exit Y; byte coordinates&lt;br /&gt;
|-&lt;br /&gt;
|0x630||4||Short ASCII tag; purpose unconfirmed&lt;br /&gt;
|-&lt;br /&gt;
|0x634||320||Four 80-byte hint slots&lt;br /&gt;
|-&lt;br /&gt;
|0x774||1||Time allowance: minutes&lt;br /&gt;
|-&lt;br /&gt;
|0x775||1||Time allowance: seconds&lt;br /&gt;
|-&lt;br /&gt;
|0x776||2048||Recorded input tape in numbered levels&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Grid cells ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Relative offset!!Data type!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0||UINT16BE||Background tile index into the selected theme’s .BCX bank&lt;br /&gt;
|-&lt;br /&gt;
|2||UINT8||Foreground structure&lt;br /&gt;
|-&lt;br /&gt;
|3||UINT8||Domino type&lt;br /&gt;
|-&lt;br /&gt;
|4||BYTE[2]||Skipped by the confirmed grid loader; preserve when editing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The grid is 20 columns by 13 rows, each cell representing 16×16 pixels. Foreground 20 marks the exit and 23 the entry. Values 4, 5 and 6 describe platform/ladder combinations or ladders. Do not adopt the unrelated clone&#039;s door names for 18, 19 or 21: their meanings are not established for these files.&lt;br /&gt;
&lt;br /&gt;
Domino 0 is empty; 1–10 are Standard, Stopper, Splitter, Exploder, Delay, Tumbler, Bridger, Vanish, Trigger and Ascender. Higher runtime values include crash states; names inherited from another implementation in the JSON parser are not a confirmed extended placement vocabulary.&lt;br /&gt;
&lt;br /&gt;
=== Hint text and solution tape ===&lt;br /&gt;
&lt;br /&gt;
Each hint slot contains five 16-byte, NUL-terminated, space-padded lines. Slots 0–2 are English, French and German; slot 3&#039;s language/purpose is unconfirmed. The time allowance is &amp;lt;tt&amp;gt;60 * minutes + seconds&amp;lt;/tt&amp;gt;; do not require the seconds byte to be less than 60, since 0:60 occurs in the documented samples.&lt;br /&gt;
&lt;br /&gt;
The final 2048 bytes are a tick-by-tick input-bitmask recording, not padding. Preserve them when changing unrelated fields. The original hidden solution playback can use this tape; the repository&#039;s level editor can record replacements.&lt;br /&gt;
&lt;br /&gt;
=== Filenames ===&lt;br /&gt;
&lt;br /&gt;
The decimal filename number is not the level ordinal. Starting with the level index, apply this 15-bit LFSR step three times, then format five decimal digits after &amp;lt;tt&amp;gt;P&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;feedback = (state &amp;amp; 1) ^ ((state &amp;gt;&amp;gt; 1) &amp;amp; 1)&lt;br /&gt;
state = ((state &amp;gt;&amp;gt; 1) | (feedback &amp;lt;&amp;lt; 14)) &amp;amp; 0x7FFF&amp;lt;/pre&amp;gt;&lt;br /&gt;
Level 1 is &amp;lt;tt&amp;gt;P04096.SCR&amp;lt;/tt&amp;gt;. The entered passcode uses six steps instead (level 1: &amp;lt;tt&amp;gt;00512&amp;lt;/tt&amp;gt;). &amp;lt;tt&amp;gt;OPTION0.SCR&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;OPTION1.SCR&amp;lt;/tt&amp;gt; use the same grid format. &amp;lt;tt&amp;gt;P00000.SCR&amp;lt;/tt&amp;gt; is a special bootstrap screen; its anti-piracy text does not establish that it is selected by a failed protection check.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
The short tag may contain designer initials, but this is a hypothesis. &amp;lt;tt&amp;gt;OPTION0.SCR&amp;lt;/tt&amp;gt; is documented as 3718 bytes: do not require every file to have the numbered-level tail size.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/screens-scr.md docs/formats/screens-scr.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/screens-scr-editor.md docs/formats/screens-scr-editor.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/scr-to-json.js tools/asset-convert/scr-to-json.js] – decoder / format implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/asset-convert/scr-writer.js tools/asset-convert/scr-writer.js] – decoder / format implementation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/engine/src/core/levelOrder.js engine/src/core/levelOrder.js] – filename and passcode mapping&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover_RNC_Compression&amp;diff=13018</id>
		<title>Pushover RNC Compression</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover_RNC_Compression&amp;diff=13018"/>
		<updated>2026-10-20T06:47:57Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;Most original Pushover assets use RNC ProPack method 1 compression, irrespective of their filename extension. Decode this wrapper before interpreting the inner format. The game uses the shared literal-run obfuscation key &amp;lt;tt&amp;gt;0x1984&amp;lt;/tt&amp;gt;.  == File format ==  {|class=&amp;quot;wikitable&amp;quot; !Offset!!Data type!!Name!!Description |- |0x00||BYTE[4]||signature||&amp;lt;tt&amp;gt;52 4E 43 01&amp;lt;/tt&amp;gt; (RNC, method 1) |- |0x04||UINT32BE||unpackedSize||Output byte count |- |0x08||UINT32BE||packedSize||Comp...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Most original [[Pushover]] assets use RNC ProPack method 1 compression, irrespective of their filename extension. Decode this wrapper before interpreting the inner format. The game uses the shared literal-run obfuscation key &amp;lt;tt&amp;gt;0x1984&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset!!Data type!!Name!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00||BYTE[4]||signature||&amp;lt;tt&amp;gt;52 4E 43 01&amp;lt;/tt&amp;gt; (RNC, method 1)&lt;br /&gt;
|-&lt;br /&gt;
|0x04||UINT32BE||unpackedSize||Output byte count&lt;br /&gt;
|-&lt;br /&gt;
|0x08||UINT32BE||packedSize||Compressed byte count excluding this 18-byte header&lt;br /&gt;
|-&lt;br /&gt;
|0x0C||UINT16BE||unpackedCRC||CRC16 of output&lt;br /&gt;
|-&lt;br /&gt;
|0x0E||UINT16BE||packedCRC||CRC16 of compressed bytes&lt;br /&gt;
|-&lt;br /&gt;
|0x10||UINT8||leeway||Encoder bookkeeping&lt;br /&gt;
|-&lt;br /&gt;
|0x11||UINT8||blocks||Huffman-table block count&lt;br /&gt;
|-&lt;br /&gt;
|0x12||BYTE[packedSize]||stream||Huffman-coded LZ stream&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Decompression ===&lt;br /&gt;
&lt;br /&gt;
Method 1 combines Huffman-coded literal lengths, match lengths and match offsets with LZ back-references. The initial stream flags include a key flag. Literal runs use the 16-bit key, rotated after each literal run; this is separate from [[Pushover Protection Format|THEME.DAT&#039;s cipher]]. Use the linked implementation for the bit-buffer and literal-stream interleaving rules. Check both CRCs and the declared output size.&lt;br /&gt;
&lt;br /&gt;
The repository&#039;s command-line decoder defaults to the correct key:&lt;br /&gt;
&amp;lt;pre&amp;gt;node tools/rnc-unpack/bin/cli.js input output --key=1984&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Uncompressed exceptions are &amp;lt;tt&amp;gt;QUAVERS.ICN&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;THEMES/*.PAL&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;THEMES/THEME.KEY&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;THEMES/THEME.DAT&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;PUSH.CFG&amp;lt;/tt&amp;gt;. The documentation reports successful verification of 171 non-executable compressed assets. The executable packing has separate unresolved issues; success on asset files does not establish executable unpacking support.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Pushover#Tools|pushover]], the open-source browser port and its reverse-engineering notes:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/docs/formats/rnc.md docs/formats/rnc.md] – reverse-engineering documentation&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/rnc-unpack/lib/rnc.js tools/rnc-unpack/lib/rnc.js] – decompressor and CRC handling&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover/blob/7a6bc884ce7c1bb669ccf05f04c536dce724a187/tools/rnc-unpack/lib/rnc-pack.js tools/rnc-unpack/lib/rnc-pack.js] – compressor&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Pushover&amp;diff=13017</id>
		<title>Pushover</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Pushover&amp;diff=13017"/>
		<updated>2026-10-20T06:47:23Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Game Infobox  | Levels = Edit  | Tiles = Edit  | Sprites = Some  | Fullscreen = Some  | Sound = Some  | Music = Some  | Text = Edit  | Story = Some  | Interface = Some  | Demo = Some }}  &amp;#039;&amp;#039;&amp;#039;Pushover&amp;#039;&amp;#039;&amp;#039; is a 1992 puzzle platform game developed by Red Rat Software. The player arranges dominoes so that a single push topples the required pieces and opens the exit. This page describes the original DOS data researched by the browser-port project.  Most assets are RNC-compres...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Game Infobox&lt;br /&gt;
 | Levels = Edit&lt;br /&gt;
 | Tiles = Edit&lt;br /&gt;
 | Sprites = Some&lt;br /&gt;
 | Fullscreen = Some&lt;br /&gt;
 | Sound = Some&lt;br /&gt;
 | Music = Some&lt;br /&gt;
 | Text = Edit&lt;br /&gt;
 | Story = Some&lt;br /&gt;
 | Interface = Some&lt;br /&gt;
 | Demo = Some&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pushover&#039;&#039;&#039; is a 1992 puzzle platform game developed by Red Rat Software. The player arranges dominoes so that a single push topples the required pieces and opens the exit. This page describes the original DOS data researched by the browser-port project.&lt;br /&gt;
&lt;br /&gt;
Most assets are RNC-compressed, regardless of extension. Decompress them before parsing the formats below. Multi-byte values in the art and level data are generally big-endian; the front-end FLX container and x86 sound-driver pointers are little-endian. The individual pages specify the exceptions.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name!!Platform!!Archives!!Levels!!Graphics!!Music!!Sounds!!Text!!Saves!!.exe patch!!Notes&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/VorticonCmdr/pushover pushover]||Web browser / Node.js||Inspect||Edit||Edit/export||Play/inspect||Play||Some||No||No||Open-source browser port with [https://vorticoncmdr.github.io/pushover/engine/viewer/editor.html level editor], [https://vorticoncmdr.github.io/pushover/engine/viewer/theme-editor.html theme editor], sprite viewers and music explorer. Level and theme editors export original formats. Requires the user’s original game files.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File formats ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Filename!!Format!!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;RNC-compressed assets&amp;lt;/tt&amp;gt;||[[Pushover RNC Compression]]||Shared compression wrapper&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;SCREENS/*.SCR&amp;lt;/tt&amp;gt;||[[Pushover Map Format]]||Levels, hints, time allowance and solution tape&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;THEMES/*.PAL&amp;lt;/tt&amp;gt;||[[Pushover Palette Format]]||16-colour RGB444 palettes&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;THEMES/*.BCX&amp;lt;/tt&amp;gt;||[[Pushover Tileset Format]]||Background/architecture tiles&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;THEMES/*.PLX&amp;lt;/tt&amp;gt;||[[Pushover Decoration Format]]||Foreground and decoration icons&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;DATA/DOMINOE0.SPX, DOMINOE1.SPX, ANT10B29.SPX&amp;lt;/tt&amp;gt;||[[Pushover Sprite Format]]||Domino and carried-domino frames&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;DATA/ANT*.ANX&amp;lt;/tt&amp;gt;||[[Pushover Ant Animation Format]]||Ant pose blocks&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;DATA/*.PIX&amp;lt;/tt&amp;gt;||[[Pushover Image Format]]||Full-screen planar backdrops&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;DATA/*.DLX&amp;lt;/tt&amp;gt;||[[Pushover Delta Animation Format]]||XOR image updates&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;DATA/LANG0–3.DAX&amp;lt;/tt&amp;gt;||[[Pushover Language Format]]||UI messages&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;DATA/PUSHOVER.FLX, CC0–5.FLX&amp;lt;/tt&amp;gt;||[[Pushover Preview Animation Format]]||Front-end image/animation commands&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;THEMES/THEME.KEY&amp;lt;/tt&amp;gt;||[[Pushover Theme Table Format]]||Count tables and music-name mapping&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;MUSIC/OVER_*.BIN&amp;lt;/tt&amp;gt;||[[Pushover Music Format]]||Executable drivers with music and sound data&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;MUSIC/CDEMO_*.BIX&amp;lt;/tt&amp;gt;||[[Pushover Intro Music Format]]||Front-end drivers; inner layout not mapped&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;THEMES/THEME.DAT&amp;lt;/tt&amp;gt;||[[Pushover Protection Format]]||Encrypted executable protection payload&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;QUAVERS.ICN&amp;lt;/tt&amp;gt;||[[Pushover Icon Format]]||Uncompressed asset; layout undocumented&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;PUSH.CFG&amp;lt;/tt&amp;gt;||[[Pushover Configuration Format]]||Configuration; layout undocumented&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* File counts and size observations describe the repository&#039;s examined DOS data set, not a guarantee for every release.&lt;br /&gt;
* The repository does not distribute the original game assets. The articles are based on its research and parser code, not on a new verification against original asset files.&lt;br /&gt;
* Some research files retain superseded hypotheses. The linked pages distinguish established layouts from unresolved fields; FLX is visual animation data, and THEME.KEY’s names are music mappings.&lt;br /&gt;
* Game executables and modern repository outputs (PNG, JSON, JavaScript and similar files) are not additional proprietary asset formats.&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://vorticoncmdr.github.io/pushover/ pushover browser port]&lt;br /&gt;
* [https://github.com/VorticonCmdr/pushover pushover on GitHub] – parsers, editors and reverse-engineering notes&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Intro Page]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=File:Alley_Cat.png&amp;diff=13016</id>
		<title>File:Alley Cat.png</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=File:Alley_Cat.png&amp;diff=13016"/>
		<updated>2026-10-20T06:23:00Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Sound_Table_Format&amp;diff=13015</id>
		<title>Alley Cat Sound Table Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Sound_Table_Format&amp;diff=13015"/>
		<updated>2026-10-20T06:21:41Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;Besides the title tune, the IBM PC version of Alley Cat contains direct PIT-divisor sequences, rhythm tables and speaker-bit patterns. Other effects calculate pitches in code. There is no single sound bank, sample container or per-effect record format.  == File format ==  The following embedded tables are decoded by &amp;lt;tt&amp;gt;src/game/sound.js&amp;lt;/tt&amp;gt;. Addresses are IBM DS offsets (file offset = DS offset + 0x300); words are little-endian. The exten...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Besides the [[Alley Cat Music Format|title tune]], the IBM PC version of [[Alley Cat]] contains direct PIT-divisor sequences, rhythm tables and speaker-bit patterns. Other effects calculate pitches in code. There is no single sound bank, sample container or per-effect record format.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The following embedded tables are decoded by &amp;lt;tt&amp;gt;src/game/sound.js&amp;lt;/tt&amp;gt;. Addresses are IBM DS offsets (file offset = DS offset + 0x300); words are little-endian. The extents below are stated only where the consumer establishes them.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!DS address!!Encoding!!Consumer / interpretation&lt;br /&gt;
|-&lt;br /&gt;
|0x5934||UINT16LE divisors||tuneStep(): word index in bytes, stepped by 2; wraps at byte offset 0x86&lt;br /&gt;
|-&lt;br /&gt;
|0x5A87||UINT16LE divisors||returnTune(): successful-return sequence, a new divisor every two ticks; the caller governs its lifetime&lt;br /&gt;
|-&lt;br /&gt;
|0x5AA3||UINT16LE divisors||returnTune(): failure-return sequence; zero silences the speaker for that call&lt;br /&gt;
|-&lt;br /&gt;
|0x5A64||UINT16LE divisors||twoTone()/twoToneNext(): alternating adjacent note words and a movable base index&lt;br /&gt;
|-&lt;br /&gt;
|0x5A5A||UINT16LE[4]||wipeTick(): reads offsets 0, 2, 4, 6 cyclically&lt;br /&gt;
|-&lt;br /&gt;
|0x5A44||UINT16LE[8] addressed by melody path||alleyMusic(): pitch lookup indexed by a word offset masked with 0x0E; another path cycles the first three words&lt;br /&gt;
|-&lt;br /&gt;
|0x5A1A||UINT16LE[16]||hitSound(): base pitches selected by a byte offset masked with 0x1E&lt;br /&gt;
|-&lt;br /&gt;
|0x5AD2||UINT8[16]||clickPattern(): low speaker-control bits, indexed with 0x0F&lt;br /&gt;
|-&lt;br /&gt;
|0x5AE6||UINT8[32]||flashClicks(): values XORed into port 61h, indexed with 0x1F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These are table &#039;&#039;uses&#039;&#039;, not self-describing headers. Do not infer arbitrary table lengths from the distance between addresses: state variables and unrelated data are interspersed with constants.&lt;br /&gt;
&lt;br /&gt;
=== Alley rhythm parameters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;alleyMusic()&amp;lt;/tt&amp;gt; selects a context &amp;lt;tt&amp;gt;si&amp;lt;/tt&amp;gt; from 0–3, with &amp;lt;tt&amp;gt;di = 2 * si&amp;lt;/tt&amp;gt;. It reads the following parameter bases:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!DS expression!!Read as!!Use&lt;br /&gt;
|-&lt;br /&gt;
|0x59F2 + di||UINT16LE||Minimum tick interval&lt;br /&gt;
|-&lt;br /&gt;
|0x59FA + si||UINT8||Counter mask&lt;br /&gt;
|-&lt;br /&gt;
|0x59FC + si||UINT8||Pattern mask&lt;br /&gt;
|-&lt;br /&gt;
|0x59FE + di||UINT16LE||Offset into rhythm-byte data&lt;br /&gt;
|-&lt;br /&gt;
|0x5A02 + di||UINT16LE||Normal blip duration in PIT counts&lt;br /&gt;
|-&lt;br /&gt;
|0x5A06 + di||UINT16LE||Alternate blip duration in PIT counts&lt;br /&gt;
|-&lt;br /&gt;
|0x5A0A + si||UINT8||Pattern increment&lt;br /&gt;
|-&lt;br /&gt;
|0x5A0C + si||UINT8||Random-choice threshold&lt;br /&gt;
|-&lt;br /&gt;
|0x59C2 + computedIndex||UINT8||Rhythm bits tested against a rotating mask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The expressions reproduce the consumer&#039;s addressing. They are not a proposed fixed-size struct, and their apparent ranges must not be assumed to be independent allocations. Pitch and rhythm also depend on game state and random values.&lt;br /&gt;
&lt;br /&gt;
== Playback ==&lt;br /&gt;
&lt;br /&gt;
For divisor-based tones, frequency is approximately &amp;lt;tt&amp;gt;1193182 / divisor&amp;lt;/tt&amp;gt; Hz; a PIT divisor word of zero represents 65536. A &#039;&#039;consumer-specific&#039;&#039; zero check can instead mute a sequence before programming the PIT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;tuneStep()&amp;lt;/tt&amp;gt; advances every two BIOS ticks. It silences a step whose divisor equals the previous divisor, so repeated equal words are not automatically a held note. &amp;lt;tt&amp;gt;tunePlay()&amp;lt;/tt&amp;gt; stops its enclosing loop when the sequence byte index reaches 0x7C, earlier than &amp;lt;tt&amp;gt;tuneStep()&amp;lt;/tt&amp;gt;&#039;s wrap threshold of 0x86.&lt;br /&gt;
&lt;br /&gt;
The failure branch of &amp;lt;tt&amp;gt;returnTune()&amp;lt;/tt&amp;gt; increments its index before checking a zero word and returning. Zero therefore silences that call; it is not a general parser sentinel that guarantees all later calls stop reading. The return sequence&#039;s caller controls how long playback continues.&lt;br /&gt;
&lt;br /&gt;
Direct speaker-bit patterns operate on port 61h and must not be interpreted as unsigned PCM. Sweeps, random noise, jump sounds and other effects combine constants, timers and code. Reproducing them requires the corresponding routine as well as its data.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The sound-enable flag is DS:0000. Some effects skip busy waits when disabled, which also changes game timing.&lt;br /&gt;
* The asset viewer reconstructs title music only; it does not export or play each of these effect tables as an independent asset.&lt;br /&gt;
* These addresses and routines document the IBM executable. Tandy&#039;s player and hardware writes differ; do not assume that a shifted data address supplies a complete Tandy implementation.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Alley Cat#Tools|re-alleycat]], the open-source HTML5 port (revision &amp;lt;tt&amp;gt;b003aa63ffbb&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/sound.js src/game/sound.js] – secondary tune readers, rhythm parameters and procedural effects&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/machine/speaker.js src/machine/speaker.js] – PIT and port 61h audio model&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/docs/RE_NOTES.md docs/RE_NOTES.md] – hardware touchpoints and timing caveats&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. Please credit the original research when using this information in your own project, and include a link back to this wiki.&lt;br /&gt;
&lt;br /&gt;
[[Category:Alley Cat]]&lt;br /&gt;
[[Category:All file formats]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Tandy_Music_Format&amp;diff=13014</id>
		<title>Alley Cat Tandy Music Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Tandy_Music_Format&amp;diff=13014"/>
		<updated>2026-10-20T06:21:03Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Music Infobox  | Type = Custom  | Instruments = SN76496  | NumChannels = 3  | Tags = None  | Games =    {{Game|Alley Cat}} }}  The Tandy edition of Alley Cat stores a three-voice title tune in &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;. Separate byte lists supply notes and durations for each voice. The format and player differ from the IBM PC title tune.  == File format ==  All offsets on this page are &amp;#039;&amp;#039;native Tandy DS offsets&amp;#039;&amp;#039;. Add 0x6940 to obtain a file...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Music Infobox&lt;br /&gt;
 | Type = Custom&lt;br /&gt;
 | Instruments = SN76496&lt;br /&gt;
 | NumChannels = 3&lt;br /&gt;
 | Tags = None&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Alley Cat}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The Tandy edition of [[Alley Cat]] stores a three-voice title tune in &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;. Separate byte lists supply notes and durations for each voice. The format and player differ from the [[Alley Cat Music Format|IBM PC title tune]].&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
All offsets on this page are &#039;&#039;native Tandy DS offsets&#039;&#039;. Add 0x6940 to obtain a file offset; do not apply the IBM-to-Tandy address map. Words are little-endian.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!DS offset!!Data type!!Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x1014||UINT16LE[]||Tone-divisor lookup data&lt;br /&gt;
|-&lt;br /&gt;
|0x1231, 0x123A, 0x1243||9-byte voice records||Per-voice playback state and list pointers&lt;br /&gt;
|-&lt;br /&gt;
|0x124C||UINT16LE[3]||Pointers to the three voice records&lt;br /&gt;
|-&lt;br /&gt;
|0x1254||UINT16LE||Runtime arrangement pass, stepped by 2&lt;br /&gt;
|-&lt;br /&gt;
|0x1256||UINT16LE[4]||Highest active voice offset per pass: 0, 2, 4, 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The RE notes describe each voice record as countdown, attenuation, index word, channel bits, note-list pointer and duration-list pointer. The viewer directly decodes the two pointers as follows:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Record-relative offset!!Data type!!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|+5||UINT16LE||DS pointer to note bytes&lt;br /&gt;
|-&lt;br /&gt;
|+7||UINT16LE||DS pointer to duration bytes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The other fields are mutable player state; the viewer reconstructs countdown, attenuation and index in its own objects. At sequence index &#039;&#039;i&#039;&#039;, read &amp;lt;tt&amp;gt;notes[i]&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;durations[i]&amp;lt;/tt&amp;gt;. There is no stored sequence count.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Note byte!!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|0x00||Mute this voice&lt;br /&gt;
|-&lt;br /&gt;
|0x86||Reset this voice index to zero and fetch again; voice 0 also advances the arrangement pass by 2&lt;br /&gt;
|-&lt;br /&gt;
|Other||Read a UINT16LE at DS:(0x1014 + note) and use its low 10 bits as the tone divisor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As in the IBM tune, the note byte is a byte offset, not a word index. The parallel duration byte supplies the countdown. Validated playback should follow the decrement-before-fetch behaviour of &amp;lt;tt&amp;gt;tandyTune()&amp;lt;/tt&amp;gt;; a zero duration is not documented as an end marker.&lt;br /&gt;
&lt;br /&gt;
== Playback ==&lt;br /&gt;
&lt;br /&gt;
The player runs once per BIOS tick with PIT channel 0 programmed to CFFFh:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;secondsPerTick = 53247 / 1193182&lt;br /&gt;
frequencyHz = 3579545 / (32 * divisor)  (for a non-zero divisor)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This gives about 22.41 ticks per second. A new audible note sets attenuation to 3. On subsequent ticks while the note&#039;s countdown remains non-zero, attenuation increases by 2 until 0Fh (silent). A rest immediately mutes the voice.&lt;br /&gt;
&lt;br /&gt;
Voice 0 is enabled on the first pass, voices 0–1 on the second and all three on the third and fourth. The arrangement table is indexed by &amp;lt;tt&amp;gt;(pass &amp;amp; 6) / 2&amp;lt;/tt&amp;gt;; its values are compared against &amp;lt;tt&amp;gt;2 * voiceNumber&amp;lt;/tt&amp;gt;. The loop markers allow continued playback; the viewer chooses to reconstruct four passes rather than treating the fourth pass as an encoded end marker.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The RE notes report 288 ticks per voice sequence, 1152 ticks for four passes, and an exact comparison of reconstructed audible divisors and attenuation against 4214 writes to port C0h over 1153 player ticks in DOSBox.&lt;br /&gt;
* The full Tandy game is not ported. This article describes the independently reconstructed title player and its tables, not a complete Tandy sound-effect decoder.&lt;br /&gt;
* The viewer guards reconstruction at 20000 ticks and limits consecutive loop-marker retries. Those are reader safeguards, not fields in the executable.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Alley Cat#Tools|re-alleycat]], the open-source HTML5 port (revision &amp;lt;tt&amp;gt;b003aa63ffbb&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/viewer.html viewer.html] – tandyTune(), playTandy() and native Tandy pointers&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/docs/RE_NOTES.md docs/RE_NOTES.md] – Tandy player analysis, timing and chip-write validation&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. Please credit the original research when using this information in your own project, and include a link back to this wiki.&lt;br /&gt;
&lt;br /&gt;
[[Category:Alley Cat]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Music_Format&amp;diff=13013</id>
		<title>Alley Cat Music Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Music_Format&amp;diff=13013"/>
		<updated>2026-10-20T06:20:36Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Music Infobox  | Type = Custom  | Instruments = PC Speaker  | NumChannels = 1  | Tags = None  | Games =    {{Game|Alley Cat}} }}  The IBM PC title melody in Alley Cat is an embedded byte sequence indexed into a table of PIT channel 2 divisors. It is neither sampled audio nor MIDI. The Tandy title uses a different three-voice format.  == File format ==  All addresses are IBM DS offsets; add 0x300 for file offsets.  {|class=&amp;quot;wikitable...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Music Infobox&lt;br /&gt;
 | Type = Custom&lt;br /&gt;
 | Instruments = PC Speaker&lt;br /&gt;
 | NumChannels = 1&lt;br /&gt;
 | Tags = None&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Alley Cat}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The IBM PC title melody in [[Alley Cat]] is an embedded byte sequence indexed into a table of PIT channel 2 divisors. It is neither sampled audio nor MIDI. The Tandy title uses a different [[Alley Cat Tandy Music Format|three-voice format]].&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
All addresses are IBM DS offsets; add 0x300 for file offsets.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!DS offset!!Data type!!Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x5320||UINT16LE||Runtime sequence index&lt;br /&gt;
|-&lt;br /&gt;
|0x5322||UINT16LE||Runtime last BIOS tick&lt;br /&gt;
|-&lt;br /&gt;
|0x5324||UINT16LE[]||PIT divisor lookup data&lt;br /&gt;
|-&lt;br /&gt;
|0x538C||UINT8[]||Title note sequence, ending with 0x66&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each note byte has this meaning:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Value!!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|0x00||Silence for one BIOS tick&lt;br /&gt;
|-&lt;br /&gt;
|0x66||End the tune and silence the speaker; do not advance the sequence index&lt;br /&gt;
|-&lt;br /&gt;
|Other||Read a UINT16LE divisor at DS:(0x5324 + value) and sound it for this tick&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The byte is a &#039;&#039;byte offset&#039;&#039; into the divisor data, not a MIDI pitch or a word index. Do not multiply it by two. The routine does not validate a note value before using it; an editor should restrict new values to known divisor entries and preserve the terminator.&lt;br /&gt;
&lt;br /&gt;
== Playback ==&lt;br /&gt;
&lt;br /&gt;
The player (CS:53B0) processes one event when the BIOS tick changes, approximately 18.2065 events per second. Non-zero notes program PIT channel 2 in square-wave mode and enable the PC speaker. For divisor &#039;&#039;d&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;frequencyHz = 1193182 / (d == 0 ? 65536 : d)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every sequence byte before the terminator occupies one tick, including rests. Consecutive copies of a note continue that pitch across ticks. The viewer constructs square-wave oscillators from the same sequence and divisor data; its 1024-event guard is not a file-format length field.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The sound-enable flag is DS:0000. With sound disabled, the translated title routine returns before advancing the melody.&lt;br /&gt;
* Runtime indices and timing words are player state, not a header that must be prepended to exported music.&lt;br /&gt;
* Other IBM tunes use direct divisor words and different timing rules; see [[Alley Cat Sound Table Format]].&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Alley Cat#Tools|re-alleycat]], the open-source HTML5 port (revision &amp;lt;tt&amp;gt;b003aa63ffbb&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/title.js src/game/title.js] – titleMusic() (CS:53B0)&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/viewer.html viewer.html] – IBM title-note decoding and playback&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/machine/speaker.js src/machine/speaker.js] – PIT speaker model&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. Please credit the original research when using this information in your own project, and include a link back to this wiki.&lt;br /&gt;
&lt;br /&gt;
[[Category:Alley Cat]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Text_Format&amp;diff=13012</id>
		<title>Alley Cat Text Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Text_Format&amp;diff=13012"/>
		<updated>2026-10-20T06:20:05Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;Menu and pause text in Alley Cat consists of NUL-terminated byte strings embedded in the executable. The visible title logo and credits artwork are images, rather than text strings.  == File format ==  There is no string-file header or global string count. The normal print routine reads one byte at a time until &amp;lt;tt&amp;gt;0x00&amp;lt;/tt&amp;gt;, and sends every preceding byte to BIOS INT 10h teletype output using colour 2.  {|class=&amp;quot;wikitable&amp;quot; !Data type!!Name...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Menu and pause text in [[Alley Cat]] consists of NUL-terminated byte strings embedded in the executable. The visible title logo and credits artwork are [[Alley Cat Image Format|images]], rather than text strings.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
There is no string-file header or global string count. The normal print routine reads one byte at a time until &amp;lt;tt&amp;gt;0x00&amp;lt;/tt&amp;gt;, and sends every preceding byte to BIOS INT 10h teletype output using colour 2.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Data type!!Name!!Description&lt;br /&gt;
|-&lt;br /&gt;
|BYTE[n]||characters||Character bytes and BIOS text controls&lt;br /&gt;
|-&lt;br /&gt;
|UINT8||terminator||0x00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The port handles carriage return (0D), line feed (0A), backspace (08) and bell (07; no audible bell is emitted by its BIOS substitute). Printable ASCII can be recovered directly. The viewer&#039;s ASCII scanner is only a discovery aid; it is not the game&#039;s string decoder.&lt;br /&gt;
&lt;br /&gt;
=== Menu tables ===&lt;br /&gt;
&lt;br /&gt;
At each menu-line call, &amp;lt;tt&amp;gt;bx&amp;lt;/tt&amp;gt; is an even byte index held at DS:6D8F:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!IBM DS address!!Read as!!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|0x6D37 + bx||UINT16LE||Pointer to NUL-terminated text&lt;br /&gt;
|-&lt;br /&gt;
|0x6D63 + bx + 1||UINT8||Screen row&lt;br /&gt;
|-&lt;br /&gt;
|0x6D8F||UINT16LE||Current menu-table byte index, incremented by 2 after selecting a line&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The column is set to 0 by the caller. Only the second byte of each two-byte row-table slot is used by this routine. Menu code selects particular ranges of entries; there is no stored record count.&lt;br /&gt;
&lt;br /&gt;
=== Pause strings ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!IBM DS offset!!Use&lt;br /&gt;
|-&lt;br /&gt;
|0x6D91||First pause message&lt;br /&gt;
|-&lt;br /&gt;
|0x6DB2||Keyboard-mode continuation message&lt;br /&gt;
|-&lt;br /&gt;
|0x6DD3||Joystick-mode continuation message&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* For an in-place edit, keep the string and terminator within the original allocation. Moving a string also requires updating its pointers or hard-coded references.&lt;br /&gt;
* The viewer displays runs of at least eight bytes from printable ASCII plus CR/LF, and requires a sequence of at least three letters. It scans the entire file, so short strings can be missed and code or binary data can appear as false matches.&lt;br /&gt;
* The Tandy piecewise address map does not cover the IBM menu-pointer range beginning at 6D37. Do not assume that all menu structures can be translated with that map; the Tandy-specific layout needs separate analysis. Raw string scanning remains available.&lt;br /&gt;
* Text is rendered using the machine&#039;s ROM font. The port&#039;s substitute font is not an original game asset.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Alley Cat#Tools|re-alleycat]], the open-source HTML5 port (revision &amp;lt;tt&amp;gt;b003aa63ffbb&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/title.js src/game/title.js] – print(), menuLine(), pause messages and menu ranges&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/machine/bios.js src/machine/bios.js] – BIOS character handling&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/viewer.html viewer.html] – strings() discovery heuristic and Tandy map&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. Please credit the original research when using this information in your own project, and include a link back to this wiki.&lt;br /&gt;
&lt;br /&gt;
[[Category:Alley Cat]]&lt;br /&gt;
[[Category:All file formats]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Scenery_Format&amp;diff=13011</id>
		<title>Alley Cat Scenery Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Scenery_Format&amp;diff=13011"/>
		<updated>2026-10-20T06:19:40Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;Backgrounds in Alley Cat use lists of rectangular image placements, mixed with procedural drawing. These lists are embedded data, not standalone map files. Each list gives one common image size followed by source-pointer/destination pairs.  == File format ==  All words are little-endian. Addresses below refer to the IBM data segment unless stated otherwise.  {|class=&amp;quot;wikitable&amp;quot; !Relative offset!!Data type!!Name!!Description |- |0||UINT8||widthBytes||Width of every re...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Backgrounds in [[Alley Cat]] use lists of rectangular image placements, mixed with procedural drawing. These lists are embedded data, not standalone map files. Each list gives one common image size followed by source-pointer/destination pairs.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
All words are little-endian. Addresses below refer to the IBM data segment unless stated otherwise.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Relative offset!!Data type!!Name!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0||UINT8||widthBytes||Width of every rectangle in bytes; multiply by 4 for pixels&lt;br /&gt;
|-&lt;br /&gt;
|1||UINT8||height||Height of every rectangle in rows&lt;br /&gt;
|-&lt;br /&gt;
|2 onward||PAIR[]||placements||Read until a source word of 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
|After last pair||UINT16LE||end||0xFFFF; no destination word is consumed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each placement pair is:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Data type!!Name!!Description&lt;br /&gt;
|-&lt;br /&gt;
|UINT16LE||source||DS offset of packed image bytes&lt;br /&gt;
|-&lt;br /&gt;
|UINT16LE||destination||CGA byte offset, added to the base supplied by the caller&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The minimum consumed length is &amp;lt;tt&amp;gt;2 + 4 * count + 2&amp;lt;/tt&amp;gt; bytes. Each source image occupies &amp;lt;tt&amp;gt;widthBytes * height&amp;lt;/tt&amp;gt; bytes. The renderer copies it opaquely and advances the destination through alternating CGA scan-line banks. It does not interpret destinations as x/y coordinate pairs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;destination = (storedDestination + callerBase) &amp;amp; 0xFFFF&lt;br /&gt;
for each image row:&lt;br /&gt;
    copy widthBytes consecutive source bytes to destination&lt;br /&gt;
    destination = destination XOR 0x2000&lt;br /&gt;
    if (destination &amp;amp; 0x2000) == 0:&lt;br /&gt;
        destination += 80&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here &amp;lt;tt&amp;gt;destination&amp;lt;/tt&amp;gt; is kept at the beginning of the current row before the XOR. The real routine advances it while copying and subtracts the row width first.&lt;br /&gt;
&lt;br /&gt;
== Lists and groups ==&lt;br /&gt;
&lt;br /&gt;
The viewer follows lists at DS offsets &amp;lt;tt&amp;gt;28A0, 251C, 2384, 238C, 2570, 2344, 2624, 3C22, 3C3E, 3C9A, 3C56, 2E24, 361C&amp;lt;/tt&amp;gt; (hexadecimal).&lt;br /&gt;
&lt;br /&gt;
Furniture groups contain pointers to shape lists. The viewer follows four pointers at &amp;lt;tt&amp;gt;2634 + 2*i&amp;lt;/tt&amp;gt;, five at &amp;lt;tt&amp;gt;263C + 2*i&amp;lt;/tt&amp;gt; and four at &amp;lt;tt&amp;gt;2646 + 2*i&amp;lt;/tt&amp;gt;, with &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; starting at 1. The actual &amp;lt;tt&amp;gt;shapeGroup()&amp;lt;/tt&amp;gt; renderer visits its selected offsets in descending order; the catalogue&#039;s ascending traversal is for finding graphics, not reproducing drawing order. Group base 2634 is also used as runtime scratch storage for the placement base.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* This is only the placement-list component of the backgrounds. Room selection, procedural tiles, object setup, collision and goals are implemented in code and other tables. There is no complete editable level record in this format.&lt;br /&gt;
* The list has a sentinel, not a count. The viewer&#039;s 1024-byte scan guard is a defensive catalogue limit, not a stored length.&lt;br /&gt;
* Preserve a non-zero row count: the original decrement-and-repeat loop does not treat zero as an empty image.&lt;br /&gt;
* Tandy source pointers are native Tandy DS offsets. Apply the edition map to known literal list addresses, not to pointers read from the lists.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Alley Cat#Tools|re-alleycat]], the open-source HTML5 port (revision &amp;lt;tt&amp;gt;b003aa63ffbb&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/alley.js src/game/alley.js] – drawShapes() (CS:2B40), shape header and placement decoder&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/rooms/common.js src/game/rooms/common.js] – roomBackground(), shapeGroup() and group traversal&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/viewer.html viewer.html] – shapes() and catalogue list locations&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. Please credit the original research when using this information in your own project, and include a link back to this wiki.&lt;br /&gt;
&lt;br /&gt;
[[Category:Alley Cat]]&lt;br /&gt;
[[Category:All file formats]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Sprite_Table_Format&amp;diff=13010</id>
		<title>Alley Cat Sprite Table Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Sprite_Table_Format&amp;diff=13010"/>
		<updated>2026-10-20T06:18:59Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = CGA  | Depth = 2-bit (CGA)  | Palette = Shared  | NumPlanes = 1  | HasTransparency = P  | HasHitmap = No  | Games =    {{Game|Alley Cat}} }}  Many animated sprites in Alley Cat are selected through little-endian pointer tables embedded in the executable. Each pointer refers to a headerless packed image. The frame count is supplied by the calling code; it is not a count field at the start of the table.  == File...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = CGA&lt;br /&gt;
 | Depth = 2-bit (CGA)&lt;br /&gt;
 | Palette = Shared&lt;br /&gt;
 | NumPlanes = 1&lt;br /&gt;
 | HasTransparency = P&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Alley Cat}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Many animated sprites in [[Alley Cat]] are selected through little-endian pointer tables embedded in the executable. Each pointer refers to a headerless [[Alley Cat Image Format|packed image]]. The frame count is supplied by the calling code; it is not a count field at the start of the table.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
A fixed-size animation uses &amp;lt;tt&amp;gt;UINT16LE pointers[count]&amp;lt;/tt&amp;gt;. Each value is a DS-relative address. Width and height are known to the caller.&lt;br /&gt;
&lt;br /&gt;
Variable-size animations use a separate, parallel &amp;lt;tt&amp;gt;UINT16LE sizes[count]&amp;lt;/tt&amp;gt; table. It is not interleaved with the pointer table:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Size-word component!!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|Low byte||Width in 16-bit words; multiply by 8 for pixels&lt;br /&gt;
|-&lt;br /&gt;
|High byte||Height in rows&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;source = read16(pointerTable + 2 * frame)&lt;br /&gt;
size = read16(sizeTable + 2 * frame)&lt;br /&gt;
width = (size &amp;amp; 255) * 8&lt;br /&gt;
height = size &amp;gt;&amp;gt; 8&lt;br /&gt;
byteLength = 2 * (size &amp;amp; 255) * height&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Frame tables ==&lt;br /&gt;
&lt;br /&gt;
The following catalogue entries use IBM DS offsets. A dash means that the dimensions are fixed in the caller. The drawing modes are those used by the viewer catalogue.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Group!!Pointers!!Frames!!Size table or fixed dimensions!!Mode&lt;br /&gt;
|-&lt;br /&gt;
|Cat walking||0x0F7A||12||24&amp;amp;times;11||AND&lt;br /&gt;
|-&lt;br /&gt;
|Cat idle upper||0x0F92||8||16&amp;amp;times;6||AND&lt;br /&gt;
|-&lt;br /&gt;
|Cat idle lower||0x0FA2||4||16&amp;amp;times;6||AND&lt;br /&gt;
|-&lt;br /&gt;
|Cat airborne||0x0FAA||6||0x0FB6||AND&lt;br /&gt;
|-&lt;br /&gt;
|Cat poses||0x0FC2||8||0x0FD2||AND&lt;br /&gt;
|-&lt;br /&gt;
|Dog||0x15C8||8||32&amp;amp;times;15||Overlay&lt;br /&gt;
|-&lt;br /&gt;
|Thrown objects||0x17C9||4||0x17D1||Overlay&lt;br /&gt;
|-&lt;br /&gt;
|Alley decorations||0x584C||6||0x5858||Copy&lt;br /&gt;
|-&lt;br /&gt;
|Title blink||0x6A8F||2||80&amp;amp;times;12||Copy&lt;br /&gt;
|-&lt;br /&gt;
|Ending frames||0x5012||2||32&amp;amp;times;35||Copy&lt;br /&gt;
|-&lt;br /&gt;
|Ending bursts||0x4D92||3||0x4DC2||Overlay&lt;br /&gt;
|-&lt;br /&gt;
|Room 1 object||0x35D0||4||16&amp;amp;times;10||Copy&lt;br /&gt;
|-&lt;br /&gt;
|Room 4 animation||0x3DE0||2||16&amp;amp;times;12||AND&lt;br /&gt;
|-&lt;br /&gt;
|Room 7 creatures||0x4A60||16||24&amp;amp;times;12||Overlay&lt;br /&gt;
|-&lt;br /&gt;
|Room 7 tiles||0x2E20||2||16&amp;amp;times;8||Copy&lt;br /&gt;
|-&lt;br /&gt;
|Mice overlay||0x1F5F||3||16&amp;amp;times;8||Overlay&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some groups have two adjacent image variants at each pointer: room 6 cat frames use 12 pointers at DS:44A5, with 24&amp;amp;times;10 images at &amp;lt;tt&amp;gt;pointer&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pointer + 60&amp;lt;/tt&amp;gt;; room 5 runners use four pointers at DS:40C0, with 8&amp;amp;times;5 images at &amp;lt;tt&amp;gt;pointer&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;pointer + 30&amp;lt;/tt&amp;gt;. These variants are stored pixels, not an instruction to mirror an image.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* There is no universal sprite number or global sprite-directory record. Different routines index different tables; some images are addressed directly.&lt;br /&gt;
* In the Tandy edition, map the &#039;&#039;table address&#039;&#039; as described in [[Alley Cat Executable Format]]. Values read from the table are already Tandy pointers.&lt;br /&gt;
* Scenery-list widths are in &#039;&#039;bytes&#039;&#039;, unlike the word-based sizes above. Do not use this dimension decoder for scenery headers.&lt;br /&gt;
* The listed tables reproduce the viewer&#039;s named table groups, not a claim that all game animation data is catalogued.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Alley Cat#Tools|re-alleycat]], the open-source HTML5 port (revision &amp;lt;tt&amp;gt;b003aa63ffbb&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/viewer.html viewer.html] – catalog(), table() and adjacent variants&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/cat.js src/game/cat.js] – cat animation consumers&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/title.js src/game/title.js] – titleBlink()&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/prims.js src/game/prims.js] – word-based rectangle sizes&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. Please credit the original research when using this information in your own project, and include a link back to this wiki.&lt;br /&gt;
&lt;br /&gt;
[[Category:Alley Cat]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Image_Format&amp;diff=13009</id>
		<title>Alley Cat Image Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Image_Format&amp;diff=13009"/>
		<updated>2026-10-20T06:17:56Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Image Infobox  | Hardware1 = CGA  | Depth = 2-bit (CGA)  | Palette = Shared  | NumPlanes = 1  | HasTransparency = P  | HasHitmap = No  | Games =    {{Game|Alley Cat}} }}  Graphics in Alley Cat are uncompressed, headerless arrays of packed two-bit pixels inside the executable. The same encoding holds sprites, room tiles, score digits and title lettering. There is no separate bitmap or palette file.  == File format ==  Image dimensions and locations are supplied by c...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Image Infobox&lt;br /&gt;
 | Hardware1 = CGA&lt;br /&gt;
 | Depth = 2-bit (CGA)&lt;br /&gt;
 | Palette = Shared&lt;br /&gt;
 | NumPlanes = 1&lt;br /&gt;
 | HasTransparency = P&lt;br /&gt;
 | HasHitmap = No&lt;br /&gt;
 | Games =&lt;br /&gt;
   {{Game|Alley Cat}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Graphics in [[Alley Cat]] are uncompressed, headerless arrays of packed two-bit pixels inside the executable. The same encoding holds sprites, room tiles, score digits and title lettering. There is no separate bitmap or palette file.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
Image dimensions and locations are supplied by code, [[Alley Cat Sprite Table Format|frame tables]] or [[Alley Cat Scenery Format|shape lists]]. Bytes are stored left to right, then top to bottom. For a width divisible by four, the row length is &amp;lt;tt&amp;gt;width / 4&amp;lt;/tt&amp;gt; bytes and the image length is &amp;lt;tt&amp;gt;width * height / 4&amp;lt;/tt&amp;gt; bytes.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Bits in each byte!!Pixel&lt;br /&gt;
|-&lt;br /&gt;
|7–6||Leftmost&lt;br /&gt;
|-&lt;br /&gt;
|5–4||Second&lt;br /&gt;
|-&lt;br /&gt;
|3–2||Third&lt;br /&gt;
|-&lt;br /&gt;
|1–0||Rightmost&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;byteOffset = imageStart + y * (width / 4) + floor(x / 4)&lt;br /&gt;
pixel = (data[byteOffset] &amp;gt;&amp;gt; (6 - 2 * (x % 4))) &amp;amp; 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stored rows are consecutive. CGA&#039;s alternating 0x0000/0x2000 scan-line banks apply to the &#039;&#039;screen destination&#039;&#039;, not to these source images. For screen coordinates within 320&amp;amp;times;200:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;screenOffset = (y % 2) * 0x2000 + floor(y / 2) * 80 + floor(x / 4)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Drawing modes ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Routine!!Operation per pixel!!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|copyRect (CS:2D9D)||destination = source||Opaque copy, including colour 0&lt;br /&gt;
|-&lt;br /&gt;
|blitOver (CS:2CCC)||Keep background when source = 0; otherwise use source||Colour 0 is transparent&lt;br /&gt;
|-&lt;br /&gt;
|blitAnd (CS:2D35)||destination = background AND source||Colour 3 preserves the background; colours 1 and 2 mask its bits; colour 0 clears it&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
There is no separate transparency plane. The AND operation is not equivalent to replacing every non-transparent pixel with its stored colour: the result depends on the background. The viewer&#039;s optional transparent preview hides colour 3 for AND sprites and colour 0 for other modes; it is a preview convention, not a full simulation of every blitter.&lt;br /&gt;
&lt;br /&gt;
== Palette ==&lt;br /&gt;
&lt;br /&gt;
Pixel values are indices 0–3. Palette selection is controlled by the program and hardware. The viewer offers CGA cyan/magenta, green/red and bright variants. Its measured Tandy &#039;&#039;title&#039;&#039; palette is black, light green, light blue and white. Tandy rooms reprogram the palette, so that title palette is not a universal palette for every scene.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
These are IBM DS offsets; add 0x300 to obtain file offsets:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!DS offset!!Dimensions!!Length!!Contents&lt;br /&gt;
|-&lt;br /&gt;
|0x2720 + 16 * digit||8&amp;amp;times;8||16 bytes per digit||Score digits 0–9&lt;br /&gt;
|-&lt;br /&gt;
|0x2904 + 16 * tile||8&amp;amp;times;8||16 bytes per tile||Four wall tiles&lt;br /&gt;
|-&lt;br /&gt;
|0x2020 + 8 * tile||8&amp;amp;times;4||8 bytes per tile||Four room tiles&lt;br /&gt;
|-&lt;br /&gt;
|0x32B8 + 10 * mark||8&amp;amp;times;5||10 bytes per mark||Ten floor marks&lt;br /&gt;
|-&lt;br /&gt;
|0x6152||88&amp;amp;times;29||638 bytes||IBM presents artwork&lt;br /&gt;
|-&lt;br /&gt;
|0x63D0||112&amp;amp;times;22||616 bytes||Alley Cat logotype&lt;br /&gt;
|-&lt;br /&gt;
|0x6680||112&amp;amp;times;8||224 bytes||Title credits artwork&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The BIOS font used for menu text is not embedded in the game. The port supplies its own substitute ROM-style font. The score digits and title lettering above are game graphics.&lt;br /&gt;
* No intrinsic minimum or maximum dimensions are stored in an image header. The viewer&#039;s width/height input limits are tool limits, not format limits.&lt;br /&gt;
* Change pixels in place while preserving the extent of the image. Moving or resizing it requires updating its consumers; a raw exported &amp;lt;tt&amp;gt;.bin&amp;lt;/tt&amp;gt; does not include its dimensions or drawing mode.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Alley Cat#Tools|re-alleycat]], the open-source HTML5 port (revision &amp;lt;tt&amp;gt;b003aa63ffbb&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/viewer.html viewer.html] – pixels(), palettes, fixed graphics and catalogue&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/prims.js src/game/prims.js] – copyRect(), blitOver(), blitAnd() and CGA addressing&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/game/score.js src/game/score.js] – score-digit graphics&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/machine/bios.js src/machine/bios.js] – BIOS font distinction&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/docs/RE_NOTES.md docs/RE_NOTES.md] – observed Tandy palette&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. Please credit the original research when using this information in your own project, and include a link back to this wiki.&lt;br /&gt;
&lt;br /&gt;
[[Category:Alley Cat]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Executable_Format&amp;diff=13008</id>
		<title>Alley Cat Executable Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat_Executable_Format&amp;diff=13008"/>
		<updated>2026-10-20T06:17:10Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;Alley Cat stores its assets together with the game code in a DOS MZ executable. There is no asset directory, resource-name table or general asset header. Readers must identify the edition and use the addresses supplied by the game routines or the asset viewer.  == File format ==  All header words and embedded data words are little-endian. These are the fields consumed by &amp;lt;tt&amp;gt;parseMZ()&amp;lt;/tt&amp;gt;:  {|class=&amp;quot;wikitable&amp;quot; !File offset!!Data type!!Name!!Description |- |0x00||BYT...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Alley Cat]] stores its assets together with the game code in a DOS MZ executable. There is no asset directory, resource-name table or general asset header. Readers must identify the edition and use the addresses supplied by the game routines or the asset viewer.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
All header words and embedded data words are little-endian. These are the fields consumed by &amp;lt;tt&amp;gt;parseMZ()&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!File offset!!Data type!!Name!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00||BYTE[2]||signature||&amp;lt;tt&amp;gt;MZ&amp;lt;/tt&amp;gt; (4D 5A)&lt;br /&gt;
|-&lt;br /&gt;
|0x02||UINT16LE||lastPage||Bytes used in the final 512-byte page; zero means a full page&lt;br /&gt;
|-&lt;br /&gt;
|0x04||UINT16LE||pages||File size in 512-byte pages, including the final page&lt;br /&gt;
|-&lt;br /&gt;
|0x06||UINT16LE||relocCount||Number of relocation entries&lt;br /&gt;
|-&lt;br /&gt;
|0x08||UINT16LE||headerParagraphs||Header size in 16-byte paragraphs&lt;br /&gt;
|-&lt;br /&gt;
|0x0E||UINT16LE||ss||Initial stack segment, relative to load image&lt;br /&gt;
|-&lt;br /&gt;
|0x10||UINT16LE||sp||Initial stack pointer&lt;br /&gt;
|-&lt;br /&gt;
|0x14||UINT16LE||ip||Entry offset&lt;br /&gt;
|-&lt;br /&gt;
|0x16||UINT16LE||cs||Entry code segment, relative to load image&lt;br /&gt;
|-&lt;br /&gt;
|0x18||UINT16LE||relocOff||File offset of relocation table&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The image starts at &amp;lt;tt&amp;gt;headerParagraphs * 16&amp;lt;/tt&amp;gt;. Its end is the declared file size:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;lastPage != 0: fileSize = (pages - 1) * 512 + lastPage&lt;br /&gt;
lastPage == 0: fileSize = pages * 512&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each relocation entry is a UINT16LE offset followed by a UINT16LE segment. It identifies a segment word in the load image. These are DOS relocation entries, not pointers to individual assets.&lt;br /&gt;
&lt;br /&gt;
=== Identified editions ===&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Property!!CAT.EXE!!TANDYCAT.EXE&lt;br /&gt;
|-&lt;br /&gt;
|Documented size||55067 bytes||56881 bytes; see Notes&lt;br /&gt;
|-&lt;br /&gt;
|Header size||0x200 bytes||Viewer address base agrees with an image at 0x200&lt;br /&gt;
|-&lt;br /&gt;
|Relocations||9||0&lt;br /&gt;
|-&lt;br /&gt;
|Entry CS:IP||0723:0000||0000:DB30&lt;br /&gt;
|-&lt;br /&gt;
|Initial SS:SP||0000:0100||FFF0:0100&lt;br /&gt;
|-&lt;br /&gt;
|Asset DS base in file||0x0300||0x6940&lt;br /&gt;
|-&lt;br /&gt;
|Viewer data-region length||0x7130||0x74F1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
SHA-256 identifiers used by the repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CAT.EXE&lt;br /&gt;
4979c8867826e08881d1d4bec95c95d6bc1ac70fd21050ccdb4f733a50d7bfdd&lt;br /&gt;
&lt;br /&gt;
TANDYCAT.EXE&lt;br /&gt;
13bc456aa15ce54456fba0618192ecaffc10536109488e5ff9366123844da321&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addressing ==&lt;br /&gt;
&lt;br /&gt;
In the IBM executable, &amp;lt;tt&amp;gt;DS:x&amp;lt;/tt&amp;gt; is file offset &amp;lt;tt&amp;gt;0x300 + x&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;CS:x&amp;lt;/tt&amp;gt; is file offset &amp;lt;tt&amp;gt;0x7430 + x&amp;lt;/tt&amp;gt;. The data segment begins 0x100 bytes into the load image; the code begins at image offset 0x7230. Thus &amp;lt;tt&amp;gt;CS:x = DS:(0x7130 + x)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The Tandy viewer reads its data at file offset &amp;lt;tt&amp;gt;0x6940 + x&amp;lt;/tt&amp;gt;. An IBM data address cannot be converted to Tandy by adding one constant. The viewer maps literal addresses through these half-open ranges (start included, end excluded):&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!IBM DS start!!IBM DS end (exclusive)!!Add to get Tandy DS&lt;br /&gt;
|-&lt;br /&gt;
|0000||043F||0001&lt;br /&gt;
|-&lt;br /&gt;
|0440||06B7||0000&lt;br /&gt;
|-&lt;br /&gt;
|06B7||06C6||0003&lt;br /&gt;
|-&lt;br /&gt;
|06C6||0FED||0020&lt;br /&gt;
|-&lt;br /&gt;
|0FED||1664||0270&lt;br /&gt;
|-&lt;br /&gt;
|1664||1828||0272&lt;br /&gt;
|-&lt;br /&gt;
|182F||37AF||0270&lt;br /&gt;
|-&lt;br /&gt;
|37AF||6D37||0280&lt;br /&gt;
|-&lt;br /&gt;
|6D63||6D8F||02C5&lt;br /&gt;
|-&lt;br /&gt;
|6D8F||6DF8||02C9&lt;br /&gt;
|-&lt;br /&gt;
|6E01||7128||02C0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All values in this table are hexadecimal. Unlisted ranges have no mapping in the viewer. Do not interpolate across a gap. A pointer &#039;&#039;read from a Tandy table&#039;&#039; is already a Tandy DS offset: do not apply the mapping a second time.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* The first identity table in &amp;lt;tt&amp;gt;RE_NOTES.md&amp;lt;/tt&amp;gt; gives the tentative Tandy size &amp;lt;tt&amp;gt;56865?&amp;lt;/tt&amp;gt;. The later dedicated analysis states 56881; this article follows the latter. The repository does not include the executable, so the exact SHA-256 is the stronger edition identifier.&lt;br /&gt;
* The nine IBM relocation words are in code, at CS offsets 0009, 0541, 1125, 13ED, 14B8, 1501, 2ADE, 3A98 and 5C9F. The notes identify no data relocations.&lt;br /&gt;
* The Tandy executable is not packed. The IBM loader reads its MZ image directly without an asset decompression stage.&lt;br /&gt;
* Runtime variables, graphics and tables share the data segment. A memory dump is not interchangeable with the initial file bytes.&lt;br /&gt;
* The parser is a reader for known originals, not a complete malformed-MZ validator. An editor should check every range before reading or writing and preserve code, relocation entries and unrelated data.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Alley Cat#Tools|re-alleycat]], the open-source HTML5 port (revision &amp;lt;tt&amp;gt;b003aa63ffbb&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/machine/exe.js src/machine/exe.js] – MZ parser and exact-hash identification&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/src/machine/memory.js src/machine/memory.js] – IBM image-to-data-segment mapping&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/viewer.html viewer.html] – edition bases and piecewise Tandy address map&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/docs/RE_NOTES.md docs/RE_NOTES.md] – executable identities and observed address correspondence&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. Please credit the original research when using this information in your own project, and include a link back to this wiki.&lt;br /&gt;
&lt;br /&gt;
[[Category:Alley Cat]]&lt;br /&gt;
[[Category:All file formats]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat&amp;diff=13007</id>
		<title>Alley Cat</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Alley_Cat&amp;diff=13007"/>
		<updated>2026-10-20T06:16:29Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;{{Game Infobox  | Levels = Some  | Tiles = Some  | Sprites = Some  | Fullscreen = Some  | Sound = Some  | Music = Some  | Text = Some  | Story = Some  | Interface = Some }}  &amp;#039;&amp;#039;&amp;#039;Alley Cat&amp;#039;&amp;#039;&amp;#039; is a platform game by Bill Williams. This page describes the 1984 IBM PC edition and the Tandy 1000 edition investigated by [https://github.com/VorticonCmdr/re-alleycat re-alleycat]. Both use 320&amp;amp;times;200, four-colour graphics.  All original graphics, music tables and text are embedd...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Game Infobox&lt;br /&gt;
 | Levels = Some&lt;br /&gt;
 | Tiles = Some&lt;br /&gt;
 | Sprites = Some&lt;br /&gt;
 | Fullscreen = Some&lt;br /&gt;
 | Sound = Some&lt;br /&gt;
 | Music = Some&lt;br /&gt;
 | Text = Some&lt;br /&gt;
 | Story = Some&lt;br /&gt;
 | Interface = Some&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alley Cat&#039;&#039;&#039; is a platform game by Bill Williams. This page describes the 1984 IBM PC edition and the Tandy 1000 edition investigated by [https://github.com/VorticonCmdr/re-alleycat re-alleycat]. Both use 320&amp;amp;times;200, four-colour graphics.&lt;br /&gt;
&lt;br /&gt;
All original graphics, music tables and text are embedded in the DOS executable: &amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt; for the IBM PC edition or &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt; for the Tandy edition. There are no separate asset archives or level files in the documented versions. The format pages below describe structures &#039;&#039;inside&#039;&#039; those executables, not additional files required by the game.&lt;br /&gt;
&lt;br /&gt;
Rooms are assembled by program code using embedded images, scenery lists and gameplay tables. The alley is room 0; the game dispatches the other rooms through a table for rooms 1–7. Changing graphics or selected tables is possible through binary patching, but replacing a room&#039;s behaviour also requires changing code. The partial-editing ratings refer to this manual process; the repository supplies a viewer, not an asset importer or level editor.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name!!Platform!!Archives!!Levels!!Graphics!!Music!!Sounds!!Text!!Saves!!.exe patch!!Notes&lt;br /&gt;
|-&lt;br /&gt;
|[https://github.com/VorticonCmdr/re-alleycat re-alleycat]||Web browser||N/A||No||Export||Play||No||View||No||No||HTML5 port and [https://vorticoncmdr.github.io/re-alleycat/viewer.html asset viewer]. Exports mapped images as PNG or original bytes; browses strings and raw data; reconstructs IBM and Tandy title music. Requires the original executable. Tandy assets are supported by the viewer, but the Tandy game is not playable in the port.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== File formats ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Filename!!Format!!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;||[[Alley Cat Executable Format]]||Executable container, version identification and data-segment address mapping&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;||[[Alley Cat Image Format]]||Packed two-bit sprites, tiles, title lettering and score digits&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;||[[Alley Cat Sprite Table Format]]||Frame pointers and optional dimension tables&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;||[[Alley Cat Scenery Format]]||Background shape lists and furniture groups&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;||[[Alley Cat Text Format]]||NUL-terminated menu and pause strings&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;||[[Alley Cat Music Format]]||IBM PC title melody and PIT divisor table (IBM only for the documented layout)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;||[[Alley Cat Tandy Music Format]]||Tandy three-voice title music, duration lists and arrangement&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;TANDYCAT.EXE&amp;lt;/tt&amp;gt;||[[Alley Cat Sound Table Format]]||IBM PC secondary tunes and procedural sound-effect tables (IBM only for the documented layout)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* Multi-byte integers are little-endian. Most addresses in the RE notes are data-segment offsets, not file offsets; see [[Alley Cat Executable Format]].&lt;br /&gt;
* The viewer recognises two exact SHA-256 hashes. Editing either executable changes its hash: the stock viewer then offers only text and raw-data inspection, and the stock game loader rejects it. Testing modified assets in the port therefore requires adapting its identification logic as well as changing the bytes.&lt;br /&gt;
* The viewer catalogue is not a complete inventory of named assets. The RE notes report 217 catalogue entries with byte-identical Tandy counterparts; this does not establish that every embedded image has been found.&lt;br /&gt;
* The title&#039;s moving cat is driven by game logic, rather than a documented input-recording file. No original demo-file format is identified in the repository.&lt;br /&gt;
* The score and high score are runtime data; no separate high-score or save-game file is documented. Browser settings and remembered executables are port storage, not DOS asset formats.&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [https://vorticoncmdr.github.io/re-alleycat/ re-alleycat] – play the IBM PC port with your own &amp;lt;tt&amp;gt;CAT.EXE&amp;lt;/tt&amp;gt;&lt;br /&gt;
* [https://vorticoncmdr.github.io/re-alleycat/viewer.html Asset viewer] – browse both documented editions&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat re-alleycat on GitHub] – source code and reverse-engineering notes&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-alleycat/blob/b003aa63ffbb82fc7a8e4e1e750bf258fba17659/docs/RE_NOTES.md Reverse-engineering notes at the documented revision] – static analysis, DOSBox observations and validation results&lt;br /&gt;
&lt;br /&gt;
[[Category:Game Intro Page]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Z_Door_Data_Format&amp;diff=13006</id>
		<title>Z Door Data Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Z_Door_Data_Format&amp;diff=13006"/>
		<updated>2026-10-19T17:40:35Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;The installed &amp;lt;tt&amp;gt;DOOR.PAC&amp;lt;/tt&amp;gt; archive in Z contains five named DAT members and five matching LBM backgrounds.  == File format ==  DOOR.PAC is a JMP2 archive. Its EDOOR, FDOOR, GDOOR, SDOOR and IDOOR members each decompress to 8848 bytes. The accompanying backgrounds are EDBACK.LBM, FDBACK.LBM, GDBACK.LBM, SDBACK.LBM and IDBACK.LBM, decoded by the IFF image reader.  The available parsers establish the archive structure an...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The installed &amp;lt;tt&amp;gt;DOOR.PAC&amp;lt;/tt&amp;gt; archive in [[Z]] contains five named DAT members and five matching LBM backgrounds.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
DOOR.PAC is a [[Z JMP2 Archive Format|JMP2]] archive. Its EDOOR, FDOOR, GDOOR, SDOOR and IDOOR members each decompress to 8848 bytes. The accompanying backgrounds are EDBACK.LBM, FDBACK.LBM, GDBACK.LBM, SDBACK.LBM and IDBACK.LBM, decoded by the [[Z Image Format|IFF image reader]].&lt;br /&gt;
&lt;br /&gt;
The available parsers establish the archive structure and member boundaries, but do not document the internal fields of the DOOR DAT payloads. No shared layout with sprite, panel or level DAT files is asserted.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
This is a partial identification article. The filename prefixes distinguish the five member sets; their full selection and data semantics remain undocumented.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Z#Tools|re-z]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-z/blob/main/src/formats/jmp2.js src/formats/jmp2.js] – archive extraction&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-z/blob/main/src/viewer/formats.js src/viewer/formats.js] – background-image decoding&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-z/blob/main/src/viewer/catalog.js src/viewer/catalog.js] – archive member enumeration&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
The identification and implementation notes above were contributed by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;br /&gt;
&lt;br /&gt;
[[Category:Z]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Z_Driver_Configuration_Format&amp;diff=13005</id>
		<title>Z Driver Configuration Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Z_Driver_Configuration_Format&amp;diff=13005"/>
		<updated>2026-10-19T17:40:05Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;The Z installation includes sound and video setup data in addition to the game assets.  == File format ==  DIG.INI and MDI.INI are Miles driver configuration files. AILDRVR.LST is a driver catalogue, not the game sample-list layout. UVCONFIG.DAT belongs to the video setup utilities. The repository does not implement a complete parser for these files.  The original sound initialization can call AIL_read_INI for driver type 0, but the corresponding port branch explicit...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Z]] installation includes sound and video setup data in addition to the game assets.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
DIG.INI and MDI.INI are Miles driver configuration files. AILDRVR.LST is a driver catalogue, not the game sample-list layout. UVCONFIG.DAT belongs to the video setup utilities. The repository does not implement a complete parser for these files.&lt;br /&gt;
&lt;br /&gt;
The original sound initialization can call AIL_read_INI for driver type 0, but the corresponding port branch explicitly reports it as unsupported. No binary field schema is asserted for UVCONFIG.DAT.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Executable drivers (.MDI, .DIG and .DRV) are code, not instrument-bank or game-asset formats. The SBPRO2 implementation requires an AIL3MDI signature and a specific driver layout. Do not apply that layout to every driver.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Z#Tools|re-z]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-z/blob/main/src/game/sound.js src/game/sound.js] – MDI.INI unsupported path&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-z/blob/main/docs/evidence/level-init.md docs/evidence/level-init.md] – driver configuration limitations&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
The identification and implementation notes above were contributed by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;br /&gt;
&lt;br /&gt;
[[Category:Z]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Z_Installer_Archive_Format&amp;diff=13004</id>
		<title>Z Installer Archive Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Z_Installer_Archive_Format&amp;diff=13004"/>
		<updated>2026-10-19T17:39:38Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;The CD-root &amp;lt;tt&amp;gt;Z.PAC&amp;lt;/tt&amp;gt; in Z is an installer payload, distinct from the game archives with the same extension.  == File format ==  The local inventory finds a 5420010-byte file. It lacks the JMP2 trailer required by the repository archive parser, so its compression and directory layout remain unresolved. No extraction recipe is established by the available RE docs or parsers.  == Notes ==  Do not rewrite this file using the JMP2 layout. The asset viewer offers unr...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The CD-root &amp;lt;tt&amp;gt;Z.PAC&amp;lt;/tt&amp;gt; in [[Z]] is an installer payload, distinct from the game archives with the same extension.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The local inventory finds a 5420010-byte file. It lacks the JMP2 trailer required by the repository archive parser, so its compression and directory layout remain unresolved. No extraction recipe is established by the available RE docs or parsers.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Do not rewrite this file using the JMP2 layout. The asset viewer offers unrecognized archives as original-file downloads.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Z#Tools|re-z]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-z/blob/main/src/formats/jmp2.js src/formats/jmp2.js] – signature check&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-z/blob/main/src/viewer/catalog.js src/viewer/catalog.js] – unsupported-archive fallback&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
The identification and implementation notes above were contributed by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;br /&gt;
&lt;br /&gt;
[[Category:Z]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Z_High_Score_Format&amp;diff=13003</id>
		<title>Z High Score Format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Z_High_Score_Format&amp;diff=13003"/>
		<updated>2026-10-19T17:38:50Z</updated>

		<summary type="html">&lt;p&gt;VorticonCmdr: Created page with &amp;quot;The high-score file of Z is loaded as a block at static address 0x14008b. The front end displays twenty entries.  == File format ==  The inspected file is 360 bytes. The display code establishes the following fields by subtracting the load base from the addresses it reads; these are partial array layouts, not twenty complete contiguous records.  {|class=&amp;quot;wikitable&amp;quot; !Offset!!Data type!!Name!!Description |- |0x004||UINT32LE[20]||scores||Displayed as five decimal digits...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The high-score file of [[Z]] is loaded as a block at static address 0x14008b. The front end displays twenty entries.&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The inspected file is 360 bytes. The display code establishes the following fields by subtracting the load base from the addresses it reads; these are partial array layouts, not twenty complete contiguous records.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset!!Data type!!Name!!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x004||UINT32LE[20]||scores||Displayed as five decimal digits.&lt;br /&gt;
|-&lt;br /&gt;
|0x07c||pair of UINT16LE[20]||times||Each four-byte pair is displayed as minutes and seconds.&lt;br /&gt;
|-&lt;br /&gt;
|0x0f4||UINT32LE[20]||name indices||Indices into an executable-held name pointer table.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All bytes outside these ranges are unspecified here. Names are not inline strings at these offsets.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
If the file is absent, the original creates defaults; that branch is unsupported in the port. The offset mapping above follows the load destination and consumers, rather than a dedicated parser.&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
&lt;br /&gt;
From [[Z#Tools|re-z]], the open-source browser port:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-z/blob/main/src/game/boot-main.js src/game/boot-main.js] – fn8a4ef file load&lt;br /&gt;
* [https://github.com/VorticonCmdr/re-z/blob/main/src/game/frontend.js src/game/frontend.js] – hiscoreTable address/field reads&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format was reverse engineered by [[User:VorticonCmdr|VorticonCmdr]]. If you find this information helpful in a project you&#039;re working on, please give credit where credit is due. (A link back to this wiki would be nice too!)&lt;br /&gt;
&lt;br /&gt;
[[Category:Z]]&lt;/div&gt;</summary>
		<author><name>VorticonCmdr</name></author>
	</entry>
</feed>