<?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=Videogamer555</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=Videogamer555"/>
	<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/wiki/Special:Contributions/Videogamer555"/>
	<updated>2026-06-29T14:26:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.11</generator>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Talk:Inverse_Frequency_Sound_format&amp;diff=10238</id>
		<title>Talk:Inverse Frequency Sound format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Talk:Inverse_Frequency_Sound_format&amp;diff=10238"/>
		<updated>2022-01-29T14:07:30Z</updated>

		<summary type="html">&lt;p&gt;Videogamer555: /* There appears to be a discrepency here. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How does this sound format handle sounds who&#039;s period is zero (frequency is infinite)? This causes a divide-by-zero error when actually computed.&lt;br /&gt;
[[User:Videogamer555|Videogamer555]] ([[User talk:Videogamer555|talk]]) 13:27, 29 January 2022 (GMT)&lt;br /&gt;
&lt;br /&gt;
== There appears to be a discrepency here. ==&lt;br /&gt;
&lt;br /&gt;
In the Sound Definitions section, in the table it says &amp;quot;UINT8 	rate 	Defines the update rate of the timer generating the sound interrupt. Usually set to 8. &amp;quot;&lt;br /&gt;
&lt;br /&gt;
However in the paragraph right after that table, it says &amp;quot;The PC Speaker is updated at a rate of usually 140 Hz&amp;quot;. So which is it? Is it 8Hz or 140Hz update rate? Or does the 8 mean something else? Does it scale the update rate, where 140Hz is represented by that field containing the number 8, so each increment of 1 in that field changes the PC speaker&#039;s update rate by 17.5Hz, with 0 meaning never update the PC speaker?&lt;br /&gt;
&lt;br /&gt;
[[User:Videogamer555|Videogamer555]] ([[User talk:Videogamer555|talk]]) 14:07, 29 January 2022 (GMT)&lt;/div&gt;</summary>
		<author><name>Videogamer555</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Talk:Inverse_Frequency_Sound_format&amp;diff=10237</id>
		<title>Talk:Inverse Frequency Sound format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Talk:Inverse_Frequency_Sound_format&amp;diff=10237"/>
		<updated>2022-01-29T14:06:37Z</updated>

		<summary type="html">&lt;p&gt;Videogamer555: /* There appears to be a discrepency here. */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How does this sound format handle sounds who&#039;s period is zero (frequency is infinite)? This causes a divide-by-zero error when actually computed.&lt;br /&gt;
[[User:Videogamer555|Videogamer555]] ([[User talk:Videogamer555|talk]]) 13:27, 29 January 2022 (GMT)&lt;br /&gt;
&lt;br /&gt;
== There appears to be a discrepency here. ==&lt;br /&gt;
&lt;br /&gt;
In the Sound Definitions section, in the table it says &amp;quot;UINT8 	rate 	Defines the update rate of the timer generating the sound interrupt. Usually set to 8. &amp;quot;&lt;br /&gt;
&lt;br /&gt;
However in the paragraph right after that table, it says &amp;quot;The PC Speaker is updated at a rate of usually 140 Hz&amp;quot;. So which is it? Is it 8Hz or 140Hz update rate? Or does the 8 mean something else? Does it scale the update rate, where 140Hz is represented by that field containing the number 8, so each increment of 1 in that field changes the PC speaker&#039;s update rate by 17.5Hz, with 0 meaning never update the PC speaker?&lt;/div&gt;</summary>
		<author><name>Videogamer555</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=Talk:Inverse_Frequency_Sound_format&amp;diff=10236</id>
		<title>Talk:Inverse Frequency Sound format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=Talk:Inverse_Frequency_Sound_format&amp;diff=10236"/>
		<updated>2022-01-29T13:27:54Z</updated>

		<summary type="html">&lt;p&gt;Videogamer555: Created page with &amp;quot;How does this sound format handle sounds who&amp;#039;s period is zero (frequency is infinite)? This causes a divide-by-zero error when actually computed. ~~~~&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;How does this sound format handle sounds who&#039;s period is zero (frequency is infinite)? This causes a divide-by-zero error when actually computed.&lt;br /&gt;
[[User:Videogamer555|Videogamer555]] ([[User talk:Videogamer555|talk]]) 13:27, 29 January 2022 (GMT)&lt;/div&gt;</summary>
		<author><name>Videogamer555</name></author>
	</entry>
	<entry>
		<id>https://moddingwiki.shikadi.net/w/index.php?title=ProGraphx_Toolbox_tileset_format&amp;diff=10235</id>
		<title>ProGraphx Toolbox tileset format</title>
		<link rel="alternate" type="text/html" href="https://moddingwiki.shikadi.net/w/index.php?title=ProGraphx_Toolbox_tileset_format&amp;diff=10235"/>
		<updated>2022-01-29T11:36:31Z</updated>

		<summary type="html">&lt;p&gt;Videogamer555: /* Header */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Tileset Infobox&lt;br /&gt;
 | ImageNativeWidth = Y&lt;br /&gt;
 | Hardware1 = EGA&lt;br /&gt;
 | MaxTiles = 255 per subtileset, unlimited subtilesets&lt;br /&gt;
 | Palette = Default EGA&lt;br /&gt;
 | Names = N&lt;br /&gt;
 | TileMinSize = 0&amp;amp;times;0&lt;br /&gt;
 | TileMaxSize = 2040&amp;amp;times;255&lt;br /&gt;
 | NumPlanes = 5&lt;br /&gt;
 | PlaneArrangement = [[Byte-planar EGA]]&lt;br /&gt;
 | HasTransparency = Y&lt;br /&gt;
 | HasHitmap = N&lt;br /&gt;
 | Metadata = None&lt;br /&gt;
 | Subtilesets = Y&lt;br /&gt;
 | Compressed = N&lt;br /&gt;
 | Hidden = N&lt;br /&gt;
 | Games = &lt;br /&gt;
   {{Game|Operation: Airlift}}&lt;br /&gt;
   {{Game|Dark Ages}}&lt;br /&gt;
   {{Game|Duke Nukem}}&lt;br /&gt;
   {{Game|Crystal Caves}}&lt;br /&gt;
   {{Game|FBI Fred}}&lt;br /&gt;
   {{Game|Secret Agent}}&lt;br /&gt;
}}&lt;br /&gt;
This file format is used by the ProGraphx Toolbox to store images used for map tiles in a game.&lt;br /&gt;
__TOC__&lt;br /&gt;
The ProGraphx Toolbox, written by Peder Jungck, is used by the following games:&lt;br /&gt;
&lt;br /&gt;
* [[Operation: Airlift]] - &amp;lt;tt&amp;gt;AIRLIFT.EXE&amp;lt;/tt&amp;gt; contains the string &#039;&#039;Version 1.0 EGA/VGAProGraphx EGA/VGA Toolbox&#039;&#039;&lt;br /&gt;
* [[Dark Ages]] - &amp;lt;tt&amp;gt;DA3.EXE&amp;lt;/tt&amp;gt; contains the string &#039;&#039;Version 1.0 EGA/VGAProGraphx EGA/VGA Toolbox&#039;&#039; (DA1.EXE and DA2.EXE contain gibberish)&lt;br /&gt;
* [[Duke Nukem]] - &amp;lt;tt&amp;gt;DN1.EXE&amp;lt;/tt&amp;gt; contains the string &#039;&#039;Version 1.0 EGA/VGAProGraphx EGA/VGA Toolbox&#039;&#039;&lt;br /&gt;
* [[Crystal Caves]] - &amp;lt;tt&amp;gt;CC1.EXE&amp;lt;/tt&amp;gt; contains the string &#039;&#039;Version 1.5 320x200 PAN EGA/VGAProGraphx EGA/VGA Toolbox&#039;&#039;&lt;br /&gt;
* [[FBI Fred]] - &amp;lt;tt&amp;gt;FBIFRED.EXE&amp;lt;/tt&amp;gt; contains the string &#039;&#039;Version 1.5 EGA/VGAProGraphx EGA/VGA Toolbox  (c) 1990&#039;&#039;&lt;br /&gt;
* [[Secret Agent]] - &amp;lt;tt&amp;gt;SAM1.EXE&amp;lt;/tt&amp;gt; contains the string &#039;&#039;ProGraphx EGA/VGA Toolbox Version 2.0 320x200 EGA/VGA Copyright 1991 by Peder Jungck&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== File format ==&lt;br /&gt;
&lt;br /&gt;
The file consists of a number of tilesets one after the other.  Each tileset is made up of a collection of small images (usually 8&amp;amp;times;8 or 16&amp;amp;times;16, but the format supports up to 2040&amp;amp;times;255.)&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;&#039;Secret Agent&#039;&#039;&#039; the files are encrypted with [[Secret Agent encryption]].   In the other games there is no encryption.&lt;br /&gt;
&lt;br /&gt;
=== Signature ===&lt;br /&gt;
&lt;br /&gt;
There is no signature, however careful processing of the header can be used to check whether the last tileset ends at exactly the end of the file (allowing for padding in some versions of the format.)  If not, it is unlikely to be in this format.  Be careful that files with zero values don&#039;t cause an endless loop when calculating offsets.&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
&lt;br /&gt;
Each tileset begins with the following header.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Data type!!Description&lt;br /&gt;
|-&lt;br /&gt;
|[[BYTE]] count||Number of sprites in this chunk (50 in most cases)&lt;br /&gt;
|-&lt;br /&gt;
|[[BYTE]] width||Sprite width, in bytes (not in pixels)&lt;br /&gt;
|-&lt;br /&gt;
|[[BYTE]] height||Sprite height, in pixels&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The image data for the tileset follows the header.  After the image data either the next header begins, or the file ends.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Operation: Airlift:&#039;&#039;&#039; Each tileset is padded up to the nearest multiple of 128 bytes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dark Ages:&#039;&#039;&#039; Each tileset is padded up to 8064 bytes, except for the last tileset which contains 2 sprites and is padded up to 384 bytes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Duke Nukem:&#039;&#039;&#039; Each tileset is padded up to 8064 bytes, except for &amp;lt;tt&amp;gt;NUMBERS.DN?&amp;lt;/tt&amp;gt; (7186 bytes) and the backdrop files (&amp;lt;tt&amp;gt;DROP*.DN?&amp;lt;/tt&amp;gt;) which have no padding.  The backdrop files also have all three header bytes set to zero.  For these files, the number of sprites is always 130, the width is always 2 (bytes) and the height is always 16. The background tileset files (those that are called BACKx.DNx ) have an inaccurate sprite count (first byte of the header). There may actually be more sprites in the tileset. I discovered that at least in BACK0.DN1 it indicates there should be 50 tiles in the set, but if you actually try to use this number, read 50 tiles, and then interpret the next 3 bytes as the header for the next chunk of tiles, you will get wildly wrong header values, because those are not actually header values. They are the next 3 bytes of tile data in the files. The only way to extract the files from these background tile files, is to ignore the first byte in the header, and just read all the tiles in the file until you reach the end of the file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Crystal Caves:&#039;&#039;&#039; The file ends after the last tile&#039;s image data, there is no padding.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;FBI Fred:&#039;&#039;&#039; Each tileset is padded up to 8064 bytes, except for the last tileset which contains 23 sprites and is padded up to 3712 bytes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Secret Agent:&#039;&#039;&#039; Each tileset is padded up to 8064 bytes for 16&amp;amp;times;16 sprite files (&amp;lt;tt&amp;gt;SAM?01.GFX&amp;lt;/tt&amp;gt;), and 2048 bytes for 8&amp;amp;times;8 sprite files (&amp;lt;tt&amp;gt;SAM?02.GFX&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
For those files with padding at the end, be careful not to interpret the padding as the presence of more tiles.&lt;br /&gt;
&lt;br /&gt;
=== Image data ===&lt;br /&gt;
&lt;br /&gt;
The image data is in [[Byte-planar EGA]] format with five planes, so reading &amp;lt;tt&amp;gt;width &amp;amp;times; height &amp;amp;times; 5&amp;lt;/tt&amp;gt; bytes will read in enough data for a single image (one tile.)  This value multiplied by the number of tiles (&amp;lt;tt&amp;gt;count&amp;lt;/tt&amp;gt;) will yield the number of bytes in the entire tileset, which can be used to skip directly to the next tileset in the file (if any.)&lt;br /&gt;
&lt;br /&gt;
The first byte in each tile&#039;s data is the transparency plane (1 == opaque, 0 == transparent), and the following four bytes/planes are blue, green, red and intensity.  The MSB in each byte (10000000) is the first/left-most pixel, and the eighth pixel is the LSB (00000001).  This means if the bits are processed in a loop, as the X direction increases to the right (0, 1, 2) the bit value decreases (0x80, 0x40, 0x20.)&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
* For at least &#039;&#039;&#039;Duke Nukem&#039;&#039;&#039;, the game seems to ignore the header of &#039;&#039;all&#039;&#039; files in this format.  You can set the entire header of any tileset file to zero values and the game will still load them properly.  This also means that you cannot use larger tilesets without modifying the executable.&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
&lt;br /&gt;
This file format has been reverse engineered by many people over the years.  [[User:K1n9_Duk3|K1n9_Duk3]] discovered that Duke Nukem uses this format.  [[User:Frenkel|Frenkel]] identified the similarities amongst all the games using the file format, and realised they all use the ProGraphx Toolbox.  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>Videogamer555</name></author>
	</entry>
</feed>