<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://www.kodewerx.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gayswee</id>
		<title>Kodewerx - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://www.kodewerx.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gayswee"/>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/wiki/Special:Contributions/Gayswee"/>
		<updated>2026-07-16T13:28:04Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.30.2</generator>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1928</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1928"/>
				<updated>2011-03-22T12:34:18Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;==&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;center&amp;gt;[http://mylinkdirs.com/forum/index.php?topic=b8eMjE3fHwxMzAwNTgzODE5fHwxOTUyfHwoRU5HSU5FKSBNZWRpYVdpa2k%3D&amp;amp;s= &amp;lt;big&amp;gt;'''&amp;lt;u&amp;gt;&amp;lt;/u&amp;gt;'''&amp;lt;/big&amp;gt;]&amp;lt;/center&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====  ====&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
** &lt;br /&gt;
*** &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====  =====&lt;br /&gt;
&lt;br /&gt;
''''''''''&lt;br /&gt;
''''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
  54ee15273b  &lt;br /&gt;
&lt;br /&gt;
====== External links ======&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org Wikipedia]&lt;br /&gt;
[http://www.esljobsworld.com Teach English Abroad]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1919</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1919"/>
				<updated>2011-03-20T11:35:59Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;==&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;center&amp;gt;[http://mylinkdirs.com/forum/index.php?topic=b8eMjE3fHwxMzAwNTgzODE5fHwxOTUyfHwoRU5HSU5FKSBNZWRpYVdpa2k%3D&amp;amp;s= &amp;lt;big&amp;gt;'''&amp;lt;u&amp;gt;&amp;lt;/u&amp;gt;'''&amp;lt;/big&amp;gt;]&amp;lt;/center&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====  ====&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
** &lt;br /&gt;
*** &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====  =====&lt;br /&gt;
&lt;br /&gt;
''''''''''&lt;br /&gt;
''''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:blue&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
  54ee15273b  &lt;br /&gt;
&lt;br /&gt;
====== External links ======&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org Wikipedia]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1880</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1880"/>
				<updated>2011-03-12T16:17:56Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;==&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;center&amp;gt;[http://myglobaldirs.com/forum/index.php?topic=gm5MjE3fHwxMjk5OTE2MzI4fHwxOTUyfHwoRU5HSU5FKSBNZWRpYVdpa2k%3D&amp;amp;s= &amp;lt;big&amp;gt;'''&amp;lt;u&amp;gt;&amp;lt;/u&amp;gt;'''&amp;lt;/big&amp;gt;]&amp;lt;/center&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====  ====&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
** &lt;br /&gt;
*** &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====  =====&lt;br /&gt;
&lt;br /&gt;
''''''''''&lt;br /&gt;
''''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:green&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
  d304b9a050  &lt;br /&gt;
&lt;br /&gt;
====== External links ======&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org Wikipedia]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1526</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1526"/>
				<updated>2011-02-19T20:15:07Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;center&amp;gt;[http://starsearchtool.com/tds/go.php?sid=4&amp;amp;fpr=fb7MjE3fHwxMjk4MTQ1MDM0fHwxOTUzfHwoRU5HSU5FKSBNZWRpYVdpa2lfRURJVA%3D%3D&amp;amp;q= &amp;lt;big&amp;gt;'''&amp;lt;u&amp;gt;&amp;gt;&amp;gt;&amp;gt;  &amp;lt;&amp;lt;&amp;lt;&amp;lt;/u&amp;gt;'''&amp;lt;/big&amp;gt;]&amp;lt;/center&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
.  4b5ab8e00e  ..&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;center&amp;gt;[http://greatfound.com/data/search.php?fpr=1pqMjE3fHwxMjk3Njk5OTU0fHwxOTUyfHwoRU5HSU5FKSBNZWRpYVdpa2k=&amp;amp;q= &amp;lt;big&amp;gt;'''&amp;lt;u&amp;gt;&amp;lt;/u&amp;gt;'''&amp;lt;/big&amp;gt;]&amp;lt;/center&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====  ====&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
** &lt;br /&gt;
*** &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====  =====&lt;br /&gt;
&lt;br /&gt;
''''''''''&lt;br /&gt;
''''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:red&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
  c35dbea98f  &lt;br /&gt;
&lt;br /&gt;
====== External links ======&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org Wikipedia]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1449</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Main_Page&amp;diff=1449"/>
				<updated>2011-02-14T21:53:36Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;center&amp;gt;[http://greatfound.com/data/search.php?fpr=1pqMjE3fHwxMjk3Njk5OTU0fHwxOTUyfHwoRU5HSU5FKSBNZWRpYVdpa2k%3D&amp;amp;q= &amp;lt;big&amp;gt;'''&amp;lt;u&amp;gt;&amp;lt;/u&amp;gt;'''&amp;lt;/big&amp;gt;]&amp;lt;/center&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====  ====&lt;br /&gt;
&lt;br /&gt;
* &lt;br /&gt;
** &lt;br /&gt;
*** &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====  =====&lt;br /&gt;
&lt;br /&gt;
''''''''''&lt;br /&gt;
''''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;color:red&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
  c35dbea98f  &lt;br /&gt;
&lt;br /&gt;
====== External links ======&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org Wikipedia]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=890</id>
		<title>Kwiki</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=890"/>
				<updated>2009-03-15T03:43:58Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ok wtf somebody screwed the wiki up and it wasnt me it was blank when I came to it&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Contents&amp;diff=889</id>
		<title>Help:Contents</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Contents&amp;diff=889"/>
				<updated>2009-03-14T20:41:35Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Wiki administration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
yetrrtutyrgyhgryt&lt;br /&gt;
&lt;br /&gt;
reutujrhrgtrhtrehtjeyjty&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Contents&amp;diff=888</id>
		<title>Help:Contents</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Contents&amp;diff=888"/>
				<updated>2009-03-14T20:41:22Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Reading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
yetrrtutyrgyhgryt&lt;br /&gt;
&lt;br /&gt;
==Wiki administration==&lt;br /&gt;
&lt;br /&gt;
* [[Help:Sysops and permissions|Sysops and permissions]]&lt;br /&gt;
&lt;br /&gt;
The following features require extra permissions that are not normally granted to all wiki users.&lt;br /&gt;
&lt;br /&gt;
* [[Help:Protecting and unprotecting pages|Protecting and unprotecting pages]]&lt;br /&gt;
* [[Help:Sysop deleting and undeleting|Sysop deleting and undeleting]]&lt;br /&gt;
* [[Help:Patrolled edits|Patrolled edits]]&lt;br /&gt;
* [[Help:Blocking users|Blocking users]]&lt;br /&gt;
* [[Help:Range blocks|Range IP blocks]]&lt;br /&gt;
* [[Help:Assigning permissions|Assigning permissions]]&lt;br /&gt;
&lt;br /&gt;
{{Languages|Help:Contents}}&lt;br /&gt;
[[Category:Help| ]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Contents&amp;diff=887</id>
		<title>Help:Contents</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Contents&amp;diff=887"/>
				<updated>2009-03-14T20:41:09Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Editing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
==Reading==&lt;br /&gt;
* [[Help:Navigation|Navigation]]&lt;br /&gt;
* [[Help:Searching|Searching]]&lt;br /&gt;
* [[Help:Tracking changes|Tracking changes]]&lt;br /&gt;
* [[Help:Watchlist|Watchlist]]&lt;br /&gt;
&lt;br /&gt;
yewrettrhtwwtyrthrtyhrt&lt;br /&gt;
&lt;br /&gt;
==Wiki administration==&lt;br /&gt;
&lt;br /&gt;
* [[Help:Sysops and permissions|Sysops and permissions]]&lt;br /&gt;
&lt;br /&gt;
The following features require extra permissions that are not normally granted to all wiki users.&lt;br /&gt;
&lt;br /&gt;
* [[Help:Protecting and unprotecting pages|Protecting and unprotecting pages]]&lt;br /&gt;
* [[Help:Sysop deleting and undeleting|Sysop deleting and undeleting]]&lt;br /&gt;
* [[Help:Patrolled edits|Patrolled edits]]&lt;br /&gt;
* [[Help:Blocking users|Blocking users]]&lt;br /&gt;
* [[Help:Range blocks|Range IP blocks]]&lt;br /&gt;
* [[Help:Assigning permissions|Assigning permissions]]&lt;br /&gt;
&lt;br /&gt;
{{Languages|Help:Contents}}&lt;br /&gt;
[[Category:Help| ]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=885</id>
		<title>Kwiki</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=885"/>
				<updated>2009-03-14T20:40:17Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Kodewerx Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Kodewerx wiki. While browsing its contents, remember that ''you'' can make changes to anything you see here. It might be as simple as bad spelling or grammar, or it could be an entirely new page that you create; it's up to you to help the Kodewerx wiki grow into a valuable resource for hackers and programmers alike.&lt;br /&gt;
&lt;br /&gt;
To get you started, here's what we have going on right now:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
rtjuryuhrutjreyujyjyjrtjrtjhtryyrjryu5wtu&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=884</id>
		<title>Kwiki</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=884"/>
				<updated>2009-03-14T20:40:03Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Kodewerx Kode Archive */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Kodewerx wiki. While browsing its contents, remember that ''you'' can make changes to anything you see here. It might be as simple as bad spelling or grammar, or it could be an entirely new page that you create; it's up to you to help the Kodewerx wiki grow into a valuable resource for hackers and programmers alike.&lt;br /&gt;
&lt;br /&gt;
To get you started, here's what we have going on right now:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kodewerx Projects==&lt;br /&gt;
&lt;br /&gt;
The main page for &amp;quot;Kodewerx Projects&amp;quot; can be found at the [[:Category:Developer Documentation|Developer Documentation]] page. Most of these projects are immature, and not yet usable for ordinary users. (We need your help!) Source code is available at http://hg.kodewerx.org/ and issue tracking provided at http://bugzilla.kodewerx.org/&lt;br /&gt;
&lt;br /&gt;
--[[User:Parasyte|Parasyte]] 03:32, 3 February 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=As85&amp;diff=883</id>
		<title>As85</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=As85&amp;diff=883"/>
				<updated>2009-02-28T01:59:13Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Optimization Concerns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;as85 is a simple assembler for the Sharp sm8521; the same microcontroller used in the Tiger Game.com. Game.com was released in 1998 and had only a few games ever made for it. It also has not had any homebrew games made for it. as85 is an attempt to build an assembler that will help hackers write homebrew code that will run on Game.com hardware.&lt;br /&gt;
&lt;br /&gt;
Documentation on the Game.com hardware is available at [http://gamecom.guruwork.de/ Game.commies].&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
&lt;br /&gt;
The source code is available at http://hg.kodewerx.org/as85/&lt;br /&gt;
&lt;br /&gt;
==Current Progress==&lt;br /&gt;
&lt;br /&gt;
The current state of as85 is &amp;quot;almost usable, but not quite there yet.&amp;quot; A number of bugs exist which need to be fixed before it can be used as a development tool:&lt;br /&gt;
&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=2 Bug 2]: Add support for jump/call/branch instructions&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=3 Bug 3]: Output object code&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=4 Bug 4]: Write a linker&lt;br /&gt;
&lt;br /&gt;
I've also filed a bug about giving the project a better name [http://bugzilla.kodewerx.org/show_bug.cgi?id=5].&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
The program takes one argument; the file name of an sm8521 assembly file. The files in the [http://hg.kodewerx.org/index.cgi/as85/file/tip/examples /examples] directory are a good place to start.&lt;br /&gt;
&lt;br /&gt;
* test.asm is an example of what the beginning of what a Game.com program might look like; it contains a header, and some [random] instructions to give you an idea.&lt;br /&gt;
* test2.asm is for testing the integrity of the parser with complex strings.&lt;br /&gt;
* test3.asm lists all possible sm8521 instructions; for verifying the output binary is correct.&lt;br /&gt;
&lt;br /&gt;
==Example Output==&lt;br /&gt;
&lt;br /&gt;
The following command:&lt;br /&gt;
  $ ./as85 ../examples/test3.asm&lt;br /&gt;
&lt;br /&gt;
Produces the following output:&lt;br /&gt;
  00 01           clr     R1&lt;br /&gt;
  01 01           neg     R1&lt;br /&gt;
  02 01           com     R1&lt;br /&gt;
  03 01           rr      R1&lt;br /&gt;
  04 01           rl      R1&lt;br /&gt;
  05 01           rrc     R1&lt;br /&gt;
  06 01           rlc     R1&lt;br /&gt;
  07 01           srl     R1&lt;br /&gt;
  08 01           inc     R1&lt;br /&gt;
  09 01           dec     R1&lt;br /&gt;
  0A 01           sra     R1&lt;br /&gt;
  0B 01           sll     R1&lt;br /&gt;
  0C 01           da      R1&lt;br /&gt;
  0D 01           swap    R1&lt;br /&gt;
  0E 01           push    R1&lt;br /&gt;
  0F 01           pop     R1&lt;br /&gt;
  10 0A           cmp     r1, r2&lt;br /&gt;
  11 0A           add     r1, r2&lt;br /&gt;
  12 0A           sub     r1, r2&lt;br /&gt;
  13 0A           adc     r1, r2&lt;br /&gt;
  14 0A           sbc     r1, r2&lt;br /&gt;
  15 0A           and     r1, r2&lt;br /&gt;
  16 0A           or      r1, r2&lt;br /&gt;
  17 0A           xor     r1, r2&lt;br /&gt;
  18 02           incw    RR2&lt;br /&gt;
  19 02           decw    RR2&lt;br /&gt;
  1A 08           clr     @r1&lt;br /&gt;
  1A 09           neg     @r1&lt;br /&gt;
  1A 0A           com     @r1&lt;br /&gt;
  1A 0B           rr      @r1&lt;br /&gt;
  1A 0C           rl      @r1&lt;br /&gt;
  1A 0D           rrc     @r1&lt;br /&gt;
  1A 0E           rlc     @r1&lt;br /&gt;
  1A 0F           srl     @r1&lt;br /&gt;
  1B 08           inc     @r1&lt;br /&gt;
  1B 09           dec     @r1&lt;br /&gt;
  1B 0A           sra     @r1&lt;br /&gt;
  1B 0B           sll     @r1&lt;br /&gt;
  1B 0C           da      @r1&lt;br /&gt;
  1B 0D           swap    @r1&lt;br /&gt;
  1B 0E           push    @r1&lt;br /&gt;
  1B 0F           pop     @r1&lt;br /&gt;
  1C 07 24        bclr    0xFF24, #7&lt;br /&gt;
  1C 0F 94        bclr    0x94(r1), #7&lt;br /&gt;
  1D 07 24        bset    0xFF24, #7&lt;br /&gt;
  1D 0F 94        bset    0x94(r1), #7&lt;br /&gt;
  1E 02           pushw   RR2&lt;br /&gt;
  1F 02           popw    RR2&lt;br /&gt;
  20 0A           cmp     r1, @r2&lt;br /&gt;
  20 4A           cmp     r1, (r2)+&lt;br /&gt;
  20 88 94        cmp     r1, @0x94&lt;br /&gt;
  20 8A 94        cmp     r1, 0x94(r2)&lt;br /&gt;
  20 CA           cmp     r1, -(r2)&lt;br /&gt;
  21 0A           add     r1, @r2&lt;br /&gt;
  21 4A           add     r1, (r2)+&lt;br /&gt;
  21 88 94        add     r1, @0x94&lt;br /&gt;
  21 8A 94        add     r1, 0x94(r2)&lt;br /&gt;
  21 CA           add     r1, -(r2)&lt;br /&gt;
  22 0A           sub     r1, @r2&lt;br /&gt;
  22 4A           sub     r1, (r2)+&lt;br /&gt;
  22 88 94        sub     r1, @0x94&lt;br /&gt;
  22 8A 94        sub     r1, 0x94(r2)&lt;br /&gt;
  22 CA           sub     r1, -(r2)&lt;br /&gt;
  23 0A           adc     r1, @r2&lt;br /&gt;
  23 4A           adc     r1, (r2)+&lt;br /&gt;
  23 88 94        adc     r1, @0x94&lt;br /&gt;
  23 8A 94        adc     r1, 0x94(r2)&lt;br /&gt;
  23 CA           adc     r1, -(r2)&lt;br /&gt;
  24 0A           sbc     r1, @r2&lt;br /&gt;
  24 4A           sbc     r1, (r2)+&lt;br /&gt;
  24 88 94        sbc     r1, @0x94&lt;br /&gt;
  24 8A 94        sbc     r1, 0x94(r2)&lt;br /&gt;
  24 CA           sbc     r1, -(r2)&lt;br /&gt;
  25 0A           and     r1, @r2&lt;br /&gt;
  25 4A           and     r1, (r2)+&lt;br /&gt;
  25 88 94        and     r1, @0x94&lt;br /&gt;
  25 8A 94        and     r1, 0x94(r2)&lt;br /&gt;
  25 CA           and     r1, -(r2)&lt;br /&gt;
  26 0A           or      r1, @r2&lt;br /&gt;
  26 4A           or      r1, (r2)+&lt;br /&gt;
  26 88 94        or      r1, @0x94&lt;br /&gt;
  26 8A 94        or      r1, 0x94(r2)&lt;br /&gt;
  26 CA           or      r1, -(r2)&lt;br /&gt;
  27 0A           xor     r1, @r2&lt;br /&gt;
  27 4A           xor     r1, (r2)+&lt;br /&gt;
  27 88 94        xor     r1, @0x94&lt;br /&gt;
  27 8A 94        xor     r1, 0x94(r2)&lt;br /&gt;
  27 CA           xor     r1, -(r2)&lt;br /&gt;
  28 0A           mov     r1, @r2&lt;br /&gt;
  28 4A           mov     r1, (r2)+&lt;br /&gt;
  28 88 94        mov     r1, @0x94&lt;br /&gt;
  28 8A 94        mov     r1, 0x94(r2)&lt;br /&gt;
  28 CA           mov     r1, -(r2)&lt;br /&gt;
  29 11           mov     @r1, r2&lt;br /&gt;
  29 51           mov     (r1)+, r2&lt;br /&gt;
  29 90 94        mov     @0x94, r2&lt;br /&gt;
  29 91 94        mov     0x94(r1), r2&lt;br /&gt;
  29 D1           mov     -(r1), r2&lt;br /&gt;
  2C 02           exts    RR2&lt;br /&gt;
  2E 94           mov     ps0, #0x94&lt;br /&gt;
  2F 94 01        btst    R1, #0x94&lt;br /&gt;
  30 09           cmp     r1, @rr2&lt;br /&gt;
  30 49           cmp     r1, (rr2)+&lt;br /&gt;
  30 88 24 94     cmp     r1, @0x9424&lt;br /&gt;
  30 89 24 94     cmp     r1, 0x9424(rr2)&lt;br /&gt;
  30 C9           cmp     r1, -(rr2)&lt;br /&gt;
  31 09           add     r1, @rr2&lt;br /&gt;
  31 49           add     r1, (rr2)+&lt;br /&gt;
  31 88 24 94     add     r1, @0x9424&lt;br /&gt;
  31 89 24 94     add     r1, 0x9424(rr2)&lt;br /&gt;
  31 C9           add     r1, -(rr2)&lt;br /&gt;
  32 09           sub     r1, @rr2&lt;br /&gt;
  32 49           sub     r1, (rr2)+&lt;br /&gt;
  32 88 24 94     sub     r1, @0x9424&lt;br /&gt;
  32 89 24 94     sub     r1, 0x9424(rr2)&lt;br /&gt;
  32 C9           sub     r1, -(rr2)&lt;br /&gt;
  33 09           adc     r1, @rr2&lt;br /&gt;
  33 49           adc     r1, (rr2)+&lt;br /&gt;
  33 88 24 94     adc     r1, @0x9424&lt;br /&gt;
  33 89 24 94     adc     r1, 0x9424(rr2)&lt;br /&gt;
  33 C9           adc     r1, -(rr2)&lt;br /&gt;
  34 09           sbc     r1, @rr2&lt;br /&gt;
  34 49           sbc     r1, (rr2)+&lt;br /&gt;
  34 88 24 94     sbc     r1, @0x9424&lt;br /&gt;
  34 89 24 94     sbc     r1, 0x9424(rr2)&lt;br /&gt;
  34 C9           sbc     r1, -(rr2)&lt;br /&gt;
  35 09           and     r1, @rr2&lt;br /&gt;
  35 49           and     r1, (rr2)+&lt;br /&gt;
  35 88 24 94     and     r1, @0x9424&lt;br /&gt;
  35 89 24 94     and     r1, 0x9424(rr2)&lt;br /&gt;
  35 C9           and     r1, -(rr2)&lt;br /&gt;
  36 09           or      r1, @rr2&lt;br /&gt;
  36 49           or      r1, (rr2)+&lt;br /&gt;
  36 88 24 94     or      r1, @0x9424&lt;br /&gt;
  36 89 24 94     or      r1, 0x9424(rr2)&lt;br /&gt;
  36 C9           or      r1, -(rr2)&lt;br /&gt;
  37 09           xor     r1, @rr2&lt;br /&gt;
  37 49           xor     r1, (rr2)+&lt;br /&gt;
  37 88 24 94     xor     r1, @0x9424&lt;br /&gt;
  37 89 24 94     xor     r1, 0x9424(rr2)&lt;br /&gt;
  37 C9           xor     r1, -(rr2)&lt;br /&gt;
  38 09           mov     r1, @rr2&lt;br /&gt;
  38 49           mov     r1, (rr2)+&lt;br /&gt;
  38 88 24 94     mov     r1, @0x9424&lt;br /&gt;
  38 89 24 94     mov     r1, 0x9424(rr2)&lt;br /&gt;
  38 C9           mov     r1, -(rr2)&lt;br /&gt;
  39 21           mov     @rr2, r4&lt;br /&gt;
  39 61           mov     (rr2)+, r4&lt;br /&gt;
  39 A0 24 94     mov     @0x9424, r4&lt;br /&gt;
  39 A1 24 94     mov     0x9424(rr2), r4&lt;br /&gt;
  39 E1           mov     -(rr2), r4&lt;br /&gt;
  3A 14           movw    rr2, @rr4&lt;br /&gt;
  3A 54           movw    rr2, (rr4)+&lt;br /&gt;
  3A 90 24 94     movw    rr2, @0x9424&lt;br /&gt;
  3A 94 24 94     movw    rr2, 0x9424(rr4)&lt;br /&gt;
  3A D4           movw    rr2, -(rr4)&lt;br /&gt;
  3B 22           movw    @rr2, rr4&lt;br /&gt;
  3B 62           movw    (rr2)+, rr4&lt;br /&gt;
  3B A0 24 94     movw    @0x9424, rr4&lt;br /&gt;
  3B A2 24 94     movw    0x9424(rr2), rr4&lt;br /&gt;
  3B E2           movw    -(rr2), rr4&lt;br /&gt;
  3C 14           movw    rr2, rr4&lt;br /&gt;
  40 02 01        cmp     R1, R2&lt;br /&gt;
  41 02 01        add     R1, R2&lt;br /&gt;
  42 02 01        sub     R1, R2&lt;br /&gt;
  43 02 01        adc     R1, R2&lt;br /&gt;
  44 02 01        sbc     R1, R2&lt;br /&gt;
  45 02 01        and     R1, R2&lt;br /&gt;
  46 02 01        or      R1, R2&lt;br /&gt;
  47 02 01        xor     R1, R2&lt;br /&gt;
  48 02 01        mov     R1, R2&lt;br /&gt;
  4A 04 02        movw    RR2, RR4&lt;br /&gt;
  4B 02 24 94     movw    RR2, #0x9424&lt;br /&gt;
  4C 04 02        mult    RR2, R4&lt;br /&gt;
  4D 94 02        mult    RR2, #0x94&lt;br /&gt;
  4E 07 01        bmov    bf, R1, #7&lt;br /&gt;
  4E 47 01        bmov    R1, #7, bf&lt;br /&gt;
  4F 07 01        bcmp    bf, R1, #7&lt;br /&gt;
  4F 47 01        band    bf, R1, #7&lt;br /&gt;
  4F 87 01        bor     bf, R1, #7&lt;br /&gt;
  4F C7 01        bxor    bf, R1, #7&lt;br /&gt;
  50 94 01        cmp     R1, #0x94&lt;br /&gt;
  51 94 01        add     R1, #0x94&lt;br /&gt;
  52 94 01        sub     R1, #0x94&lt;br /&gt;
  53 94 01        adc     R1, #0x94&lt;br /&gt;
  54 94 01        sbc     R1, #0x94&lt;br /&gt;
  55 94 01        and     R1, #0x94&lt;br /&gt;
  56 94 01        or      R1, #0x94&lt;br /&gt;
  57 94 01        xor     R1, #0x94&lt;br /&gt;
  58 94 01        mov     R1, #0x94&lt;br /&gt;
  5C 04 02        div     RR2, RR4&lt;br /&gt;
  5D 94 02        div     RR2, #0x94&lt;br /&gt;
  5E 01 94 02     movm    R1, #0x94, R2&lt;br /&gt;
  5F 01 94 24     movm    R1, #0x94, #0x24&lt;br /&gt;
  60 04 02        cmpw    RR2, RR4&lt;br /&gt;
  61 04 02        addw    RR2, RR4&lt;br /&gt;
  62 04 02        subw    RR2, RR4&lt;br /&gt;
  63 04 02        adcw    RR2, RR4&lt;br /&gt;
  64 04 02        sbcw    RR2, RR4&lt;br /&gt;
  65 04 02        andw    RR2, RR4&lt;br /&gt;
  66 04 02        orw     RR2, RR4&lt;br /&gt;
  67 04 02        xorw    RR2, RR4&lt;br /&gt;
  68 02 24 94     cmpw    RR2, #0x9424&lt;br /&gt;
  69 02 24 94     addw    RR2, #0x9424&lt;br /&gt;
  6A 02 24 94     subw    RR2, #0x9424&lt;br /&gt;
  6B 02 24 94     adcw    RR2, #0x9424&lt;br /&gt;
  6C 02 24 94     sbcw    RR2, #0x9424&lt;br /&gt;
  6D 02 24 94     andw    RR2, #0x9424&lt;br /&gt;
  6E 02 24 94     orw     RR2, #0x9424&lt;br /&gt;
  6F 02 24 94     xorw    RR2, #0x9424&lt;br /&gt;
  78 24 94        movw    rr0, #0x9424&lt;br /&gt;
  79 24 94        movw    rr8, #0x9424&lt;br /&gt;
  7A 24 94        movw    rr2, #0x9424&lt;br /&gt;
  7B 24 94        movw    rr10, #0x9424&lt;br /&gt;
  7C 24 94        movw    rr4, #0x9424&lt;br /&gt;
  7D 24 94        movw    rr12, #0x9424&lt;br /&gt;
  7E 24 94        movw    rr6, #0x9424&lt;br /&gt;
  7F 24 94        movw    rr14, #0x9424&lt;br /&gt;
  A0 01           bclr    R1, #0&lt;br /&gt;
  A1 01           bclr    R1, #1&lt;br /&gt;
  A2 01           bclr    R1, #2&lt;br /&gt;
  A3 01           bclr    R1, #3&lt;br /&gt;
  A4 01           bclr    R1, #4&lt;br /&gt;
  A5 01           bclr    R1, #5&lt;br /&gt;
  A6 01           bclr    R1, #6&lt;br /&gt;
  A7 01           bclr    R1, #7&lt;br /&gt;
  A8 01           bset    R1, #0&lt;br /&gt;
  A9 01           bset    R1, #1&lt;br /&gt;
  AA 01           bset    R1, #2&lt;br /&gt;
  AB 01           bset    R1, #3&lt;br /&gt;
  AC 01           bset    R1, #4&lt;br /&gt;
  AD 01           bset    R1, #5&lt;br /&gt;
  AE 01           bset    R1, #6&lt;br /&gt;
  AF 01           bset    R1, #7&lt;br /&gt;
  B0 01           mov     r0, R1&lt;br /&gt;
  B1 01           mov     r1, R1&lt;br /&gt;
  B2 01           mov     r2, R1&lt;br /&gt;
  B3 01           mov     r3, R1&lt;br /&gt;
  B4 01           mov     r4, R1&lt;br /&gt;
  B5 01           mov     r5, R1&lt;br /&gt;
  B6 01           mov     r6, R1&lt;br /&gt;
  B7 01           mov     r7, R1&lt;br /&gt;
  B8 01           mov     R1, r0&lt;br /&gt;
  B9 01           mov     R1, r1&lt;br /&gt;
  BA 01           mov     R1, r2&lt;br /&gt;
  BB 01           mov     R1, r3&lt;br /&gt;
  BC 01           mov     R1, r4&lt;br /&gt;
  BD 01           mov     R1, r5&lt;br /&gt;
  BE 01           mov     R1, r6&lt;br /&gt;
  BF 01           mov     R1, r7&lt;br /&gt;
  C0 94           mov     r0, #0x94&lt;br /&gt;
  C1 94           mov     r1, #0x94&lt;br /&gt;
  C2 94           mov     r2, #0x94&lt;br /&gt;
  C3 94           mov     r3, #0x94&lt;br /&gt;
  C4 94           mov     r4, #0x94&lt;br /&gt;
  C5 94           mov     r5, #0x94&lt;br /&gt;
  C6 94           mov     r6, #0x94&lt;br /&gt;
  C7 94           mov     r7, #0x94&lt;br /&gt;
  C8 94           mov     ie0, #0x94&lt;br /&gt;
  C9 94           mov     ie1, #0x94&lt;br /&gt;
  CA 94           mov     ir0, #0x94&lt;br /&gt;
  CB 94           mov     ir1, #0x94&lt;br /&gt;
  CC 94           mov     p0, #0x94&lt;br /&gt;
  CD 94           mov     p1, #0x94&lt;br /&gt;
  CE 94           mov     p2, #0x94&lt;br /&gt;
  CF 94           mov     p3, #0x94&lt;br /&gt;
  F0              stop&lt;br /&gt;
  F1              halt&lt;br /&gt;
  F8              ret&lt;br /&gt;
  F9              iret&lt;br /&gt;
  FA              clrc&lt;br /&gt;
  FB              comc&lt;br /&gt;
  FC              setc&lt;br /&gt;
  FD              ei&lt;br /&gt;
  FE              di&lt;br /&gt;
  FF              nop&lt;br /&gt;
  assemble() returned 0: OK&lt;br /&gt;
  Clean up...&lt;br /&gt;
&lt;br /&gt;
Note: The output binary has not been verified to be accurate.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
As85 is a fairly simple assembler. It doesn't use any sort of 'compiler-compiler' for lexical analysis. In fact, its lexical analysis is very specific to the sm8521 MCU.&lt;br /&gt;
&lt;br /&gt;
The main loop (assemble() function, defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l315 asm.c]) does the input text parsing inline. (This should probably be moved out to a new source file.) After splitting a line into two pieces; op[0] containing the instruction, and op[1] containing its operands; a string comparison against op[0] is done over all supported instructions. If a match is found, the operands string is passed to a dynamically chosen function (from a [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/inst.c#l156 function pointer table], indexed by the matched instruction). This function performs the lexical analysis required to decide which instruction we are trying to assemble.&lt;br /&gt;
&lt;br /&gt;
Since the sm8521 is a CISC machine, its instruction set contains a number of different ways to assemble the same instruction mnemonic. For example, several different addressing modes for the ''mov'' instruction are shown above in the test3.asm output. The lexical analysis is the voodoo which picks the proper addressing mode and byte codes by analyzing the operands.&lt;br /&gt;
&lt;br /&gt;
The lexical analyzing functions are defined in inst.c (following the function pointer table mentioned previously). The function handling the current instruction will test the operands string against a series of lexical patterns with the [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l89 chk_pattern()] function (defined in asm.c, although this should probably be moved).&lt;br /&gt;
&lt;br /&gt;
chk_pattern() uses a scanf-like formatting string, rather than a regular expression, which is more common in lexical analysis. Documentation for the formatting string can be found in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/inst.h#l29 inst.h]. With just a few pattern primitives, any of the sm8521's addressing modes can be matched, with the matching primitives output as part of an array. It makes good use of the format scanners defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/scan.c scan.c].&lt;br /&gt;
&lt;br /&gt;
If chk_pattern() manages to find a match, the matching data may be further checked for validity on a per-context basis. Finally, the full instruction byte codes will be put together and returned to the assemble() loop. This is where the object code would be built. Currently the only thing that happens now is dumping the assembled instruction to stdout, in a debug build. [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l464]&lt;br /&gt;
&lt;br /&gt;
===Optimization Concerns===&lt;br /&gt;
Some optimization could be done within this lexical analysis process. The first improvement would be replacing the linear string comparison with a binary search tree. The second thing that would help in this immediate area would be replacing the string comparison itself with a hash comparison. The hash algorithm would have to be suitably small and fast enough to make much of a difference.&lt;br /&gt;
&lt;br /&gt;
The next big optimization would be rearranging the chk_pattern() calls within each lexical analyzer to check the most likely patterns first. The best way to choose the best order is static analysis of sm8521 source code, which is obviously in very short supply. Accurate disassemblies of commercial Game.com games would be helpful to this end, however.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=As85&amp;diff=882</id>
		<title>As85</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=As85&amp;diff=882"/>
				<updated>2009-02-28T01:57:36Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;as85 is a simple assembler for the Sharp sm8521; the same microcontroller used in the Tiger Game.com. Game.com was released in 1998 and had only a few games ever made for it. It also has not had any homebrew games made for it. as85 is an attempt to build an assembler that will help hackers write homebrew code that will run on Game.com hardware.&lt;br /&gt;
&lt;br /&gt;
Documentation on the Game.com hardware is available at [http://gamecom.guruwork.de/ Game.commies].&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
&lt;br /&gt;
The source code is available at http://hg.kodewerx.org/as85/&lt;br /&gt;
&lt;br /&gt;
==Current Progress==&lt;br /&gt;
&lt;br /&gt;
The current state of as85 is &amp;quot;almost usable, but not quite there yet.&amp;quot; A number of bugs exist which need to be fixed before it can be used as a development tool:&lt;br /&gt;
&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=2 Bug 2]: Add support for jump/call/branch instructions&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=3 Bug 3]: Output object code&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=4 Bug 4]: Write a linker&lt;br /&gt;
&lt;br /&gt;
I've also filed a bug about giving the project a better name [http://bugzilla.kodewerx.org/show_bug.cgi?id=5].&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
The program takes one argument; the file name of an sm8521 assembly file. The files in the [http://hg.kodewerx.org/index.cgi/as85/file/tip/examples /examples] directory are a good place to start.&lt;br /&gt;
&lt;br /&gt;
* test.asm is an example of what the beginning of what a Game.com program might look like; it contains a header, and some [random] instructions to give you an idea.&lt;br /&gt;
* test2.asm is for testing the integrity of the parser with complex strings.&lt;br /&gt;
* test3.asm lists all possible sm8521 instructions; for verifying the output binary is correct.&lt;br /&gt;
&lt;br /&gt;
==Example Output==&lt;br /&gt;
&lt;br /&gt;
The following command:&lt;br /&gt;
  $ ./as85 ../examples/test3.asm&lt;br /&gt;
&lt;br /&gt;
Produces the following output:&lt;br /&gt;
  00 01           clr     R1&lt;br /&gt;
  01 01           neg     R1&lt;br /&gt;
  02 01           com     R1&lt;br /&gt;
  03 01           rr      R1&lt;br /&gt;
  04 01           rl      R1&lt;br /&gt;
  05 01           rrc     R1&lt;br /&gt;
  06 01           rlc     R1&lt;br /&gt;
  07 01           srl     R1&lt;br /&gt;
  08 01           inc     R1&lt;br /&gt;
  09 01           dec     R1&lt;br /&gt;
  0A 01           sra     R1&lt;br /&gt;
  0B 01           sll     R1&lt;br /&gt;
  0C 01           da      R1&lt;br /&gt;
  0D 01           swap    R1&lt;br /&gt;
  0E 01           push    R1&lt;br /&gt;
  0F 01           pop     R1&lt;br /&gt;
  10 0A           cmp     r1, r2&lt;br /&gt;
  11 0A           add     r1, r2&lt;br /&gt;
  12 0A           sub     r1, r2&lt;br /&gt;
  13 0A           adc     r1, r2&lt;br /&gt;
  14 0A           sbc     r1, r2&lt;br /&gt;
  15 0A           and     r1, r2&lt;br /&gt;
  16 0A           or      r1, r2&lt;br /&gt;
  17 0A           xor     r1, r2&lt;br /&gt;
  18 02           incw    RR2&lt;br /&gt;
  19 02           decw    RR2&lt;br /&gt;
  1A 08           clr     @r1&lt;br /&gt;
  1A 09           neg     @r1&lt;br /&gt;
  1A 0A           com     @r1&lt;br /&gt;
  1A 0B           rr      @r1&lt;br /&gt;
  1A 0C           rl      @r1&lt;br /&gt;
  1A 0D           rrc     @r1&lt;br /&gt;
  1A 0E           rlc     @r1&lt;br /&gt;
  1A 0F           srl     @r1&lt;br /&gt;
  1B 08           inc     @r1&lt;br /&gt;
  1B 09           dec     @r1&lt;br /&gt;
  1B 0A           sra     @r1&lt;br /&gt;
  1B 0B           sll     @r1&lt;br /&gt;
  1B 0C           da      @r1&lt;br /&gt;
  1B 0D           swap    @r1&lt;br /&gt;
  1B 0E           push    @r1&lt;br /&gt;
  1B 0F           pop     @r1&lt;br /&gt;
  1C 07 24        bclr    0xFF24, #7&lt;br /&gt;
  1C 0F 94        bclr    0x94(r1), #7&lt;br /&gt;
  1D 07 24        bset    0xFF24, #7&lt;br /&gt;
  1D 0F 94        bset    0x94(r1), #7&lt;br /&gt;
  1E 02           pushw   RR2&lt;br /&gt;
  1F 02           popw    RR2&lt;br /&gt;
  20 0A           cmp     r1, @r2&lt;br /&gt;
  20 4A           cmp     r1, (r2)+&lt;br /&gt;
  20 88 94        cmp     r1, @0x94&lt;br /&gt;
  20 8A 94        cmp     r1, 0x94(r2)&lt;br /&gt;
  20 CA           cmp     r1, -(r2)&lt;br /&gt;
  21 0A           add     r1, @r2&lt;br /&gt;
  21 4A           add     r1, (r2)+&lt;br /&gt;
  21 88 94        add     r1, @0x94&lt;br /&gt;
  21 8A 94        add     r1, 0x94(r2)&lt;br /&gt;
  21 CA           add     r1, -(r2)&lt;br /&gt;
  22 0A           sub     r1, @r2&lt;br /&gt;
  22 4A           sub     r1, (r2)+&lt;br /&gt;
  22 88 94        sub     r1, @0x94&lt;br /&gt;
  22 8A 94        sub     r1, 0x94(r2)&lt;br /&gt;
  22 CA           sub     r1, -(r2)&lt;br /&gt;
  23 0A           adc     r1, @r2&lt;br /&gt;
  23 4A           adc     r1, (r2)+&lt;br /&gt;
  23 88 94        adc     r1, @0x94&lt;br /&gt;
  23 8A 94        adc     r1, 0x94(r2)&lt;br /&gt;
  23 CA           adc     r1, -(r2)&lt;br /&gt;
  24 0A           sbc     r1, @r2&lt;br /&gt;
  24 4A           sbc     r1, (r2)+&lt;br /&gt;
  24 88 94        sbc     r1, @0x94&lt;br /&gt;
  24 8A 94        sbc     r1, 0x94(r2)&lt;br /&gt;
  24 CA           sbc     r1, -(r2)&lt;br /&gt;
  25 0A           and     r1, @r2&lt;br /&gt;
  25 4A           and     r1, (r2)+&lt;br /&gt;
  25 88 94        and     r1, @0x94&lt;br /&gt;
  25 8A 94        and     r1, 0x94(r2)&lt;br /&gt;
  25 CA           and     r1, -(r2)&lt;br /&gt;
  26 0A           or      r1, @r2&lt;br /&gt;
  26 4A           or      r1, (r2)+&lt;br /&gt;
  26 88 94        or      r1, @0x94&lt;br /&gt;
  26 8A 94        or      r1, 0x94(r2)&lt;br /&gt;
  26 CA           or      r1, -(r2)&lt;br /&gt;
  27 0A           xor     r1, @r2&lt;br /&gt;
  27 4A           xor     r1, (r2)+&lt;br /&gt;
  27 88 94        xor     r1, @0x94&lt;br /&gt;
  27 8A 94        xor     r1, 0x94(r2)&lt;br /&gt;
  27 CA           xor     r1, -(r2)&lt;br /&gt;
  28 0A           mov     r1, @r2&lt;br /&gt;
  28 4A           mov     r1, (r2)+&lt;br /&gt;
  28 88 94        mov     r1, @0x94&lt;br /&gt;
  28 8A 94        mov     r1, 0x94(r2)&lt;br /&gt;
  28 CA           mov     r1, -(r2)&lt;br /&gt;
  29 11           mov     @r1, r2&lt;br /&gt;
  29 51           mov     (r1)+, r2&lt;br /&gt;
  29 90 94        mov     @0x94, r2&lt;br /&gt;
  29 91 94        mov     0x94(r1), r2&lt;br /&gt;
  29 D1           mov     -(r1), r2&lt;br /&gt;
  2C 02           exts    RR2&lt;br /&gt;
  2E 94           mov     ps0, #0x94&lt;br /&gt;
  2F 94 01        btst    R1, #0x94&lt;br /&gt;
  30 09           cmp     r1, @rr2&lt;br /&gt;
  30 49           cmp     r1, (rr2)+&lt;br /&gt;
  30 88 24 94     cmp     r1, @0x9424&lt;br /&gt;
  30 89 24 94     cmp     r1, 0x9424(rr2)&lt;br /&gt;
  30 C9           cmp     r1, -(rr2)&lt;br /&gt;
  31 09           add     r1, @rr2&lt;br /&gt;
  31 49           add     r1, (rr2)+&lt;br /&gt;
  31 88 24 94     add     r1, @0x9424&lt;br /&gt;
  31 89 24 94     add     r1, 0x9424(rr2)&lt;br /&gt;
  31 C9           add     r1, -(rr2)&lt;br /&gt;
  32 09           sub     r1, @rr2&lt;br /&gt;
  32 49           sub     r1, (rr2)+&lt;br /&gt;
  32 88 24 94     sub     r1, @0x9424&lt;br /&gt;
  32 89 24 94     sub     r1, 0x9424(rr2)&lt;br /&gt;
  32 C9           sub     r1, -(rr2)&lt;br /&gt;
  33 09           adc     r1, @rr2&lt;br /&gt;
  33 49           adc     r1, (rr2)+&lt;br /&gt;
  33 88 24 94     adc     r1, @0x9424&lt;br /&gt;
  33 89 24 94     adc     r1, 0x9424(rr2)&lt;br /&gt;
  33 C9           adc     r1, -(rr2)&lt;br /&gt;
  34 09           sbc     r1, @rr2&lt;br /&gt;
  34 49           sbc     r1, (rr2)+&lt;br /&gt;
  34 88 24 94     sbc     r1, @0x9424&lt;br /&gt;
  34 89 24 94     sbc     r1, 0x9424(rr2)&lt;br /&gt;
  34 C9           sbc     r1, -(rr2)&lt;br /&gt;
  35 09           and     r1, @rr2&lt;br /&gt;
  35 49           and     r1, (rr2)+&lt;br /&gt;
  35 88 24 94     and     r1, @0x9424&lt;br /&gt;
  35 89 24 94     and     r1, 0x9424(rr2)&lt;br /&gt;
  35 C9           and     r1, -(rr2)&lt;br /&gt;
  36 09           or      r1, @rr2&lt;br /&gt;
  36 49           or      r1, (rr2)+&lt;br /&gt;
  36 88 24 94     or      r1, @0x9424&lt;br /&gt;
  36 89 24 94     or      r1, 0x9424(rr2)&lt;br /&gt;
  36 C9           or      r1, -(rr2)&lt;br /&gt;
  37 09           xor     r1, @rr2&lt;br /&gt;
  37 49           xor     r1, (rr2)+&lt;br /&gt;
  37 88 24 94     xor     r1, @0x9424&lt;br /&gt;
  37 89 24 94     xor     r1, 0x9424(rr2)&lt;br /&gt;
  37 C9           xor     r1, -(rr2)&lt;br /&gt;
  38 09           mov     r1, @rr2&lt;br /&gt;
  38 49           mov     r1, (rr2)+&lt;br /&gt;
  38 88 24 94     mov     r1, @0x9424&lt;br /&gt;
  38 89 24 94     mov     r1, 0x9424(rr2)&lt;br /&gt;
  38 C9           mov     r1, -(rr2)&lt;br /&gt;
  39 21           mov     @rr2, r4&lt;br /&gt;
  39 61           mov     (rr2)+, r4&lt;br /&gt;
  39 A0 24 94     mov     @0x9424, r4&lt;br /&gt;
  39 A1 24 94     mov     0x9424(rr2), r4&lt;br /&gt;
  39 E1           mov     -(rr2), r4&lt;br /&gt;
  3A 14           movw    rr2, @rr4&lt;br /&gt;
  3A 54           movw    rr2, (rr4)+&lt;br /&gt;
  3A 90 24 94     movw    rr2, @0x9424&lt;br /&gt;
  3A 94 24 94     movw    rr2, 0x9424(rr4)&lt;br /&gt;
  3A D4           movw    rr2, -(rr4)&lt;br /&gt;
  3B 22           movw    @rr2, rr4&lt;br /&gt;
  3B 62           movw    (rr2)+, rr4&lt;br /&gt;
  3B A0 24 94     movw    @0x9424, rr4&lt;br /&gt;
  3B A2 24 94     movw    0x9424(rr2), rr4&lt;br /&gt;
  3B E2           movw    -(rr2), rr4&lt;br /&gt;
  3C 14           movw    rr2, rr4&lt;br /&gt;
  40 02 01        cmp     R1, R2&lt;br /&gt;
  41 02 01        add     R1, R2&lt;br /&gt;
  42 02 01        sub     R1, R2&lt;br /&gt;
  43 02 01        adc     R1, R2&lt;br /&gt;
  44 02 01        sbc     R1, R2&lt;br /&gt;
  45 02 01        and     R1, R2&lt;br /&gt;
  46 02 01        or      R1, R2&lt;br /&gt;
  47 02 01        xor     R1, R2&lt;br /&gt;
  48 02 01        mov     R1, R2&lt;br /&gt;
  4A 04 02        movw    RR2, RR4&lt;br /&gt;
  4B 02 24 94     movw    RR2, #0x9424&lt;br /&gt;
  4C 04 02        mult    RR2, R4&lt;br /&gt;
  4D 94 02        mult    RR2, #0x94&lt;br /&gt;
  4E 07 01        bmov    bf, R1, #7&lt;br /&gt;
  4E 47 01        bmov    R1, #7, bf&lt;br /&gt;
  4F 07 01        bcmp    bf, R1, #7&lt;br /&gt;
  4F 47 01        band    bf, R1, #7&lt;br /&gt;
  4F 87 01        bor     bf, R1, #7&lt;br /&gt;
  4F C7 01        bxor    bf, R1, #7&lt;br /&gt;
  50 94 01        cmp     R1, #0x94&lt;br /&gt;
  51 94 01        add     R1, #0x94&lt;br /&gt;
  52 94 01        sub     R1, #0x94&lt;br /&gt;
  53 94 01        adc     R1, #0x94&lt;br /&gt;
  54 94 01        sbc     R1, #0x94&lt;br /&gt;
  55 94 01        and     R1, #0x94&lt;br /&gt;
  56 94 01        or      R1, #0x94&lt;br /&gt;
  57 94 01        xor     R1, #0x94&lt;br /&gt;
  58 94 01        mov     R1, #0x94&lt;br /&gt;
  5C 04 02        div     RR2, RR4&lt;br /&gt;
  5D 94 02        div     RR2, #0x94&lt;br /&gt;
  5E 01 94 02     movm    R1, #0x94, R2&lt;br /&gt;
  5F 01 94 24     movm    R1, #0x94, #0x24&lt;br /&gt;
  60 04 02        cmpw    RR2, RR4&lt;br /&gt;
  61 04 02        addw    RR2, RR4&lt;br /&gt;
  62 04 02        subw    RR2, RR4&lt;br /&gt;
  63 04 02        adcw    RR2, RR4&lt;br /&gt;
  64 04 02        sbcw    RR2, RR4&lt;br /&gt;
  65 04 02        andw    RR2, RR4&lt;br /&gt;
  66 04 02        orw     RR2, RR4&lt;br /&gt;
  67 04 02        xorw    RR2, RR4&lt;br /&gt;
  68 02 24 94     cmpw    RR2, #0x9424&lt;br /&gt;
  69 02 24 94     addw    RR2, #0x9424&lt;br /&gt;
  6A 02 24 94     subw    RR2, #0x9424&lt;br /&gt;
  6B 02 24 94     adcw    RR2, #0x9424&lt;br /&gt;
  6C 02 24 94     sbcw    RR2, #0x9424&lt;br /&gt;
  6D 02 24 94     andw    RR2, #0x9424&lt;br /&gt;
  6E 02 24 94     orw     RR2, #0x9424&lt;br /&gt;
  6F 02 24 94     xorw    RR2, #0x9424&lt;br /&gt;
  78 24 94        movw    rr0, #0x9424&lt;br /&gt;
  79 24 94        movw    rr8, #0x9424&lt;br /&gt;
  7A 24 94        movw    rr2, #0x9424&lt;br /&gt;
  7B 24 94        movw    rr10, #0x9424&lt;br /&gt;
  7C 24 94        movw    rr4, #0x9424&lt;br /&gt;
  7D 24 94        movw    rr12, #0x9424&lt;br /&gt;
  7E 24 94        movw    rr6, #0x9424&lt;br /&gt;
  7F 24 94        movw    rr14, #0x9424&lt;br /&gt;
  A0 01           bclr    R1, #0&lt;br /&gt;
  A1 01           bclr    R1, #1&lt;br /&gt;
  A2 01           bclr    R1, #2&lt;br /&gt;
  A3 01           bclr    R1, #3&lt;br /&gt;
  A4 01           bclr    R1, #4&lt;br /&gt;
  A5 01           bclr    R1, #5&lt;br /&gt;
  A6 01           bclr    R1, #6&lt;br /&gt;
  A7 01           bclr    R1, #7&lt;br /&gt;
  A8 01           bset    R1, #0&lt;br /&gt;
  A9 01           bset    R1, #1&lt;br /&gt;
  AA 01           bset    R1, #2&lt;br /&gt;
  AB 01           bset    R1, #3&lt;br /&gt;
  AC 01           bset    R1, #4&lt;br /&gt;
  AD 01           bset    R1, #5&lt;br /&gt;
  AE 01           bset    R1, #6&lt;br /&gt;
  AF 01           bset    R1, #7&lt;br /&gt;
  B0 01           mov     r0, R1&lt;br /&gt;
  B1 01           mov     r1, R1&lt;br /&gt;
  B2 01           mov     r2, R1&lt;br /&gt;
  B3 01           mov     r3, R1&lt;br /&gt;
  B4 01           mov     r4, R1&lt;br /&gt;
  B5 01           mov     r5, R1&lt;br /&gt;
  B6 01           mov     r6, R1&lt;br /&gt;
  B7 01           mov     r7, R1&lt;br /&gt;
  B8 01           mov     R1, r0&lt;br /&gt;
  B9 01           mov     R1, r1&lt;br /&gt;
  BA 01           mov     R1, r2&lt;br /&gt;
  BB 01           mov     R1, r3&lt;br /&gt;
  BC 01           mov     R1, r4&lt;br /&gt;
  BD 01           mov     R1, r5&lt;br /&gt;
  BE 01           mov     R1, r6&lt;br /&gt;
  BF 01           mov     R1, r7&lt;br /&gt;
  C0 94           mov     r0, #0x94&lt;br /&gt;
  C1 94           mov     r1, #0x94&lt;br /&gt;
  C2 94           mov     r2, #0x94&lt;br /&gt;
  C3 94           mov     r3, #0x94&lt;br /&gt;
  C4 94           mov     r4, #0x94&lt;br /&gt;
  C5 94           mov     r5, #0x94&lt;br /&gt;
  C6 94           mov     r6, #0x94&lt;br /&gt;
  C7 94           mov     r7, #0x94&lt;br /&gt;
  C8 94           mov     ie0, #0x94&lt;br /&gt;
  C9 94           mov     ie1, #0x94&lt;br /&gt;
  CA 94           mov     ir0, #0x94&lt;br /&gt;
  CB 94           mov     ir1, #0x94&lt;br /&gt;
  CC 94           mov     p0, #0x94&lt;br /&gt;
  CD 94           mov     p1, #0x94&lt;br /&gt;
  CE 94           mov     p2, #0x94&lt;br /&gt;
  CF 94           mov     p3, #0x94&lt;br /&gt;
  F0              stop&lt;br /&gt;
  F1              halt&lt;br /&gt;
  F8              ret&lt;br /&gt;
  F9              iret&lt;br /&gt;
  FA              clrc&lt;br /&gt;
  FB              comc&lt;br /&gt;
  FC              setc&lt;br /&gt;
  FD              ei&lt;br /&gt;
  FE              di&lt;br /&gt;
  FF              nop&lt;br /&gt;
  assemble() returned 0: OK&lt;br /&gt;
  Clean up...&lt;br /&gt;
&lt;br /&gt;
Note: The output binary has not been verified to be accurate.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
As85 is a fairly simple assembler. It doesn't use any sort of 'compiler-compiler' for lexical analysis. In fact, its lexical analysis is very specific to the sm8521 MCU.&lt;br /&gt;
&lt;br /&gt;
The main loop (assemble() function, defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l315 asm.c]) does the input text parsing inline. (This should probably be moved out to a new source file.) After splitting a line into two pieces; op[0] containing the instruction, and op[1] containing its operands; a string comparison against op[0] is done over all supported instructions. If a match is found, the operands string is passed to a dynamically chosen function (from a [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/inst.c#l156 function pointer table], indexed by the matched instruction). This function performs the lexical analysis required to decide which instruction we are trying to assemble.&lt;br /&gt;
&lt;br /&gt;
Since the sm8521 is a CISC machine, its instruction set contains a number of different ways to assemble the same instruction mnemonic. For example, several different addressing modes for the ''mov'' instruction are shown above in the test3.asm output. The lexical analysis is the voodoo which picks the proper addressing mode and byte codes by analyzing the operands.&lt;br /&gt;
&lt;br /&gt;
The lexical analyzing functions are defined in inst.c (following the function pointer table mentioned previously). The function handling the current instruction will test the operands string against a series of lexical patterns with the [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l89 chk_pattern()] function (defined in asm.c, although this should probably be moved).&lt;br /&gt;
&lt;br /&gt;
chk_pattern() uses a scanf-like formatting string, rather than a regular expression, which is more common in lexical analysis. Documentation for the formatting string can be found in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/inst.h#l29 inst.h]. With just a few pattern primitives, any of the sm8521's addressing modes can be matched, with the matching primitives output as part of an array. It makes good use of the format scanners defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/scan.c scan.c].&lt;br /&gt;
&lt;br /&gt;
If chk_pattern() manages to find a match, the matching data may be further checked for validity on a per-context basis. Finally, the full instruction byte codes will be put together and returned to the assemble() loop. This is where the object code would be built. Currently the only thing that happens now is dumping the assembled instruction to stdout, in a debug build. [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l464]&lt;br /&gt;
&lt;br /&gt;
===Optimization Concerns===&lt;br /&gt;
Some optimization could be done within this lexical analysis process. The first improvement would be replacing the linear string comparison with a binary tree. The second thing that would help in this immediate area would be replacing the string comparison itself with a hash comparison. The hash algorithm would have to be suitably small and fast enough to make much of a difference.&lt;br /&gt;
&lt;br /&gt;
The next big optimization would be rearranging the chk_pattern() calls within each lexical analyzer to check the most likely patterns first. The best way to choose the best order is static analysis of sm8521 source code, which is obviously in very short supply. Accurate disassemblies of commercial Game.com games would be helpful to this end, however.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=As85&amp;diff=881</id>
		<title>As85</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=As85&amp;diff=881"/>
				<updated>2009-02-28T01:55:11Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;as85 is a simple assembler for the Sharp sm8521; the same microcontroller used in the Tiger Game.com. Game.com was released in 1998 and had only a few games ever made for it. It also has not had any homebrew games made for it. as85 is an attempt to build an assembler that will help hackers write homebrew code that will run on Game.com hardware.&lt;br /&gt;
&lt;br /&gt;
Documentation on the Game.com hardware is available at [http://gamecom.guruwork.de/ Game.commies].&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
&lt;br /&gt;
The source code is available at http://hg.kodewerx.org/as85/&lt;br /&gt;
&lt;br /&gt;
==Current Progress==&lt;br /&gt;
&lt;br /&gt;
The current state of as85 is &amp;quot;almost usable, but not quite there yet.&amp;quot; A number of bugs exist which need to be fixed before it can be used as a development tool:&lt;br /&gt;
&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=2 Bug 2]: Add support for jump/call/branch instructions&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=3 Bug 3]: Output object code&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=4 Bug 4]: Write a linker&lt;br /&gt;
&lt;br /&gt;
I've also filed a bug about giving the project a better name [http://bugzilla.kodewerx.org/show_bug.cgi?id=5].&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
The program takes one argument; the file name of an sm8521 assembly file. The files in the [http://hg.kodewerx.org/index.cgi/as85/file/tip/examples /examples] directory are a good place to start.&lt;br /&gt;
&lt;br /&gt;
* test.asm is an example of what the beginning of what a Game.com program might look like; it contains a header, and some [random] instructions to give you an idea.&lt;br /&gt;
* test2.asm is for testing the integrity of the parser with complex strings.&lt;br /&gt;
* test3.asm lists all possible sm8521 instructions; for verifying the output binary is correct.&lt;br /&gt;
&lt;br /&gt;
==Example Output==&lt;br /&gt;
&lt;br /&gt;
The following command:&lt;br /&gt;
  $ ./as85 ../examples/test3.asm&lt;br /&gt;
&lt;br /&gt;
Produces the following output:&lt;br /&gt;
  00 01           clr     R1&lt;br /&gt;
  01 01           neg     R1&lt;br /&gt;
  02 01           com     R1&lt;br /&gt;
  03 01           rr      R1&lt;br /&gt;
  04 01           rl      R1&lt;br /&gt;
  05 01           rrc     R1&lt;br /&gt;
  06 01           rlc     R1&lt;br /&gt;
  07 01           srl     R1&lt;br /&gt;
  08 01           inc     R1&lt;br /&gt;
  09 01           dec     R1&lt;br /&gt;
  0A 01           sra     R1&lt;br /&gt;
  0B 01           sll     R1&lt;br /&gt;
  0C 01           da      R1&lt;br /&gt;
  0D 01           swap    R1&lt;br /&gt;
  0E 01           push    R1&lt;br /&gt;
  0F 01           pop     R1&lt;br /&gt;
  10 0A           cmp     r1, r2&lt;br /&gt;
  11 0A           add     r1, r2&lt;br /&gt;
  12 0A           sub     r1, r2&lt;br /&gt;
  13 0A           adc     r1, r2&lt;br /&gt;
  14 0A           sbc     r1, r2&lt;br /&gt;
  15 0A           and     r1, r2&lt;br /&gt;
  16 0A           or      r1, r2&lt;br /&gt;
  17 0A           xor     r1, r2&lt;br /&gt;
  18 02           incw    RR2&lt;br /&gt;
  19 02           decw    RR2&lt;br /&gt;
  1A 08           clr     @r1&lt;br /&gt;
  1A 09           neg     @r1&lt;br /&gt;
  1A 0A           com     @r1&lt;br /&gt;
  1A 0B           rr      @r1&lt;br /&gt;
  1A 0C           rl      @r1&lt;br /&gt;
  1A 0D           rrc     @r1&lt;br /&gt;
  1A 0E           rlc     @r1&lt;br /&gt;
  1A 0F           srl     @r1&lt;br /&gt;
  1B 08           inc     @r1&lt;br /&gt;
  1B 09           dec     @r1&lt;br /&gt;
  1B 0A           sra     @r1&lt;br /&gt;
  1B 0B           sll     @r1&lt;br /&gt;
  1B 0C           da      @r1&lt;br /&gt;
  1B 0D           swap    @r1&lt;br /&gt;
  1B 0E           push    @r1&lt;br /&gt;
  1B 0F           pop     @r1&lt;br /&gt;
  1C 07 24        bclr    0xFF24, #7&lt;br /&gt;
  1C 0F 94        bclr    0x94(r1), #7&lt;br /&gt;
  1D 07 24        bset    0xFF24, #7&lt;br /&gt;
  1D 0F 94        bset    0x94(r1), #7&lt;br /&gt;
  1E 02           pushw   RR2&lt;br /&gt;
  1F 02           popw    RR2&lt;br /&gt;
  20 0A           cmp     r1, @r2&lt;br /&gt;
  20 4A           cmp     r1, (r2)+&lt;br /&gt;
  20 88 94        cmp     r1, @0x94&lt;br /&gt;
  20 8A 94        cmp     r1, 0x94(r2)&lt;br /&gt;
  20 CA           cmp     r1, -(r2)&lt;br /&gt;
  21 0A           add     r1, @r2&lt;br /&gt;
  21 4A           add     r1, (r2)+&lt;br /&gt;
  21 88 94        add     r1, @0x94&lt;br /&gt;
  21 8A 94        add     r1, 0x94(r2)&lt;br /&gt;
  21 CA           add     r1, -(r2)&lt;br /&gt;
  22 0A           sub     r1, @r2&lt;br /&gt;
  22 4A           sub     r1, (r2)+&lt;br /&gt;
  22 88 94        sub     r1, @0x94&lt;br /&gt;
  22 8A 94        sub     r1, 0x94(r2)&lt;br /&gt;
  22 CA           sub     r1, -(r2)&lt;br /&gt;
  23 0A           adc     r1, @r2&lt;br /&gt;
  23 4A           adc     r1, (r2)+&lt;br /&gt;
  23 88 94        adc     r1, @0x94&lt;br /&gt;
  23 8A 94        adc     r1, 0x94(r2)&lt;br /&gt;
  23 CA           adc     r1, -(r2)&lt;br /&gt;
  24 0A           sbc     r1, @r2&lt;br /&gt;
  24 4A           sbc     r1, (r2)+&lt;br /&gt;
  24 88 94        sbc     r1, @0x94&lt;br /&gt;
  24 8A 94        sbc     r1, 0x94(r2)&lt;br /&gt;
  24 CA           sbc     r1, -(r2)&lt;br /&gt;
  25 0A           and     r1, @r2&lt;br /&gt;
  25 4A           and     r1, (r2)+&lt;br /&gt;
  25 88 94        and     r1, @0x94&lt;br /&gt;
  25 8A 94        and     r1, 0x94(r2)&lt;br /&gt;
  25 CA           and     r1, -(r2)&lt;br /&gt;
  26 0A           or      r1, @r2&lt;br /&gt;
  26 4A           or      r1, (r2)+&lt;br /&gt;
  26 88 94        or      r1, @0x94&lt;br /&gt;
  26 8A 94        or      r1, 0x94(r2)&lt;br /&gt;
  26 CA           or      r1, -(r2)&lt;br /&gt;
  27 0A           xor     r1, @r2&lt;br /&gt;
  27 4A           xor     r1, (r2)+&lt;br /&gt;
  27 88 94        xor     r1, @0x94&lt;br /&gt;
  27 8A 94        xor     r1, 0x94(r2)&lt;br /&gt;
  27 CA           xor     r1, -(r2)&lt;br /&gt;
  28 0A           mov     r1, @r2&lt;br /&gt;
  28 4A           mov     r1, (r2)+&lt;br /&gt;
  28 88 94        mov     r1, @0x94&lt;br /&gt;
  28 8A 94        mov     r1, 0x94(r2)&lt;br /&gt;
  28 CA           mov     r1, -(r2)&lt;br /&gt;
  29 11           mov     @r1, r2&lt;br /&gt;
  29 51           mov     (r1)+, r2&lt;br /&gt;
  29 90 94        mov     @0x94, r2&lt;br /&gt;
  29 91 94        mov     0x94(r1), r2&lt;br /&gt;
  29 D1           mov     -(r1), r2&lt;br /&gt;
  2C 02           exts    RR2&lt;br /&gt;
  2E 94           mov     ps0, #0x94&lt;br /&gt;
  2F 94 01        btst    R1, #0x94&lt;br /&gt;
  30 09           cmp     r1, @rr2&lt;br /&gt;
  30 49           cmp     r1, (rr2)+&lt;br /&gt;
  30 88 24 94     cmp     r1, @0x9424&lt;br /&gt;
  30 89 24 94     cmp     r1, 0x9424(rr2)&lt;br /&gt;
  30 C9           cmp     r1, -(rr2)&lt;br /&gt;
  31 09           add     r1, @rr2&lt;br /&gt;
  31 49           add     r1, (rr2)+&lt;br /&gt;
  31 88 24 94     add     r1, @0x9424&lt;br /&gt;
  31 89 24 94     add     r1, 0x9424(rr2)&lt;br /&gt;
  31 C9           add     r1, -(rr2)&lt;br /&gt;
  32 09           sub     r1, @rr2&lt;br /&gt;
  32 49           sub     r1, (rr2)+&lt;br /&gt;
  32 88 24 94     sub     r1, @0x9424&lt;br /&gt;
  32 89 24 94     sub     r1, 0x9424(rr2)&lt;br /&gt;
  32 C9           sub     r1, -(rr2)&lt;br /&gt;
  33 09           adc     r1, @rr2&lt;br /&gt;
  33 49           adc     r1, (rr2)+&lt;br /&gt;
  33 88 24 94     adc     r1, @0x9424&lt;br /&gt;
  33 89 24 94     adc     r1, 0x9424(rr2)&lt;br /&gt;
  33 C9           adc     r1, -(rr2)&lt;br /&gt;
  34 09           sbc     r1, @rr2&lt;br /&gt;
  34 49           sbc     r1, (rr2)+&lt;br /&gt;
  34 88 24 94     sbc     r1, @0x9424&lt;br /&gt;
  34 89 24 94     sbc     r1, 0x9424(rr2)&lt;br /&gt;
  34 C9           sbc     r1, -(rr2)&lt;br /&gt;
  35 09           and     r1, @rr2&lt;br /&gt;
  35 49           and     r1, (rr2)+&lt;br /&gt;
  35 88 24 94     and     r1, @0x9424&lt;br /&gt;
  35 89 24 94     and     r1, 0x9424(rr2)&lt;br /&gt;
  35 C9           and     r1, -(rr2)&lt;br /&gt;
  36 09           or      r1, @rr2&lt;br /&gt;
  36 49           or      r1, (rr2)+&lt;br /&gt;
  36 88 24 94     or      r1, @0x9424&lt;br /&gt;
  36 89 24 94     or      r1, 0x9424(rr2)&lt;br /&gt;
  36 C9           or      r1, -(rr2)&lt;br /&gt;
  37 09           xor     r1, @rr2&lt;br /&gt;
  37 49           xor     r1, (rr2)+&lt;br /&gt;
  37 88 24 94     xor     r1, @0x9424&lt;br /&gt;
  37 89 24 94     xor     r1, 0x9424(rr2)&lt;br /&gt;
  37 C9           xor     r1, -(rr2)&lt;br /&gt;
  38 09           mov     r1, @rr2&lt;br /&gt;
  38 49           mov     r1, (rr2)+&lt;br /&gt;
  38 88 24 94     mov     r1, @0x9424&lt;br /&gt;
  38 89 24 94     mov     r1, 0x9424(rr2)&lt;br /&gt;
  38 C9           mov     r1, -(rr2)&lt;br /&gt;
  39 21           mov     @rr2, r4&lt;br /&gt;
  39 61           mov     (rr2)+, r4&lt;br /&gt;
  39 A0 24 94     mov     @0x9424, r4&lt;br /&gt;
  39 A1 24 94     mov     0x9424(rr2), r4&lt;br /&gt;
  39 E1           mov     -(rr2), r4&lt;br /&gt;
  3A 14           movw    rr2, @rr4&lt;br /&gt;
  3A 54           movw    rr2, (rr4)+&lt;br /&gt;
  3A 90 24 94     movw    rr2, @0x9424&lt;br /&gt;
  3A 94 24 94     movw    rr2, 0x9424(rr4)&lt;br /&gt;
  3A D4           movw    rr2, -(rr4)&lt;br /&gt;
  3B 22           movw    @rr2, rr4&lt;br /&gt;
  3B 62           movw    (rr2)+, rr4&lt;br /&gt;
  3B A0 24 94     movw    @0x9424, rr4&lt;br /&gt;
  3B A2 24 94     movw    0x9424(rr2), rr4&lt;br /&gt;
  3B E2           movw    -(rr2), rr4&lt;br /&gt;
  3C 14           movw    rr2, rr4&lt;br /&gt;
  40 02 01        cmp     R1, R2&lt;br /&gt;
  41 02 01        add     R1, R2&lt;br /&gt;
  42 02 01        sub     R1, R2&lt;br /&gt;
  43 02 01        adc     R1, R2&lt;br /&gt;
  44 02 01        sbc     R1, R2&lt;br /&gt;
  45 02 01        and     R1, R2&lt;br /&gt;
  46 02 01        or      R1, R2&lt;br /&gt;
  47 02 01        xor     R1, R2&lt;br /&gt;
  48 02 01        mov     R1, R2&lt;br /&gt;
  4A 04 02        movw    RR2, RR4&lt;br /&gt;
  4B 02 24 94     movw    RR2, #0x9424&lt;br /&gt;
  4C 04 02        mult    RR2, R4&lt;br /&gt;
  4D 94 02        mult    RR2, #0x94&lt;br /&gt;
  4E 07 01        bmov    bf, R1, #7&lt;br /&gt;
  4E 47 01        bmov    R1, #7, bf&lt;br /&gt;
  4F 07 01        bcmp    bf, R1, #7&lt;br /&gt;
  4F 47 01        band    bf, R1, #7&lt;br /&gt;
  4F 87 01        bor     bf, R1, #7&lt;br /&gt;
  4F C7 01        bxor    bf, R1, #7&lt;br /&gt;
  50 94 01        cmp     R1, #0x94&lt;br /&gt;
  51 94 01        add     R1, #0x94&lt;br /&gt;
  52 94 01        sub     R1, #0x94&lt;br /&gt;
  53 94 01        adc     R1, #0x94&lt;br /&gt;
  54 94 01        sbc     R1, #0x94&lt;br /&gt;
  55 94 01        and     R1, #0x94&lt;br /&gt;
  56 94 01        or      R1, #0x94&lt;br /&gt;
  57 94 01        xor     R1, #0x94&lt;br /&gt;
  58 94 01        mov     R1, #0x94&lt;br /&gt;
  5C 04 02        div     RR2, RR4&lt;br /&gt;
  5D 94 02        div     RR2, #0x94&lt;br /&gt;
  5E 01 94 02     movm    R1, #0x94, R2&lt;br /&gt;
  5F 01 94 24     movm    R1, #0x94, #0x24&lt;br /&gt;
  60 04 02        cmpw    RR2, RR4&lt;br /&gt;
  61 04 02        addw    RR2, RR4&lt;br /&gt;
  62 04 02        subw    RR2, RR4&lt;br /&gt;
  63 04 02        adcw    RR2, RR4&lt;br /&gt;
  64 04 02        sbcw    RR2, RR4&lt;br /&gt;
  65 04 02        andw    RR2, RR4&lt;br /&gt;
  66 04 02        orw     RR2, RR4&lt;br /&gt;
  67 04 02        xorw    RR2, RR4&lt;br /&gt;
  68 02 24 94     cmpw    RR2, #0x9424&lt;br /&gt;
  69 02 24 94     addw    RR2, #0x9424&lt;br /&gt;
  6A 02 24 94     subw    RR2, #0x9424&lt;br /&gt;
  6B 02 24 94     adcw    RR2, #0x9424&lt;br /&gt;
  6C 02 24 94     sbcw    RR2, #0x9424&lt;br /&gt;
  6D 02 24 94     andw    RR2, #0x9424&lt;br /&gt;
  6E 02 24 94     orw     RR2, #0x9424&lt;br /&gt;
  6F 02 24 94     xorw    RR2, #0x9424&lt;br /&gt;
  78 24 94        movw    rr0, #0x9424&lt;br /&gt;
  79 24 94        movw    rr8, #0x9424&lt;br /&gt;
  7A 24 94        movw    rr2, #0x9424&lt;br /&gt;
  7B 24 94        movw    rr10, #0x9424&lt;br /&gt;
  7C 24 94        movw    rr4, #0x9424&lt;br /&gt;
  7D 24 94        movw    rr12, #0x9424&lt;br /&gt;
  7E 24 94        movw    rr6, #0x9424&lt;br /&gt;
  7F 24 94        movw    rr14, #0x9424&lt;br /&gt;
  A0 01           bclr    R1, #0&lt;br /&gt;
  A1 01           bclr    R1, #1&lt;br /&gt;
  A2 01           bclr    R1, #2&lt;br /&gt;
  A3 01           bclr    R1, #3&lt;br /&gt;
  A4 01           bclr    R1, #4&lt;br /&gt;
  A5 01           bclr    R1, #5&lt;br /&gt;
  A6 01           bclr    R1, #6&lt;br /&gt;
  A7 01           bclr    R1, #7&lt;br /&gt;
  A8 01           bset    R1, #0&lt;br /&gt;
  A9 01           bset    R1, #1&lt;br /&gt;
  AA 01           bset    R1, #2&lt;br /&gt;
  AB 01           bset    R1, #3&lt;br /&gt;
  AC 01           bset    R1, #4&lt;br /&gt;
  AD 01           bset    R1, #5&lt;br /&gt;
  AE 01           bset    R1, #6&lt;br /&gt;
  AF 01           bset    R1, #7&lt;br /&gt;
  B0 01           mov     r0, R1&lt;br /&gt;
  B1 01           mov     r1, R1&lt;br /&gt;
  B2 01           mov     r2, R1&lt;br /&gt;
  B3 01           mov     r3, R1&lt;br /&gt;
  B4 01           mov     r4, R1&lt;br /&gt;
  B5 01           mov     r5, R1&lt;br /&gt;
  B6 01           mov     r6, R1&lt;br /&gt;
  B7 01           mov     r7, R1&lt;br /&gt;
  B8 01           mov     R1, r0&lt;br /&gt;
  B9 01           mov     R1, r1&lt;br /&gt;
  BA 01           mov     R1, r2&lt;br /&gt;
  BB 01           mov     R1, r3&lt;br /&gt;
  BC 01           mov     R1, r4&lt;br /&gt;
  BD 01           mov     R1, r5&lt;br /&gt;
  BE 01           mov     R1, r6&lt;br /&gt;
  BF 01           mov     R1, r7&lt;br /&gt;
  C0 94           mov     r0, #0x94&lt;br /&gt;
  C1 94           mov     r1, #0x94&lt;br /&gt;
  C2 94           mov     r2, #0x94&lt;br /&gt;
  C3 94           mov     r3, #0x94&lt;br /&gt;
  C4 94           mov     r4, #0x94&lt;br /&gt;
  C5 94           mov     r5, #0x94&lt;br /&gt;
  C6 94           mov     r6, #0x94&lt;br /&gt;
  C7 94           mov     r7, #0x94&lt;br /&gt;
  C8 94           mov     ie0, #0x94&lt;br /&gt;
  C9 94           mov     ie1, #0x94&lt;br /&gt;
  CA 94           mov     ir0, #0x94&lt;br /&gt;
  CB 94           mov     ir1, #0x94&lt;br /&gt;
  CC 94           mov     p0, #0x94&lt;br /&gt;
  CD 94           mov     p1, #0x94&lt;br /&gt;
  CE 94           mov     p2, #0x94&lt;br /&gt;
  CF 94           mov     p3, #0x94&lt;br /&gt;
  F0              stop&lt;br /&gt;
  F1              halt&lt;br /&gt;
  F8              ret&lt;br /&gt;
  F9              iret&lt;br /&gt;
  FA              clrc&lt;br /&gt;
  FB              comc&lt;br /&gt;
  FC              setc&lt;br /&gt;
  FD              ei&lt;br /&gt;
  FE              di&lt;br /&gt;
  FF              nop&lt;br /&gt;
  assemble() returned 0: OK&lt;br /&gt;
  Clean up...&lt;br /&gt;
&lt;br /&gt;
Note: The output binary has not been verified to be accurate.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
As85 is a fairly simple assembler. It doesn't use any sort of 'compiler-compiler' for lexical analysis. In fact, its lexical analysis is very specific to the sm8521 MCU.&lt;br /&gt;
&lt;br /&gt;
The main loop (assemble() function, defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l315 asm.c]) does the input text parsing inline. (This should probably be moved out to a new source file.) After splitting a line into two pieces; op[0] containing the instruction, and op[1] containing its operands; a string comparison against op[0] is done over all supported instructions. If a match is found, the operands string is passed to a dynamically chosen function (from a [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/inst.c#l156 function pointer table], indexed by the matched instruction). This function performs the lexical analysis required to decide which instruction we are trying to assemble.&lt;br /&gt;
&lt;br /&gt;
Since the sm8521 is a CISC machine, its instruction set contains a number of different ways to assemble the same instruction mnemonic. For example, several different addressing modes for the ''mov'' instruction are shown above in the test3.asm output. The lexical analysis is the voodoo which picks the proper addressing mode and byte codes by analyzing the operands.&lt;br /&gt;
&lt;br /&gt;
The lexical analyzing functions are defined in inst.c (following the function pointer table mentioned previously). The function handling the current instruction will test the operands string against a series of lexical patterns with the [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l89 chk_pattern()] function (defined in asm.c, although this should probably be moved).&lt;br /&gt;
&lt;br /&gt;
chk_pattern() uses a scanf-like formatting string, rather than a regular expression, which is more common in lexical analysis. Documentation for the formatting string can be found in inst.h. With just a few pattern primitives, any of the sm8521's addressing modes can be matched, with the matching primitives output as part of an array. It makes good use of the format scanners defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/scan.c scan.c].&lt;br /&gt;
&lt;br /&gt;
If chk_pattern() manages to find a match, the matching data may be further checked for validity on a per-context basis. Finally, the full instruction byte codes will be put together and returned to the assemble() loop. This is where the object code would be built. Currently the only thing that happens now is dumping the assembled instruction to stdout, in a debug build. [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l464]&lt;br /&gt;
&lt;br /&gt;
===Optimization Concerns===&lt;br /&gt;
Some optimization could be done within this lexical analysis process. The first improvement would be replacing the linear string comparison with a binary tree. The second thing that would help in this immediate area would be replacing the string comparison itself with a hash comparison. The hash algorithm would have to be suitably small and fast enough to make much of a difference.&lt;br /&gt;
&lt;br /&gt;
The next big optimization would be rearranging the chk_pattern() calls within each lexical analyzer to check the most likely patterns first. The best way to choose the best order is static analysis of sm8521 source code, which is obviously in very short supply. Accurate disassemblies of commercial Game.com games would be helpful to this end, however.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=As85&amp;diff=880</id>
		<title>As85</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=As85&amp;diff=880"/>
				<updated>2009-02-28T01:52:49Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;as85 is a simple assembler for the Sharp sm8521; the same microcontroller used in the Tiger Game.com. Game.com was released in 1998 and had only a few games ever made for it. It also has not had any homebrew games made for it. as85 is an attempt to build an assembler that will help hackers write homebrew code that will run on Game.com hardware.&lt;br /&gt;
&lt;br /&gt;
Documentation on the Game.com hardware is available at [http://gamecom.guruwork.de/ Game.commies].&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
&lt;br /&gt;
The source code is available at http://hg.kodewerx.org/as85/&lt;br /&gt;
&lt;br /&gt;
==Current Progress==&lt;br /&gt;
&lt;br /&gt;
The current state of as85 is &amp;quot;almost usable, but not quite there yet.&amp;quot; A number of bugs exist which need to be fixed before it can be used as a development tool:&lt;br /&gt;
&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=2 Bug 2]: Add support for jump/call/branch instructions&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=3 Bug 3]: Output object code&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=4 Bug 4]: Write a linker&lt;br /&gt;
&lt;br /&gt;
I've also filed a bug about giving the project a better name [http://bugzilla.kodewerx.org/show_bug.cgi?id=5].&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
The program takes one argument; the file name of an sm8521 assembly file. The files in the [http://hg.kodewerx.org/index.cgi/as85/file/tip/examples /examples] directory are a good place to start.&lt;br /&gt;
&lt;br /&gt;
* test.asm is an example of what the beginning of what a Game.com program might look like; it contains a header, and some [random] instructions to give you an idea.&lt;br /&gt;
* test2.asm is for testing the integrity of the parser with complex strings.&lt;br /&gt;
* test3.asm lists all possible sm8521 instructions; for verifying the output binary is correct.&lt;br /&gt;
&lt;br /&gt;
==Example Output==&lt;br /&gt;
&lt;br /&gt;
The following command:&lt;br /&gt;
  $ ./as85 ../examples/test3.asm&lt;br /&gt;
&lt;br /&gt;
Produces the following output:&lt;br /&gt;
  00 01           clr     R1&lt;br /&gt;
  01 01           neg     R1&lt;br /&gt;
  02 01           com     R1&lt;br /&gt;
  03 01           rr      R1&lt;br /&gt;
  04 01           rl      R1&lt;br /&gt;
  05 01           rrc     R1&lt;br /&gt;
  06 01           rlc     R1&lt;br /&gt;
  07 01           srl     R1&lt;br /&gt;
  08 01           inc     R1&lt;br /&gt;
  09 01           dec     R1&lt;br /&gt;
  0A 01           sra     R1&lt;br /&gt;
  0B 01           sll     R1&lt;br /&gt;
  0C 01           da      R1&lt;br /&gt;
  0D 01           swap    R1&lt;br /&gt;
  0E 01           push    R1&lt;br /&gt;
  0F 01           pop     R1&lt;br /&gt;
  10 0A           cmp     r1, r2&lt;br /&gt;
  11 0A           add     r1, r2&lt;br /&gt;
  12 0A           sub     r1, r2&lt;br /&gt;
  13 0A           adc     r1, r2&lt;br /&gt;
  14 0A           sbc     r1, r2&lt;br /&gt;
  15 0A           and     r1, r2&lt;br /&gt;
  16 0A           or      r1, r2&lt;br /&gt;
  17 0A           xor     r1, r2&lt;br /&gt;
  18 02           incw    RR2&lt;br /&gt;
  19 02           decw    RR2&lt;br /&gt;
  1A 08           clr     @r1&lt;br /&gt;
  1A 09           neg     @r1&lt;br /&gt;
  1A 0A           com     @r1&lt;br /&gt;
  1A 0B           rr      @r1&lt;br /&gt;
  1A 0C           rl      @r1&lt;br /&gt;
  1A 0D           rrc     @r1&lt;br /&gt;
  1A 0E           rlc     @r1&lt;br /&gt;
  1A 0F           srl     @r1&lt;br /&gt;
  1B 08           inc     @r1&lt;br /&gt;
  1B 09           dec     @r1&lt;br /&gt;
  1B 0A           sra     @r1&lt;br /&gt;
  1B 0B           sll     @r1&lt;br /&gt;
  1B 0C           da      @r1&lt;br /&gt;
  1B 0D           swap    @r1&lt;br /&gt;
  1B 0E           push    @r1&lt;br /&gt;
  1B 0F           pop     @r1&lt;br /&gt;
  1C 07 24        bclr    0xFF24, #7&lt;br /&gt;
  1C 0F 94        bclr    0x94(r1), #7&lt;br /&gt;
  1D 07 24        bset    0xFF24, #7&lt;br /&gt;
  1D 0F 94        bset    0x94(r1), #7&lt;br /&gt;
  1E 02           pushw   RR2&lt;br /&gt;
  1F 02           popw    RR2&lt;br /&gt;
  20 0A           cmp     r1, @r2&lt;br /&gt;
  20 4A           cmp     r1, (r2)+&lt;br /&gt;
  20 88 94        cmp     r1, @0x94&lt;br /&gt;
  20 8A 94        cmp     r1, 0x94(r2)&lt;br /&gt;
  20 CA           cmp     r1, -(r2)&lt;br /&gt;
  21 0A           add     r1, @r2&lt;br /&gt;
  21 4A           add     r1, (r2)+&lt;br /&gt;
  21 88 94        add     r1, @0x94&lt;br /&gt;
  21 8A 94        add     r1, 0x94(r2)&lt;br /&gt;
  21 CA           add     r1, -(r2)&lt;br /&gt;
  22 0A           sub     r1, @r2&lt;br /&gt;
  22 4A           sub     r1, (r2)+&lt;br /&gt;
  22 88 94        sub     r1, @0x94&lt;br /&gt;
  22 8A 94        sub     r1, 0x94(r2)&lt;br /&gt;
  22 CA           sub     r1, -(r2)&lt;br /&gt;
  23 0A           adc     r1, @r2&lt;br /&gt;
  23 4A           adc     r1, (r2)+&lt;br /&gt;
  23 88 94        adc     r1, @0x94&lt;br /&gt;
  23 8A 94        adc     r1, 0x94(r2)&lt;br /&gt;
  23 CA           adc     r1, -(r2)&lt;br /&gt;
  24 0A           sbc     r1, @r2&lt;br /&gt;
  24 4A           sbc     r1, (r2)+&lt;br /&gt;
  24 88 94        sbc     r1, @0x94&lt;br /&gt;
  24 8A 94        sbc     r1, 0x94(r2)&lt;br /&gt;
  24 CA           sbc     r1, -(r2)&lt;br /&gt;
  25 0A           and     r1, @r2&lt;br /&gt;
  25 4A           and     r1, (r2)+&lt;br /&gt;
  25 88 94        and     r1, @0x94&lt;br /&gt;
  25 8A 94        and     r1, 0x94(r2)&lt;br /&gt;
  25 CA           and     r1, -(r2)&lt;br /&gt;
  26 0A           or      r1, @r2&lt;br /&gt;
  26 4A           or      r1, (r2)+&lt;br /&gt;
  26 88 94        or      r1, @0x94&lt;br /&gt;
  26 8A 94        or      r1, 0x94(r2)&lt;br /&gt;
  26 CA           or      r1, -(r2)&lt;br /&gt;
  27 0A           xor     r1, @r2&lt;br /&gt;
  27 4A           xor     r1, (r2)+&lt;br /&gt;
  27 88 94        xor     r1, @0x94&lt;br /&gt;
  27 8A 94        xor     r1, 0x94(r2)&lt;br /&gt;
  27 CA           xor     r1, -(r2)&lt;br /&gt;
  28 0A           mov     r1, @r2&lt;br /&gt;
  28 4A           mov     r1, (r2)+&lt;br /&gt;
  28 88 94        mov     r1, @0x94&lt;br /&gt;
  28 8A 94        mov     r1, 0x94(r2)&lt;br /&gt;
  28 CA           mov     r1, -(r2)&lt;br /&gt;
  29 11           mov     @r1, r2&lt;br /&gt;
  29 51           mov     (r1)+, r2&lt;br /&gt;
  29 90 94        mov     @0x94, r2&lt;br /&gt;
  29 91 94        mov     0x94(r1), r2&lt;br /&gt;
  29 D1           mov     -(r1), r2&lt;br /&gt;
  2C 02           exts    RR2&lt;br /&gt;
  2E 94           mov     ps0, #0x94&lt;br /&gt;
  2F 94 01        btst    R1, #0x94&lt;br /&gt;
  30 09           cmp     r1, @rr2&lt;br /&gt;
  30 49           cmp     r1, (rr2)+&lt;br /&gt;
  30 88 24 94     cmp     r1, @0x9424&lt;br /&gt;
  30 89 24 94     cmp     r1, 0x9424(rr2)&lt;br /&gt;
  30 C9           cmp     r1, -(rr2)&lt;br /&gt;
  31 09           add     r1, @rr2&lt;br /&gt;
  31 49           add     r1, (rr2)+&lt;br /&gt;
  31 88 24 94     add     r1, @0x9424&lt;br /&gt;
  31 89 24 94     add     r1, 0x9424(rr2)&lt;br /&gt;
  31 C9           add     r1, -(rr2)&lt;br /&gt;
  32 09           sub     r1, @rr2&lt;br /&gt;
  32 49           sub     r1, (rr2)+&lt;br /&gt;
  32 88 24 94     sub     r1, @0x9424&lt;br /&gt;
  32 89 24 94     sub     r1, 0x9424(rr2)&lt;br /&gt;
  32 C9           sub     r1, -(rr2)&lt;br /&gt;
  33 09           adc     r1, @rr2&lt;br /&gt;
  33 49           adc     r1, (rr2)+&lt;br /&gt;
  33 88 24 94     adc     r1, @0x9424&lt;br /&gt;
  33 89 24 94     adc     r1, 0x9424(rr2)&lt;br /&gt;
  33 C9           adc     r1, -(rr2)&lt;br /&gt;
  34 09           sbc     r1, @rr2&lt;br /&gt;
  34 49           sbc     r1, (rr2)+&lt;br /&gt;
  34 88 24 94     sbc     r1, @0x9424&lt;br /&gt;
  34 89 24 94     sbc     r1, 0x9424(rr2)&lt;br /&gt;
  34 C9           sbc     r1, -(rr2)&lt;br /&gt;
  35 09           and     r1, @rr2&lt;br /&gt;
  35 49           and     r1, (rr2)+&lt;br /&gt;
  35 88 24 94     and     r1, @0x9424&lt;br /&gt;
  35 89 24 94     and     r1, 0x9424(rr2)&lt;br /&gt;
  35 C9           and     r1, -(rr2)&lt;br /&gt;
  36 09           or      r1, @rr2&lt;br /&gt;
  36 49           or      r1, (rr2)+&lt;br /&gt;
  36 88 24 94     or      r1, @0x9424&lt;br /&gt;
  36 89 24 94     or      r1, 0x9424(rr2)&lt;br /&gt;
  36 C9           or      r1, -(rr2)&lt;br /&gt;
  37 09           xor     r1, @rr2&lt;br /&gt;
  37 49           xor     r1, (rr2)+&lt;br /&gt;
  37 88 24 94     xor     r1, @0x9424&lt;br /&gt;
  37 89 24 94     xor     r1, 0x9424(rr2)&lt;br /&gt;
  37 C9           xor     r1, -(rr2)&lt;br /&gt;
  38 09           mov     r1, @rr2&lt;br /&gt;
  38 49           mov     r1, (rr2)+&lt;br /&gt;
  38 88 24 94     mov     r1, @0x9424&lt;br /&gt;
  38 89 24 94     mov     r1, 0x9424(rr2)&lt;br /&gt;
  38 C9           mov     r1, -(rr2)&lt;br /&gt;
  39 21           mov     @rr2, r4&lt;br /&gt;
  39 61           mov     (rr2)+, r4&lt;br /&gt;
  39 A0 24 94     mov     @0x9424, r4&lt;br /&gt;
  39 A1 24 94     mov     0x9424(rr2), r4&lt;br /&gt;
  39 E1           mov     -(rr2), r4&lt;br /&gt;
  3A 14           movw    rr2, @rr4&lt;br /&gt;
  3A 54           movw    rr2, (rr4)+&lt;br /&gt;
  3A 90 24 94     movw    rr2, @0x9424&lt;br /&gt;
  3A 94 24 94     movw    rr2, 0x9424(rr4)&lt;br /&gt;
  3A D4           movw    rr2, -(rr4)&lt;br /&gt;
  3B 22           movw    @rr2, rr4&lt;br /&gt;
  3B 62           movw    (rr2)+, rr4&lt;br /&gt;
  3B A0 24 94     movw    @0x9424, rr4&lt;br /&gt;
  3B A2 24 94     movw    0x9424(rr2), rr4&lt;br /&gt;
  3B E2           movw    -(rr2), rr4&lt;br /&gt;
  3C 14           movw    rr2, rr4&lt;br /&gt;
  40 02 01        cmp     R1, R2&lt;br /&gt;
  41 02 01        add     R1, R2&lt;br /&gt;
  42 02 01        sub     R1, R2&lt;br /&gt;
  43 02 01        adc     R1, R2&lt;br /&gt;
  44 02 01        sbc     R1, R2&lt;br /&gt;
  45 02 01        and     R1, R2&lt;br /&gt;
  46 02 01        or      R1, R2&lt;br /&gt;
  47 02 01        xor     R1, R2&lt;br /&gt;
  48 02 01        mov     R1, R2&lt;br /&gt;
  4A 04 02        movw    RR2, RR4&lt;br /&gt;
  4B 02 24 94     movw    RR2, #0x9424&lt;br /&gt;
  4C 04 02        mult    RR2, R4&lt;br /&gt;
  4D 94 02        mult    RR2, #0x94&lt;br /&gt;
  4E 07 01        bmov    bf, R1, #7&lt;br /&gt;
  4E 47 01        bmov    R1, #7, bf&lt;br /&gt;
  4F 07 01        bcmp    bf, R1, #7&lt;br /&gt;
  4F 47 01        band    bf, R1, #7&lt;br /&gt;
  4F 87 01        bor     bf, R1, #7&lt;br /&gt;
  4F C7 01        bxor    bf, R1, #7&lt;br /&gt;
  50 94 01        cmp     R1, #0x94&lt;br /&gt;
  51 94 01        add     R1, #0x94&lt;br /&gt;
  52 94 01        sub     R1, #0x94&lt;br /&gt;
  53 94 01        adc     R1, #0x94&lt;br /&gt;
  54 94 01        sbc     R1, #0x94&lt;br /&gt;
  55 94 01        and     R1, #0x94&lt;br /&gt;
  56 94 01        or      R1, #0x94&lt;br /&gt;
  57 94 01        xor     R1, #0x94&lt;br /&gt;
  58 94 01        mov     R1, #0x94&lt;br /&gt;
  5C 04 02        div     RR2, RR4&lt;br /&gt;
  5D 94 02        div     RR2, #0x94&lt;br /&gt;
  5E 01 94 02     movm    R1, #0x94, R2&lt;br /&gt;
  5F 01 94 24     movm    R1, #0x94, #0x24&lt;br /&gt;
  60 04 02        cmpw    RR2, RR4&lt;br /&gt;
  61 04 02        addw    RR2, RR4&lt;br /&gt;
  62 04 02        subw    RR2, RR4&lt;br /&gt;
  63 04 02        adcw    RR2, RR4&lt;br /&gt;
  64 04 02        sbcw    RR2, RR4&lt;br /&gt;
  65 04 02        andw    RR2, RR4&lt;br /&gt;
  66 04 02        orw     RR2, RR4&lt;br /&gt;
  67 04 02        xorw    RR2, RR4&lt;br /&gt;
  68 02 24 94     cmpw    RR2, #0x9424&lt;br /&gt;
  69 02 24 94     addw    RR2, #0x9424&lt;br /&gt;
  6A 02 24 94     subw    RR2, #0x9424&lt;br /&gt;
  6B 02 24 94     adcw    RR2, #0x9424&lt;br /&gt;
  6C 02 24 94     sbcw    RR2, #0x9424&lt;br /&gt;
  6D 02 24 94     andw    RR2, #0x9424&lt;br /&gt;
  6E 02 24 94     orw     RR2, #0x9424&lt;br /&gt;
  6F 02 24 94     xorw    RR2, #0x9424&lt;br /&gt;
  78 24 94        movw    rr0, #0x9424&lt;br /&gt;
  79 24 94        movw    rr8, #0x9424&lt;br /&gt;
  7A 24 94        movw    rr2, #0x9424&lt;br /&gt;
  7B 24 94        movw    rr10, #0x9424&lt;br /&gt;
  7C 24 94        movw    rr4, #0x9424&lt;br /&gt;
  7D 24 94        movw    rr12, #0x9424&lt;br /&gt;
  7E 24 94        movw    rr6, #0x9424&lt;br /&gt;
  7F 24 94        movw    rr14, #0x9424&lt;br /&gt;
  A0 01           bclr    R1, #0&lt;br /&gt;
  A1 01           bclr    R1, #1&lt;br /&gt;
  A2 01           bclr    R1, #2&lt;br /&gt;
  A3 01           bclr    R1, #3&lt;br /&gt;
  A4 01           bclr    R1, #4&lt;br /&gt;
  A5 01           bclr    R1, #5&lt;br /&gt;
  A6 01           bclr    R1, #6&lt;br /&gt;
  A7 01           bclr    R1, #7&lt;br /&gt;
  A8 01           bset    R1, #0&lt;br /&gt;
  A9 01           bset    R1, #1&lt;br /&gt;
  AA 01           bset    R1, #2&lt;br /&gt;
  AB 01           bset    R1, #3&lt;br /&gt;
  AC 01           bset    R1, #4&lt;br /&gt;
  AD 01           bset    R1, #5&lt;br /&gt;
  AE 01           bset    R1, #6&lt;br /&gt;
  AF 01           bset    R1, #7&lt;br /&gt;
  B0 01           mov     r0, R1&lt;br /&gt;
  B1 01           mov     r1, R1&lt;br /&gt;
  B2 01           mov     r2, R1&lt;br /&gt;
  B3 01           mov     r3, R1&lt;br /&gt;
  B4 01           mov     r4, R1&lt;br /&gt;
  B5 01           mov     r5, R1&lt;br /&gt;
  B6 01           mov     r6, R1&lt;br /&gt;
  B7 01           mov     r7, R1&lt;br /&gt;
  B8 01           mov     R1, r0&lt;br /&gt;
  B9 01           mov     R1, r1&lt;br /&gt;
  BA 01           mov     R1, r2&lt;br /&gt;
  BB 01           mov     R1, r3&lt;br /&gt;
  BC 01           mov     R1, r4&lt;br /&gt;
  BD 01           mov     R1, r5&lt;br /&gt;
  BE 01           mov     R1, r6&lt;br /&gt;
  BF 01           mov     R1, r7&lt;br /&gt;
  C0 94           mov     r0, #0x94&lt;br /&gt;
  C1 94           mov     r1, #0x94&lt;br /&gt;
  C2 94           mov     r2, #0x94&lt;br /&gt;
  C3 94           mov     r3, #0x94&lt;br /&gt;
  C4 94           mov     r4, #0x94&lt;br /&gt;
  C5 94           mov     r5, #0x94&lt;br /&gt;
  C6 94           mov     r6, #0x94&lt;br /&gt;
  C7 94           mov     r7, #0x94&lt;br /&gt;
  C8 94           mov     ie0, #0x94&lt;br /&gt;
  C9 94           mov     ie1, #0x94&lt;br /&gt;
  CA 94           mov     ir0, #0x94&lt;br /&gt;
  CB 94           mov     ir1, #0x94&lt;br /&gt;
  CC 94           mov     p0, #0x94&lt;br /&gt;
  CD 94           mov     p1, #0x94&lt;br /&gt;
  CE 94           mov     p2, #0x94&lt;br /&gt;
  CF 94           mov     p3, #0x94&lt;br /&gt;
  F0              stop&lt;br /&gt;
  F1              halt&lt;br /&gt;
  F8              ret&lt;br /&gt;
  F9              iret&lt;br /&gt;
  FA              clrc&lt;br /&gt;
  FB              comc&lt;br /&gt;
  FC              setc&lt;br /&gt;
  FD              ei&lt;br /&gt;
  FE              di&lt;br /&gt;
  FF              nop&lt;br /&gt;
  assemble() returned 0: OK&lt;br /&gt;
  Clean up...&lt;br /&gt;
&lt;br /&gt;
Note: The output binary has not been verified to be accurate.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
As85 is a fairly simple assembler. It doesn't use any sort of 'compiler-compiler' for lexical analysis. In fact, its lexical analysis is very specific to the sm8521 MCU.&lt;br /&gt;
&lt;br /&gt;
The main loop (assemble() function, defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l315 asm.c]) does the input text parsing inline. (This should probably be moved out to a new source file.) After splitting a line into two pieces; op[0] containing the instruction, and op[1] containing its operands; a string comparison against op[0] is done over all supported instructions. If a match is found, the operands string is passed to a dynamically chosen function (from a [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/inst.c#l156 function pointer table], indexed by the matched instruction). This function performs the lexical analysis required to decide which instruction we are trying to assemble.&lt;br /&gt;
&lt;br /&gt;
Since the sm8521 is a CISC machine, its instruction set contains a number of different ways to assemble the same instruction mnemonic. For example, several different addressing modes for the ''mov'' instruction are shown above in the test3.asm output. The lexical analysis is the voodoo which picks the proper addressing mode and byte codes.&lt;br /&gt;
&lt;br /&gt;
The lexical analyzing functions are defined in inst.c (following the function pointer table mentioned previously). The function handling the current instruction will test the operands string against a series of lexical patterns with the [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l89 chk_pattern()] function (defined in asm.c, although this should probably be moved).&lt;br /&gt;
&lt;br /&gt;
chk_pattern() uses a scanf-like formatting string, rather than a regular expression, which is more common in lexical analysis. Documentation for the formatting string can be found in inst.h. With just a few pattern primitives, any of the sm8521's addressing modes can be matched, with the matching primitives output as part of an array. It makes good use of the format scanners defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/scan.c scan.c].&lt;br /&gt;
&lt;br /&gt;
If chk_pattern() manages to find a match, the matching data may be further checked for validity on a per-context basis. Finally, the full instruction byte codes will be put together and returned to the assemble() loop. This is where the object code would be built. Currently the only thing that happens now is dumping the assembled instruction to stdout, in a debug build. [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l464]&lt;br /&gt;
&lt;br /&gt;
===Optimization Concerns===&lt;br /&gt;
Some optimization could be done within this lexical analysis process. The first improvement would be replacing the linear string comparison with a binary tree. The second thing that would help in this immediate area would be replacing the string comparison itself with a hash comparison. The hash algorithm would have to be suitably small and fast enough to make much of a difference.&lt;br /&gt;
&lt;br /&gt;
The next big optimization would be rearranging the chk_pattern() calls within each lexical analyzer to check the most likely patterns first. The best way to choose the best order is static analysis of sm8521 source code, which is obviously in very short supply. Accurate disassemblies of commercial Game.com games would be helpful to this end, however.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=As85&amp;diff=879</id>
		<title>As85</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=As85&amp;diff=879"/>
				<updated>2009-02-28T01:51:10Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Development */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;as85 is a simple assembler for the Sharp sm8521; the same microcontroller used in the Tiger Game.com. Game.com was released in 1998 and had only a few games ever made for it. It also has not had any homebrew games made for it. as85 is an attempt to build an assembler that will help hackers write homebrew code that will run on Game.com hardware.&lt;br /&gt;
&lt;br /&gt;
Documentation on the Game.com hardware is available at [http://gamecom.guruwork.de/ Game.commies].&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
&lt;br /&gt;
The source code is available at http://hg.kodewerx.org/as85/&lt;br /&gt;
&lt;br /&gt;
==Current Progress==&lt;br /&gt;
&lt;br /&gt;
The current state of as85 is &amp;quot;almost usable, but not quite there yet.&amp;quot; A number of bugs exist which need to be fixed before it can be used as a development tool:&lt;br /&gt;
&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=2 Bug 2]: Add support for jump/call/branch instructions&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=3 Bug 3]: Output object code&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=4 Bug 4]: Write a linker&lt;br /&gt;
&lt;br /&gt;
I've also filed a bug about giving the project a better name [http://bugzilla.kodewerx.org/show_bug.cgi?id=5].&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
The program takes one argument; the file name of an sm8521 assembly file. The files in the [http://hg.kodewerx.org/index.cgi/as85/file/tip/examples /examples] directory are a good place to start.&lt;br /&gt;
&lt;br /&gt;
* test.asm is an example of what the beginning of what a Game.com program might look like; it contains a header, and some [random] instructions to give you an idea.&lt;br /&gt;
* test2.asm is for testing the integrity of the parser with complex strings.&lt;br /&gt;
* test3.asm lists all possible sm8521 instructions; for verifying the output binary is correct.&lt;br /&gt;
&lt;br /&gt;
==Example Output==&lt;br /&gt;
&lt;br /&gt;
The following command:&lt;br /&gt;
  $ ./as85 ../examples/test3.asm&lt;br /&gt;
&lt;br /&gt;
Produces the following output:&lt;br /&gt;
  00 01           clr     R1&lt;br /&gt;
  01 01           neg     R1&lt;br /&gt;
  02 01           com     R1&lt;br /&gt;
  03 01           rr      R1&lt;br /&gt;
  04 01           rl      R1&lt;br /&gt;
  05 01           rrc     R1&lt;br /&gt;
  06 01           rlc     R1&lt;br /&gt;
  07 01           srl     R1&lt;br /&gt;
  08 01           inc     R1&lt;br /&gt;
  09 01           dec     R1&lt;br /&gt;
  0A 01           sra     R1&lt;br /&gt;
  0B 01           sll     R1&lt;br /&gt;
  0C 01           da      R1&lt;br /&gt;
  0D 01           swap    R1&lt;br /&gt;
  0E 01           push    R1&lt;br /&gt;
  0F 01           pop     R1&lt;br /&gt;
  10 0A           cmp     r1, r2&lt;br /&gt;
  11 0A           add     r1, r2&lt;br /&gt;
  12 0A           sub     r1, r2&lt;br /&gt;
  13 0A           adc     r1, r2&lt;br /&gt;
  14 0A           sbc     r1, r2&lt;br /&gt;
  15 0A           and     r1, r2&lt;br /&gt;
  16 0A           or      r1, r2&lt;br /&gt;
  17 0A           xor     r1, r2&lt;br /&gt;
  18 02           incw    RR2&lt;br /&gt;
  19 02           decw    RR2&lt;br /&gt;
  1A 08           clr     @r1&lt;br /&gt;
  1A 09           neg     @r1&lt;br /&gt;
  1A 0A           com     @r1&lt;br /&gt;
  1A 0B           rr      @r1&lt;br /&gt;
  1A 0C           rl      @r1&lt;br /&gt;
  1A 0D           rrc     @r1&lt;br /&gt;
  1A 0E           rlc     @r1&lt;br /&gt;
  1A 0F           srl     @r1&lt;br /&gt;
  1B 08           inc     @r1&lt;br /&gt;
  1B 09           dec     @r1&lt;br /&gt;
  1B 0A           sra     @r1&lt;br /&gt;
  1B 0B           sll     @r1&lt;br /&gt;
  1B 0C           da      @r1&lt;br /&gt;
  1B 0D           swap    @r1&lt;br /&gt;
  1B 0E           push    @r1&lt;br /&gt;
  1B 0F           pop     @r1&lt;br /&gt;
  1C 07 24        bclr    0xFF24, #7&lt;br /&gt;
  1C 0F 94        bclr    0x94(r1), #7&lt;br /&gt;
  1D 07 24        bset    0xFF24, #7&lt;br /&gt;
  1D 0F 94        bset    0x94(r1), #7&lt;br /&gt;
  1E 02           pushw   RR2&lt;br /&gt;
  1F 02           popw    RR2&lt;br /&gt;
  20 0A           cmp     r1, @r2&lt;br /&gt;
  20 4A           cmp     r1, (r2)+&lt;br /&gt;
  20 88 94        cmp     r1, @0x94&lt;br /&gt;
  20 8A 94        cmp     r1, 0x94(r2)&lt;br /&gt;
  20 CA           cmp     r1, -(r2)&lt;br /&gt;
  21 0A           add     r1, @r2&lt;br /&gt;
  21 4A           add     r1, (r2)+&lt;br /&gt;
  21 88 94        add     r1, @0x94&lt;br /&gt;
  21 8A 94        add     r1, 0x94(r2)&lt;br /&gt;
  21 CA           add     r1, -(r2)&lt;br /&gt;
  22 0A           sub     r1, @r2&lt;br /&gt;
  22 4A           sub     r1, (r2)+&lt;br /&gt;
  22 88 94        sub     r1, @0x94&lt;br /&gt;
  22 8A 94        sub     r1, 0x94(r2)&lt;br /&gt;
  22 CA           sub     r1, -(r2)&lt;br /&gt;
  23 0A           adc     r1, @r2&lt;br /&gt;
  23 4A           adc     r1, (r2)+&lt;br /&gt;
  23 88 94        adc     r1, @0x94&lt;br /&gt;
  23 8A 94        adc     r1, 0x94(r2)&lt;br /&gt;
  23 CA           adc     r1, -(r2)&lt;br /&gt;
  24 0A           sbc     r1, @r2&lt;br /&gt;
  24 4A           sbc     r1, (r2)+&lt;br /&gt;
  24 88 94        sbc     r1, @0x94&lt;br /&gt;
  24 8A 94        sbc     r1, 0x94(r2)&lt;br /&gt;
  24 CA           sbc     r1, -(r2)&lt;br /&gt;
  25 0A           and     r1, @r2&lt;br /&gt;
  25 4A           and     r1, (r2)+&lt;br /&gt;
  25 88 94        and     r1, @0x94&lt;br /&gt;
  25 8A 94        and     r1, 0x94(r2)&lt;br /&gt;
  25 CA           and     r1, -(r2)&lt;br /&gt;
  26 0A           or      r1, @r2&lt;br /&gt;
  26 4A           or      r1, (r2)+&lt;br /&gt;
  26 88 94        or      r1, @0x94&lt;br /&gt;
  26 8A 94        or      r1, 0x94(r2)&lt;br /&gt;
  26 CA           or      r1, -(r2)&lt;br /&gt;
  27 0A           xor     r1, @r2&lt;br /&gt;
  27 4A           xor     r1, (r2)+&lt;br /&gt;
  27 88 94        xor     r1, @0x94&lt;br /&gt;
  27 8A 94        xor     r1, 0x94(r2)&lt;br /&gt;
  27 CA           xor     r1, -(r2)&lt;br /&gt;
  28 0A           mov     r1, @r2&lt;br /&gt;
  28 4A           mov     r1, (r2)+&lt;br /&gt;
  28 88 94        mov     r1, @0x94&lt;br /&gt;
  28 8A 94        mov     r1, 0x94(r2)&lt;br /&gt;
  28 CA           mov     r1, -(r2)&lt;br /&gt;
  29 11           mov     @r1, r2&lt;br /&gt;
  29 51           mov     (r1)+, r2&lt;br /&gt;
  29 90 94        mov     @0x94, r2&lt;br /&gt;
  29 91 94        mov     0x94(r1), r2&lt;br /&gt;
  29 D1           mov     -(r1), r2&lt;br /&gt;
  2C 02           exts    RR2&lt;br /&gt;
  2E 94           mov     ps0, #0x94&lt;br /&gt;
  2F 94 01        btst    R1, #0x94&lt;br /&gt;
  30 09           cmp     r1, @rr2&lt;br /&gt;
  30 49           cmp     r1, (rr2)+&lt;br /&gt;
  30 88 24 94     cmp     r1, @0x9424&lt;br /&gt;
  30 89 24 94     cmp     r1, 0x9424(rr2)&lt;br /&gt;
  30 C9           cmp     r1, -(rr2)&lt;br /&gt;
  31 09           add     r1, @rr2&lt;br /&gt;
  31 49           add     r1, (rr2)+&lt;br /&gt;
  31 88 24 94     add     r1, @0x9424&lt;br /&gt;
  31 89 24 94     add     r1, 0x9424(rr2)&lt;br /&gt;
  31 C9           add     r1, -(rr2)&lt;br /&gt;
  32 09           sub     r1, @rr2&lt;br /&gt;
  32 49           sub     r1, (rr2)+&lt;br /&gt;
  32 88 24 94     sub     r1, @0x9424&lt;br /&gt;
  32 89 24 94     sub     r1, 0x9424(rr2)&lt;br /&gt;
  32 C9           sub     r1, -(rr2)&lt;br /&gt;
  33 09           adc     r1, @rr2&lt;br /&gt;
  33 49           adc     r1, (rr2)+&lt;br /&gt;
  33 88 24 94     adc     r1, @0x9424&lt;br /&gt;
  33 89 24 94     adc     r1, 0x9424(rr2)&lt;br /&gt;
  33 C9           adc     r1, -(rr2)&lt;br /&gt;
  34 09           sbc     r1, @rr2&lt;br /&gt;
  34 49           sbc     r1, (rr2)+&lt;br /&gt;
  34 88 24 94     sbc     r1, @0x9424&lt;br /&gt;
  34 89 24 94     sbc     r1, 0x9424(rr2)&lt;br /&gt;
  34 C9           sbc     r1, -(rr2)&lt;br /&gt;
  35 09           and     r1, @rr2&lt;br /&gt;
  35 49           and     r1, (rr2)+&lt;br /&gt;
  35 88 24 94     and     r1, @0x9424&lt;br /&gt;
  35 89 24 94     and     r1, 0x9424(rr2)&lt;br /&gt;
  35 C9           and     r1, -(rr2)&lt;br /&gt;
  36 09           or      r1, @rr2&lt;br /&gt;
  36 49           or      r1, (rr2)+&lt;br /&gt;
  36 88 24 94     or      r1, @0x9424&lt;br /&gt;
  36 89 24 94     or      r1, 0x9424(rr2)&lt;br /&gt;
  36 C9           or      r1, -(rr2)&lt;br /&gt;
  37 09           xor     r1, @rr2&lt;br /&gt;
  37 49           xor     r1, (rr2)+&lt;br /&gt;
  37 88 24 94     xor     r1, @0x9424&lt;br /&gt;
  37 89 24 94     xor     r1, 0x9424(rr2)&lt;br /&gt;
  37 C9           xor     r1, -(rr2)&lt;br /&gt;
  38 09           mov     r1, @rr2&lt;br /&gt;
  38 49           mov     r1, (rr2)+&lt;br /&gt;
  38 88 24 94     mov     r1, @0x9424&lt;br /&gt;
  38 89 24 94     mov     r1, 0x9424(rr2)&lt;br /&gt;
  38 C9           mov     r1, -(rr2)&lt;br /&gt;
  39 21           mov     @rr2, r4&lt;br /&gt;
  39 61           mov     (rr2)+, r4&lt;br /&gt;
  39 A0 24 94     mov     @0x9424, r4&lt;br /&gt;
  39 A1 24 94     mov     0x9424(rr2), r4&lt;br /&gt;
  39 E1           mov     -(rr2), r4&lt;br /&gt;
  3A 14           movw    rr2, @rr4&lt;br /&gt;
  3A 54           movw    rr2, (rr4)+&lt;br /&gt;
  3A 90 24 94     movw    rr2, @0x9424&lt;br /&gt;
  3A 94 24 94     movw    rr2, 0x9424(rr4)&lt;br /&gt;
  3A D4           movw    rr2, -(rr4)&lt;br /&gt;
  3B 22           movw    @rr2, rr4&lt;br /&gt;
  3B 62           movw    (rr2)+, rr4&lt;br /&gt;
  3B A0 24 94     movw    @0x9424, rr4&lt;br /&gt;
  3B A2 24 94     movw    0x9424(rr2), rr4&lt;br /&gt;
  3B E2           movw    -(rr2), rr4&lt;br /&gt;
  3C 14           movw    rr2, rr4&lt;br /&gt;
  40 02 01        cmp     R1, R2&lt;br /&gt;
  41 02 01        add     R1, R2&lt;br /&gt;
  42 02 01        sub     R1, R2&lt;br /&gt;
  43 02 01        adc     R1, R2&lt;br /&gt;
  44 02 01        sbc     R1, R2&lt;br /&gt;
  45 02 01        and     R1, R2&lt;br /&gt;
  46 02 01        or      R1, R2&lt;br /&gt;
  47 02 01        xor     R1, R2&lt;br /&gt;
  48 02 01        mov     R1, R2&lt;br /&gt;
  4A 04 02        movw    RR2, RR4&lt;br /&gt;
  4B 02 24 94     movw    RR2, #0x9424&lt;br /&gt;
  4C 04 02        mult    RR2, R4&lt;br /&gt;
  4D 94 02        mult    RR2, #0x94&lt;br /&gt;
  4E 07 01        bmov    bf, R1, #7&lt;br /&gt;
  4E 47 01        bmov    R1, #7, bf&lt;br /&gt;
  4F 07 01        bcmp    bf, R1, #7&lt;br /&gt;
  4F 47 01        band    bf, R1, #7&lt;br /&gt;
  4F 87 01        bor     bf, R1, #7&lt;br /&gt;
  4F C7 01        bxor    bf, R1, #7&lt;br /&gt;
  50 94 01        cmp     R1, #0x94&lt;br /&gt;
  51 94 01        add     R1, #0x94&lt;br /&gt;
  52 94 01        sub     R1, #0x94&lt;br /&gt;
  53 94 01        adc     R1, #0x94&lt;br /&gt;
  54 94 01        sbc     R1, #0x94&lt;br /&gt;
  55 94 01        and     R1, #0x94&lt;br /&gt;
  56 94 01        or      R1, #0x94&lt;br /&gt;
  57 94 01        xor     R1, #0x94&lt;br /&gt;
  58 94 01        mov     R1, #0x94&lt;br /&gt;
  5C 04 02        div     RR2, RR4&lt;br /&gt;
  5D 94 02        div     RR2, #0x94&lt;br /&gt;
  5E 01 94 02     movm    R1, #0x94, R2&lt;br /&gt;
  5F 01 94 24     movm    R1, #0x94, #0x24&lt;br /&gt;
  60 04 02        cmpw    RR2, RR4&lt;br /&gt;
  61 04 02        addw    RR2, RR4&lt;br /&gt;
  62 04 02        subw    RR2, RR4&lt;br /&gt;
  63 04 02        adcw    RR2, RR4&lt;br /&gt;
  64 04 02        sbcw    RR2, RR4&lt;br /&gt;
  65 04 02        andw    RR2, RR4&lt;br /&gt;
  66 04 02        orw     RR2, RR4&lt;br /&gt;
  67 04 02        xorw    RR2, RR4&lt;br /&gt;
  68 02 24 94     cmpw    RR2, #0x9424&lt;br /&gt;
  69 02 24 94     addw    RR2, #0x9424&lt;br /&gt;
  6A 02 24 94     subw    RR2, #0x9424&lt;br /&gt;
  6B 02 24 94     adcw    RR2, #0x9424&lt;br /&gt;
  6C 02 24 94     sbcw    RR2, #0x9424&lt;br /&gt;
  6D 02 24 94     andw    RR2, #0x9424&lt;br /&gt;
  6E 02 24 94     orw     RR2, #0x9424&lt;br /&gt;
  6F 02 24 94     xorw    RR2, #0x9424&lt;br /&gt;
  78 24 94        movw    rr0, #0x9424&lt;br /&gt;
  79 24 94        movw    rr8, #0x9424&lt;br /&gt;
  7A 24 94        movw    rr2, #0x9424&lt;br /&gt;
  7B 24 94        movw    rr10, #0x9424&lt;br /&gt;
  7C 24 94        movw    rr4, #0x9424&lt;br /&gt;
  7D 24 94        movw    rr12, #0x9424&lt;br /&gt;
  7E 24 94        movw    rr6, #0x9424&lt;br /&gt;
  7F 24 94        movw    rr14, #0x9424&lt;br /&gt;
  A0 01           bclr    R1, #0&lt;br /&gt;
  A1 01           bclr    R1, #1&lt;br /&gt;
  A2 01           bclr    R1, #2&lt;br /&gt;
  A3 01           bclr    R1, #3&lt;br /&gt;
  A4 01           bclr    R1, #4&lt;br /&gt;
  A5 01           bclr    R1, #5&lt;br /&gt;
  A6 01           bclr    R1, #6&lt;br /&gt;
  A7 01           bclr    R1, #7&lt;br /&gt;
  A8 01           bset    R1, #0&lt;br /&gt;
  A9 01           bset    R1, #1&lt;br /&gt;
  AA 01           bset    R1, #2&lt;br /&gt;
  AB 01           bset    R1, #3&lt;br /&gt;
  AC 01           bset    R1, #4&lt;br /&gt;
  AD 01           bset    R1, #5&lt;br /&gt;
  AE 01           bset    R1, #6&lt;br /&gt;
  AF 01           bset    R1, #7&lt;br /&gt;
  B0 01           mov     r0, R1&lt;br /&gt;
  B1 01           mov     r1, R1&lt;br /&gt;
  B2 01           mov     r2, R1&lt;br /&gt;
  B3 01           mov     r3, R1&lt;br /&gt;
  B4 01           mov     r4, R1&lt;br /&gt;
  B5 01           mov     r5, R1&lt;br /&gt;
  B6 01           mov     r6, R1&lt;br /&gt;
  B7 01           mov     r7, R1&lt;br /&gt;
  B8 01           mov     R1, r0&lt;br /&gt;
  B9 01           mov     R1, r1&lt;br /&gt;
  BA 01           mov     R1, r2&lt;br /&gt;
  BB 01           mov     R1, r3&lt;br /&gt;
  BC 01           mov     R1, r4&lt;br /&gt;
  BD 01           mov     R1, r5&lt;br /&gt;
  BE 01           mov     R1, r6&lt;br /&gt;
  BF 01           mov     R1, r7&lt;br /&gt;
  C0 94           mov     r0, #0x94&lt;br /&gt;
  C1 94           mov     r1, #0x94&lt;br /&gt;
  C2 94           mov     r2, #0x94&lt;br /&gt;
  C3 94           mov     r3, #0x94&lt;br /&gt;
  C4 94           mov     r4, #0x94&lt;br /&gt;
  C5 94           mov     r5, #0x94&lt;br /&gt;
  C6 94           mov     r6, #0x94&lt;br /&gt;
  C7 94           mov     r7, #0x94&lt;br /&gt;
  C8 94           mov     ie0, #0x94&lt;br /&gt;
  C9 94           mov     ie1, #0x94&lt;br /&gt;
  CA 94           mov     ir0, #0x94&lt;br /&gt;
  CB 94           mov     ir1, #0x94&lt;br /&gt;
  CC 94           mov     p0, #0x94&lt;br /&gt;
  CD 94           mov     p1, #0x94&lt;br /&gt;
  CE 94           mov     p2, #0x94&lt;br /&gt;
  CF 94           mov     p3, #0x94&lt;br /&gt;
  F0              stop&lt;br /&gt;
  F1              halt&lt;br /&gt;
  F8              ret&lt;br /&gt;
  F9              iret&lt;br /&gt;
  FA              clrc&lt;br /&gt;
  FB              comc&lt;br /&gt;
  FC              setc&lt;br /&gt;
  FD              ei&lt;br /&gt;
  FE              di&lt;br /&gt;
  FF              nop&lt;br /&gt;
  assemble() returned 0: OK&lt;br /&gt;
  Clean up...&lt;br /&gt;
&lt;br /&gt;
Note: The output binary has not been verified to be accurate.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
As85 is a fairly simple assembler. It doesn't use any sort of 'compiler-compiler' for lexical analysis. In fact, its lexical analysis is very specific to the sm8521 CPU.&lt;br /&gt;
&lt;br /&gt;
The main loop (assemble() function, defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l315 asm.c]) does the input text parsing inline. (This should probably be moved out to a new source file.) After splitting a line into two pieces; op[0] containing the instruction, and op[1] containing its operands; a string comparison against op[0] is done over all supported instructions. If a match is found, the operands string is passed to a dynamically chosen function (from a [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/inst.c#l156 function pointer table], indexed by the matched instruction). This function performs the lexical analysis required to decide which instruction we are trying to assemble.&lt;br /&gt;
&lt;br /&gt;
Since the sm8521 is a CISC machine, its instruction set contains a number of different ways to assemble the same instruction mnemonic. For example, several different addressing modes for the ''mov'' instruction are shown above in the test3.asm output. The lexical analysis is the voodoo which picks the proper addressing mode and byte codes.&lt;br /&gt;
&lt;br /&gt;
The lexical analyzing functions are defined in inst.c (following the function pointer table mentioned previously). The function handling the current instruction will test the operands string against a series of lexical patterns with the [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l89 chk_pattern()] function (defined in asm.c, although this should probably be moved).&lt;br /&gt;
&lt;br /&gt;
chk_pattern() uses a scanf-like formatting string, rather than a regular expression, which is more common in lexical analysis. Documentation for the formatting string can be found in inst.h. With just a few pattern primitives, any of the sm8521's addressing modes can be matched, with the matching primitives output as part of an array. It makes good use of the format scanners defined in [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/scan.c scan.c].&lt;br /&gt;
&lt;br /&gt;
If chk_pattern() manages to find a match, the matching data may be further checked for validity on a per-context basis. Finally, the full instruction byte codes will be put together and returned to the assemble() loop. This is where the object code would be built. Currently the only thing that happens now is dumping the assembled instruction to stdout, in a debug build. [http://hg.kodewerx.org/index.cgi/as85/file/a90c47020126/src/asm.c#l464]&lt;br /&gt;
&lt;br /&gt;
===Optimization Concerns===&lt;br /&gt;
Some optimization could be done within this lexical analysis process. The first improvement would be replacing the linear string comparison with a binary tree. The second thing that would help in this immediate area would be replacing the string comparison itself with a hash comparison. The hash algorithm would have to be suitably small and fast enough to make much of a difference.&lt;br /&gt;
&lt;br /&gt;
The next big optimization would be rearranging the chk_pattern() calls within each lexical analyzer to check the most likely patterns first. The best way to choose the best order is static analysis of sm8521 source code, which is obviously in very short supply. Accurate disassemblies of commercial Game.com games would be helpful to this end, however.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=As85&amp;diff=878</id>
		<title>As85</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=As85&amp;diff=878"/>
				<updated>2009-02-28T01:45:57Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Example Output */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;as85 is a simple assembler for the Sharp sm8521; the same microcontroller used in the Tiger Game.com. Game.com was released in 1998 and had only a few games ever made for it. It also has not had any homebrew games made for it. as85 is an attempt to build an assembler that will help hackers write homebrew code that will run on Game.com hardware.&lt;br /&gt;
&lt;br /&gt;
Documentation on the Game.com hardware is available at [http://gamecom.guruwork.de/ Game.commies].&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
&lt;br /&gt;
The source code is available at http://hg.kodewerx.org/as85/&lt;br /&gt;
&lt;br /&gt;
==Current Progress==&lt;br /&gt;
&lt;br /&gt;
The current state of as85 is &amp;quot;almost usable, but not quite there yet.&amp;quot; A number of bugs exist which need to be fixed before it can be used as a development tool:&lt;br /&gt;
&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=2 Bug 2]: Add support for jump/call/branch instructions&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=3 Bug 3]: Output object code&lt;br /&gt;
* [http://bugzilla.kodewerx.org/show_bug.cgi?id=4 Bug 4]: Write a linker&lt;br /&gt;
&lt;br /&gt;
I've also filed a bug about giving the project a better name [http://bugzilla.kodewerx.org/show_bug.cgi?id=5].&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&lt;br /&gt;
The program takes one argument; the file name of an sm8521 assembly file. The files in the [http://hg.kodewerx.org/index.cgi/as85/file/tip/examples /examples] directory are a good place to start.&lt;br /&gt;
&lt;br /&gt;
* test.asm is an example of what the beginning of what a Game.com program might look like; it contains a header, and some [random] instructions to give you an idea.&lt;br /&gt;
* test2.asm is for testing the integrity of the parser with complex strings.&lt;br /&gt;
* test3.asm lists all possible sm8521 instructions; for verifying the output binary is correct.&lt;br /&gt;
&lt;br /&gt;
==Example Output==&lt;br /&gt;
&lt;br /&gt;
The following command:&lt;br /&gt;
  $ ./as85 ../examples/test3.asm&lt;br /&gt;
&lt;br /&gt;
Produces the following output:&lt;br /&gt;
  00 01           clr     R1&lt;br /&gt;
  01 01           neg     R1&lt;br /&gt;
  02 01           com     R1&lt;br /&gt;
  03 01           rr      R1&lt;br /&gt;
  04 01           rl      R1&lt;br /&gt;
  05 01           rrc     R1&lt;br /&gt;
  06 01           rlc     R1&lt;br /&gt;
  07 01           srl     R1&lt;br /&gt;
  08 01           inc     R1&lt;br /&gt;
  09 01           dec     R1&lt;br /&gt;
  0A 01           sra     R1&lt;br /&gt;
  0B 01           sll     R1&lt;br /&gt;
  0C 01           da      R1&lt;br /&gt;
  0D 01           swap    R1&lt;br /&gt;
  0E 01           push    R1&lt;br /&gt;
  0F 01           pop     R1&lt;br /&gt;
  10 0A           cmp     r1, r2&lt;br /&gt;
  11 0A           add     r1, r2&lt;br /&gt;
  12 0A           sub     r1, r2&lt;br /&gt;
  13 0A           adc     r1, r2&lt;br /&gt;
  14 0A           sbc     r1, r2&lt;br /&gt;
  15 0A           and     r1, r2&lt;br /&gt;
  16 0A           or      r1, r2&lt;br /&gt;
  17 0A           xor     r1, r2&lt;br /&gt;
  18 02           incw    RR2&lt;br /&gt;
  19 02           decw    RR2&lt;br /&gt;
  1A 08           clr     @r1&lt;br /&gt;
  1A 09           neg     @r1&lt;br /&gt;
  1A 0A           com     @r1&lt;br /&gt;
  1A 0B           rr      @r1&lt;br /&gt;
  1A 0C           rl      @r1&lt;br /&gt;
  1A 0D           rrc     @r1&lt;br /&gt;
  1A 0E           rlc     @r1&lt;br /&gt;
  1A 0F           srl     @r1&lt;br /&gt;
  1B 08           inc     @r1&lt;br /&gt;
  1B 09           dec     @r1&lt;br /&gt;
  1B 0A           sra     @r1&lt;br /&gt;
  1B 0B           sll     @r1&lt;br /&gt;
  1B 0C           da      @r1&lt;br /&gt;
  1B 0D           swap    @r1&lt;br /&gt;
  1B 0E           push    @r1&lt;br /&gt;
  1B 0F           pop     @r1&lt;br /&gt;
  1C 07 24        bclr    0xFF24, #7&lt;br /&gt;
  1C 0F 94        bclr    0x94(r1), #7&lt;br /&gt;
  1D 07 24        bset    0xFF24, #7&lt;br /&gt;
  1D 0F 94        bset    0x94(r1), #7&lt;br /&gt;
  1E 02           pushw   RR2&lt;br /&gt;
  1F 02           popw    RR2&lt;br /&gt;
  20 0A           cmp     r1, @r2&lt;br /&gt;
  20 4A           cmp     r1, (r2)+&lt;br /&gt;
  20 88 94        cmp     r1, @0x94&lt;br /&gt;
  20 8A 94        cmp     r1, 0x94(r2)&lt;br /&gt;
  20 CA           cmp     r1, -(r2)&lt;br /&gt;
  21 0A           add     r1, @r2&lt;br /&gt;
  21 4A           add     r1, (r2)+&lt;br /&gt;
  21 88 94        add     r1, @0x94&lt;br /&gt;
  21 8A 94        add     r1, 0x94(r2)&lt;br /&gt;
  21 CA           add     r1, -(r2)&lt;br /&gt;
  22 0A           sub     r1, @r2&lt;br /&gt;
  22 4A           sub     r1, (r2)+&lt;br /&gt;
  22 88 94        sub     r1, @0x94&lt;br /&gt;
  22 8A 94        sub     r1, 0x94(r2)&lt;br /&gt;
  22 CA           sub     r1, -(r2)&lt;br /&gt;
  23 0A           adc     r1, @r2&lt;br /&gt;
  23 4A           adc     r1, (r2)+&lt;br /&gt;
  23 88 94        adc     r1, @0x94&lt;br /&gt;
  23 8A 94        adc     r1, 0x94(r2)&lt;br /&gt;
  23 CA           adc     r1, -(r2)&lt;br /&gt;
  24 0A           sbc     r1, @r2&lt;br /&gt;
  24 4A           sbc     r1, (r2)+&lt;br /&gt;
  24 88 94        sbc     r1, @0x94&lt;br /&gt;
  24 8A 94        sbc     r1, 0x94(r2)&lt;br /&gt;
  24 CA           sbc     r1, -(r2)&lt;br /&gt;
  25 0A           and     r1, @r2&lt;br /&gt;
  25 4A           and     r1, (r2)+&lt;br /&gt;
  25 88 94        and     r1, @0x94&lt;br /&gt;
  25 8A 94        and     r1, 0x94(r2)&lt;br /&gt;
  25 CA           and     r1, -(r2)&lt;br /&gt;
  26 0A           or      r1, @r2&lt;br /&gt;
  26 4A           or      r1, (r2)+&lt;br /&gt;
  26 88 94        or      r1, @0x94&lt;br /&gt;
  26 8A 94        or      r1, 0x94(r2)&lt;br /&gt;
  26 CA           or      r1, -(r2)&lt;br /&gt;
  27 0A           xor     r1, @r2&lt;br /&gt;
  27 4A           xor     r1, (r2)+&lt;br /&gt;
  27 88 94        xor     r1, @0x94&lt;br /&gt;
  27 8A 94        xor     r1, 0x94(r2)&lt;br /&gt;
  27 CA           xor     r1, -(r2)&lt;br /&gt;
  28 0A           mov     r1, @r2&lt;br /&gt;
  28 4A           mov     r1, (r2)+&lt;br /&gt;
  28 88 94        mov     r1, @0x94&lt;br /&gt;
  28 8A 94        mov     r1, 0x94(r2)&lt;br /&gt;
  28 CA           mov     r1, -(r2)&lt;br /&gt;
  29 11           mov     @r1, r2&lt;br /&gt;
  29 51           mov     (r1)+, r2&lt;br /&gt;
  29 90 94        mov     @0x94, r2&lt;br /&gt;
  29 91 94        mov     0x94(r1), r2&lt;br /&gt;
  29 D1           mov     -(r1), r2&lt;br /&gt;
  2C 02           exts    RR2&lt;br /&gt;
  2E 94           mov     ps0, #0x94&lt;br /&gt;
  2F 94 01        btst    R1, #0x94&lt;br /&gt;
  30 09           cmp     r1, @rr2&lt;br /&gt;
  30 49           cmp     r1, (rr2)+&lt;br /&gt;
  30 88 24 94     cmp     r1, @0x9424&lt;br /&gt;
  30 89 24 94     cmp     r1, 0x9424(rr2)&lt;br /&gt;
  30 C9           cmp     r1, -(rr2)&lt;br /&gt;
  31 09           add     r1, @rr2&lt;br /&gt;
  31 49           add     r1, (rr2)+&lt;br /&gt;
  31 88 24 94     add     r1, @0x9424&lt;br /&gt;
  31 89 24 94     add     r1, 0x9424(rr2)&lt;br /&gt;
  31 C9           add     r1, -(rr2)&lt;br /&gt;
  32 09           sub     r1, @rr2&lt;br /&gt;
  32 49           sub     r1, (rr2)+&lt;br /&gt;
  32 88 24 94     sub     r1, @0x9424&lt;br /&gt;
  32 89 24 94     sub     r1, 0x9424(rr2)&lt;br /&gt;
  32 C9           sub     r1, -(rr2)&lt;br /&gt;
  33 09           adc     r1, @rr2&lt;br /&gt;
  33 49           adc     r1, (rr2)+&lt;br /&gt;
  33 88 24 94     adc     r1, @0x9424&lt;br /&gt;
  33 89 24 94     adc     r1, 0x9424(rr2)&lt;br /&gt;
  33 C9           adc     r1, -(rr2)&lt;br /&gt;
  34 09           sbc     r1, @rr2&lt;br /&gt;
  34 49           sbc     r1, (rr2)+&lt;br /&gt;
  34 88 24 94     sbc     r1, @0x9424&lt;br /&gt;
  34 89 24 94     sbc     r1, 0x9424(rr2)&lt;br /&gt;
  34 C9           sbc     r1, -(rr2)&lt;br /&gt;
  35 09           and     r1, @rr2&lt;br /&gt;
  35 49           and     r1, (rr2)+&lt;br /&gt;
  35 88 24 94     and     r1, @0x9424&lt;br /&gt;
  35 89 24 94     and     r1, 0x9424(rr2)&lt;br /&gt;
  35 C9           and     r1, -(rr2)&lt;br /&gt;
  36 09           or      r1, @rr2&lt;br /&gt;
  36 49           or      r1, (rr2)+&lt;br /&gt;
  36 88 24 94     or      r1, @0x9424&lt;br /&gt;
  36 89 24 94     or      r1, 0x9424(rr2)&lt;br /&gt;
  36 C9           or      r1, -(rr2)&lt;br /&gt;
  37 09           xor     r1, @rr2&lt;br /&gt;
  37 49           xor     r1, (rr2)+&lt;br /&gt;
  37 88 24 94     xor     r1, @0x9424&lt;br /&gt;
  37 89 24 94     xor     r1, 0x9424(rr2)&lt;br /&gt;
  37 C9           xor     r1, -(rr2)&lt;br /&gt;
  38 09           mov     r1, @rr2&lt;br /&gt;
  38 49           mov     r1, (rr2)+&lt;br /&gt;
  38 88 24 94     mov     r1, @0x9424&lt;br /&gt;
  38 89 24 94     mov     r1, 0x9424(rr2)&lt;br /&gt;
  38 C9           mov     r1, -(rr2)&lt;br /&gt;
  39 21           mov     @rr2, r4&lt;br /&gt;
  39 61           mov     (rr2)+, r4&lt;br /&gt;
  39 A0 24 94     mov     @0x9424, r4&lt;br /&gt;
  39 A1 24 94     mov     0x9424(rr2), r4&lt;br /&gt;
  39 E1           mov     -(rr2), r4&lt;br /&gt;
  3A 14           movw    rr2, @rr4&lt;br /&gt;
  3A 54           movw    rr2, (rr4)+&lt;br /&gt;
  3A 90 24 94     movw    rr2, @0x9424&lt;br /&gt;
  3A 94 24 94     movw    rr2, 0x9424(rr4)&lt;br /&gt;
  3A D4           movw    rr2, -(rr4)&lt;br /&gt;
  3B 22           movw    @rr2, rr4&lt;br /&gt;
  3B 62           movw    (rr2)+, rr4&lt;br /&gt;
  3B A0 24 94     movw    @0x9424, rr4&lt;br /&gt;
  3B A2 24 94     movw    0x9424(rr2), rr4&lt;br /&gt;
  3B E2           movw    -(rr2), rr4&lt;br /&gt;
  3C 14           movw    rr2, rr4&lt;br /&gt;
  40 02 01        cmp     R1, R2&lt;br /&gt;
  41 02 01        add     R1, R2&lt;br /&gt;
  42 02 01        sub     R1, R2&lt;br /&gt;
  43 02 01        adc     R1, R2&lt;br /&gt;
  44 02 01        sbc     R1, R2&lt;br /&gt;
  45 02 01        and     R1, R2&lt;br /&gt;
  46 02 01        or      R1, R2&lt;br /&gt;
  47 02 01        xor     R1, R2&lt;br /&gt;
  48 02 01        mov     R1, R2&lt;br /&gt;
  4A 04 02        movw    RR2, RR4&lt;br /&gt;
  4B 02 24 94     movw    RR2, #0x9424&lt;br /&gt;
  4C 04 02        mult    RR2, R4&lt;br /&gt;
  4D 94 02        mult    RR2, #0x94&lt;br /&gt;
  4E 07 01        bmov    bf, R1, #7&lt;br /&gt;
  4E 47 01        bmov    R1, #7, bf&lt;br /&gt;
  4F 07 01        bcmp    bf, R1, #7&lt;br /&gt;
  4F 47 01        band    bf, R1, #7&lt;br /&gt;
  4F 87 01        bor     bf, R1, #7&lt;br /&gt;
  4F C7 01        bxor    bf, R1, #7&lt;br /&gt;
  50 94 01        cmp     R1, #0x94&lt;br /&gt;
  51 94 01        add     R1, #0x94&lt;br /&gt;
  52 94 01        sub     R1, #0x94&lt;br /&gt;
  53 94 01        adc     R1, #0x94&lt;br /&gt;
  54 94 01        sbc     R1, #0x94&lt;br /&gt;
  55 94 01        and     R1, #0x94&lt;br /&gt;
  56 94 01        or      R1, #0x94&lt;br /&gt;
  57 94 01        xor     R1, #0x94&lt;br /&gt;
  58 94 01        mov     R1, #0x94&lt;br /&gt;
  5C 04 02        div     RR2, RR4&lt;br /&gt;
  5D 94 02        div     RR2, #0x94&lt;br /&gt;
  5E 01 94 02     movm    R1, #0x94, R2&lt;br /&gt;
  5F 01 94 24     movm    R1, #0x94, #0x24&lt;br /&gt;
  60 04 02        cmpw    RR2, RR4&lt;br /&gt;
  61 04 02        addw    RR2, RR4&lt;br /&gt;
  62 04 02        subw    RR2, RR4&lt;br /&gt;
  63 04 02        adcw    RR2, RR4&lt;br /&gt;
  64 04 02        sbcw    RR2, RR4&lt;br /&gt;
  65 04 02        andw    RR2, RR4&lt;br /&gt;
  66 04 02        orw     RR2, RR4&lt;br /&gt;
  67 04 02        xorw    RR2, RR4&lt;br /&gt;
  68 02 24 94     cmpw    RR2, #0x9424&lt;br /&gt;
  69 02 24 94     addw    RR2, #0x9424&lt;br /&gt;
  6A 02 24 94     subw    RR2, #0x9424&lt;br /&gt;
  6B 02 24 94     adcw    RR2, #0x9424&lt;br /&gt;
  6C 02 24 94     sbcw    RR2, #0x9424&lt;br /&gt;
  6D 02 24 94     andw    RR2, #0x9424&lt;br /&gt;
  6E 02 24 94     orw     RR2, #0x9424&lt;br /&gt;
  6F 02 24 94     xorw    RR2, #0x9424&lt;br /&gt;
  78 24 94        movw    rr0, #0x9424&lt;br /&gt;
  79 24 94        movw    rr8, #0x9424&lt;br /&gt;
  7A 24 94        movw    rr2, #0x9424&lt;br /&gt;
  7B 24 94        movw    rr10, #0x9424&lt;br /&gt;
  7C 24 94        movw    rr4, #0x9424&lt;br /&gt;
  7D 24 94        movw    rr12, #0x9424&lt;br /&gt;
  7E 24 94        movw    rr6, #0x9424&lt;br /&gt;
  7F 24 94        movw    rr14, #0x9424&lt;br /&gt;
  A0 01           bclr    R1, #0&lt;br /&gt;
  A1 01           bclr    R1, #1&lt;br /&gt;
  A2 01           bclr    R1, #2&lt;br /&gt;
  A3 01           bclr    R1, #3&lt;br /&gt;
  A4 01           bclr    R1, #4&lt;br /&gt;
  A5 01           bclr    R1, #5&lt;br /&gt;
  A6 01           bclr    R1, #6&lt;br /&gt;
  A7 01           bclr    R1, #7&lt;br /&gt;
  A8 01           bset    R1, #0&lt;br /&gt;
  A9 01           bset    R1, #1&lt;br /&gt;
  AA 01           bset    R1, #2&lt;br /&gt;
  AB 01           bset    R1, #3&lt;br /&gt;
  AC 01           bset    R1, #4&lt;br /&gt;
  AD 01           bset    R1, #5&lt;br /&gt;
  AE 01           bset    R1, #6&lt;br /&gt;
  AF 01           bset    R1, #7&lt;br /&gt;
  B0 01           mov     r0, R1&lt;br /&gt;
  B1 01           mov     r1, R1&lt;br /&gt;
  B2 01           mov     r2, R1&lt;br /&gt;
  B3 01           mov     r3, R1&lt;br /&gt;
  B4 01           mov     r4, R1&lt;br /&gt;
  B5 01           mov     r5, R1&lt;br /&gt;
  B6 01           mov     r6, R1&lt;br /&gt;
  B7 01           mov     r7, R1&lt;br /&gt;
  B8 01           mov     R1, r0&lt;br /&gt;
  B9 01           mov     R1, r1&lt;br /&gt;
  BA 01           mov     R1, r2&lt;br /&gt;
  BB 01           mov     R1, r3&lt;br /&gt;
  BC 01           mov     R1, r4&lt;br /&gt;
  BD 01           mov     R1, r5&lt;br /&gt;
  BE 01           mov     R1, r6&lt;br /&gt;
  BF 01           mov     R1, r7&lt;br /&gt;
  C0 94           mov     r0, #0x94&lt;br /&gt;
  C1 94           mov     r1, #0x94&lt;br /&gt;
  C2 94           mov     r2, #0x94&lt;br /&gt;
  C3 94           mov     r3, #0x94&lt;br /&gt;
  C4 94           mov     r4, #0x94&lt;br /&gt;
  C5 94           mov     r5, #0x94&lt;br /&gt;
  C6 94           mov     r6, #0x94&lt;br /&gt;
  C7 94           mov     r7, #0x94&lt;br /&gt;
  C8 94           mov     ie0, #0x94&lt;br /&gt;
  C9 94           mov     ie1, #0x94&lt;br /&gt;
  CA 94           mov     ir0, #0x94&lt;br /&gt;
  CB 94           mov     ir1, #0x94&lt;br /&gt;
  CC 94           mov     p0, #0x94&lt;br /&gt;
  CD 94           mov     p1, #0x94&lt;br /&gt;
  CE 94           mov     p2, #0x94&lt;br /&gt;
  CF 94           mov     p3, #0x94&lt;br /&gt;
  F0              stop&lt;br /&gt;
  F1              halt&lt;br /&gt;
  F8              ret&lt;br /&gt;
  F9              iret&lt;br /&gt;
  FA              clrc&lt;br /&gt;
  FB              comc&lt;br /&gt;
  FC              setc&lt;br /&gt;
  FD              ei&lt;br /&gt;
  FE              di&lt;br /&gt;
  FF              nop&lt;br /&gt;
  assemble() returned 0: OK&lt;br /&gt;
  Clean up...&lt;br /&gt;
&lt;br /&gt;
Note: The output binary has not been verified to be accurate.&lt;br /&gt;
&lt;br /&gt;
==Development==&lt;br /&gt;
As85 is a fairly simple assembler. It doesn't use any sort of 'compiler-compiler' for lexical analysis. In fact, its lexical analysis is very specific to the sm8521 CPU.&lt;br /&gt;
&lt;br /&gt;
The main loop (assemble() function, defined in asm.c) does the input text parsing inline. (This should probably be moved out to a new source file.) After splitting a line into two pieces; op[0] containing the instruction, and op[1] containing its operands; a string comparison against op[0] is done over all supported instructions. If a match is found, the operands string is passed to a dynamically chosen function (from a function pointer table, indexed by the matched instruction). This function performs the lexical analysis required to decide which instruction we are trying to assemble.&lt;br /&gt;
&lt;br /&gt;
Since the sm8521 is a CISC machine, its instruction set contains a number of different ways to assemble the same instruction mnemonic. For example, several different addressing modes for the ''mov'' instruction are shown above in the test3.asm output. The lexical analysis is the voodoo which picks the proper addressing mode and byte codes.&lt;br /&gt;
&lt;br /&gt;
The lexical analyzing functions are defined in inst.c (along with the function pointer table mentioned previously). The function handling the current instruction will test the operands string against a series of lexical patterns with the chk_pattern() function (defined in asm.c, although this should probably be moved).&lt;br /&gt;
&lt;br /&gt;
chk_pattern() uses a scanf-like formatting string, rather than a regular expression, which is more common in lexical analysis. Documentation for the formatting string can be found in inst.h. With just a few pattern primitives, any of the sm8521's addressing modes can be matched, with the matching primitives output as part of an array. It makes good use of the format scanners defined in scan.c.&lt;br /&gt;
&lt;br /&gt;
If chk_pattern() manages to find a match, the matching data may be further checked for validity on a per-context basis. Finally, the full instruction byte codes will be put together and returned to the assemble() loop. This is where the object code would be built. Currently the only thing that happens now is dumping the assembled instruction to stdout, in a debug build.&lt;br /&gt;
&lt;br /&gt;
===Optimization Concerns===&lt;br /&gt;
Some optimization could be done within this lexical analysis process. The first improvement would be replacing the linear string comparison with a binary tree. The second thing that would help in this immediate area would be replacing the string comparison itself with a hash comparison. The hash algorithm would have to be suitably small and fast enough to make much of a difference.&lt;br /&gt;
&lt;br /&gt;
The next big optimization would be rearranging the chk_pattern() calls within each lexical analyzer to check the most likely patterns first. The best way to choose the best order is static analysis of sm8521 source code, which is obviously in very short supply. Accurate disassemblies of commercial Game.com games would be helpful to this end, however.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer_Documentation]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:ShinyPalkia&amp;diff=820</id>
		<title>User:ShinyPalkia</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:ShinyPalkia&amp;diff=820"/>
				<updated>2009-02-04T22:34:24Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: New page: ShinyPalkia is a german ds coder from pokemonexperte.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ShinyPalkia is a german ds coder from pokemonexperte.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:Robert&amp;diff=819</id>
		<title>User:Robert</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:Robert&amp;diff=819"/>
				<updated>2009-02-04T00:37:06Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robert is a german mph and ygo serie coder with a little bit knowledge of C and C++.&lt;br /&gt;
His clan is Nvolution Wifi Elite (nweclan.de) he´s mainly playing mph there.&lt;br /&gt;
He is also a really good offset converter.&lt;br /&gt;
&lt;br /&gt;
His Moto:&lt;br /&gt;
One code is the fundament for another greater code.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Metroid_Prime:_Hunters_v1.0_(U)/Action_Replay&amp;diff=818</id>
		<title>Metroid Prime: Hunters v1.0 (U)/Action Replay</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Metroid_Prime:_Hunters_v1.0_(U)/Action_Replay&amp;diff=818"/>
				<updated>2009-02-04T00:35:33Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Robert */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''[[:User:Hextator|Hextator]]''' ==&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Aim Bot Version 3.9.3&lt;br /&gt;
|&lt;br /&gt;
E2000000 00000438&lt;br /&gt;
E59F0428 E9204FFE&lt;br /&gt;
E5DF3454 E5DF2451&lt;br /&gt;
E59F41B0 E1D440B0&lt;br /&gt;
E3140008 13A02000&lt;br /&gt;
1A000002 E3520001&lt;br /&gt;
12833001 13A02001&lt;br /&gt;
E5CF242D E2033003&lt;br /&gt;
E5CF3424 E59F1188&lt;br /&gt;
E5911000 E1510003&lt;br /&gt;
0A000058 E3A02EF3&lt;br /&gt;
E0000291 E0050293&lt;br /&gt;
E59F4170 E0855004&lt;br /&gt;
E0844000 E5948000&lt;br /&gt;
E5959000 E595A01C&lt;br /&gt;
E089900A E0498008&lt;br /&gt;
E5949004 E595A004&lt;br /&gt;
E595B020 E08AA00B&lt;br /&gt;
E04A9009 E5D5A4BA&lt;br /&gt;
E35A0001 12899C02&lt;br /&gt;
02499C0A E594A008&lt;br /&gt;
E5953008 E595B024&lt;br /&gt;
E083300B E04AA003&lt;br /&gt;
E1A03008 EB000049&lt;br /&gt;
E1A03009 EB000047&lt;br /&gt;
E1A0300A EB000045&lt;br /&gt;
E0000898 E0010A9A&lt;br /&gt;
E0800001 EF0D0000&lt;br /&gt;
E1A01009 E2116102&lt;br /&gt;
42611000 E380B901&lt;br /&gt;
E3A03000 E31B0102&lt;br /&gt;
01A0B08B 02833001&lt;br /&gt;
0AFFFFFB E2633011&lt;br /&gt;
E1A00350 E1A01351&lt;br /&gt;
EB000041 EB000086&lt;br /&gt;
E3560000 12600000&lt;br /&gt;
E5840084 E1A00008&lt;br /&gt;
E1A0100A E2106102&lt;br /&gt;
42600000 E2117102&lt;br /&gt;
42611000 EB000036&lt;br /&gt;
EB00007B E3570000&lt;br /&gt;
02600000 E5840088&lt;br /&gt;
E3A01A01 E3560000&lt;br /&gt;
12611000 E5841080&lt;br /&gt;
E3100102 42600000&lt;br /&gt;
E0010090 E1DF26BC&lt;br /&gt;
E08B3291 E1B03FA3&lt;br /&gt;
128BB001 E59F2060&lt;br /&gt;
E0813092 E1B03FA3&lt;br /&gt;
128BB001 E081000B&lt;br /&gt;
E1DF14BA E0800001&lt;br /&gt;
E5941084 E2112102&lt;br /&gt;
42611000 E0000091&lt;br /&gt;
E1A00620 E3520000&lt;br /&gt;
12600000 E5840084&lt;br /&gt;
E59F0278 E2400030&lt;br /&gt;
E8B04FFE E3A00005&lt;br /&gt;
E59FC00C E12FFF1C&lt;br /&gt;
04000130 020D9CB8&lt;br /&gt;
020DA730 037FBB2C&lt;br /&gt;
0B4F6829 E2B912F3&lt;br /&gt;
E3130102 42633000&lt;br /&gt;
E3833901 E3A06000&lt;br /&gt;
E3130102 01A03083&lt;br /&gt;
02866001 0AFFFFFB&lt;br /&gt;
E2666011 E1A08658&lt;br /&gt;
E1A09659 E1A0A65A&lt;br /&gt;
E12FFF1E E92D4008&lt;br /&gt;
E3510000 03A00000&lt;br /&gt;
0A000010 E3500000&lt;br /&gt;
03A00901 0A00000D&lt;br /&gt;
E1A02700 E1A03701&lt;br /&gt;
E1500001 BA000006&lt;br /&gt;
E1500001 03A00A02&lt;br /&gt;
0A000006 E1A01000&lt;br /&gt;
E1A00003 EB000005&lt;br /&gt;
EA000002 E1A00002&lt;br /&gt;
EB000002 E2600901&lt;br /&gt;
E8BD4008 E12FFF1E&lt;br /&gt;
E1A02001 E15200A0&lt;br /&gt;
91A02082 3AFFFFFC&lt;br /&gt;
E3A03000 E1500002&lt;br /&gt;
E0A33003 20400002&lt;br /&gt;
E1320001 11A020A2&lt;br /&gt;
1AFFFFF9 E1A01000&lt;br /&gt;
E1A00003 E0010090&lt;br /&gt;
E1A01741 E2611000&lt;br /&gt;
E3A030A9 E0030391&lt;br /&gt;
E1A03743 E2833E39&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833C09 E283301C&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833EFA E2833016&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833D5A E283302A&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833D82 E2833001&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833C36 E2833051&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833CA2 E28330F9&lt;br /&gt;
E0000093 E1A00840&lt;br /&gt;
E12FFF1E E1A00120&lt;br /&gt;
E3A0101C E1500001&lt;br /&gt;
BA000034 E3A01EFE&lt;br /&gt;
E1500001 B1A02000&lt;br /&gt;
B0000092 B3A01077&lt;br /&gt;
B00B0091 B59F10B8&lt;br /&gt;
B0000291 B1A0B9AB&lt;br /&gt;
B1A00820 B040000B&lt;br /&gt;
B3A01035 B0400001&lt;br /&gt;
A3A00906 AA000025&lt;br /&gt;
E3A01C0D E1500001&lt;br /&gt;
A1A01000 A0000091&lt;br /&gt;
A0823190 A59F008C&lt;br /&gt;
A0020290 A08BC093&lt;br /&gt;
A082200B A1A0C222&lt;br /&gt;
A0000191 A59F2078&lt;br /&gt;
A083B290 A1A0BDAB&lt;br /&gt;
A1A03283 A083B00B&lt;br /&gt;
A59F2068 A0000291&lt;br /&gt;
A1A00420 A04C100B&lt;br /&gt;
A0811000 A59F0058&lt;br /&gt;
A0410000 AA00000D&lt;br /&gt;
E3A01B02 E28110D0&lt;br /&gt;
E1500001 A1A02000&lt;br /&gt;
A0000092 A3A010D9&lt;br /&gt;
A00B0091 A59F101C&lt;br /&gt;
A0000291 A1A0B8AB&lt;br /&gt;
A1A008A0 A04B0000&lt;br /&gt;
A1DF10BC A0800001&lt;br /&gt;
E12FFF1E 0001F27D&lt;br /&gt;
000D0310 0000220A&lt;br /&gt;
001F8F58 0256C62B&lt;br /&gt;
0003B1BB 000F767A&lt;br /&gt;
02000464 00000000&lt;br /&gt;
037FBACC E3A0F402&lt;br /&gt;
|Public Domain (Source at Kodewerx! ''Get it yourself!'')&lt;br /&gt;
}}&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Walk through Walls 1.2&lt;br /&gt;
|&lt;br /&gt;
E2000468 000000D0&lt;br /&gt;
E59F00A8 E1C010B0&lt;br /&gt;
E59F00B8 E9204FFE&lt;br /&gt;
E55F101A E2811001&lt;br /&gt;
E2111007 E54F1026&lt;br /&gt;
1A00001F E59F5088&lt;br /&gt;
E5955000 E3A06EF3&lt;br /&gt;
E0050596 E59F607C&lt;br /&gt;
E0855006 E55F4045&lt;br /&gt;
E3540000 E59F4080&lt;br /&gt;
0A000002 E895000E&lt;br /&gt;
E904000E EA000012&lt;br /&gt;
E914000E E2855018&lt;br /&gt;
E89501C0 E0811006&lt;br /&gt;
E59F904C E1D990B0&lt;br /&gt;
E3190C01 03A07B01&lt;br /&gt;
05857004 E0822007&lt;br /&gt;
15152014 15042008&lt;br /&gt;
E0833008 E504100C&lt;br /&gt;
05042008 E5043004&lt;br /&gt;
E5051018 05052014&lt;br /&gt;
E5053010 E8B04FFE&lt;br /&gt;
E3A00010 E59FF00C&lt;br /&gt;
04000106 020D9CB8&lt;br /&gt;
020DA730 04000130&lt;br /&gt;
037FDCF0 00000000&lt;br /&gt;
02000464 02000544&lt;br /&gt;
037FDCE4 E59FF000&lt;br /&gt;
037FDCEC 02000468&lt;br /&gt;
22000467 00000000&lt;br /&gt;
94000130 FFFB0000&lt;br /&gt;
22000467 00000001&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
|Public Domain (Source is missing! ''Disassemble it yourself!'')&lt;br /&gt;
}}&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Never Frozen by Judicator&lt;br /&gt;
|&lt;br /&gt;
020DABCC 00FF0000&lt;br /&gt;
020DE670 00000000&lt;br /&gt;
020DAD58 00000000&lt;br /&gt;
| Player 1 only&lt;br /&gt;
}}&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Immune to Charge Shots&lt;br /&gt;
|&lt;br /&gt;
620D9CB8 00000000&lt;br /&gt;
020DAF74 00000000&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
620D9CB8 00000001&lt;br /&gt;
020DBEA4 00000000&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
620D9CB8 00000002&lt;br /&gt;
020DCDD4 00000000&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
620D9CB8 00000003&lt;br /&gt;
020DDD04 00000000&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
=== Health Bar Mods  ===&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Red&lt;br /&gt;
| 020DE71C 00000003&lt;br /&gt;
|}}&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Normal&lt;br /&gt;
| 020DE71C 00000001&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Nintendo DS|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Nintendo DS/Action Replay|{{PAGENAME}}]]&lt;br /&gt;
&lt;br /&gt;
== '''[[:User:Robert|Robert]]''' ==&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = namehack v2.0&lt;br /&gt;
|&lt;br /&gt;
22148740 00000001&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = enemy pos. revealed (survive)&lt;br /&gt;
|&lt;br /&gt;
520da558 00000000&lt;br /&gt;
220DCE67 00000003&lt;br /&gt;
220DDD97 00000003&lt;br /&gt;
220DECC7 00000003&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
520da558 00000001&lt;br /&gt;
220DBF37 00000003&lt;br /&gt;
220DDD97 00000003&lt;br /&gt;
220DECC7 00000003&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
520da558 00000002&lt;br /&gt;
220DBF37 00000003&lt;br /&gt;
220DCE67 00000003&lt;br /&gt;
220DECC7 00000003&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
520da558 00000003&lt;br /&gt;
220DBF37 00000003&lt;br /&gt;
220DCE67 00000003&lt;br /&gt;
220DDD97 00000003&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
|}}&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:Robert&amp;diff=817</id>
		<title>User:Robert</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:Robert&amp;diff=817"/>
				<updated>2009-02-04T00:33:29Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: New page: Robert is a german mph and ygo serie coder with a little bit knowledge of C and C++. His clan is Nvolution Wifi Elite (nweclan.de) he´s mainly playing mph there. He is also a really good ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robert is a german mph and ygo serie coder with a little bit knowledge of C and C++.&lt;br /&gt;
His clan is Nvolution Wifi Elite (nweclan.de) he´s mainly playing mph there.&lt;br /&gt;
He is also a really good offset converter.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Metroid_Prime:_Hunters_v1.0_(U)/Action_Replay&amp;diff=816</id>
		<title>Metroid Prime: Hunters v1.0 (U)/Action Replay</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Metroid_Prime:_Hunters_v1.0_(U)/Action_Replay&amp;diff=816"/>
				<updated>2009-02-04T00:31:21Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''[[:User:Hextator|Hextator]]''' ==&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Aim Bot Version 3.9.3&lt;br /&gt;
|&lt;br /&gt;
E2000000 00000438&lt;br /&gt;
E59F0428 E9204FFE&lt;br /&gt;
E5DF3454 E5DF2451&lt;br /&gt;
E59F41B0 E1D440B0&lt;br /&gt;
E3140008 13A02000&lt;br /&gt;
1A000002 E3520001&lt;br /&gt;
12833001 13A02001&lt;br /&gt;
E5CF242D E2033003&lt;br /&gt;
E5CF3424 E59F1188&lt;br /&gt;
E5911000 E1510003&lt;br /&gt;
0A000058 E3A02EF3&lt;br /&gt;
E0000291 E0050293&lt;br /&gt;
E59F4170 E0855004&lt;br /&gt;
E0844000 E5948000&lt;br /&gt;
E5959000 E595A01C&lt;br /&gt;
E089900A E0498008&lt;br /&gt;
E5949004 E595A004&lt;br /&gt;
E595B020 E08AA00B&lt;br /&gt;
E04A9009 E5D5A4BA&lt;br /&gt;
E35A0001 12899C02&lt;br /&gt;
02499C0A E594A008&lt;br /&gt;
E5953008 E595B024&lt;br /&gt;
E083300B E04AA003&lt;br /&gt;
E1A03008 EB000049&lt;br /&gt;
E1A03009 EB000047&lt;br /&gt;
E1A0300A EB000045&lt;br /&gt;
E0000898 E0010A9A&lt;br /&gt;
E0800001 EF0D0000&lt;br /&gt;
E1A01009 E2116102&lt;br /&gt;
42611000 E380B901&lt;br /&gt;
E3A03000 E31B0102&lt;br /&gt;
01A0B08B 02833001&lt;br /&gt;
0AFFFFFB E2633011&lt;br /&gt;
E1A00350 E1A01351&lt;br /&gt;
EB000041 EB000086&lt;br /&gt;
E3560000 12600000&lt;br /&gt;
E5840084 E1A00008&lt;br /&gt;
E1A0100A E2106102&lt;br /&gt;
42600000 E2117102&lt;br /&gt;
42611000 EB000036&lt;br /&gt;
EB00007B E3570000&lt;br /&gt;
02600000 E5840088&lt;br /&gt;
E3A01A01 E3560000&lt;br /&gt;
12611000 E5841080&lt;br /&gt;
E3100102 42600000&lt;br /&gt;
E0010090 E1DF26BC&lt;br /&gt;
E08B3291 E1B03FA3&lt;br /&gt;
128BB001 E59F2060&lt;br /&gt;
E0813092 E1B03FA3&lt;br /&gt;
128BB001 E081000B&lt;br /&gt;
E1DF14BA E0800001&lt;br /&gt;
E5941084 E2112102&lt;br /&gt;
42611000 E0000091&lt;br /&gt;
E1A00620 E3520000&lt;br /&gt;
12600000 E5840084&lt;br /&gt;
E59F0278 E2400030&lt;br /&gt;
E8B04FFE E3A00005&lt;br /&gt;
E59FC00C E12FFF1C&lt;br /&gt;
04000130 020D9CB8&lt;br /&gt;
020DA730 037FBB2C&lt;br /&gt;
0B4F6829 E2B912F3&lt;br /&gt;
E3130102 42633000&lt;br /&gt;
E3833901 E3A06000&lt;br /&gt;
E3130102 01A03083&lt;br /&gt;
02866001 0AFFFFFB&lt;br /&gt;
E2666011 E1A08658&lt;br /&gt;
E1A09659 E1A0A65A&lt;br /&gt;
E12FFF1E E92D4008&lt;br /&gt;
E3510000 03A00000&lt;br /&gt;
0A000010 E3500000&lt;br /&gt;
03A00901 0A00000D&lt;br /&gt;
E1A02700 E1A03701&lt;br /&gt;
E1500001 BA000006&lt;br /&gt;
E1500001 03A00A02&lt;br /&gt;
0A000006 E1A01000&lt;br /&gt;
E1A00003 EB000005&lt;br /&gt;
EA000002 E1A00002&lt;br /&gt;
EB000002 E2600901&lt;br /&gt;
E8BD4008 E12FFF1E&lt;br /&gt;
E1A02001 E15200A0&lt;br /&gt;
91A02082 3AFFFFFC&lt;br /&gt;
E3A03000 E1500002&lt;br /&gt;
E0A33003 20400002&lt;br /&gt;
E1320001 11A020A2&lt;br /&gt;
1AFFFFF9 E1A01000&lt;br /&gt;
E1A00003 E0010090&lt;br /&gt;
E1A01741 E2611000&lt;br /&gt;
E3A030A9 E0030391&lt;br /&gt;
E1A03743 E2833E39&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833C09 E283301C&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833EFA E2833016&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833D5A E283302A&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833D82 E2833001&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833C36 E2833051&lt;br /&gt;
E0030391 E1A03743&lt;br /&gt;
E2833CA2 E28330F9&lt;br /&gt;
E0000093 E1A00840&lt;br /&gt;
E12FFF1E E1A00120&lt;br /&gt;
E3A0101C E1500001&lt;br /&gt;
BA000034 E3A01EFE&lt;br /&gt;
E1500001 B1A02000&lt;br /&gt;
B0000092 B3A01077&lt;br /&gt;
B00B0091 B59F10B8&lt;br /&gt;
B0000291 B1A0B9AB&lt;br /&gt;
B1A00820 B040000B&lt;br /&gt;
B3A01035 B0400001&lt;br /&gt;
A3A00906 AA000025&lt;br /&gt;
E3A01C0D E1500001&lt;br /&gt;
A1A01000 A0000091&lt;br /&gt;
A0823190 A59F008C&lt;br /&gt;
A0020290 A08BC093&lt;br /&gt;
A082200B A1A0C222&lt;br /&gt;
A0000191 A59F2078&lt;br /&gt;
A083B290 A1A0BDAB&lt;br /&gt;
A1A03283 A083B00B&lt;br /&gt;
A59F2068 A0000291&lt;br /&gt;
A1A00420 A04C100B&lt;br /&gt;
A0811000 A59F0058&lt;br /&gt;
A0410000 AA00000D&lt;br /&gt;
E3A01B02 E28110D0&lt;br /&gt;
E1500001 A1A02000&lt;br /&gt;
A0000092 A3A010D9&lt;br /&gt;
A00B0091 A59F101C&lt;br /&gt;
A0000291 A1A0B8AB&lt;br /&gt;
A1A008A0 A04B0000&lt;br /&gt;
A1DF10BC A0800001&lt;br /&gt;
E12FFF1E 0001F27D&lt;br /&gt;
000D0310 0000220A&lt;br /&gt;
001F8F58 0256C62B&lt;br /&gt;
0003B1BB 000F767A&lt;br /&gt;
02000464 00000000&lt;br /&gt;
037FBACC E3A0F402&lt;br /&gt;
|Public Domain (Source at Kodewerx! ''Get it yourself!'')&lt;br /&gt;
}}&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Walk through Walls 1.2&lt;br /&gt;
|&lt;br /&gt;
E2000468 000000D0&lt;br /&gt;
E59F00A8 E1C010B0&lt;br /&gt;
E59F00B8 E9204FFE&lt;br /&gt;
E55F101A E2811001&lt;br /&gt;
E2111007 E54F1026&lt;br /&gt;
1A00001F E59F5088&lt;br /&gt;
E5955000 E3A06EF3&lt;br /&gt;
E0050596 E59F607C&lt;br /&gt;
E0855006 E55F4045&lt;br /&gt;
E3540000 E59F4080&lt;br /&gt;
0A000002 E895000E&lt;br /&gt;
E904000E EA000012&lt;br /&gt;
E914000E E2855018&lt;br /&gt;
E89501C0 E0811006&lt;br /&gt;
E59F904C E1D990B0&lt;br /&gt;
E3190C01 03A07B01&lt;br /&gt;
05857004 E0822007&lt;br /&gt;
15152014 15042008&lt;br /&gt;
E0833008 E504100C&lt;br /&gt;
05042008 E5043004&lt;br /&gt;
E5051018 05052014&lt;br /&gt;
E5053010 E8B04FFE&lt;br /&gt;
E3A00010 E59FF00C&lt;br /&gt;
04000106 020D9CB8&lt;br /&gt;
020DA730 04000130&lt;br /&gt;
037FDCF0 00000000&lt;br /&gt;
02000464 02000544&lt;br /&gt;
037FDCE4 E59FF000&lt;br /&gt;
037FDCEC 02000468&lt;br /&gt;
22000467 00000000&lt;br /&gt;
94000130 FFFB0000&lt;br /&gt;
22000467 00000001&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
|Public Domain (Source is missing! ''Disassemble it yourself!'')&lt;br /&gt;
}}&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Never Frozen by Judicator&lt;br /&gt;
|&lt;br /&gt;
020DABCC 00FF0000&lt;br /&gt;
020DE670 00000000&lt;br /&gt;
020DAD58 00000000&lt;br /&gt;
| Player 1 only&lt;br /&gt;
}}&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Immune to Charge Shots&lt;br /&gt;
|&lt;br /&gt;
620D9CB8 00000000&lt;br /&gt;
020DAF74 00000000&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
620D9CB8 00000001&lt;br /&gt;
020DBEA4 00000000&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
620D9CB8 00000002&lt;br /&gt;
020DCDD4 00000000&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
620D9CB8 00000003&lt;br /&gt;
020DDD04 00000000&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
=== Health Bar Mods  ===&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Red&lt;br /&gt;
| 020DE71C 00000003&lt;br /&gt;
|}}&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Normal&lt;br /&gt;
| 020DE71C 00000001&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Nintendo DS|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Nintendo DS/Action Replay|{{PAGENAME}}]]&lt;br /&gt;
&lt;br /&gt;
== '''[[:User:Robert|Robert]]''' ==&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = namehack v2.0&lt;br /&gt;
|&lt;br /&gt;
22148740 00000001&lt;br /&gt;
|}}&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=692</id>
		<title>User:King Rhyono</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=692"/>
				<updated>2008-11-22T18:44:27Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: Replacing page with 'Epicness on ice.'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Epicness on ice.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Pok%C3%A9mon_Diamond_and_Pearl_(U)/Action_Replay&amp;diff=673</id>
		<title>Pokémon Diamond and Pearl (U)/Action Replay</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Pok%C3%A9mon_Diamond_and_Pearl_(U)/Action_Replay&amp;diff=673"/>
				<updated>2008-11-13T04:38:05Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* ShinyPalkia */  Bugfix &amp;quot;Music-Modifier&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Game ID'''&lt;br /&gt;
 Pokémon Diamond: ADAE-636791C0&lt;br /&gt;
 Pokémon Pearl: APAE-EBEA12FB&lt;br /&gt;
&lt;br /&gt;
=='''[[:User:ShinyPalkia|ShinyPalkia]]'''==&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Weather-Modifier&lt;br /&gt;
|&lt;br /&gt;
94000130 FCFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DB000000 00112F58&lt;br /&gt;
D8000000 0000150A&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| Simply type in your Pokétch calculator your desired weather and press L+R. Then go into any menu (bag, Pokédex, etc.) and go out of it.}}&lt;br /&gt;
 01 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Dark&lt;br /&gt;
 02 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Rain 1&lt;br /&gt;
 03 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Rain 2&lt;br /&gt;
 04 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Rain 3&lt;br /&gt;
 05 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Snow 1&lt;br /&gt;
 06 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Snow 2&lt;br /&gt;
 07 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Snow 3&lt;br /&gt;
 08 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; White background&lt;br /&gt;
 09 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Ash rain 1&lt;br /&gt;
 11 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Ash rain 2&lt;br /&gt;
 12 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Diamond rain (Birthday-Event)&lt;br /&gt;
 13 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Earthquake&lt;br /&gt;
 14 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Hall of beginning&lt;br /&gt;
 15 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Fog 1&lt;br /&gt;
 16 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Fog 2&lt;br /&gt;
 17 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Dark cave 1&lt;br /&gt;
 18 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Flash and lightning&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Music-Modifier&lt;br /&gt;
|&lt;br /&gt;
94000130 FCFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DA000000 00112F58&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
D7000000 021C3D86&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| Simply type in your Pokétch calculator your desired music ID and hold L+R while climbing on your bike or while changing the route.&lt;br /&gt;
&lt;br /&gt;
Who traslates this German list correctly gets a cookie, I have no idea of the English names. (A French list is also avaiable.)}}&lt;br /&gt;
 1000: Mysteriöse Zone&lt;br /&gt;
 1001: Nichts&lt;br /&gt;
 1004: Zweiblattdorf&lt;br /&gt;
 1005: Sandgemme&lt;br /&gt;
 1006: Flori&lt;br /&gt;
 1007: Trostu/Weideburg (Tag)&lt;br /&gt;
 1008: Kahlberg (aussen) Route 225/226/227 (Tag)&lt;br /&gt;
 1009: Erholungsgebiet/Kühnheitsufer/Route 213 (Tag)&lt;br /&gt;
 1010: Jubelstadt (Tag)&lt;br /&gt;
 1011: Fleetburg (Tag)&lt;br /&gt;
 1012: Erzelingen (Tag)&lt;br /&gt;
 1013: Elyses/Ewigenau (Tag)&lt;br /&gt;
 1014: Herzhofen (Tag)&lt;br /&gt;
 1015: Trostu/Weideburg (Tag)&lt;br /&gt;
 1016: Schleide (Tag)&lt;br /&gt;
 1017: Sonnenwik&lt;br /&gt;
 1018: Blizzach&lt;br /&gt;
 1019: Pokémon-Liga (Tag)&lt;br /&gt;
 1020: Kampfareal/Überlebensareal (Tag)&lt;br /&gt;
 1021: Route 201&lt;br /&gt;
 1022: Route 203/218 (Tag)&lt;br /&gt;
 1023: Route 205/West-211 (Tag)&lt;br /&gt;
 1024: Route 206 (Tag)&lt;br /&gt;
 1025: Route (Tag)&lt;br /&gt;
 1026: Route Ost-211 (Tag)&lt;br /&gt;
 1027: Route 216 (Tag)&lt;br /&gt;
 1028: Route 228/229 (Tag)&lt;br /&gt;
 1029: Prof. Eibes Labor&lt;br /&gt;
 1030: Fernsehmeldung Rotes Garados&lt;br /&gt;
 1031: Ewigenau&lt;br /&gt;
 1032: Route 205&lt;br /&gt;
 1033: Zweiblattdorf&lt;br /&gt;
 1034: Sandgemme&lt;br /&gt;
 1035: Flori&lt;br /&gt;
 1036: Trostu/Weideburg (Nacht 2)&lt;br /&gt;
 1037: Kahlberg (aussen) Route 225/226/227 (Nacht)&lt;br /&gt;
 1038: Erholungsgebiet/Kühnheitsufer/Route 213 (Nacht)&lt;br /&gt;
 1039: Jubelstadt (Nacht)&lt;br /&gt;
 1040: Fleetburg (Nacht)&lt;br /&gt;
 1041: Erzlingen (Nacht)&lt;br /&gt;
 1042: Elyses/Ewigenau (Nacht)&lt;br /&gt;
 1043: Herzhofen (Nacht)&lt;br /&gt;
 1044: Trostu/Weideburg (Nacht)&lt;br /&gt;
 1045: Schleide (Nacht)&lt;br /&gt;
 1046: Sonnenwik (Nacht)&lt;br /&gt;
 1047: Blizzach (Nacht)&lt;br /&gt;
 1048: Pokémon-Liga (Nacht)&lt;br /&gt;
 1049: Kampfareal/Überlebensareal (Nacht)&lt;br /&gt;
 1050: Route 201&lt;br /&gt;
 1051: Route 203/218 (Nacht)&lt;br /&gt;
 1052: Route 205/West-211/Windkraftwerk (Nacht)&lt;br /&gt;
 1053: Route 206 (Nacht)&lt;br /&gt;
 1054: Route (Nacht)&lt;br /&gt;
 1055: Route Ost-211 (Nacht)&lt;br /&gt;
 1056: Route 216 (Nacht)&lt;br /&gt;
 1057: Route 228/229 (Nacht)&lt;br /&gt;
 1058: Elyses/Ewigenau (Spezial)&lt;br /&gt;
 1059: Route 205 (Spezial)&lt;br /&gt;
 1060: Untergrund&lt;br /&gt;
 1061: Basis-Fahne geklaut!&lt;br /&gt;
 1062: Siegesstrasse&lt;br /&gt;
 1063: Geheime Melodie&lt;br /&gt;
 1064: Grusel-Lied&lt;br /&gt;
 1065: Trio-Höhle&lt;br /&gt;
 1066: Platz der Treue&lt;br /&gt;
 1067: Team Galaktik 1&lt;br /&gt;
 1068: Team Galaktik 2&lt;br /&gt;
 1069: Grossmor&lt;br /&gt;
 1070: Trio-See&lt;br /&gt;
 1071: Kraterberg&lt;br /&gt;
 1072: Speersäule&lt;br /&gt;
 1073: Kahlberg&lt;br /&gt;
 1074: Höhle 1&lt;br /&gt;
 1075: Höhle 2&lt;br /&gt;
 1076: Pokémon-Liga (innen)&lt;br /&gt;
 1077: Ruhmeshalle&lt;br /&gt;
 1084: Prof. Eibes Labor&lt;br /&gt;
 1085: Pokémon Center (Tag)&lt;br /&gt;
 1086: Pokémon Center (Nacht)&lt;br /&gt;
 1087: Arena&lt;br /&gt;
 1088: Ruhmeshalle&lt;br /&gt;
 1089: Knursperei/Wettbewerbshalle&lt;br /&gt;
 1090: Pokémon Markt&lt;br /&gt;
 1091: Spielhalle&lt;br /&gt;
 1092: Duellturm&lt;br /&gt;
 1093: Jubelstadt TV&lt;br /&gt;
 1094: Geheimlabor (Galaktik)&lt;br /&gt;
 1100: Trainer gesichtet! (Tennager)&lt;br /&gt;
 1101: Trainer gesichtet! (Planscher)&lt;br /&gt;
 1102: Trainer gesichtet! (Gitarrist/Polizist/Psycho/Schwarzgurt)&lt;br /&gt;
 1103: Trainer gesichtet! (Galaktik)&lt;br /&gt;
 1104: Trainer gesichtet! (Schirmdame/Schönheit)&lt;br /&gt;
 1105: Trainer gesichtet! (Ruinenmaniac/Wanderer)&lt;br /&gt;
 1106: Trainer gesichtet! (Spieler)&lt;br /&gt;
 1107: Trainer gesichtet! (Angler/Matrose)&lt;br /&gt;
 1108: Trainer gesichtet! (Forscher/PKMN-Sammler)&lt;br /&gt;
 1109: Trainer gesichtet! (Ass-Trainer/PKMN-Ranger)&lt;br /&gt;
 1113: Top Vier gesichtet!&lt;br /&gt;
 1114: Champion Cynthia gesichtet!&lt;br /&gt;
 1116: Wildes Pokémon&lt;br /&gt;
 1117: Arenaleiter&lt;br /&gt;
 1118: Trio&lt;br /&gt;
 1119: Trainer&lt;br /&gt;
 1120: Galaktikboss Zyrus&lt;br /&gt;
 1121: Dialga/Palkia&lt;br /&gt;
 1122: Champion Cynthia&lt;br /&gt;
 1123: Galaktischer Rüpel&lt;br /&gt;
 1124: Rivale&lt;br /&gt;
 1125: Gott Arceus&lt;br /&gt;
 1126: Legendäres Pokémon&lt;br /&gt;
 1127: Pokémon gefangen&lt;br /&gt;
 1128: Trainer besiegt&lt;br /&gt;
 1129: Arenaleiter besiegt&lt;br /&gt;
 1130: Champion Cynthia besiegt&lt;br /&gt;
 1131: Galaktischer Commander/Rüpel besiegt&lt;br /&gt;
 1132: Galaktikboss Zyrus&lt;br /&gt;
 1133: Top Vier besiegt&lt;br /&gt;
 1134: Galaktischer Commander Jupiter/Mars/Saturn&lt;br /&gt;
 1136: Top Vier&lt;br /&gt;
 1138: Kleine Verfolgung&lt;br /&gt;
 1139: Rivale gesichtet!&lt;br /&gt;
 1140: Verbrecher!&lt;br /&gt;
 1141: Pokémon-Tausch&lt;br /&gt;
 1144: Dialga/Palkia betritt unsere Dimension 1&lt;br /&gt;
 1145: Dialga/Palkia betritt unsere Dimension 2&lt;br /&gt;
 1150: Poké-Radar&lt;br /&gt;
 1151: Surfer&lt;br /&gt;
 1152: Fahrrad&lt;br /&gt;
 1169: Knursp-Haus&lt;br /&gt;
 1171: Ruhmeshalle 2&lt;br /&gt;
 1172: Intro&lt;br /&gt;
 1173: Titelbildschirm&lt;br /&gt;
 1174: Wi-Fi 1&lt;br /&gt;
 1175: Wi-Fi 2&lt;br /&gt;
 1176: Wettbewerb Tanz-Lied 1&lt;br /&gt;
 1177: Wettbewerb Tanz-Lied 1&lt;br /&gt;
 1178: Wettbewerb Tanz-Lied 1&lt;br /&gt;
 1179: Wettbewerb Tanz-Lied 2&lt;br /&gt;
 1180: Wettbewerb Tanz-Lied 2&lt;br /&gt;
 1181: Wettbewerb Preisverleihung&lt;br /&gt;
 1182: Wettbewerb Sieger&lt;br /&gt;
 1183: Knurspe backen&lt;br /&gt;
 1186: Credits&lt;br /&gt;
 1187: Knurspe backen&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Player-Modifier&lt;br /&gt;
|&lt;br /&gt;
94000130 FEFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DA000000 00112F58&lt;br /&gt;
D7000000 00024A9C&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| Use your Pokétch calculator to modify your player's apperance. Below you'll find the ID's that you can use. For example you type in the calculator 155, then you have to hold R while going into a house (or getting out of it) and you'll be a Palkia.&lt;br /&gt;
&lt;br /&gt;
Note: It does exist a version 1.1, but that version is currently buggy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Player_modifier_list.png|thumb|center|150x171px|List of the Player-Modifier ID's]]}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Pokémon-Generator v1.0&lt;br /&gt;
|&lt;br /&gt;
94000130 FDFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
94000130 FFF70000&lt;br /&gt;
10000892 000001ED&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
DA000000 00000892&lt;br /&gt;
C0000000 0000000B&lt;br /&gt;
D7000000 00024620&lt;br /&gt;
DC000000 00000006&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
94000130 FEFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
94000130 FFF70000&lt;br /&gt;
10000896 00000064&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
DA000000 00000896&lt;br /&gt;
C0000000 0000000B&lt;br /&gt;
D7000000 0002461C&lt;br /&gt;
DC000000 00000006&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
94000130 FFFB0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
94000130 FFF70000&lt;br /&gt;
1000089A 00000019&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
DC000000 0000089A&lt;br /&gt;
90000000 00000019&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
12066D98 00002400&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DC000000 0000089A&lt;br /&gt;
A0000000 00000019&lt;br /&gt;
DA000000 00000000&lt;br /&gt;
D4000000 00002400&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
D7000000 02066D98&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| '''Actual version'''&lt;br /&gt;
&lt;br /&gt;
*Pokémon-Modifier &lt;br /&gt;
*Level-Modifier &lt;br /&gt;
*Nature-Modifier&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
*Start + L &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Amount of the 1. Items &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 493&lt;br /&gt;
*Start + R &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Amount of the 2. Items &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 100 &lt;br /&gt;
*Start + Select &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Amount of the 3. Items &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 25&lt;br /&gt;
&lt;br /&gt;
'''Step 2 '''&lt;br /&gt;
&lt;br /&gt;
*L &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Choose the wild '''Pokémon''' by setting the amount of the '''first''' item. &lt;br /&gt;
*R &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Choose the '''level''' of the wild Pokémon by setting the amount of the '''second''' item. &lt;br /&gt;
*Select &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Choose the '''Nature''' of the wild Pokémon by setting the amount of the '''third''' item*.&lt;br /&gt;
&lt;br /&gt;
Watch out: If your press the 4 buttons Start + Select + L + R, the game will restart.&lt;br /&gt;
&lt;br /&gt;
[[Image:Nature_list.png|thumb|center|200x136px|*List of the Natures]]}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Crazy Zoom! v1.2&lt;br /&gt;
|&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DC000000 0000150E&lt;br /&gt;
A0000000 FF000004&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
121CED48 0000F000&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
B21C59A4 00000000&lt;br /&gt;
DA000000 0000001A&lt;br /&gt;
94000130 FCF30204&lt;br /&gt;
D4000000 FFFFFFFF&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
94000130 FCF30208&lt;br /&gt;
D4000000 00000001&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
74000100 FF000020&lt;br /&gt;
D7000000 0000001A&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
B21C59A4 00000000&lt;br /&gt;
DA000000 00000022&lt;br /&gt;
94000130 FCF30108&lt;br /&gt;
D4000000 FFFFFFFF&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
94000130 FCF30104&lt;br /&gt;
D4000000 00000001&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
74000100 FF000020&lt;br /&gt;
D7000000 00000022&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
B21C59A4 00000000&lt;br /&gt;
DA000000 0000002A&lt;br /&gt;
94000130 FCF30004&lt;br /&gt;
D4000000 FFFFFFFF&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
94000130 FCF30008&lt;br /&gt;
D4000000 00000001&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
74000100 FF000020&lt;br /&gt;
D7000000 0000002A&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| '''Features'''&lt;br /&gt;
&lt;br /&gt;
* Zoom&lt;br /&gt;
         o R+Start - Zoom in&lt;br /&gt;
         o R+Select - Zoom out&lt;br /&gt;
* Rotation Left/Right&lt;br /&gt;
         o L+Select - Left&lt;br /&gt;
         o L+Start - Right&lt;br /&gt;
* Rotation Up/Down&lt;br /&gt;
         o L+R+Start - Up&lt;br /&gt;
         o L+R+Select - Down&lt;br /&gt;
&lt;br /&gt;
[[Image:Crazy_Zoom_1.png|thumb|center|150x114px|*Crazy Zoom Pictures 1]][[Image:Crazy_Zoom_2.png|thumb|center|150x114px|*Crazy Zoom Pictures 2]]}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Motion3D&lt;br /&gt;
|&lt;br /&gt;
94000130 FDFF0000&lt;br /&gt;
DA000000 02000002&lt;br /&gt;
B21C4E68 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
D7000000 0000150E&lt;br /&gt;
DC000000 FFFFFFFE&lt;br /&gt;
94000130 FFF70000&lt;br /&gt;
DA000000 00112F56&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
D7000000 02000002&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| Simply type in your Poktéch calculator the number of your desired camera perspective and press L + Start to save the number in the memory. Then hold L while going into a house (or getting out of it) for using that number.&lt;br /&gt;
&lt;br /&gt;
 00 - Basic 3D&lt;br /&gt;
 04 - Basic 2D&lt;br /&gt;
 05 - 3D Like on ''Spear Pillar''&lt;br /&gt;
 08 - 3D Camera high placed, like on ''Stark Mountain''&lt;br /&gt;
 09 - 3D Better sight, like in the ''Eterna City'' arena&lt;br /&gt;
 14 - 3D Little dwarfs in a world of giants, like in ''Hall of Origin''}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Nintendo DS|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Nintendo DS/Action Replay|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Pok%C3%A9mon_Diamond_and_Pearl_(U)/Action_Replay&amp;diff=672</id>
		<title>Pokémon Diamond and Pearl (U)/Action Replay</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Pok%C3%A9mon_Diamond_and_Pearl_(U)/Action_Replay&amp;diff=672"/>
				<updated>2008-11-13T04:09:08Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* ShinyPalkia */  Motion3D&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Game ID'''&lt;br /&gt;
 Pokémon Diamond: ADAE-636791C0&lt;br /&gt;
 Pokémon Pearl: APAE-EBEA12FB&lt;br /&gt;
&lt;br /&gt;
=='''[[:User:ShinyPalkia|ShinyPalkia]]'''==&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Weather-Modifier&lt;br /&gt;
|&lt;br /&gt;
94000130 FCFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DB000000 00112F58&lt;br /&gt;
D8000000 0000150A&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| Simply type in your Pokétch calculator your desired weather and press L+R. Then go into any menu (bag, Pokédex, etc.) and go out of it.}}&lt;br /&gt;
 01 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Dark&lt;br /&gt;
 02 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Rain 1&lt;br /&gt;
 03 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Rain 2&lt;br /&gt;
 04 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Rain 3&lt;br /&gt;
 05 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Snow 1&lt;br /&gt;
 06 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Snow 2&lt;br /&gt;
 07 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Snow 3&lt;br /&gt;
 08 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; White background&lt;br /&gt;
 09 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Ash rain 1&lt;br /&gt;
 11 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Ash rain 2&lt;br /&gt;
 12 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Diamond rain (Birthday-Event)&lt;br /&gt;
 13 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Earthquake&lt;br /&gt;
 14 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Hall of beginning&lt;br /&gt;
 15 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Fog 1&lt;br /&gt;
 16 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Fog 2&lt;br /&gt;
 17 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Dark cave 1&lt;br /&gt;
 18 &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Flash and lightning&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Music-Modifier&lt;br /&gt;
|&lt;br /&gt;
94000130 FCFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DA000000 00112F58&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
D7000000 021C3EC6&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| Simply type in your Pokétch calculator your desired music ID and hold L+R while climbing on your bike or while changing the route.&lt;br /&gt;
&lt;br /&gt;
Who traslates this German list correctly gets a cookie, I have no idea of the English names. (A French list is also avaiable.)}}&lt;br /&gt;
 1000: Mysteriöse Zone&lt;br /&gt;
 1001: Nichts&lt;br /&gt;
 1004: Zweiblattdorf&lt;br /&gt;
 1005: Sandgemme&lt;br /&gt;
 1006: Flori&lt;br /&gt;
 1007: Trostu/Weideburg (Tag)&lt;br /&gt;
 1008: Kahlberg (aussen) Route 225/226/227 (Tag)&lt;br /&gt;
 1009: Erholungsgebiet/Kühnheitsufer/Route 213 (Tag)&lt;br /&gt;
 1010: Jubelstadt (Tag)&lt;br /&gt;
 1011: Fleetburg (Tag)&lt;br /&gt;
 1012: Erzelingen (Tag)&lt;br /&gt;
 1013: Elyses/Ewigenau (Tag)&lt;br /&gt;
 1014: Herzhofen (Tag)&lt;br /&gt;
 1015: Trostu/Weideburg (Tag)&lt;br /&gt;
 1016: Schleide (Tag)&lt;br /&gt;
 1017: Sonnenwik&lt;br /&gt;
 1018: Blizzach&lt;br /&gt;
 1019: Pokémon-Liga (Tag)&lt;br /&gt;
 1020: Kampfareal/Überlebensareal (Tag)&lt;br /&gt;
 1021: Route 201&lt;br /&gt;
 1022: Route 203/218 (Tag)&lt;br /&gt;
 1023: Route 205/West-211 (Tag)&lt;br /&gt;
 1024: Route 206 (Tag)&lt;br /&gt;
 1025: Route (Tag)&lt;br /&gt;
 1026: Route Ost-211 (Tag)&lt;br /&gt;
 1027: Route 216 (Tag)&lt;br /&gt;
 1028: Route 228/229 (Tag)&lt;br /&gt;
 1029: Prof. Eibes Labor&lt;br /&gt;
 1030: Fernsehmeldung Rotes Garados&lt;br /&gt;
 1031: Ewigenau&lt;br /&gt;
 1032: Route 205&lt;br /&gt;
 1033: Zweiblattdorf&lt;br /&gt;
 1034: Sandgemme&lt;br /&gt;
 1035: Flori&lt;br /&gt;
 1036: Trostu/Weideburg (Nacht 2)&lt;br /&gt;
 1037: Kahlberg (aussen) Route 225/226/227 (Nacht)&lt;br /&gt;
 1038: Erholungsgebiet/Kühnheitsufer/Route 213 (Nacht)&lt;br /&gt;
 1039: Jubelstadt (Nacht)&lt;br /&gt;
 1040: Fleetburg (Nacht)&lt;br /&gt;
 1041: Erzlingen (Nacht)&lt;br /&gt;
 1042: Elyses/Ewigenau (Nacht)&lt;br /&gt;
 1043: Herzhofen (Nacht)&lt;br /&gt;
 1044: Trostu/Weideburg (Nacht)&lt;br /&gt;
 1045: Schleide (Nacht)&lt;br /&gt;
 1046: Sonnenwik (Nacht)&lt;br /&gt;
 1047: Blizzach (Nacht)&lt;br /&gt;
 1048: Pokémon-Liga (Nacht)&lt;br /&gt;
 1049: Kampfareal/Überlebensareal (Nacht)&lt;br /&gt;
 1050: Route 201&lt;br /&gt;
 1051: Route 203/218 (Nacht)&lt;br /&gt;
 1052: Route 205/West-211/Windkraftwerk (Nacht)&lt;br /&gt;
 1053: Route 206 (Nacht)&lt;br /&gt;
 1054: Route (Nacht)&lt;br /&gt;
 1055: Route Ost-211 (Nacht)&lt;br /&gt;
 1056: Route 216 (Nacht)&lt;br /&gt;
 1057: Route 228/229 (Nacht)&lt;br /&gt;
 1058: Elyses/Ewigenau (Spezial)&lt;br /&gt;
 1059: Route 205 (Spezial)&lt;br /&gt;
 1060: Untergrund&lt;br /&gt;
 1061: Basis-Fahne geklaut!&lt;br /&gt;
 1062: Siegesstrasse&lt;br /&gt;
 1063: Geheime Melodie&lt;br /&gt;
 1064: Grusel-Lied&lt;br /&gt;
 1065: Trio-Höhle&lt;br /&gt;
 1066: Platz der Treue&lt;br /&gt;
 1067: Team Galaktik 1&lt;br /&gt;
 1068: Team Galaktik 2&lt;br /&gt;
 1069: Grossmor&lt;br /&gt;
 1070: Trio-See&lt;br /&gt;
 1071: Kraterberg&lt;br /&gt;
 1072: Speersäule&lt;br /&gt;
 1073: Kahlberg&lt;br /&gt;
 1074: Höhle 1&lt;br /&gt;
 1075: Höhle 2&lt;br /&gt;
 1076: Pokémon-Liga (innen)&lt;br /&gt;
 1077: Ruhmeshalle&lt;br /&gt;
 1084: Prof. Eibes Labor&lt;br /&gt;
 1085: Pokémon Center (Tag)&lt;br /&gt;
 1086: Pokémon Center (Nacht)&lt;br /&gt;
 1087: Arena&lt;br /&gt;
 1088: Ruhmeshalle&lt;br /&gt;
 1089: Knursperei/Wettbewerbshalle&lt;br /&gt;
 1090: Pokémon Markt&lt;br /&gt;
 1091: Spielhalle&lt;br /&gt;
 1092: Duellturm&lt;br /&gt;
 1093: Jubelstadt TV&lt;br /&gt;
 1094: Geheimlabor (Galaktik)&lt;br /&gt;
 1100: Trainer gesichtet! (Tennager)&lt;br /&gt;
 1101: Trainer gesichtet! (Planscher)&lt;br /&gt;
 1102: Trainer gesichtet! (Gitarrist/Polizist/Psycho/Schwarzgurt)&lt;br /&gt;
 1103: Trainer gesichtet! (Galaktik)&lt;br /&gt;
 1104: Trainer gesichtet! (Schirmdame/Schönheit)&lt;br /&gt;
 1105: Trainer gesichtet! (Ruinenmaniac/Wanderer)&lt;br /&gt;
 1106: Trainer gesichtet! (Spieler)&lt;br /&gt;
 1107: Trainer gesichtet! (Angler/Matrose)&lt;br /&gt;
 1108: Trainer gesichtet! (Forscher/PKMN-Sammler)&lt;br /&gt;
 1109: Trainer gesichtet! (Ass-Trainer/PKMN-Ranger)&lt;br /&gt;
 1113: Top Vier gesichtet!&lt;br /&gt;
 1114: Champion Cynthia gesichtet!&lt;br /&gt;
 1116: Wildes Pokémon&lt;br /&gt;
 1117: Arenaleiter&lt;br /&gt;
 1118: Trio&lt;br /&gt;
 1119: Trainer&lt;br /&gt;
 1120: Galaktikboss Zyrus&lt;br /&gt;
 1121: Dialga/Palkia&lt;br /&gt;
 1122: Champion Cynthia&lt;br /&gt;
 1123: Galaktischer Rüpel&lt;br /&gt;
 1124: Rivale&lt;br /&gt;
 1125: Gott Arceus&lt;br /&gt;
 1126: Legendäres Pokémon&lt;br /&gt;
 1127: Pokémon gefangen&lt;br /&gt;
 1128: Trainer besiegt&lt;br /&gt;
 1129: Arenaleiter besiegt&lt;br /&gt;
 1130: Champion Cynthia besiegt&lt;br /&gt;
 1131: Galaktischer Commander/Rüpel besiegt&lt;br /&gt;
 1132: Galaktikboss Zyrus&lt;br /&gt;
 1133: Top Vier besiegt&lt;br /&gt;
 1134: Galaktischer Commander Jupiter/Mars/Saturn&lt;br /&gt;
 1136: Top Vier&lt;br /&gt;
 1138: Kleine Verfolgung&lt;br /&gt;
 1139: Rivale gesichtet!&lt;br /&gt;
 1140: Verbrecher!&lt;br /&gt;
 1141: Pokémon-Tausch&lt;br /&gt;
 1144: Dialga/Palkia betritt unsere Dimension 1&lt;br /&gt;
 1145: Dialga/Palkia betritt unsere Dimension 2&lt;br /&gt;
 1150: Poké-Radar&lt;br /&gt;
 1151: Surfer&lt;br /&gt;
 1152: Fahrrad&lt;br /&gt;
 1169: Knursp-Haus&lt;br /&gt;
 1171: Ruhmeshalle 2&lt;br /&gt;
 1172: Intro&lt;br /&gt;
 1173: Titelbildschirm&lt;br /&gt;
 1174: Wi-Fi 1&lt;br /&gt;
 1175: Wi-Fi 2&lt;br /&gt;
 1176: Wettbewerb Tanz-Lied 1&lt;br /&gt;
 1177: Wettbewerb Tanz-Lied 1&lt;br /&gt;
 1178: Wettbewerb Tanz-Lied 1&lt;br /&gt;
 1179: Wettbewerb Tanz-Lied 2&lt;br /&gt;
 1180: Wettbewerb Tanz-Lied 2&lt;br /&gt;
 1181: Wettbewerb Preisverleihung&lt;br /&gt;
 1182: Wettbewerb Sieger&lt;br /&gt;
 1183: Knurspe backen&lt;br /&gt;
 1186: Credits&lt;br /&gt;
 1187: Knurspe backen&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Player-Modifier&lt;br /&gt;
|&lt;br /&gt;
94000130 FEFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DA000000 00112F58&lt;br /&gt;
D7000000 00024A9C&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| Use your Pokétch calculator to modify your player's apperance. Below you'll find the ID's that you can use. For example you type in the calculator 155, then you have to hold R while going into a house (or getting out of it) and you'll be a Palkia.&lt;br /&gt;
&lt;br /&gt;
Note: It does exist a version 1.1, but that version is currently buggy.&lt;br /&gt;
&lt;br /&gt;
[[Image:Player_modifier_list.png|thumb|center|150x171px|List of the Player-Modifier ID's]]}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Pokémon-Generator v1.0&lt;br /&gt;
|&lt;br /&gt;
94000130 FDFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
94000130 FFF70000&lt;br /&gt;
10000892 000001ED&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
DA000000 00000892&lt;br /&gt;
C0000000 0000000B&lt;br /&gt;
D7000000 00024620&lt;br /&gt;
DC000000 00000006&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
94000130 FEFF0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
94000130 FFF70000&lt;br /&gt;
10000896 00000064&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
DA000000 00000896&lt;br /&gt;
C0000000 0000000B&lt;br /&gt;
D7000000 0002461C&lt;br /&gt;
DC000000 00000006&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
94000130 FFFB0000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
94000130 FFF70000&lt;br /&gt;
1000089A 00000019&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
DC000000 0000089A&lt;br /&gt;
90000000 00000019&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
12066D98 00002400&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DC000000 0000089A&lt;br /&gt;
A0000000 00000019&lt;br /&gt;
DA000000 00000000&lt;br /&gt;
D4000000 00002400&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
D7000000 02066D98&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| '''Actual version'''&lt;br /&gt;
&lt;br /&gt;
*Pokémon-Modifier &lt;br /&gt;
*Level-Modifier &lt;br /&gt;
*Nature-Modifier&lt;br /&gt;
&lt;br /&gt;
'''Step 1'''&lt;br /&gt;
&lt;br /&gt;
*Start + L &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Amount of the 1. Items &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 493&lt;br /&gt;
*Start + R &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Amount of the 2. Items &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 100 &lt;br /&gt;
*Start + Select &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Amount of the 3. Items &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; 25&lt;br /&gt;
&lt;br /&gt;
'''Step 2 '''&lt;br /&gt;
&lt;br /&gt;
*L &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Choose the wild '''Pokémon''' by setting the amount of the '''first''' item. &lt;br /&gt;
*R &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Choose the '''level''' of the wild Pokémon by setting the amount of the '''second''' item. &lt;br /&gt;
*Select &amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt; Choose the '''Nature''' of the wild Pokémon by setting the amount of the '''third''' item*.&lt;br /&gt;
&lt;br /&gt;
Watch out: If your press the 4 buttons Start + Select + L + R, the game will restart.&lt;br /&gt;
&lt;br /&gt;
[[Image:Nature_list.png|thumb|center|200x136px|*List of the Natures]]}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Crazy Zoom! v1.2&lt;br /&gt;
|&lt;br /&gt;
B21C4D28 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
DC000000 0000150E&lt;br /&gt;
A0000000 FF000004&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
121CED48 0000F000&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
B21C59A4 00000000&lt;br /&gt;
DA000000 0000001A&lt;br /&gt;
94000130 FCF30204&lt;br /&gt;
D4000000 FFFFFFFF&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
94000130 FCF30208&lt;br /&gt;
D4000000 00000001&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
74000100 FF000020&lt;br /&gt;
D7000000 0000001A&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
B21C59A4 00000000&lt;br /&gt;
DA000000 00000022&lt;br /&gt;
94000130 FCF30108&lt;br /&gt;
D4000000 FFFFFFFF&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
94000130 FCF30104&lt;br /&gt;
D4000000 00000001&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
74000100 FF000020&lt;br /&gt;
D7000000 00000022&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
B21C59A4 00000000&lt;br /&gt;
DA000000 0000002A&lt;br /&gt;
94000130 FCF30004&lt;br /&gt;
D4000000 FFFFFFFF&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
94000130 FCF30008&lt;br /&gt;
D4000000 00000001&lt;br /&gt;
D0000000 00000000&lt;br /&gt;
74000100 FF000020&lt;br /&gt;
D7000000 0000002A&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| '''Features'''&lt;br /&gt;
&lt;br /&gt;
* Zoom&lt;br /&gt;
         o R+Start - Zoom in&lt;br /&gt;
         o R+Select - Zoom out&lt;br /&gt;
* Rotation Left/Right&lt;br /&gt;
         o L+Select - Left&lt;br /&gt;
         o L+Start - Right&lt;br /&gt;
* Rotation Up/Down&lt;br /&gt;
         o L+R+Start - Up&lt;br /&gt;
         o L+R+Select - Down&lt;br /&gt;
&lt;br /&gt;
[[Image:Crazy_Zoom_1.png|thumb|center|150x114px|*Crazy Zoom Pictures 1]][[Image:Crazy_Zoom_2.png|thumb|center|150x114px|*Crazy Zoom Pictures 2]]}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Motion3D&lt;br /&gt;
|&lt;br /&gt;
94000130 FDFF0000&lt;br /&gt;
DA000000 02000002&lt;br /&gt;
B21C4E68 00000000&lt;br /&gt;
B0000004 00000000&lt;br /&gt;
D7000000 0000150E&lt;br /&gt;
DC000000 FFFFFFFE&lt;br /&gt;
94000130 FFF70000&lt;br /&gt;
DA000000 00112F56&lt;br /&gt;
D3000000 00000000&lt;br /&gt;
D7000000 02000002&lt;br /&gt;
D2000000 00000000&lt;br /&gt;
| Simply type in your Poktéch calculator the number of your desired camera perspective and press L + Start to save the number in the memory. Then hold L while going into a house (or getting out of it) for using that number.&lt;br /&gt;
&lt;br /&gt;
 00 - Basic 3D&lt;br /&gt;
 04 - Basic 2D&lt;br /&gt;
 05 - 3D Like on ''Spear Pillar''&lt;br /&gt;
 08 - 3D Camera high placed, like on ''Stark Mountain''&lt;br /&gt;
 09 - 3D Better sight, like in the ''Eterna City'' arena&lt;br /&gt;
 14 - 3D Little dwarfs in a world of giants, like in ''Hall of Origin''}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Nintendo DS|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Nintendo DS/Action Replay|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=665</id>
		<title>User:King Rhyono</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=665"/>
				<updated>2008-11-12T22:37:49Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Uses magic to turn Rhyono into cat and has him neutered and de-clawed*&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=649</id>
		<title>User:King Rhyono</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=649"/>
				<updated>2008-11-08T05:11:05Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I love Aqua....&lt;br /&gt;
&lt;br /&gt;
...in the butt.&lt;br /&gt;
&lt;br /&gt;
Message:&lt;br /&gt;
You vandalized my page first, and I always pay back tenfold.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=648</id>
		<title>User:King Rhyono</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=648"/>
				<updated>2008-11-08T05:04:58Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I love Aqua....&lt;br /&gt;
&lt;br /&gt;
...in the butt.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=646</id>
		<title>User:King Rhyono</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=646"/>
				<updated>2008-11-07T23:33:45Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Imperfect Cocksucker.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=644</id>
		<title>User:King Rhyono</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=644"/>
				<updated>2008-11-07T20:04:12Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I haz cock, it r teeny, and luvs tu bee kicked.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=640</id>
		<title>User:King Rhyono</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=640"/>
				<updated>2008-11-07T04:05:38Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gayass Bitch McFucker III&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=630</id>
		<title>User:King Rhyono</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=User:King_Rhyono&amp;diff=630"/>
				<updated>2008-11-06T02:14:43Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;God of fail.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Universal_Debugger_Project&amp;diff=614</id>
		<title>Universal Debugger Project</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Universal_Debugger_Project&amp;diff=614"/>
				<updated>2008-11-03T12:47:56Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: fixed misplaced bracket&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a reference and general documentation for a project I ([[:User:Parasyte|Parasyte]]) have been interested in pursuing for several years. This article will discuss the project's history, current developments, and future.&lt;br /&gt;
&lt;br /&gt;
I've made an effort to write this document with as little technical jargon as possible. The nature of debuggers and debugging, however, is extremely technical, so it has been difficult to keep it down to a decent reading level. For this reason, I've included an Appendix which should ease the use of language throughout this documentation.&lt;br /&gt;
&lt;br /&gt;
Finally, I hope this information is not too redundant. Some things (examples given, explanations, etc) may be repeated more than once. This document is supposed to be highly detailed, but concise. If you see many repetitious things, please point them out on the discussion page.&lt;br /&gt;
&lt;br /&gt;
==Project history==&lt;br /&gt;
&lt;br /&gt;
I began my research into debuggers sometime in 1999. Things were different back then; computers were just barely able to emulate SNES, even with emulators of the time taking numerous shortcuts to help speed up emulation. At the time, I only know of one SNES emulator pre-compiled with any kind of debugging functionality, and that was a build of SNES9x (then a chromeless application which was horribly difficult to use) by LordTech. It allowed the user to enable and disable assembly tracing while the game ran. This was a good start; you could see what the game was doing, and gain a lot of information from it. But it was still clunky.&lt;br /&gt;
&lt;br /&gt;
To find the assembly which read or wrote to a specific address, you had to search through (often many megabytes of) text for those addresses. It gave you a good piece of the puzzle, but it did not give you the whole picture. Often many instructions were branched over, and were entirely missing from the log.&lt;br /&gt;
&lt;br /&gt;
A few years later, I had some C programming experience of my own under my belt, and I had also found a new NES emulator called NESten. It wasn't a great NES emulator, but it was decent; it ran most of the NES games I was interested in, and it also had a fairly nice debugger built in! It was during this time that I got my first real taste of debugging. (Previously I experimented with UltraHLE's debugging features, but I don't recall them being much use; it used another &amp;quot;look but don't touch&amp;quot; passive take on debugging.)&lt;br /&gt;
&lt;br /&gt;
NESten's debugger (and the emulator itself) did have some annoying flaws. And after getting sick of it, I decided (like many pioneering hackers before me) to take a decent open source emulator and extend it with some decent debugging capabilities. I chose FCEU (FamiCom Emulator Ultra) by Xodnizel as my base. (Note: FCEU was previously based on FCE, by Bero.) FCEU was a good candidate because it had decent emulation capabilities, and also because it was quite fast; you really need a fast base if you're just going to slow it down with powerful features. And I'll get to that point later.&lt;br /&gt;
&lt;br /&gt;
===FCEUd===&lt;br /&gt;
&lt;br /&gt;
And with that, FCEUd (FCEU-debug) was born. It did not take long to get a stable debugger integrated into the CPU core and hooked up with a little chrome. Seems like it was only 3 or 4 months before it was usable, and a total of 6 months or so development time before I was happy with it. This debugger took all of the major ideas from NESten (including its disassembler syntax for displaying current work addresses) and added some crucial elements that NESten lacked (write breakpoints triggered by INC/DEC instructions, which increment and decrement bytes in memory). I also used ideas from PSX debuggers, such as &amp;quot;step out&amp;quot; which mutually completes the &amp;quot;step in&amp;quot; and &amp;quot;step over&amp;quot; process. And I'll get to that point, again, later.&lt;br /&gt;
&lt;br /&gt;
Since then, FCEUd has been further extended by other members of the emulation/ROM hacking scenes. To this day, FCE has been the most widely forked emulator, in part, because of the work we did extending it from an NES player to an NES development tool. But as you will see, this will bring me to another point later: The work done on FCE-derived forks is very widespread without much communication between parties. Ultimately, it's a mish-mash mix of talent tackling the same ideas from different vantage points without direct collaboration. And I think it's a shame.&lt;br /&gt;
&lt;br /&gt;
===GCNrd===&lt;br /&gt;
&lt;br /&gt;
The main development cycle on FCEUd was during 2002. I learned quite a bit from this project, and it got me interested in debugging other architectures. The next architecture I took on was Nintendo GameCube, officially abbreviated &amp;quot;GCN&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Sometime in 2003, hackers discovered a flaw in the GCN game Phantasy Star Online, which was compatible with the GCN BroadBand Adapter (BBA). This quickly became known as the PSO exploit, and allowed running &amp;quot;homebrew&amp;quot; code on a consumer GCN.&lt;br /&gt;
&lt;br /&gt;
The PSO exploit worked something like this: Hacker Joe sets up his own DNS server, and tells PSO to use that server IP address as its default gateway. This way, PSO asks Hacker Joe's DNS server where it can find Sega's PSO server. Hacker Joe's DNS server tells PSO that Sega's server is located on Hacker Joe's PSO server. PSO happily connects to Hacker Joe's PSO server, which then tells PSO that there is an update available. PSO happily downloads the &amp;quot;PSO loader stub&amp;quot; which is posing as an official update to PSO. PSO happily launches the PSO loader stub which takes over the GCN and begins downloading a larger executable (of Hacker Joe's choice) from Hacker Joe's PSO server. The PSO loader stub then launches Hacker Joe's executable, and Hacker Joe now has total control over his GCN. In short, PSO is tricked by Hacker Joe into running code that it never should have in the first place.&lt;br /&gt;
&lt;br /&gt;
This was a huge breakthrough for GCN hacking. I was in a very poorly state at the time, with no real job and no real income. I was doing work for a certain company selling GBA flash carts. It got me by, but it was a far cry from decent living. I mention this because it means I couldn't afford PSO or a BBA; the two things I needed to begin work on GCN debugging. I had the skill to accomplish it certainly, so I took up donations from members in the community. Only a few responded, but that's all I needed. About $100 USD was enough to pick up the two items I needed, and I was on my way to fame...&lt;br /&gt;
&lt;br /&gt;
====History of GCNrd====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;06-22-03: First GCN AR codes decrypted.&lt;br /&gt;
06-23-03: GCNcrypt v1.0 released.&lt;br /&gt;
06-25-03: First unofficial GCN AR codes released: Sonic Adventure DX (U) codes,&lt;br /&gt;
          by Sappharad.&lt;br /&gt;
06-27-03: GCNcrypt v1.1 released.&lt;br /&gt;
07-03-03: Planning for GCNrd begins.&lt;br /&gt;
07-07-03: GCNrd development begins.&lt;br /&gt;
08-27-03: Development on GCN network library begins.&lt;br /&gt;
08-29-03: First data received from GCN over network, using homebrew network&lt;br /&gt;
          library.&lt;br /&gt;
09-01-03: First data received by GCN over network, using homebrew network&lt;br /&gt;
          library.&lt;br /&gt;
09-13-03: Harddrive crash causes problems. Interest in GCNrd is lost.&lt;br /&gt;
12-31-03: After 3 months without working on GCNrd, aside from the occasional&lt;br /&gt;
          bugfix in the libs, GCNrd development finally continues.&lt;br /&gt;
12-31-03: Milestone #1. First successful RAM dump grabbed from a GCN game using&lt;br /&gt;
          GCNrd. It takes 35.735 seconds to complete.&lt;br /&gt;
12-31-03: BBA is started in 100mbit full duplex mode. Full RAM dump completes&lt;br /&gt;
          in 14.687 seconds.&lt;br /&gt;
01-03-04: Work on screenshot support begins. First successful screenshots are&lt;br /&gt;
          taken from Rayman 3 and Rogue Leader.&lt;br /&gt;
01-12-04: Mario Kart: Double Dash!! (U) is supported by GCNrd. This was the&lt;br /&gt;
          first successful &amp;quot;BBA Reset&amp;quot; patch for a LAN\network-enabled game.&lt;br /&gt;
01-15-04: Milestone #2. GCNrd rightly claims better compatability than Datel's&lt;br /&gt;
          FreeLoader v1.06b.&lt;br /&gt;
01-17-04: All tested games boot! 64 of 64.&lt;br /&gt;
01-19-04: Kenobi begins work on a GUI for GCNrd, making the program a bit&lt;br /&gt;
          easier to use, and adding code search features.&lt;br /&gt;
01-23-04: Milestone #3. First GCN AR code created using only GCNrd and Kenobi's&lt;br /&gt;
          GCNrd GUI. Wave Race: Blue Storm (U), 99 Points, by Knux0rz.&lt;br /&gt;
01-25-04: Started adding breakpoint support. Breaks work for Read, Write, and&lt;br /&gt;
          Read+Write. Execution breakpoints will be next. BPR\W gave me a bit&lt;br /&gt;
          of trouble. The biggest problem I had was getting around the 8-byte&lt;br /&gt;
          boundary which PowerPC uses for data breakpoints. This was completely&lt;br /&gt;
          unacceptable. As an example, if you set a breakpoint on address&lt;br /&gt;
          805E4FF5, a break would be reported every time an address between&lt;br /&gt;
          805E4FF0 - 805E4FF8 was accessed. Even though only one address within&lt;br /&gt;
          that range had a breakpoint set. My current solution to this problem&lt;br /&gt;
          is pretty nasty, but it works. In fact, it only reports a hit if the&lt;br /&gt;
          break addresses match perfectly. Maybe a little inconvenient, but&lt;br /&gt;
          hey!&lt;br /&gt;
03-11-04: GCN CodeType Helper v1.0 released.&lt;br /&gt;
03-11-04: GCNcrypt v1.2 released.&lt;br /&gt;
03-16-04: Finished up breakpoint support today, which should now be 100% fixed.&lt;br /&gt;
          The debugger now waits until just before returning to the game&lt;br /&gt;
          before enabling any r\w breakpoint. This will help bypass any&lt;br /&gt;
          misleading break hits that are caused by the debugger itself. Such as&lt;br /&gt;
          when accessing the stack and etc.&lt;br /&gt;
          New plan in the works to work-around memory constraints. May not work&lt;br /&gt;
          on all games, but should solve all problems with PacMan World 2.&lt;br /&gt;
          Which currently suffers from a nasty crash when accessing the memory&lt;br /&gt;
          card. The crash appears to be caused by how much memory I have&lt;br /&gt;
          allocated for the debugger.&lt;br /&gt;
03-17-04: Work begins on patching AR's code engine. With the patch in place,&lt;br /&gt;
          the code engine will run GCNrd's memory-resident debugger, allowing&lt;br /&gt;
          users to hack games with multiple executables, such as demo discs and&lt;br /&gt;
          the James Bond 007 games.&lt;br /&gt;
03-18-04: Kenobi adds real-time AR code list handling to the GUI. Supported AR&lt;br /&gt;
          versions are v1.06 and v1.08. Support for additional versions will be&lt;br /&gt;
          made available as soon as we receive AR RAM dumps from the other&lt;br /&gt;
          versions.&lt;br /&gt;
03-19-04: Win9x compatibility issues are worked on. GCNrd console now accepts&lt;br /&gt;
          commands passed on the command line. With commands entered on the&lt;br /&gt;
          command line, the console program will exit immediately after&lt;br /&gt;
          completing the requested command. Support for Win9x compatibility in&lt;br /&gt;
          the GUI is limited, but progressing rapidly.&lt;br /&gt;
03-20-04: Support for AR v1.11 completed.&lt;br /&gt;
03-31-04: First public release! GCNrd v1.00b is made available to hackers&lt;br /&gt;
          everywhere.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====GCNrd GUI====&lt;br /&gt;
&lt;br /&gt;
The GUI for GCNrd (Nintendo Gamecube Remote Debugger) was written entirely separately from my own GCNrd development. It was called simply GCNrdGUI and was written by a French hacker, Kenobi, in Delphi. This split up the workload considerably, and also added a new level of modularity to the project overall. The overall GCNrd project consisted of four components:&lt;br /&gt;
&lt;br /&gt;
* GCNrd Loader: The UI that the user is presented with on the GCN itself. The loader is responsible for GCN-side configuration, initializing the network hardware, launching DVDs, and setting up the debugger/hooking the executable.&lt;br /&gt;
* GCNrd debugger: This is a piece that the user never sees, but directly interacts with. It's a very small program (32KB total program code and memory usage) that runs &amp;quot;behind&amp;quot; the game, listening for instructions coming over the network, and acting upon them.&lt;br /&gt;
* GCNrd client: A command-line application run on the user's PC which can be used to send and receive commands and data to/from the debugger over the network.&lt;br /&gt;
* GCNrdGUI: Kenobi's GUI for interacting with the GCNrd client.&lt;br /&gt;
&lt;br /&gt;
It was not necessary for the GUI to interact with the debugger through my CLI client, but that was the option chosen for GCNrdGUI. Later on another hacker, Sappharad, wrote his own GUI in Java which communicated with the debugger directly, bypassing the need for GCNrd client; the modularity of the project comes full circle.&lt;br /&gt;
&lt;br /&gt;
====GCNrd v1.10b and beyond====&lt;br /&gt;
&lt;br /&gt;
GCNrd v1.10b was released July 28th, 2005. It contained a number of bug fixes and new features. Some new features were only shiney on the surface (background images and UI colors in the loader, date/time display...), but some were actually quite important. The MMU handling, for example, allowed hacking games like Star Wars: Rogue Leader, Star Wars: Rebel Strike, and Metal Gear Solid: The Twin Snakes, which used the MMU extensively. It was a slightly rushed released, even though it did show some promise.&lt;br /&gt;
&lt;br /&gt;
This was the last official release I made, along with a private release (only available to close friends) which included some special features like DVD dumping and loading/debugging DVD images over the BBA. This &amp;quot;DVD simulation&amp;quot; was quite advanced for its time, and allowed me (and a few others) to hack downloaded/dumped games. There are often times that the only way to get a copy of a game is downloading it. Either because it was never officially released in your region, or because it hasn't been officially released ''at all''. This private &amp;quot;v1.10b+&amp;quot; version was never made public due to piracy concerns. &lt;br /&gt;
&lt;br /&gt;
Those piracy concerns were actually forfeited after other hackers disabled the DVD booting code in v1.10b to allow debugging DVD-Rs booted with a &amp;quot;Cobra-like&amp;quot; DVD BIOS.&lt;br /&gt;
&lt;br /&gt;
I had plans at one time to rewrite GCNrd so that it could be relocatable within GCN memory. This would solve problems with memory allocation on games that don't play nice. Resident Evil 4 is a good example of such games; it cannot be booted at all by any version of GCNrd. The rewrite would also make the source code legible enough that I could release it under the [http://www.gnu.org/copyleft/gpl.html GPL]. Granted, legibility is not necessary for source code release, but it was important for reasons of maintainability.&lt;br /&gt;
&lt;br /&gt;
GCNrd source code used a wild mix of C and assembly in its main debug core. Escaping the low levels of assembly was impossible, but it could be structured nicely anyway. This wasn't the only problem, of course. Both the loader and debugger had to have their own separate build of the network library. It was too costly (memory-wise) to put the full library into the debugger, even though this would allow the loader to use the debugger for all of its networking tasks.&lt;br /&gt;
&lt;br /&gt;
Instead, the debugger had a very minimal network library; I cut out all of the initialization sequences, all of the CRC code for packet data integrity checking, and a whole lot of other not-completely-necessary packet handling code. It was important to keep the debugger as small as possible so it would not interfere with the game's use of memory.&lt;br /&gt;
&lt;br /&gt;
That gave me two entirely different network stacks to maintain; one was already quite a bit of work, as it was. There was also the problem of compiling the debugger separately from the loader, and then compiling the debugger binary directly into the loader itself.&lt;br /&gt;
&lt;br /&gt;
There are a number of ways these issues could have been addressed, and I'm not going to cover them all. But I will get back to the early point about modularity. As you will see, I am hoping to solve a great deal of these problems using that frame of mind. Needless to say, I never did complete the rewrite of GCNrd, which would have become &amp;quot;GCNrd v2&amp;quot;. But the problems displayed by it were the cornerstones of what was to become the Universal Debugger Project.&lt;br /&gt;
&lt;br /&gt;
===PCS and Mupen 64===&lt;br /&gt;
&lt;br /&gt;
The next year, in 2006, I went back to hacking N64. This was a time when some very interesting N64 hacks were made [http://doc.kodewerx.net/hacking_n64.html#asm_jesus_mode]. By this time, we were all very familiar with Nemu and its debugging/cheating capabilities. The debugger was not bad, but its emulation left quite a bit to be desired. Once again, unhappy with the tools available, I set out to tackle the problem and create my own tools.&lt;br /&gt;
&lt;br /&gt;
The first was [http://doc.kodewerx.net/hacking_n64.html#emulator_pcs Parasytic Cheat Search], a ''video'' plugin for PJ64 (and other emulators compatible with its plugin spec) that allowed cheat searching through the emulator's memory. It contained many bugs and architectural flaws (being a video plugin which passed all video-related messages to a ''real'' video plugin) but it provided a start for me to get into N64 emulator development.&lt;br /&gt;
&lt;br /&gt;
My next N64 project was tackling the debugger problem. Unlike a simple passive cheat searching program, a debugger has to be hooked directly to the CPU to work consistently. Like the FCEUd project years earlier, I wanted to start with a decent open source emulator and extend its capabilities to include decent debugging features.&lt;br /&gt;
&lt;br /&gt;
I chose Mupen 64 as my base, this time. It had relatively high compatibility, stability, and speed. It also contained a debugger for its GTK+ build, which I knew I could use to my advantage. I was still a Win32 programmer at the time; I did not have much experience outside of Windows. Naturally, I focused on Mupen's Windows code, which is where my debugger would live.&lt;br /&gt;
&lt;br /&gt;
After patching Mupen's CPU core (all three of them!) I started implementing the debugger window and all of its fancy widgets. This is when a very bad case of Deja Vu hit me. I had done all of this work before; I was reinventing the wheel. Not good. So I left Mupen 64 with a bare-bones cheat feature (including search) and debugger. This is when I began formulating the idea that debugger interfaces should be modular, just like GCNrd. Then came an avalanche of questions and issues. More on that later.&lt;br /&gt;
&lt;br /&gt;
===NTRrd and Kwurdi===&lt;br /&gt;
&lt;br /&gt;
In 2007, we had Nintendo DS (officially abbreviated NTR, unofficial NDS), and we had a means to hack it thanks to the efforts of the PassMe crew. I did not jump into DS dev quite as enthusiastically as I had GCN, but I eventually got into it and started playing around with ideas to debug the little machine. There were several problems, initially: The first was a communications port. I chose to use the GBA X-port, which was a rather expensive device (especially for video game hackers, who are typically in their teens, and without jobs; in hindsight, it was probably a very bad idea), but it was attractive to me because of its FPGA.&lt;br /&gt;
&lt;br /&gt;
The X-port comes by default with a simple LPT serial port that can be used as a communications link. But it is generally slow and unreliable for large data transfers. On the other hand, the FPGA (and a LOT of IO) can be leveraged to implement a much faster and more stable communications link. And that's exactly what I did, writing custom FPGA logic for a simple 8-bit ECP-mode LPT port. The result was a much faster (~4MB/s ... still much slower than ethernet, WiFi, or USB would have been) and much more reliable (~0.0001% error rate) communications link that I could use to dump NDS memory to perform cheat searching.&lt;br /&gt;
&lt;br /&gt;
The initial result of this work was &amp;quot;NTRrd&amp;quot; (Nintendo DS Remote Debugger) which never saw any kind of release. That's when the ideas from past projects began to meld into an idea well ahead of its time. The idea of a universal debugger. Or at least, a universal debugger interface. So I came up with a silly acronym: KWURDI, for KodeWerx Universal Remote Debugger Interface. And I wanted NTRrd to be its first &amp;quot;client&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The idea was that NTRrd would be a three-piece project: NTRrd loader, NTRrd debugger, NTRrd client. And Kwurdi would be its GUI. The loader would load the debugger, the debugger would talk to the client, and the client would talk to the GUI. That's a lot of levels of abstraction. As it turns out, though, all of those levels are quite important. In fact, it's this level of abstraction and modularity which make this idea of a universal debugger important.&lt;br /&gt;
&lt;br /&gt;
==The universal debugger==&lt;br /&gt;
&lt;br /&gt;
The original article for the Universal Debugger Project can be found in the [[Debugging Modern Computer Architectures]] article. While it covers a good general scope of the idea itself, it does not lay down any foundation other than a very generic description of the roles that each piece of the project ''might'' play. To highlight the main points of the project:&lt;br /&gt;
&lt;br /&gt;
* The universal debugger interface itself is a user interface to allow interaction with a low-level debugger.&lt;br /&gt;
* The low-level debugger may or may not live on the same machine as the universal debugger interface. The universal debugger interface communicates with the low-level debugger through a standard communications link and protocol.&lt;br /&gt;
* The communications link should be an existing standard. For example, UNIX domain sockets or DBUS for a local low-level debugger, and TCP/IP for a remote low-level debugger.&lt;br /&gt;
* The protocol should also be an existing standard, but to this date, there does not appear to be anything which fits the goals of a universal debugger interface. One possibility is [http://www.rfc-archive.org/getrfc.php?rfc=909 RFC-909, Loader Debugger Protocol].&lt;br /&gt;
&lt;br /&gt;
===Project goals===&lt;br /&gt;
&lt;br /&gt;
The long term goals of the Universal Debugger Project include:&lt;br /&gt;
&lt;br /&gt;
* Modularity&lt;br /&gt;
* Standardization&lt;br /&gt;
&lt;br /&gt;
These items are to be taken as mutually inclusive. For modularity to work, there must be a set of standards in place. For a set of standards to be successful, the modularity granted by the standards must be exploited.&lt;br /&gt;
&lt;br /&gt;
For our purposes, I wish to implement a set of standards for a &amp;quot;universal debugger&amp;quot; with the help of the community, and implement a debugger interface on top of those standards as an example of modularity. The implementation has the following goals:&lt;br /&gt;
&lt;br /&gt;
# It will be Free Software, released under a free software license comparable to the [http://www.gnu.org/copyleft/gpl.html GNU General Public License].&lt;br /&gt;
# It will be a community-oriented project; accepting ideas, patches, code, images, and documentation, among other items, from the community which supports it.&lt;br /&gt;
# It will be designed as a cross-platform application, able to be used on multiple operating systems.&lt;br /&gt;
# It will be built with internationalization and localization in mind; capable of being adapted to different languages.&lt;br /&gt;
# It will be designed to work well with modern accessibility software.&lt;br /&gt;
# It will communicate with and support any low-level debugger which supports the standards defined by the Universal Debugger Project.&lt;br /&gt;
# It will be configurable, extensible, and modular by nature, to support any conceivable current or future architecture.&lt;br /&gt;
# It will support highly advanced debugging techniques and bleeding-edge technologies to get the most out of the user's debugging experience.&lt;br /&gt;
# It will support and encourage community activity through collaborative debugging.&lt;br /&gt;
&lt;br /&gt;
I will cover these points one at a time in more detail:&lt;br /&gt;
&lt;br /&gt;
====Free software====&lt;br /&gt;
&lt;br /&gt;
Free Software released under the [http://www.gnu.org/copyleft/gpl.html GNU General Public License] or a comparable license is meant to be community-driven. This means, anyone who wants to participate in the development of the project is free to participate. You don't become a community member by being one of a few elite deemed &amp;quot;worthy&amp;quot;; you become a member simply by joining an active discussion or contributing in some other way.&lt;br /&gt;
&lt;br /&gt;
The source code will be made available for everyone to look at or extend, which benefits from many eyes keeping the code safe and secure, and also from many hands working in parallel to quickly produce a stable product that is free for anyone to use in any way they see fit. These are two of the basic freedoms granted by a Free Software license: Freedom to look at and extent the product, and freedom to use the product in any way. There are many more freedoms granted by Free Software, and if interested you should consult the GPL documentation or other authoritative sources.&lt;br /&gt;
&lt;br /&gt;
====Community-oriented, community-driven====&lt;br /&gt;
&lt;br /&gt;
A community-oriented and community-driven software project benefits from its main source of use: its own users. Such projects become self-sustaining, as their users take the secondary roles of developers. I will not cover many of the details relating to community-oriented or community-driven software, but there are plenty of great resources available for further reading. Some suggested reading includes The Cathedral and the Bazaar [http://www.catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/index.html#catbmain] by Eric S. Raymond, the About Mozilla pages [http://www.mozilla.org/about] [http://www.mozilla.org/about/manifesto] [http://www.mozilla.org/mission.html] [http://www.mozilla.org/editorials/mozilla-overview.html], and the online book Open Sources: Voices from the Open Source Revolution [http://oreilly.com/catalog/opensources/book/toc.html], written by many influential people from many open source communities.&lt;br /&gt;
&lt;br /&gt;
As a community-oriented, community-driven project, I believe there is no end to the ways in which we, as a community of programmers and hackers, will be able to debug. This community would ideally involve the active roles of everyone from video game and ROM hackers, application and operating system developers, and people in the field of academic research of computer architectures. It doesn't have to be the biggest and the best of the debugging communities (and it probably won't!) but it does have to be an accepting community, willing to allow contributions from anyone and everyone who wishes to contribute.&lt;br /&gt;
&lt;br /&gt;
====Cross-platform design====&lt;br /&gt;
&lt;br /&gt;
Among the design goals of the project, the universal debugger implementation must be able to run on multiple computer platforms and operating systems. This is a difficult undertaking, especially for a program focusing on a graphical user environment. Several bases for cross-platform development already exist, so dealing with intricacies of operating systems can be cut down to a minimum, while retaining a high level of overall product quality.&lt;br /&gt;
&lt;br /&gt;
I have personally researched several offerings for cross-platform frameworks and libraries, and I believe the best choice is the Mozilla platform, [http://developer.mozilla.org/en/XULRunner XULRunner]. XULRunner is still in its infancy, but is already very capable; it's the powerhouse behind the Firefox web browser, which runs on a large percentage of popular operating systems.&lt;br /&gt;
&lt;br /&gt;
Here is a short list of advantages to using XULRunner over just any cross-platform framework:&lt;br /&gt;
&lt;br /&gt;
* XULRunner is Free Software, and its development is community-oriented.&lt;br /&gt;
* Unlike Java and .NET, XULRunner applications are built with native code and have a native look-and-feel (&amp;quot;native&amp;quot; is in reference to the host operating system).&lt;br /&gt;
* Also unlike Java and .NET, XULRunner applications are written in C++, a highly portable and widely used programming language.&lt;br /&gt;
* XULRunner provides many features that Firefox users are already familiar with: scripting with Javascript, application extensibility through &amp;quot;extensions&amp;quot;, networking and popular web protocols support, HTML processing (and a LOT more) with the Gecko layout engine.&lt;br /&gt;
* User interfaces in XULRunner are written in XUL (an XML dialect), styled with CSS, and setup to &amp;quot;do things&amp;quot; with Javascript -- all current web standards. The use of CSS allows the user interface to be &amp;quot;skinned&amp;quot; to a user's personal tastes.&lt;br /&gt;
* UI functionality is mostly implemented with Javascript, but backbone and critical code can be written in C++ and accessed from the Javascript environment.&lt;br /&gt;
&lt;br /&gt;
For a very informative read on the Mozilla platform, I recommend the online book [http://books.mozdev.org/chapters/index.html Creating Applications with Mozilla].&lt;br /&gt;
&lt;br /&gt;
====Internationalized and localized====&lt;br /&gt;
&lt;br /&gt;
Because community strengths are so important to a project of this size and magnitude, the global community becomes an invaluable asset. And as a diverse global community, not everyone will speak or understand a single common language. In this case, I am directly referring to the English language, which is personally my primary language, and the only language I am entirely fluent. Programmers and hackers in a similar situation, though with a different primary language, will benefit from a universal debugger. We should not neglect any user in the community. Making the universal debugger accessible and usable for everybody must be a top priority of the project.&lt;br /&gt;
&lt;br /&gt;
Choosing the Mozilla platform as the application's foundation will play a crucial role in the internationalization of the product. Because the user interface elements are written in an XML dialect, all text can be referenced with DTD entities, just like you might write &amp;amp;amp;gt; in XHTML to print the greater-than sign (&amp;amp;gt;). Likewise, you might write&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;caption label=&amp;quot;&amp;amp;amp;hello;&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in XUL which would display a label with &amp;quot;Hello&amp;quot; or &amp;quot;こんにちは&amp;quot; depending on the locale set on the user's machine when the XUL application is started.&lt;br /&gt;
&lt;br /&gt;
DTD entities are not magic translators; the text must be translated by a human who is fluent in both (source and destination) languages. However, using DTD entities is a great way to write user interfaces (and other things, like configuration files, for example) without locking the program to a specific language. It also makes the translator's work much easier, since all text strings which require translation will be neatly stored in a single location.&lt;br /&gt;
&lt;br /&gt;
Having the capability to bring a universal debugger to anyone, no matter their ethnic background, will help to expand the debugger's user base and ultimately its supporting community of developers. Designed from the beginning with breaking language barriers in mind, there should be few stumbling points along the road to the success of reaching this goal.&lt;br /&gt;
&lt;br /&gt;
====Accessible for everyone====&lt;br /&gt;
&lt;br /&gt;
On a personal note, I had the chance to tutor someone in hacking a few years ago who told me that he was blind in one eye. This makes me see the reality that we're not all perfectly capable of using most debuggers available in the wild. Most of us hackers can get along fine with them, while a few are left to try their best at making use of such applications.&lt;br /&gt;
&lt;br /&gt;
Mozilla once again comes to the rescue with a modern, mature, stable API for application accessibility. Some examples include integration and coherence with screen readers and voice recognition software. There may not be a great deal of hackers which could make use of these technologies, but having the option available is important to the individuals who would have never thought to bother with debuggers, otherwise.&lt;br /&gt;
&lt;br /&gt;
And let's face grim reality here; I could one day end up physically mangled in a horrible accident, unable to see or use a keyboard or mouse. That won't change my love and desire to continue hacking. I could almost consider debugger accessibility a personal insurance for myself, let alone many hundreds of potential users ''today''.&lt;br /&gt;
&lt;br /&gt;
====Standards compliant====&lt;br /&gt;
&lt;br /&gt;
Standards make the technological world work. And standards compliance makes compatibility issues entirely negligible. This is perhaps the most important point I will make within this documentation: defining a series of open standards to encompass ''all'' foreseeable debugging functionality is a necessity.&lt;br /&gt;
&lt;br /&gt;
The major reason for adopting a standard or series of standards is for compatibility purposes. Compatibility is critical for modular designs. And modularity is an important part of the overall user-configuration and extensibility of an application or sets of applications. Modularity also has the benefit of splitting workloads, as we did previously with GCNrd. Splitting workloads decreases development times, improves communication, and in some cases even improves product quality.&lt;br /&gt;
&lt;br /&gt;
In simpler terms, starting with splitting developer workloads, we all know that it's easier to cover more ground by splitting up. So long as you have a central location to meet up later, this tactic works wonderfully for rapid application development. In the case of developing a debugger, you might typically have one team focusing on the low-level handling of the CPU and hardware, another team tackling the user interface to the low-level debugger, and perhaps a third team covering the protocol between the two.&lt;br /&gt;
&lt;br /&gt;
I realize that the &amp;quot;third team&amp;quot; in this example is most likely set aside as another task for the first team in the real world. But if your project does require some sort of communication layer and you pull that out of the first team's hands, you can effectively pass that responsibility to a sort of &amp;quot;standards body&amp;quot; who will oversee the development and ''standardization'' of that communication layer. The job of such a body would be to ensure the standard is usable by anyone and for any purpose, generic enough to support all current and foreseeable architectures, and extensible enough to support all unforeseeable future architectures.&lt;br /&gt;
&lt;br /&gt;
The extensibility of the standard would be the most difficult to maintain. While a protocol or communication layer of this sort should be extensible for the reasons listed, it should only be extensible to the extent that any new features added would not break previous features or introduce new compatibility issues with previous designs and implementations of the protocol or communication layer. This means, generally, that the extensibility must remain open and ''optional''; no extended feature should ever be mandatory for any user to implement.&lt;br /&gt;
&lt;br /&gt;
There will undoubtedly be important new technologies which require mandatory extensions to the protocol during the life cycle and evolution of debugging technology. Under these circumstances, the standards body would be responsible for designing and publishing a new major version of the protocol with the new mandatory technologies. Implementers of the protocol, should they choose to support newer major versions, would then be required to implement all mandatory features in order to claim standards compliance of their implementation.&lt;br /&gt;
&lt;br /&gt;
What we need is a standards body; a group of individuals, mostly volunteers or &amp;quot;elected&amp;quot; members, to define and publish a series of standards for debugging modern computer architectures. They will be responsible for taking everyone's concerns from the community into account, and act on those concerns within their design and definition. They will be responsible for knowing that if they fail to do a good job, the community will stop listening to them and they will easily be replaced by anyone who steps up with a better idea.&lt;br /&gt;
&lt;br /&gt;
The goals of the standards body will be defining:&lt;br /&gt;
&lt;br /&gt;
* The ''wire''; how we get data from point A (low-level debugger) to point B (user interface). Ethernet? RS232? ...&lt;br /&gt;
* The ''language''; how our data is interpreted as points A and B speak. XML? JSON? Pure binary packets? ...&lt;br /&gt;
* The ''expansion''; how we can introduce new features without creating vendor locks or introducing incompatibilities. Header/Info/About/Options commands which specify the optional/extended features we support? ...&lt;br /&gt;
&lt;br /&gt;
The goals for us developers will be inheriting some of these responsibilities as we implement these standards, to create a flourishing environment for debugger developers to contribute with innovation and healthy competition.&lt;br /&gt;
&lt;br /&gt;
====Configurable, extensible, and modular====&lt;br /&gt;
&lt;br /&gt;
Debuggers are all about user experience. I say this with honest integrity because debugging, by its very nature, is a difficult task. Making a debugger very simple to use is a bullet point; you don't want to overwhelm a user (who is already working on a very difficult problem) with bad user experience. To improve the user experience, it is important to allow a level of customization among the user interface. Also important is extensibility and modularity, to make it easy for the user to expand the interface to fit her needs, and easy to replace one component with another that she prefers.&lt;br /&gt;
&lt;br /&gt;
Some of the items of the user interface which should be configurable include the overall look-and-feel of the interface (skin), the organization of windows and widgets (tabs, information panes, etc.), and the styles of text, fonts, and [image-]backgrounds used throughout.&lt;br /&gt;
&lt;br /&gt;
The look of the application, as well as the functionality, should be extensible using styling and scripting languages. The Mozilla platform once again becomes an asset as it allows simple integration of CSS and Javascript for the purposes of extending applications based on the platform. Extensions can be written and managed by the user community, much the same way that Firefox extensions are written and distributed. A central management location for extensions would be a great thing to have, but is not necessary to the success of a thriving extension-based sub-community.&lt;br /&gt;
&lt;br /&gt;
Including certain feature sets in the application's base install as pre-installed extensions means that users may uninstall those extensions at will to remove undesired features, or replace those extensions with other extensions that implement comparable (and often better) features. This modular design will help to increase the user experience as well as the user's personal productivity with the application. This, too, can be supported by a thriving extension-based sub-community, and the community at large.&lt;br /&gt;
&lt;br /&gt;
====Advanced debugging technologies====&lt;br /&gt;
&lt;br /&gt;
When built on top of a well-designed, well-documented (and equally well-supported) standard, a debugger could implement advanced techniques and technologies to do things we can only dream of now. Some examples of my dreams:&lt;br /&gt;
&lt;br /&gt;
* The debugger interface records its target's activity using simple standard protocol features such as single stepping, and reading register and memory states. When the user pauses the target, the interface has collected enough information to step ''backwards'' in architecture time. Essentially, a runtime undo feature.&lt;br /&gt;
* The communications layer, being very generic, does not need to know the specifics of how the interfaces uses the data it is transmitting. A very simple example is that the user might be able to use the interface for capturing audio and video samples from a game running on the target architecture, simply by recording the state of the frame and audio buffers (using simple memory reads supported by the protocol) at a specified interval.&lt;br /&gt;
* The debugger interface allows incoming connections from other users to the debugging session in progress. There is a chat pane where connected users can talk about what they are doing, and they can watch each other scroll through the disassembler listing and making changes to instructions and assembler comments in real time. This &amp;quot;collaborative debugging&amp;quot; feature will be expanded upon in the next section.&lt;br /&gt;
&lt;br /&gt;
Creating &amp;quot;high level&amp;quot; debugging capability out of a limited set of &amp;quot;low level&amp;quot; primitive debugging functions is what makes the idea of a standardized communications layer so appealing to me. The first two examples given in the list above are highly specialized and advanced features built on top of a relatively small and &amp;quot;unexciting&amp;quot; set of functions; Reading and writing registers or parts of the memory map, controlling code flow with instruction stepping, etc. These latter functions are the kinds of things you would ''expect'' any debugger to do. What you might not expect is how these simple functions can be chained together to create very interesting features.&lt;br /&gt;
&lt;br /&gt;
This is where the foundation of standardization really comes into play with a universal debugger. As an example, if your NDS and PS2 both have debuggers implementing a single, standardized protocol, the universal debugger only needs to differentiate the two by their architectures. That is, the CPU type and configuration, register maps, memory maps, hardware I/O maps, etc. And once the architectures are known to the universal debugger, it can run the same advanced features (stepping backward, rewinding execution, audio/video recording, etc.) on both; just by using slightly different interpretations of the data it receives over the communication layer. No need for anyone to write a whole new codebase or interface; no more reinventing the wheel.&lt;br /&gt;
&lt;br /&gt;
With these kinds of extraordinary possibilities in mind, I can only expect standardization to be the only way forward in the subtle world of debugging modern computer architectures.&lt;br /&gt;
&lt;br /&gt;
====Encouraging community activity====&lt;br /&gt;
&lt;br /&gt;
Having an entire community to back a project of this type will be incredibly important. Communities are seeded with an idea, and nurtured with equal opportunity to participate. In order to allow greater community participation, I believe it is essential that the project encourage activity as much as the community itself does. One way to accomplish this is by including program features which directly involve multiple users to collaborate with each other.&lt;br /&gt;
&lt;br /&gt;
Two quotations come to mind in the spirit of collaborative debugging:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;quot;Debugging is parallelizable&amp;quot;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;quot;Given enough eyes, all bugs are shallow.&amp;quot;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first is a direct reference to multiple users working on debugging the same item, in parallel. The latter quote is slightly on the opposite; it means that you can have multiple users covering more ground by looking at different pieces of the code being debugged, and viewed from their own personal perspective on the problem. These are both great ideas to employ for large or difficult problems that many projects will face. The only problem is, it's usually handled with an &amp;quot;every man for himself&amp;quot; mentality. Multiple people running their own copies of the target, being debugged with their own debuggers, keeping their own notes, and withing and testing their own patches. All in solemn solitude.&lt;br /&gt;
&lt;br /&gt;
Why not take these two ideas one more step to the extreme? We can have several eyes on the same code, so let's also put several eyes on the same debugging session. Let's parallelize the debugging process with several minds double-checking each others work in real time, as they work; providing ideas and suggestions, and introducing patches directly into the stream for immediate testing.&lt;br /&gt;
&lt;br /&gt;
This would be done with similar ideas to those employed by today's collaborative text editors [http://gobby.0x539.de/trac] [http://www.codingmonkeys.de/subethaengine]. Indeed, the universal debugger itself must be a type of editor; users need to make modifications to code and data in real time, while the target is paused, or for those who enjoy living dangerously, while the target runs its program under normal execution.&lt;br /&gt;
&lt;br /&gt;
How would this work? Well, one user, Hacker Sue, would begin a debugging session by connecting to her target over the standard communications layer, and she would then host the session as a server over plain old TCP/IP. She would invite other users to join her session in progress, and she would be notified when others attempt to make a connection. For reasons of practical security, these connections should be authenticated and encrypted with SSL or similar. She may choose to allow a connection from Hacker Joe only once, or she may agree to &amp;quot;remember&amp;quot; his public key/encryption certificate. Perhaps even more importantly, she may choose to reject all connection requests from Hacker Joe.&lt;br /&gt;
&lt;br /&gt;
Now that Hacker Joe has successfully connected and authenticated with Hacker Sue's debugging sessions, they set to work. The debugger interface contains a chat pane during hosted sessions, so they are able to talk about what they are seeing and doing. The interface also has &amp;quot;user markers&amp;quot; displayed within its content windows, like the disassembler and the memory editor. These user markers would provide a visual indication of what each user is currently looking at in the target. They could also provide a quick method to &amp;quot;jump&amp;quot; the view to the other users' view ports, and could even be &amp;quot;pinned&amp;quot; or made static; a way to automatically follow someone's view port as they move around in the code.&lt;br /&gt;
&lt;br /&gt;
Hacker Sue and Hacker Joe can now both control the target, stepping through code and watching how it works. They can also change data in memory and instructions within the CPU's code flow path. Each change made will be highlighted in colors specific to each user. They can't undo each others' work through standard-undo commands, but they can patch it just like any other data.&lt;br /&gt;
&lt;br /&gt;
After a long debugging session, both users are making good progress. But Hacker Joe starts doing a tedious and repetitive task of changing every other byte in a 10KB section of memory to the hex value 0x01. He suggests to Hacker Sue that this would be much easier if they both work on a different piece of the editing at the same time. Hacker Sue has a better idea: She knows a script can be written that will do all the work for them, but she's not quite sure how to do it. Hacker Joe writes a simple script in the script editor, and submits it to Hacker Sue to run. After Hacker Sue fixes some typos and potential bugs, she likes the script and saves it as a macro to the session. When Hacker Joe runs the script, and Hacker Sue agrees, the tedious task is completed in a fraction of a second.&lt;br /&gt;
&lt;br /&gt;
This scenario highlights an interesting concept of collaborative scripting within a debugging session. The importance of an authentication and encryption scheme over this TCP/IP connection becomes apparent: With access to scripting capabilities and low-level access to programs running on the target machine (some times this target machine may be the same as the host machine!) security will be of utmost importance. That could be Hacker Sue's computer that Hacker Joe has complete access to. It is important to secure such collaborative debugging as best as possible, but then again the true security of this model will all come down to real trust.&lt;br /&gt;
&lt;br /&gt;
Scripting and macros should be written and run with a kind of &amp;quot;approval&amp;quot; model. A script editor built into the interface would provide similar collaborative editing, where everyone can see what's being written and edited. It would then give the debugger host the final say for what becomes a runnable macro or not, and she also has the final say over who can run the available macros, and when.&lt;br /&gt;
&lt;br /&gt;
There is an incredible potential to include an entire community in not only developing a universal debugger interface, but also including anyone from the community to contribute to the work done ''with'' the tool they are developing. This is a fine point which would provide many new advantages to an already self-sustaining open source community.&lt;br /&gt;
&lt;br /&gt;
===Use-case scenarios===&lt;br /&gt;
&lt;br /&gt;
This section will cover some simple use-case scenarios to serve as examples of what kind of advantages we may find in the application of similar technologies. These scenarios will be written in story format, and will be kept concise.&lt;br /&gt;
&lt;br /&gt;
====The custom interface====&lt;br /&gt;
&lt;br /&gt;
Hacker Joe downloads a debugger for PS2 from the internet. The debugger supports the universal debugger protocol, and comes with a simple debugger interface that he can use to connect to his PS2 from his Windows PC. After using the interface for a few days, he's annoyed by its lack of features. Even though it is an open source interface written in Java, he doesn't like Java and will not add the features himself. Luckily, Hacker Joe knows and trusts C++ and has documentation on the universal debugger protocol (documentation of the spec is a key feature for its use), so he sets out to write his own simple interface.&lt;br /&gt;
&lt;br /&gt;
With the help of the universal debugger protocol documentation and an open source library for it that other users in the community have written, Hacker Joe is able to build his own interface with his own programming language and the help of the community. No Java required.&lt;br /&gt;
&lt;br /&gt;
====Choices, choices====&lt;br /&gt;
&lt;br /&gt;
Hacker Sue likes debugging GBA. So do a lot of other hackers. This means there are a lot of debugger interfaces she can choose from. When she finds one she likes, she can use it on GBA hardware with her favorite low-level debugger. She can also use it on her favorite GBA emulator with universal debugger support.&lt;br /&gt;
&lt;br /&gt;
Internally, these two low-level debuggers use different means of connecting to the interface (RS232 vs IPC, for example) but neither side knows about it or cares; the universal debugger protocol handles the details almost transparently.&lt;br /&gt;
&lt;br /&gt;
When a newer, prettier, more promising interface comes out, Hacker Sue can switch to it without problems. This is the power of interchangeability and modularity, and she likes it.&lt;br /&gt;
&lt;br /&gt;
====One debugger to rule them all====&lt;br /&gt;
&lt;br /&gt;
Hacker Tom wrote a universal debugger interface; it supports 32 architectures and runs on 5 different operating systems. When a new low-level debugger is created for a new architecture, Hacker Tom just has to make some small adjustments to his One Debugger to Rule Them All; maybe add a new disassembler, and he's able to use all of his spiffy debugging features on a 33rd architecture. All in about an hour.&lt;br /&gt;
&lt;br /&gt;
====Leveraging existing technology====&lt;br /&gt;
&lt;br /&gt;
Hacker Kim is writing a low-level debugger for i686. She heard about the universal debugger protocol, and decides to give it a try. She uses an open source library to handle the universal debugger protocol, because this is the easiest solution. The existing debugger interfaces for i686 are perfect; she doesn't have to write her own interface, so she can spend more time on her low-level debugger. She's also very impressed when she discovers she can connect to her debugger over TCP/IP without making any changes to the source. This allows her debugger to be self-hosting; capable of debugging a second instance of itself on a sandbox machine, without interfering with her development machine.&lt;br /&gt;
&lt;br /&gt;
====Automagic rollover====&lt;br /&gt;
&lt;br /&gt;
Hacker Ted spends months perfecting a low-level debugger he has been adding to a fast, lightweight NES emulator. Rather than write the debugger interface with an OS-dependent user interface API, he gets his friend, Hacker Liz, to write the interface as a separate application. They decide to use the universal debugger protocol to communicate between the two applications.&lt;br /&gt;
&lt;br /&gt;
After a few years, it becomes apparent that Hacker Ted's choice of emulator wasn't the best foundation for his debugger; the emulator runs fast and generally works well for most NES games. But because of some subtle inaccuracies in emulation, there are a few very challenging problems that cannot be debugged. Hacker Ted needs to optimize his homebrew NES game to perform complex artificial intelligence, special video tricks which rely heavily on timing the assembly code exactly in sync with the PPU, and many other fancy effects. Unfortunately, the emulator he is doing his debugging in is not quite accurate enough to run his homebrew game exactly like it does on actual NES hardware, so debugging it is impossible.&lt;br /&gt;
&lt;br /&gt;
Luckily, by this time there are several new NES emulators available which are considered super-accurate (at the cost of blazing fast emulation speed). Hacker Ted decides it is worth it to take the speed hit, so he sets about porting his low-level debugger to the new emulator. He's surprised to find that Hacker Liz's interface works beautifully with the new low-level debugger and emulator, and he's now able to find his bug thanks to the super-accurate emulation. Even better, he can switch back to the old emulator when emulation speed is more important than accuracy, and he still has the same pretty debugger interface, no matter where he goes.&lt;br /&gt;
&lt;br /&gt;
===Project implementation===&lt;br /&gt;
&lt;br /&gt;
The implementation of the project will be the final say in how well these ideas work in practice. There is a great deal of work to be done until any of this can be properly realized. And I understand that it will be up to me to do the initial foundational work in implementation; the programming. This section will cover the details and specifications of the project implementation. That's a fancy way of saying I will use this portion of the document to guide you through the stages from preparation to having a useful program.&lt;br /&gt;
&lt;br /&gt;
====Preparation====&lt;br /&gt;
&lt;br /&gt;
This very document is an integral part of the preparation for a fairly large-scale project. I intend to use the material here as a general guide for the project as a whole. It may not cover every situation and problem encountered along the way, but it should contain enough information to keep the project on track through the initial development stages and into the stable development stages. I will also include some thoughts on the future of the project; what I expect to see accomplished possibly far in the future after the code base has grown and had time to mature.&lt;br /&gt;
&lt;br /&gt;
One (of many) of the goals of this document is to gather resources and information from community members who may hold a valuable interest in the Universal Debugger Project's goals. One such resource is the collective brainpower of today's debugger developers. The immediate use of this collective brainpower would be for laying down the groundwork for the series of standards that the rest of the project will comply with and further be based upon. I want this collective brainpower to be assembled as a standards body independently and neutrally of the main project (and its implementation) in order to provide a constructive neutral territory where the standards body may collaborate without prior reservations or bias.&lt;br /&gt;
&lt;br /&gt;
In preparation for this project, I believe it is essential that a group of volunteers or &amp;quot;elected&amp;quot; members of a standards body assemble to define the series of standards necessary to make modular debugging and interoperability possible. This should be considered a top priority considering the success of universal debugging depends on it entirely. However, the programming work on a universal debugger interface can be done in parallel to, or entirely without, a standards body working out the finder details.&lt;br /&gt;
&lt;br /&gt;
Apart from the documentation guidelines and definition of acceptable open standards in debugging, preparation for this project also has dependencies on the base platform we will be working with. The Mozilla platform, [http://developer.mozilla.org/en/XULRunner XULRunner], has been chosen as the base for the project's debugger interface. Several potent references exist for the Mozilla platform, including a complete online book [http://books.mozdev.org/chapters/index.html]. Developers interested in the project's implementation should familiarize themselves with these and other resources.&lt;br /&gt;
&lt;br /&gt;
Familiarity with the following technologies (as applicable to the Mozilla platform) would be beneficial: Javascript, CSS, XHTML, XML, XUL, XBL, XPCOM, C++.&lt;br /&gt;
&lt;br /&gt;
CSS, XUL, and XBL (the latter two being dialects of XML) are useful for building user interfaces on the Mozilla platform. Javascript handles functionality on the user interface elements, and handles data to/from XPCOM. XPCOM is a means to allow Javascript to communicate with (and directly run) functions compiled in C++. Finally, CSS, XHTML, and Javascript are useful for user interface elements rendered with Gecko.&lt;br /&gt;
&lt;br /&gt;
A particularly good example of using XHTML in a Gecko browser widget is with a disassembler: assembly syntax can be highlighted and styled with CSS, subroutines can be contracted and expanded (code folding) with CSS and Javascript. And the entire document can be parsed as an XML document to re-assemble the code at a later time, or to export it to a txt file. Anchors (links) to subroutines and text strings (cross-references) can be clicked on to instantly jump to the relevant code. The browser can be put into &amp;quot;editing mode&amp;quot; to add comments, change instructions, and define new subroutines. Code flow analysis can be visually shown as Bezier curves and arrows drawn within a canvas element to the left of the instructions. And as with any [X]HTML document, the CSS can be changed to fit the user's tastes.&lt;br /&gt;
&lt;br /&gt;
This use of the Gecko layout engine provides some unique advantages: First, it makes the disassembler super-portable; no need to rewrite platform-specific custom controls that do difficult text layout and line drawing code, not to mention making it all editable. Second, it provides the perfect means to be styled by the user (CSS) any way she likes, and it will always look the same, no matter which operating system it runs on (with the exception of, perhaps, which fonts are installed and which are used by the CSS). Finally, it provides dynamic control over the content via Javascript and DOM manipulation, once again in a completely platform-independent way. With Gecko, you can do better things in your user interface, faster.&lt;br /&gt;
&lt;br /&gt;
The finally element of preparation is defining the naming conventions. It would be unwise to stick to &amp;quot;Universal Debugger Project&amp;quot; and &amp;quot;Universal Debugger Protocol&amp;quot; because as Lazy|Bastard of [http://www.gshi.org GSHI] publicly points out, the acronym UDP is already synonymous with the popular [http://en.wikipedia.org/wiki/User_Datagram_Protocol User Datagram Protocol]. He goes on to suggest a surrogate for the term &amp;quot;universal&amp;quot; (which is inaccurate at best; think &amp;quot;universal remote&amp;quot;) with the more appropriate term &amp;quot;versatile&amp;quot;. The naming of the project and protocol should be independent and chosen by their respective core contributors.&lt;br /&gt;
&lt;br /&gt;
The project and protocol will each have a healthy start without settling on a name early on, but I might recommend that, at the very least, temporary code-names are chosen so that they may be referred to during the early development stages. I have no reservation on code-names, so any suggestions would be appreciated. As a final word on project naming, I realize that brands are important. Having an easily recognizable and understandable name will become a priority as the project starts coming into fruition.&lt;br /&gt;
&lt;br /&gt;
====Development====&lt;br /&gt;
&lt;br /&gt;
Initial development requires a great deal of effort. First, I will need a version control system that can handle a fairly large project with a fairly large number of developers. I like Subversion, but I have also been considering Git and Mercurial. It won't be possible for me to host this repository on my home network, unfortunately, because my bandwidth limitations are unacceptable. I'm not able to install these services on http://kodewerx.net because I do not have a shell account with my host. Using one of several freely available version control repository hosts (such as http://www.sourceforge.net, http://code.google.com, or http://www.gna.org are a possibility, but I honestly do not consider these to be a proper solution. Eventually, I may invest in a decent dedicated UNIX hosting service with a shell account so that I will have the necessary control over the server to provide important services like these. Our secondary domain, http://kodewerx.org, would be linked to this server and I would slowly migrate away from the .net domain and its shared hosting.&lt;br /&gt;
&lt;br /&gt;
I would then devise some coding style guidelines (probably to be hosted on this wiki). Which would define the manner that code is written for the project. It would cover things like indentation style, tab widths, naming conventions... The general idea is to keep the code readable, manageable, and maintainable for all contributors. This document would possibly look similar to the style guidelines I previously wrote for the EnHacklopedia project [http://doc.kodewerx.net/guidelines.html].&lt;br /&gt;
&lt;br /&gt;
Next I would provide bug tracking software for users and developers to file bug reports, feature/enhancement requests, and a means for developers to track the status of their own points of focus on the project. The two trackers I've considered are [http://www.bugzilla.org Bugzilla] and [http://trac.edgewall.org Trac]. Also for temporary consideration, Sourceforge provides their own bug tracker service.&lt;br /&gt;
&lt;br /&gt;
Finally, it would be a matter of hacking away at the project and making an initial commit to the version control repository. From there, provide a few core developers with commit access and watch the project begin to evolve into a tangible and proven debugger interface.&lt;br /&gt;
&lt;br /&gt;
==Appendix==&lt;br /&gt;
&lt;br /&gt;
===Terminology===&lt;br /&gt;
&lt;br /&gt;
* '''Communications Layer''' - The second part of a two-tier communication system between low-level and high-level debuggers. This layer defines the communications link used between the two, as well as the protocol in which they speak.&lt;br /&gt;
* '''Communications Link''' - A physical wire or wireless process for transmitting data.&lt;br /&gt;
* '''Debugger''' - A generic term for any program which can be used to aid in the study of the low-level inner workings of another program.&lt;br /&gt;
* '''High-Level Debugger''' - Portions and features of the debugger interface which, upon acting on data from the low-level debugger, can perform high-level tasks outside of the scope of the low-level debugger or communications layer.&lt;br /&gt;
* '''Host''' - The computer and operating system hosting the debugger user interface. Can also refer to an emulator or similar software which explicitly hosts a target.&lt;br /&gt;
* '''Low-level Debugger''' - Usually a very small program (debugger stub) either A) compiled into a target program, B) hooked into a precompiled target program with simple runtime patches, or C) compiled into a host program, for example an emulator which supports debugging its emulated programs with universal debuggers.&lt;br /&gt;
* '''Protocol''' - Describes a specific interpretation for data transmitted over a communications link.&lt;br /&gt;
* '''Realtime Debugger''' - A high-level debugger which either itself runs a target, or watches the target run from outside of its own context. The realtime debugger typically has full control over its target, including the data and code of the target itself, as well as when and how the target is run.&lt;br /&gt;
* '''Remote Debugger''' - A target-specific set of low-level and high-level debuggers with each debugger living on different target and host machines.&lt;br /&gt;
* '''Standard''' - A formal technical description, usually written by an independent and neutral group or organization, with the intention of providing a set of mandatory and optional &amp;quot;rules&amp;quot; to be used for the purpose of compatibility. When used by the vast majority, a standard becomes a De-Facto standard.&lt;br /&gt;
* '''Standards Conformance''' - A program which claims to be in conformance with a standard has conformed its non-standard implementation to be compatible with the standard; the program does not fully comply with the standard, but is compatible.&lt;br /&gt;
* '''Standards Compliance''' - Any program which claims to be compliant with a standard is said to have implemented the standard to the best of their ability; the program complies with the standard as-is.&lt;br /&gt;
* '''Static Debugger''' - A program which &amp;quot;debugs&amp;quot; a target without actually running or watching a running target. This is typically a simple disassembler or other kind of high-level view of the data contained within the target.&lt;br /&gt;
* '''Target''' - The computer or device &amp;quot;targeted&amp;quot; by the debugger. This machine often runs a special low-level debugger program to perform debugging actions. The machine's hardware may or may not be emulated.&lt;br /&gt;
* '''Universal Debugger''' - An all-encompassing term to describe the three main pieces of the project: The user interface/high-level host debugger, the low-level target debugger, and the standardized communications layer/universal protocol which they use to speak to one another. Also describes a target- and host-independent series of low- and high-level debuggers which may be used interchangeably anywhere that the universal protocol is supported.&lt;br /&gt;
* '''Universal Debugger Project''' - An initiative to assemble a community willing to pursue the research and development of ideas and standards described within the ''Universal Debugger Project'' documentation.&lt;br /&gt;
* '''Universal Debugger Protocol''' - An open standard definition language to facilitate the use of interchangeable low-level and high-level debuggers; any debugger (high- or low-level) which speaks this language may interact with any other debugger to provide useful results to its users.&lt;br /&gt;
* '''Universal Protocol''' - See ''Universal Debugger Protocol''.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Universal Debugger Protocol]]&lt;br /&gt;
* [[Debugging Modern Computer Architectures]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=608</id>
		<title>Kwiki</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=608"/>
				<updated>2008-11-02T03:17:52Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Universal Debugger Project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Kodewerx wiki. While browsing its contents, remember that ''you'' can make changes to anything you see here. It might be as simple as bad spelling or grammar, or it could be an entirely new page that you create; it's up to you to help the Kodewerx wiki grow into a valuable resource for hackers and programmers alike.&lt;br /&gt;
&lt;br /&gt;
To get you started, here's what we have going on right now:&lt;br /&gt;
&lt;br /&gt;
Bored&lt;br /&gt;
&lt;br /&gt;
==Kodewerx Kode Archive==&lt;br /&gt;
&lt;br /&gt;
[[Kodewerx Kode Archive]] -- If you can help out with this, I am collaborating all of the codes found in the Kodewerx forums and turning them into an organized archive. I have a basic layout with one already started. I will add on when I get time. --[[User:Deathspawn989|Stryker Fuel Blue -- Deathspawn989]] 15:45, 15 September 2008 (UTC)&lt;br /&gt;
&lt;br /&gt;
TODO:&lt;br /&gt;
&lt;br /&gt;
* Define criteria for posting codes, and a specific format which all pages should adhere to. Create Help pages for these items.&lt;br /&gt;
* Many of the code pages have moved around during our early restructuring, leaving many unused redirect pages. These should probably be deleted.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Universal Debugger Project==&lt;br /&gt;
&lt;br /&gt;
Information related to the currently unnamed &amp;quot;Universal Debugger Project&amp;quot;. Keep in mind, these documents are works in progress; they typically change daily, especially on weekends when I have time off work to sit and write for long periods of time. It might be worth keeping an eye on [[Special:RecentChanges|Recent changes]] if you are interested in this project.&lt;br /&gt;
&lt;br /&gt;
-- [[User:Parasyte|Parasyte]] 08:54, 18 October 2008 (UTC)&lt;br /&gt;
&lt;br /&gt;
Project pages:&lt;br /&gt;
&lt;br /&gt;
* [[Universal Debugger Project]]&lt;br /&gt;
* [[Debugging Modern Computer Architectures]]&lt;br /&gt;
* [[Universal Debugger Protocol]] -- Currently a placeholder. To be used for the protocol spec in the future.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=607</id>
		<title>Kwiki</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Kwiki&amp;diff=607"/>
				<updated>2008-11-02T03:17:16Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Kodewerx Kode Archive */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Kodewerx wiki. While browsing its contents, remember that ''you'' can make changes to anything you see here. It might be as simple as bad spelling or grammar, or it could be an entirely new page that you create; it's up to you to help the Kodewerx wiki grow into a valuable resource for hackers and programmers alike.&lt;br /&gt;
&lt;br /&gt;
To get you started, here's what we have going on right now:&lt;br /&gt;
&lt;br /&gt;
Bored&lt;br /&gt;
&lt;br /&gt;
==Universal Debugger Project==&lt;br /&gt;
&lt;br /&gt;
Information related to the currently unnamed &amp;quot;Universal Debugger Project&amp;quot;. Keep in mind, these documents are works in progress; they typically change daily, especially on weekends when I have time off work to sit and write for long periods of time. It might be worth keeping an eye on [[Special:RecentChanges|Recent changes]] if you are interested in this project.&lt;br /&gt;
&lt;br /&gt;
-- [[User:Parasyte|Parasyte]] 08:54, 18 October 2008 (UTC)&lt;br /&gt;
&lt;br /&gt;
Project pages:&lt;br /&gt;
&lt;br /&gt;
* [[Universal Debugger Project]]&lt;br /&gt;
* [[Debugging Modern Computer Architectures]]&lt;br /&gt;
* [[Universal Debugger Protocol]] -- Currently a placeholder. To be used for the protocol spec in the future.&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Harvest_Moon_DS:_Island_of_Happiness_v1.0_(U)/Action_Replay&amp;diff=399</id>
		<title>Harvest Moon DS: Island of Happiness v1.0 (U)/Action Replay</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Harvest_Moon_DS:_Island_of_Happiness_v1.0_(U)/Action_Replay&amp;diff=399"/>
				<updated>2008-10-13T01:56:27Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: New page: {{Code | name = Mastercode | 800099F7 41424A45 F23836D8 223FC000   | Must be on for other codes to work}}  {{Code | name = Infinite Stamina | 220FB20C 00640063  | Stamina bar never decreas...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Code&lt;br /&gt;
| name = Mastercode&lt;br /&gt;
|&lt;br /&gt;
800099F7 41424A45&lt;br /&gt;
F23836D8 223FC000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| Must be on for other codes to work}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Infinite Stamina&lt;br /&gt;
| 220FB20C 00640063&lt;br /&gt;
&lt;br /&gt;
| Stamina bar never decreases.}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Infinite Fullness&lt;br /&gt;
| 220FB210 00000063&lt;br /&gt;
&lt;br /&gt;
| Fullness Meter never decreases.(Never have to eat)}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Infinite Money&lt;br /&gt;
| 220FB218 3B9AC9FF&lt;br /&gt;
&lt;br /&gt;
| Always have 999,999,999G }}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Infinite Water&lt;br /&gt;
| 220FB470 FF000000&lt;br /&gt;
| Water can is always full of water.}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Max Building Materials (All)&lt;br /&gt;
|&lt;br /&gt;
12105B06 000003E7&lt;br /&gt;
12105B08 000003E7&lt;br /&gt;
12105B0A 000003E7&lt;br /&gt;
&lt;br /&gt;
| Have 999 Lumber, Material Stone, and Gold Lumber}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Max Animal and Bird Feeds&lt;br /&gt;
| 22105B00 03E703E7&lt;br /&gt;
&lt;br /&gt;
| Always have 999 Animal Fodder and Bird Feed}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Change Sex to Male&lt;br /&gt;
| 021059B8 00000000&lt;br /&gt;
&lt;br /&gt;
| Become a boy when you play a girl}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Change Sex to Female&lt;br /&gt;
| 021059B8 00000001&lt;br /&gt;
&lt;br /&gt;
| Become a girl when you play a buy}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Always Sunny&lt;br /&gt;
| 020FB1CC 0000001&lt;br /&gt;
&lt;br /&gt;
| When this is on it will always be sunny.}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Always Cloudy&lt;br /&gt;
| 020FB1CC 0000002&lt;br /&gt;
&lt;br /&gt;
| When this is on it will always be cloudy.}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Always Rainy&lt;br /&gt;
| 020FB1CC 0000004&lt;br /&gt;
&lt;br /&gt;
| When this is on it will always be raining.}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = Always Snowing&lt;br /&gt;
| 020FB1CC 0000005&lt;br /&gt;
&lt;br /&gt;
| When this is on it will always be snowing.}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = The date is....&lt;br /&gt;
| 020FB1C1 000000XX&lt;br /&gt;
&lt;br /&gt;
| Replace XX with the hex number for which date you want.}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = The day of week is....&lt;br /&gt;
| 020FB1C2 0000000X&lt;br /&gt;
&lt;br /&gt;
| Replace X with the hex number for which day of the week you want.}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = The hour is....&lt;br /&gt;
| 020FB1C8 000000XX&lt;br /&gt;
&lt;br /&gt;
| Replace XX with the hex number of the hour you want.}}&lt;br /&gt;
&lt;br /&gt;
{{Code&lt;br /&gt;
| name = The minute is....&lt;br /&gt;
| 020FB1C9 000000XX&lt;br /&gt;
&lt;br /&gt;
| Replace XX with the hex number of the minute you want.}}&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Universal_Debugger_Project&amp;diff=310</id>
		<title>Universal Debugger Project</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Universal_Debugger_Project&amp;diff=310"/>
				<updated>2008-10-12T23:49:08Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Project goals */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a reference and general documentation for a project I ([[:User:Parasyte|Parasyte]]) have been interested in pursuing for several years. This article will discuss the project's history, current developments, and future.&lt;br /&gt;
&lt;br /&gt;
==Project history==&lt;br /&gt;
&lt;br /&gt;
I began my research into debuggers sometime in 1999. Things were different back then; computers were just barely able to emulate SNES, even with emulators of the time taking numerous shortcuts to help speed up emulation. At the time, I only know of one SNES emulator pre-compiled with any kind of debugging functionality, and that was a build of SNES9x (then a chromeless application which was horribly difficult to use) by LordTech. It allowed the user to enable and disable assembly tracing while the game ran. This was a good start; you could see what the game was doing, and gain a lot of information from it. But it was still clunky.&lt;br /&gt;
&lt;br /&gt;
To find the assembly which read or wrote to a specific address, you had to search through (often many megabytes) of text for those addresses. It gave you a good piece of the puzzle, but it did not give you the whole picture. Often many instructions were branched over, and were entirely missing from the log.&lt;br /&gt;
&lt;br /&gt;
A few years later, I had some C programming experience of my own under my belt, and I had also found a new NES emulator called NESten. It wasn't a great NES emulator, but it was decent; it ran most of the NES games I was interested in, and it also had a fairly nice debugger built in! It was during this time that I got my first real taste of debugging. (Previously I experimented with UltraHLE's debugging features, but I don't recall them being much use; it used another &amp;quot;look but don't touch&amp;quot; passive take on debugging.)&lt;br /&gt;
&lt;br /&gt;
NESten's debugger (and the emulator itself) did have some annoying flaws. And after getting sick of it, I decided (like many pioneering hackers before me) to take a decent open source emulator and extend it with some decent debugging capabilities. I chose FCEU (FamiCom Emulator Ultra) by Xodnizel as my base. (Note: FCEU was previously based on FCE, by Bero.) FCEU was a good candidate because it had decent emulation capabilities, and also because it was quite fast; you really need a fast base if you're just going to slow it down with powerful features. And I'll get to that point later.&lt;br /&gt;
&lt;br /&gt;
===FCEUd===&lt;br /&gt;
&lt;br /&gt;
And with that, FCEUd (FCEU-debug) was born. It did not take long to get a stable debugger integrated into the CPU core and hooked up with a little chrome. Seems like it was only 3 or 4 months before it was usable, and a total of 6 months or so development time before I was happy with it. This debugger took all of the major ideas from NESten (including its disassembler syntax for displaying current work addresses) and added some crucial elements that NESten lacked (write breakpoints triggered by INC/DEC instructions, which increment and decrement bytes in memory). I also used ideas from PSX debuggers, such as &amp;quot;step out&amp;quot; which mutually comples the &amp;quot;step in&amp;quot; and &amp;quot;step over&amp;quot; process. And I'll get to that point, again, later.&lt;br /&gt;
&lt;br /&gt;
Since then, FCEUd has been further extended by other members of the emulation/ROM hacking scenes. To this day, FCE has been the most widely forked emulator, in part, because of the work we did extending it from an NES player to an NES development tool. But as you will see, this will bring me to another point later: The work done on FCE-derived forks is very widespread without much communication between parties. Ultimately, it's a mish-mash mix of talent tackling the same ideas from different vantage points without direct collaboration. And I think it's a shame.&lt;br /&gt;
&lt;br /&gt;
===GCNrd===&lt;br /&gt;
&lt;br /&gt;
The main development cycle on FCEUd was during 2002. I learned quite a bit from this project, and it got me interested in debugging other architectures. The next architecture I took on was Nintendo GameCube, officially abbreviated &amp;quot;GCN&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Sometime in 2003, hackers discovered a flaw in the GCN game Phantasy Star Online, which was compatible with the GCN BroadBand Adapter (BBA). This quickly became known as the PSO exploit, and allowed running &amp;quot;homebrew&amp;quot; code on a consumer GCN.&lt;br /&gt;
&lt;br /&gt;
The PSO exploit worked something like this: Hacker Joe sets up his own DNS server, and tells PSO to use that server IP address as its default gateway. This way, PSO asks Hacker Joe's DNS server where it can find Sega's PSO server. Hacker Joe's DNS server tells PSO that Sega's server is located on Hacker Joe's PSO server. PSO happily connects to Hacker Joe's PSO server, which then tells PSO that there is an update available. PSO happily downloads the &amp;quot;PSO loader stub&amp;quot; which is posing as an official update to PSO. PSO happily launches the PSO loader stub which takes over the GCN and begins downloading a larger executable (of Hacker Joe's choice) from Hacker Joe's PSO server. The PSO loader stub then launches Hacker Joe's executable, and Hacker Joe now has total control over his GCN. In short, PSO is tricked by Hacker Joe into running code that it never should have in the first place.&lt;br /&gt;
&lt;br /&gt;
This was a huge breakthrough for GCN hacking. I was in a very poorly state at the time, with no real job and no real income. I was doing work for a certain company selling GBA flash carts. It got me by, but it was a far cry from decent living. I mention this because it means I couldn't afford PSO or a BBA; the two things I needed to begin work on GCN debugging. I had the skill to accomplish it certainly, so I took up donations from members in the community. Only a few responded, but that's all I needed. About $100 USD was enough to pick up the two items I needed, and I was on my way to fame...&lt;br /&gt;
&lt;br /&gt;
====History of GCNrd====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;06-22-03: First GCN AR codes decrypted.&lt;br /&gt;
06-23-03: GCNcrypt v1.0 released.&lt;br /&gt;
06-25-03: First unofficial GCN AR codes released: Sonic Adventure DX (U) codes,&lt;br /&gt;
          by Sappharad.&lt;br /&gt;
06-27-03: GCNcrypt v1.1 released.&lt;br /&gt;
07-03-03: Planning for GCNrd begins.&lt;br /&gt;
07-07-03: GCNrd development begins.&lt;br /&gt;
08-27-03: Development on GCN network library begins.&lt;br /&gt;
08-29-03: First data received from GCN over network, using homebrew network&lt;br /&gt;
          library.&lt;br /&gt;
09-01-03: First data received by GCN over network, using homebrew network&lt;br /&gt;
          library.&lt;br /&gt;
09-13-03: Harddrive crash causes problems. Interest in GCNrd is lost.&lt;br /&gt;
12-31-03: After 3 months without working on GCNrd, aside from the occasional&lt;br /&gt;
          bugfix in the libs, GCNrd development finally continues.&lt;br /&gt;
12-31-03: Milestone #1. First successful RAM dump grabbed from a GCN game using&lt;br /&gt;
          GCNrd. It takes 35.735 seconds to complete.&lt;br /&gt;
12-31-03: BBA is started in 100mbit full duplex mode. Full RAM dump completes&lt;br /&gt;
          in 14.687 seconds.&lt;br /&gt;
01-03-04: Work on screenshot support begins. First successful screenshots are&lt;br /&gt;
          taken from Rayman 3 and Rogue Leader.&lt;br /&gt;
01-12-04: Mario Kart: Double Dash!! (U) is supported by GCNrd. This was the&lt;br /&gt;
          first successful &amp;quot;BBA Reset&amp;quot; patch for a LAN\network-enabled game.&lt;br /&gt;
01-15-04: Milestone #2. GCNrd rightly claims better compatability than Datel's&lt;br /&gt;
          FreeLoader v1.06b.&lt;br /&gt;
01-17-04: All tested games boot! 64 of 64.&lt;br /&gt;
01-19-04: Kenobi begins work on a GUI for GCNrd, making the program a bit&lt;br /&gt;
          easier to use, and adding code search features.&lt;br /&gt;
01-23-04: Milestone #3. First GCN AR code created using only GCNrd and Kenobi's&lt;br /&gt;
          GCNrd GUI. Wave Race: Blue Storm (U), 99 Points, by Knux0rz.&lt;br /&gt;
01-25-04: Started adding breakpoint support. Breaks work for Read, Write, and&lt;br /&gt;
          Read+Write. Execution breakpoints will be next. BPR\W gave me a bit&lt;br /&gt;
          of trouble. The biggest problem I had was getting around the 8-byte&lt;br /&gt;
          boundary which PowerPC uses for data breakpoints. This was completely&lt;br /&gt;
          unacceptable. As an example, if you set a breakpoint on address&lt;br /&gt;
          805E4FF5, a break would be reported every time an address between&lt;br /&gt;
          805E4FF0 - 805E4FF8 was accessed. Even though only one address within&lt;br /&gt;
          that range had a breakpoint set. My current solution to this problem&lt;br /&gt;
          is pretty nasty, but it works. In fact, it only reports a hit if the&lt;br /&gt;
          break addresses match perfectly. Maybe a little inconvenient, but&lt;br /&gt;
          hey!&lt;br /&gt;
03-11-04: GCN CodeType Helper v1.0 released.&lt;br /&gt;
03-11-04: GCNcrypt v1.2 released.&lt;br /&gt;
03-16-04: Finished up breakpoint support today, which should now be 100% fixed.&lt;br /&gt;
          The debugger now waits until just before returning to the game&lt;br /&gt;
          before enabling any r\w breakpoint. This will help bypass any&lt;br /&gt;
          misleading break hits that are caused by the debugger itself. Such as&lt;br /&gt;
          when accessing the stack and etc.&lt;br /&gt;
          New plan in the works to work-around memory constraints. May not work&lt;br /&gt;
          on all games, but should solve all problems with PacMan World 2.&lt;br /&gt;
          Which currently suffers from a nasty crash when accessing the memory&lt;br /&gt;
          card. The crash appears to be caused by how much memory I have&lt;br /&gt;
          allocated for the debugger.&lt;br /&gt;
03-17-04: Work begins on patching AR's code engine. With the patch in place,&lt;br /&gt;
          the code engine will run GCNrd's memory-resident debugger, allowing&lt;br /&gt;
          users to hack games with multiple executables, such as demo discs and&lt;br /&gt;
          the James Bond 007 games.&lt;br /&gt;
03-18-04: Kenobi adds real-time AR code list handling to the GUI. Supported AR&lt;br /&gt;
          versions are v1.06 and v1.08. Support for additional versions will be&lt;br /&gt;
          made available as soon as we receive AR RAM dumps from the other&lt;br /&gt;
          versions.&lt;br /&gt;
03-19-04: Win9x compatibility issues are worked on. GCNrd console now accepts&lt;br /&gt;
          commands passed on the command line. With commands entered on the&lt;br /&gt;
          command line, the console program will exit immediately after&lt;br /&gt;
          completing the requested command. Support for Win9x compatibility in&lt;br /&gt;
          the GUI is limited, but progressing rapidly.&lt;br /&gt;
03-20-04: Support for AR v1.11 completed.&lt;br /&gt;
03-31-04: First public release! GCNrd v1.00b is made available to hackers&lt;br /&gt;
          everywhere.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====GCNrd GUI====&lt;br /&gt;
&lt;br /&gt;
The GUI for GCNrd was written entirely separately from my own GCNrd development. It was called simply GCNrdGUI and was written by a French hacker, Kenobi, in Delphi. This split up the workload considerably, and also added a new level of modularity to the project overall. The overall GCNrd project consisted of four components:&lt;br /&gt;
&lt;br /&gt;
* GCNrd Loader: The UI that the user is presented with on the GCN itself. The loader is responsible for GCN-side configuration, initializing the network hardware, launching DVDs, and setting up the debugger/hooking the executable.&lt;br /&gt;
* GCNrd debugger: This is a piece that the user never sees, but directly interacts with. It's a very small program (32KB total program code and memory usage) that runs &amp;quot;behind&amp;quot; the game, listening for instructions coming over the network, and acting upon them.&lt;br /&gt;
* GCNrd client: A command-line application run on the user's PC which can be used to send and receive commands and data to/from the debugger over the network.&lt;br /&gt;
* GCNrdGUI: Kenobi's GUI for interacting with the GCNrd client.&lt;br /&gt;
&lt;br /&gt;
It was not necessary for the GUI to interact with the debugger through my CLI client, but that was the option chosen for GCNrdGUI. Later on another hacker, Sappharad, wrote his own GUI in Java which communicated with the debugger directly, bypassing the need for GCNrd client; the modularity of the project comes full circle.&lt;br /&gt;
&lt;br /&gt;
====GCNrd v1.10b and beyond====&lt;br /&gt;
&lt;br /&gt;
GCNrd v1.10b was released July 28th, 2005. It contained a number of bug fixes and new features. Some new features were only shiney on the surface (background images and UI colors in the loader, date/time display...), but some were actually quite important. The MMU handling, for example, allowed hacking games like Star Wars: Rogue Leader, Star Wars: Rebel Strike, and Metal Gear Solid: The Twin Snakes, which used the MMU extensively. It was a slightly rushed released, even though it did show some promise.&lt;br /&gt;
&lt;br /&gt;
This was the last official release I made, along with a private release (only available to close friends) which included some special features like DVD dumping and loading/debugging DVD images over the BBA. This &amp;quot;DVD simulation&amp;quot; was quite advanced for its time, and allowed me (and a few others) to hack downloaded/dumped games. There are often times that the only way to get a copy of a game is downloading it. Either because it was never officially released in your region, or because it hasn't been officially released ''at all''. This private &amp;quot;v1.10b+&amp;quot; version was never made public due to piracy concerns. &lt;br /&gt;
&lt;br /&gt;
Those piracy concerns were actually forfeited after other hackers disabled the DVD booting code in v1.10b to allow debugging DVD-Rs booted with a &amp;quot;Cobra-like&amp;quot; DVD BIOS.&lt;br /&gt;
&lt;br /&gt;
I had plans at one time to rewrite GCNrd so that it could be relocatable within GCN memory. This would solve problems with memory allocation on games that don't play nice. Resident Evil 4 is a good example of such games; it cannot be booted at all by any version of GCNrd. The rewrite would also make the source code legible enough that I could release it under the [http://www.gnu.org/copyleft/gpl.html GPL]. Granted, legibility is not necessary for source code release, but it was important for reasons of maintainability.&lt;br /&gt;
&lt;br /&gt;
GCNrd source code used a wild mix of C and assembly in its main debug core. Escaping the low levels of assembly was impossible, but it could be structured nicely anyway. This wasn't the only problem, of course. Both the loader and debugger had to have their own separate build of the network library. It was too costly (memory-wise) to put the full library into the debugger, even though this would allow the loader to use the debugger for all of its networking tasks.&lt;br /&gt;
&lt;br /&gt;
Instead, the debugger had a very minimal network library; I cut out all of the initialization sequences, all of the CRC code for packet data integrity checking, and a whole lot of other not-completely-necessary packet handling code. It was important to keep the debugger as small as possible so it would not interfere with the game's use of memory.&lt;br /&gt;
&lt;br /&gt;
That gave me two entirely different network stacks to maintain; one was already quite a bit of work, as it was. There was also the problem of compiling the debugger separately from the loader, and then compiling the debugger binary directly into the loader itself.&lt;br /&gt;
&lt;br /&gt;
There are a number of ways these issues could have been addressed, and I'm not going to cover them all. But I will get back to the early point about modularity. As you will see, I am hoping to solve a great deal of these problems using that frame of mind. Needless to say, I never did complete the rewrite of GCNrd, which would have become &amp;quot;GCNrd v2&amp;quot;. But the problems displayed by it were the cornerstones of what was to become the Universal Debugger Project.&lt;br /&gt;
&lt;br /&gt;
===PCS and Mupen 64===&lt;br /&gt;
&lt;br /&gt;
The next year, in 2006, I went back to hacking N64. This was a time when some very interesting N64 hacks were made [http://doc.kodewerx.net/hacking_n64.html#asm_jesus_mode]. By this time, we were all very familiar with Nemu and its debugging/cheating capabilities. The debugger was not bad, but its emulation left quite a bit to be desired. Once again, unhappy with the tools available, I set out to tackle the problem and create my own tools.&lt;br /&gt;
&lt;br /&gt;
The first was [http://doc.kodewerx.net/hacking_n64.html#emulator_pcs Parasytic Cheat Search], a ''video'' plugin for PJ64 (and other emulators compatible with its plugin spec) that allowed cheat searching through the emulator's memory. It contained many bugs and architectural flaws (being a video plugin which passed all video-related messages to a ''real'' video plugin) but it provided a start for me to get into N64 emulator development.&lt;br /&gt;
&lt;br /&gt;
My next N64 project was tackling the debugger problem. Unlike a simple passive cheat searching program, a debugger has to be hooked directly to the CPU to work consistently. Like the FCEUd project years earlier, I wanted to start with a decent open source emulator and extend its capabilities to include decent debugging features.&lt;br /&gt;
&lt;br /&gt;
I chose Mupen 64 as my base, this time. It had relatively high compatibility, stability, and speed. It also contained a debugger for its GTK+ build, which I knew I could use to my advantage. I was still a Win32 programmer at the time; I did not have much experience outside of Windows. Naturally, I focused on Mupen's Windows code, which is where my debugger would live.&lt;br /&gt;
&lt;br /&gt;
After patching Mupen's CPU core (all three of them!) I started implementing the debugger window and all of its fancy widgets. This is when a very bad case of Deja Vu hit me. I had done all of this work before; I was reinventing the wheel. Not good. So I left Mupen 64 with a bare-bones cheat feature (including search) and debugger. This is when I began formulating the idea that debugger interfaces should be modular, just like GCNrd. Then came an avalanche of questions and issues. More on that later.&lt;br /&gt;
&lt;br /&gt;
===NTRrd and Kwurdi===&lt;br /&gt;
&lt;br /&gt;
In 2007, we had Nintendo DS (officially abbreviated NTR, unofficial NDS), and we had a means to hack it thanks to the efforts of the PassMe crew. I did not jump into DS dev quite as enthusiastically as I had GCN, but I eventually got into it and started playing around with ideas to debug the little machine. There were several problems, initially: The first was a communications port. I chose to use the GBA X-port, which was a rather expensive device (especially for video game hackers, who are typically in their teens, and without jobs), but it was attractive to me because of its FPGA.&lt;br /&gt;
&lt;br /&gt;
The X-port comes by default with a simple LPT serial port that can be used as a communications link. But it is generally slow and unreliable for large data transfers. On the other hand, the FPGA (and a LOT of IO) can be leveraged to implement a much faster and more stable communications link. And that's exactly what I did, writing custom FPGA logic for a simple 8-bit ECP-mode LPT port. The result was a much faster (~4MB/s ... still much slower than ethernet, WiFi, or USB would have been) and much more reliable (~0.0001% error rate) communications link that I could use to dump NDS memory to perform cheat searching.&lt;br /&gt;
&lt;br /&gt;
The initial result of this work was &amp;quot;NTRrd&amp;quot; which never saw any kind of release. That's when the ideas from past projects began to meld into an idea well ahead of its time. The idea of a universal debugger. Or at least, a universal debugger interface. So I came up with a silly acronym: KWURDI, for KodeWerx Universal Remote Debugger Interface. And I wanted NTRrd to be its first &amp;quot;client&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The idea was that NTRrd would be a three-piece project: NTRrd loader, NTRrd debugger, NTRrd client. And Kwurdi would be its GUI. The loader would load the debugger, the debugger would talk to the client, and the client would talk to the GUI. That's a lot of levels of abstraction. As it turns out, though, all of those levels are quite important. In fact, it's this level of abstraction and modularity which make this idea of a universal debugger important.&lt;br /&gt;
&lt;br /&gt;
==The universal debugger==&lt;br /&gt;
&lt;br /&gt;
The original article for the Universal Debugger Project can be found in the [[Debugging Modern Computer Architectures]] article. While it covers a good general scope of the idea itself, it does not lay down any foundation other than a very generic description of the roles that each piece of the project ''might'' play. To highlight the main points of the project:&lt;br /&gt;
&lt;br /&gt;
* The universal debugger interface itself is a user interface to allow interaction with a low-level debugger.&lt;br /&gt;
* The low-level debugger may or may not live on the same machine as the universal debugger interface. The universal debugger interface communicates with the low-level debugger through a standard communications link and protocol.&lt;br /&gt;
* The communications link should be an existing standard. For example, UNIX domain sockets or DBUS for a local low-level debugger, and TCP/IP for a remote low-level debugger.&lt;br /&gt;
* The protocol should also be an existing standard, but to this date, there does not appear to be anything which fits the goals of a universal debugger interface. One possibility is [http://www.rfc-archive.org/getrfc.php?rfc=909 RFC-909, Loader Debugger Protocol].&lt;br /&gt;
&lt;br /&gt;
===Project goals===&lt;br /&gt;
&lt;br /&gt;
The long term goals of the Universal Debugger Project include:&lt;br /&gt;
&lt;br /&gt;
* Modularity&lt;br /&gt;
* Standardization&lt;br /&gt;
&lt;br /&gt;
These items are to be taken as mutually inclusive. For modularity to work, there must be a set of standards in place. For a set of standards to be successful, the modularity granted by the standards must be exploited.&lt;br /&gt;
&lt;br /&gt;
For our purposes, I wish to implement a set of standards for a &amp;quot;universal debugger&amp;quot; with the help of the community, and implement a debugger interface on top of those standards as an example of modularity. The implementation has the following goals:&lt;br /&gt;
&lt;br /&gt;
# It will be Free Software, released under a free software license compatible with the [http://www.gnu.org/copyleft/gpl.html GNU General Public License].&lt;br /&gt;
# It will be a community-oriented project; accepting ideas, patches, code, images, and documentation, among other items, from the community which supports it.&lt;br /&gt;
# It will be designed as a cross-platform application, able to be used on multiple operating systems.&lt;br /&gt;
# It will be built with internationalization and localization in mind; capable of being adapted to different languages. &lt;br /&gt;
# It will communicate with and support any low-level debugger which supports the standards defined by the Universal Debugger Project.&lt;br /&gt;
# It will be configurable, extensible, and modular by nature, to support any conceivable current or future architecture.&lt;br /&gt;
# It will support highly advanced debugging techniques and bleeding-edge technologies to get the most out of the user's debugging experience.&lt;br /&gt;
# It will support and encourage community activity through collaborative debugging.&lt;br /&gt;
&lt;br /&gt;
I will cover these points one at a time in more detail:&lt;br /&gt;
&lt;br /&gt;
====Free software====&lt;br /&gt;
&lt;br /&gt;
Free Software released under the [http://www.gnu.org/copyleft/gpl.html GNU General Public License] or a compatible license is meant to be community-driven. This means, anyone who wants to participate in the development of the project is free to participate. You don't become a community member by being one of a few elite deemed &amp;quot;worthy&amp;quot;; you become a member simply by joining an active discussion or contributing in some other way.&lt;br /&gt;
&lt;br /&gt;
The source code will be made available for everyone to look at or extend, which benefits from many eyes keeping the code safe and secure, and also from many hands working in parallel to quickly produce a stable product that is free for anyone to use in any way they see fit. These are two of the basic freedoms granted by a Free Software license: Freedom to look at and extent the product, and freedom to use the product in any way. There are many more freedoms granted by Free Software, and if interested you should consult the GPL documentation or other authoritative sources.&lt;br /&gt;
&lt;br /&gt;
====Community-oriented, community-driven====&lt;br /&gt;
&lt;br /&gt;
A community-oriented and community-driven software project benefits from its main source of use: its own users. Such projects become self-sustaining, as their users take the secondary roles of developers. I will not cover many of the details relating to community-oriented or community-driven software, but there are plenty of great resources available for further reading. Some suggested reading includes The Cathedral and the Bazaar [http://www.catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/index.html#catbmain] by Eric S. Raymond, the About Mozilla pages [http://www.mozilla.org/about] [http://www.mozilla.org/about/manifesto] [http://www.mozilla.org/mission.html] [http://www.mozilla.org/editorials/mozilla-overview.html], and the online book Open Sources: Voices from the Open Source Revolution [http://oreilly.com/catalog/opensources/book/toc.html].&lt;br /&gt;
&lt;br /&gt;
As a community-oriented, community-driven project, I believe there is no end to the ways in which we, as a community of programmers and hackers, will be able to debug. This community would ideally involve the active roles of everyone from video game and ROM hackers, application and operating system developers, and people in the field of academic research of computer architectures. It doesn't have to be the biggest and the best of the debugging communities (and it probably won't!) but it does have to be an accepting community, willing to allow contributions from anyone and everyone who wishes to contribute.&lt;br /&gt;
&lt;br /&gt;
====Cross-platform design====&lt;br /&gt;
&lt;br /&gt;
Among the design goals of the project, the universal debugger implementation must be able to run on multiple computer platforms and operating systems. This is a difficult undertaking, especially for a program focusing on a graphical user environment. Several bases for cross-platform development already exist, so dealing with intricacies of operating systems can be cut down to a minimum, while retaining a high level of overall product quality.&lt;br /&gt;
&lt;br /&gt;
I have personally researched several offerings for cross-platform frameworks and libraries, and I believe the best choice is the Mozilla platform, [http://developer.mozilla.org/en/XULRunner XULRunner]. XULRunner is still in its infancy, but is already very capable; it's the powerhouse behind the Firefox web browser, which runs on a large percentage of popular operating systems.&lt;br /&gt;
&lt;br /&gt;
Here is a short list of advantages to using XULRunner over just any cross-platform framework:&lt;br /&gt;
&lt;br /&gt;
* XULRunner is Free Software, and its development is community-oriented.&lt;br /&gt;
* Unlike Java and .NET, XULRunner applications are built with native code and have a native look-and-feel (&amp;quot;native&amp;quot; is in reference to the host operating system).&lt;br /&gt;
* Also unlike Java and .NET, XULRunner applications are written in C++, a highly portable and widely used programming language.&lt;br /&gt;
* XULRunner provides many features that Firefox users are already familiar with: scripting with Javascript, application extensibility through &amp;quot;extensions&amp;quot;, networking and popular web protocols support, HTML processing (and a LOT more) with the Gecko rendering engine.&lt;br /&gt;
* User interfaces in XULRunner are written in XUL (an XML dialect), styled with CSS, and setup to &amp;quot;do things&amp;quot; with Javascript -- all current web standards. The use of CSS allows the user interface to be &amp;quot;skinned&amp;quot; to a user's personal tastes.&lt;br /&gt;
* UI functionality is mostly implemented with Javascript, but backbone and critical code can be written in C++ and accessed from the Javascript environment.&lt;br /&gt;
&lt;br /&gt;
For a very informative read on the Mozilla platform, I recommend the online book [http://books.mozdev.org/chapters/index.html Creating Applications with Mozilla].&lt;br /&gt;
&lt;br /&gt;
====Internationalized and localized====&lt;br /&gt;
&lt;br /&gt;
Because community strengths are so important to a project of this size and magnitude, the global community becomes an invaluable asset. And as a diverse global community, not everyone will speak or understand a single common language. In this case, I am directly referring to the English language, which is personally my primary language, and the only language I am entirely fluent. Programmers and hackers in a similar situation, though with a different primary language, will benefit from a universal debugger. We should not neglect any user in the community. Making the universal debugger accessible and usable for everybody must be a top priority of the project.&lt;br /&gt;
&lt;br /&gt;
Choosing the Mozilla platform as the application's foundation will play a crucial role in the internationalization of the product. Because the user interface elements are written in an XML dialect, all text can be referenced with DTD entities, just like you might write &amp;amp;amp;gt; in XHTML to print the greater-than sign (&amp;amp;gt;). Likewise, you might write&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;caption label=&amp;quot;&amp;amp;amp;hello;&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in XUL which would display a label with &amp;quot;Hello&amp;quot; or &amp;quot;こんにちは&amp;quot; depending on the locale set on the user's machine when the XUL application is started.&lt;br /&gt;
&lt;br /&gt;
DTD entities are not magic translators; the text must be translated by a human who is fluent in both (source and destination) languages. However, using DTD entities is a great way to write user interfaces (and other things, like configuration files, for example) without locking the program to a specific language. It also makes the translator's work much easier, since all text strings which require translation will be neatly stored in a single location.&lt;br /&gt;
&lt;br /&gt;
Having the capability to bring a universal debugger to anyone, no matter their ethnic background, will help to expand the debugger's user base and ultimately its supporting community of developers. Designed from the beginning with breaking language barriers in mind, there should be few stumbling points along the road to the success of reaching this goal.&lt;br /&gt;
&lt;br /&gt;
====Standards compliant====&lt;br /&gt;
&lt;br /&gt;
Standards make the technological world work. And standards compliance makes compatibility issues entirely negligible. This is perhaps the most important point I will make within this documentation: defining a series of open standards to encompass ''all'' foreseeable debugging functionality is a necessity.&lt;br /&gt;
&lt;br /&gt;
The major reason for adopting a standard or series of standards is for compatibility purposes. Compatibility is critical for modular designs. And modularity is an important part of the overall user-configuration and extensibility of an application or sets of applications. Modularity also has the benefit of splitting workloads, as we did previously with GCNrd. Splitting workloads decreases development times, improves communication, and in some cases even improves product quality.&lt;br /&gt;
&lt;br /&gt;
In simpler terms, starting with splitting developer workloads, we all know that it's easier to cover more ground by splitting up. So long as you have a central location to meet up later, this tactic works wonderfully for rapid application development. In the case of developing a debugger, you might typically have one team focusing on the low-level handling of the CPU and hardware, another team tackling the user interface to the low-level debugger, and perhaps a third team covering the protocol between the two.&lt;br /&gt;
&lt;br /&gt;
I realize that the &amp;quot;third team&amp;quot; in this example is most likely set aside as another task for the first team in the real world. But if your project does require some sort of communication layer and you pull that out of the first team's hands, you can effectively pass that responsibility to a sort of &amp;quot;standards body&amp;quot; who will oversee the development and ''standardization'' of that communication layer. The job of such a body would be to ensure the standard is usable by anyone and for any purpose, generic enough to support all current and foreseeable architectures, and extensible enough to support all unforeseeable future architectures.&lt;br /&gt;
&lt;br /&gt;
The extensibility of the standard would be the most difficult to maintain. While a protocol or communication layer of this sort should be extensible for the reasons listed, it should only be extensible to the extent that any new features added would not break previous features or introduce new compatibility issues with previous designs and implementations of the protocol or communication layer. This means, generally, that the extensibility must remain open and ''optional''; no extended feature should ever be mandatory for any user to implement.&lt;br /&gt;
&lt;br /&gt;
There will undoubtedly be important new technologies which require mandatory extensions to the protocol during the life cycle and evolution of debugging technology. Under these circumstances, the standards body would be responsible for designing and publishing a new major version of the protocol with the new mandatory technologies. Implementers of the protocol, should they choose to support newer major versions, would then be required to implement all mandatory features in order to claim standards compliance of their implementation.&lt;br /&gt;
&lt;br /&gt;
What we need is a standards body; a group of individuals, mostly volunteers or &amp;quot;elected&amp;quot; members, to define and publish a series of standards for debugging modern computer architectures. They will be responsible for taking everyone's concerns from the community into account, and act on those concerns within their design and definition. They will be responsible for knowing that if they fail to do a good job, the community will stop listening to them and they will easily be replaced by anyone who steps up with a better idea.&lt;br /&gt;
&lt;br /&gt;
The goals of the standards body will be defining:&lt;br /&gt;
&lt;br /&gt;
* The ''wire''; how we get data from point A (low-level debugger) to point B (user interface). Ethernet? RS232? ...&lt;br /&gt;
* The ''language''; how our data is interpreted as points A and B speak. XML? JSON? Pure binary packets? ...&lt;br /&gt;
* The ''expansion''; how we can introduce new features without creating vendor locks or introducing incompatibilities. Header/Info/About/Options commands which specify the optional/extended features we support? ...&lt;br /&gt;
&lt;br /&gt;
The goals for us developers will be inheriting some of these responsibilities as we implement these standards, to create a flourishing environment for debugger developers to contribute with innovation and healthy competition.&lt;br /&gt;
&lt;br /&gt;
====Configurable, extensible, and modular====&lt;br /&gt;
&lt;br /&gt;
Debuggers are all about user experience. I say this with honest integrity because debugging, by its very nature, is a difficult task. Making a debugger very simple to use is a bullet point; you don't want to overwhelm a user (who is already working on a very difficult problem) with bad user experience. To improve the user experience, it is important to allow a level of customization among the user interface. Also important is extensibility and modularity, to make it easy for the user to expand the interface to fit her needs, and easy to replace one component with another that she prefers.&lt;br /&gt;
&lt;br /&gt;
Some of the items of the user interface which should be configurable include the overall look-and-feel of the interface (skin), the organization of windows and widgets (tabs, information panes, etc.), and the styles of text, fonts, and [image-]backgrounds used throughout.&lt;br /&gt;
&lt;br /&gt;
The look of the application, as well as the functionality, should be extensible using styling and scripting languages. The Mozilla platform once again becomes an asset as it allows simple integration of CSS and Javascript for the purposes of extending applications based on the platform. Extensions can be written and managed by the user community, much the same way that Firefox extensions are written and distributed. A central management location for extensions would be a great thing to have, but is not necessary to the success of a thriving extension-based sub-community.&lt;br /&gt;
&lt;br /&gt;
Including certain feature sets in the application's base install as pre-installed extensions means that users may uninstall those extensions at will to remove undesired features, or replace those extensions with other extensions that implement comparable (and often better) features. This modular design will help to increase the user experience as well as the user's personal productivity with the application. This, too, can be supported by a thriving extension-based sub-community, and the community at large.&lt;br /&gt;
&lt;br /&gt;
====Advanced debugging technologies====&lt;br /&gt;
&lt;br /&gt;
[Work in progress]&lt;br /&gt;
&lt;br /&gt;
====Encouraging community activity====&lt;br /&gt;
&lt;br /&gt;
[Work in progress]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Debugging Modern Computer Architectures]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Universal_Debugger_Project&amp;diff=305</id>
		<title>Universal Debugger Project</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Universal_Debugger_Project&amp;diff=305"/>
				<updated>2008-10-12T23:42:43Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* GCNrd v1.10b and beyond */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a reference and general documentation for a project I ([[:User:Parasyte|Parasyte]]) have been interested in pursuing for several years. This article will discuss the project's history, current developments, and future.&lt;br /&gt;
&lt;br /&gt;
==Project history==&lt;br /&gt;
&lt;br /&gt;
I began my research into debuggers sometime in 1999. Things were different back then; computers were just barely able to emulate SNES, even with emulators of the time taking numerous shortcuts to help speed up emulation. At the time, I only know of one SNES emulator pre-compiled with any kind of debugging functionality, and that was a build of SNES9x (then a chromeless application which was horribly difficult to use) by LordTech. It allowed the user to enable and disable assembly tracing while the game ran. This was a good start; you could see what the game was doing, and gain a lot of information from it. But it was still clunky.&lt;br /&gt;
&lt;br /&gt;
To find the assembly which read or wrote to a specific address, you had to search through (often many megabytes) of text for those addresses. It gave you a good piece of the puzzle, but it did not give you the whole picture. Often many instructions were branched over, and were entirely missing from the log.&lt;br /&gt;
&lt;br /&gt;
A few years later, I had some C programming experience of my own under my belt, and I had also found a new NES emulator called NESten. It wasn't a great NES emulator, but it was decent; it ran most of the NES games I was interested in, and it also had a fairly nice debugger built in! It was during this time that I got my first real taste of debugging. (Previously I experimented with UltraHLE's debugging features, but I don't recall them being much use; it used another &amp;quot;look but don't touch&amp;quot; passive take on debugging.)&lt;br /&gt;
&lt;br /&gt;
NESten's debugger (and the emulator itself) did have some annoying flaws. And after getting sick of it, I decided (like many pioneering hackers before me) to take a decent open source emulator and extend it with some decent debugging capabilities. I chose FCEU (FamiCom Emulator Ultra) by Xodnizel as my base. (Note: FCEU was previously based on FCE, by Bero.) FCEU was a good candidate because it had decent emulation capabilities, and also because it was quite fast; you really need a fast base if you're just going to slow it down with powerful features. And I'll get to that point later.&lt;br /&gt;
&lt;br /&gt;
===FCEUd===&lt;br /&gt;
&lt;br /&gt;
And with that, FCEUd (FCEU-debug) was born. It did not take long to get a stable debugger integrated into the CPU core and hooked up with a little chrome. Seems like it was only 3 or 4 months before it was usable, and a total of 6 months or so development time before I was happy with it. This debugger took all of the major ideas from NESten (including its disassembler syntax for displaying current work addresses) and added some crucial elements that NESten lacked (write breakpoints triggered by INC/DEC instructions, which increment and decrement bytes in memory). I also used ideas from PSX debuggers, such as &amp;quot;step out&amp;quot; which mutually comples the &amp;quot;step in&amp;quot; and &amp;quot;step over&amp;quot; process. And I'll get to that point, again, later.&lt;br /&gt;
&lt;br /&gt;
Since then, FCEUd has been further extended by other members of the emulation/ROM hacking scenes. To this day, FCE has been the most widely forked emulator, in part, because of the work we did extending it from an NES player to an NES development tool. But as you will see, this will bring me to another point later: The work done on FCE-derived forks is very widespread without much communication between parties. Ultimately, it's a mish-mash mix of talent tackling the same ideas from different vantage points without direct collaboration. And I think it's a shame.&lt;br /&gt;
&lt;br /&gt;
===GCNrd===&lt;br /&gt;
&lt;br /&gt;
The main development cycle on FCEUd was during 2002. I learned quite a bit from this project, and it got me interested in debugging other architectures. The next architecture I took on was Nintendo GameCube, officially abbreviated &amp;quot;GCN&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Sometime in 2003, hackers discovered a flaw in the GCN game Phantasy Star Online, which was compatible with the GCN BroadBand Adapter (BBA). This quickly became known as the PSO exploit, and allowed running &amp;quot;homebrew&amp;quot; code on a consumer GCN.&lt;br /&gt;
&lt;br /&gt;
The PSO exploit worked something like this: Hacker Joe sets up his own DNS server, and tells PSO to use that server IP address as its default gateway. This way, PSO asks Hacker Joe's DNS server where it can find Sega's PSO server. Hacker Joe's DNS server tells PSO that Sega's server is located on Hacker Joe's PSO server. PSO happily connects to Hacker Joe's PSO server, which then tells PSO that there is an update available. PSO happily downloads the &amp;quot;PSO loader stub&amp;quot; which is posing as an official update to PSO. PSO happily launches the PSO loader stub which takes over the GCN and begins downloading a larger executable (of Hacker Joe's choice) from Hacker Joe's PSO server. The PSO loader stub then launches Hacker Joe's executable, and Hacker Joe now has total control over his GCN. In short, PSO is tricked by Hacker Joe into running code that it never should have in the first place.&lt;br /&gt;
&lt;br /&gt;
This was a huge breakthrough for GCN hacking. I was in a very poorly state at the time, with no real job and no real income. I was doing work for a certain company selling GBA flash carts. It got me by, but it was a far cry from decent living. I mention this because it means I couldn't afford PSO or a BBA; the two things I needed to begin work on GCN debugging. I had the skill to accomplish it certainly, so I took up donations from members in the community. Only a few responded, but that's all I needed. About $100 USD was enough to pick up the two items I needed, and I was on my way to fame...&lt;br /&gt;
&lt;br /&gt;
====History of GCNrd====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;06-22-03: First GCN AR codes decrypted.&lt;br /&gt;
06-23-03: GCNcrypt v1.0 released.&lt;br /&gt;
06-25-03: First unofficial GCN AR codes released: Sonic Adventure DX (U) codes,&lt;br /&gt;
          by Sappharad.&lt;br /&gt;
06-27-03: GCNcrypt v1.1 released.&lt;br /&gt;
07-03-03: Planning for GCNrd begins.&lt;br /&gt;
07-07-03: GCNrd development begins.&lt;br /&gt;
08-27-03: Development on GCN network library begins.&lt;br /&gt;
08-29-03: First data received from GCN over network, using homebrew network&lt;br /&gt;
          library.&lt;br /&gt;
09-01-03: First data received by GCN over network, using homebrew network&lt;br /&gt;
          library.&lt;br /&gt;
09-13-03: Harddrive crash causes problems. Interest in GCNrd is lost.&lt;br /&gt;
12-31-03: After 3 months without working on GCNrd, aside from the occasional&lt;br /&gt;
          bugfix in the libs, GCNrd development finally continues.&lt;br /&gt;
12-31-03: Milestone #1. First successful RAM dump grabbed from a GCN game using&lt;br /&gt;
          GCNrd. It takes 35.735 seconds to complete.&lt;br /&gt;
12-31-03: BBA is started in 100mbit full duplex mode. Full RAM dump completes&lt;br /&gt;
          in 14.687 seconds.&lt;br /&gt;
01-03-04: Work on screenshot support begins. First successful screenshots are&lt;br /&gt;
          taken from Rayman 3 and Rogue Leader.&lt;br /&gt;
01-12-04: Mario Kart: Double Dash!! (U) is supported by GCNrd. This was the&lt;br /&gt;
          first successful &amp;quot;BBA Reset&amp;quot; patch for a LAN\network-enabled game.&lt;br /&gt;
01-15-04: Milestone #2. GCNrd rightly claims better compatability than Datel's&lt;br /&gt;
          FreeLoader v1.06b.&lt;br /&gt;
01-17-04: All tested games boot! 64 of 64.&lt;br /&gt;
01-19-04: Kenobi begins work on a GUI for GCNrd, making the program a bit&lt;br /&gt;
          easier to use, and adding code search features.&lt;br /&gt;
01-23-04: Milestone #3. First GCN AR code created using only GCNrd and Kenobi's&lt;br /&gt;
          GCNrd GUI. Wave Race: Blue Storm (U), 99 Points, by Knux0rz.&lt;br /&gt;
01-25-04: Started adding breakpoint support. Breaks work for Read, Write, and&lt;br /&gt;
          Read+Write. Execution breakpoints will be next. BPR\W gave me a bit&lt;br /&gt;
          of trouble. The biggest problem I had was getting around the 8-byte&lt;br /&gt;
          boundary which PowerPC uses for data breakpoints. This was completely&lt;br /&gt;
          unacceptable. As an example, if you set a breakpoint on address&lt;br /&gt;
          805E4FF5, a break would be reported every time an address between&lt;br /&gt;
          805E4FF0 - 805E4FF8 was accessed. Even though only one address within&lt;br /&gt;
          that range had a breakpoint set. My current solution to this problem&lt;br /&gt;
          is pretty nasty, but it works. In fact, it only reports a hit if the&lt;br /&gt;
          break addresses match perfectly. Maybe a little inconvenient, but&lt;br /&gt;
          hey!&lt;br /&gt;
03-11-04: GCN CodeType Helper v1.0 released.&lt;br /&gt;
03-11-04: GCNcrypt v1.2 released.&lt;br /&gt;
03-16-04: Finished up breakpoint support today, which should now be 100% fixed.&lt;br /&gt;
          The debugger now waits until just before returning to the game&lt;br /&gt;
          before enabling any r\w breakpoint. This will help bypass any&lt;br /&gt;
          misleading break hits that are caused by the debugger itself. Such as&lt;br /&gt;
          when accessing the stack and etc.&lt;br /&gt;
          New plan in the works to work-around memory constraints. May not work&lt;br /&gt;
          on all games, but should solve all problems with PacMan World 2.&lt;br /&gt;
          Which currently suffers from a nasty crash when accessing the memory&lt;br /&gt;
          card. The crash appears to be caused by how much memory I have&lt;br /&gt;
          allocated for the debugger.&lt;br /&gt;
03-17-04: Work begins on patching AR's code engine. With the patch in place,&lt;br /&gt;
          the code engine will run GCNrd's memory-resident debugger, allowing&lt;br /&gt;
          users to hack games with multiple executables, such as demo discs and&lt;br /&gt;
          the James Bond 007 games.&lt;br /&gt;
03-18-04: Kenobi adds real-time AR code list handling to the GUI. Supported AR&lt;br /&gt;
          versions are v1.06 and v1.08. Support for additional versions will be&lt;br /&gt;
          made available as soon as we receive AR RAM dumps from the other&lt;br /&gt;
          versions.&lt;br /&gt;
03-19-04: Win9x compatibility issues are worked on. GCNrd console now accepts&lt;br /&gt;
          commands passed on the command line. With commands entered on the&lt;br /&gt;
          command line, the console program will exit immediately after&lt;br /&gt;
          completing the requested command. Support for Win9x compatibility in&lt;br /&gt;
          the GUI is limited, but progressing rapidly.&lt;br /&gt;
03-20-04: Support for AR v1.11 completed.&lt;br /&gt;
03-31-04: First public release! GCNrd v1.00b is made available to hackers&lt;br /&gt;
          everywhere.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====GCNrd GUI====&lt;br /&gt;
&lt;br /&gt;
The GUI for GCNrd was written entirely separately from my own GCNrd development. It was called simply GCNrdGUI and was written by a French hacker, Kenobi, in Delphi. This split up the workload considerably, and also added a new level of modularity to the project overall. The overall GCNrd project consisted of four components:&lt;br /&gt;
&lt;br /&gt;
* GCNrd Loader: The UI that the user is presented with on the GCN itself. The loader is responsible for GCN-side configuration, initializing the network hardware, launching DVDs, and setting up the debugger/hooking the executable.&lt;br /&gt;
* GCNrd debugger: This is a piece that the user never sees, but directly interacts with. It's a very small program (32KB total program code and memory usage) that runs &amp;quot;behind&amp;quot; the game, listening for instructions coming over the network, and acting upon them.&lt;br /&gt;
* GCNrd client: A command-line application run on the user's PC which can be used to send and receive commands and data to/from the debugger over the network.&lt;br /&gt;
* GCNrdGUI: Kenobi's GUI for interacting with the GCNrd client.&lt;br /&gt;
&lt;br /&gt;
It was not necessary for the GUI to interact with the debugger through my CLI client, but that was the option chosen for GCNrdGUI. Later on another hacker, Sappharad, wrote his own GUI in Java which communicated with the debugger directly, bypassing the need for GCNrd client; the modularity of the project comes full circle.&lt;br /&gt;
&lt;br /&gt;
====GCNrd v1.10b and beyond====&lt;br /&gt;
&lt;br /&gt;
GCNrd v1.10b was released July 28th, 2005. It contained a number of bug fixes and new features. Some new features were only shiney on the surface (background images and UI colors in the loader, date/time display...), but some were actually quite important. The MMU handling, for example, allowed hacking games like Star Wars: Rogue Leader, Star Wars: Rebel Strike, and Metal Gear Solid: The Twin Snakes, which used the MMU extensively. It was a slightly rushed released, even though it did show some promise.&lt;br /&gt;
&lt;br /&gt;
This was the last official release I made, along with a private release (only available to close friends) which included some special features like DVD dumping and loading/debugging DVD images over the BBA. This &amp;quot;DVD simulation&amp;quot; was quite advanced for its time, and allowed me (and a few others) to hack downloaded/dumped games. There are often times that the only way to get a copy of a game is downloading it. Either because it was never officially released in your region, or because it hasn't been officially released ''at all''. This private &amp;quot;v1.10b+&amp;quot; version was never made public due to piracy concerns. &lt;br /&gt;
&lt;br /&gt;
Those piracy concerns were actually forfeited after other hackers disabled the DVD booting code in v1.10b to allow debugging DVD-Rs booted with a &amp;quot;Cobra-like&amp;quot; DVD BIOS.&lt;br /&gt;
&lt;br /&gt;
I had plans at one time to rewrite GCNrd so that it could be relocatable within GCN memory. This would solve problems with memory allocation on games that don't play nice. Resident Evil 4 is a good example of such games; it cannot be booted at all by any version of GCNrd. The rewrite would also make the source code legible enough that I could release it under the [http://www.gnu.org/copyleft/gpl.html GPL]. Granted, legibility is not necessary for source code release, but it was important for reasons of maintainability.&lt;br /&gt;
&lt;br /&gt;
GCNrd source code used a wild mix of C and assembly in its main debug core. Escaping the low levels of assembly was impossible, but it could be structured nicely anyway. This wasn't the only problem, of course. Both the loader and debugger had to have their own separate build of the network library. It was too costly (memory-wise) to put the full library into the debugger, even though this would allow the loader to use the debugger for all of its networking tasks.&lt;br /&gt;
&lt;br /&gt;
Instead, the debugger had a very minimal network library; I cut out all of the initialization sequences, all of the CRC code for packet data integrity checking, and a whole lot of other not-completely-necessary packet handling code. It was important to keep the debugger as small as possible so it would not interfere with the game's use of memory.&lt;br /&gt;
&lt;br /&gt;
That gave me two entirely different network stacks to maintain; one was already quite a bit of work, as it was. There was also the problem of compiling the debugger separately from the loader, and then compiling the debugger binary directly into the loader itself.&lt;br /&gt;
&lt;br /&gt;
There are a number of ways these issues could have been addressed, and I'm not going to cover them all. But I will get back to the early point about modularity. As you will see, I am hoping to solve a great deal of these problems using that frame of mind. Needless to say, I never did complete the rewrite of GCNrd, which would have become &amp;quot;GCNrd v2&amp;quot;. But the problems displayed by it were the cornerstones of what was to become the Universal Debugger Project.&lt;br /&gt;
&lt;br /&gt;
===PCS and Mupen 64===&lt;br /&gt;
&lt;br /&gt;
The next year, in 2006, I went back to hacking N64. This was a time when some very interesting N64 hacks were made [http://doc.kodewerx.net/hacking_n64.html#asm_jesus_mode]. By this time, we were all very familiar with Nemu and its debugging/cheating capabilities. The debugger was not bad, but its emulation left quite a bit to be desired. Once again, unhappy with the tools available, I set out to tackle the problem and create my own tools.&lt;br /&gt;
&lt;br /&gt;
The first was [http://doc.kodewerx.net/hacking_n64.html#emulator_pcs Parasytic Cheat Search], a ''video'' plugin for PJ64 (and other emulators compatible with its plugin spec) that allowed cheat searching through the emulator's memory. It contained many bugs and architectural flaws (being a video plugin which passed all video-related messages to a ''real'' video plugin) but it provided a start for me to get into N64 emulator development.&lt;br /&gt;
&lt;br /&gt;
My next N64 project was tackling the debugger problem. Unlike a simple passive cheat searching program, a debugger has to be hooked directly to the CPU to work consistently. Like the FCEUd project years earlier, I wanted to start with a decent open source emulator and extend its capabilities to include decent debugging features.&lt;br /&gt;
&lt;br /&gt;
I chose Mupen 64 as my base, this time. It had relatively high compatibility, stability, and speed. It also contained a debugger for its GTK+ build, which I knew I could use to my advantage. I was still a Win32 programmer at the time; I did not have much experience outside of Windows. Naturally, I focused on Mupen's Windows code, which is where my debugger would live.&lt;br /&gt;
&lt;br /&gt;
After patching Mupen's CPU core (all three of them!) I started implementing the debugger window and all of its fancy widgets. This is when a very bad case of Deja Vu hit me. I had done all of this work before; I was reinventing the wheel. Not good. So I left Mupen 64 with a bare-bones cheat feature (including search) and debugger. This is when I began formulating the idea that debugger interfaces should be modular, just like GCNrd. Then came an avalanche of questions and issues. More on that later.&lt;br /&gt;
&lt;br /&gt;
===NTRrd and Kwurdi===&lt;br /&gt;
&lt;br /&gt;
In 2007, we had Nintendo DS (officially abbreviated NTR, unofficial NDS), and we had a means to hack it thanks to the efforts of the PassMe crew. I did not jump into DS dev quite as enthusiastically as I had GCN, but I eventually got into it and started playing around with ideas to debug the little machine. There were several problems, initially: The first was a communications port. I chose to use the GBA X-port, which was a rather expensive device (especially for video game hackers, who are typically in their teens, and without jobs), but it was attractive to me because of its FPGA.&lt;br /&gt;
&lt;br /&gt;
The X-port comes by default with a simple LPT serial port that can be used as a communications link. But it is generally slow and unreliable for large data transfers. On the other hand, the FPGA (and a LOT of IO) can be leveraged to implement a much faster and more stable communications link. And that's exactly what I did, writing custom FPGA logic for a simple 8-bit ECP-mode LPT port. The result was a much faster (~4MB/s ... still much slower than ethernet, WiFi, or USB would have been) and much more reliable (~0.0001% error rate) communications link that I could use to dump NDS memory to perform cheat searching.&lt;br /&gt;
&lt;br /&gt;
The initial result of this work was &amp;quot;NTRrd&amp;quot; which never saw any kind of release. That's when the ideas from past projects began to meld into an idea well ahead of its time. The idea of a universal debugger. Or at least, a universal debugger interface. So I came up with a silly acronym: KWURDI, for KodeWerx Universal Remote Debugger Interface. And I wanted NTRrd to be its first &amp;quot;client&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The idea was that NTRrd would be a three-piece project: NTRrd loader, NTRrd debugger, NTRrd client. And Kwurdi would be its GUI. The loader would load the debugger, the debugger would talk to the client, and the client would talk to the GUI. That's a lot of levels of abstraction. As it turns out, though, all of those levels are quite important. In fact, it's this level of abstraction and modularity which make this idea of a universal debugger important.&lt;br /&gt;
&lt;br /&gt;
==The universal debugger==&lt;br /&gt;
&lt;br /&gt;
The original article for the Universal Debugger Project can be found in the [[Debugging Modern Computer Architectures]] article. While it covers a good general scope of the idea itself, it does not lay down any foundation other than a very generic description of the roles that each piece of the project ''might'' play. To highlight the main points of the project:&lt;br /&gt;
&lt;br /&gt;
* The universal debugger interface itself is a user interface to allow interaction with a low-level debugger.&lt;br /&gt;
* The low-level debugger may or may not live on the same machine as the universal debugger interface. The universal debugger interface communicates with the low-level debugger through a standard communications link and protocol.&lt;br /&gt;
* The communications link should be an existing standard. For example, UNIX domain sockets or DBUS for a local low-level debugger, and TCP/IP for a remote low-level debugger.&lt;br /&gt;
* The protocol should also be an existing standard, but to this date, there does not appear to be anything which fits the goals of a universal debugger interface. One possibility is [http://www.rfc-archive.org/getrfc.php?rfc=909 RFC-909, Loader Debugger Protocol].&lt;br /&gt;
&lt;br /&gt;
===Project goals===&lt;br /&gt;
&lt;br /&gt;
The long term goals of the Universal Debugger Project include:&lt;br /&gt;
&lt;br /&gt;
* Modularity&lt;br /&gt;
* Standardization&lt;br /&gt;
&lt;br /&gt;
These items are to be taken as mutually inclusive. For modularity to work, there must be a set of standards in place. For a set of standards to be successful, the modularity granted by the standards must be exploited.&lt;br /&gt;
&lt;br /&gt;
For our purposes, I wish to implement a set of standards for a &amp;quot;universal debugger&amp;quot; with the help of the community, and implement a debugger interface on top of those standards as an example of modularity. The implementation has the following goals:&lt;br /&gt;
&lt;br /&gt;
# It will be Free Software, released under a free software license compatible with the [http://www.gnu.org/copyleft/gpl.html GNU General Public License].&lt;br /&gt;
# It will be a community-oriented project; accepting ideas, patches, code, images, and documentation, among other items, from the community which supports it.&lt;br /&gt;
# It will be designed as a cross-platform application, able to be used on multiple operating systems.&lt;br /&gt;
# It will be built with internationalization and localization in mind; capable of being adapted to different languages. &lt;br /&gt;
# It will communicate with and support of any low-level debugger which supports the standards defined by the Universal Debugger Project.&lt;br /&gt;
# It will be configurable, extensible, and modular by nature, to support any conceivable current or future architecture.&lt;br /&gt;
# It will support highly advanced debugging techniques and bleeding-edge technologies to get the most out of the user's debugging experience.&lt;br /&gt;
# It will support and encourage community activity through collaborative debugging.&lt;br /&gt;
&lt;br /&gt;
I will cover these points one at a time in more detail:&lt;br /&gt;
&lt;br /&gt;
====Free software====&lt;br /&gt;
&lt;br /&gt;
Free Software released under the [http://www.gnu.org/copyleft/gpl.html GNU General Public License] or a compatible license is meant to be community-driven. This means, anyone who wants to participate in the development of the project is free to participate. You don't become a community member by being one of a few elite deemed &amp;quot;worthy&amp;quot;; you become a member simply by joining an active discussion or contributing in some other way.&lt;br /&gt;
&lt;br /&gt;
The source code will be made available for everyone to look at or extend, which benefits from many eyes keeping the code safe and secure, and also from many hands working in parallel to quickly produce a stable product that is free for anyone to use in any way they see fit. These are two of the basic freedoms granted by a Free Software license: Freedom to look at and extent the product, and freedom to use the product in any way. There are many more freedoms granted by Free Software, and if interested you should consult the GPL documentation or other authoritative sources.&lt;br /&gt;
&lt;br /&gt;
====Community-oriented, community-driven====&lt;br /&gt;
&lt;br /&gt;
A community-oriented and community-driven software project benefits from its main source of use: its own users. Such projects become self-sustaining, as their users take the secondary roles of developers. I will not cover many of the details relating to community-oriented or community-driven software, but there are plenty of great resources available for further reading. Some suggested reading includes The Cathedral and the Bazaar [http://www.catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/index.html#catbmain] by Eric S. Raymond, the About Mozilla pages [http://www.mozilla.org/about] [http://www.mozilla.org/about/manifesto] [http://www.mozilla.org/mission.html] [http://www.mozilla.org/editorials/mozilla-overview.html], and the online book Open Sources: Voices from the Open Source Revolution [http://oreilly.com/catalog/opensources/book/toc.html].&lt;br /&gt;
&lt;br /&gt;
As a community-oriented, community-driven project, I believe there is no end to the ways in which we, as a community of programmers and hackers, will be able to debug. This community would ideally involve the active roles of everyone from video game and ROM hackers, application and operating system developers, and people in the field of academic research of computer architectures. It doesn't have to be the biggest and the best of the debugging communities (and it probably won't!) but it does have to be an accepting community, willing to allow contributions from anyone and everyone who wishes to contribute.&lt;br /&gt;
&lt;br /&gt;
====Cross-platform design====&lt;br /&gt;
&lt;br /&gt;
Among the design goals of the project, the universal debugger implementation must be able to run on multiple computer platforms and operating systems. This is a difficult undertaking, especially for a program focusing on a graphical user environment. Several bases for cross-platform development already exist, so dealing with intricacies of operating systems can be cut down to a minimum, while retaining a high level of overall product quality.&lt;br /&gt;
&lt;br /&gt;
I have personally researched several offerings for cross-platform frameworks and libraries, and I believe the best choice is the Mozilla platform, [http://developer.mozilla.org/en/XULRunner XULRunner]. XULRunner is still in its infancy, but is already very capable; it's the powerhouse behind the Firefox web browser, which runs on a large percentage of popular operating systems.&lt;br /&gt;
&lt;br /&gt;
Here is a short list of advantages to using XULRunner over just any cross-platform framework:&lt;br /&gt;
&lt;br /&gt;
* XULRunner is Free Software, and its development is community-oriented.&lt;br /&gt;
* Unlike Java and .NET, XULRunner applications are built with native code and have a native look-and-feel (&amp;quot;native&amp;quot; is in reference to the host operating system).&lt;br /&gt;
* Also unlike Java and .NET, XULRunner applications are written in C++, a highly portable and widely used programming language.&lt;br /&gt;
* XULRunner provides many features that Firefox users are already familiar with: scripting with Javascript, application extensibility through &amp;quot;extensions&amp;quot;, networking and popular web protocols support, HTML processing (and a LOT more) with the Gecko rendering engine.&lt;br /&gt;
* User interfaces in XULRunner are written in XUL (an XML dialect), styled with CSS, and setup to &amp;quot;do things&amp;quot; with Javascript -- all current web standards. The use of CSS allows the user interface to be &amp;quot;skinned&amp;quot; to a user's personal tastes.&lt;br /&gt;
* UI functionality is mostly implemented with Javascript, but backbone and critical code can be written in C++ and accessed from the Javascript environment.&lt;br /&gt;
&lt;br /&gt;
For a very informative read on the Mozilla platform, I recommend the online book [http://books.mozdev.org/chapters/index.html Creating Applications with Mozilla].&lt;br /&gt;
&lt;br /&gt;
====Internationalized and localized====&lt;br /&gt;
&lt;br /&gt;
Because community strengths are so important to a project of this size and magnitude, the global community becomes an invaluable asset. And as a diverse global community, not everyone will speak or understand a single common language. In this case, I am directly referring to the English language, which is personally my primary language, and the only language I am entirely fluent. Programmers and hackers in a similar situation, though with a different primary language, will benefit from a universal debugger. We should not neglect any user in the community. Making the universal debugger accessible and usable for everybody must be a top priority of the project.&lt;br /&gt;
&lt;br /&gt;
Choosing the Mozilla platform as the application's foundation will play a crucial role in the internationalization of the product. Because the user interface elements are written in an XML dialect, all text can be referenced with DTD entities, just like you might write &amp;amp;amp;gt; in XHTML to print the greater-than sign (&amp;amp;gt;). Likewise, you might write&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;caption label=&amp;quot;&amp;amp;amp;hello;&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in XUL which would display a label with &amp;quot;Hello&amp;quot; or &amp;quot;こんにちは&amp;quot; depending on the locale set on the user's machine when the XUL application is started.&lt;br /&gt;
&lt;br /&gt;
DTD entities are not magic translators; the text must be translated by a human who is fluent in both (source and destination) languages. However, using DTD entities is a great way to write user interfaces (and other things, like configuration files, for example) without locking the program to a specific language. It also makes the translator's work much easier, since all text strings which require translation will be neatly stored in a single location.&lt;br /&gt;
&lt;br /&gt;
Having the capability to bring a universal debugger to anyone, no matter their ethnic background, will help to expand the debugger's user base and ultimately its supporting community of developers. Designed from the beginning with breaking language barriers in mind, there should be few stumbling points along the road to the success of reaching this goal.&lt;br /&gt;
&lt;br /&gt;
====Standards compliant====&lt;br /&gt;
&lt;br /&gt;
Standards make the technological world work. And standards compliance makes compatibility issues entirely negligible. This is perhaps the most important point I will make within this documentation: defining a series of open standards to encompass ''all'' foreseeable debugging functionality is a necessity.&lt;br /&gt;
&lt;br /&gt;
The major reason for adopting a standard or series of standards is for compatibility purposes. Compatibility is critical for modular designs. And modularity is an important part of the overall user-configuration and extensibility of an application or sets of applications. Modularity also has the benefit of splitting workloads, as we did previously with GCNrd. Splitting workloads decreases development times, improves communication, and in some cases even improves product quality.&lt;br /&gt;
&lt;br /&gt;
In simpler terms, starting with splitting developer workloads, we all know that it's easier to cover more ground by splitting up. So long as you have a central location to meet up later, this tactic works wonderfully for rapid application development. In the case of developing a debugger, you might typically have one team focusing on the low-level handling of the CPU and hardware, another team tackling the user interface to the low-level debugger, and perhaps a third team covering the protocol between the two.&lt;br /&gt;
&lt;br /&gt;
I realize that the &amp;quot;third team&amp;quot; in this example is most likely set aside as another task for the first team in the real world. But if your project does require some sort of communication layer and you pull that out of the first team's hands, you can effectively pass that responsibility to a sort of &amp;quot;standards body&amp;quot; who will oversee the development and ''standardization'' of that communication layer. The job of such a body would be to ensure the standard is usable by anyone and for any purpose, generic enough to support all current and foreseeable architectures, and extensible enough to support all unforeseeable future architectures.&lt;br /&gt;
&lt;br /&gt;
The extensibility of the standard would be the most difficult to maintain. While a protocol or communication layer of this sort should be extensible for the reasons listed, it should only be extensible to the extent that any new features added would not break previous features or introduce new compatibility issues with previous designs and implementations of the protocol or communication layer. This means, generally, that the extensibility must remain open and ''optional''; no extended feature should ever be mandatory for any user to implement.&lt;br /&gt;
&lt;br /&gt;
There will undoubtedly be important new technologies which require mandatory extensions to the protocol during the life cycle and evolution of debugging technology. Under these circumstances, the standards body would be responsible for designing and publishing a new major version of the protocol with the new mandatory technologies. Implementers of the protocol, should they choose to support newer major versions, would then be required to implement all mandatory features in order to claim standards compliance of their implementation.&lt;br /&gt;
&lt;br /&gt;
What we need is a standards body; a group of individuals, mostly volunteers or &amp;quot;elected&amp;quot; members, to define and publish a series of standards for debugging modern computer architectures. They will be responsible for taking everyone's concerns from the community into account, and act on those concerns within their design and definition. They will be responsible for knowing that if they fail to do a good job, the community will stop listening to them and they will easily be replaced by anyone who steps up with a better idea.&lt;br /&gt;
&lt;br /&gt;
The goals of the standards body will be defining:&lt;br /&gt;
&lt;br /&gt;
* The ''wire''; how we get data from point A (low-level debugger) to point B (user interface). Ethernet? RS232? ...&lt;br /&gt;
* The ''language''; how our data is interpreted as points A and B speak. XML? JSON? Pure binary packets? ...&lt;br /&gt;
* The ''expansion''; how we can introduce new features without creating vendor locks or introducing incompatibilities. Header/Info/About/Options commands which specify the optional/extended features we support? ...&lt;br /&gt;
&lt;br /&gt;
The goals for us developers will be inheriting some of these responsibilities as we implement these standards, to create a flourishing environment for debugger developers to contribute with innovation and healthy competition.&lt;br /&gt;
&lt;br /&gt;
====Configurable, extensible, and modular====&lt;br /&gt;
&lt;br /&gt;
Debuggers are all about user experience. I say this with honest integrity because debugging, by its very nature, is a difficult task. Making a debugger very simple to use is a bullet point; you don't want to overwhelm a user (who is already working on a very difficult problem) with bad user experience. To improve the user experience, it is important to allow a level of customization among the user interface. Also important is extensibility and modularity, to make it easy for the user to expand the interface to fit her needs, and easy to replace one component with another that she prefers.&lt;br /&gt;
&lt;br /&gt;
Some of the items of the user interface which should be configurable include the overall look-and-feel of the interface (skin), the organization of windows and widgets (tabs, information panes, etc.), and the styles of text, fonts, and [image-]backgrounds used throughout.&lt;br /&gt;
&lt;br /&gt;
The look of the application, as well as the functionality, should be extensible using styling and scripting languages. The Mozilla platform once again becomes an asset as it allows simple integration of CSS and Javascript for the purposes of extending applications based on the platform. Extensions can be written and managed by the user community, much the same way that Firefox extensions are written and distributed. A central management location for extensions would be a great thing to have, but is not necessary to the success of a thriving extension-based sub-community.&lt;br /&gt;
&lt;br /&gt;
Including certain feature sets in the application's base install as pre-installed extensions means that users may uninstall those extensions at will to remove undesired features, or replace those extensions with other extensions that implement comparable (and often better) features. This modular design will help to increase the user experience as well as the user's personal productivity with the application. This, too, can be supported by a thriving extension-based sub-community, and the community at large.&lt;br /&gt;
&lt;br /&gt;
====Advanced debugging technologies====&lt;br /&gt;
&lt;br /&gt;
[Work in progress]&lt;br /&gt;
&lt;br /&gt;
====Encouraging community activity====&lt;br /&gt;
&lt;br /&gt;
[Work in progress]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Debugging Modern Computer Architectures]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Universal_Debugger_Project&amp;diff=282</id>
		<title>Universal Debugger Project</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Universal_Debugger_Project&amp;diff=282"/>
				<updated>2008-10-12T22:37:45Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* GCNrd GUI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a reference and general documentation for a project I ([[:User:Parasyte|Parasyte]]) have been interested in pursuing for several years. This article will discuss the project's history, current developments, and future.&lt;br /&gt;
&lt;br /&gt;
==Project history==&lt;br /&gt;
&lt;br /&gt;
I began my research into debuggers sometime in 1999. Things were different back then; computers were just barely able to emulate SNES, even with emulators of the time taking numerous shortcuts to help speed up emulation. At the time, I only know of one SNES emulator pre-compiled with any kind of debugging functionality, and that was a build of SNES9x (then a chromeless application which was horribly difficult to use) by LordTech. It allowed the user to enable and disable assembly tracing while the game ran. This was a good start; you could see what the game was doing, and gain a lot of information from it. But it was still clunky.&lt;br /&gt;
&lt;br /&gt;
To find the assembly which read or wrote to a specific address, you had to search through (often many megabytes) of text for those addresses. It gave you a good piece of the puzzle, but it did not give you the whole picture. Often many instructions were branched over, and were entirely missing from the log.&lt;br /&gt;
&lt;br /&gt;
A few years later, I had some C programming experience of my own under my belt, and I had also found a new NES emulator called NESten. It wasn't a great NES emulator, but it was decent; it ran most of the NES games I was interested in, and it also had a fairly nice debugger built in! It was during this time that I got my first real taste of debugging. (Previously I experimented with UltraHLE's debugging features, but I don't recall them being much use; it used another &amp;quot;look but don't touch&amp;quot; passive take on debugging.)&lt;br /&gt;
&lt;br /&gt;
NESten's debugger (and the emulator itself) did have some annoying flaws. And after getting sick of it, I decided (like many pioneering hackers before me) to take a decent open source emulator and extend it with some decent debugging capabilities. I chose FCEU (FamiCom Emulator Ultra) by Xodnizel as my base. (Note: FCEU was previously based on FCE, by Bero.) FCEU was a good candidate because it had decent emulation capabilities, and also because it was quite fast; you really need a fast base if you're just going to slow it down with powerful features. And I'll get to that point later.&lt;br /&gt;
&lt;br /&gt;
===FCEUd===&lt;br /&gt;
&lt;br /&gt;
And with that, FCEUd (FCEU-debug) was born. It did not take long to get a stable debugger integrated into the CPU core and hooked up with a little chrome. Seems like it was only 3 or 4 months before it was usable, and a total of 6 months or so development time before I was happy with it. This debugger took all of the major ideas from NESten (including its disassembler syntax for displaying current work addresses) and added some crucial elements that NESten lacked (write breakpoints triggered by INC/DEC instructions, which increment and decrement bytes in memory). I also used ideas from PSX debuggers, such as &amp;quot;step out&amp;quot; which mutually comples the &amp;quot;step in&amp;quot; and &amp;quot;step over&amp;quot; process. And I'll get to that point, again, later.&lt;br /&gt;
&lt;br /&gt;
Since then, FCEUd has been further extended by other members of the emulation/ROM hacking scenes. To this day, FCE has been the most widely forked emulator, in part, because of the work we did extending it from an NES player to an NES development tool. But as you will see, this will bring me to another point later: The work done on FCE-derived forks is very widespread without much communication between parties. Ultimately, it's a mish-mash mix of talent tackling the same ideas from different vantage points without direct collaboration. And I think it's a shame.&lt;br /&gt;
&lt;br /&gt;
===GCNrd===&lt;br /&gt;
&lt;br /&gt;
The main development cycle on FCEUd was during 2002. I learned quite a bit from this project, and it got me interested in debugging other architectures. The next architecture I took on was Nintendo GameCube, officially abbreviated &amp;quot;GCN&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Sometime in 2003, hackers discovered a flaw in the GCN game Phantasy Star Online, which was compatible with the GCN BroadBand Adapter (BBA). This quickly became known as the PSO exploit, and allowed running &amp;quot;homebrew&amp;quot; code on a consumer GCN.&lt;br /&gt;
&lt;br /&gt;
The PSO exploit worked something like this: Hacker Joe sets up his own DNS server, and tells PSO to use that server IP address as its default gateway. This way, PSO asks Hacker Joe's DNS server where it can find Sega's PSO server. Hacker Joe's DNS server tells PSO that Sega's server is located on Hacker Joe's PSO server. PSO happily connects to Hacker Joe's PSO server, which then tells PSO that there is an update available. PSO happily downloads the &amp;quot;PSO loader stub&amp;quot; which is posing as an official update to PSO. PSO happily launches the PSO loader stub which takes over the GCN and begins downloading a larger executable (of Hacker Joe's choice) from Hacker Joe's PSO server. The PSO loader stub then launches Hacker Joe's executable, and Hacker Joe now has total control over his GCN. In short, PSO is tricked by Hacker Joe into running code that it never should have in the first place.&lt;br /&gt;
&lt;br /&gt;
This was a huge breakthrough for GCN hacking. I was in a very poorly state at the time, with no real job and no real income. I was doing work for a certain company selling GBA flash carts. It got me by, but it was a far cry from decent living. I mention this because it means I couldn't afford PSO or a BBA; the two things I needed to begin work on GCN debugging. I had the skill to accomplish it certainly, so I took up donations from members in the community. Only a few responded, but that's all I needed. About $100 USD was enough to pick up the two items I needed, and I was on my way to fame...&lt;br /&gt;
&lt;br /&gt;
====History of GCNrd====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;06-22-03: First GCN AR codes decrypted.&lt;br /&gt;
06-23-03: GCNcrypt v1.0 released.&lt;br /&gt;
06-25-03: First unofficial GCN AR codes released: Sonic Adventure DX (U) codes,&lt;br /&gt;
          by Sappharad.&lt;br /&gt;
06-27-03: GCNcrypt v1.1 released.&lt;br /&gt;
07-03-03: Planning for GCNrd begins.&lt;br /&gt;
07-07-03: GCNrd development begins.&lt;br /&gt;
08-27-03: Development on GCN network library begins.&lt;br /&gt;
08-29-03: First data received from GCN over network, using homebrew network&lt;br /&gt;
          library.&lt;br /&gt;
09-01-03: First data received by GCN over network, using homebrew network&lt;br /&gt;
          library.&lt;br /&gt;
09-13-03: Harddrive crash causes problems. Interest in GCNrd is lost.&lt;br /&gt;
12-31-03: After 3 months without working on GCNrd, aside from the occasional&lt;br /&gt;
          bugfix in the libs, GCNrd development finally continues.&lt;br /&gt;
12-31-03: Milestone #1. First successful RAM dump grabbed from a GCN game using&lt;br /&gt;
          GCNrd. It takes 35.735 seconds to complete.&lt;br /&gt;
12-31-03: BBA is started in 100mbit full duplex mode. Full RAM dump completes&lt;br /&gt;
          in 14.687 seconds.&lt;br /&gt;
01-03-04: Work on screenshot support begins. First successful screenshots are&lt;br /&gt;
          taken from Rayman 3 and Rogue Leader.&lt;br /&gt;
01-12-04: Mario Kart: Double Dash!! (U) is supported by GCNrd. This was the&lt;br /&gt;
          first successful &amp;quot;BBA Reset&amp;quot; patch for a LAN\network-enabled game.&lt;br /&gt;
01-15-04: Milestone #2. GCNrd rightly claims better compatability than Datel's&lt;br /&gt;
          FreeLoader v1.06b.&lt;br /&gt;
01-17-04: All tested games boot! 64 of 64.&lt;br /&gt;
01-19-04: Kenobi begins work on a GUI for GCNrd, making the program a bit&lt;br /&gt;
          easier to use, and adding code search features.&lt;br /&gt;
01-23-04: Milestone #3. First GCN AR code created using only GCNrd and Kenobi's&lt;br /&gt;
          GCNrd GUI. Wave Race: Blue Storm (U), 99 Points, by Knux0rz.&lt;br /&gt;
01-25-04: Started adding breakpoint support. Breaks work for Read, Write, and&lt;br /&gt;
          Read+Write. Execution breakpoints will be next. BPR\W gave me a bit&lt;br /&gt;
          of trouble. The biggest problem I had was getting around the 8-byte&lt;br /&gt;
          boundary which PowerPC uses for data breakpoints. This was completely&lt;br /&gt;
          unacceptable. As an example, if you set a breakpoint on address&lt;br /&gt;
          805E4FF5, a break would be reported every time an address between&lt;br /&gt;
          805E4FF0 - 805E4FF8 was accessed. Even though only one address within&lt;br /&gt;
          that range had a breakpoint set. My current solution to this problem&lt;br /&gt;
          is pretty nasty, but it works. In fact, it only reports a hit if the&lt;br /&gt;
          break addresses match perfectly. Maybe a little inconvenient, but&lt;br /&gt;
          hey!&lt;br /&gt;
03-11-04: GCN CodeType Helper v1.0 released.&lt;br /&gt;
03-11-04: GCNcrypt v1.2 released.&lt;br /&gt;
03-16-04: Finished up breakpoint support today, which should now be 100% fixed.&lt;br /&gt;
          The debugger now waits until just before returning to the game&lt;br /&gt;
          before enabling any r\w breakpoint. This will help bypass any&lt;br /&gt;
          misleading break hits that are caused by the debugger itself. Such as&lt;br /&gt;
          when accessing the stack and etc.&lt;br /&gt;
          New plan in the works to work-around memory constraints. May not work&lt;br /&gt;
          on all games, but should solve all problems with PacMan World 2.&lt;br /&gt;
          Which currently suffers from a nasty crash when accessing the memory&lt;br /&gt;
          card. The crash appears to be caused by how much memory I have&lt;br /&gt;
          allocated for the debugger.&lt;br /&gt;
03-17-04: Work begins on patching AR's code engine. With the patch in place,&lt;br /&gt;
          the code engine will run GCNrd's memory-resident debugger, allowing&lt;br /&gt;
          users to hack games with multiple executables, such as demo discs and&lt;br /&gt;
          the James Bond 007 games.&lt;br /&gt;
03-18-04: Kenobi adds real-time AR code list handling to the GUI. Supported AR&lt;br /&gt;
          versions are v1.06 and v1.08. Support for additional versions will be&lt;br /&gt;
          made available as soon as we receive AR RAM dumps from the other&lt;br /&gt;
          versions.&lt;br /&gt;
03-19-04: Win9x compatibility issues are worked on. GCNrd console now accepts&lt;br /&gt;
          commands passed on the command line. With commands entered on the&lt;br /&gt;
          command line, the console program will exit immediately after&lt;br /&gt;
          completing the requested command. Support for Win9x compatibility in&lt;br /&gt;
          the GUI is limited, but progressing rapidly.&lt;br /&gt;
03-20-04: Support for AR v1.11 completed.&lt;br /&gt;
03-31-04: First public release! GCNrd v1.00b is made available to hackers&lt;br /&gt;
          everywhere.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====GCNrd GUI====&lt;br /&gt;
&lt;br /&gt;
The GUI for GCNrd was written entirely separately from my own GCNrd development. It was called simply GCNrdGUI and was written by a French hacker, Kenobi, in Delphi. This split up the workload considerably, and also added a new level of modularity to the project overall. The overall GCNrd project consisted of four components:&lt;br /&gt;
&lt;br /&gt;
* GCNrd Loader: The UI that the user is presented with on the GCN itself. The loader is responsible for GCN-side configuration, initializing the network hardware, launching DVDs, and setting up the debugger/hooking the executable.&lt;br /&gt;
* GCNrd debugger: This is a piece that the user never sees, but directly interacts with. It's a very small program (32KB total program code and memory usage) that runs &amp;quot;behind&amp;quot; the game, listening for instructions coming over the network, and acting upon them.&lt;br /&gt;
* GCNrd client: A command-line application run on the user's PC which can be used to send and receive commands and data to/from the debugger over the network.&lt;br /&gt;
* GCNrdGUI: Kenobi's GUI for interacting with the GCNrd client.&lt;br /&gt;
&lt;br /&gt;
It was not necessary for the GUI to interact with the debugger through my CLI client, but that was the option chosen for GCNrdGUI. Later on another hacker, Sappharad, wrote his own GUI in Java which communicated with the debugger directly, bypassing the need for GCNrd client; the modularity of the project comes full circle.&lt;br /&gt;
&lt;br /&gt;
====GCNrd v1.10b and beyond====&lt;br /&gt;
&lt;br /&gt;
GCNrd v1.10b was released July 28th, 2005. It contained a number of bug fixes and new features. Some new features were only shiney on the surface (background images and UI colors in the loader, date/time display...), but some were actually quite important. The MMU handling, for example, allowed hacking games like Star Wars: Rogue Leader, Star Wars: Rebel Strike, and Metal Gear Solid: The Twin Snakes, which used the MMU extensively. It was a slightly rushed released, even though it did show some promise.&lt;br /&gt;
&lt;br /&gt;
This was the last official release I made, along with a private release (only available to close friends) which included some special features like DVD dumping and loading/debugging DVD images over the BBA. This &amp;quot;DVD simulation&amp;quot; was quite advanced for its time, and allowed me (and a few others) to hack downloaded/dumped games. There are often times that the only way to get a copy of a game is downloading it. Either because it was never officially released in your region, or because it hasn't been officially released ''at all''. This private &amp;quot;v1.10b+&amp;quot; version was never made public due to piracy concerns. &lt;br /&gt;
&lt;br /&gt;
Those piracy concerns were actually forfeited after other hackers disabled the DVD booting code in v1.10b to allow debugging DVD-Rs booted with a &amp;quot;Cobra-like&amp;quot; DVD BIOS.&lt;br /&gt;
&lt;br /&gt;
I had plans at one time to rewrite GCNrd so that it could be relocatable within GCN memory. This would solve problems with memory allocation on games that don't play nice. Resident Evil 4 is a good example of such games; it cannot be booted at all by any version of GCNrd. The rewrite would also make the source code legible enough that I could release it under the [http://www.gnu.org/copyleft/gpl.html GPL]. Granted, legibility is not necessary for source code release, but it was important for reasons of maintainability.&lt;br /&gt;
&lt;br /&gt;
GCNrd source code used a wild mix of C and assembly in its main debug core. Escaping the low levels of assembly was impossible, but it could be structured nicely anyway. This wasn't the only problem, of course. Both the loader and debugger had to have their own separate build of the network library. It was too costly (memory-wise) to put the full library into the debugger, even though this would allow the loader to use the debugger for all of its networking tasks.&lt;br /&gt;
&lt;br /&gt;
Instead, the debugger had a very minimal network library; I cut out all of the initialization sequences, all of the CRC code for packet data integrity checking, and whole lot of other not-completely-necessary packet handling code. It was important to keep the debugger as small as possible so it would not interfere with the game's use of memory.&lt;br /&gt;
&lt;br /&gt;
That gave me two entirely different network stacks to maintain; one was already quite a bit of work, as it was. There was also the problem of compiling the debugger separately from the loader, and then compiling the debugger binary directly into the loader itself.&lt;br /&gt;
&lt;br /&gt;
There are a number of ways these issues could have been addressed, and I'm not going to cover them all. But I will get back to the early point about modularity. As you will see, I am hoping to solve a great deal of these problems using that frame of mind. Needless to say, I never did complete the rewrite of GCNrd, which would have become &amp;quot;GCNrd v2&amp;quot;. But the problems displayed by it were the cornerstones of what was to become the Universal Debugger Project.&lt;br /&gt;
&lt;br /&gt;
===PCS and Mupen 64===&lt;br /&gt;
&lt;br /&gt;
The next year, in 2006, I went back to hacking N64. This was a time when some very interesting N64 hacks were made [http://doc.kodewerx.net/hacking_n64.html#asm_jesus_mode]. By this time, we were all very familiar with Nemu and its debugging/cheating capabilities. The debugger was not bad, but its emulation left quite a bit to be desired. Once again, unhappy with the tools available, I set out to tackle the problem and create my own tools.&lt;br /&gt;
&lt;br /&gt;
The first was [http://doc.kodewerx.net/hacking_n64.html#emulator_pcs Parasytic Cheat Search], a ''video'' plugin for PJ64 (and other emulators compatible with its plugin spec) that allowed cheat searching through the emulator's memory. It contained many bugs and architectural flaws (being a video plugin which passed all video-related messages to a ''real'' video plugin) but it provided a start for me to get into N64 emulator development.&lt;br /&gt;
&lt;br /&gt;
My next N64 project was tackling the debugger problem. Unlike a simple passive cheat searching program, a debugger has to be hooked directly to the CPU to work consistently. Like the FCEUd project years earlier, I wanted to start with a decent open source emulator and extend its capabilities to include decent debugging features.&lt;br /&gt;
&lt;br /&gt;
I chose Mupen 64 as my base, this time. It had relatively high compatibility, stability, and speed. It also contained a debugger for its GTK+ build, which I knew I could use to my advantage. I was still a Win32 programmer at the time; I did not have much experience outside of Windows. Naturally, I focused on Mupen's Windows code, which is where my debugger would live.&lt;br /&gt;
&lt;br /&gt;
After patching Mupen's CPU core (all three of them!) I started implementing the debugger window and all of its fancy widgets. This is when a very bad case of Deja Vu hit me. I had done all of this work before; I was reinventing the wheel. Not good. So I left Mupen 64 with a bare-bones cheat feature (including search) and debugger. This is when I began formulating the idea that debugger interfaces should be modular, just like GCNrd. Then came an avalanche of questions and issues. More on that later.&lt;br /&gt;
&lt;br /&gt;
===NTRrd and Kwurdi===&lt;br /&gt;
&lt;br /&gt;
In 2007, we had Nintendo DS (officially abbreviated NTR, unofficial NDS), and we had a means to hack it thanks to the efforts of the PassMe crew. I did not jump into DS dev quite as enthusiastically as I had GCN, but I eventually got into it and started playing around with ideas to debug the little machine. There were several problems, initially: The first was a communications port. I chose to use the GBA X-port, which was a rather expensive device (especially for video game hackers, who are typically in their teens, and without jobs), but it was attractive to me because of its FPGA.&lt;br /&gt;
&lt;br /&gt;
The X-port comes by default with a simple LPT serial port that can be used as a communications link. But it is generally slow and unreliable for large data transfers. On the other hand, the FPGA (and a LOT of IO) can be leveraged to implement a much faster and more stable communications link. And that's exactly what I did, writing custom FPGA logic for a simple 8-bit ECP-mode LPT port. The result was a much faster (~4MB/s ... still much slower than ethernet, WiFi, or USB would have been) and much more reliable (~0.0001% error rate) communications link that I could use to dump NDS memory to perform cheat searching.&lt;br /&gt;
&lt;br /&gt;
The initial result of this work was &amp;quot;NTRrd&amp;quot; which never saw any kind of release. That's when the ideas from past projects began to meld into an idea well ahead of its time. The idea of a universal debugger. Or at least, a universal debugger interface. So I came up with a silly acronym: KWURDI, for KodeWerx Universal Remote Debugger Interface. And I wanted NTRrd to be its first &amp;quot;client&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The idea was that NTRrd would be a three-piece project: NTRrd loader, NTRrd debugger, NTRrd client. And Kwurdi would be its GUI. The loader would load the debugger, the debugger would talk to the client, and the client would talk to the GUI. That's a lot of levels of abstraction. As it turns out, though, all of those levels are quite important. In fact, it's this level of abstraction and modularity which make this idea of a universal debugger important.&lt;br /&gt;
&lt;br /&gt;
==The universal debugger==&lt;br /&gt;
&lt;br /&gt;
The original article for the Universal Debugger Project can be found in the [[Debugging Modern Computer Architectures]] article. While it covers a good general scope of the idea itself, it does not lay down any foundation other than a very generic description of the roles that each piece of the project ''might'' play. To highlight the main points of the project:&lt;br /&gt;
&lt;br /&gt;
* The universal debugger interface itself is a user interface to allow interaction with a low-level debugger.&lt;br /&gt;
* The low-level debugger may or may not live on the same machine as the universal debugger interface. The universal debugger interface communicates with the low-level debugger through a standard communications link and protocol.&lt;br /&gt;
* The communications link should be an existing standard. For example, UNIX domain sockets or DBUS for a local low-level debugger, and TCP/IP for a remote low-level debugger.&lt;br /&gt;
* The protocol should also be an existing standard, but to this date, there does not appear to be anything which fits the goals of a universal debugger interface. One possibility is [http://www.rfc-archive.org/getrfc.php?rfc=909 RFC-909, Loader Debugger Protocol].&lt;br /&gt;
&lt;br /&gt;
===Project goals===&lt;br /&gt;
&lt;br /&gt;
The long term goals of the Universal Debugger Project include:&lt;br /&gt;
&lt;br /&gt;
* Modularity&lt;br /&gt;
* Standardization&lt;br /&gt;
&lt;br /&gt;
These items are to be taken as mutually inclusive. For modularity to work, there must be a set of standards in place. For a set of standards to be successful, the modularity granted by the standards must be exploited.&lt;br /&gt;
&lt;br /&gt;
For our purposes, I wish to implement a set of standards for a &amp;quot;universal debugger&amp;quot; with the help of the community, and implement a debugger interface on top of those standards as an example of modularity. The implementation has the following goals:&lt;br /&gt;
&lt;br /&gt;
# It will be Free Software, released under a free software license compatible with the [http://www.gnu.org/copyleft/gpl.html GNU General Public License].&lt;br /&gt;
# It will be a community-oriented project; accepting ideas, patches, code, images, and documentation, among other items, from the community which supports it.&lt;br /&gt;
# It will be designed as a cross-platform application, able to be used on multiple operating systems.&lt;br /&gt;
# It will be built with internationalization and localization in mind; capable of being adapted to different languages. &lt;br /&gt;
# It will communicate with and support of any low-level debugger which supports the standards defined by the Universal Debugger Project.&lt;br /&gt;
# It will be configurable, extensible, and modular by nature, to support any conceivable current or future architecture.&lt;br /&gt;
# It will support highly advanced debugging techniques and bleeding-edge technologies to get the most out of the user's debugging experience.&lt;br /&gt;
# It will support and encourage community activity through collaborative debugging.&lt;br /&gt;
&lt;br /&gt;
I will cover these points one at a time in more detail:&lt;br /&gt;
&lt;br /&gt;
====Free software====&lt;br /&gt;
&lt;br /&gt;
Free Software released under the [http://www.gnu.org/copyleft/gpl.html GNU General Public License] or a compatible license is meant to be community-driven. This means, anyone who wants to participate in the development of the project is free to participate. You don't become a community member by being one of a few elite deemed &amp;quot;worthy&amp;quot;; you become a member simply by joining an active discussion or contributing in some other way.&lt;br /&gt;
&lt;br /&gt;
The source code will be made available for everyone to look at or extend, which benefits from many eyes keeping the code safe and secure, and also from many hands working in parallel to quickly produce a stable product that is free for anyone to use in any way they see fit. These are two of the basic freedoms granted by a Free Software license: Freedom to look at and extent the product, and freedom to use the product in any way. There are many more freedoms granted by Free Software, and if interested you should consult the GPL documentation or other authoritative sources.&lt;br /&gt;
&lt;br /&gt;
====Community-oriented, community-driven====&lt;br /&gt;
&lt;br /&gt;
A community-oriented and community-driven software project benefits from its main source of use: its own users. Such projects become self-sustaining, as their users take the secondary roles of developers. I will not cover many of the details relating to community-oriented or community-driven software, but there are plenty of great resources available for further reading. Some suggested reading includes The Cathedral and the Bazaar [http://www.catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/index.html#catbmain] by Eric S. Raymond, the About Mozilla pages [http://www.mozilla.org/about] [http://www.mozilla.org/about/manifesto] [http://www.mozilla.org/mission.html] [http://www.mozilla.org/editorials/mozilla-overview.html], and the online book Open Sources: Voices from the Open Source Revolution [http://oreilly.com/catalog/opensources/book/toc.html].&lt;br /&gt;
&lt;br /&gt;
As a community-oriented, community-driven project, I believe there is no end to the ways in which we, as a community of programmers and hackers, will be able to debug. This community would ideally involve the active roles of everyone from video game and ROM hackers, application and operating system developers, and people in the field of academic research of computer architectures. It doesn't have to be the biggest and the best of the debugging communities (and it probably won't!) but it does have to be an accepting community, willing to allow contributions from anyone and everyone who wishes to contribute.&lt;br /&gt;
&lt;br /&gt;
====Cross-platform design====&lt;br /&gt;
&lt;br /&gt;
Among the design goals of the project, the universal debugger implementation must be able to run on multiple computer platforms and operating systems. This is a difficult undertaking, especially for a program focusing on a graphical user environment. Several bases for cross-platform development already exist, so dealing with intricacies of operating systems can be cut down to a minimum, while retaining a high level of overall product quality.&lt;br /&gt;
&lt;br /&gt;
I have personally researched several offerings for cross-platform frameworks and libraries, and I believe the best choice is the Mozilla platform, [http://developer.mozilla.org/en/XULRunner XULRunner]. XULRunner is still in its infancy, but is already very capable; it's the powerhouse behind the Firefox web browser, which runs on a large percentage of popular operating systems.&lt;br /&gt;
&lt;br /&gt;
Here is a short list of advantages to using XULRunner over just any cross-platform framework:&lt;br /&gt;
&lt;br /&gt;
* XULRunner is Free Software, and its development is community-oriented.&lt;br /&gt;
* Unlike Java and .NET, XULRunner applications are built with native code and have a native look-and-feel (&amp;quot;native&amp;quot; is in reference to the host operating system).&lt;br /&gt;
* Also unlike Java and .NET, XULRunner applications are written in C++, a highly portable and widely used programming language.&lt;br /&gt;
* XULRunner provides many features that Firefox users are already familiar with: scripting with Javascript, application extensibility through &amp;quot;extensions&amp;quot;, networking and popular web protocols support, HTML processing (and a LOT more) with the Gecko rendering engine.&lt;br /&gt;
* User interfaces in XULRunner are written in XUL (an XML dialect), styled with CSS, and setup to &amp;quot;do things&amp;quot; with Javascript -- all current web standards. The use of CSS allows the user interface to be &amp;quot;skinned&amp;quot; to a user's personal tastes.&lt;br /&gt;
* UI functionality is mostly implemented with Javascript, but backbone and critical code can be written in C++ and accessed from the Javascript environment.&lt;br /&gt;
&lt;br /&gt;
For a very informative read on the Mozilla platform, I recommend the online book [http://books.mozdev.org/chapters/index.html Creating Applications with Mozilla].&lt;br /&gt;
&lt;br /&gt;
====Internationalized and localized====&lt;br /&gt;
&lt;br /&gt;
Because community strengths are so important to a project of this size and magnitude, the global community becomes an invaluable asset. And as a diverse global community, not everyone will speak or understand a single common language. In this case, I am directly referring to the English language, which is personally my primary language, and the only language I am entirely fluent. Programmers and hackers in a similar situation, though with a different primary language, will benefit from a universal debugger. We should not neglect any user in the community. Making the universal debugger accessible and usable for everybody must be a top priority of the project.&lt;br /&gt;
&lt;br /&gt;
Choosing the Mozilla platform as the application's foundation will play a crucial role in the internationalization of the product. Because the user interface elements are written in an XML dialect, all text can be referenced with DTD entities, just like you might write &amp;amp;amp;gt; in XHTML to print the greater-than sign (&amp;amp;gt;). Likewise, you might write&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;caption label=&amp;quot;&amp;amp;amp;hello;&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in XUL which would display a label with &amp;quot;Hello&amp;quot; or &amp;quot;こんにちは&amp;quot; depending on the locale set on the user's machine when the XUL application is started.&lt;br /&gt;
&lt;br /&gt;
DTD entities are not magic translators; the text must be translated by a human who is fluent in both (source and destination) languages. However, using DTD entities is a great way to write user interfaces (and other things, like configuration files, for example) without locking the program to a specific language. It also makes the translator's work much easier, since all text strings which require translation will be neatly stored in a single location.&lt;br /&gt;
&lt;br /&gt;
Having the capability to bring a universal debugger to anyone, no matter their ethnic background, will help to expand the debugger's user base and ultimately its supporting community of developers. Designed from the beginning with breaking language barriers in mind, there should be few stumbling points along the road to the success of reaching this goal.&lt;br /&gt;
&lt;br /&gt;
====Standards compliant====&lt;br /&gt;
&lt;br /&gt;
Standards make the technological world work. And standards compliance makes compatibility issues entirely negligible. This is perhaps the most important point I will make within this documentation: defining a series of open standards to encompass ''all'' foreseeable debugging functionality is a necessity.&lt;br /&gt;
&lt;br /&gt;
The major reason for adopting a standard or series of standards is for compatibility purposes. Compatibility is critical for modular designs. And modularity is an important part of the overall user-configuration and extensibility of an application or sets of applications. Modularity also has the benefit of splitting workloads, as we did previously with GCNrd. Splitting workloads decreases development times, improves communication, and in some cases even improves product quality.&lt;br /&gt;
&lt;br /&gt;
In simpler terms, starting with splitting developer workloads, we all know that it's easier to cover more ground by splitting up. So long as you have a central location to meet up later, this tactic works wonderfully for rapid application development. In the case of developing a debugger, you might typically have one team focusing on the low-level handling of the CPU and hardware, another team tackling the user interface to the low-level debugger, and perhaps a third team covering the protocol between the two.&lt;br /&gt;
&lt;br /&gt;
I realize that the &amp;quot;third team&amp;quot; in this example is most likely set aside as another task for the first team in the real world. But if your project does require some sort of communication layer and you pull that out of the first team's hands, you can effectively pass that responsibility to a sort of &amp;quot;standards body&amp;quot; who will oversee the development and ''standardization'' of that communication layer. The job of such a body would be to ensure the standard is usable by anyone and for any purpose, generic enough to support all current and foreseeable architectures, and extensible enough to support all unforeseeable future architectures.&lt;br /&gt;
&lt;br /&gt;
The extensibility of the standard would be the most difficult to maintain. While a protocol or communication layer of this sort should be extensible for the reasons listed, it should only be extensible to the extent that any new features added would not break previous features or introduce new compatibility issues with previous designs and implementations of the protocol or communication layer. This means, generally, that the extensibility must remain open and ''optional''; no extended feature should ever be mandatory for any user to implement.&lt;br /&gt;
&lt;br /&gt;
There will undoubtedly be important new technologies which require mandatory extensions to the protocol during the life cycle and evolution of debugging technology. Under these circumstances, the standards body would be responsible for designing and publishing a new major version of the protocol with the new mandatory technologies. Implementers of the protocol, should they choose to support newer major versions, would then be required to implement all mandatory features in order to claim standards compliance of their implementation.&lt;br /&gt;
&lt;br /&gt;
What we need is a standards body; a group of individuals, mostly volunteers or &amp;quot;elected&amp;quot; members, to define and publish a series of standards for debugging modern computer architectures. They will be responsible for taking everyone's concerns from the community into account, and act on those concerns within their design and definition. They will be responsible for knowing that if they fail to do a good job, the community will stop listening to them and they will easily be replaced by anyone who steps up with a better idea.&lt;br /&gt;
&lt;br /&gt;
The goals of the standards body will be defining:&lt;br /&gt;
&lt;br /&gt;
* The ''wire''; how we get data from point A (low-level debugger) to point B (user interface). Ethernet? RS232? ...&lt;br /&gt;
* The ''language''; how our data is interpreted as points A and B speak. XML? JSON? Pure binary packets? ...&lt;br /&gt;
* The ''expansion''; how we can introduce new features without creating vendor locks or introducing incompatibilities. Header/Info/About/Options commands which specify the optional/extended features we support? ...&lt;br /&gt;
&lt;br /&gt;
The goals for us developers will be inheriting some of these responsibilities as we implement these standards, to create a flourishing environment for debugger developers to contribute with innovation and healthy competition.&lt;br /&gt;
&lt;br /&gt;
====Configurable, extensible, and modular====&lt;br /&gt;
&lt;br /&gt;
Debuggers are all about user experience. I say this with honest integrity because debugging, by its very nature, is a difficult task. Making a debugger very simple to use is a bullet point; you don't want to overwhelm a user (who is already working on a very difficult problem) with bad user experience. To improve the user experience, it is important to allow a level of customization among the user interface. Also important is extensibility and modularity, to make it easy for the user to expand the interface to fit her needs, and easy to replace one component with another that she prefers.&lt;br /&gt;
&lt;br /&gt;
Some of the items of the user interface which should be configurable include the overall look-and-feel of the interface (skin), the organization of windows and widgets (tabs, information panes, etc.), and the styles of text, fonts, and [image-]backgrounds used throughout.&lt;br /&gt;
&lt;br /&gt;
The look of the application, as well as the functionality, should be extensible using styling and scripting languages. The Mozilla platform once again becomes an asset as it allows simple integration of CSS and Javascript for the purposes of extending applications based on the platform. Extensions can be written and managed by the user community, much the same way that Firefox extensions are written and distributed. A central management location for extensions would be a great thing to have, but is not necessary to the success of a thriving extension-based sub-community.&lt;br /&gt;
&lt;br /&gt;
Including certain feature sets in the application's base install as pre-installed extensions means that users may uninstall those extensions at will to remove undesired features, or replace those extensions with other extensions that implement comparable (and often better) features. This modular design will help to increase the user experience as well as the user's personal productivity with the application. This, too, can be supported by a thriving extension-based sub-community, and the community at large.&lt;br /&gt;
&lt;br /&gt;
====Advanced debugging technologies====&lt;br /&gt;
&lt;br /&gt;
[Work in progress]&lt;br /&gt;
&lt;br /&gt;
====Encouraging community activity====&lt;br /&gt;
&lt;br /&gt;
[Work in progress]&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
* [[Debugging Modern Computer Architectures]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Mischief_Makers_v1.0_(U)/GameShark&amp;diff=218</id>
		<title>Mischief Makers v1.0 (U)/GameShark</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Mischief_Makers_v1.0_(U)/GameShark&amp;diff=218"/>
				<updated>2008-10-12T16:41:53Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: New page: ---- &amp;lt;big&amp;gt;'''Hextator'''&amp;lt;/big&amp;gt;  '''Kill NPCs'''  ----  8106C2B0 1000  ----  Mischief Makers v1.0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----&lt;br /&gt;
&amp;lt;big&amp;gt;'''Hextator'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Kill NPCs'''&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
8106C2B0 1000&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[Category:Nintendo 64|Mischief Makers v1.0]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Templates&amp;diff=127</id>
		<title>Help:Templates</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Templates&amp;diff=127"/>
				<updated>2008-10-08T09:20:45Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Using a template */ Added a missing &amp;quot;of&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
If you have standard texts you want to include on several pages, the MediaWiki template feature comes into play.&lt;br /&gt;
&lt;br /&gt;
==Creating a template==&lt;br /&gt;
Templates are standard wiki pages, only the template names are prefixed with &amp;quot;&amp;lt;code&amp;gt;Template:&amp;lt;/code&amp;gt;&amp;quot;. Therefore you can [[Help:Starting a new page|create them like any other wiki page]].&lt;br /&gt;
&lt;br /&gt;
==Using a template==&lt;br /&gt;
Templates are wiki pages which can be used in other pages in three ways:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Name}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; 'transcludes' (i.e. includes a copy of) the content of the template (stored in the page &amp;lt;nowiki&amp;gt;[[Template:Name]]&amp;lt;/nowiki&amp;gt;) whenever the page containing the template transclusion is fetched and displayed; i.e. if the template is later changed, the displayed transcluding page will automatically change too&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{subst:Name}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; replaces that string with the contents of the template, in the source of the transcluding page, when you save that page; the copy of the template contents can then be edited normally (and separately from the original in the template page). '''''Note''''': don't use this if you are looking to continually propagate changes from the source template to the page(s) that references it.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{msgnw:Name}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; includes the template in a form that displays it as raw wiki syntax (the way &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;lt;nowiki&amp;amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; does) when the page containing it is fetched&lt;br /&gt;
&lt;br /&gt;
==Using parameters in templates==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; margin:8px;&amp;quot;&amp;gt;&lt;br /&gt;
{| {{Prettytable}} &lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}} colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |'''Template with numbered parameters'''	&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt; &lt;br /&gt;
'''A little thank you...'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;for {{{1}}}.&amp;lt;br&amp;gt;&lt;br /&gt;
hugs, {{{2}}}&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}|'''You type'''	&lt;br /&gt;
|{{Hl2}}|'''You get'''&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Thankyou|all your hard work|Joe}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
{{Thankyou|all your hard work|Joe}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}} colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; |'''with named parameters'''	&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt; &lt;br /&gt;
'''A little thank you...'''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;for {{{reason}}}.&amp;lt;br&amp;gt;&lt;br /&gt;
hugs, {{{signature}}}&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}|'''You type'''	&lt;br /&gt;
|{{Hl2}}|'''You get'''&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;{{Thankyou&lt;br /&gt;
|reason=all your hard work&lt;br /&gt;
|signature=Joe}}&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
{{Thankyou|all your hard work|Joe}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
You can define parameters in templates either numbered as &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{{1}}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; or named &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{{param}}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.  &lt;br /&gt;
&lt;br /&gt;
'''Example:''' You want a little thank you note you can put on the talk page of other users. It will contain a reason and your signature. You could create [[Template:Thankyou]] to enter your text, as in the example in the table.&lt;br /&gt;
&lt;br /&gt;
When using the template on a page, you fill in the parameter values, separated by a pipe char (|): &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Thankyou|all your hard work|Joe}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.  For named parameters use &amp;quot;name=value&amp;quot; pairs separated by a pipe char:   &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Thankyou|reason=all your hard work|signature=Joe}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. The advantage of using named parameters in your template is that they are flexible in order. It also makes the template easier to understand if you have many parameters. If you want to change the order of numbered parameters, you have to mention them explicitly: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Thankyou|2=Joe|1=all your hard work}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
You can also provide default values for parameters, i.e. values that are going to be used if no value is provided for a parameter. For example, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{{reason|all your hard work}}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; would result in ''&amp;quot;all your hard work&amp;quot;'' if no value was provided for the parameter &amp;lt;tt&amp;gt;reason&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Control template inclusion==&lt;br /&gt;
You can control template inclusion by the use of &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;noinclude&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; tags.&lt;br /&gt;
&lt;br /&gt;
Anything between &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;noinclude&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/noinclude&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; will be processed and&lt;br /&gt;
displayed only when the page is being viewed directly, not included.&lt;br /&gt;
&lt;br /&gt;
Possible applications are:&lt;br /&gt;
* Categorising templates&lt;br /&gt;
* Interlanguage links to similar templates in other languages&lt;br /&gt;
* Explanatory text about how to use the template&lt;br /&gt;
&lt;br /&gt;
The converse is &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Text between &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; will be processed and displayed only when the page is&lt;br /&gt;
being included. The obvious application is to add all pages containing a given template to a [[Help:Categories|category]], without putting the template itself into that category.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' when you change the categories applied by a template, the categorization of the pages that use that template may not be updated until some time later: this is handled by the {{mediawiki|Manual:Job_queue|job queue}}.&lt;br /&gt;
&lt;br /&gt;
==Organizing templates==&lt;br /&gt;
For templates to be effective users need to find them and be able to use them. A simple technique is to include an example on the template page.&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:table; width:auto;&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
==Usage==&lt;br /&gt;
Allows to establish a link to a subject:&lt;br /&gt;
{{NameOfTemplate|Term1+Term2+Term3}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, an editor can simply copy and paste the example to create a similar page.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
*[[Help:External searches]] -- a template special use case example&lt;br /&gt;
*[[Help:Magic words]] -- fancy stuff you may find in some templates&lt;br /&gt;
*{{mediawiki|meta:Help:Embed page}} -- embedding pages from {{mediawiki|namespace|namespaces}} other than &amp;lt;code&amp;gt;Template:&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Help|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Template]]&lt;br /&gt;
{{Languages|Help:Templates}}&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Images&amp;diff=79</id>
		<title>Help:Images</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Images&amp;diff=79"/>
				<updated>2008-10-07T00:50:26Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Syntax */ click=&amp;gt;link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
&lt;br /&gt;
This page explains the image syntax when editing the wiki. Before using images, your wiki must have file uploads enabled (see the {{mediawiki|Manual:Configuring_file_uploads|technical manual}} for details) and you have to [[Help:Managing files|upload a file]].&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}}|'''Description'''&lt;br /&gt;
|{{Hl3}}|'''You type''' &lt;br /&gt;
|{{Hl3}}|'''You get'''&lt;br /&gt;
|-&lt;br /&gt;
|Embed image&amp;lt;br /&amp;gt; (with alt text)&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Image:Example.jpg|Sunflowers]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
[[Image:Example.jpg|Sunflowers]]&lt;br /&gt;
|-&lt;br /&gt;
|Link to description page&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[:Image:Example.jpg]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[:Image:Example.jpg|Sunflowers]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
[[:Image:Example.jpg]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[:Image:Example.jpg|Sunflowers]]&lt;br /&gt;
|-&lt;br /&gt;
|Link directly to file&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Media:Example.jpg]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Media:Example.jpg|Sunflowers]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
[[Media:Example.jpg]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Media:Example.jpg|Sunflowers]]&lt;br /&gt;
|-&lt;br /&gt;
|Thumbnail&amp;lt;br /&amp;gt; (centered, 100 pixels&amp;lt;br /&amp;gt; wide, with caption)&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Image:Example.jpg|center|thumb|100px|Sunflowers]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
[[Image:Example.jpg|center|thumb|100px|Sunflowers]]&lt;br /&gt;
|-&lt;br /&gt;
|Border&amp;lt;br /&amp;gt; (100 pixels) &amp;lt;br /&amp;gt; Results in a very small gray border&lt;br /&gt;
&amp;lt;!-- Note: because the fine gray border can not be seen when used on Image:Exaple.jpg (sunflowers image), an image with a white background is used --&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Image:Example-white-bg.jpg|border|100px]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
[[Image:Example-white-bg.jpg|border|100px]]&lt;br /&gt;
|-&lt;br /&gt;
|Frameless&amp;lt;br /&amp;gt;Like thumbnail, respect user preferences for image width but without border and no right float.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Image:Example.jpg|frameless]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
[[Image:Example.jpg|frameless]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
The full syntax for displaying an image is:&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Image:{name}|{options}]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Where options can be zero or more of the following, separated by pipes:&lt;br /&gt;
*&amp;lt;code&amp;gt;thumb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;thumbnail&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;frame&amp;lt;/code&amp;gt;: Controls how the image is formatted&lt;br /&gt;
*&amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;right&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;center&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;: Controls the alignment of the image on the page&lt;br /&gt;
*&amp;lt;code&amp;gt;baseline&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sub&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;super&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text-top&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;middle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bottom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;text-bottom&amp;lt;/code&amp;gt;: Controls the vertical alignment of the image on the page&lt;br /&gt;
*&amp;lt;code&amp;gt;{width}px&amp;lt;/code&amp;gt;: Resizes the image to the given width in pixels&lt;br /&gt;
*&amp;lt;code&amp;gt;{caption text}&amp;lt;/code&amp;gt;: Must not end with &amp;quot;px&amp;quot;&lt;br /&gt;
* Special cases:&lt;br /&gt;
** &amp;lt;code&amp;gt;page=1&amp;lt;/code&amp;gt;: Displays the specified page when showing a djvu file&lt;br /&gt;
*&amp;lt;code&amp;gt;link={destination}&amp;lt;/code&amp;gt;: Allows to link to an arbitrary title, URL or just nowhere&lt;br /&gt;
&lt;br /&gt;
The options can be given in any order. If a given option does not match any of the other possibilities, it is assumed to be the caption text. Caption text can contain wiki links or other formatting.&lt;br /&gt;
&lt;br /&gt;
== Other files ==&lt;br /&gt;
You can link to an external file using the same syntax used for linking to an external web page. &lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[http://url.for/some/image.png]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Or with different text:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[http://url.for/some/image.png link text here]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it is enabled on your wiki (see {{mediawiki|Manual:$wgAllowExternalImages}}), you can also embed external images. To do that, simply insert the image's url:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;http://url.for/some/image.png&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gallery of images ==&lt;br /&gt;
It's easy to make a gallery of thumbnails with the &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;gallery&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; tag. The syntax is:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:{filename}|{caption}&lt;br /&gt;
Image:{filename}|{caption}&lt;br /&gt;
{...}&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Captions are optional, and may contain wiki links or other formatting.&lt;br /&gt;
&lt;br /&gt;
for example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Example.jpg|Item 1&lt;br /&gt;
Image:Example.jpg|a link to [[Help:Contents]]&lt;br /&gt;
Image:Example.jpg&lt;br /&gt;
Image:Example.jpg&lt;br /&gt;
Image:Example.jpg|''italic caption''&lt;br /&gt;
Image:Example.jpg|on page &amp;quot;{{PAGENAME}}&amp;quot;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
is formatted as:&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Image:Example.jpg|Item 1&lt;br /&gt;
Image:Example.jpg|a link to [[Help:Contents]]&lt;br /&gt;
Image:Example.jpg&lt;br /&gt;
Image:Example.jpg&lt;br /&gt;
Image:Example.jpg|''italic caption''&lt;br /&gt;
Image:Example.jpg|on page &amp;quot;{{PAGENAME}}&amp;quot;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Help:Linked images|Linked images]]&lt;br /&gt;
&lt;br /&gt;
==External Link==&lt;br /&gt;
* [[wikipedia:Project:Extended image syntax|Wikipedia:Extended image syntax]]&lt;br /&gt;
&lt;br /&gt;
{{Languages|Help:Images}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Help|Images]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Linked_images&amp;diff=81</id>
		<title>Help:Linked images</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Linked_images&amp;diff=81"/>
				<updated>2008-10-06T19:12:32Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: Native image link support coming?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
&lt;br /&gt;
[[Help:Images|Images]] on a MediaWiki wiki are designed to link to the description page, so that licensing information, upload history, contributors, and full resolution versions are immediately available to the user when he or she clicks an image. In fact, MediaWiki is designed to prevent manual manipulation of images in wikicode which may circumvent this operation: The '''&amp;lt;tt&amp;gt;&amp;amp;lt;img&amp;amp;gt;&amp;lt;/tt&amp;gt;''' tag is specifically not whitelisted in the {{mediawiki|Manual:Sanitizer.php|Sanitizer}}, nor is the '''&amp;lt;tt&amp;gt;background-image&amp;lt;/tt&amp;gt;''' CSS attribute.&lt;br /&gt;
&lt;br /&gt;
However, there are several workarounds for those that require them.&lt;br /&gt;
&lt;br /&gt;
==1.14+==&lt;br /&gt;
{{future}}&lt;br /&gt;
Native image link support was added in [[rev:41727|r41727]]. See [[bugzilla:539|b539]].&lt;br /&gt;
&lt;br /&gt;
==Vanilla install==&lt;br /&gt;
If you only have sysop access to the Wiki, these are your best options.&lt;br /&gt;
&lt;br /&gt;
===Site CSS===&lt;br /&gt;
The most simplistic method, if your requirements for external images are specialized (that is, restricted to one page or one image), is to add a CSS rule to your MediaWiki:Common.css (or other CSS files, such as MediaWiki:Skinname.css or /skins/skinname/main.css, etc) giving child links of a certain class of object a background image. This method also has some security, as it requires editing the site-wide CSS files, meaning only sysops have access to modify the image shown. &lt;br /&gt;
&lt;br /&gt;
For example (red sections are parts to configure for each image):&lt;br /&gt;
&lt;br /&gt;
In MediaWiki:Common.css:&lt;br /&gt;
 '''&amp;lt;tt&amp;gt;.imagelink_&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;somename&amp;lt;/span&amp;gt; a {&lt;br /&gt;
   width:&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;100&amp;lt;/span&amp;gt;px;&lt;br /&gt;
   height:&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;100&amp;lt;/span&amp;gt;px;&lt;br /&gt;
   display:block;&lt;br /&gt;
   text-decoration:none;&lt;br /&gt;
   background-image: url(&amp;quot;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;http://fullurltoimage&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;) &lt;br /&gt;
 }&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
In your wikicode:&lt;br /&gt;
 '''&amp;lt;tt&amp;gt;&amp;amp;lt;div class=&amp;quot;imagelink_&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;somename&amp;lt;/span&amp;gt;&amp;quot;&amp;amp;gt;&amp;lt;nowiki&amp;gt;[[&amp;lt;/nowiki&amp;gt;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;Some link&amp;lt;/span&amp;gt;|&amp;amp;amp;nbsp;&amp;lt;nowiki&amp;gt;]]&amp;lt;/nowiki&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/tt&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
This would give the link the background image specified, as well as the width and height of the image (which you have to set manually). To find the location of an uploaded file, go to the image description page and click the image itself, and copy the image location in the address bar. &lt;br /&gt;
&lt;br /&gt;
For example on [[:Image:Wiki.png]], the image location is http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png (location format will differ depending on local settings), and the width and height would be set to 135px and 135px. So to make a link to the main page here using that logo, one would add to [[MediaWiki:Common.css]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;.imagelink_wikilogo a {&lt;br /&gt;
  width:135px;&lt;br /&gt;
  height:135px;&lt;br /&gt;
  display:block;&lt;br /&gt;
  text-decoration:none;&lt;br /&gt;
  background-image: url(&amp;quot;http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png&amp;quot;) &lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
And then use the wikicode:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div class=&amp;quot;imagelink_wikilogo&amp;quot;&amp;gt;[[MediaWiki|&amp;amp;amp;nbsp;]]&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which would give you:&lt;br /&gt;
&amp;lt;div class=&amp;quot;imagelink_wikilogo&amp;quot;&amp;gt;[[MediaWiki|&amp;amp;nbsp;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also use a thumbnail of an image, but make sure the thumbnail is being used elsewhere, as most installations are not configured to generate thumbnails on demand.&lt;br /&gt;
&lt;br /&gt;
===Inline CSS===&lt;br /&gt;
You can also attempt to superimpose an invisible link over an image via CSS, such as is done in [[Template:Click]]. An example of a typical click template is:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;div style=&amp;quot;position: relative; width: {{{width}}}; height: {{{height}}}; overflow: hidden;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; top: 0px; left: 0px; font-size: 100px; overflow: hidden; line-height: 100px; z-index: 3;&amp;quot;&amp;gt;[[{{{link}}}|&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;position: absolute; top: 0px; left: 0px; z-index: 2;&amp;quot;&amp;gt;[[Image:{{{image}}}|{{{width}}}|{{{link}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Known problems: It doesn't work in text-only browsers, and in screen readers for the disabled, and possibly other situations.  The technique of using [[wikipedia:CSS|CSS]] to change page content also completely breaks an article's [[wikipedia:web accessibility|web accessibility]] by contravening a [[wikipedia:WAI|WAI]] priority-one checkpoint.[http://www.w3.org/TR/WAI-WEBCONTENT/#tech-order-style-sheets]&lt;br /&gt;
&lt;br /&gt;
===Redirect===&lt;br /&gt;
A less elegant trick is to make the image description page a redirect to the target. So for example [[:Image:Wiki.png]] would be changed to content:&lt;br /&gt;
&amp;lt;pre&amp;gt;#REDIRECT [[MediaWiki]]&amp;lt;/pre&amp;gt;&lt;br /&gt;
There are several disadvantages to this:&lt;br /&gt;
* It doesn't always work, some installations/versions have internamespace redirects disabled.&lt;br /&gt;
* The image appears at the top of the article. This is because MediaWiki redirects aren't really redirects, they simply bring the target page's data to the current URL, but on image description pages this is done after the image itself is shown.&lt;br /&gt;
* It can only be done once per image.&lt;br /&gt;
&lt;br /&gt;
==Native with configuration change==&lt;br /&gt;
If you have server access, but do not want to install any extensions, these solutions may work for you.&lt;br /&gt;
===External image syntax===&lt;br /&gt;
If you enable {{mediawiki|Manual:$wgAllowExternalImages|$wgAllowExternalImages}} (which allows external images from any domain) or {{mediawiki|Manual:$wgAllowExternalImagesFrom|$wgAllowExternalImagesFrom}} (which restricts the list of domains), anyone can then easily create an &amp;quot;external&amp;quot; link to an &amp;quot;external&amp;quot; image. External simply means: using the full URL rather than a local link, so you can link locally, but you need to use the full URL. The plainlinks class is used to remove the &amp;quot;external link&amp;quot; icon:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;amp;gt;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;[http://linktopage http://linktoimage]&amp;lt;/nowiki&amp;gt;&amp;lt;/span&amp;gt;&amp;amp;lt;/span&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
So for example, were external images allowed here, you could link to the {{mediawiki|MediaWiki|main page}} with http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png using wikicode like:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;amp;gt;&amp;lt;nowiki&amp;gt;[{{fullurl:MediaWiki}} http://upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png]&amp;lt;/nowiki&amp;gt;&amp;amp;lt;/span&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
This has the disadvantage of not registering the link, or the image use, as well as not being easily portable to forks and mirrors.&lt;br /&gt;
&lt;br /&gt;
===Raw HTML===&lt;br /&gt;
If you enable {{mediawiki|Manual:$wgRawHtml|$wgRawHtml}}, you can use '''&amp;lt;tt&amp;gt;&amp;amp;lt;img&amp;amp;gt;&amp;lt;/tt&amp;gt;''' tags freely, but this method is highly insecure.&lt;br /&gt;
&lt;br /&gt;
There are, however, some extensions to make it safer, see {{mediawiki|Manual:$wgRawHtml#Related_Extensions}} for details.&lt;br /&gt;
&lt;br /&gt;
==via Extension==&lt;br /&gt;
If you are willing to install an extension, several extensions have been created to address this issue:&lt;br /&gt;
*{{mediawiki|Extension:ImageMap}} - advanced image shape-link extension, uses the html USEMAP features ''(xml tag)''&lt;br /&gt;
*{{mediawiki|Extension:LinkedImage}} - image links ''(XML tag)''&lt;br /&gt;
*{{mediawiki|Extension:Icon}} - image links ''(parser function)''&lt;br /&gt;
&lt;br /&gt;
Or you can invent your own linked image syntax, by writing an extension that registers it as a parser hook. See {{mediawiki|Manual:Tag extensions}} for information on extending MediaWiki syntax.&lt;br /&gt;
&lt;br /&gt;
==Other options==&lt;br /&gt;
If you want, you can do some more drastic things, such as modify /includes/Sanitizer.php (where the HTML tag whitelist is), and add &amp;amp;lt;img /&amp;amp;gt; to the list of allowed tags.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Help:Contents]]&lt;br /&gt;
*[[Help:Links]]&lt;br /&gt;
*[[Help:Images]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Help|Linked images]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Links&amp;diff=83</id>
		<title>Help:Links</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Links&amp;diff=83"/>
				<updated>2008-10-06T12:19:44Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: Reverted edits by 130.94.123.98 (Talk) to last version by Bdk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
There are four sorts of links in MediaWiki: &lt;br /&gt;
# internal links to other pages in the wiki&lt;br /&gt;
# external links to websites&lt;br /&gt;
# [[#Interwiki links|interwiki links]] (links to other wikis)&lt;br /&gt;
# inter-language links to other language versions of the same wiki&lt;br /&gt;
&lt;br /&gt;
To add an internal link, enclose the name of the page you want to link to in double square brackets. When you save the page, you'll see the new link pointing to your page. If the page exists already, it is displayed in blue, empty pages are displayed in red. Selflinks to the current page are not transformed in URLs but displayed in bold.&lt;br /&gt;
&lt;br /&gt;
The first letter of the target page is automatically capitalized and spaces are represented as underscores (typing an underscore in the link will have a similar effect as typing a space, but is not recommended, since the underscore will also be shown in the text).&lt;br /&gt;
&lt;br /&gt;
== How to link ==&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}}|'''Description'''&lt;br /&gt;
|{{Hl3}}|'''You type'''	&lt;br /&gt;
|{{Hl3}}|'''You get'''&lt;br /&gt;
|-&lt;br /&gt;
|Internal link&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[Main Page]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[[Main Page]]&lt;br /&gt;
|-&lt;br /&gt;
|Piped link &lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[Main Page|different text]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[[Main Page|different text]]&lt;br /&gt;
|-&lt;br /&gt;
|External link&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;http://mediawiki.org&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|http://mediawiki.org&lt;br /&gt;
|-&lt;br /&gt;
|External link,&amp;lt;br /&amp;gt;&lt;br /&gt;
different title&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[http://mediawiki.org MediaWiki]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[http://mediawiki.org MediaWiki]&lt;br /&gt;
|-&lt;br /&gt;
|External link,&amp;lt;br /&amp;gt;&lt;br /&gt;
numbered&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[http://mediawiki.org]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[http://mediawiki.org]&lt;br /&gt;
|-&lt;br /&gt;
|Anchor link &lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[#See also]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[[#See also]]&lt;br /&gt;
|-&lt;br /&gt;
|Anchor link at another page&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[Help:Images#See also]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[[Help:Images#See also]]&lt;br /&gt;
|-&lt;br /&gt;
|Category link&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[:Category:Help]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[[:Category:Help]]&lt;br /&gt;
|-&lt;br /&gt;
|Internal link to image file&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[media:example.jpg]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[[media:example.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|Internal link to pdf file&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[media:example.pdf]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[[media:example.pdf]]&lt;br /&gt;
|-&lt;br /&gt;
|Interwiki link&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[Wikipedia:MediaWiki]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[[Wikipedia:MediaWiki]]&lt;br /&gt;
|-&lt;br /&gt;
|mailto link&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[mailto:info@example.org email me]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[mailto:info@example.org email me]&lt;br /&gt;
|-&lt;br /&gt;
|redirect&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#REDIRECT [[Main Page]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;amp;rarr; [[Main Page]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== More advanced ===&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}}|'''Description'''&lt;br /&gt;
|{{Hl3}}|'''You type'''	&lt;br /&gt;
|{{Hl3}}|'''You get'''&lt;br /&gt;
|-&lt;br /&gt;
|Piped link,&amp;lt;br /&amp;gt;&lt;br /&gt;
different title&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[Main Page|&amp;lt;span title=&amp;quot;different title&amp;quot;&amp;gt;different text&amp;lt;/span&amp;gt;]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[[Main Page|&amp;lt;span title=&amp;quot;different title&amp;quot;&amp;gt;different text&amp;lt;/span&amp;gt;]]&lt;br /&gt;
|-&lt;br /&gt;
|External link,&amp;lt;br /&amp;gt;&lt;br /&gt;
same host unnamed&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[http://{{SERVERNAME}}/pagename]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[http://{{SERVERNAME}}/pagename]&lt;br /&gt;
|-&lt;br /&gt;
|mailto named with subject line and body&lt;br /&gt;
|&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[mailto:info@example.org?Subject=URL%20Encoded%20Subject&amp;amp;body=Body%20Text info]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|[mailto:info@example.org?Subject=URL%20Encoded%20Subject&amp;amp;body=Body%20Text info]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
{{admin tip|tip=&lt;br /&gt;
Which protocols (like http:) are allowed for links is controlled by the [http://www.mediawiki.org/wiki/Manual:%24wgUrlProtocols $wgUrlProtocols]&amp;lt;!-- deliberate use of http url, these pages get exported. Should these admin tips even be here? This is supposed to be end user help is it not? --&amp;gt; setting. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{admin tip|tip=&lt;br /&gt;
To remove the 'external link image' from next to each of the external links, add the following to the page located at &amp;lt;code&amp;gt;MediaWiki:Monobook.css&amp;lt;/code&amp;gt; on your wiki.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#bodyContent a.external,&lt;br /&gt;
#bodyContent a[href ^=&amp;quot;gopher://&amp;quot;] {&lt;br /&gt;
        background: none;&lt;br /&gt;
        padding-right: 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== How to avoid auto-links ==&lt;br /&gt;
&lt;br /&gt;
By default, when you write a URL as is, it will be transformed to an external link.&lt;br /&gt;
&lt;br /&gt;
To avoid that effect, put the URL between &amp;amp;lt;nowiki&amp;amp;gt; start &amp;amp; end tags as in:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;nowiki&amp;amp;gt;&amp;lt;nowiki&amp;gt;http://mediawiki.org&amp;lt;/nowiki&amp;gt;&amp;amp;lt;/nowiki&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interwiki links ==&lt;br /&gt;
Interwiki links are links from the local wiki to another wiki. For example you can link to the Sunflower article on wikipedia.org by typing &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[wikipedia:Sunflower]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;. This results in a link like this: [[wikipedia:Sunflower]]&lt;br /&gt;
&lt;br /&gt;
Similar to internal page links, you can create piped links, with alternate link text. e.g. &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[wikipedia:Sunflower|big yellow flower]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Basically this is an abbreviation for longer URLs. A very similar link could be created as a normal external link by typing &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[http://en.wikipedia.org/wiki/Sunflower Sunflower]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, but interwiki links allow you to type out an easy and compact link, almost as if you are linking to a page on your own wiki.&lt;br /&gt;
&lt;br /&gt;
Some interesting things to note:&lt;br /&gt;
* Interwiki links are displayed slightly differently to external links, without the little external link icon.&lt;br /&gt;
* Complex page names with spaces and other characters are handled elegantly, just as they would be for an internal page link, making this more tidy than creating an external link to a full URL. For example &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;[[wikipedia:Sunflower County, Mississippi]]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; is in some ways tidier and more elegant than the full URL : &amp;lt;tt&amp;gt;http://en.wikipedia.org/wiki/Sunflower_County%2C_Mississippi&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Help:Linked images|Linked images]]&lt;br /&gt;
 &lt;br /&gt;
{{Languages|Help:Links}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Help|Links]]&lt;br /&gt;
[[Category:Link]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Skins&amp;diff=111</id>
		<title>Help:Skins</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Skins&amp;diff=111"/>
				<updated>2008-10-05T13:48:19Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* See also */ Gallery of user styles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
&lt;br /&gt;
Clicking on the [[Special:preferences|my preferences]] link in the upper right while logged in then click on the '''Skin''' button to change your skin. You can also preview the skin by clicking the '''(preview)''' links next to each skin.&lt;br /&gt;
&lt;br /&gt;
You can make changes to the current skin's {{mediawiki|Manual:Interface/Stylesheets|stylesheet}} file (CSS) by creating a subpage of your userpage, &amp;quot;[[Special:Mypage/monobook.css|User:Yourname/monobook.css]]&amp;quot; for example. This requires your site admin to have enabled this feature -- if it is, you will see advice text at the top of your custom CSS page about clearing your browser's cache.&lt;br /&gt;
&lt;br /&gt;
{{admin tip|tip=To enable this feature, you have to set [http://www.mediawiki.org/wiki/Manual:%24wgAllowUserCss $wgAllowUserCss] to your {{mediawiki|Manual:LocalSettings.php|LocalSettings.php}}.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Help:Preferences]]&lt;br /&gt;
* [http://meta.wikimedia.org/wiki/Gallery_of_user_styles Gallery of user styles] (no official skins)&lt;br /&gt;
&lt;br /&gt;
{{Languages|Help:Skins}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Help|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Special Pages|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Subpage|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Protecting_and_unprotecting_pages&amp;diff=101</id>
		<title>Help:Protecting and unprotecting pages</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Protecting_and_unprotecting_pages&amp;diff=101"/>
				<updated>2008-10-04T04:53:02Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
'''Protecting and unprotecting pages''' is very straightforward, but these operations require [[Help:Sysops and permissions|sysop permissions]].&lt;br /&gt;
&lt;br /&gt;
You can designate a page as a [[Help:Protected pages|protected page]] by clicking the 'Protect page' tab, and supplying a comment (a brief textual description of why you are protecting the page)&lt;br /&gt;
&lt;br /&gt;
There are several reasons why a particular page might be protected. Typically a protected page is one which has been repeatedly targeted with vandalism, or where it is believed that any vandalism would have a unusually severe impact. However there are also many good reasons for ''not'' protecting pages. As a sysop you must make this choice, and wield your power responsibly. A good reason to protect pages would to maintain some overall structured deemed desireable for a speciifc wiki.&lt;br /&gt;
&lt;br /&gt;
{{languages|Help:Protecting and unprotecting pages}}&lt;br /&gt;
[[Category:Help|Protecting and unprotecting pages]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Deleting_a_page&amp;diff=69</id>
		<title>Help:Deleting a page</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Deleting_a_page&amp;diff=69"/>
				<updated>2008-10-02T08:40:00Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: Reverted edits by 202.137.66.72 (Talk) to last version by Protonk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifexist: Template:PD Help Page/{{SUBPAGENAME}}|{{PD Help Page/{{SUBPAGENAME}}}}|{{PD Help Page}}}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== When '''not''' to delete a page : ==&lt;br /&gt;
Typically you would delete a page if the contents are entirely inappropriate, and do not match the purposes of the wiki. In other situations you might prefer a less extreme course of action, for example...&lt;br /&gt;
&lt;br /&gt;
* The page should have a different title - So just &amp;quot;move&amp;quot; the page to a better title. See [[Help:Moving a page]]&lt;br /&gt;
* The contents should have been placed on a different page - So &amp;quot;merge&amp;quot; the contents into the existing page and then create a redirect. See [[Help:Redirects]]&lt;br /&gt;
* The contents are already on a different page - So wipe away all the duplicate content and leave behind a redirect. That way, this page title (which made more sense to somebody), will helpfully redirect to the correct location of the information. See [[Help:Redirects]]&lt;br /&gt;
* The page is out-of-date - So update it! If the page describes a current or future event, which has now passed, reword all of the sentences to be in the past tense, that way you have created a page which acts as a historical record. Alternatively label the information as out-of-date, with a warning notice.&lt;br /&gt;
&lt;br /&gt;
So in fact a straightforward delete is generally only necessary if the ''title'' of the page is inappropriate. In other situations, a merge and redirect is more appropriate.&lt;br /&gt;
&lt;br /&gt;
=== Proposing changes ===&lt;br /&gt;
Deciding on appropriate content/page titles can be a difficult aspect of wiki organization, and one which can often provoke debates. If the merge or deletion you have in mind, is one which might cause upset, you should propose the change first. Do this by leaving a note to give your reasons on the [[Help:Talk pages|talk page]]. You might also establish a system for labeling the page itself, with a delete/merge proposal template, to make everybody aware of your intentions&lt;br /&gt;
&lt;br /&gt;
=== Unlinking a page ===&lt;br /&gt;
If a page is no longer of any value, then you won't have any links pointing to it right? Well you might be surprised. The 'What links here' toolbox feature (bottom left) will tell you which other wiki pages link in to the current page. Always use this feature to check before proceeding with deleting. These related pages will need to be edited, to reflect the change.&lt;br /&gt;
&lt;br /&gt;
== Deletion itself ==&lt;br /&gt;
'''Normal users''' cannot permanently delete a wiki page. This is an entirely deliberate design feature, which is an important part of why wikis work. Every kind of editing operation can be reverted by any other user, and that includes resurrecting deleted content. Try not to let it wind you up too much. It doesn't cause significant wasted space, and with nothing but a 'delete' label the page is effectively deleted anyway.&lt;br /&gt;
&lt;br /&gt;
'[[Help:Sysops and permissions|Sysop]]' users ''are'' able to delete a page semi-permanently. See [[Help:Sysop deleting and undeleting]]. Typically sysops might look for delete labels, and do a proper delete on these pages, after a period of time. If for some reason you need a page to be deleted more quickly than that, you will need to contact a sysop to request this.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
* [[Help:Sysops and permissions]]&lt;br /&gt;
&lt;br /&gt;
{{Languages|Help:Deleting a page}}&lt;br /&gt;
&lt;br /&gt;
{{Help/Category|Help}}&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Help:Magic_words&amp;diff=85</id>
		<title>Help:Magic words</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Help:Magic_words&amp;diff=85"/>
				<updated>2008-09-29T21:52:50Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: /* Behaviour switches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PD Help Page}}&lt;br /&gt;
&lt;br /&gt;
'''Magic words''' are strings of text that MediaWiki associates with a return value or function, such as time, site details, or page names. This page is about usage of standard magic words; for a technical reference, see {{mediawiki|Manual:Magic words}}.&lt;br /&gt;
&lt;br /&gt;
==General notes==&lt;br /&gt;
* '''Inheritance:''' page-dependent magic words will affect or return data about the current page, regardless of whether it is in the page code or a transcluded template.&lt;br /&gt;
&lt;br /&gt;
==Behaviour switches==&lt;br /&gt;
A behaviour switch controls the layout or behaviour of the page and can often be used to specify desired omissions and inclusions in the content. They are usually written as an upercase word wrapped with double underscores.&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!{{Hl2}}| Word&lt;br /&gt;
!{{Hl2}}| Description&lt;br /&gt;
!{{Hl2}}| Versions&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;3&amp;quot;| '''Table of contents'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__NOTOC__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Hides the table of contents (TOC).&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;__FORCETOC__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Forces the table of content to appear at its normal position (above the first header).&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__TOC__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Places a table of contents at the word's current position (overriding &amp;lt;nowiki&amp;gt;__NOTOC__&amp;lt;/nowiki&amp;gt;). If this is used multiple times, the table of contents will appear at the first word's position.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;3&amp;quot;| '''Editing'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__NOEDITSECTION__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Hides the section edit links beside headings.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__NEWSECTIONLINK__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Adds a link (([[MediaWiki:Addsection|&amp;quot;+&amp;quot; by default]]) beside the &amp;quot;edit&amp;quot; tab for adding a new section on a non-talk page (see {{mediawiki|m:Help:Section#Adding a section at the end|Adding a section to the end}}).&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;3&amp;quot;| '''Categories'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__NOGALLERY__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Used on a category page, replaces thumbnails in the category view with normal links.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__HIDDENCAT__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Used on a category page, hides the category from the lists of categories in its members and parent categories (there is an option in the [[Help:Preferences|user preferences]] to show them).&lt;br /&gt;
| 1.13+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{DEFAULTSORT:xyz}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Used on a categorized page, sets a default [[Help:Categories|category sort key]].&lt;br /&gt;
| 1.10+&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;3&amp;quot;| '''Language conversion'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__NOCONTENTCONVERT__&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;__NOCC__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| On wikis with language variants, don't perform any content language conversion (character and phase) in article display; for example, only show Chinese (zh) instead of variants like zh_cn, zh_tw, zh_sg, or zh_hk.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__NOTITLECONVERT__&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;__NOTC__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| On wikis with language variants, don't perform language conversion on the title (all other content is converted).&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;3&amp;quot;| '''Page formatting'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{DISPLAYTITLE:xyz}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Format the current page's title header. The value must be equivalent to the default title: only capitalization changes and replacing spaces with underscores. It can be disabled or enabled by {{mediawiki|Manual:$wgAllowDisplayTitle|$wgAllowDisplayTitle}}; disabled by default before 1.10+, enabled by default thereafter.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__END__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Explicitly marks the end of the article, to prevent MediaWiki from removing trailing whitespace. Removed in {{mediawiki|rev:19213|19213}}.&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;3&amp;quot;| '''Other'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;__START__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| No effect.&lt;br /&gt;
|&lt;br /&gt;
|- &lt;br /&gt;
|  &amp;lt;nowiki&amp;gt;__NOINDEX__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Tell search engines not to index the page (ie, do not list in search engines' results).&lt;br /&gt;
| {{mediawiki|rev:37973|1.13+}}&lt;br /&gt;
|-&lt;br /&gt;
|  &amp;lt;nowiki&amp;gt;__INDEX__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Tell search engines to index the page (overrides {{mediawiki|Manual:$wgArticleRobotPolicies|$wgArticleRobotPolicies}}, but not robots.txt).&lt;br /&gt;
| 1.13+&lt;br /&gt;
|-&lt;br /&gt;
|  &amp;lt;nowiki&amp;gt;__STATICREDIRECT__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| On redirect pages, don't allow MediaWiki to automatically update the link when someone moves a page and checks &amp;quot;Update any redirects that point to the original title&amp;quot;.&lt;br /&gt;
| {{mediawiki|rev:37928|1.13+}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;#REDIRECT [[Page name]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Causes the current page to [[Help:Redirects|redirect]] viewers to another page.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Variables and parser functions==&lt;br /&gt;
Variables return information about the current page, wiki, or date. Their syntax is similar to [[Help:Templates|templates]], but capitalized to help avoid conflicts. If a template has the same name and case as a variable, the variable will be used. Usage of the template can be forced by adding the &amp;quot;msg:&amp;quot; modifier (for example, &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{msg:CURRENTYEAR}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot;). In some cases, adding parameters will force the parser to treat a variable as a template; for example, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{CURRENTDAYNAME|x}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; tries to transclude &amp;quot;Template:CURRENTDAYNAME&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Parser functions are very similar to variables, but operate on user input instead of the current page. The first parameter is delimited by a colon (:) instead of a pipe (|). (This page does not document custom parser functions added by the {{mediawiki|Extension:ParserFunctions|ParserFunctions extension}}.)&lt;br /&gt;
&lt;br /&gt;
===Date &amp;amp; time===&lt;br /&gt;
The following variables return the current date and time according to the user's timezone [[Special:Preferences|preferences]], defaulting to the UTC timezone.&lt;br /&gt;
&lt;br /&gt;
Due to MediaWiki and browser caching, these variables frequently show when the page was ''cached'' rather than the current time.&lt;br /&gt;
&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!{{Hl2}}| Variable&lt;br /&gt;
!{{Hl2}}| Output&lt;br /&gt;
!{{Hl2}}| Description&lt;br /&gt;
!{{Hl2}}| Versions&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Year'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTYEAR}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTYEAR}}&lt;br /&gt;
| Year&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Month'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTMONTH}}&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
| {{CURRENTMONTH}}&lt;br /&gt;
| Month (zero-padded number)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTMONTHNAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTMONTHNAME}}&lt;br /&gt;
| Month (name)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTMONTHNAMEGEN}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTMONTHNAMEGEN}}&lt;br /&gt;
| Month ([http://en.wikipedia.org/wiki/genitive genitive form])&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTMONTHABBREV}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTMONTHABBREV}}&lt;br /&gt;
| Month (abbreviation)&lt;br /&gt;
| 1.5+&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Day'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTDAY}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTDAY}}&lt;br /&gt;
| Day of the month (unpadded number)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTDAY2}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTDAY2}}&lt;br /&gt;
| Day of the month (zero-padded number)&lt;br /&gt;
| 1.6+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTDOW}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTDOW}}&lt;br /&gt;
| Day of the week (unpadded number)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTDAYNAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTDAYNAME}}&lt;br /&gt;
| Day of the week (name)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Time'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTTIME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTTIME}}&lt;br /&gt;
| Time (24-hour HH:mm format)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTHOUR}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTHOUR}}&lt;br /&gt;
| Hour (24-hour zero-padded number)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Other'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTWEEK}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTWEEK}}&lt;br /&gt;
| Week (number)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTTIMESTAMP}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTTIMESTAMP}}&lt;br /&gt;
| [[wikipedia:ISO 8601|ISO 8601]] time stamp&lt;br /&gt;
| 1.7+&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following variables do the same as the above, but using the site's local timezone instead of user preferences and UTC:&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALYEAR}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALMONTH}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALMONTHNAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALMONTHNAMEGEN}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALMONTHABBREV}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALDAY}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALDAY2}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALDOW}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALDAYNAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALTIME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALHOUR}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALWEEK}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{LOCALTIMESTAMP}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Technical metadata===&lt;br /&gt;
Revision variables return data about the '''latest edit to the current page''', even if viewing an older version of the page.&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!{{Hl2}}| Variable&lt;br /&gt;
!{{Hl2}}| Output&lt;br /&gt;
!{{Hl2}}| Description&lt;br /&gt;
!{{Hl2}}| Versions&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Site'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{SITENAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{SITENAME}}&lt;br /&gt;
| The wiki's site name ({{mediawiki|Manual:$wgSitename|$wgSitename}}).&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CURRENTVERSION}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CURRENTVERSION}}&lt;br /&gt;
| The wiki's MediaWiki version.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{CONTENTLANGUAGE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{CONTENTLANGUAGE}}&lt;br /&gt;
| The wiki's default interface language ({{mediawiki|Manual:$wgLanguageCode|$wgLanguageCode}})&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Latest revision to current page'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{REVISIONID}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{REVISIONID}}&lt;br /&gt;
| Unique ID&lt;br /&gt;
| 1.5+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{REVISIONDAY}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{REVISIONDAY}}&lt;br /&gt;
| Day edit was made (unpadded number)&lt;br /&gt;
| 1.8+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{REVISIONDAY2}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{REVISIONDAY2}}&lt;br /&gt;
| Day edit was made (zero-padded number)&lt;br /&gt;
| 1.8+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{REVISIONMONTH}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{REVISIONMONTH}}&lt;br /&gt;
| Month edit was made (unpadded number)&lt;br /&gt;
| 1.8+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{REVISIONYEAR}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{REVISIONYEAR}}&lt;br /&gt;
| Year edit was made&lt;br /&gt;
| 1.8+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{REVISIONTIMESTAMP}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{REVISIONTIMESTAMP}}&lt;br /&gt;
| Timestamp as of time of edit&lt;br /&gt;
| 1.8+&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Statistics===&lt;br /&gt;
Numbers returned by these variables contain number separators, but can return raw numbers with the &amp;quot;:R&amp;quot; flag (for example, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{NUMBEROFPAGES}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; = {{NUMBEROFPAGES}} and &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{NUMBEROFPAGES:R}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; = {{NUMBEROFPAGES:R}}). Use &amp;quot;|R&amp;quot; for magic words that require a parameter like PAGESINCATEGORY (for example &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{PAGESINCATEGORY:Help}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{PAGESINCATEGORY:Help|R}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!{{Hl2}}| Variable&lt;br /&gt;
!{{Hl2}}| Output&lt;br /&gt;
!{{Hl2}}| Description&lt;br /&gt;
!{{Hl2}}| Versions&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Entire wiki'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{NUMBEROFPAGES}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{NUMBEROFPAGES}}&lt;br /&gt;
| Number of wiki pages.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{NUMBEROFARTICLES}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{NUMBEROFARTICLES}}&lt;br /&gt;
| Number of pages in main namespace.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{NUMBEROFFILES}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{NUMBEROFFILES}}&lt;br /&gt;
| Number of uploaded files.&lt;br /&gt;
| 1.5+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{NUMBEROFEDITS}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{NUMBEROFEDITS}}&lt;br /&gt;
| Number of page edits.&lt;br /&gt;
| {{mediawiki|rev:21319|1.10+}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{NUMBEROFUSERS}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{NUMBEROFUSERS}}&lt;br /&gt;
| Number of registered users.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{NUMBEROFADMINS}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{NUMBEROFADMINS}}&lt;br /&gt;
| Number of users in the ''sysop'' {{mediawiki|Manual:User rights|group}}.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{NUMBERINGROUP:groupname}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{NUMBERINGROUP:bureaucrat}} &amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;({{NUMBERINGROUP:bureaucrat}} used here)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| Number of users in a specific {{mediawiki|Manual:User rights|group}}.&lt;br /&gt;
| {{mediawiki|rev:40116|1.14+}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Per namespace'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{PAGESINNS:2}}&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;{{PAGESINNAMESPACE:2}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| ''not enabled''&lt;br /&gt;
| Number of pages in the given [[Help:Namespaces|namespace]] (replace 2 with the relevant [[Manual:Namespace|namespace ID]]). E.g. &amp;lt;nowiki&amp;gt;{{PAGESINNAMESPACE:14}}&amp;lt;/nowiki&amp;gt; equals the number of categories. &amp;lt;!-- {{NUMBEROFCATEGORIES}} --&amp;gt; Disabled by default, enable with {{mediawiki|Manual:$wgAllowSlowParserFunctions|$wgAllowSlowParserFunctions}}.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl3}} colspan=&amp;quot;4&amp;quot;| '''Other'''&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{PAGESINCATEGORY:Help}}&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;{{PAGESINCAT:Help}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{PAGESINCATEGORY:Help}}&amp;lt;br /&amp;gt;{{PAGESINCAT:Help}}&lt;br /&gt;
| Number of pages in the given [[Help:Categories|category]] (replace &amp;quot;Help&amp;quot; with the relevant category name).&lt;br /&gt;
| {{mediawiki|rev:32932|1.13+}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{PAGESIZE:Help:Magic_words}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{PAGESIZE:Help:Magic_words}}&lt;br /&gt;
| Returns the byte size of the specified page.&lt;br /&gt;
| {{mediawiki|rev:33551|1.13+}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===URL data===&lt;br /&gt;
====URLs====&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!{{Hl2}}| Variable&lt;br /&gt;
!{{Hl2}}| Output&lt;br /&gt;
!{{Hl2}}| Description&lt;br /&gt;
!{{Hl2}}| Versions&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{SERVER}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{SERVER}}&lt;br /&gt;
| domain URL ({{mediawiki|Manual:$wgServer|$wgServer}})&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{SERVERNAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{SERVERNAME}}&lt;br /&gt;
| domain name ({{mediawiki|Manual:$wgServerName|$wgServerName}})&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{SCRIPTPATH}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{SCRIPTPATH}}&lt;br /&gt;
| relative script path ({{mediawiki|Manual:$wgScriptPath|$wgScriptPath}})&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{localurl:&amp;lt;/nowiki&amp;gt;''page name''&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;{{localurl:page name|&amp;lt;/nowiki&amp;gt;''query string''&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{localurl:page name}}&amp;lt;br /&amp;gt;{{localurl:page name|query string}}&lt;br /&gt;
| relative path to title&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{fullurl:&amp;lt;/nowiki&amp;gt;''page name''&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;{{fullurl:page name|&amp;lt;/nowiki&amp;gt;''query_string''&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{fullurl:page name}}&amp;lt;br /&amp;gt;{{fullurl:page name|query_string}}&lt;br /&gt;
| absolute path to title&lt;br /&gt;
| 1.5+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{filepath:Wiki.png}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{filepath:Wiki.png}}&lt;br /&gt;
| The absolute URL to a media file.&lt;br /&gt;
| {{mediawiki|rev:25854|1.12+}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{urlencode:x y z}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;{{urlencode:x y z}}&amp;lt;/code&amp;gt;&lt;br /&gt;
| The input encoded for use in URLs.&lt;br /&gt;
| {{mediawiki|rev:14273|1.7+}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{anchorencode:x y z}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;{{anchorencode:x y z}}&amp;lt;/code&amp;gt;&lt;br /&gt;
| The input encoded for use in URL section anchors (after the '#' symbol in a URL).&lt;br /&gt;
| {{mediawiki|rev:16279|1.8+}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Page names====&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!{{Hl2}}| Variable&lt;br /&gt;
!{{Hl2}}| Output&lt;br /&gt;
!{{Hl2}}| Description&lt;br /&gt;
!{{Hl2}}| Versions&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{FULLPAGENAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{FULLPAGENAME}}&lt;br /&gt;
| Namespace and page title.&lt;br /&gt;
| 1.6+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{PAGENAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{PAGENAME}}&lt;br /&gt;
| Page title.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{BASEPAGENAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{BASEPAGENAME}}&lt;br /&gt;
| Page title excluding the current [[Help:Subpages|subpage]] and namespace (&amp;quot;Title&amp;quot; on &amp;quot;Title/foo&amp;quot;).&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{SUBPAGENAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{SUBPAGENAME}}&lt;br /&gt;
| The [[Help:Subpages|subpage]] title (&amp;quot;foo&amp;quot; on &amp;quot;Title/foo&amp;quot;).&lt;br /&gt;
| 1.6+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{SUBJECTPAGENAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{SUBJECTPAGENAME}}&lt;br /&gt;
| The namespace and title of the associated content page.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{TALKPAGENAME}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{TALKPAGENAME}}&lt;br /&gt;
| The namespace and title of the associated talk page.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following are URL-encoded equivalents:&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{FULLPAGENAMEE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{PAGENAMEE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{BASEPAGENAMEE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{SUBPAGENAMEE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{SUBJECTPAGENAMEE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{TALKPAGENAMEE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Namespaces====&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!{{Hl2}}| Variable&lt;br /&gt;
!{{Hl2}}| Output&lt;br /&gt;
!{{Hl2}}| Description&lt;br /&gt;
!{{Hl2}}| Versions&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{NAMESPACE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{NAMESPACE}}&lt;br /&gt;
| Namespace (name)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{SUBJECTSPACE}}&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;{{ARTICLESPACE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{SUBJECTSPACE}}&amp;lt;br /&amp;gt;{{ARTICLESPACE}}&lt;br /&gt;
| Name of the associated content namespace&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{TALKSPACE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{TALKSPACE}}&lt;br /&gt;
| Name of the associated talk namespace&lt;br /&gt;
| 1.7+&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following are URL-encoded equivalents:&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{NAMESPACEE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{SUBJECTSPACEE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{TALKSPACEE}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{ns:}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; returns the localized namespace name for that number constant. The default values are:&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
!{{Hl2}}| Usage&lt;br /&gt;
!{{Hl2}}| Output&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:-2}} or {{ns:Media}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:-2}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:-1}} or {{ns:Special}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:-1}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:0}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:0}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:1}} or {{ns:Talk}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:1}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:2}} or {{ns:User}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:2}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:3}} or {{ns:User_talk}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:3}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:4}} or {{ns:Project}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:4}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:5}} or {{ns:Project_talk}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:5}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:6}} or {{ns:Image}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:6}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:7}} or {{ns:Image_talk}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:7}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:8}} or {{ns:MediaWiki}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:8}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:9}} or {{ns:MediaWiki_talk}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:9}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:10}} or {{ns:Template}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:10}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:11}} or {{ns:Template_talk}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:11}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:12}} or {{ns:Help}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:12}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:13}} or {{ns:Help_talk}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:13}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:14}} or {{ns:Category}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:14}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ns:15}} or {{ns:Category_talk}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ns:15}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Formatting===&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!{{Hl2}}| Usage&lt;br /&gt;
!{{Hl2}}| Output&lt;br /&gt;
!{{Hl2}}| Description&lt;br /&gt;
!{{Hl2}}| Version&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{lc:XYZ}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{lc:XYZ}}&lt;br /&gt;
| The lowercase input.&lt;br /&gt;
| 1.5+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{lcfirst:XYZ}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{lcfirst:XYZ}}&lt;br /&gt;
| The input with the first character lowercase.&lt;br /&gt;
| 1.5+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{uc:xyz}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{uc:xyz}}&lt;br /&gt;
| The uppercase input.&lt;br /&gt;
| 1.5+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{ucfirst:xyz}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{ucfirst:xyz}}&lt;br /&gt;
| The input with the first character uppercase.&lt;br /&gt;
| 1.5+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{formatnum:-987654321.654321}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{formatnum:-987654321.654321}}&lt;br /&gt;
| The input with decimal and decimal group separators, and localized digit script, according to the wiki's default locale.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{padleft:xyz|5|_}}&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;{{padleft:xyz|5}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{padleft:xyz|5|_}}&amp;lt;br /&amp;gt;{{padleft:xyz|5}}&lt;br /&gt;
| The input (first parameter) padded on the left side to the specified width (second parameter) using the specified character (third parameter). If a padding character isn't specified, '0' is used by default.&amp;lt;br /&amp;gt;'''bug:''' multibyte characters are interpreted as two characters, which can skew width. These also cannot be used as padding characters.&lt;br /&gt;
| 1.8+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{padright:xyz|5|_}}&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;{{padright:xyz|5}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{padright:xyz|5|_}}&amp;lt;br /&amp;gt;{{padright:xyz|5}}&lt;br /&gt;
| Identical to padleft, but adds padding characters to the right side.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{DIRMARK}}&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;{{DIRECTIONMARK}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{DIRMARK}}&amp;lt;br /&amp;gt;{{DIRECTIONMARK}}&lt;br /&gt;
| Outputs a unicode-directional mark that matches the wiki's default language's direction (&amp;lt;code&amp;gt;&amp;amp;amp;lrm;&amp;lt;/code&amp;gt; on left-to-right wikis, &amp;lt;code&amp;gt;&amp;amp;amp;rlm;&amp;lt;/code&amp;gt; on right-to-left wikis), useful in text with multi-directional text.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{plural:2|is|are}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{plural:2|is|are}}&lt;br /&gt;
| Outputs the correct given pluralization form (parameters except first) depending on the count (first parameter). Plural transformations are used for languages like Russian based on &amp;quot;count mod 10&amp;quot;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Miscellaneous===&lt;br /&gt;
{| {{prettytable}}&lt;br /&gt;
!{{Hl2}}| Usage&lt;br /&gt;
!{{Hl2}}| Output&lt;br /&gt;
!{{Hl2}}| Description&lt;br /&gt;
!{{Hl2}}| Version&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{#language:eo}}&amp;lt;/nowiki&amp;gt; &lt;br /&gt;
| {{#language:eo}}&lt;br /&gt;
| The native name for the given language code.&lt;br /&gt;
| 1.7+&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{#special:userlogin}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| {{#special:userlogin}}&lt;br /&gt;
| The localized name for the given canonical Special: page.&lt;br /&gt;
| {{mediawiki|rev:17321|1.9+}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;{{#tag:tagname}}&amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;nowiki&amp;gt;{{#tag:tagname|inner content|parameter=value|parameter2=value}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| ''(depends on parser tag)''&lt;br /&gt;
| Alias for XML-style parser or extension tags, but parsing wiki code. Attribute values can be passed as parameter values ('&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;tagname attribute=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;' &amp;amp;rarr; '&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#tag:tagname|attribute=value}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;'), and inner content as an unnamed parameter ('&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;tagname&amp;gt;content&amp;lt;/tagname&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;' &amp;amp;rarr; '&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#tag:tagname|content}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;').&lt;br /&gt;
| [[rev:29482|1.12+]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{languages}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Help|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Time|{{PAGENAME}}]]&lt;br /&gt;
[[Category:Magic words|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Template:Languages&amp;diff=145</id>
		<title>Template:Languages</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Template:Languages&amp;diff=145"/>
				<updated>2008-09-28T13:12:48Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: + da&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Template ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;onlyinclude&amp;gt;&amp;lt;div class=&amp;quot;LanguageLinks&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;table width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr valign=&amp;quot;top&amp;quot; style=&amp;quot;background: #EEF3E2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;width: 25px; padding-left: 0.5em;&amp;quot;&amp;gt;[[Image:Geographylogo.png|25px|Languages]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;width: 10px; white-space: nowrap; padding: 4px 1em 0 0.5em; border-right: 1px solid #aaaaaa;&amp;quot;&amp;gt;'''[[Project:Language policy|Languages]]:'''&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;padding: 1px 1em 0; background: #F6F9ED;&amp;quot;&amp;gt;&lt;br /&gt;
'''[[{{{1|:{{NAMESPACE}}:{{BASEPAGENAME}}}}}|English]]'''&lt;br /&gt;
{{Languages/Lang|af|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|ar|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|az|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|bcc|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|bg|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|br|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|ca|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|cs|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|da|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|de|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|el|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|es|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|fa|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|fi|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|fr|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|gu|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|he|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|hu|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|id|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|it|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|ja|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|ko|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|ksh|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|mr|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|ms|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|nl|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|no|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|oc|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|pl|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|pt|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|ro|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|ru|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|si|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|sq|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|sr|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|sv|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|th|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|tr|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|uk|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|vi|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|yue|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|zh|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|zh-hans|{{{1|}}}}}&lt;br /&gt;
{{Languages/Lang|zh-hant|{{{1|}}}}}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Languages|PageName}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''PageName''' (optional) - the name of the page to display language links for.  If omitted then the English version of the current page is used.  This parameter can normally be omitted, as it is only required if you want to link to a page other than the one you place the template on, which is very uncommon.  If this parameter is used on a sub-page make sure you supply the root name, not the full page name (e.g. on [[MediaWiki/fr]] you would need to use &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Languages|MediaWiki}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and not &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Languages|MediaWiki/fr}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
The template should only be placed on pages that exist in more than one language, and it should be placed in the same location on each translation of the page.&lt;br /&gt;
&lt;br /&gt;
The English version of a page is always the main version, with all other languages as sub-pages, named using the appropriate language code (see below). &lt;br /&gt;
&lt;br /&gt;
For example, on the Main Page you would include the text &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Languages}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, both on [[Main Page]] itself, and on each of its language sub-pages.  The template automatically creates links to any language sub-pages that exist, e.g. &amp;lt;tt&amp;gt;Main Page/ja&amp;lt;tt&amp;gt;, &amp;lt;tt&amp;gt;Main Page/fr&amp;lt;/tt&amp;gt;, and ignores non-existant languages.&lt;br /&gt;
&lt;br /&gt;
See [[Project:Language policy]] for further details about translating pages.&lt;br /&gt;
&lt;br /&gt;
== Supported languages ==&lt;br /&gt;
This shows you the name of each language's sub-page (using ''Main Page'' as an example). Other languages may be added easily as necessary.  Please use the appropriate [[meta:List of Wikipedias|prefix, as used on Wikipedia]] when adding a new language.  Please do ''not'' add languages for which no pages exist yet, as this will increase the time needed to include the template without adding any benefit (languages are only displayed to the user when the relevant page exists).&lt;br /&gt;
&lt;br /&gt;
The link on the language names goes to the Wikipedia in that language. '''If no Wikipedia in your language exists, do not add pages in that language to MediaWiki.org!'''  This wiki is not the place for language advocacy - please go through the correct channels, and once your language has a Wikipedia then please return to add content here.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
! Page Name || Language &lt;br /&gt;
|-&lt;br /&gt;
| Main Page || [[:en:|English]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/af''' || [[:af:|Afrikaans]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/ar''' || [[:ar:|Arabic]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/az''' || [[:az:|Azerbaijani]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/bcc''' || Southern Balochi&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/bg''' || [[:bg:|Bulgarian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/br''' || [[:br:|Breton]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/ca''' || [[:ca:|Catalan]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/cs''' || [[:cs:|Czech]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/da''' || [[:da:|Danish]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/de''' || [[:de:|German]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/el''' || [[:el:|Greek]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/es''' || [[:es:|Spanish]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/fa''' || [[:fa:|Persian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/fi''' || [[:fi:|Finnish]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/fr''' || [[:fr:|French]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/gu''' || [[:gu:|Gujarati]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/he''' || [[:he:|Hebrew]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/hu''' || [[:hu:|Hungarian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/id''' || [[:id:|Indonesian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/it''' || [[:it:|Italian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/ja''' || [[:ja:|Japanese]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/ko''' || [[:ko:|Korean]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/ksh''' || [[:ksh:|Kölsch]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/mr''' || [[:mr:|Marathi]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/ms''' || [[:ms:|Malay]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/nl''' || [[:nl:|Nederlands]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/no''' || [[:no:|Norwegian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/oc''' || [[:oc:|Occitan]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/pl''' || [[:pl:|Polish]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/pt''' || [[:pt:|Portugese]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/ro''' || [[:ro:|Romanian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/ru''' || [[:ru:|Russian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/si''' || [[:si:|Sinhalese]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/sq''' || [[:sq:|Albanian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/sr''' || [[:sr:|Serbian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/sv''' || [[:sv:|Swedish]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/th''' || [[:th:|Thai]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/tr''' || [[:tr:|Turkish]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/uk''' || [[:uk:|Ukrainian]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/vi''' || [[:vi:|Vietnamese]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/yue''' || [[:zh-yue:|Cantonese]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/zh''' || [[:zh:|Chinese]]&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/zh-hans''' || Chinese (Simplified)&lt;br /&gt;
|-&lt;br /&gt;
| Main Page'''/zh-hant''' || Chinese (Traditional)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Here is how the language bar looks on the [[MediaWiki]] page:&lt;br /&gt;
{{Languages|MediaWiki}}&lt;br /&gt;
[[Category:Language templates]]&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	<entry>
		<id>https://www.kodewerx.org/w/index.php?title=Template:Thankyou&amp;diff=159</id>
		<title>Template:Thankyou</title>
		<link rel="alternate" type="text/html" href="https://www.kodewerx.org/w/index.php?title=Template:Thankyou&amp;diff=159"/>
				<updated>2008-09-27T22:04:34Z</updated>
		
		<summary type="html">&lt;p&gt;Gayswee: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;noprint&amp;quot; style=&amp;quot;float:right; border:1px solid blue;width:200px;background-color:#fff;padding:3px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Image:Example.jpg|left|80px|Example sunflower image]] '''A little thank you...''' &amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;for {{{reason|{{{1}}}}}}. &amp;lt;br /&amp;gt;hugs, {{{signature|{{{2}}}}}}&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Languages|Template:Thankyou}}&lt;br /&gt;
[[Category:Template examples|{{PAGENAME}}]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gayswee</name></author>	</entry>

	</feed>