<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dsibrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Steven</id>
	<title>DSiBrew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://dsibrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Steven"/>
	<link rel="alternate" type="text/html" href="https://dsibrew.org/wiki/Special:Contributions/Steven"/>
	<updated>2026-05-03T08:52:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Talk:DSi_system_font&amp;diff=2995</id>
		<title>Talk:DSi system font</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Talk:DSi_system_font&amp;diff=2995"/>
		<updated>2010-07-15T14:46:54Z</updated>

		<summary type="html">&lt;p&gt;Steven: Created page with &amp;#039;Hmm, looks like these fonts are in the camera application, so this may not be a DSi system font, it may just be a font in the camera application. Mind you it would be nice to get…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hmm, looks like these fonts are in the camera application, so this may not be a DSi system font, it may just be a font in the camera application.&lt;br /&gt;
Mind you it would be nice to get a picture of each glyph. [[User:Steven|Steven]] 16:46, 15 July 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=User_talk:Endres&amp;diff=2722</id>
		<title>User talk:Endres</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User_talk:Endres&amp;diff=2722"/>
		<updated>2010-02-16T21:20:09Z</updated>

		<summary type="html">&lt;p&gt;Steven: New page: Moving pics from a PC to your DS can already be done, look under the camera section or anything to do with the pit.bin file for information on how to do this ~~~~&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Moving pics from a PC to your DS can already be done, look under the camera section or anything to do with the pit.bin file for information on how to do this [[User:Steven|Steven]] 22:20, 16 February 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=SD_Filesystem&amp;diff=2721</id>
		<title>SD Filesystem</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=SD_Filesystem&amp;diff=2721"/>
		<updated>2010-02-16T21:16:45Z</updated>

		<summary type="html">&lt;p&gt;Steven: Correcting an incorrect link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All files/folders created on SD/SDHC from the DSi.&lt;br /&gt;
&lt;br /&gt;
*[[Private|private/]] : Contains all Nintendo data&lt;br /&gt;
*[[DCIM/]] : Folder of the Nintendo DSi Camera&lt;br /&gt;
*[[music/]] : User made folder to store AAC songs&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Talk:DCIM&amp;diff=2720</id>
		<title>Talk:DCIM</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Talk:DCIM&amp;diff=2720"/>
		<updated>2010-02-16T21:08:38Z</updated>

		<summary type="html">&lt;p&gt;Steven: New page: This page is not needed as it already exists as DCIM/ ~~~~&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is not needed as it already exists as [[DCIM/]] [[User:Steven|Steven]] 22:08, 16 February 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Pictochat&amp;diff=2719</id>
		<title>Pictochat</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Pictochat&amp;diff=2719"/>
		<updated>2010-02-16T21:06:03Z</updated>

		<summary type="html">&lt;p&gt;Steven: Cleaning up the page a little&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}[[Image:Pictochat.jpg|thumb|320px|This is a Pictochat chat room, but with no other chatters.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pictochat&#039;&#039;&#039;, included with all Nintendo DS systems, is a simple chat software capable of sending text and hand drawn pictures.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Changes from previous Nintendo DS systems ==&lt;br /&gt;
&lt;br /&gt;
Pictochat hasn&#039;t been changed much since its NDS and NDSL predecessors. Only two changed have been made. One change is the rainbow pen. You can use the rainbow pen by clicking on the Pen icon to toggle back in forth between the black pen and the rainbow pen. although the NDS and NDSL cannot use this feature they can see the rainbow pen if chatting with a DSi user using the rainbow pen. the other change is that when you exit Pictochat it takes you back to the DSi&#039;s homescreen instead of making you shutdown. You may now, only on the DSi system, press the B button in a chat to easily leave the chatroom without tapping the &amp;quot;X&amp;quot; on the top right corner of the touch screen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:pen.gif]][[Image:pictoChatRainbow.png]] [[Image:DSiRainbow.jpg|200px|left|Example of using the rainbow pen.]]&lt;br /&gt;
&lt;br /&gt;
You can use the rainbow pen by clicking on the Pen icon to toggle back in forth between the black pen and the rainbow pen. Although the NDS and NDSL cannot use this feature they can see the rainbow pen if chatting with a DSi user using the rainbow pen.&lt;br /&gt;
&lt;br /&gt;
[[Image:HNI_0029.jpg|320px|thumb|PictoChat with other chatters]]&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Nintendo Software]]&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Talk:Flipnote_Files/PPM&amp;diff=2698</id>
		<title>Talk:Flipnote Files/PPM</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Talk:Flipnote_Files/PPM&amp;diff=2698"/>
		<updated>2010-02-11T05:26:57Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Could you guys post a example for decoding the preview image? i cant figure out the 8x8 tile thing. i will give credit to you:).Preview of what i have: [[Image:FlipnoteImageDecodedByPBSDS.png]]--[[User:Pbsds|pbsds]] 09:29, 24 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
See [[User:Remark/Icon2ppm.c]]. -- [[User:Remark|Remark]] 09:45, 24 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Thanks:)--[[User:Pbsds|pbsds]] 09:55, 24 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
It doesn&#039;t work! Here is the code im using(i had to transelate it):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;&amp;quot;&amp;gt;Dim $ImageOutput[4072]&lt;br /&gt;
for $x=0 to 46 step 1&lt;br /&gt;
	for $y=0 to 7 step 1&lt;br /&gt;
		for $z=0 To 7 Step 1&lt;br /&gt;
			ImageOutput[($x*64)+(16*$y)+(4*$z)]   = RawImage[($x*64)+(32*$z)+(4*$y)]&lt;br /&gt;
			ImageOutput[($x*64)+(16*$y)+(4*$z)+1] = RawImage[($x*64)+(32*$z)+(4*$y)+1]&lt;br /&gt;
			ImageOutput[($x*64)+(16*$y)+(4*$z)+2] = RawImage[($x*64)+(32*$z)+(4*$y)+2]&lt;br /&gt;
			ImageOutput[($x*64)+(16*$y)+(4*$z)+3] = RawImage[($x*64)+(32*$z)+(4*$y)+3]&lt;br /&gt;
		Next&lt;br /&gt;
	Next&lt;br /&gt;
Next&amp;lt;/source&amp;gt;&lt;br /&gt;
Output: [[Image:Test2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
You made a typo here:&lt;br /&gt;
 for x=0 to 46 step &lt;br /&gt;
-[[User:Remark|Remark]] 18:42, 24 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Made no difference...--[[User:Pbsds|pbsds]] 21:08, 24 December 2009 (UTC)&lt;br /&gt;
----&lt;br /&gt;
If you would&#039;ve used a sane language, you would&#039;ve gotten a segfault. :-)&lt;br /&gt;
&lt;br /&gt;
Please do some research on the tiling, my code is written for the 32x32 icons you see in the DSiMenu.&lt;br /&gt;
&lt;br /&gt;
- [[User:Remark|Remark]] 21:52, 24 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
I had to set the RawImage and the ImageOutput arrays to 1000 more pixels than needed to avoid the segfault.&lt;br /&gt;
&lt;br /&gt;
I think i&#039;ll try again tomorrow. but now im off to bed:)--[[User:Pbsds|pbsds]] 00:39, 25 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
WooHoo! im really close now!: [[Image:Test3.png]]--[[User:Pbsds|pbsds]] 14:43, 25 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Finaly got it!: [[Image:Test4.png]]--[[User:Pbsds|pbsds]] 21:26, 27 December 2009 (UTC)&lt;br /&gt;
== Pallete ==&lt;br /&gt;
i don&#039;t think my RGB pallete is perfect... Could someone post a RGB version of the pallete? My pallete have too sharp colors :( --[[User:Pbsds|pbsds]] 01:03, 4 January 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
Maybe i should post my pallete so you guys can check if its wrong:&lt;br /&gt;
&lt;br /&gt;
0 = FFFFFF&lt;br /&gt;
&lt;br /&gt;
1 = 525252&lt;br /&gt;
&lt;br /&gt;
2 = FFFFFF&lt;br /&gt;
&lt;br /&gt;
3 = A4A4A4&lt;br /&gt;
&lt;br /&gt;
4 = FF0000&lt;br /&gt;
&lt;br /&gt;
5 = 7B0000&lt;br /&gt;
&lt;br /&gt;
6 = FF7B7B&lt;br /&gt;
&lt;br /&gt;
7 = 00FF00&lt;br /&gt;
&lt;br /&gt;
8 = 0000FF&lt;br /&gt;
&lt;br /&gt;
9 = 00007B&lt;br /&gt;
&lt;br /&gt;
A = 7B7BFF&lt;br /&gt;
&lt;br /&gt;
B = 00FF00&lt;br /&gt;
&lt;br /&gt;
C = FF00FF&lt;br /&gt;
&lt;br /&gt;
D = 00FF00&lt;br /&gt;
&lt;br /&gt;
E = 00FF00&lt;br /&gt;
&lt;br /&gt;
F = 00FF00&lt;br /&gt;
&lt;br /&gt;
--[[User:Pbsds|pbsds]] 10:52, 4 January 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
Use the following formula:&lt;br /&gt;
(x / 32) * 256&lt;br /&gt;
To convert between the scales 0-31 and 0-255.&lt;br /&gt;
&lt;br /&gt;
Thanks!--[[User:Pbsds|pbsds]] 15:15, 5 January 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Modifying the file? ==&lt;br /&gt;
&lt;br /&gt;
Has anyone managed to get a modified PPM file running on the DSi? If so, can you update the wiki with your findings.&lt;br /&gt;
[[User:Chronic667|Chronic667]] 20:40, 13 January 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know much about that but i think there is a hash in there.--[[User:Pbsds|pbsds]] 14:19, 10 February 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
:The last 144 bytes of the file are a hash / encypted block that changes for every minor change in the file.  When I was originally working on this with someone else (forgot his nick on here) we said that it could possibly be an AES cypher key or data block, I don&#039;t know if anything else was worked out behond this as I&#039;ve not looked at the files since I worked out the basic file structure.  If your thinking of using FlipNote as an entry into the DSi for homebrew then the files do not seem to have any way to break them due to the lack of strings in the file.&lt;br /&gt;
:Actually the last 144 bytes are split into 128 bytes of hash and 16 bytes of 0x00.&lt;br /&gt;
:[[User:Steven|Steven]] 06:26, 11 February 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=User_talk:Pbsds&amp;diff=2595</id>
		<title>User talk:Pbsds</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User_talk:Pbsds&amp;diff=2595"/>
		<updated>2009-12-28T14:38:01Z</updated>

		<summary type="html">&lt;p&gt;Steven: New page: The person that documented the PPM files is definatly a bloke - as I wrote a load of that :), oh and there&amp;#039;s still a few things that need to be documented, like the exact way the animation...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The person that documented the PPM files is definatly a bloke - as I wrote a load of that :), oh and there&#039;s still a few things that need to be documented, like the exact way the animation pages are stored (semi done) and the sound files if you think you are up to the challenge. [[User:Steven|Steven]] 15:38, 28 December 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2124</id>
		<title>Flipnote Files/PPM</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2124"/>
		<updated>2009-08-24T15:18:03Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flipnotes animation files are normally stored on the SD card in the following folder:&lt;br /&gt;
&lt;br /&gt;
/private/ds/app/4B475556/001 - European location&lt;br /&gt;
&lt;br /&gt;
You can save your images in a user folder as long as it&#039;s on the same level as the 001 folder.  Clicking on the Choose Folder icon on the top of the View Flipnote / SD Card option gives you a list of normal folders, and you can swap to user folders by selecting the normal button again.  This could possibly be to overcome a limitation in one of the files (possibly the dirmemo2.lst file).&lt;br /&gt;
&lt;br /&gt;
==File Header==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Size of animation data&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| size of audio data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown - all files looked at so far has this field set to 24 00 hex.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 2&lt;br /&gt;
| Is locked? - 0 open, 1 locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Last Edited By Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Edit Author ID - the last user to save the file&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Previous Editing Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| Partial File name? - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 4&lt;br /&gt;
| Date stored as the number of seconds since midnight 1 Jan 2000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x009E&lt;br /&gt;
| 2&lt;br /&gt;
| Filler - 00 00&lt;br /&gt;
|-&lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
The 3 sections of the file name seem to be stored as:&lt;br /&gt;
*Last 6 digits of your Flipnote Studio ID&lt;br /&gt;
*A random number, possibly generated from a date stamp&lt;br /&gt;
*The version number of the file&lt;br /&gt;
&lt;br /&gt;
===Palette===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
! DS RGB Approximation&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| Not used / White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark Grey&lt;br /&gt;
| 10, 10, 10&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light Grey&lt;br /&gt;
| 20, 20, 20&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Pure Red&lt;br /&gt;
| 31, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark Red&lt;br /&gt;
| 15, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Light Red / Pink&lt;br /&gt;
| 31, 15, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure Blue&lt;br /&gt;
| 0, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Dark Blue&lt;br /&gt;
| 0, 0, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light Blue&lt;br /&gt;
| 15, 15, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta / Purple&lt;br /&gt;
| 31, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The preview image is a 64x48 image stored in a 16 colour tile format, with each 8x8 tile taking up 32 bytes of the file.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a photo taken of the altered preview image, reduced to about the correct size.&lt;br /&gt;
&lt;br /&gt;
[[Image:Palpic_actsize.png|{{Image:Palpic_actsize.png}}]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Palpic_big.JPG|Link to the original picture, warning image is 2,048 × 1,536.]]&lt;br /&gt;
&lt;br /&gt;
Here&#039;s two preview images that blasty decoded from some PPM files.&lt;br /&gt;
&lt;br /&gt;
[[Image:ppm_1.png]] [[Image:ppm_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Data Section==&lt;br /&gt;
The animation section starts at offset 0x06A0, with a header section.&lt;br /&gt;
&lt;br /&gt;
===Animation Sequence Header===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0000&lt;br /&gt;
| 4&lt;br /&gt;
| Size of the offset table&lt;br /&gt;
|-&lt;br /&gt;
| 0004&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| 4 * number of frames&lt;br /&gt;
| A list of offsets to the frames in the order to play them.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The offsets are all relative to the end of the offset list, and the frames are not stored in any specific format in the file, so you have to read this table for the next offset as I&#039;ve seen the list point to a frame at 00023572 and the next frame was at 00000000.&lt;br /&gt;
&lt;br /&gt;
===Animation Frame===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0000&lt;br /&gt;
| 1&lt;br /&gt;
| Pen and Paper information&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| 48&lt;br /&gt;
| Layer 1 line encoding&lt;br /&gt;
|-&lt;br /&gt;
| 0031&lt;br /&gt;
| 48&lt;br /&gt;
| Layer 2 line encoding&lt;br /&gt;
|-&lt;br /&gt;
| 0061&lt;br /&gt;
| ?&lt;br /&gt;
| The frame data stored layer 1 then layer 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The pen and paper byte at the start is encoded as follows:&lt;br /&gt;
&lt;br /&gt;
[[Image:paperpeninfo.png]]&lt;br /&gt;
&lt;br /&gt;
The paper bit indicates what color the paper is - 0 for black and 1 for white.&lt;br /&gt;
&lt;br /&gt;
The Frame encoding is 0 for a change between last frame and this one, and 1 for a totally new frame.&lt;br /&gt;
&lt;br /&gt;
The Layer 1 pen and Layer 2 pen information is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Number&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Not used&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Invert Paper (black on white or white on black)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Red&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Blue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Line encoding is compacted from the 192 lines on the screen down to 48 bytes per layer, each byte within the layer encoding section is stored as 2 bits per line, and 4 lines to the byte.  The lines are stored in the same order as the bits in the byte, i.e. line 0 uses bit 0-1, line 1 uses bit 2-3, line 2 uses bit 4-5, line 3 uses bit 6-7.  The value for the line encoding determins how many bytes you need to read at a minimum: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Number&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Skip this line - there is no data for this line&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Coded line&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Inverted coded line&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Raw line data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Before I explain how to read the line data you must understand that the way flipnote works is in layers, each layer is a bit map of on or off, with on being the pen colour, and off being the paper colour.&lt;br /&gt;
&lt;br /&gt;
The coded and inverted coded lines are stored with a 4 byte header that is used to indicate how many extra bytes to read, and what part of the line they represent.  Each byte after the first 4 is then read in a reverse order, i.e. pixel 0 of 8 is bit 0, etc.  To understand this you first take the 256 pixels of the line, and divide it by 8 to give 32, this is the maximum number of bytes a line encoding will ever use, and it&#039;s also the number of bits in 4 bytes.  The first 8 pixels of the line are used only when the bit 0x80000000 is set in the initial 4 bytes.&lt;br /&gt;
&lt;br /&gt;
For example the line is encoded as type 1, and the bytes that&#039;s stored is 80 00 00 00 20.&lt;br /&gt;
&lt;br /&gt;
The first 4 bytes is indicating that there is 1 byte effacted in this line, and that it&#039;s the first 8 pixels in the line.  The next byte is read and once it&#039;s expanded the 6&#039;th byte of the line is set to the pen colour.  If on the other hand the line was encoded with type 2, that one pixel would be the paper colour and every other pixel would be the pen colour.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s some code to show how to decode the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
u32 decodeLine( u8 *outB, u8 *inB, u32 useByte, u8 paper, u8 pen, u8 invflag )&lt;br /&gt;
{&lt;br /&gt;
	u32 offset = 0;&lt;br /&gt;
	u16 x = 0, i;&lt;br /&gt;
	u8 data;&lt;br /&gt;
&lt;br /&gt;
	if( useByte == 0 ) // Set the full line to the current paper colour&lt;br /&gt;
		memset( outB, paper, 256 );&lt;br /&gt;
	else // Bytes in this line, read and deal with them&lt;br /&gt;
	{&lt;br /&gt;
		while( useByte != 0 )&lt;br /&gt;
		{&lt;br /&gt;
			if( ( useByte &amp;amp; 0x80000000 ) == 0x80000000 )&lt;br /&gt;
			{&lt;br /&gt;
				// This byte exists...&lt;br /&gt;
				data = inB[ offset++ ];&lt;br /&gt;
&lt;br /&gt;
				for( i = 0; i &amp;lt; 8; i ++ )&lt;br /&gt;
				{&lt;br /&gt;
					if( ( data &amp;amp; 0x01 ) == 0x01 )&lt;br /&gt;
						outB[ x ] = invflag == 0 ? pen : paper;&lt;br /&gt;
					else&lt;br /&gt;
						outB[ x ] = invflag == 0 ? paper : pen;&lt;br /&gt;
&lt;br /&gt;
					x ++;&lt;br /&gt;
&lt;br /&gt;
					data &amp;gt;&amp;gt;= 1;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				memset( &amp;amp;outB[ x ], paper, 8 );&lt;br /&gt;
				x += 8;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			useByte &amp;lt;&amp;lt;= 1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( x &amp;lt; 256 )&lt;br /&gt;
			memset( &amp;amp;outB[ x ], paper, 256 - x );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return offset;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The outB and inB are pointers to pre-allocated memory blocks, the inB is a pointer to the file, and the outB is the output data block.  The useByte is the 4 bytes that is at the start of the line, if your reading a type 3 line (full raw data) just pass in 0xFFFFFFFF.  The pen and paper values are what was read from the pen and paper information block.&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Main_Page/Welcome&amp;diff=2119</id>
		<title>Main Page/Welcome</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Main_Page/Welcome&amp;diff=2119"/>
		<updated>2009-08-22T19:30:04Z</updated>

		<summary type="html">&lt;p&gt;Steven: Removed link to GBATemp for the bruteforcer application.  It&amp;#039;s a dead application and it would never work.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Main page box|Welcome!|Main Page/Welcome}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: -.3em -1em -1em -1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; bgcolor=&amp;quot;#fff&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2px&amp;quot; cellspacing=&amp;quot;2px&amp;quot; style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#e7eef6&amp;quot;&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; | &#039;&#039;&#039;What is Homebrew?&#039;&#039;&#039;&lt;br /&gt;
! width=&amp;quot;50%&amp;quot;| &#039;&#039;&#039;Want to help?&#039;&#039;&#039;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; align=&amp;quot;left&amp;quot; style=&amp;quot;background: #F5FAFF;&amp;quot;&lt;br /&gt;
| [http://en.wikipedia.org/wiki/Homebrew_(video_games) Homebrew] is a popular term used for applications that are created and executed on a video game console by hackers and consumers. &lt;br /&gt;
| Homebrew is not yet possible for the average consumer, however, you can help out by documenting as much as you can about the system and putting your findings on the wiki.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{box-footer-empty}}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=File:Paperpeninfo.png&amp;diff=2086</id>
		<title>File:Paperpeninfo.png</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=File:Paperpeninfo.png&amp;diff=2086"/>
		<updated>2009-08-21T19:01:06Z</updated>

		<summary type="html">&lt;p&gt;Steven: uploaded a new version of &amp;quot;Image:Paperpeninfo.png&amp;quot;: Added information on one of the unknown bits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flipnote Studio PaperPenInfo byte diagram&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2085</id>
		<title>Flipnote Files/PPM</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2085"/>
		<updated>2009-08-21T18:56:18Z</updated>

		<summary type="html">&lt;p&gt;Steven: /* Animation Frame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flipnotes animation files are normally stored on the SD card in the following folder:&lt;br /&gt;
&lt;br /&gt;
/private/ds/app/4B475556/001 - European location&lt;br /&gt;
&lt;br /&gt;
You can save your images in a user folder as long as it&#039;s on the same level as the 001 folder.  Clicking on the Choose Folder icon on the top of the View Flipnote / SD Card option gives you a list of normal folders, and you can swap to user folders by selecting the normal button again.  This could possibly be to overcome a limitation in one of the files (possibly the dirmemo2.lst file).&lt;br /&gt;
&lt;br /&gt;
==File Header==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Size of animation data&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| size of audio data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown - all files looked at so far has this field set to 24 00 hex.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 2&lt;br /&gt;
| Is locked? - 0 open, 1 locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Last Edited By Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Edit Author ID - the last user to save the file&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Previous Editing Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| Partial File name? - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
The 3 sections of the file name seem to be stored as:&lt;br /&gt;
*Last 6 digits of your Flipnote Studio ID&lt;br /&gt;
*A random number, possibly generated from a date stamp&lt;br /&gt;
*The version number of the file&lt;br /&gt;
&lt;br /&gt;
===Palette===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
! DS RGB Approximation&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| Not used / White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark Grey&lt;br /&gt;
| 10, 10, 10&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light Grey&lt;br /&gt;
| 20, 20, 20&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Pure Red&lt;br /&gt;
| 31, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark Red&lt;br /&gt;
| 15, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Light Red / Pink&lt;br /&gt;
| 31, 15, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure Blue&lt;br /&gt;
| 0, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Dark Blue&lt;br /&gt;
| 0, 0, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light Blue&lt;br /&gt;
| 15, 15, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta / Purple&lt;br /&gt;
| 31, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The preview image is a 64x48 image stored in a 16 colour tile format, with each 8x8 tile taking up 32 bytes of the file.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a photo taken of the altered preview image, reduced to about the correct size.&lt;br /&gt;
&lt;br /&gt;
[[Image:Palpic_actsize.png|{{Image:Palpic_actsize.png}}]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Palpic_big.JPG|Link to the original picture, warning image is 2,048 × 1,536.]]&lt;br /&gt;
&lt;br /&gt;
Here&#039;s two preview images that blasty decoded from some PPM files.&lt;br /&gt;
&lt;br /&gt;
[[Image:ppm_1.png]] [[Image:ppm_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Data Section==&lt;br /&gt;
The animation section starts at offset 0x06A0, with a header section.&lt;br /&gt;
&lt;br /&gt;
===Animation Sequence Header===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0000&lt;br /&gt;
| 4&lt;br /&gt;
| Size of the offset table&lt;br /&gt;
|-&lt;br /&gt;
| 0004&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| 4 * number of frames&lt;br /&gt;
| A list of offsets to the frames in the order to play them.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The offsets are all relative to the end of the offset list, and the frames are not stored in any specific format in the file, so you have to read this table for the next offset as I&#039;ve seen the list point to a frame at 00023572 and the next frame was at 00000000.&lt;br /&gt;
&lt;br /&gt;
===Animation Frame===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0000&lt;br /&gt;
| 1&lt;br /&gt;
| Pen and Paper information&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| 48&lt;br /&gt;
| Layer 1 line encoding&lt;br /&gt;
|-&lt;br /&gt;
| 0031&lt;br /&gt;
| 48&lt;br /&gt;
| Layer 2 line encoding&lt;br /&gt;
|-&lt;br /&gt;
| 0061&lt;br /&gt;
| ?&lt;br /&gt;
| The frame data stored layer 1 then layer 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The pen and paper byte at the start is encoded as follows:&lt;br /&gt;
&lt;br /&gt;
[[Image:paperpeninfo.png]]&lt;br /&gt;
&lt;br /&gt;
The paper bit indicates what color the paper is - 0 for black and 1 for white.&lt;br /&gt;
&lt;br /&gt;
The Frame encoding is 0 for a change between last frame and this one, and 1 for a totally new frame.&lt;br /&gt;
&lt;br /&gt;
The Layer 1 pen and Layer 2 pen information is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Number&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Not used&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Invert Paper (black on white or white on black)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Red&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Blue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Line encoding is compacted from the 192 lines on the screen down to 48 bytes per layer, each byte within the layer encoding section is stored as 2 bits per line, and 4 lines to the byte.  The lines are stored in the same order as the bits in the byte, i.e. line 0 uses bit 0-1, line 1 uses bit 2-3, line 2 uses bit 4-5, line 3 uses bit 6-7.  The value for the line encoding determins how many bytes you need to read at a minimum: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Number&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Skip this line - there is no data for this line&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Coded line&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Inverted coded line&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Raw line data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Before I explain how to read the line data you must understand that the way flipnote works is in layers, each layer is a bit map of on or off, with on being the pen colour, and off being the paper colour.&lt;br /&gt;
&lt;br /&gt;
The coded and inverted coded lines are stored with a 4 byte header that is used to indicate how many extra bytes to read, and what part of the line they represent.  Each byte after the first 4 is then read in a reverse order, i.e. pixel 0 of 8 is bit 0, etc.  To understand this you first take the 256 pixels of the line, and divide it by 8 to give 32, this is the maximum number of bytes a line encoding will ever use, and it&#039;s also the number of bits in 4 bytes.  The first 8 pixels of the line are used only when the bit 0x80000000 is set in the initial 4 bytes.&lt;br /&gt;
&lt;br /&gt;
For example the line is encoded as type 1, and the bytes that&#039;s stored is 80 00 00 00 20.&lt;br /&gt;
&lt;br /&gt;
The first 4 bytes is indicating that there is 1 byte effacted in this line, and that it&#039;s the first 8 pixels in the line.  The next byte is read and once it&#039;s expanded the 6&#039;th byte of the line is set to the pen colour.  If on the other hand the line was encoded with type 2, that one pixel would be the paper colour and every other pixel would be the pen colour.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s some code to show how to decode the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
u32 decodeLine( u8 *outB, u8 *inB, u32 useByte, u8 paper, u8 pen, u8 invflag )&lt;br /&gt;
{&lt;br /&gt;
	u32 offset = 0;&lt;br /&gt;
	u16 x = 0, i;&lt;br /&gt;
	u8 data;&lt;br /&gt;
&lt;br /&gt;
	if( useByte == 0 ) // Set the full line to the current paper colour&lt;br /&gt;
		memset( outB, paper, 256 );&lt;br /&gt;
	else // Bytes in this line, read and deal with them&lt;br /&gt;
	{&lt;br /&gt;
		while( useByte != 0 )&lt;br /&gt;
		{&lt;br /&gt;
			if( ( useByte &amp;amp; 0x80000000 ) == 0x80000000 )&lt;br /&gt;
			{&lt;br /&gt;
				// This byte exists...&lt;br /&gt;
				data = inB[ offset++ ];&lt;br /&gt;
&lt;br /&gt;
				for( i = 0; i &amp;lt; 8; i ++ )&lt;br /&gt;
				{&lt;br /&gt;
					if( ( data &amp;amp; 0x01 ) == 0x01 )&lt;br /&gt;
						outB[ x ] = invflag == 0 ? pen : paper;&lt;br /&gt;
					else&lt;br /&gt;
						outB[ x ] = invflag == 0 ? paper : pen;&lt;br /&gt;
&lt;br /&gt;
					x ++;&lt;br /&gt;
&lt;br /&gt;
					data &amp;gt;&amp;gt;= 1;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				memset( &amp;amp;outB[ x ], paper, 8 );&lt;br /&gt;
				x += 8;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			useByte &amp;lt;&amp;lt;= 1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( x &amp;lt; 256 )&lt;br /&gt;
			memset( &amp;amp;outB[ x ], paper, 256 - x );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return offset;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The outB and inB are pointers to pre-allocated memory blocks, the inB is a pointer to the file, and the outB is the output data block.  The useByte is the 4 bytes that is at the start of the line, if your reading a type 3 line (full raw data) just pass in 0xFFFFFFFF.  The pen and paper values are what was read from the pen and paper information block.&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=1.4&amp;diff=2084</id>
		<title>1.4</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=1.4&amp;diff=2084"/>
		<updated>2009-08-21T17:28:45Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The System Menu 1.4 was released on 29 July 2009 in Japan, 30 July 2009 in Europe and in Australia, and 3 August 2009 in the United States.&lt;br /&gt;
&lt;br /&gt;
== Changelog ==&lt;br /&gt;
&lt;br /&gt;
* Facebook support in &amp;quot;Nintendo DSi Camera&amp;quot; application. You can now share your photos in your facebook account.&lt;br /&gt;
* New version of [[Nintendo DSi Browser]] (Opera 9.50/&#039;&#039;&#039;507&#039;&#039;&#039;)&lt;br /&gt;
* All Flashcards blocked.  Some flashcarts have been re-enabled via a firmware update for the flashcart itself.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
&lt;br /&gt;
If you do not update, you can&#039;t access the [[Nintendo DSi Shop|DSi Shop]].&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[System Menu]]&lt;br /&gt;
* [[Nintendo Software]]&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2071</id>
		<title>Flipnote Files/PPM</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2071"/>
		<updated>2009-08-21T10:18:45Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flipnotes animation files are normally stored on the SD card in the following folder:&lt;br /&gt;
&lt;br /&gt;
/private/ds/app/4B475556/001 - European location&lt;br /&gt;
&lt;br /&gt;
You can save your images in a user folder as long as it&#039;s on the same level as the 001 folder.  Clicking on the Choose Folder icon on the top of the View Flipnote / SD Card option gives you a list of normal folders, and you can swap to user folders by selecting the normal button again.  This could possibly be to overcome a limitation in one of the files (possibly the dirmemo2.lst file).&lt;br /&gt;
&lt;br /&gt;
==File Header==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Size of animation data&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| size of audio data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown - all files looked at so far has this field set to 24 00 hex.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 2&lt;br /&gt;
| Is locked? - 0 open, 1 locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Last Edited By Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Edit Author ID - the last user to save the file&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Previous Editing Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| Partial File name? - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
The 3 sections of the file name seem to be stored as:&lt;br /&gt;
*Last 6 digits of your Flipnote Studio ID&lt;br /&gt;
*A random number, possibly generated from a date stamp&lt;br /&gt;
*The version number of the file&lt;br /&gt;
&lt;br /&gt;
===Palette===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
! DS RGB Approximation&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| Not used / White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark Grey&lt;br /&gt;
| 10, 10, 10&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light Grey&lt;br /&gt;
| 20, 20, 20&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Pure Red&lt;br /&gt;
| 31, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark Red&lt;br /&gt;
| 15, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Light Red / Pink&lt;br /&gt;
| 31, 15, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure Blue&lt;br /&gt;
| 0, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Dark Blue&lt;br /&gt;
| 0, 0, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light Blue&lt;br /&gt;
| 15, 15, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta / Purple&lt;br /&gt;
| 31, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The preview image is a 64x48 image stored in a 16 colour tile format, with each 8x8 tile taking up 32 bytes of the file.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a photo taken of the altered preview image, reduced to about the correct size.&lt;br /&gt;
&lt;br /&gt;
[[Image:Palpic_actsize.png|{{Image:Palpic_actsize.png}}]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Palpic_big.JPG|Link to the original picture, warning image is 2,048 × 1,536.]]&lt;br /&gt;
&lt;br /&gt;
Here&#039;s two preview images that blasty decoded from some PPM files.&lt;br /&gt;
&lt;br /&gt;
[[Image:ppm_1.png]] [[Image:ppm_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Data Section==&lt;br /&gt;
The animation section starts at offset 0x06A0, with a header section.&lt;br /&gt;
&lt;br /&gt;
===Animation Sequence Header===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0000&lt;br /&gt;
| 4&lt;br /&gt;
| Size of the offset table&lt;br /&gt;
|-&lt;br /&gt;
| 0004&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0008&lt;br /&gt;
| 4 * number of frames&lt;br /&gt;
| A list of offsets to the frames in the order to play them.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The offsets are all relative to the end of the offset list, and the frames are not stored in any specific format in the file, so you have to read this table for the next offset as I&#039;ve seen the list point to a frame at 00023572 and the next frame was at 00000000.&lt;br /&gt;
&lt;br /&gt;
===Animation Frame===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0000&lt;br /&gt;
| 1&lt;br /&gt;
| Pen and Paper information&lt;br /&gt;
|-&lt;br /&gt;
| 0001&lt;br /&gt;
| 48&lt;br /&gt;
| Layer 1 line encoding&lt;br /&gt;
|-&lt;br /&gt;
| 0031&lt;br /&gt;
| 48&lt;br /&gt;
| Layer 2 line encoding&lt;br /&gt;
|-&lt;br /&gt;
| 0061&lt;br /&gt;
| ?&lt;br /&gt;
| The frame data stored layer 1 then layer 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The pen and paper byte at the start is encoded as follows:&lt;br /&gt;
&lt;br /&gt;
[[Image:paperpeninfo.png]]&lt;br /&gt;
&lt;br /&gt;
The paper bit indicates what color the paper is - 0 for black and 1 for white.&lt;br /&gt;
&lt;br /&gt;
The Layer 1 pen and Layer 2 pen information is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Number&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Not used&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Invert Paper (black on white or white on black)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Red&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Blue&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Line encoding is compacted from the 192 lines on the screen down to 48 bytes per layer, each byte within the layer encoding section is stored as 2 bits per line, and 4 lines to the byte.  The lines are stored in the same order as the bits in the byte, i.e. line 0 uses bit 0-1, line 1 uses bit 2-3, line 2 uses bit 4-5, line 3 uses bit 6-7.  The value for the line encoding determins how many bytes you need to read at a minimum: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Number&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Skip this line - there is no data for this line&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Coded line&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Inverted coded line&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Raw line data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Before I explain how to read the line data you must understand that the way flipnote works is in layers, each layer is a bit map of on or off, with on being the pen colour, and off being the paper colour.&lt;br /&gt;
&lt;br /&gt;
The coded and inverted coded lines are stored with a 4 byte header that is used to indicate how many extra bytes to read, and what part of the line they represent.  Each byte after the first 4 is then read in a reverse order, i.e. pixel 0 of 8 is bit 0, etc.  To understand this you first take the 256 pixels of the line, and divide it by 8 to give 32, this is the maximum number of bytes a line encoding will ever use, and it&#039;s also the number of bits in 4 bytes.  The first 8 pixels of the line are used only when the bit 0x80000000 is set in the initial 4 bytes.&lt;br /&gt;
&lt;br /&gt;
For example the line is encoded as type 1, and the bytes that&#039;s stored is 80 00 00 00 20.&lt;br /&gt;
&lt;br /&gt;
The first 4 bytes is indicating that there is 1 byte effacted in this line, and that it&#039;s the first 8 pixels in the line.  The next byte is read and once it&#039;s expanded the 6&#039;th byte of the line is set to the pen colour.  If on the other hand the line was encoded with type 2, that one pixel would be the paper colour and every other pixel would be the pen colour.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s some code to show how to decode the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
u32 decodeLine( u8 *outB, u8 *inB, u32 useByte, u8 paper, u8 pen, u8 invflag )&lt;br /&gt;
{&lt;br /&gt;
	u32 offset = 0;&lt;br /&gt;
	u16 x = 0, i;&lt;br /&gt;
	u8 data;&lt;br /&gt;
&lt;br /&gt;
	if( useByte == 0 ) // Set the full line to the current paper colour&lt;br /&gt;
		memset( outB, paper, 256 );&lt;br /&gt;
	else // Bytes in this line, read and deal with them&lt;br /&gt;
	{&lt;br /&gt;
		while( useByte != 0 )&lt;br /&gt;
		{&lt;br /&gt;
			if( ( useByte &amp;amp; 0x80000000 ) == 0x80000000 )&lt;br /&gt;
			{&lt;br /&gt;
				// This byte exists...&lt;br /&gt;
				data = inB[ offset++ ];&lt;br /&gt;
&lt;br /&gt;
				for( i = 0; i &amp;lt; 8; i ++ )&lt;br /&gt;
				{&lt;br /&gt;
					if( ( data &amp;amp; 0x01 ) == 0x01 )&lt;br /&gt;
						outB[ x ] = invflag == 0 ? pen : paper;&lt;br /&gt;
					else&lt;br /&gt;
						outB[ x ] = invflag == 0 ? paper : pen;&lt;br /&gt;
&lt;br /&gt;
					x ++;&lt;br /&gt;
&lt;br /&gt;
					data &amp;gt;&amp;gt;= 1;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				memset( &amp;amp;outB[ x ], paper, 8 );&lt;br /&gt;
				x += 8;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			useByte &amp;lt;&amp;lt;= 1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( x &amp;lt; 256 )&lt;br /&gt;
			memset( &amp;amp;outB[ x ], paper, 256 - x );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return offset;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The outB and inB are pointers to pre-allocated memory blocks, the inB is a pointer to the file, and the outB is the output data block.  The useByte is the 4 bytes that is at the start of the line, if your reading a type 3 line (full raw data) just pass in 0xFFFFFFFF.  The pen and paper values are what was read from the pen and paper information block.&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=User:Steven/flip_frame_decode.c&amp;diff=2068</id>
		<title>User:Steven/flip frame decode.c</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User:Steven/flip_frame_decode.c&amp;diff=2068"/>
		<updated>2009-08-21T09:53:26Z</updated>

		<summary type="html">&lt;p&gt;Steven: Steven/flip frame decode.c moved to User:Steven/flip frame decode.c: Lets try this again - Wiki NOOB ALERT XD&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please note that there is very little comments and this application just outputs to the text console at the moment, but the code used here can be expanded to produce any other image file formats you wanted.  I&#039;m still working on the sound format and as such there is no functions for the sound yet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;memory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Disable MS VC&#039;s &amp;quot;unsecure / depricated&amp;quot; code warning&lt;br /&gt;
#pragma warning( disable : 4996 )&lt;br /&gt;
&lt;br /&gt;
// setup some file types for set sizes&lt;br /&gt;
typedef signed char		s8;&lt;br /&gt;
typedef signed short	s16;&lt;br /&gt;
typedef signed long		s32;&lt;br /&gt;
typedef unsigned char	u8;&lt;br /&gt;
typedef unsigned short	u16;&lt;br /&gt;
typedef unsigned long	u32;&lt;br /&gt;
&lt;br /&gt;
typedef struct PPM_HEADER&lt;br /&gt;
{&lt;br /&gt;
    u8  magic[4];&lt;br /&gt;
    u32 fileSize;&lt;br /&gt;
    u32 audioOffset;&lt;br /&gt;
    u16 numberOfFrames;&lt;br /&gt;
    u16 unk0;&lt;br /&gt;
    u16 flags;&lt;br /&gt;
    u16 previewFrameNumber;&lt;br /&gt;
    u16 originalAuthorName[11];&lt;br /&gt;
    u16 authorName[11];&lt;br /&gt;
    u16 userName[11];&lt;br /&gt;
    u8  originalAuthorID[8];&lt;br /&gt;
    u8  editAuthorID[8];&lt;br /&gt;
    u8  originalFileName[18];&lt;br /&gt;
    u8  fileName[18];&lt;br /&gt;
    u8  authorID[8];&lt;br /&gt;
    u8  unk1[8];&lt;br /&gt;
    u8  unk2[6];&lt;br /&gt;
    u8  previewBitmap[1536];&lt;br /&gt;
} ppmHeader;&lt;br /&gt;
&lt;br /&gt;
int flength(FILE *f)&lt;br /&gt;
{&lt;br /&gt;
  int pos,end;&lt;br /&gt;
  pos = ftell (f);&lt;br /&gt;
  fseek (f, 0, SEEK_END);&lt;br /&gt;
  end = ftell (f);&lt;br /&gt;
  fseek (f, pos, SEEK_SET);&lt;br /&gt;
  return end;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *idFromStr( u8 is[8] )&lt;br /&gt;
{&lt;br /&gt;
    static char retVal[32];&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    memset( retVal, 0, 32 );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 7; i &amp;gt;= 0; i -- )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%02X&amp;quot;, retVal, ( is[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
    &lt;br /&gt;
    return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *filenameFromStr( u8 fn[18] )&lt;br /&gt;
{&lt;br /&gt;
    static char retVal[64];&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    memset( retVal, 0, 32 );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 0; i &amp;lt; 3; i ++ )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%02X&amp;quot;, retVal, ( fn[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
         &lt;br /&gt;
    strcat( retVal, &amp;quot;_&amp;quot; );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 3; i &amp;lt; 16; i ++ )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%c&amp;quot;, retVal, ( fn[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
    &lt;br /&gt;
    sprintf( retVal, &amp;quot;%s_%03d&amp;quot;, retVal, ( fn[ 16 ] &amp;amp; 0xFF ) + ( ( fn[ 17 ] &amp;amp; 0xFF ) &amp;lt;&amp;lt; 8 ) );&lt;br /&gt;
    &lt;br /&gt;
    return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *hexFromStr( u8 is[8], int len )&lt;br /&gt;
{&lt;br /&gt;
    static char retVal[256];&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    memset( retVal, 0, 256 );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 0; i &amp;lt; len; i ++ )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%02X &amp;quot;, retVal, ( is[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
    &lt;br /&gt;
    return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printHeaderInfo( ppmHeader *ptr )&lt;br /&gt;
{&lt;br /&gt;
    printf( &amp;quot;Magic Number    : %c%c%c%c\n&amp;quot;, ptr-&amp;gt;magic[0], ptr-&amp;gt;magic[1], ptr-&amp;gt;magic[2], ptr-&amp;gt;magic[3] );&lt;br /&gt;
    printf( &amp;quot;File Size       : %d (%08X)\n&amp;quot;, ptr-&amp;gt;fileSize, ptr-&amp;gt;fileSize );&lt;br /&gt;
    printf( &amp;quot;Audio offset    : %d (%08X)\n&amp;quot;, ptr-&amp;gt;audioOffset, ptr-&amp;gt;audioOffset );&lt;br /&gt;
    printf( &amp;quot;# Frames        : %d\n&amp;quot;, ptr-&amp;gt;numberOfFrames );&lt;br /&gt;
    printf( &amp;quot;Unknown         : 0x%04X\n&amp;quot;, ptr-&amp;gt;unk0 );&lt;br /&gt;
    printf( &amp;quot;Flags?          : 0x%04X - 0 = open, 1 = locked\n&amp;quot;, ptr-&amp;gt;flags );&lt;br /&gt;
    printf( &amp;quot;Preview Frame # : %d\n&amp;quot;, ptr-&amp;gt;previewFrameNumber );&lt;br /&gt;
    printf( &amp;quot;Orig Author     : UCS-2 string \n&amp;quot; );&lt;br /&gt;
    printf( &amp;quot;Author          : UCS-2 string \n&amp;quot; );&lt;br /&gt;
    printf( &amp;quot;Edit Author     : UCS-2 string \n&amp;quot; );&lt;br /&gt;
    printf( &amp;quot;Orig Author ID  : %s\n&amp;quot;, idFromStr( ptr-&amp;gt;originalAuthorID ) );&lt;br /&gt;
    printf( &amp;quot;Edit Author ID  : %s\n&amp;quot;, idFromStr( ptr-&amp;gt;editAuthorID ) );&lt;br /&gt;
    printf( &amp;quot;Orig Filename   : %s\n&amp;quot;, filenameFromStr( ptr-&amp;gt;originalFileName ) );&lt;br /&gt;
    printf( &amp;quot;Curr Filename   : %s\n&amp;quot;, filenameFromStr( ptr-&amp;gt;fileName ) );&lt;br /&gt;
    printf( &amp;quot;Author ID       : %s\n&amp;quot;, idFromStr( ptr-&amp;gt;authorID ) );&lt;br /&gt;
    printf( &amp;quot;Unknown 8 bytes : %s\n&amp;quot;, hexFromStr( ptr-&amp;gt;unk1, 8 ) ) ;&lt;br /&gt;
    printf( &amp;quot;Unknown 6 bytes : %s\n&amp;quot;, hexFromStr( ptr-&amp;gt;unk2, 6 ) ) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static char outPreviewG[] = { &#039; &#039;, 176, 219, 178, &#039;r&#039;, &#039;R&#039;, &#039;p&#039;, &#039;X&#039;, &#039;B&#039;, &#039;P&#039;, &#039;b&#039;, &#039;x&#039;, &#039;M&#039;, &#039;.&#039;, &#039;.&#039;, &#039;.&#039; };&lt;br /&gt;
&lt;br /&gt;
static char outFrameG0[] = {  32, 219, 176, 178 };&lt;br /&gt;
static char outFrameG1[] = { 219,  32, 176, 178 };&lt;br /&gt;
&lt;br /&gt;
void displayPreviewImage( u8 img[1536] )&lt;br /&gt;
{&lt;br /&gt;
    int x, y, cellOffset;&lt;br /&gt;
    int xp, xc;&lt;br /&gt;
    u8 c;&lt;br /&gt;
    &lt;br /&gt;
    for( y = 0; y &amp;lt; 48; y ++ )&lt;br /&gt;
    {&lt;br /&gt;
        cellOffset = ( ( y &amp;gt;&amp;gt; 3 ) * 256 ) + ( ( y &amp;amp; 0x7 ) &amp;lt;&amp;lt; 2 );&lt;br /&gt;
        for( x = 0; x &amp;lt; 64; x ++ )&lt;br /&gt;
        {&lt;br /&gt;
            xp = ( x &amp;amp; 7 ) &amp;gt;&amp;gt; 1;&lt;br /&gt;
            xc = ( ( x &amp;gt;&amp;gt; 3 ) &amp;lt;&amp;lt; 5 );&lt;br /&gt;
            c = img[ cellOffset + xp + xc ];&lt;br /&gt;
            printf( &amp;quot;%c&amp;quot;, outPreviewG[ ( x &amp;amp; 1 ? c  &amp;gt;&amp;gt; 4 : c ) &amp;amp; 0xF ] );&lt;br /&gt;
        }&lt;br /&gt;
        printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 getu32( u8 *buf )&lt;br /&gt;
{&lt;br /&gt;
	u32 retVal = 0;&lt;br /&gt;
&lt;br /&gt;
	retVal = retVal | ( buf[ 0 ] &amp;lt;&amp;lt;  0 );&lt;br /&gt;
	retVal = retVal | ( buf[ 1 ] &amp;lt;&amp;lt;  8 );&lt;br /&gt;
	retVal = retVal | ( buf[ 2 ] &amp;lt;&amp;lt; 16 );&lt;br /&gt;
	retVal = retVal | ( buf[ 3 ] &amp;lt;&amp;lt; 24 );&lt;br /&gt;
&lt;br /&gt;
	return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 getu32inv( u8 *buf )&lt;br /&gt;
{&lt;br /&gt;
	u32 retVal = 0;&lt;br /&gt;
&lt;br /&gt;
	retVal = retVal | ( buf[ 3 ] &amp;lt;&amp;lt;  0 );&lt;br /&gt;
	retVal = retVal | ( buf[ 2 ] &amp;lt;&amp;lt;  8 );&lt;br /&gt;
	retVal = retVal | ( buf[ 1 ] &amp;lt;&amp;lt; 16 );&lt;br /&gt;
	retVal = retVal | ( buf[ 0 ] &amp;lt;&amp;lt; 24 );&lt;br /&gt;
&lt;br /&gt;
	return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 getFrameOffset( u8 *buf, u16 frm )&lt;br /&gt;
{&lt;br /&gt;
	u32 numBytes;&lt;br /&gt;
&lt;br /&gt;
	numBytes = getu32( buf );&lt;br /&gt;
&lt;br /&gt;
	if( frm &amp;gt; ( numBytes &amp;gt;&amp;gt; 2 ) )&lt;br /&gt;
		return 0;&lt;br /&gt;
	&lt;br /&gt;
	return ( getu32( &amp;amp;buf[ 4 + ( frm &amp;lt;&amp;lt; 2 ) ] ) + 8 + numBytes );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 decodeLine( u8 *outB, u8 *inB, u32 useByte, u8 paper, u8 pen, u8 invflag )&lt;br /&gt;
{&lt;br /&gt;
	u32 offset = 0;&lt;br /&gt;
	u16 x = 0, i;&lt;br /&gt;
	u8 data;&lt;br /&gt;
&lt;br /&gt;
	if( useByte == 0 ) // Set the full line to the current paper colour&lt;br /&gt;
		memset( outB, paper, 256 );&lt;br /&gt;
	else // Bytes in this line, read and deal with them&lt;br /&gt;
	{&lt;br /&gt;
		while( useByte != 0 )&lt;br /&gt;
		{&lt;br /&gt;
			if( ( useByte &amp;amp; 0x80000000 ) == 0x80000000 )&lt;br /&gt;
			{&lt;br /&gt;
				// This byte exists...&lt;br /&gt;
				data = inB[ offset++ ];&lt;br /&gt;
&lt;br /&gt;
				for( i = 0; i &amp;lt; 8; i ++ )&lt;br /&gt;
				{&lt;br /&gt;
					if( ( data &amp;amp; 0x01 ) == 0x01 )&lt;br /&gt;
						outB[ x ] = invflag == 0 ? pen : paper;&lt;br /&gt;
					else&lt;br /&gt;
						outB[ x ] = invflag == 0 ? paper : pen;&lt;br /&gt;
&lt;br /&gt;
					x ++;&lt;br /&gt;
&lt;br /&gt;
					data &amp;gt;&amp;gt;= 1;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				memset( &amp;amp;outB[ x ], paper, 8 );&lt;br /&gt;
				x += 8;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			useByte &amp;lt;&amp;lt;= 1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( x &amp;lt; 256 )&lt;br /&gt;
			memset( &amp;amp;outB[ x ], paper, 256 - x );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return offset;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void displayFrame( u8 *frmBuf, u16 frmNum )&lt;br /&gt;
{&lt;br /&gt;
	u8 colPaper, colLayer1, colLayer2;&lt;br /&gt;
	u32 frmOffset;&lt;br /&gt;
	u8 lEnc[192];&lt;br /&gt;
	u8 *buf;&lt;br /&gt;
	u8 lnePos, lneCount;&lt;br /&gt;
	u8 *outFrameG;&lt;br /&gt;
	u16 x, y;&lt;br /&gt;
	u32 byteUse;&lt;br /&gt;
&lt;br /&gt;
	buf = (u8*) malloc( 256 * 192 );&lt;br /&gt;
	if( buf == NULL )&lt;br /&gt;
	{&lt;br /&gt;
		printf( &amp;quot;Error unable to allocate buffer for frame %d\n&amp;quot;, frmBuf );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	frmOffset = getFrameOffset( frmBuf, 1 );&lt;br /&gt;
&lt;br /&gt;
	printf( &amp;quot;Frame #%d offset %08X\n&amp;quot;, frmNum, frmOffset );&lt;br /&gt;
&lt;br /&gt;
	colPaper  = frmBuf[ frmOffset ] &amp;amp; 0x01;&lt;br /&gt;
	colLayer1 = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 1 ) &amp;amp; 0x03;&lt;br /&gt;
	colLayer2 = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 3 ) &amp;amp; 0x03;&lt;br /&gt;
&lt;br /&gt;
	printf( &amp;quot;Paper colour:   %s\n&amp;quot;, ( colPaper == 0 ? &amp;quot;Black&amp;quot; : &amp;quot;White&amp;quot; ) );&lt;br /&gt;
	printf( &amp;quot;Layer 1 colour: %d\n&amp;quot;, colLayer1 );&lt;br /&gt;
	printf( &amp;quot;Layer 2 colour: %d\n&amp;quot;, colLayer2 );&lt;br /&gt;
&lt;br /&gt;
	if( colPaper == 0 )&lt;br /&gt;
		outFrameG = outFrameG0;&lt;br /&gt;
	else&lt;br /&gt;
		outFrameG = outFrameG1;&lt;br /&gt;
&lt;br /&gt;
	memset( buf, outFrameG[0], 192 &amp;lt;&amp;lt; 8 );&lt;br /&gt;
&lt;br /&gt;
	lnePos = 0;&lt;br /&gt;
	frmOffset ++;&lt;br /&gt;
&lt;br /&gt;
	// Read layer 1 line information into lower nibble&lt;br /&gt;
	for( lneCount = 0; lneCount &amp;lt; 48; lneCount ++ )&lt;br /&gt;
	{&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 0 ) &amp;amp; 0x03;&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 2 ) &amp;amp; 0x03;&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 4 ) &amp;amp; 0x03;&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 6 ) &amp;amp; 0x03;&lt;br /&gt;
		frmOffset ++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	lnePos = 0;&lt;br /&gt;
	// Read layer 2 line information into upper nibble&lt;br /&gt;
	for( lneCount = 0; lneCount &amp;lt; 48; lneCount ++ )&lt;br /&gt;
	{&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;lt;&amp;lt; 4 ) &amp;amp; 0x30;&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;lt;&amp;lt; 2 ) &amp;amp; 0x30;&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 0 ) &amp;amp; 0x30;&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 2 ) &amp;amp; 0x30;&lt;br /&gt;
		frmOffset ++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//read frame here...&lt;br /&gt;
	// First read layer 1.&lt;br /&gt;
	lnePos = 0;&lt;br /&gt;
&lt;br /&gt;
	while( lnePos &amp;lt; 192 )&lt;br /&gt;
	{&lt;br /&gt;
		switch( lEnc[ lnePos ] &amp;amp; 0x03 )&lt;br /&gt;
		{&lt;br /&gt;
			case 0: // Skip this line&lt;br /&gt;
				byteUse = 0;&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Skip Frame [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				break;&lt;br /&gt;
			case 1: // Coded&lt;br /&gt;
				byteUse = getu32inv( &amp;amp;frmBuf[ frmOffset ] );&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Coded      [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				frmOffset += 4;&lt;br /&gt;
				frmOffset += decodeLine( &amp;amp;buf[ lnePos &amp;lt;&amp;lt; 8 ], &amp;amp;frmBuf[ frmOffset ], byteUse, outFrameG[ 0 ], outFrameG[ colLayer1 ], 0 );&lt;br /&gt;
				break;&lt;br /&gt;
			case 2: // Inv Coded&lt;br /&gt;
				byteUse = getu32inv( &amp;amp;frmBuf[ frmOffset ] );&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Inv Coded  [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				frmOffset += 4;&lt;br /&gt;
				frmOffset += decodeLine( &amp;amp;buf[ lnePos &amp;lt;&amp;lt; 8 ], &amp;amp;frmBuf[ frmOffset ], byteUse, outFrameG[ colLayer1 ], outFrameG[ 0 ], 1 );&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // Full Line&lt;br /&gt;
				byteUse = 0xFFFFFFFF;&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Full Frame [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				frmOffset += decodeLine( &amp;amp;buf[ lnePos &amp;lt;&amp;lt; 8 ], &amp;amp;frmBuf[ frmOffset ], byteUse, outFrameG[ 0 ], outFrameG[ colLayer1 ], 0 );&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		lnePos ++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//output frame here...&lt;br /&gt;
	for( y = 0; y &amp;lt; 192; y ++ )&lt;br /&gt;
	{&lt;br /&gt;
		for( x = 0; x &amp;lt; 256; x ++ )&lt;br /&gt;
		{&lt;br /&gt;
			printf( &amp;quot;%c&amp;quot;, buf[ x + ( y &amp;lt;&amp;lt; 8 ) ] );&lt;br /&gt;
		}&lt;br /&gt;
		printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void hexOut( char *buf, int len )&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    for( i = 0 ; i &amp;lt; len ; i ++ )&lt;br /&gt;
    {&lt;br /&gt;
        printf( &amp;quot;%02X &amp;quot;, buf[i] &amp;amp; 0xFF );&lt;br /&gt;
        &lt;br /&gt;
        if( ( i &amp;amp; 0xF ) == 0xF )&lt;br /&gt;
            printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
  ppmHeader *pHead;&lt;br /&gt;
  FILE *fp;&lt;br /&gt;
  int f_len;&lt;br /&gt;
  char *f_buf;&lt;br /&gt;
  &lt;br /&gt;
  if(argc != 2)&lt;br /&gt;
  {&lt;br /&gt;
    printf(&amp;quot;usage: %s &amp;lt;anim.ppm&amp;gt;\n&amp;quot;, argv[0]);&lt;br /&gt;
    exit(0);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  fp = fopen(argv[1],&amp;quot;rb&amp;quot;);&lt;br /&gt;
  if(fp == NULL)&lt;br /&gt;
  {&lt;br /&gt;
    printf(&amp;quot;input file not found\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  f_len = flength(fp);&lt;br /&gt;
  f_buf = malloc(f_len);&lt;br /&gt;
  if(f_buf == NULL)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr, &amp;quot;not enough memory\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if(fread(f_buf, f_len, 1, fp) != 1)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr, &amp;quot;file read failure\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  pHead = (ppmHeader *) f_buf;&lt;br /&gt;
&lt;br /&gt;
  printHeaderInfo( pHead );&lt;br /&gt;
  &lt;br /&gt;
  displayPreviewImage( pHead-&amp;gt;previewBitmap );&lt;br /&gt;
  &lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
  displayFrame( &amp;amp;f_buf[ 0x6a0 ], 1 );&lt;br /&gt;
&lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
  hexOut( &amp;amp;f_buf[ 0x6a0 ], 256 );&lt;br /&gt;
  &lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
  hexOut( &amp;amp;f_buf[ f_len - 256 ], 256 );&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;finished..\n&amp;quot;);&lt;br /&gt;
  free( f_buf);&lt;br /&gt;
  fclose(fp);&lt;br /&gt;
 &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=User:Steven&amp;diff=2067</id>
		<title>User:Steven</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User:Steven&amp;diff=2067"/>
		<updated>2009-08-21T09:52:39Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[/flip_frame_decode.c|Flipnote Frame Decoder application]] This is the code I&#039;m using to look at the file format.&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=User:Steven/flip_frame_decode.c&amp;diff=2065</id>
		<title>User:Steven/flip frame decode.c</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User:Steven/flip_frame_decode.c&amp;diff=2065"/>
		<updated>2009-08-21T09:52:27Z</updated>

		<summary type="html">&lt;p&gt;Steven: \flip frame decode.c moved to Steven/flip frame decode.c: I&amp;#039;m too used to MS-DOS slashes...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please note that there is very little comments and this application just outputs to the text console at the moment, but the code used here can be expanded to produce any other image file formats you wanted.  I&#039;m still working on the sound format and as such there is no functions for the sound yet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;memory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Disable MS VC&#039;s &amp;quot;unsecure / depricated&amp;quot; code warning&lt;br /&gt;
#pragma warning( disable : 4996 )&lt;br /&gt;
&lt;br /&gt;
// setup some file types for set sizes&lt;br /&gt;
typedef signed char		s8;&lt;br /&gt;
typedef signed short	s16;&lt;br /&gt;
typedef signed long		s32;&lt;br /&gt;
typedef unsigned char	u8;&lt;br /&gt;
typedef unsigned short	u16;&lt;br /&gt;
typedef unsigned long	u32;&lt;br /&gt;
&lt;br /&gt;
typedef struct PPM_HEADER&lt;br /&gt;
{&lt;br /&gt;
    u8  magic[4];&lt;br /&gt;
    u32 fileSize;&lt;br /&gt;
    u32 audioOffset;&lt;br /&gt;
    u16 numberOfFrames;&lt;br /&gt;
    u16 unk0;&lt;br /&gt;
    u16 flags;&lt;br /&gt;
    u16 previewFrameNumber;&lt;br /&gt;
    u16 originalAuthorName[11];&lt;br /&gt;
    u16 authorName[11];&lt;br /&gt;
    u16 userName[11];&lt;br /&gt;
    u8  originalAuthorID[8];&lt;br /&gt;
    u8  editAuthorID[8];&lt;br /&gt;
    u8  originalFileName[18];&lt;br /&gt;
    u8  fileName[18];&lt;br /&gt;
    u8  authorID[8];&lt;br /&gt;
    u8  unk1[8];&lt;br /&gt;
    u8  unk2[6];&lt;br /&gt;
    u8  previewBitmap[1536];&lt;br /&gt;
} ppmHeader;&lt;br /&gt;
&lt;br /&gt;
int flength(FILE *f)&lt;br /&gt;
{&lt;br /&gt;
  int pos,end;&lt;br /&gt;
  pos = ftell (f);&lt;br /&gt;
  fseek (f, 0, SEEK_END);&lt;br /&gt;
  end = ftell (f);&lt;br /&gt;
  fseek (f, pos, SEEK_SET);&lt;br /&gt;
  return end;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *idFromStr( u8 is[8] )&lt;br /&gt;
{&lt;br /&gt;
    static char retVal[32];&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    memset( retVal, 0, 32 );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 7; i &amp;gt;= 0; i -- )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%02X&amp;quot;, retVal, ( is[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
    &lt;br /&gt;
    return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *filenameFromStr( u8 fn[18] )&lt;br /&gt;
{&lt;br /&gt;
    static char retVal[64];&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    memset( retVal, 0, 32 );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 0; i &amp;lt; 3; i ++ )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%02X&amp;quot;, retVal, ( fn[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
         &lt;br /&gt;
    strcat( retVal, &amp;quot;_&amp;quot; );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 3; i &amp;lt; 16; i ++ )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%c&amp;quot;, retVal, ( fn[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
    &lt;br /&gt;
    sprintf( retVal, &amp;quot;%s_%03d&amp;quot;, retVal, ( fn[ 16 ] &amp;amp; 0xFF ) + ( ( fn[ 17 ] &amp;amp; 0xFF ) &amp;lt;&amp;lt; 8 ) );&lt;br /&gt;
    &lt;br /&gt;
    return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *hexFromStr( u8 is[8], int len )&lt;br /&gt;
{&lt;br /&gt;
    static char retVal[256];&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    memset( retVal, 0, 256 );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 0; i &amp;lt; len; i ++ )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%02X &amp;quot;, retVal, ( is[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
    &lt;br /&gt;
    return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printHeaderInfo( ppmHeader *ptr )&lt;br /&gt;
{&lt;br /&gt;
    printf( &amp;quot;Magic Number    : %c%c%c%c\n&amp;quot;, ptr-&amp;gt;magic[0], ptr-&amp;gt;magic[1], ptr-&amp;gt;magic[2], ptr-&amp;gt;magic[3] );&lt;br /&gt;
    printf( &amp;quot;File Size       : %d (%08X)\n&amp;quot;, ptr-&amp;gt;fileSize, ptr-&amp;gt;fileSize );&lt;br /&gt;
    printf( &amp;quot;Audio offset    : %d (%08X)\n&amp;quot;, ptr-&amp;gt;audioOffset, ptr-&amp;gt;audioOffset );&lt;br /&gt;
    printf( &amp;quot;# Frames        : %d\n&amp;quot;, ptr-&amp;gt;numberOfFrames );&lt;br /&gt;
    printf( &amp;quot;Unknown         : 0x%04X\n&amp;quot;, ptr-&amp;gt;unk0 );&lt;br /&gt;
    printf( &amp;quot;Flags?          : 0x%04X - 0 = open, 1 = locked\n&amp;quot;, ptr-&amp;gt;flags );&lt;br /&gt;
    printf( &amp;quot;Preview Frame # : %d\n&amp;quot;, ptr-&amp;gt;previewFrameNumber );&lt;br /&gt;
    printf( &amp;quot;Orig Author     : UCS-2 string \n&amp;quot; );&lt;br /&gt;
    printf( &amp;quot;Author          : UCS-2 string \n&amp;quot; );&lt;br /&gt;
    printf( &amp;quot;Edit Author     : UCS-2 string \n&amp;quot; );&lt;br /&gt;
    printf( &amp;quot;Orig Author ID  : %s\n&amp;quot;, idFromStr( ptr-&amp;gt;originalAuthorID ) );&lt;br /&gt;
    printf( &amp;quot;Edit Author ID  : %s\n&amp;quot;, idFromStr( ptr-&amp;gt;editAuthorID ) );&lt;br /&gt;
    printf( &amp;quot;Orig Filename   : %s\n&amp;quot;, filenameFromStr( ptr-&amp;gt;originalFileName ) );&lt;br /&gt;
    printf( &amp;quot;Curr Filename   : %s\n&amp;quot;, filenameFromStr( ptr-&amp;gt;fileName ) );&lt;br /&gt;
    printf( &amp;quot;Author ID       : %s\n&amp;quot;, idFromStr( ptr-&amp;gt;authorID ) );&lt;br /&gt;
    printf( &amp;quot;Unknown 8 bytes : %s\n&amp;quot;, hexFromStr( ptr-&amp;gt;unk1, 8 ) ) ;&lt;br /&gt;
    printf( &amp;quot;Unknown 6 bytes : %s\n&amp;quot;, hexFromStr( ptr-&amp;gt;unk2, 6 ) ) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static char outPreviewG[] = { &#039; &#039;, 176, 219, 178, &#039;r&#039;, &#039;R&#039;, &#039;p&#039;, &#039;X&#039;, &#039;B&#039;, &#039;P&#039;, &#039;b&#039;, &#039;x&#039;, &#039;M&#039;, &#039;.&#039;, &#039;.&#039;, &#039;.&#039; };&lt;br /&gt;
&lt;br /&gt;
static char outFrameG0[] = {  32, 219, 176, 178 };&lt;br /&gt;
static char outFrameG1[] = { 219,  32, 176, 178 };&lt;br /&gt;
&lt;br /&gt;
void displayPreviewImage( u8 img[1536] )&lt;br /&gt;
{&lt;br /&gt;
    int x, y, cellOffset;&lt;br /&gt;
    int xp, xc;&lt;br /&gt;
    u8 c;&lt;br /&gt;
    &lt;br /&gt;
    for( y = 0; y &amp;lt; 48; y ++ )&lt;br /&gt;
    {&lt;br /&gt;
        cellOffset = ( ( y &amp;gt;&amp;gt; 3 ) * 256 ) + ( ( y &amp;amp; 0x7 ) &amp;lt;&amp;lt; 2 );&lt;br /&gt;
        for( x = 0; x &amp;lt; 64; x ++ )&lt;br /&gt;
        {&lt;br /&gt;
            xp = ( x &amp;amp; 7 ) &amp;gt;&amp;gt; 1;&lt;br /&gt;
            xc = ( ( x &amp;gt;&amp;gt; 3 ) &amp;lt;&amp;lt; 5 );&lt;br /&gt;
            c = img[ cellOffset + xp + xc ];&lt;br /&gt;
            printf( &amp;quot;%c&amp;quot;, outPreviewG[ ( x &amp;amp; 1 ? c  &amp;gt;&amp;gt; 4 : c ) &amp;amp; 0xF ] );&lt;br /&gt;
        }&lt;br /&gt;
        printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 getu32( u8 *buf )&lt;br /&gt;
{&lt;br /&gt;
	u32 retVal = 0;&lt;br /&gt;
&lt;br /&gt;
	retVal = retVal | ( buf[ 0 ] &amp;lt;&amp;lt;  0 );&lt;br /&gt;
	retVal = retVal | ( buf[ 1 ] &amp;lt;&amp;lt;  8 );&lt;br /&gt;
	retVal = retVal | ( buf[ 2 ] &amp;lt;&amp;lt; 16 );&lt;br /&gt;
	retVal = retVal | ( buf[ 3 ] &amp;lt;&amp;lt; 24 );&lt;br /&gt;
&lt;br /&gt;
	return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 getu32inv( u8 *buf )&lt;br /&gt;
{&lt;br /&gt;
	u32 retVal = 0;&lt;br /&gt;
&lt;br /&gt;
	retVal = retVal | ( buf[ 3 ] &amp;lt;&amp;lt;  0 );&lt;br /&gt;
	retVal = retVal | ( buf[ 2 ] &amp;lt;&amp;lt;  8 );&lt;br /&gt;
	retVal = retVal | ( buf[ 1 ] &amp;lt;&amp;lt; 16 );&lt;br /&gt;
	retVal = retVal | ( buf[ 0 ] &amp;lt;&amp;lt; 24 );&lt;br /&gt;
&lt;br /&gt;
	return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 getFrameOffset( u8 *buf, u16 frm )&lt;br /&gt;
{&lt;br /&gt;
	u32 numBytes;&lt;br /&gt;
&lt;br /&gt;
	numBytes = getu32( buf );&lt;br /&gt;
&lt;br /&gt;
	if( frm &amp;gt; ( numBytes &amp;gt;&amp;gt; 2 ) )&lt;br /&gt;
		return 0;&lt;br /&gt;
	&lt;br /&gt;
	return ( getu32( &amp;amp;buf[ 4 + ( frm &amp;lt;&amp;lt; 2 ) ] ) + 8 + numBytes );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 decodeLine( u8 *outB, u8 *inB, u32 useByte, u8 paper, u8 pen, u8 invflag )&lt;br /&gt;
{&lt;br /&gt;
	u32 offset = 0;&lt;br /&gt;
	u16 x = 0, i;&lt;br /&gt;
	u8 data;&lt;br /&gt;
&lt;br /&gt;
	if( useByte == 0 ) // Set the full line to the current paper colour&lt;br /&gt;
		memset( outB, paper, 256 );&lt;br /&gt;
	else // Bytes in this line, read and deal with them&lt;br /&gt;
	{&lt;br /&gt;
		while( useByte != 0 )&lt;br /&gt;
		{&lt;br /&gt;
			if( ( useByte &amp;amp; 0x80000000 ) == 0x80000000 )&lt;br /&gt;
			{&lt;br /&gt;
				// This byte exists...&lt;br /&gt;
				data = inB[ offset++ ];&lt;br /&gt;
&lt;br /&gt;
				for( i = 0; i &amp;lt; 8; i ++ )&lt;br /&gt;
				{&lt;br /&gt;
					if( ( data &amp;amp; 0x01 ) == 0x01 )&lt;br /&gt;
						outB[ x ] = invflag == 0 ? pen : paper;&lt;br /&gt;
					else&lt;br /&gt;
						outB[ x ] = invflag == 0 ? paper : pen;&lt;br /&gt;
&lt;br /&gt;
					x ++;&lt;br /&gt;
&lt;br /&gt;
					data &amp;gt;&amp;gt;= 1;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				memset( &amp;amp;outB[ x ], paper, 8 );&lt;br /&gt;
				x += 8;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			useByte &amp;lt;&amp;lt;= 1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( x &amp;lt; 256 )&lt;br /&gt;
			memset( &amp;amp;outB[ x ], paper, 256 - x );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return offset;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void displayFrame( u8 *frmBuf, u16 frmNum )&lt;br /&gt;
{&lt;br /&gt;
	u8 colPaper, colLayer1, colLayer2;&lt;br /&gt;
	u32 frmOffset;&lt;br /&gt;
	u8 lEnc[192];&lt;br /&gt;
	u8 *buf;&lt;br /&gt;
	u8 lnePos, lneCount;&lt;br /&gt;
	u8 *outFrameG;&lt;br /&gt;
	u16 x, y;&lt;br /&gt;
	u32 byteUse;&lt;br /&gt;
&lt;br /&gt;
	buf = (u8*) malloc( 256 * 192 );&lt;br /&gt;
	if( buf == NULL )&lt;br /&gt;
	{&lt;br /&gt;
		printf( &amp;quot;Error unable to allocate buffer for frame %d\n&amp;quot;, frmBuf );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	frmOffset = getFrameOffset( frmBuf, 1 );&lt;br /&gt;
&lt;br /&gt;
	printf( &amp;quot;Frame #%d offset %08X\n&amp;quot;, frmNum, frmOffset );&lt;br /&gt;
&lt;br /&gt;
	colPaper  = frmBuf[ frmOffset ] &amp;amp; 0x01;&lt;br /&gt;
	colLayer1 = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 1 ) &amp;amp; 0x03;&lt;br /&gt;
	colLayer2 = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 3 ) &amp;amp; 0x03;&lt;br /&gt;
&lt;br /&gt;
	printf( &amp;quot;Paper colour:   %s\n&amp;quot;, ( colPaper == 0 ? &amp;quot;Black&amp;quot; : &amp;quot;White&amp;quot; ) );&lt;br /&gt;
	printf( &amp;quot;Layer 1 colour: %d\n&amp;quot;, colLayer1 );&lt;br /&gt;
	printf( &amp;quot;Layer 2 colour: %d\n&amp;quot;, colLayer2 );&lt;br /&gt;
&lt;br /&gt;
	if( colPaper == 0 )&lt;br /&gt;
		outFrameG = outFrameG0;&lt;br /&gt;
	else&lt;br /&gt;
		outFrameG = outFrameG1;&lt;br /&gt;
&lt;br /&gt;
	memset( buf, outFrameG[0], 192 &amp;lt;&amp;lt; 8 );&lt;br /&gt;
&lt;br /&gt;
	lnePos = 0;&lt;br /&gt;
	frmOffset ++;&lt;br /&gt;
&lt;br /&gt;
	// Read layer 1 line information into lower nibble&lt;br /&gt;
	for( lneCount = 0; lneCount &amp;lt; 48; lneCount ++ )&lt;br /&gt;
	{&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 0 ) &amp;amp; 0x03;&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 2 ) &amp;amp; 0x03;&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 4 ) &amp;amp; 0x03;&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 6 ) &amp;amp; 0x03;&lt;br /&gt;
		frmOffset ++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	lnePos = 0;&lt;br /&gt;
	// Read layer 2 line information into upper nibble&lt;br /&gt;
	for( lneCount = 0; lneCount &amp;lt; 48; lneCount ++ )&lt;br /&gt;
	{&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;lt;&amp;lt; 4 ) &amp;amp; 0x30;&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;lt;&amp;lt; 2 ) &amp;amp; 0x30;&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 0 ) &amp;amp; 0x30;&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 2 ) &amp;amp; 0x30;&lt;br /&gt;
		frmOffset ++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//read frame here...&lt;br /&gt;
	// First read layer 1.&lt;br /&gt;
	lnePos = 0;&lt;br /&gt;
&lt;br /&gt;
	while( lnePos &amp;lt; 192 )&lt;br /&gt;
	{&lt;br /&gt;
		switch( lEnc[ lnePos ] &amp;amp; 0x03 )&lt;br /&gt;
		{&lt;br /&gt;
			case 0: // Skip this line&lt;br /&gt;
				byteUse = 0;&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Skip Frame [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				break;&lt;br /&gt;
			case 1: // Coded&lt;br /&gt;
				byteUse = getu32inv( &amp;amp;frmBuf[ frmOffset ] );&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Coded      [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				frmOffset += 4;&lt;br /&gt;
				frmOffset += decodeLine( &amp;amp;buf[ lnePos &amp;lt;&amp;lt; 8 ], &amp;amp;frmBuf[ frmOffset ], byteUse, outFrameG[ 0 ], outFrameG[ colLayer1 ], 0 );&lt;br /&gt;
				break;&lt;br /&gt;
			case 2: // Inv Coded&lt;br /&gt;
				byteUse = getu32inv( &amp;amp;frmBuf[ frmOffset ] );&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Inv Coded  [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				frmOffset += 4;&lt;br /&gt;
				frmOffset += decodeLine( &amp;amp;buf[ lnePos &amp;lt;&amp;lt; 8 ], &amp;amp;frmBuf[ frmOffset ], byteUse, outFrameG[ colLayer1 ], outFrameG[ 0 ], 1 );&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // Full Line&lt;br /&gt;
				byteUse = 0xFFFFFFFF;&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Full Frame [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				frmOffset += decodeLine( &amp;amp;buf[ lnePos &amp;lt;&amp;lt; 8 ], &amp;amp;frmBuf[ frmOffset ], byteUse, outFrameG[ 0 ], outFrameG[ colLayer1 ], 0 );&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		lnePos ++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//output frame here...&lt;br /&gt;
	for( y = 0; y &amp;lt; 192; y ++ )&lt;br /&gt;
	{&lt;br /&gt;
		for( x = 0; x &amp;lt; 256; x ++ )&lt;br /&gt;
		{&lt;br /&gt;
			printf( &amp;quot;%c&amp;quot;, buf[ x + ( y &amp;lt;&amp;lt; 8 ) ] );&lt;br /&gt;
		}&lt;br /&gt;
		printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void hexOut( char *buf, int len )&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    for( i = 0 ; i &amp;lt; len ; i ++ )&lt;br /&gt;
    {&lt;br /&gt;
        printf( &amp;quot;%02X &amp;quot;, buf[i] &amp;amp; 0xFF );&lt;br /&gt;
        &lt;br /&gt;
        if( ( i &amp;amp; 0xF ) == 0xF )&lt;br /&gt;
            printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
  ppmHeader *pHead;&lt;br /&gt;
  FILE *fp;&lt;br /&gt;
  int f_len;&lt;br /&gt;
  char *f_buf;&lt;br /&gt;
  &lt;br /&gt;
  if(argc != 2)&lt;br /&gt;
  {&lt;br /&gt;
    printf(&amp;quot;usage: %s &amp;lt;anim.ppm&amp;gt;\n&amp;quot;, argv[0]);&lt;br /&gt;
    exit(0);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  fp = fopen(argv[1],&amp;quot;rb&amp;quot;);&lt;br /&gt;
  if(fp == NULL)&lt;br /&gt;
  {&lt;br /&gt;
    printf(&amp;quot;input file not found\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  f_len = flength(fp);&lt;br /&gt;
  f_buf = malloc(f_len);&lt;br /&gt;
  if(f_buf == NULL)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr, &amp;quot;not enough memory\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if(fread(f_buf, f_len, 1, fp) != 1)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr, &amp;quot;file read failure\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  pHead = (ppmHeader *) f_buf;&lt;br /&gt;
&lt;br /&gt;
  printHeaderInfo( pHead );&lt;br /&gt;
  &lt;br /&gt;
  displayPreviewImage( pHead-&amp;gt;previewBitmap );&lt;br /&gt;
  &lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
  displayFrame( &amp;amp;f_buf[ 0x6a0 ], 1 );&lt;br /&gt;
&lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
  hexOut( &amp;amp;f_buf[ 0x6a0 ], 256 );&lt;br /&gt;
  &lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
  hexOut( &amp;amp;f_buf[ f_len - 256 ], 256 );&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;finished..\n&amp;quot;);&lt;br /&gt;
  free( f_buf);&lt;br /&gt;
  fclose(fp);&lt;br /&gt;
 &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=User:Steven/flip_frame_decode.c&amp;diff=2064</id>
		<title>User:Steven/flip frame decode.c</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User:Steven/flip_frame_decode.c&amp;diff=2064"/>
		<updated>2009-08-21T09:51:57Z</updated>

		<summary type="html">&lt;p&gt;Steven: New page: Please note that there is very little comments and this application just outputs to the text console at the moment, but the code used here can be expanded to produce any other image file f...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please note that there is very little comments and this application just outputs to the text console at the moment, but the code used here can be expanded to produce any other image file formats you wanted.  I&#039;m still working on the sound format and as such there is no functions for the sound yet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;memory.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Disable MS VC&#039;s &amp;quot;unsecure / depricated&amp;quot; code warning&lt;br /&gt;
#pragma warning( disable : 4996 )&lt;br /&gt;
&lt;br /&gt;
// setup some file types for set sizes&lt;br /&gt;
typedef signed char		s8;&lt;br /&gt;
typedef signed short	s16;&lt;br /&gt;
typedef signed long		s32;&lt;br /&gt;
typedef unsigned char	u8;&lt;br /&gt;
typedef unsigned short	u16;&lt;br /&gt;
typedef unsigned long	u32;&lt;br /&gt;
&lt;br /&gt;
typedef struct PPM_HEADER&lt;br /&gt;
{&lt;br /&gt;
    u8  magic[4];&lt;br /&gt;
    u32 fileSize;&lt;br /&gt;
    u32 audioOffset;&lt;br /&gt;
    u16 numberOfFrames;&lt;br /&gt;
    u16 unk0;&lt;br /&gt;
    u16 flags;&lt;br /&gt;
    u16 previewFrameNumber;&lt;br /&gt;
    u16 originalAuthorName[11];&lt;br /&gt;
    u16 authorName[11];&lt;br /&gt;
    u16 userName[11];&lt;br /&gt;
    u8  originalAuthorID[8];&lt;br /&gt;
    u8  editAuthorID[8];&lt;br /&gt;
    u8  originalFileName[18];&lt;br /&gt;
    u8  fileName[18];&lt;br /&gt;
    u8  authorID[8];&lt;br /&gt;
    u8  unk1[8];&lt;br /&gt;
    u8  unk2[6];&lt;br /&gt;
    u8  previewBitmap[1536];&lt;br /&gt;
} ppmHeader;&lt;br /&gt;
&lt;br /&gt;
int flength(FILE *f)&lt;br /&gt;
{&lt;br /&gt;
  int pos,end;&lt;br /&gt;
  pos = ftell (f);&lt;br /&gt;
  fseek (f, 0, SEEK_END);&lt;br /&gt;
  end = ftell (f);&lt;br /&gt;
  fseek (f, pos, SEEK_SET);&lt;br /&gt;
  return end;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *idFromStr( u8 is[8] )&lt;br /&gt;
{&lt;br /&gt;
    static char retVal[32];&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    memset( retVal, 0, 32 );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 7; i &amp;gt;= 0; i -- )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%02X&amp;quot;, retVal, ( is[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
    &lt;br /&gt;
    return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *filenameFromStr( u8 fn[18] )&lt;br /&gt;
{&lt;br /&gt;
    static char retVal[64];&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    memset( retVal, 0, 32 );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 0; i &amp;lt; 3; i ++ )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%02X&amp;quot;, retVal, ( fn[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
         &lt;br /&gt;
    strcat( retVal, &amp;quot;_&amp;quot; );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 3; i &amp;lt; 16; i ++ )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%c&amp;quot;, retVal, ( fn[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
    &lt;br /&gt;
    sprintf( retVal, &amp;quot;%s_%03d&amp;quot;, retVal, ( fn[ 16 ] &amp;amp; 0xFF ) + ( ( fn[ 17 ] &amp;amp; 0xFF ) &amp;lt;&amp;lt; 8 ) );&lt;br /&gt;
    &lt;br /&gt;
    return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *hexFromStr( u8 is[8], int len )&lt;br /&gt;
{&lt;br /&gt;
    static char retVal[256];&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    memset( retVal, 0, 256 );&lt;br /&gt;
    &lt;br /&gt;
    for( i = 0; i &amp;lt; len; i ++ )&lt;br /&gt;
         sprintf( retVal, &amp;quot;%s%02X &amp;quot;, retVal, ( is[ i ] &amp;amp; 0xFF ) );&lt;br /&gt;
    &lt;br /&gt;
    return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void printHeaderInfo( ppmHeader *ptr )&lt;br /&gt;
{&lt;br /&gt;
    printf( &amp;quot;Magic Number    : %c%c%c%c\n&amp;quot;, ptr-&amp;gt;magic[0], ptr-&amp;gt;magic[1], ptr-&amp;gt;magic[2], ptr-&amp;gt;magic[3] );&lt;br /&gt;
    printf( &amp;quot;File Size       : %d (%08X)\n&amp;quot;, ptr-&amp;gt;fileSize, ptr-&amp;gt;fileSize );&lt;br /&gt;
    printf( &amp;quot;Audio offset    : %d (%08X)\n&amp;quot;, ptr-&amp;gt;audioOffset, ptr-&amp;gt;audioOffset );&lt;br /&gt;
    printf( &amp;quot;# Frames        : %d\n&amp;quot;, ptr-&amp;gt;numberOfFrames );&lt;br /&gt;
    printf( &amp;quot;Unknown         : 0x%04X\n&amp;quot;, ptr-&amp;gt;unk0 );&lt;br /&gt;
    printf( &amp;quot;Flags?          : 0x%04X - 0 = open, 1 = locked\n&amp;quot;, ptr-&amp;gt;flags );&lt;br /&gt;
    printf( &amp;quot;Preview Frame # : %d\n&amp;quot;, ptr-&amp;gt;previewFrameNumber );&lt;br /&gt;
    printf( &amp;quot;Orig Author     : UCS-2 string \n&amp;quot; );&lt;br /&gt;
    printf( &amp;quot;Author          : UCS-2 string \n&amp;quot; );&lt;br /&gt;
    printf( &amp;quot;Edit Author     : UCS-2 string \n&amp;quot; );&lt;br /&gt;
    printf( &amp;quot;Orig Author ID  : %s\n&amp;quot;, idFromStr( ptr-&amp;gt;originalAuthorID ) );&lt;br /&gt;
    printf( &amp;quot;Edit Author ID  : %s\n&amp;quot;, idFromStr( ptr-&amp;gt;editAuthorID ) );&lt;br /&gt;
    printf( &amp;quot;Orig Filename   : %s\n&amp;quot;, filenameFromStr( ptr-&amp;gt;originalFileName ) );&lt;br /&gt;
    printf( &amp;quot;Curr Filename   : %s\n&amp;quot;, filenameFromStr( ptr-&amp;gt;fileName ) );&lt;br /&gt;
    printf( &amp;quot;Author ID       : %s\n&amp;quot;, idFromStr( ptr-&amp;gt;authorID ) );&lt;br /&gt;
    printf( &amp;quot;Unknown 8 bytes : %s\n&amp;quot;, hexFromStr( ptr-&amp;gt;unk1, 8 ) ) ;&lt;br /&gt;
    printf( &amp;quot;Unknown 6 bytes : %s\n&amp;quot;, hexFromStr( ptr-&amp;gt;unk2, 6 ) ) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static char outPreviewG[] = { &#039; &#039;, 176, 219, 178, &#039;r&#039;, &#039;R&#039;, &#039;p&#039;, &#039;X&#039;, &#039;B&#039;, &#039;P&#039;, &#039;b&#039;, &#039;x&#039;, &#039;M&#039;, &#039;.&#039;, &#039;.&#039;, &#039;.&#039; };&lt;br /&gt;
&lt;br /&gt;
static char outFrameG0[] = {  32, 219, 176, 178 };&lt;br /&gt;
static char outFrameG1[] = { 219,  32, 176, 178 };&lt;br /&gt;
&lt;br /&gt;
void displayPreviewImage( u8 img[1536] )&lt;br /&gt;
{&lt;br /&gt;
    int x, y, cellOffset;&lt;br /&gt;
    int xp, xc;&lt;br /&gt;
    u8 c;&lt;br /&gt;
    &lt;br /&gt;
    for( y = 0; y &amp;lt; 48; y ++ )&lt;br /&gt;
    {&lt;br /&gt;
        cellOffset = ( ( y &amp;gt;&amp;gt; 3 ) * 256 ) + ( ( y &amp;amp; 0x7 ) &amp;lt;&amp;lt; 2 );&lt;br /&gt;
        for( x = 0; x &amp;lt; 64; x ++ )&lt;br /&gt;
        {&lt;br /&gt;
            xp = ( x &amp;amp; 7 ) &amp;gt;&amp;gt; 1;&lt;br /&gt;
            xc = ( ( x &amp;gt;&amp;gt; 3 ) &amp;lt;&amp;lt; 5 );&lt;br /&gt;
            c = img[ cellOffset + xp + xc ];&lt;br /&gt;
            printf( &amp;quot;%c&amp;quot;, outPreviewG[ ( x &amp;amp; 1 ? c  &amp;gt;&amp;gt; 4 : c ) &amp;amp; 0xF ] );&lt;br /&gt;
        }&lt;br /&gt;
        printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 getu32( u8 *buf )&lt;br /&gt;
{&lt;br /&gt;
	u32 retVal = 0;&lt;br /&gt;
&lt;br /&gt;
	retVal = retVal | ( buf[ 0 ] &amp;lt;&amp;lt;  0 );&lt;br /&gt;
	retVal = retVal | ( buf[ 1 ] &amp;lt;&amp;lt;  8 );&lt;br /&gt;
	retVal = retVal | ( buf[ 2 ] &amp;lt;&amp;lt; 16 );&lt;br /&gt;
	retVal = retVal | ( buf[ 3 ] &amp;lt;&amp;lt; 24 );&lt;br /&gt;
&lt;br /&gt;
	return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 getu32inv( u8 *buf )&lt;br /&gt;
{&lt;br /&gt;
	u32 retVal = 0;&lt;br /&gt;
&lt;br /&gt;
	retVal = retVal | ( buf[ 3 ] &amp;lt;&amp;lt;  0 );&lt;br /&gt;
	retVal = retVal | ( buf[ 2 ] &amp;lt;&amp;lt;  8 );&lt;br /&gt;
	retVal = retVal | ( buf[ 1 ] &amp;lt;&amp;lt; 16 );&lt;br /&gt;
	retVal = retVal | ( buf[ 0 ] &amp;lt;&amp;lt; 24 );&lt;br /&gt;
&lt;br /&gt;
	return retVal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 getFrameOffset( u8 *buf, u16 frm )&lt;br /&gt;
{&lt;br /&gt;
	u32 numBytes;&lt;br /&gt;
&lt;br /&gt;
	numBytes = getu32( buf );&lt;br /&gt;
&lt;br /&gt;
	if( frm &amp;gt; ( numBytes &amp;gt;&amp;gt; 2 ) )&lt;br /&gt;
		return 0;&lt;br /&gt;
	&lt;br /&gt;
	return ( getu32( &amp;amp;buf[ 4 + ( frm &amp;lt;&amp;lt; 2 ) ] ) + 8 + numBytes );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u32 decodeLine( u8 *outB, u8 *inB, u32 useByte, u8 paper, u8 pen, u8 invflag )&lt;br /&gt;
{&lt;br /&gt;
	u32 offset = 0;&lt;br /&gt;
	u16 x = 0, i;&lt;br /&gt;
	u8 data;&lt;br /&gt;
&lt;br /&gt;
	if( useByte == 0 ) // Set the full line to the current paper colour&lt;br /&gt;
		memset( outB, paper, 256 );&lt;br /&gt;
	else // Bytes in this line, read and deal with them&lt;br /&gt;
	{&lt;br /&gt;
		while( useByte != 0 )&lt;br /&gt;
		{&lt;br /&gt;
			if( ( useByte &amp;amp; 0x80000000 ) == 0x80000000 )&lt;br /&gt;
			{&lt;br /&gt;
				// This byte exists...&lt;br /&gt;
				data = inB[ offset++ ];&lt;br /&gt;
&lt;br /&gt;
				for( i = 0; i &amp;lt; 8; i ++ )&lt;br /&gt;
				{&lt;br /&gt;
					if( ( data &amp;amp; 0x01 ) == 0x01 )&lt;br /&gt;
						outB[ x ] = invflag == 0 ? pen : paper;&lt;br /&gt;
					else&lt;br /&gt;
						outB[ x ] = invflag == 0 ? paper : pen;&lt;br /&gt;
&lt;br /&gt;
					x ++;&lt;br /&gt;
&lt;br /&gt;
					data &amp;gt;&amp;gt;= 1;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				memset( &amp;amp;outB[ x ], paper, 8 );&lt;br /&gt;
				x += 8;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			useByte &amp;lt;&amp;lt;= 1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( x &amp;lt; 256 )&lt;br /&gt;
			memset( &amp;amp;outB[ x ], paper, 256 - x );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return offset;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void displayFrame( u8 *frmBuf, u16 frmNum )&lt;br /&gt;
{&lt;br /&gt;
	u8 colPaper, colLayer1, colLayer2;&lt;br /&gt;
	u32 frmOffset;&lt;br /&gt;
	u8 lEnc[192];&lt;br /&gt;
	u8 *buf;&lt;br /&gt;
	u8 lnePos, lneCount;&lt;br /&gt;
	u8 *outFrameG;&lt;br /&gt;
	u16 x, y;&lt;br /&gt;
	u32 byteUse;&lt;br /&gt;
&lt;br /&gt;
	buf = (u8*) malloc( 256 * 192 );&lt;br /&gt;
	if( buf == NULL )&lt;br /&gt;
	{&lt;br /&gt;
		printf( &amp;quot;Error unable to allocate buffer for frame %d\n&amp;quot;, frmBuf );&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	frmOffset = getFrameOffset( frmBuf, 1 );&lt;br /&gt;
&lt;br /&gt;
	printf( &amp;quot;Frame #%d offset %08X\n&amp;quot;, frmNum, frmOffset );&lt;br /&gt;
&lt;br /&gt;
	colPaper  = frmBuf[ frmOffset ] &amp;amp; 0x01;&lt;br /&gt;
	colLayer1 = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 1 ) &amp;amp; 0x03;&lt;br /&gt;
	colLayer2 = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 3 ) &amp;amp; 0x03;&lt;br /&gt;
&lt;br /&gt;
	printf( &amp;quot;Paper colour:   %s\n&amp;quot;, ( colPaper == 0 ? &amp;quot;Black&amp;quot; : &amp;quot;White&amp;quot; ) );&lt;br /&gt;
	printf( &amp;quot;Layer 1 colour: %d\n&amp;quot;, colLayer1 );&lt;br /&gt;
	printf( &amp;quot;Layer 2 colour: %d\n&amp;quot;, colLayer2 );&lt;br /&gt;
&lt;br /&gt;
	if( colPaper == 0 )&lt;br /&gt;
		outFrameG = outFrameG0;&lt;br /&gt;
	else&lt;br /&gt;
		outFrameG = outFrameG1;&lt;br /&gt;
&lt;br /&gt;
	memset( buf, outFrameG[0], 192 &amp;lt;&amp;lt; 8 );&lt;br /&gt;
&lt;br /&gt;
	lnePos = 0;&lt;br /&gt;
	frmOffset ++;&lt;br /&gt;
&lt;br /&gt;
	// Read layer 1 line information into lower nibble&lt;br /&gt;
	for( lneCount = 0; lneCount &amp;lt; 48; lneCount ++ )&lt;br /&gt;
	{&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 0 ) &amp;amp; 0x03;&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 2 ) &amp;amp; 0x03;&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 4 ) &amp;amp; 0x03;&lt;br /&gt;
		lEnc[ lnePos++ ] = ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 6 ) &amp;amp; 0x03;&lt;br /&gt;
		frmOffset ++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	lnePos = 0;&lt;br /&gt;
	// Read layer 2 line information into upper nibble&lt;br /&gt;
	for( lneCount = 0; lneCount &amp;lt; 48; lneCount ++ )&lt;br /&gt;
	{&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;lt;&amp;lt; 4 ) &amp;amp; 0x30;&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;lt;&amp;lt; 2 ) &amp;amp; 0x30;&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 0 ) &amp;amp; 0x30;&lt;br /&gt;
		lEnc[ lnePos++ ] |= ( frmBuf[ frmOffset ] &amp;gt;&amp;gt; 2 ) &amp;amp; 0x30;&lt;br /&gt;
		frmOffset ++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//read frame here...&lt;br /&gt;
	// First read layer 1.&lt;br /&gt;
	lnePos = 0;&lt;br /&gt;
&lt;br /&gt;
	while( lnePos &amp;lt; 192 )&lt;br /&gt;
	{&lt;br /&gt;
		switch( lEnc[ lnePos ] &amp;amp; 0x03 )&lt;br /&gt;
		{&lt;br /&gt;
			case 0: // Skip this line&lt;br /&gt;
				byteUse = 0;&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Skip Frame [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				break;&lt;br /&gt;
			case 1: // Coded&lt;br /&gt;
				byteUse = getu32inv( &amp;amp;frmBuf[ frmOffset ] );&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Coded      [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				frmOffset += 4;&lt;br /&gt;
				frmOffset += decodeLine( &amp;amp;buf[ lnePos &amp;lt;&amp;lt; 8 ], &amp;amp;frmBuf[ frmOffset ], byteUse, outFrameG[ 0 ], outFrameG[ colLayer1 ], 0 );&lt;br /&gt;
				break;&lt;br /&gt;
			case 2: // Inv Coded&lt;br /&gt;
				byteUse = getu32inv( &amp;amp;frmBuf[ frmOffset ] );&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Inv Coded  [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				frmOffset += 4;&lt;br /&gt;
				frmOffset += decodeLine( &amp;amp;buf[ lnePos &amp;lt;&amp;lt; 8 ], &amp;amp;frmBuf[ frmOffset ], byteUse, outFrameG[ colLayer1 ], outFrameG[ 0 ], 1 );&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // Full Line&lt;br /&gt;
				byteUse = 0xFFFFFFFF;&lt;br /&gt;
				printf( &amp;quot;Line %3d(%04X), Layer 1, Full Frame [%08X]\toffset %08X\n&amp;quot;, lnePos, lnePos, byteUse, frmOffset + 0x6a0 );&lt;br /&gt;
				frmOffset += decodeLine( &amp;amp;buf[ lnePos &amp;lt;&amp;lt; 8 ], &amp;amp;frmBuf[ frmOffset ], byteUse, outFrameG[ 0 ], outFrameG[ colLayer1 ], 0 );&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		lnePos ++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	//output frame here...&lt;br /&gt;
	for( y = 0; y &amp;lt; 192; y ++ )&lt;br /&gt;
	{&lt;br /&gt;
		for( x = 0; x &amp;lt; 256; x ++ )&lt;br /&gt;
		{&lt;br /&gt;
			printf( &amp;quot;%c&amp;quot;, buf[ x + ( y &amp;lt;&amp;lt; 8 ) ] );&lt;br /&gt;
		}&lt;br /&gt;
		printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void hexOut( char *buf, int len )&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    &lt;br /&gt;
    for( i = 0 ; i &amp;lt; len ; i ++ )&lt;br /&gt;
    {&lt;br /&gt;
        printf( &amp;quot;%02X &amp;quot;, buf[i] &amp;amp; 0xFF );&lt;br /&gt;
        &lt;br /&gt;
        if( ( i &amp;amp; 0xF ) == 0xF )&lt;br /&gt;
            printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
  ppmHeader *pHead;&lt;br /&gt;
  FILE *fp;&lt;br /&gt;
  int f_len;&lt;br /&gt;
  char *f_buf;&lt;br /&gt;
  &lt;br /&gt;
  if(argc != 2)&lt;br /&gt;
  {&lt;br /&gt;
    printf(&amp;quot;usage: %s &amp;lt;anim.ppm&amp;gt;\n&amp;quot;, argv[0]);&lt;br /&gt;
    exit(0);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  fp = fopen(argv[1],&amp;quot;rb&amp;quot;);&lt;br /&gt;
  if(fp == NULL)&lt;br /&gt;
  {&lt;br /&gt;
    printf(&amp;quot;input file not found\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  f_len = flength(fp);&lt;br /&gt;
  f_buf = malloc(f_len);&lt;br /&gt;
  if(f_buf == NULL)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr, &amp;quot;not enough memory\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if(fread(f_buf, f_len, 1, fp) != 1)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr, &amp;quot;file read failure\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  pHead = (ppmHeader *) f_buf;&lt;br /&gt;
&lt;br /&gt;
  printHeaderInfo( pHead );&lt;br /&gt;
  &lt;br /&gt;
  displayPreviewImage( pHead-&amp;gt;previewBitmap );&lt;br /&gt;
  &lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
  displayFrame( &amp;amp;f_buf[ 0x6a0 ], 1 );&lt;br /&gt;
&lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
  hexOut( &amp;amp;f_buf[ 0x6a0 ], 256 );&lt;br /&gt;
  &lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
  &lt;br /&gt;
  hexOut( &amp;amp;f_buf[ f_len - 256 ], 256 );&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;finished..\n&amp;quot;);&lt;br /&gt;
  free( f_buf);&lt;br /&gt;
  fclose(fp);&lt;br /&gt;
 &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=User:Steven&amp;diff=2063</id>
		<title>User:Steven</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User:Steven&amp;diff=2063"/>
		<updated>2009-08-21T09:49:21Z</updated>

		<summary type="html">&lt;p&gt;Steven: New page: Flipnote Frame Decoder application This is the code I&amp;#039;m using to look at the file format.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[\flip_frame_decode.c|Flipnote Frame Decoder application]] This is the code I&#039;m using to look at the file format.&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Nintendo_Software&amp;diff=2062</id>
		<title>Nintendo Software</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Nintendo_Software&amp;diff=2062"/>
		<updated>2009-08-21T09:39:46Z</updated>

		<summary type="html">&lt;p&gt;Steven: Removed link to possible pirate software site - I looked and smelt rotten fish while looking there...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article links to information about all Nintendo created software.&lt;br /&gt;
&lt;br /&gt;
== System ==&lt;br /&gt;
&lt;br /&gt;
*[[System Menu]] (DSi Menu)&lt;br /&gt;
&lt;br /&gt;
== DSi applications ==&lt;br /&gt;
&lt;br /&gt;
*[[Nintendo DSi Browser]]&lt;br /&gt;
*[[Nintendo DSi Calculator]]&lt;br /&gt;
*[[Nintendo DSi Camera]]&lt;br /&gt;
*[[Nintendo DSi Clock]]&lt;br /&gt;
*[[Nintendo DSi Shop]]&lt;br /&gt;
*[[Nintendo DSi Sound]]&lt;br /&gt;
*[[DS Download Play]]&lt;br /&gt;
*[[Pictochat]]&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2059</id>
		<title>Flipnote Files/PPM</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2059"/>
		<updated>2009-08-21T09:03:57Z</updated>

		<summary type="html">&lt;p&gt;Steven: Flipnote Files\PPM moved to Flipnote Files/PPM: Re-arranging the Flipnote files, and miss linked&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Size of animation data&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| size of audio data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown - all files looked at so far has this field set to 24 00 hex.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 2&lt;br /&gt;
| Is locked? - 0 open, 1 locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Last Edited By Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Edit Author ID - the last user to save the file&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Previous Editing Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| Partial File name? - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).&lt;br /&gt;
|-&lt;br /&gt;
|0x06A0&lt;br /&gt;
| 8 + ( 4 * Number of frames)&lt;br /&gt;
| Animation Sequence Header&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
The 3 sections of the file name seem to be stored as:&lt;br /&gt;
*Last 6 digits of your Flipnote Studio ID&lt;br /&gt;
*A random number, possibly generated from a date stamp&lt;br /&gt;
*The version number of the file&lt;br /&gt;
&lt;br /&gt;
===Palette===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
! DS RGB Approximation&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| Not used / White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark Grey&lt;br /&gt;
| 10, 10, 10&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light Grey&lt;br /&gt;
| 20, 20, 20&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Pure Red&lt;br /&gt;
| 31, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark Red&lt;br /&gt;
| 15, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Light Red / Pink&lt;br /&gt;
| 31, 15, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure Blue&lt;br /&gt;
| 0, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Dark Blue&lt;br /&gt;
| 0, 0, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light Blue&lt;br /&gt;
| 15, 15, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta / Purple&lt;br /&gt;
| 31, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The preview image is a 64x48 image stored in a 16 colour tile format, with each 8x8 tile taking up 32 bytes of the file.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a photo taken of the altered preview image, reduced to about the correct size.&lt;br /&gt;
&lt;br /&gt;
[[Image:Palpic_actsize.png|{{Image:Palpic_actsize.png}}]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Palpic_big.JPG|Link to the original picture, warning image is 2,048 × 1,536.]]&lt;br /&gt;
&lt;br /&gt;
Here&#039;s two preview images that blasty decoded from some PPM files.&lt;br /&gt;
&lt;br /&gt;
[[Image:ppm_1.png]] [[Image:ppm_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Data Section==&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=2058</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=2058"/>
		<updated>2009-08-21T09:03:08Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flipnote Studio uses 3 different file extensions:&lt;br /&gt;
*[[Flipnote Files/PPM|.PPM]] - these are the animation files themselves&lt;br /&gt;
*[[Flipnote Files/LST|.LST]] - This is a list of the files in the current directory&lt;br /&gt;
*[[Flipnote Files/PLS|.PLS]] - These are the sticker files, and the recently edited file.&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=2057</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=2057"/>
		<updated>2009-08-21T09:00:16Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flipnote Studio uses 3 different file extensions:&lt;br /&gt;
*[[Flipnote Files\PPM|.PPM]] - these are the animation files themselves&lt;br /&gt;
*[[Flipnote Files\LST|.LST]] - This is a list of the files in the current directory&lt;br /&gt;
*[[Flipnote Files\PLS|.PLS]] - These are the sticker files, and the recently edited file.&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2056</id>
		<title>Flipnote Files/PPM</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files/PPM&amp;diff=2056"/>
		<updated>2009-08-21T09:00:08Z</updated>

		<summary type="html">&lt;p&gt;Steven: New page: {| class=&amp;quot;wikitable&amp;quot; |- style=&amp;quot;background-color: #ddd;&amp;quot; ! Start ! Length ! Description |- | 0x0000 | 4 | Magic (should be PARA) |- | 0x0004 | 4 | Size of animation data |- | 0x0008 | 4 | s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Size of animation data&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| size of audio data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown - all files looked at so far has this field set to 24 00 hex.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 2&lt;br /&gt;
| Is locked? - 0 open, 1 locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Last Edited By Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Edit Author ID - the last user to save the file&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Previous Editing Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| Partial File name? - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).&lt;br /&gt;
|-&lt;br /&gt;
|0x06A0&lt;br /&gt;
| 8 + ( 4 * Number of frames)&lt;br /&gt;
| Animation Sequence Header&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
The 3 sections of the file name seem to be stored as:&lt;br /&gt;
*Last 6 digits of your Flipnote Studio ID&lt;br /&gt;
*A random number, possibly generated from a date stamp&lt;br /&gt;
*The version number of the file&lt;br /&gt;
&lt;br /&gt;
===Palette===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
! DS RGB Approximation&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| Not used / White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark Grey&lt;br /&gt;
| 10, 10, 10&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
| 31, 31, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light Grey&lt;br /&gt;
| 20, 20, 20&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Pure Red&lt;br /&gt;
| 31, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark Red&lt;br /&gt;
| 15, 0, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Light Red / Pink&lt;br /&gt;
| 31, 15, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure Blue&lt;br /&gt;
| 0, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Dark Blue&lt;br /&gt;
| 0, 0, 15&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light Blue&lt;br /&gt;
| 15, 15, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta / Purple&lt;br /&gt;
| 31, 0, 31&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure Green&lt;br /&gt;
| 0, 31, 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The preview image is a 64x48 image stored in a 16 colour tile format, with each 8x8 tile taking up 32 bytes of the file.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a photo taken of the altered preview image, reduced to about the correct size.&lt;br /&gt;
&lt;br /&gt;
[[Image:Palpic_actsize.png|{{Image:Palpic_actsize.png}}]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Palpic_big.JPG|Link to the original picture, warning image is 2,048 × 1,536.]]&lt;br /&gt;
&lt;br /&gt;
Here&#039;s two preview images that blasty decoded from some PPM files.&lt;br /&gt;
&lt;br /&gt;
[[Image:ppm_1.png]] [[Image:ppm_2.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Animation Data Section==&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=File:Palpic_big.JPG&amp;diff=2055</id>
		<title>File:Palpic big.JPG</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=File:Palpic_big.JPG&amp;diff=2055"/>
		<updated>2009-08-21T08:23:57Z</updated>

		<summary type="html">&lt;p&gt;Steven: Original picture of an altered ppm preview image on the DSi.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Original picture of an altered ppm preview image on the DSi.&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=File:Palpic_actsize.png&amp;diff=2054</id>
		<title>File:Palpic actsize.png</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=File:Palpic_actsize.png&amp;diff=2054"/>
		<updated>2009-08-21T07:53:18Z</updated>

		<summary type="html">&lt;p&gt;Steven: Picture of an altered ppm preview image on the DSi&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Picture of an altered ppm preview image on the DSi&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=File:Paperpeninfo.png&amp;diff=2053</id>
		<title>File:Paperpeninfo.png</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=File:Paperpeninfo.png&amp;diff=2053"/>
		<updated>2009-08-21T07:52:22Z</updated>

		<summary type="html">&lt;p&gt;Steven: Flipnote Studio PaperPenInfo byte diagram&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Flipnote Studio PaperPenInfo byte diagram&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1995</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1995"/>
		<updated>2009-08-16T14:15:33Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Size of animation-section&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| Offset audio-data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown - all files looked at so far has this field set to 24 00 hex.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 2&lt;br /&gt;
| Is locked? - 0 open, 1 locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Edit Author ID - the last user to save the file&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| Partial File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The preview image is a 64x48 image stored in a 16 colour tile way, with each 8x8 tile taking up 32 bytes of the file.&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1993</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1993"/>
		<updated>2009-08-16T10:46:34Z</updated>

		<summary type="html">&lt;p&gt;Steven: /* *.ppm FILES */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Size of animation-section&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| Offset audio-data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown - all files looked at so far has this field set to 24 00 hex.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 2&lt;br /&gt;
| Is locked? - 0 open, 1 locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Edit Author ID - the last user to save the file&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| Partial File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).  This is stored in cells each cell is 8 pixels by 4 pixels, each cell uses 16 bytes, and are stored in a top left going right then down format&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1992</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1992"/>
		<updated>2009-08-16T10:41:44Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Size of animation-section&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| Offset audio-data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 2&lt;br /&gt;
| Is locked? - 0 open, 1 locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Edit Author ID - the last user to save the file&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| Partial File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).  This is stored in cells each cell is 8 pixels by 4 pixels, each cell uses 16 bytes, and are stored in a top left going right then down format&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipbook_XOR_Pad&amp;diff=1977</id>
		<title>Flipbook XOR Pad</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipbook_XOR_Pad&amp;diff=1977"/>
		<updated>2009-08-15T20:14:50Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since the encryption used is AES-128-CTR, there&#039;s a static XOR pad (generated from the key) applied when encrypting/decrypting.&lt;br /&gt;
Here&#039;s the XOR pad used for the *.lst file (hexadecimal):&lt;br /&gt;
&lt;br /&gt;
  00: 00 00 00 00 00 00 A6 37 6E 11 38 CF A0 DD 85 C0&lt;br /&gt;
  10: C7 9B C4 D8 DD 28 8A 87 53 20 EE E0 0B 00 00 00&lt;br /&gt;
  20: 00 00 00 75 36 37 EB 35 6A 34 7F B5 0F 99 F7 EF&lt;br /&gt;
  30: 43 25 CE A0 29 46 D9 D4 4D BB 00 00 00 00 00 00&lt;br /&gt;
  40: F7 4C 6A 3A FB 82 A6 37 6E 11 38 CF A0 DD 85 C0&lt;br /&gt;
  50: C7 9B C4 D8 DD 28 8A 00 00 00 00 00 00 EB 43 A0&lt;br /&gt;
  60: DB 55 0F 75 36 37 EB 35 6A 34 7F B5 0F 99 F7 EF&lt;br /&gt;
  70: 43 25 CE A0 00 00 00&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=User:Remark/Flipbook_XOR_Pad&amp;diff=1973</id>
		<title>User:Remark/Flipbook XOR Pad</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User:Remark/Flipbook_XOR_Pad&amp;diff=1973"/>
		<updated>2009-08-15T20:06:53Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since the encryption used is AES-128-CTR, there&#039;s a static XOR pad (generated from the key) applied when encrypting/decrypting.&lt;br /&gt;
Here&#039;s the XOR pad used for the *.lst file (hexadecimal):&lt;br /&gt;
&lt;br /&gt;
  00: XX XX XX XX XX XX A6 37 6E 11 38 CF A0 DD 85 C0&lt;br /&gt;
  10: C7 9B C4 D8 DD 28 8A 87 53 20 EE E0 0B XX XX XX&lt;br /&gt;
  20: XX XX XX 75 36 37 EB 35 6A 34 7F B5 0F 99 F7 EF&lt;br /&gt;
  30: 43 25 CE A0 29 46 D9 D4 4D BB XX XX XX XX XX XX&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1961</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1961"/>
		<updated>2009-08-15T08:44:03Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| Size of animation-section&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| Offset audio-data&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0010&lt;br /&gt;
| 2&lt;br /&gt;
| Is locked? - 0 open, 1 locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).  This is stored in cells each cell is 8 pixels by 4 pixels, each cell uses 16 bytes, and are stored in a top left going right then down format&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1955</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1955"/>
		<updated>2009-08-14T23:16:21Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| File size without the header or the preview image&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown - Flags? normal files are 24 00 00 00, locked files have 24 00 01 00 in this area&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel).  This is stored in cells each cell is 8 pixels by 4 pixels, each cell uses 16 bytes, and are stored in a top left going right then down format&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1954</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1954"/>
		<updated>2009-08-14T20:55:11Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| File size without the header or the preview image&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown - Flags? normal files are 24 00 00 00, locked files have 24 00 01 00 in this area&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1953</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1953"/>
		<updated>2009-08-14T20:31:50Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 4&lt;br /&gt;
| File size without the header or the preview image&lt;br /&gt;
|-&lt;br /&gt;
| 0x0008&lt;br /&gt;
| 4&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1952</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1952"/>
		<updated>2009-08-14T19:48:32Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006&lt;br /&gt;
| 6&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| Preview frame number ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown - possibly date information&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1951</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1951"/>
		<updated>2009-08-14T19:08:33Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006&lt;br /&gt;
| 6&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 6&lt;br /&gt;
| Unknown&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1950</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1950"/>
		<updated>2009-08-14T19:07:45Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006&lt;br /&gt;
| 6&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 8&lt;br /&gt;
| Unknown&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
*Original file name 0x0066&lt;br /&gt;
*Current file name 0x0078&lt;br /&gt;
*Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
*3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
*13 bytes for the central part of the file name&lt;br /&gt;
*2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
*First location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
*Second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
*Last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1949</id>
		<title>Flipnote Files</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=Flipnote_Files&amp;diff=1949"/>
		<updated>2009-08-14T19:06:28Z</updated>

		<summary type="html">&lt;p&gt;Steven: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== *.ppm FILES ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Start&lt;br /&gt;
! Length&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000&lt;br /&gt;
| 4&lt;br /&gt;
| Magic (should be PARA)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0004&lt;br /&gt;
| 2&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0006&lt;br /&gt;
| 6&lt;br /&gt;
| Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| 0x000C&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames&lt;br /&gt;
|-&lt;br /&gt;
| 0x000E&lt;br /&gt;
| 4&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x0012&lt;br /&gt;
| 2&lt;br /&gt;
| # of frames ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x0014&lt;br /&gt;
| 22&lt;br /&gt;
| Original author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x002A&lt;br /&gt;
| 22&lt;br /&gt;
| Author name (UCS-2)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040&lt;br /&gt;
| 22&lt;br /&gt;
| User name (UCS-2)&lt;br /&gt;
|- &lt;br /&gt;
| 0x0056&lt;br /&gt;
| 8&lt;br /&gt;
| Original author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x005E&lt;br /&gt;
| 8&lt;br /&gt;
| Author ID&lt;br /&gt;
|- &lt;br /&gt;
| 0x0066&lt;br /&gt;
| 18&lt;br /&gt;
| Original File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x0078&lt;br /&gt;
| 18&lt;br /&gt;
| File-name - see notes on format&lt;br /&gt;
|- &lt;br /&gt;
| 0x008A&lt;br /&gt;
| 8&lt;br /&gt;
| Mirrored author ID ??&lt;br /&gt;
|- &lt;br /&gt;
| 0x0092&lt;br /&gt;
| 8&lt;br /&gt;
| File name? - see notes on format &lt;br /&gt;
|- &lt;br /&gt;
| 0x009A&lt;br /&gt;
| 8&lt;br /&gt;
| Unknown&lt;br /&gt;
|- &lt;br /&gt;
| 0x00A0&lt;br /&gt;
| 1536&lt;br /&gt;
| Preview Bitmap (4 bits/pixel)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file name seems to be stored in the file header 3 times:&lt;br /&gt;
&lt;br /&gt;
Original file name 0x0066&lt;br /&gt;
Current file name 0x0078&lt;br /&gt;
Partial file name 0x0092&lt;br /&gt;
&lt;br /&gt;
The file name is stored in 3 parts:&lt;br /&gt;
3 hex bytes, the first byte&#039;s high nibble is not the same as the first byte of the file name&lt;br /&gt;
13 bytes for the central part of the file name&lt;br /&gt;
2 bytes for the last part of the file name.&lt;br /&gt;
&lt;br /&gt;
For the file name : G35B20_0909841CDBEB1_002&lt;br /&gt;
This is stored in the first location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 00 00&lt;br /&gt;
This is stored in the second location: D3 5B 20 30 39 30 39 38 34 31 43 44 42 45 42 31 02 00&lt;br /&gt;
This is stored in the last location: D3 5B 20 09 09 84 1C DB&lt;br /&gt;
&lt;br /&gt;
=== Palette: ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color: #ddd;&amp;quot;&lt;br /&gt;
! Hex&lt;br /&gt;
! Color&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| Dark grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| White&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| Light grey&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| Light red&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| Dark red&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Pink&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Pure blue&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| Purple&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| Light blue&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| Magenta&lt;br /&gt;
|-&lt;br /&gt;
| 0xD&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| Pure green&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Pure green&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Steven</name></author>
	</entry>
</feed>