<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.gc-forever.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Apploader</id>
	<title>Apploader - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.gc-forever.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Apploader"/>
	<link rel="alternate" type="text/html" href="https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;action=history"/>
	<updated>2026-04-13T10:08:23Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=8155&amp;oldid=prev</id>
		<title>Lumina33: /* Gamecube apploader reverse engineering for CubeDocumented project */ apostrophe</title>
		<link rel="alternate" type="text/html" href="https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=8155&amp;oldid=prev"/>
		<updated>2024-08-01T18:12:21Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Gamecube apploader reverse engineering for CubeDocumented project: &lt;/span&gt; apostrophe&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:12, 1 August 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot;&gt;Line 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This reversing is not pretending to be compilable, and can be used for&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This reversing is not pretending to be compilable, and can be used for&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;education purposes only. I &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;dont &lt;/del&gt;hold any responsibility for damage of your&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;education purposes only. I &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;don&#039;t &lt;/ins&gt;hold any responsibility for damage of your&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Gamecube clock settings or memory card saves or else, produced from using&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Gamecube clock settings or memory card saves or else, produced from using&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;code/information represented in this document.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;code/information represented in this document.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lumina33</name></author>
	</entry>
	<entry>
		<id>https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=8076&amp;oldid=prev</id>
		<title>Lumina33: /* Overview */ linkify Datel</title>
		<link rel="alternate" type="text/html" href="https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=8076&amp;oldid=prev"/>
		<updated>2024-07-23T05:21:30Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Overview: &lt;/span&gt; linkify Datel&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 01:21, 23 July 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l12&quot;&gt;Line 12:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 12:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Complete Luigi&amp;#039;s &amp;#039;&amp;#039;&amp;#039;Apploader&amp;#039;&amp;#039;&amp;#039;. Reverse work by org &amp;lt;kvzorganic_at_mail_dot_ru&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Complete Luigi&amp;#039;s &amp;#039;&amp;#039;&amp;#039;Apploader&amp;#039;&amp;#039;&amp;#039;. Reverse work by org &amp;lt;kvzorganic_at_mail_dot_ru&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Other games seems to contain the same code with minor changes due to revision, so you may think, that apploader is the same for all games. Except Datel&#039;s FreeLoader and ActionReplay DVDs, which are using custom apploader binary (simplified Nintendo&#039;s apploader).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Other games seems to contain the same code with minor changes due to revision, so you may think, that apploader is the same for all games. Except &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[https://www.datel.co.uk/ &lt;/ins&gt;Datel&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/ins&gt;&#039;s FreeLoader and ActionReplay DVDs, which are using custom apploader binary (simplified Nintendo&#039;s apploader).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Apploader is a small program layer between GC bootrom and main application. Since main application&amp;#039;s executable binary format may vary, apploader is needed to boot executable in main memory, using bootrom&amp;#039;s low-level DVD read routines. In practice, all known game apploaders are using Nintendo&amp;#039;s DOL format for executable files.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Apploader is a small program layer between GC bootrom and main application. Since main application&amp;#039;s executable binary format may vary, apploader is needed to boot executable in main memory, using bootrom&amp;#039;s low-level DVD read routines. In practice, all known game apploaders are using Nintendo&amp;#039;s DOL format for executable files.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lumina33</name></author>
	</entry>
	<entry>
		<id>https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=8041&amp;oldid=prev</id>
		<title>Lumina33: /* ToDo */ bullet points</title>
		<link rel="alternate" type="text/html" href="https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=8041&amp;oldid=prev"/>
		<updated>2024-07-20T23:26:22Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;ToDo: &lt;/span&gt; bullet points&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:26, 20 July 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l659&quot;&gt;Line 659:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 659:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== ToDo ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== ToDo ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Need more BI2 details.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Need more BI2 details.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Get Zelda apploader and crosscheck it with current reversing. Maybe some interesting things will be discovered.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Get Zelda apploader and crosscheck it with current reversing. Maybe some interesting things will be discovered.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Count how many apploader revisions are present today.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Count how many apploader revisions are present today.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Source ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Source ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lumina33</name></author>
	</entry>
	<entry>
		<id>https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=8040&amp;oldid=prev</id>
		<title>Lumina33: /* Overview */ bolded title</title>
		<link rel="alternate" type="text/html" href="https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=8040&amp;oldid=prev"/>
		<updated>2024-07-20T23:25:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Overview: &lt;/span&gt; bolded title&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:25, 20 July 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l11&quot;&gt;Line 11:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 11:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Overview ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Overview ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Complete Luigi&#039;s Apploader. Reverse work by org &amp;lt;kvzorganic_at_mail_dot_ru&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Complete Luigi&#039;s &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&#039;&lt;/ins&gt;Apploader&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&#039;&lt;/ins&gt;. Reverse work by org &amp;lt;kvzorganic_at_mail_dot_ru&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Other games seems to contain the same code with minor changes due to revision, so you may think, that apploader is the same for all games. Except Datel&amp;#039;s FreeLoader and ActionReplay DVDs, which are using custom apploader binary (simplified Nintendo&amp;#039;s apploader).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Other games seems to contain the same code with minor changes due to revision, so you may think, that apploader is the same for all games. Except Datel&amp;#039;s FreeLoader and ActionReplay DVDs, which are using custom apploader binary (simplified Nintendo&amp;#039;s apploader).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lumina33</name></author>
	</entry>
	<entry>
		<id>https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=456&amp;oldid=prev</id>
		<title>Infact: created page, wikified the information</title>
		<link rel="alternate" type="text/html" href="https://www.gc-forever.com/wiki/index.php?title=Apploader&amp;diff=456&amp;oldid=prev"/>
		<updated>2012-01-24T20:28:56Z</updated>

		<summary type="html">&lt;p&gt;created page, wikified the information&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Gamecube apploader reverse engineering for CubeDocumented project ==&lt;br /&gt;
&lt;br /&gt;
This reversing is not pretending to be compilable, and can be used for&lt;br /&gt;
education purposes only. I dont hold any responsibility for damage of your&lt;br /&gt;
Gamecube clock settings or memory card saves or else, produced from using&lt;br /&gt;
code/information represented in this document.&lt;br /&gt;
&lt;br /&gt;
Documented by Andrei Chestakov (org). Version 1.1. (26 Apr 2005)&lt;br /&gt;
Additions and corrections by tmbinc.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Complete Luigi&amp;#039;s Apploader. Reverse work by org &amp;lt;kvzorganic_at_mail_dot_ru&amp;gt;&lt;br /&gt;
Other games seems to contain the same code with minor changes due to revision, so you may think, that apploader is the same for all games. Except Datel&amp;#039;s FreeLoader and ActionReplay DVDs, which are using custom apploader binary (simplified Nintendo&amp;#039;s apploader).&lt;br /&gt;
&lt;br /&gt;
Apploader is a small program layer between GC bootrom and main application. Since main application&amp;#039;s executable binary format may vary, apploader is needed to boot executable in main memory, using bootrom&amp;#039;s low-level DVD read routines. In practice, all known game apploaders are using Nintendo&amp;#039;s DOL format for executable files.&lt;br /&gt;
&lt;br /&gt;
Format of apploader binary is simple. First goes apploader header, and then actual apploader code.&lt;br /&gt;
&lt;br /&gt;
=== Apploader header ===&lt;br /&gt;
&lt;br /&gt;
 typedef struct&lt;br /&gt;
 {&lt;br /&gt;
    char    revision[16];       // Revision compile date (example &amp;quot;2001/12/17&amp;quot;)&lt;br /&gt;
    u32     entryPoint;         // Apploader&amp;#039;s entrypoint&lt;br /&gt;
    s32     size;               // Size of apploader code&lt;br /&gt;
    s32     trailerSize;        // Size of safe trailer&lt;br /&gt;
    u8      padding[4];         // zeroes&lt;br /&gt;
 } LDRImage;&lt;br /&gt;
&lt;br /&gt;
Full apploader size is sum of size and trailerSize, rounded up to 32 bytes.&lt;br /&gt;
Trailer is need for future apploader versions.&lt;br /&gt;
&lt;br /&gt;
Apploader is located at 0x2440 offset on DVD and loaded by bootrom at 0x81200000 address. Then bootrom jumps to apploader&amp;#039;s entrypoint:&lt;br /&gt;
&lt;br /&gt;
 void AplEntry(&lt;br /&gt;
    void    (**Init)(void (*OSReportCallback)(char *msg, ...)),&lt;br /&gt;
    BOOL    (**Main)(void **addr, s32 *length, s32 *offset),&lt;br /&gt;
    void*   (**Close)())&lt;br /&gt;
 {                                      &lt;br /&gt;
    // Return location of apploader&amp;#039;s Init, Main and Close routines.&lt;br /&gt;
    *Init  = AplInit;&lt;br /&gt;
    *Main  = AplMain;&lt;br /&gt;
    *Close = AplClose;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
After executing of entrypoint, bootrom will call in order: apploader&amp;#039;s Init, then Main, then Close. Main is called in loop, until it will not return 0.&lt;br /&gt;
&lt;br /&gt;
== PART I. Apploader Init ==&lt;br /&gt;
&lt;br /&gt;
Init call is clearing apploader&amp;#039;s internal data, and saving there callback of OSReport call (which is located inside IPL). OSReport is used to output some debug messages, during apploader runtime.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Apploader&amp;#039;s internal data: &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    // Some DVD transfers require multiple times to load.&lt;br /&gt;
    BOOL        SecondTimeForThePart;&lt;br /&gt;
    void*       SecondTimeAddr;&lt;br /&gt;
    s32         SecondTimeLength;&lt;br /&gt;
    s32         SecondTimeOffset;&lt;br /&gt;
    int         SecondTimePart;&lt;br /&gt;
 &lt;br /&gt;
    DVDBB2      bb2;        // DVD boot block&lt;br /&gt;
    DolImage    DolImage;   // main DOL executable header&lt;br /&gt;
 &lt;br /&gt;
    int         Section;    // DOL section&lt;br /&gt;
    int         Part;       // Apploader&amp;#039;s step&lt;br /&gt;
    u32         +0x148      // ?? only cleared in Init&lt;br /&gt;
 &lt;br /&gt;
    // OSReport routine itself is placed somewhere in IPL&lt;br /&gt;
    void        (*OSReport)(char *msg, ...);&lt;br /&gt;
 &lt;br /&gt;
 #pragma pack(32)&lt;br /&gt;
    // First 32 bytes of DVDBI2 will be loaded here. This is a bit hacky.&lt;br /&gt;
    // We dont use whole DVDBI2 (its too big), to save some memory.&lt;br /&gt;
    // 32 bytes - because its minimum DVD DMA transfer size (?)&lt;br /&gt;
    s32         debugMonSize;&lt;br /&gt;
    s32         simMemSize;&lt;br /&gt;
    u32         argOffset;&lt;br /&gt;
    u32         debugFlag;&lt;br /&gt;
    int         FSTHigh;    // 1, if FST is resided on DVD above DOL&lt;br /&gt;
    u8          dummy[12];  // ending bytes&lt;br /&gt;
 #pragma pack(0)&lt;br /&gt;
 &lt;br /&gt;
 void AplInit(void (*OSReportCallback)(char *msg, ...))&lt;br /&gt;
 {&lt;br /&gt;
    // Clear some structures&lt;br /&gt;
    memset(&amp;amp;bb2, 0, sizeof(DVDBB2));&lt;br /&gt;
    memset(&amp;amp;DolImage, 0, sizeof(DolImage));&lt;br /&gt;
 &lt;br /&gt;
    Section = 0;&lt;br /&gt;
    Part = 0;&lt;br /&gt;
    [+0x148] = 0;&lt;br /&gt;
 &lt;br /&gt;
    OSReport = OSReportCallback;    // Save report callback&lt;br /&gt;
 &lt;br /&gt;
    // Print apploader version info&lt;br /&gt;
    OSReport(&amp;quot;Apploader Initialized.  $ Revision: 28 $\n&amp;quot;);&lt;br /&gt;
    OSReport(&amp;quot;This Apploader built %s %s\n&amp;quot;, __DATE__, __TIME__);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== PART II. Apploader Main ==&lt;br /&gt;
&lt;br /&gt;
Main is called in loop by IPL, until all data not loaded. IPL is using Main output parameters, to load data from DVD. IPL keeps loading new data, until&lt;br /&gt;
Main will not return 0, signaling that all data loaded.&lt;br /&gt;
Just read through comments to understand code.&lt;br /&gt;
&lt;br /&gt;
 BOOL AplMain(void **addr, s32 *length, s32 *offset)&lt;br /&gt;
 {&lt;br /&gt;
    OSLoMem *LoMem = OSPhysicalToCached(0x0000);&lt;br /&gt;
 &lt;br /&gt;
    switch(Part)&lt;br /&gt;
    {&lt;br /&gt;
        // Load BB2 structure.&lt;br /&gt;
        case 0:&lt;br /&gt;
        case 1:&lt;br /&gt;
            *addr = &amp;amp;bb2;&lt;br /&gt;
            *length = sizeof(DVDBB2);&lt;br /&gt;
            *offset = DVD_BB2_OFFSET;&lt;br /&gt;
 &lt;br /&gt;
            Part = 2;&lt;br /&gt;
            DCInvalidateRange(*addr, *length);&lt;br /&gt;
            break;&lt;br /&gt;
 &lt;br /&gt;
        // Check FST length and load first 32 bytes of BI2 structure.&lt;br /&gt;
        case 2:&lt;br /&gt;
            u32 FSTLength = bb2.FSTLength;&lt;br /&gt;
            u32 FSTMaxLength = bb2.FSTMaxLength;&lt;br /&gt;
 &lt;br /&gt;
            if(FSTLength &amp;gt; FSTMaxLength)&lt;br /&gt;
            {&lt;br /&gt;
                OSReport(&lt;br /&gt;
                    &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; FSTLength(%d) in BB2 is greater &amp;quot;&lt;br /&gt;
                    &amp;quot;than FSTMaxLength(%d)\n&amp;quot;, FSTLength, FSTMaxLength );&lt;br /&gt;
                PPCHalt();&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            *addr   = &amp;amp;debugMonSize;&lt;br /&gt;
            *length = 32;&lt;br /&gt;
            *offset = DVD_BI2_OFFSET;&lt;br /&gt;
 &lt;br /&gt;
            Part = 3;&lt;br /&gt;
            DCInvalidateRange(*addr, *length);&lt;br /&gt;
            break;&lt;br /&gt;
 &lt;br /&gt;
        // Setup some OS lomem variables by BI2 values, and check memory configuration.&lt;br /&gt;
        // Copy DVD BI2 in main memory.&lt;br /&gt;
        case 3:&lt;br /&gt;
            __OSDebugMonSize = debugMonSize;&lt;br /&gt;
            __OSDebugMon = OSRoundDown32B(__OSPhysMemSize - __OSDebugMonSize);&lt;br /&gt;
            __OSSimMemSize   = simMemSize;&lt;br /&gt;
 &lt;br /&gt;
            // Check debug monitor size alignment&lt;br /&gt;
            if(__OSDebugMonSize &amp;amp; 31)&lt;br /&gt;
            {&lt;br /&gt;
                OSReport(&lt;br /&gt;
                    &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; Debug monitor size (%d) should &amp;quot;&lt;br /&gt;
                    &amp;quot;be a multiple of 32\n&amp;quot;, __OSDebugMonSize );&lt;br /&gt;
                PPCHalt();&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            // Check console simulated memory size alignment&lt;br /&gt;
            if(__OSSimMemSize &amp;amp; 31)&lt;br /&gt;
            {&lt;br /&gt;
                OSReport(&lt;br /&gt;
                    &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; simulated memory size (%d) &amp;quot;&lt;br /&gt;
                    &amp;quot;should be a multiple of 32\n&amp;quot;, __OSSimMemSize );&lt;br /&gt;
                PPCHalt();&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            if(__OSSimMemSize == 0)&lt;br /&gt;
            {&lt;br /&gt;
                __OSSimMemSize = __OSPhysMemSize;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            if(__OSSimMemSize &amp;lt; __OSPhysMemSize)&lt;br /&gt;
            {&lt;br /&gt;
                if(__OSDebugMonSize &amp;gt;= (__OSPhysMemSize - __OSSimMemSize))&lt;br /&gt;
                {&lt;br /&gt;
                    OSReport(&lt;br /&gt;
                        &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; [Physical memory size(0x%x)] &amp;quot;&lt;br /&gt;
                        &amp;quot;- [Console simulated memory size(0x%x)]\n&amp;quot;&lt;br /&gt;
                        &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; must be greater than debug &lt;br /&gt;
                        &amp;quot;monitor size(0x%x)\n&amp;quot;, &lt;br /&gt;
                        __OSPhysMemSize, __OSSimMemSize, __OSDebugMonSize );&lt;br /&gt;
                    PPCHalt();&lt;br /&gt;
                }&lt;br /&gt;
 &lt;br /&gt;
                // Move down FST address&lt;br /&gt;
                bb2.FSTAddress = OSRoundDown32B(__OSSimMemSize - bb2.FSTMaxSize);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(__OSSimMemSize == __OSPhysMemSize)&lt;br /&gt;
                {&lt;br /&gt;
                    bb2.FSTAddress = OSRoundDown32B(__OSDebugMon - bb2.FSTMaxSize);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    OSReport(&lt;br /&gt;
                        &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; Physical memory size is 0x%x bytes.\n&amp;quot;&lt;br /&gt;
                        &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; Console simulated memory size &amp;quot;&lt;br /&gt;
                        &amp;quot;must be smaller than or equal to the Physical memory size\n&amp;quot;,&lt;br /&gt;
                        __OSPhysMemSize, __OSSimMemSize );&lt;br /&gt;
                    PPCHalt();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            // Load whole BI2 in main memory. Reside it before FST.&lt;br /&gt;
            __OSBootInfo2 = bb2.FSTAddress - OS_BI2_SIZE;&lt;br /&gt;
 &lt;br /&gt;
            *addr   = __OSBootInfo2;&lt;br /&gt;
            *length = OS_BI2_SIZE;&lt;br /&gt;
            *offset = DVD_BI2_OFFSET;&lt;br /&gt;
 &lt;br /&gt;
            Part = 4;&lt;br /&gt;
            DCInvalidateRange(*addr, *length);&lt;br /&gt;
            break;&lt;br /&gt;
 &lt;br /&gt;
        // Load FST, only if FST placed before boot file.&lt;br /&gt;
        case 4:&lt;br /&gt;
            FSTHigh = bb2.bootFilePosition &amp;lt; bb2.FSTPosition;&lt;br /&gt;
            if(FSTHigh)&lt;br /&gt;
            {&lt;br /&gt;
                // Continue on part 5. Load FST later.&lt;br /&gt;
                Part = 5;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                *addr   = bb2.FSTAddress;&lt;br /&gt;
                *length = OSRoundUp32B(bb2.FSTLength);&lt;br /&gt;
                *offset = bb2.FSTPosition;&lt;br /&gt;
 &lt;br /&gt;
                Part = 5;&lt;br /&gt;
 &lt;br /&gt;
                if(*addr &amp;gt; 0x81700000)&lt;br /&gt;
                {&lt;br /&gt;
                    OSReport(&lt;br /&gt;
                        &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; Illegal FST &amp;quot;&lt;br /&gt;
                        &amp;quot;destination address! (0x%x)\n&amp;quot;, *addr );&lt;br /&gt;
                    PPCHalt();&lt;br /&gt;
                }&lt;br /&gt;
 &lt;br /&gt;
                DCInvalidateRange(*addr, *length);&lt;br /&gt;
                LoadBigData(addr, length, offset, &amp;amp;Part);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
        // Load main DOL header.&lt;br /&gt;
        case 5:&lt;br /&gt;
            *addr   = &amp;amp;DolImage;&lt;br /&gt;
            *length = sizeof(DolImage);&lt;br /&gt;
            *offset = bb2.bootFilePosition;&lt;br /&gt;
 &lt;br /&gt;
            Part = 6;&lt;br /&gt;
            DCInvalidateRange(*addr, *length);&lt;br /&gt;
            break;&lt;br /&gt;
 &lt;br /&gt;
        // Check out DOL properties. Clear BSS.&lt;br /&gt;
        case 6:&lt;br /&gt;
            s32 dolSize = DOLSize();&lt;br /&gt;
 &lt;br /&gt;
            // Halt apploader, if DOL size exceeds limit.&lt;br /&gt;
            if( (dolSize &amp;gt; __OSBootInfo2-&amp;gt;dolLimit) &amp;amp;&amp;amp; __OSBootInfo2-&amp;gt;dolLimit)&lt;br /&gt;
            {&lt;br /&gt;
                OSReport(&lt;br /&gt;
                    &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; Total size of text/data sections &amp;quot;&lt;br /&gt;
                    &amp;quot;of the dol file are too big (%d(0x%08x) bytes). &amp;quot;&lt;br /&gt;
                    &amp;quot;Currently the limit is set as %d(0x%08x) bytes\n&amp;quot;,&lt;br /&gt;
                    dolSize, __OSBootInfo2-&amp;gt;dolLimit );&lt;br /&gt;
                PPCHalt();&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            // Save DOL size in OS globals&lt;br /&gt;
            if(FSTHigh) __OSDOLSize = dolSize + OSRoundUp32B(bb2.FSTLength);&lt;br /&gt;
            else __OSDOLSize = dolSize;&lt;br /&gt;
 &lt;br /&gt;
            // Address limit?&lt;br /&gt;
            #define DOL_ADDRESS_LIMIT   0x80700000  // production boards&lt;br /&gt;
            #define DOL_ADDRESS_LIMITD  0x81200000  // development boards&lt;br /&gt;
            if(!(OSGetConsoleType() &amp;amp; OS_CONSOLE_DEVELOPMENT))&lt;br /&gt;
            {&lt;br /&gt;
                if(AddressLimit(DOL_ADDRESS_LIMIT) == FALSE)&lt;br /&gt;
                {&lt;br /&gt;
                    OSReport(&lt;br /&gt;
                        &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; One of the sections in the dol file &amp;quot;&lt;br /&gt;
                        &amp;quot;exceeded its boundary. All the sections should not exceed &amp;quot;&lt;br /&gt;
                        &amp;quot;0x%08x (production mode).\n&amp;quot;, DOL_ADDRESS_LIMIT );&lt;br /&gt;
                    PPCHalt();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                // Check twice : first for production mode, then for development.&lt;br /&gt;
 &lt;br /&gt;
                if(AddressLimit(DOL_ADDRESS_LIMIT) == FALSE)&lt;br /&gt;
                {&lt;br /&gt;
                    OSReport(&lt;br /&gt;
                        &amp;quot;APPLOADER WARNING &amp;gt;&amp;gt;&amp;gt; One of the sections in the dol file &amp;quot;&lt;br /&gt;
                        &amp;quot;exceeded its boundary. All the sections should not exceed &amp;quot;&lt;br /&gt;
                        &amp;quot;0x%08x in production mode.\n&amp;quot;, DOL_ADDRESS_LIMIT );&lt;br /&gt;
                    // Do not halt apploader (show only warning).&lt;br /&gt;
                }&lt;br /&gt;
 &lt;br /&gt;
                if(AddressLimit(DOL_ADDRESS_LIMITD) == FALSE)&lt;br /&gt;
                {&lt;br /&gt;
                    OSReport(&lt;br /&gt;
                        &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; One of the sections in the dol file &amp;quot;&lt;br /&gt;
                        &amp;quot;exceeded its boundary. All the sections should not exceed &amp;quot;&lt;br /&gt;
                        &amp;quot;0x%08x (development mode).\n&amp;quot;, DOL_ADDRESS_LIMITD );&lt;br /&gt;
                    PPCHalt();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            // Clear BSS&lt;br /&gt;
            memset(DolImage.bss, 0, DolImage.bssLen);&lt;br /&gt;
            DCFlushRange(DolImage.bss, DolImage.bssLen);&lt;br /&gt;
 &lt;br /&gt;
            Part = 7;&lt;br /&gt;
 &lt;br /&gt;
        // Load text sections.&lt;br /&gt;
        case 7:&lt;br /&gt;
            if(Section&amp;lt;DOL_MAX_TEXT)&lt;br /&gt;
            {&lt;br /&gt;
                if(DolImage.textData[Section])&lt;br /&gt;
                {&lt;br /&gt;
                    *addr   = DolImage.text[Section];&lt;br /&gt;
                    *length = OSRoundUp32B(DolImage.textLen[Section]);&lt;br /&gt;
                    *offset = bb2.bootFilePosition + DolImage.textData[Section];&lt;br /&gt;
 &lt;br /&gt;
                    if( (*addr + *length) &amp;gt; 0x81200000 )&lt;br /&gt;
                    {&lt;br /&gt;
                        OSReport(&lt;br /&gt;
                            &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; Too big text segment! (0x%x - 0x%x)\n&amp;quot;,&lt;br /&gt;
                            *addr, *addr + *length );&lt;br /&gt;
                        PPCHalt();&lt;br /&gt;
                    }&lt;br /&gt;
 &lt;br /&gt;
                    Section++;&lt;br /&gt;
                    DCInvalidateRange(*addr, *length);&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                Section = 0;&lt;br /&gt;
                Part = 8;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
        // Load data sections.&lt;br /&gt;
        case 8:&lt;br /&gt;
            if(Section&amp;lt;DOL_MAX_DATA)&lt;br /&gt;
            {&lt;br /&gt;
                if(DolImage.dataData[Section])&lt;br /&gt;
                {&lt;br /&gt;
                    *addr   = DolImage.data[Section];&lt;br /&gt;
                    *length = OSRoundUp32B(DolImage.dataLen[Section]);&lt;br /&gt;
                    *offset = bb2.bootFilePosition + DolImage.dataData[Section];&lt;br /&gt;
 &lt;br /&gt;
                    if( (*addr + *length) &amp;gt; 0x81200000 )&lt;br /&gt;
                    {&lt;br /&gt;
                        OSReport(&lt;br /&gt;
                            &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; Too big data segment! (0x%x - 0x%x)\n&amp;quot;,&lt;br /&gt;
                            *addr, *addr + *length );&lt;br /&gt;
                        PPCHalt();&lt;br /&gt;
                    }&lt;br /&gt;
 &lt;br /&gt;
                    Section++;&lt;br /&gt;
                    DCInvalidateRange(*addr, *length);&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                Section = 0;&lt;br /&gt;
                Part = 9;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
        // Load FST, only if FST placed after boot file.&lt;br /&gt;
        case 9:&lt;br /&gt;
            if(FSTHigh)&lt;br /&gt;
            {&lt;br /&gt;
                *addr   = bb2.FSTAddress;&lt;br /&gt;
                *length = OSRoundUp32B(bb2.FSTLength);&lt;br /&gt;
                *offset = bb2.FSTPosition;&lt;br /&gt;
 &lt;br /&gt;
                Part = 10;&lt;br /&gt;
 &lt;br /&gt;
                if(*addr &amp;gt; 0x81700000)&lt;br /&gt;
                {&lt;br /&gt;
                    OSReport(&lt;br /&gt;
                        &amp;quot;APPLOADER ERROR &amp;gt;&amp;gt;&amp;gt; Illegal FST &amp;quot;&lt;br /&gt;
                        &amp;quot;destination address! (0x%x)\n&amp;quot;, *addr );&lt;br /&gt;
                    PPCHalt();&lt;br /&gt;
                }&lt;br /&gt;
 &lt;br /&gt;
                DCInvalidateRange(*addr, *length);&lt;br /&gt;
                LoadBigData(addr, length, offset, &amp;amp;Part);&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                // Continue on part 10.&lt;br /&gt;
                Part = 10;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
        // Init misc. low memory variables. Continue on part 11.&lt;br /&gt;
        case 10:&lt;br /&gt;
            InitLoMem(LoMem);&lt;br /&gt;
            Part = 11;&lt;br /&gt;
 &lt;br /&gt;
        // Read button state of 4th controller and save it in OS global.&lt;br /&gt;
        // It&amp;#039;s for testing pre-master dvds (NR Discs). But as NR discs gets&lt;br /&gt;
        // written without change to the dvdroms the retail apploaders contains&lt;br /&gt;
        // it, too. If you plug in a special device (dunno what it is exactly -&lt;br /&gt;
        // controller with special id? some bit set?) the apploader starts making&lt;br /&gt;
        // a crc of the whole disc and compare that to a crc stored on memory card.&lt;br /&gt;
        case 11:&lt;br /&gt;
            PADStatus padst;&lt;br /&gt;
            PadRead(PAD_CHAN3, &amp;amp;padst);&lt;br /&gt;
            __OSPADButton = padst.button;&lt;br /&gt;
 &lt;br /&gt;
            // All data loaded. End of apploader.&lt;br /&gt;
            return FALSE;&lt;br /&gt;
 &lt;br /&gt;
        // This part will be called, if DVD need to load more, than 64 sectors.&lt;br /&gt;
        case 12:&lt;br /&gt;
            ASSERT(SecondTimeForThePart == TRUE);&lt;br /&gt;
            LoadBigData(addr, length, offset, &amp;amp;Part);&lt;br /&gt;
            break;&lt;br /&gt;
 &lt;br /&gt;
        // Unknown part. Abort data loading.&lt;br /&gt;
        default:&lt;br /&gt;
            return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // We need to load more data. Tell IPL to do that.&lt;br /&gt;
    return TRUE;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== PART III. Apploader Close ==&lt;br /&gt;
&lt;br /&gt;
Close call is executed after apploader&amp;#039;s Main.&lt;br /&gt;
&lt;br /&gt;
 void* AplClose(void)&lt;br /&gt;
 {&lt;br /&gt;
    // Return entrypoint of main DOL executable to IPL&lt;br /&gt;
    return DolImage.entry;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Now IPL jumps to DOL&amp;#039;s entrypoint (__start).&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Helper calls ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Calculate full size of DOL text and data sections &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 s32 DOLSize(void)&lt;br /&gt;
 {&lt;br /&gt;
    DolImage *dol = &amp;amp;DolImage;&lt;br /&gt;
    s32 totalBytes = 0, i;&lt;br /&gt;
 &lt;br /&gt;
    for(i=0; i&amp;lt;DOL_MAX_TEXT; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if(dol-&amp;gt;textData[i])&lt;br /&gt;
        {&lt;br /&gt;
            // Aligned to 32 byte boundary&lt;br /&gt;
            totalBytes += OSRoundUp32B(dol-&amp;gt;textLen[i]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    for(i=0; i&amp;lt;DOL_MAX_DATA; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if(dol-&amp;gt;dataData[i])&lt;br /&gt;
        {&lt;br /&gt;
            // Aligned to 32 byte boundary&lt;br /&gt;
            totalBytes += OSRoundUp32B(dol-&amp;gt;dataLen[i]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    return totalBytes;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Return FALSE, if any DOL section, including BSS exceed address limit &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 BOOL AddressLimit(u32 limit)&lt;br /&gt;
 {&lt;br /&gt;
    DolImage *dol = &amp;amp;DolImage;&lt;br /&gt;
    s32 i, end;&lt;br /&gt;
 &lt;br /&gt;
    // Text sections&lt;br /&gt;
    for(i=0; i&amp;lt;DOL_MAX_TEXT; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if(dol-&amp;gt;textData[i])&lt;br /&gt;
        {&lt;br /&gt;
            end = dol-&amp;gt;text[i] + dol-&amp;gt;textLen[i];&lt;br /&gt;
 &lt;br /&gt;
            if( ((dol-&amp;gt;text[i] &amp;lt; 0x81100000) || (end &amp;gt; 0x81300000)) &amp;amp;&amp;amp; (end &amp;gt; limit) )&lt;br /&gt;
            {&lt;br /&gt;
                return FALSE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // Data sections&lt;br /&gt;
    for(i=0; i&amp;lt;DOL_MAX_DATA; i++)&lt;br /&gt;
    {&lt;br /&gt;
        if(dol-&amp;gt;dataData[i])&lt;br /&gt;
        {&lt;br /&gt;
            end = dol-&amp;gt;data[i] + dol-&amp;gt;dataLen[i];&lt;br /&gt;
 &lt;br /&gt;
            if( ((dol-&amp;gt;data[i] &amp;lt; 0x81100000) || (end &amp;gt; 0x81300000)) &amp;amp;&amp;amp; (end &amp;gt; limit) )&lt;br /&gt;
            {&lt;br /&gt;
                return FALSE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // BSS&lt;br /&gt;
    end = dol-&amp;gt;bss + dol-&amp;gt;bssLen;&lt;br /&gt;
    if( ((dol-&amp;gt;bss &amp;lt; 0x81100000) || (end &amp;gt; 0x81300000)) &amp;amp;&amp;amp; (end &amp;gt; limit) )&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    return TRUE;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Some big transfers requires multiple load times for single apploader part &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Limit is set to 64 DVD sectors - WHY?).&lt;br /&gt;
&lt;br /&gt;
 void LoadBigData(void **addr, s32 *length, s32 *offset, int *part)&lt;br /&gt;
 {&lt;br /&gt;
    if(SecondTimeForThePart)&lt;br /&gt;
    {&lt;br /&gt;
        SecondTimeForThePart = FALSE;&lt;br /&gt;
 &lt;br /&gt;
        *addr   = SecondTimeAddr;&lt;br /&gt;
        *length = SecondTimeLength;&lt;br /&gt;
        *offset = SecondTimeOffset;&lt;br /&gt;
        *part   = SecondTimePart;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if(*length &amp;gt; 64*2048)       // 64 DVD sectors&lt;br /&gt;
        {&lt;br /&gt;
            // Initiate multiple DVD load.&lt;br /&gt;
            SecondTimeForThePart = TRUE;&lt;br /&gt;
 &lt;br /&gt;
            SecondTimeAddr = *addr + 64*2048;&lt;br /&gt;
            SecondTimeLength = *length - 64*2048;&lt;br /&gt;
            SecondTimeOffset = *offset + 64*2048;&lt;br /&gt;
            SecondTimePart = *part;&lt;br /&gt;
 &lt;br /&gt;
            *length = 64*2048;&lt;br /&gt;
            *part = 12;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Init some OS low memory variables &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 void InitLoMem(OSLoMem *LoMem)&lt;br /&gt;
 {&lt;br /&gt;
    LoMem-&amp;gt;bi.magic = OS_BOOTINFO_MAGIC;    // 0xD15EA5E&lt;br /&gt;
    LoMem-&amp;gt;bi.version = 1;&lt;br /&gt;
&lt;br /&gt;
    // Clear debug interface (db/DBInterface.h)&lt;br /&gt;
    LoMem-&amp;gt;db.bPresent = &lt;br /&gt;
    LoMem-&amp;gt;db.exceptionMask =&lt;br /&gt;
    LoMem-&amp;gt;db.ExceptionDestination = &lt;br /&gt;
    LoMem-&amp;gt;db.exceptionReturn = NULL;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Read PAD input buffer (buttons state). If PAD is not polled, return zeroes &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 void PadRead(int port, u32 *buf)&lt;br /&gt;
 {&lt;br /&gt;
    // If controller polling enabled&lt;br /&gt;
    if(SI_POLL &amp;amp; (0x80 &amp;gt;&amp;gt; port))&lt;br /&gt;
    {&lt;br /&gt;
        // Read SI input buffer&lt;br /&gt;
        buf[0] = SI_CHAN_INBUFH(port);&lt;br /&gt;
        buf[1] = SI_CHAN_INBUFL(port);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        buf[0] = buf[1] = 0;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Appendix B: DVD structures ==&lt;br /&gt;
&lt;br /&gt;
 #define DVD_BB2_OFFSET      0x420&lt;br /&gt;
 #define DVD_BI2_OFFSET      0x440&lt;br /&gt;
 &lt;br /&gt;
 #define OS_BI2_SIZE         0x2000  // Size of BI2 structure&lt;br /&gt;
 &lt;br /&gt;
 // DVD Boot Block&lt;br /&gt;
 typedef struct&lt;br /&gt;
 {&lt;br /&gt;
    u32     bootFilePosition;       // offset of main DOL executable&lt;br /&gt;
    u32     FSTPosition;            // offset of primary FST&lt;br /&gt;
    u32     FSTLength;              // primary FST size (in bytes)&lt;br /&gt;
    u32     FSTMaxLength;           // size of biggest additional FST&lt;br /&gt;
    u32     FSTAddress;             // FST address in main memory&lt;br /&gt;
    u32     userPosition;&lt;br /&gt;
    u32     userLength;&lt;br /&gt;
    u8      padding0[4];            // reserved, should be 0&lt;br /&gt;
 } DVDBB2;&lt;br /&gt;
&lt;br /&gt;
FST is File String Table. User area on DVD is where all files are placed. On some DVDs, user area is configured wrong. To know correct user area, you should parse whole FST and find min and max file offsets.&lt;br /&gt;
&lt;br /&gt;
 // DVD Boot Info&lt;br /&gt;
 typedef struct&lt;br /&gt;
 {&lt;br /&gt;
    s32     debugMonSize;           // size of debug monitor&lt;br /&gt;
    s32     simMemSize;             // simulated memory size (in bytes)&lt;br /&gt;
    u32     argOffset;              // command line arguments&lt;br /&gt;
    u32     debugFlag;              // debug present (set to 3, if CodeWarrior on GDEV)&lt;br /&gt;
    u32     TRKLocation;            // target resident kernel location&lt;br /&gt;
    s32     TRKSize;                // size of TRK&lt;br /&gt;
    u32     countryCode;            // country code&lt;br /&gt;
    u32     ?       +1C&lt;br /&gt;
    u32     ?       +20&lt;br /&gt;
    u32     ?       +24&lt;br /&gt;
    u32     dolLimit;               // maximum total size of DOL text/data sections (0 - unlimited)&lt;br /&gt;
    u32     ?       +2C&lt;br /&gt;
 &lt;br /&gt;
    u8      padded0[OS_BI2_SIZE - 0x30]; // reserved, should be 0&lt;br /&gt;
 } DVDBI2;&lt;br /&gt;
 &lt;br /&gt;
 Somewhere in +1C, +20 or +24 must present :&lt;br /&gt;
 u32     longFileNameSupport;    // 1: use long file names, 0: use 8.3 names&lt;br /&gt;
 u32     padSpec;                // controller version for PADSetSpec&lt;br /&gt;
&lt;br /&gt;
== Appendix C: Used OS low memory variables ==&lt;br /&gt;
&lt;br /&gt;
 s32     __OSPhysMemSize     AT_ADDRESS(OS_BASE_CACHED | 0x0028);&lt;br /&gt;
 s32     __OSDebugMonSize    AT_ADDRESS(OS_BASE_CACHED | 0x00E8);&lt;br /&gt;
 void*   __OSDebugMon        AT_ADDRESS(OS_BASE_CACHED | 0x00EC);&lt;br /&gt;
 s32     __OSSimMemSize      AT_ADDRESS(OS_BASE_CACHED | 0x00F0);&lt;br /&gt;
 DVDBI2* __OSBootInfo2       AT_ADDRESS(OS_BASE_CACHED | 0x00F4);&lt;br /&gt;
 s32     __OSDOLSize         AT_ADDRESS(OS_BASE_CACHED | 0x30D4);&lt;br /&gt;
 u16     __OSPADButton       AT_ADDRESS(OS_BASE_CACHED | 0x30E4);&lt;br /&gt;
&lt;br /&gt;
== Strange Things ==&lt;br /&gt;
&lt;br /&gt;
What&amp;#039;s [+0x148] in apploader data? Its only cleared in Init, but not used.&lt;br /&gt;
&lt;br /&gt;
Why FST loading is so strange : if FST placed above DOL, then its loaded after DOL, otherwise its loaded before DOL.&lt;br /&gt;
&lt;br /&gt;
 if(FSTHigh) __OSDOLSize = dolSize + OSRoundUp32B(bb2.FSTLength);&lt;br /&gt;
 else __OSDOLSize = dolSize;&lt;br /&gt;
Why so?&lt;br /&gt;
&lt;br /&gt;
Why FST is loaded in pieces, if its greater than 64 DVD sectors, but big DOL sections are not loaded in same way?&lt;br /&gt;
&lt;br /&gt;
Some code is placed after apploader data. Is it garbage or what?&lt;br /&gt;
&lt;br /&gt;
== ToDo ==&lt;br /&gt;
&lt;br /&gt;
Need more BI2 details.&lt;br /&gt;
&lt;br /&gt;
Get Zelda apploader and crosscheck it with current reversing. Maybe some interesting things will be discovered.&lt;br /&gt;
&lt;br /&gt;
Count how many apploader revisions are present today.&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
This information was found at: [http://dolwin.emulation64.com/docs/Apploader.txt]&lt;br /&gt;
&lt;br /&gt;
[[Category:CubeDocumented]]&lt;br /&gt;
[[Category:Technical Info]]&lt;br /&gt;
[[Category:Reverse Engineering]]&lt;/div&gt;</summary>
		<author><name>Infact</name></author>
	</entry>
</feed>