<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.temlib.org/AtariForumWiki/index.php?action=history&amp;feed=atom&amp;title=CW_CHAPTER_1</id>
	<title>CW CHAPTER 1 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.temlib.org/AtariForumWiki/index.php?action=history&amp;feed=atom&amp;title=CW_CHAPTER_1"/>
	<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;action=history"/>
	<updated>2026-05-13T17:02:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11608&amp;oldid=prev</id>
		<title>&gt;Wongck at 15:35, 12 October 2011</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11608&amp;oldid=prev"/>
		<updated>2011-10-12T15:35:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:35, 12 October 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l575&quot;&gt;Line 575:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 575:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Programming&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Assembly Language Workshop&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>&gt;Wongck</name></author>
	</entry>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11607&amp;oldid=prev</id>
		<title>&gt;Wongck at 15:12, 3 September 2011</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11607&amp;oldid=prev"/>
		<updated>2011-09-03T15:12:59Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:12, 3 September 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l572&quot;&gt;Line 572:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 572:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG1.s]] (Source of the chapter&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;)&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG1.s]] (Source of the chapter)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[CW_PROG4.S]] (Source of the chapiter)&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[CW_PROG4MAC.S]] (Source of the chapiter)&amp;lt;br&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[CW_SAMPLE.H]] (Source of the chapiter&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Programming]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Programming]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>&gt;Wongck</name></author>
	</entry>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11606&amp;oldid=prev</id>
		<title>&gt;Wongck at 15:09, 3 September 2011</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11606&amp;oldid=prev"/>
		<updated>2011-09-03T15:09:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:09, 3 September 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l572&quot;&gt;Line 572:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 572:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG1.s]] (Source of the chapter)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG1.s]] (Source of the chapter)&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;br&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG4.S]] (Source of the chapiter)&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG4.S]] (Source of the chapiter)&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG4MAC.S]] (Source of the chapiter)&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG4MAC.S]] (Source of the chapiter)&amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>&gt;Wongck</name></author>
	</entry>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11605&amp;oldid=prev</id>
		<title>&gt;Wongck at 15:07, 3 September 2011</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11605&amp;oldid=prev"/>
		<updated>2011-09-03T15:07:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:07, 3 September 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l573&quot;&gt;Line 573:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 573:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG1.s]] (Source of the chapter)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG1.s]] (Source of the chapter)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[CW_PROG4.S]] (Source of the chapiter)&amp;lt;br&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[CW_PROG4MAC.S]] (Source of the chapiter)&amp;lt;br&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[CW_SAMPLE.H]] (Source of the chapiter)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Programming]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Programming]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>&gt;Wongck</name></author>
	</entry>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11604&amp;oldid=prev</id>
		<title>&gt;Silver Surfer: Added category</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11604&amp;oldid=prev"/>
		<updated>2009-05-02T17:22:24Z</updated>

		<summary type="html">&lt;p&gt;Added category&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:22, 2 May 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l576&quot;&gt;Line 576:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 576:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Programming]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>&gt;Silver Surfer</name></author>
	</entry>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11603&amp;oldid=prev</id>
		<title>&gt;Zorro 2 at 13:17, 24 October 2006</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11603&amp;oldid=prev"/>
		<updated>2006-10-24T13:17:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:17, 24 October 2006&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l571&quot;&gt;Line 571:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 571:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG1.s]] (Source of the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;chapiter&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[CW_PROG1.s]] (Source of the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;chapter&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>&gt;Zorro 2</name></author>
	</entry>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11602&amp;oldid=prev</id>
		<title>&gt;Zorro 2 at 13:17, 24 October 2006</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11602&amp;oldid=prev"/>
		<updated>2006-10-24T13:17:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:17, 24 October 2006&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l570&quot;&gt;Line 570:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 570:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[CW_PROG1.s]] (Source of the chapiter)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Back to [[Assembly_language_tutorials]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>&gt;Zorro 2</name></author>
	</entry>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11601&amp;oldid=prev</id>
		<title>&gt;Zorro 2 at 13:13, 24 October 2006</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=CW_CHAPTER_1&amp;diff=11601&amp;oldid=prev"/>
		<updated>2006-10-24T13:13:43Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&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;
&lt;br /&gt;
CHAPTER 1: INITIALIZING A GEM PROGRAM&lt;br /&gt;
--------------------------------------&lt;br /&gt;
&lt;br /&gt;
[NOTE: Words enclosed in asterisks (i.e. *word*) should be &lt;br /&gt;
read as italicized text. This text file is copyright 1993 by&lt;br /&gt;
Clayton Walnum. All rights reserved.]&lt;br /&gt;
&lt;br /&gt;
In volume 1 of the *Assembly Language Workshop* we learned &lt;br /&gt;
to write TOS programs--that is, programs that use the ST's &lt;br /&gt;
operating system, yet don't contain any calls to GEM, the &lt;br /&gt;
ST's graphical user interface. We delayed learning about GEM &lt;br /&gt;
because a GEM program is much more complex than a straight &lt;br /&gt;
TOS program. For one thing, a GEM program requires some &lt;br /&gt;
tricky initialization, as well as some data structures we &lt;br /&gt;
weren't prepared to discuss previously. However, now that we &lt;br /&gt;
understand the basics of assembly language programming on &lt;br /&gt;
the ST, we can press forward and learn how to write GEM &lt;br /&gt;
programs.&lt;br /&gt;
	In this chapter, we'll see what initialization is &lt;br /&gt;
required to get a GEM program up and running, including &lt;br /&gt;
setting up our own stack, returning unused memory to the &lt;br /&gt;
system, and defining the various data arrays that GEM &lt;br /&gt;
requires in order to pass information between our programs &lt;br /&gt;
and the operating system. We'll also see how to call AES &lt;br /&gt;
functions.&lt;br /&gt;
&lt;br /&gt;
--The Components of GEM--&lt;br /&gt;
&lt;br /&gt;
We previously learned that TOS, the ST's operating system, &lt;br /&gt;
is made up of several components: GEMDOS, BIOS, and the &lt;br /&gt;
XBIOS. Likewise, GEM, the interface that isolates the user &lt;br /&gt;
from the complexities of TOS, is divided into different &lt;br /&gt;
components: the AES (Application Environment Services) and &lt;br /&gt;
the VDI (Virtual Device Interface).&lt;br /&gt;
	The AES is the part of GEM that handles menus, dialog &lt;br /&gt;
boxes, and windows. The VDI is the part of GEM that the AES &lt;br /&gt;
uses to construct those menus, dialog boxes, and windows.  &lt;br /&gt;
In short, the VDI is a collection of graphics primitives &lt;br /&gt;
(low-level graphics functions) that do things such as draw &lt;br /&gt;
lines, rectangles, and circles. The VDI also provides &lt;br /&gt;
functions for reading the mouse buttons and mouse position, &lt;br /&gt;
among other things.&lt;br /&gt;
&lt;br /&gt;
--The Program--&lt;br /&gt;
&lt;br /&gt;
In this chapter, we'll see how to initialize a GEM &lt;br /&gt;
application and how to call the AES. In the CHAP1 folder of &lt;br /&gt;
your *ST Assembly Language Workshop* disk, you'll find two &lt;br /&gt;
files. PROG1.S is the source code for this chapter's sample &lt;br /&gt;
program, which is reprinted at the end of this chapter. &lt;br /&gt;
PROG1.PRG is the assembled, runnable program file. If you &lt;br /&gt;
would like to assemble the program yourself, please consult &lt;br /&gt;
your assembler's manual or refer to this book's Appendix A.&lt;br /&gt;
	To run the program, double-click the PROG1.PRG file. &lt;br /&gt;
When you do, an alert box will appear on the screen with the &lt;br /&gt;
message &amp;quot;My first alert box!&amp;quot; To exit the program, click the &lt;br /&gt;
alert box's button.&lt;br /&gt;
&lt;br /&gt;
--Initializing GEM--&lt;br /&gt;
&lt;br /&gt;
Considering the size of the source code, this chapter's &lt;br /&gt;
program sure doesn't do much, does it? The fact is, most of &lt;br /&gt;
the source code does nothing more than initialize the &lt;br /&gt;
program. Only about half a dozen lines do anything that we &lt;br /&gt;
can actually see on the screen.&lt;br /&gt;
	To initialize, run, and terminate a GEM application &lt;br /&gt;
program, we must perform at least six main steps:&lt;br /&gt;
&lt;br /&gt;
1) Set up a stack.&lt;br /&gt;
2) Calculate the size of our program and return unused &lt;br /&gt;
memory back to the system.&lt;br /&gt;
3) Call *appl_init* to initialize the application.&lt;br /&gt;
4) Perform our main program code.&lt;br /&gt;
5) Call *appl_exit* to close down our application.&lt;br /&gt;
6) Call *pterm0* to return to the desktop (or the calling &lt;br /&gt;
program).&lt;br /&gt;
&lt;br /&gt;
	If we are going to use the VDI, there are also a couple &lt;br /&gt;
of other steps that we must perform. However, because we are &lt;br /&gt;
currently concerned only with a minimum GEM application--one &lt;br /&gt;
that makes no calls to the VDI (except through the AES)--we &lt;br /&gt;
can save those details until later.&lt;br /&gt;
&lt;br /&gt;
--Setting Up Our Own Stack--&lt;br /&gt;
&lt;br /&gt;
When we were writing simple TOS programs, we didn't worry &lt;br /&gt;
too much about where our stack was located. We just let the &lt;br /&gt;
system take care of it. However, because GEM allows several &lt;br /&gt;
programs to be loaded at once (desk accessories), as well as &lt;br /&gt;
allows one program to load another, we need a stack for each &lt;br /&gt;
program. Obviously, we can't have one program using another &lt;br /&gt;
program's stack. The result would almost certainly be a line &lt;br /&gt;
of bombs on the screen.&lt;br /&gt;
	So, the first step in initiaizing a GEM program is to &lt;br /&gt;
set up our own stack. In this chapter's sample program, the &lt;br /&gt;
first two lines perform this important step.  They look like &lt;br /&gt;
this:&lt;br /&gt;
&lt;br /&gt;
move.l  a7,a5&lt;br /&gt;
lea     stack,sp&lt;br /&gt;
&lt;br /&gt;
Here, the first line saves the contents of a7. (Remember, a7 &lt;br /&gt;
is the stack pointer; at the start of the program it &lt;br /&gt;
contains an important address that we'll soon learn about.) &lt;br /&gt;
In the second line, we load the address of our own stack &lt;br /&gt;
into the stack pointer (a7), which is all we need to do to &lt;br /&gt;
tell the system where our stack is located.&lt;br /&gt;
	But where is our stack? Take a look at the *bss* &lt;br /&gt;
section of our program. You'll see these lines:&lt;br /&gt;
&lt;br /&gt;
	ds.l    255&lt;br /&gt;
stack:  ds.l    1&lt;br /&gt;
&lt;br /&gt;
These two lines reserve 256 longwords of storage (1K) for &lt;br /&gt;
our stack. In most cases, a 1K stack is plenty large enough. &lt;br /&gt;
(If your program uses a lot of recursion or other stack-&lt;br /&gt;
intensive operations, your stack may need to be larger.)&lt;br /&gt;
	But wait a minute! Why is our address label *stack* at &lt;br /&gt;
the end of this area? Don't we normally put a label on the &lt;br /&gt;
starting address of a block rather than at the ending &lt;br /&gt;
address? We sure do. And in the case of a stack, the block's &lt;br /&gt;
ending address is actually the stack's starting address. (Is &lt;br /&gt;
your head spinning yet?) Remember: A stack stores values &lt;br /&gt;
backward through memory, not forward. If we were to label &lt;br /&gt;
the first byte of our stack area, the first time we came &lt;br /&gt;
across an instruction like *move.w #1,-(sp)*, we'd end up &lt;br /&gt;
tromping all over our program's other data. This can yield &lt;br /&gt;
some hard-to-find bugs, believe me.&lt;br /&gt;
&lt;br /&gt;
--Finding the Size of a Program--&lt;br /&gt;
&lt;br /&gt;
When the ST runs a program, it allocates all of the &lt;br /&gt;
available memory to that program. When we were running non-&lt;br /&gt;
GEM programs, that wasn't a problem. Then, we weren't &lt;br /&gt;
concerned with memory considersations such loading resource &lt;br /&gt;
files and dealing with desk accessories. With a GEM program, &lt;br /&gt;
however, we must be concerned with these issues. For &lt;br /&gt;
example, most GEM programs use menus and dialog boxes. The &lt;br /&gt;
data that defines these graphical objects are usually &lt;br /&gt;
contained in a resource file that must be loaded by the &lt;br /&gt;
program at run time. If the ST gives our program all the &lt;br /&gt;
memory in the system, and we don't bother to return what we &lt;br /&gt;
don't need, where are we going to put our resources?&lt;br /&gt;
	The second step in initializing a GEM application, &lt;br /&gt;
then, is to calculate the size of our program and return all &lt;br /&gt;
unused memory to the heap (a strange word that's used to &lt;br /&gt;
describe unallocated system memory). To calculate the size &lt;br /&gt;
of a program, we need to know a little about how the ST &lt;br /&gt;
loads a program into memory.&lt;br /&gt;
&lt;br /&gt;
--The Transient Program Area--&lt;br /&gt;
&lt;br /&gt;
A program is loaded into what is called a Transient Program &lt;br /&gt;
Area (TPA). Upon a program's start-up, the TPA contains &lt;br /&gt;
three main sections (see Figure 1.1): the base page, the &lt;br /&gt;
program code (including its data), and the heap. The base &lt;br /&gt;
page contains important information about the program, &lt;br /&gt;
including the starting and ending addresses of the TPA, and &lt;br /&gt;
the addresses and lengths of each of the program segments. &lt;br /&gt;
The program section contains the program's text segment (the &lt;br /&gt;
code), the data segment (initialized data), the BSS segment &lt;br /&gt;
(uninitialized storage), and the stack. The heap, of course, &lt;br /&gt;
contains all the system's remaining memory. It is this &lt;br /&gt;
portion of the TPA that we must return to the system.&lt;br /&gt;
&lt;br /&gt;
[INSERT FIGURE 1.1 HERE]&lt;br /&gt;
&lt;br /&gt;
	In order to know how much memory we can return to the &lt;br /&gt;
system, we need to calculate how much we need. The amount of &lt;br /&gt;
memory we need is the memory that comprises the TPA minus &lt;br /&gt;
the size of the heap. It would have been nice if the ST's &lt;br /&gt;
designers had calculated this value for us. Unfortunately, &lt;br /&gt;
we need to calculate it ourselves, by adding together the &lt;br /&gt;
sizes of each section of the TPA.&lt;br /&gt;
	Look at the sample program. Right after we initialize &lt;br /&gt;
our stack, you'll see these lines:&lt;br /&gt;
&lt;br /&gt;
move.l  4(a5),a5&lt;br /&gt;
move.l  12(a5),d0&lt;br /&gt;
add.l   20(a5),d0&lt;br /&gt;
add.l   28(a5),d0&lt;br /&gt;
add.l   #$100,d0&lt;br /&gt;
&lt;br /&gt;
These instructions calculate the size of our program. In the &lt;br /&gt;
first line, we change A5 to the address of our TPA, which is &lt;br /&gt;
also the address of the base page. This weird-looking &lt;br /&gt;
instruction probably requires a little explanation.&lt;br /&gt;
	If you recall, we previously loaded the address of the &lt;br /&gt;
old stack into A5, right before we changed A7 to point to &lt;br /&gt;
our own stack. At this point, we actually have two stack &lt;br /&gt;
pointers. A5 points to the old stack, and A7 points to the &lt;br /&gt;
new stack. When we ran our program, the system placed the &lt;br /&gt;
address of the TPA into the second word of the system stack, &lt;br /&gt;
the stack now pointed to by A5. So, to load A5 with the &lt;br /&gt;
address of the TPA, we need to load it with the second word &lt;br /&gt;
of the old stack. To get to the second word of the stack, we &lt;br /&gt;
use address register indirect addressing with displacement, &lt;br /&gt;
using the stack pointer as the address register. Don't let &lt;br /&gt;
it bother you that the source and destination registers are &lt;br /&gt;
the same. In the first line above, all we're doing is moving &lt;br /&gt;
the second word pointed to by A5 into A5. This makes A5 &lt;br /&gt;
point to our TPA.&lt;br /&gt;
	Now that A5 is pointing to the start of the base page, &lt;br /&gt;
we can start to figure out the size of our program space. At &lt;br /&gt;
an offset of 12 bytes from the start of the TPA, we'll find &lt;br /&gt;
the length of our program's text segment. The second line &lt;br /&gt;
above loads that value into D0. Now, we need to add the &lt;br /&gt;
sizes of the data and BSS segments. Those values are found &lt;br /&gt;
at offsets of 20 and 28, respectively. The third and fourth &lt;br /&gt;
lines above add those values to D0. Finally, we need only &lt;br /&gt;
add the size of the base page, which is 256 bytes or $100 in &lt;br /&gt;
hexadecimal. The last line above takes care of that.&lt;br /&gt;
&lt;br /&gt;
--Returning Unused Memory to the System--&lt;br /&gt;
&lt;br /&gt;
With the size of our program area safely tucked away in D0, &lt;br /&gt;
we're ready to call the GEMDOS function *Mshrink* (opcode &lt;br /&gt;
#74), which returns the memory we don't need back to the &lt;br /&gt;
system. We do this with the following lines:&lt;br /&gt;
&lt;br /&gt;
move.l  d0,-(sp)&lt;br /&gt;
move.l  a5,-(sp)&lt;br /&gt;
clr.w   -(sp)&lt;br /&gt;
move.w  #MSHRINK,-(sp)&lt;br /&gt;
trap    #1&lt;br /&gt;
add.l   #12,sp&lt;br /&gt;
&lt;br /&gt;
As you can see, the *Mshrink* function requires three &lt;br /&gt;
parameters on the stack: the size of our program area, the &lt;br /&gt;
address of the TPA, and a dummy word. After this system &lt;br /&gt;
call, the ST will again have access to any unused memory.&lt;br /&gt;
&lt;br /&gt;
--Getting Ready for the AES--&lt;br /&gt;
&lt;br /&gt;
In our sample program, we call the AES in order to display &lt;br /&gt;
an alert box. Before we can call the AES, though, we need to &lt;br /&gt;
do some further initialization. Specifically, we must supply &lt;br /&gt;
the AES with seven arrays: the global array, the control &lt;br /&gt;
array, the int_in array, the int_out array, the addr_in &lt;br /&gt;
array, the addr_out array, and the AES parameter block. &lt;br /&gt;
Yikes!&lt;br /&gt;
&lt;br /&gt;
--The Global Array--&lt;br /&gt;
&lt;br /&gt;
The global array, which comprises nine elements, contains &lt;br /&gt;
important information required by the AES library. The first &lt;br /&gt;
three elements are words (two bytes). The rest are longwords &lt;br /&gt;
(four bytes). How do we initialize the global array? We need &lt;br /&gt;
do nothing more than provide space for it in our BSS &lt;br /&gt;
segment. Look the the sample program's BSS segment. At the &lt;br /&gt;
top of this area, you'll see the label *global*, which marks &lt;br /&gt;
the beginning of the global array. After that label, you'll &lt;br /&gt;
see each of the nine elements defined, three words and six &lt;br /&gt;
longwords. Note that, for documentation's sake at least, &lt;br /&gt;
each of the array's elements has an appropriate label.&lt;br /&gt;
	After we define the global array, we can forget it. The &lt;br /&gt;
AES will deal with it as it sees fit, all behind our back, &lt;br /&gt;
as it were.&lt;br /&gt;
&lt;br /&gt;
--The Control Array--&lt;br /&gt;
&lt;br /&gt;
The control array comprises five two-byte (word) elements. &lt;br /&gt;
We must use the control array to pass information to AES &lt;br /&gt;
when we call its functions, rather than using the stack as &lt;br /&gt;
we do when calling TOS functions. In turn, the AES uses the &lt;br /&gt;
control array to pass information back to us, after a &lt;br /&gt;
particular function has executed.&lt;br /&gt;
	We define the control array similarly to how we defined &lt;br /&gt;
the global array, by creating space for it in our BSS &lt;br /&gt;
segment. If you look in this chapter's program listing, &lt;br /&gt;
you'll see the control array defined right after the global &lt;br /&gt;
array. The label *control* marks the beginning of the array, &lt;br /&gt;
while the labels *control0* through *control4* hold the &lt;br /&gt;
adresses of each element of the array. By using these &lt;br /&gt;
labels, we can easily access any of the five elements.&lt;br /&gt;
&lt;br /&gt;
--The Input and Output Arrays--&lt;br /&gt;
&lt;br /&gt;
The int_in, int_out, addr_in, and addr_out arrays are used &lt;br /&gt;
in conjunction with the control array to pass information &lt;br /&gt;
from our program to the AES and from the AES back to our &lt;br /&gt;
program. We use the &amp;quot;in&amp;quot; arrays to send information to the &lt;br /&gt;
AES. The AES uses the &amp;quot;out&amp;quot; arrays to return function &lt;br /&gt;
results to us.&lt;br /&gt;
	The number of elements in the arrays vary, depending on &lt;br /&gt;
the AES functions we plan to call. This is because different &lt;br /&gt;
functions have different numbers of parameters. In our &lt;br /&gt;
sample program, right after the control array, we've &lt;br /&gt;
reserved only one element for each of the arrays. That's all &lt;br /&gt;
we need for the function we'll be calling.&lt;br /&gt;
	Because the int_in and int_out arrays are for storing &lt;br /&gt;
integers, their elements need to be word sized. The addr_in &lt;br /&gt;
and addr_out arrays, however, hold addresses, so their &lt;br /&gt;
elements must be longwords.&lt;br /&gt;
&lt;br /&gt;
--The AES Parameter Block--&lt;br /&gt;
&lt;br /&gt;
Of course, before the AES can use any of the arrays we've &lt;br /&gt;
set up for it, it must know where they are. We communicate &lt;br /&gt;
this information with the AES parameter block (APB). The APB &lt;br /&gt;
is nothing more than a table of addresses. Specifically, it &lt;br /&gt;
contains the addresses of the control, global, int_in, &lt;br /&gt;
int_out, addr_in, and addr_out arrays, in that order. You'll &lt;br /&gt;
find our sample program's APB in the data segment, above the &lt;br /&gt;
global array.&lt;br /&gt;
&lt;br /&gt;
--Calling an AES Function--&lt;br /&gt;
&lt;br /&gt;
Now that we know all about the AES's arrays, we're ready to &lt;br /&gt;
learn to call the AES. To call the AES, we must follow the &lt;br /&gt;
steps below:&lt;br /&gt;
&lt;br /&gt;
1) Place the appropriate values into the control array.&lt;br /&gt;
2) If required, place the appropriate parameters into the &lt;br /&gt;
int_in and addr_in arrays.&lt;br /&gt;
3) Load the address of the APB into D1.&lt;br /&gt;
4) Load the AES ID into D0.&lt;br /&gt;
5) Perform a *trap #2*.&lt;br /&gt;
&lt;br /&gt;
	Let's take a look at the sample program to see how all &lt;br /&gt;
this works. Look at the section of code following the &lt;br /&gt;
*MShrink* call. You'll see the following instructions:&lt;br /&gt;
&lt;br /&gt;
clr.l   ap_ptree&lt;br /&gt;
clr.l   ap_1resv&lt;br /&gt;
clr.l   ap_2resv&lt;br /&gt;
clr.l   ap_3resv&lt;br /&gt;
clr.l   ap_4resv&lt;br /&gt;
&lt;br /&gt;
Here, we're clearing five elements of the global array, as &lt;br /&gt;
is suggested by Atari's OS documentation. If we didn't clear &lt;br /&gt;
these fields, probably nothing bad would happen to our &lt;br /&gt;
program. But Atari says to do it. That's good enough for me.&lt;br /&gt;
	After initializing the global array, we make our first &lt;br /&gt;
AES function call with the following code:&lt;br /&gt;
&lt;br /&gt;
move.w  #APPL_INIT,control0&lt;br /&gt;
clr.w   control1&lt;br /&gt;
move.w  #1,control2&lt;br /&gt;
clr.w   control3&lt;br /&gt;
clr.w   control4&lt;br /&gt;
jsr     aes&lt;br /&gt;
cmpi    #$FFFF,ap_id&lt;br /&gt;
beq     end&lt;br /&gt;
&lt;br /&gt;
This is a call to the AES function *appl_init* (opcode #10), &lt;br /&gt;
which initializes a new GEM application. Every GEM program &lt;br /&gt;
must call this function before making any other GEM calls. &lt;br /&gt;
The *appl_init* function notifies the OS of our program, so &lt;br /&gt;
that it can set up the required resources. This call also &lt;br /&gt;
stores important information into some elements of the &lt;br /&gt;
global array, the most important of which is our &lt;br /&gt;
application's ID.&lt;br /&gt;
	In the first line, we place the *appl_init* opcode into &lt;br /&gt;
*control0*. The opcode of the AES function we're calling &lt;br /&gt;
always goes into this array element. Next, we place a zero &lt;br /&gt;
in *control1*, which tells the AES that we are passing no &lt;br /&gt;
values in the int_in array. Then, we place a 1 in &lt;br /&gt;
*control2*, telling the AES that we expect one value (the &lt;br /&gt;
application's ID) to be returned in the int_out array. &lt;br /&gt;
Because we are passing no addresses in the addr_in array, &lt;br /&gt;
and because we expect no addresses returned to us in the &lt;br /&gt;
addr_out array, we place zeros in *control3* and *control4*.&lt;br /&gt;
	After the appropriate arrays are initialized, a call to &lt;br /&gt;
the AES is always done the same way, so in our sample &lt;br /&gt;
program, we've placed the necessary code into a subroutine. &lt;br /&gt;
The instruction *jsr aes* above calls this subroutine, which &lt;br /&gt;
is located at the end of the program, right above our data &lt;br /&gt;
segment. The subroutine looks like this:&lt;br /&gt;
&lt;br /&gt;
movem.l a0-a7/d0-d7,-(sp)&lt;br /&gt;
move.l  #apb,d1&lt;br /&gt;
move.l  #AES_OPCODE,d0&lt;br /&gt;
trap    #2&lt;br /&gt;
movem.l (sp)+,a0-a7/d0-d7&lt;br /&gt;
rts&lt;br /&gt;
&lt;br /&gt;
First, we save the contents of the registers. Then we move the&lt;br /&gt;
address of our APB into D1 and the AES opcode into D0. Finally,&lt;br /&gt;
we call the AES with a *trap #2*. The AES then uses the APB to&lt;br /&gt;
find the addresses of the arrays it needs, and it performs the&lt;br /&gt;
instructions in finds in those arrays.&lt;br /&gt;
&lt;br /&gt;
--Displaying an Alert Box--&lt;br /&gt;
&lt;br /&gt;
After we've called *appl_init*, we're all ready to take full &lt;br /&gt;
advantage of some of the great stuff that GEM has to offer. &lt;br /&gt;
(We can't yet call the VDI directly, however; further &lt;br /&gt;
initialization is required for that.) One of the easiest &lt;br /&gt;
things we can do with GEM is call up an alert box. And in &lt;br /&gt;
the next section of code, we do just that. But before we &lt;br /&gt;
look at the code, let's talk a bit about alert boxes.&lt;br /&gt;
	As you probably know, GEM supports a special input &lt;br /&gt;
window called a dialog box. Dialog boxes come in many, many &lt;br /&gt;
types, most of which are designed by the application's &lt;br /&gt;
programmer. The AES, however, supplies a couple of ready-&lt;br /&gt;
made dialog boxes that we can use without having to create &lt;br /&gt;
it in a resource file. The simplest of these ready-made &lt;br /&gt;
dialog boxes is the alert box.&lt;br /&gt;
	An alert box may contain several elements: an icon, up &lt;br /&gt;
to five lines of text (maximum of 32 characters per line), &lt;br /&gt;
and up to three labeled buttons. One of the three buttons &lt;br /&gt;
may be a default button, which is automatically chosen when &lt;br /&gt;
the user presses Return. The default button always has a &lt;br /&gt;
darker border than the other buttons.&lt;br /&gt;
	When we tell the AES to construct an alert box for us, &lt;br /&gt;
we must tell it what icon and text to display. We must also &lt;br /&gt;
tell it how many buttons we want in the box, and which of &lt;br /&gt;
the buttons, if any, is to be the default. All of this &lt;br /&gt;
information is transferred to the AES via the control, &lt;br /&gt;
int_in, and int_out arrays.&lt;br /&gt;
	Take a look at the sample program. Right below our call &lt;br /&gt;
to *appl_init*, you'll see the following code:&lt;br /&gt;
&lt;br /&gt;
move.w  #FORM_ALERT,control0&lt;br /&gt;
move.w  #1,control1&lt;br /&gt;
move.w  #1,control2&lt;br /&gt;
move.w  #1,control3&lt;br /&gt;
move.w  #0,control4&lt;br /&gt;
move.w  #1,int_in&lt;br /&gt;
move.l  #string,addr_in&lt;br /&gt;
jsr     aes&lt;br /&gt;
&lt;br /&gt;
This is the code that creates and displays the alert box. In &lt;br /&gt;
the first line, we move the opcode for the AES function, &lt;br /&gt;
*form_alert* (opcode #52), into *control1*. In the next four &lt;br /&gt;
lines, we tell the AES that the int_in, int_out, and addr_in &lt;br /&gt;
arrays are each one element long, and that the addr_out &lt;br /&gt;
array is zero elements long. We then place a 1 in the first &lt;br /&gt;
element of int_in, which tells the AES that we want the &lt;br /&gt;
first button to be the default button. This value can be any &lt;br /&gt;
of the following:&lt;br /&gt;
&lt;br /&gt;
0 -- no default button&lt;br /&gt;
1 -- first button is the default&lt;br /&gt;
2 -- second button is the default&lt;br /&gt;
3 -- third button is the default&lt;br /&gt;
&lt;br /&gt;
After setting the default button, we load the address of a &lt;br /&gt;
string into the first element of addr_in. What string, you &lt;br /&gt;
ask? The string that tells *form_alert* what icon, text, and &lt;br /&gt;
buttons to display. The string is made up of three parts, &lt;br /&gt;
each part surrounded by square brackets:&lt;br /&gt;
&lt;br /&gt;
[ICON #][BOX TEXT][BUTTON TEXT]&lt;br /&gt;
&lt;br /&gt;
ICON # tells *form_alert* which icon to display. BOX TEXT is &lt;br /&gt;
the text that we want to appear in the alert box. Each line &lt;br /&gt;
of text must be separated by the OR character (|), like &lt;br /&gt;
this:&lt;br /&gt;
&lt;br /&gt;
[LINE1|LINE2|LINE3|LINE 4|LINE5]&lt;br /&gt;
&lt;br /&gt;
BUTTON TEXT tells *form_alert* what text to put into the &lt;br /&gt;
buttons. Again, if there is more than one button, the text &lt;br /&gt;
for each must be separated by the OR character, like this:&lt;br /&gt;
&lt;br /&gt;
[BUTTON1|BUTTON2|BUTTON3]&lt;br /&gt;
&lt;br /&gt;
So, a string used to create a typical alert box might look &lt;br /&gt;
something like this:&lt;br /&gt;
&lt;br /&gt;
[1][Your File has been changed.|Do you want to save &lt;br /&gt;
it?][YES|NO]&lt;br /&gt;
&lt;br /&gt;
You can find the string used in the sample program to create &lt;br /&gt;
the alert box, in the data section of the program listing.&lt;br /&gt;
	Getting back to our program, after we load the address &lt;br /&gt;
of the alert-box text string into addr_in, we call our *aes* &lt;br /&gt;
subroutine, and the alert box is displayed on the screen. &lt;br /&gt;
The user can exit the alert box onLy by clicking one of its &lt;br /&gt;
buttons. The number of the button the user clicks is &lt;br /&gt;
returned in the first element of the int_out array. The &lt;br /&gt;
alert box in our sample program has only one button, so we &lt;br /&gt;
don't need to use the information stored in the int_out &lt;br /&gt;
array, but if we had had more than one choice, we would have &lt;br /&gt;
used the value from int_out to decide what to do next.&lt;br /&gt;
&lt;br /&gt;
--Shutting Down a GEM Application--&lt;br /&gt;
&lt;br /&gt;
The complement of the *appl_init* function is *appl_exit* &lt;br /&gt;
(opcode #19). Before returning to the desktop from a GEM &lt;br /&gt;
program, we must be sure to call this function, because it &lt;br /&gt;
tells the AES that the program is terminating and that the &lt;br /&gt;
AES should return to the system whatever resources were &lt;br /&gt;
allocated. We call the *appl_exit* function like this:&lt;br /&gt;
&lt;br /&gt;
move.w  #APPL_EXIT,control0&lt;br /&gt;
move.w  #0,control1&lt;br /&gt;
move.w  #1,control2&lt;br /&gt;
move.w  #0,control3&lt;br /&gt;
move.w  #0,control4&lt;br /&gt;
jsr     aes&lt;br /&gt;
&lt;br /&gt;
After a call to *appl_exit*, the first element of int_out &lt;br /&gt;
will contain a zero if an error occurred or a number greater &lt;br /&gt;
than zero if no error occurred.&lt;br /&gt;
	Once we've terminated the GEM program, all we must do &lt;br /&gt;
to end the program is return to the desktop. We do this just &lt;br /&gt;
as we did before, with a call to *Pterm0*.&lt;br /&gt;
&lt;br /&gt;
--Conclusion--&lt;br /&gt;
&lt;br /&gt;
Now you know why we saved GEM programming for volume 2 of &lt;br /&gt;
the workshop. Just doing something simple like bringing an &lt;br /&gt;
alert box up on the screen takes many lines of code and &lt;br /&gt;
requires much knowledge of the way GEM works. Take your time &lt;br /&gt;
with this chapter and be sure you understand it all. It's &lt;br /&gt;
the basis for all to follow.&lt;br /&gt;
&lt;br /&gt;
--Summary--&lt;br /&gt;
&lt;br /&gt;
* GEM comprises two main components: the AES and the VDI.&lt;br /&gt;
&lt;br /&gt;
* The AES handles menus, dialog, boxes, and windows. The AES &lt;br /&gt;
calls upon the VDI, which contains a library of graphics &lt;br /&gt;
primitives, as well as functions for handling the mouse, &lt;br /&gt;
among other things.&lt;br /&gt;
&lt;br /&gt;
* To initialize, run, and terminate a GEM application, we &lt;br /&gt;
must perform six main steps: Set up a stack, return unused &lt;br /&gt;
memory to the system, call *appl_init*, perform the main &lt;br /&gt;
program code, call *appl_exit*, and call *Pterm0*.&lt;br /&gt;
&lt;br /&gt;
* We set up a stack by allocating space for it in our BSS, &lt;br /&gt;
and then setting the stack pointer to that space.&lt;br /&gt;
&lt;br /&gt;
* To return unused memory to the system, we must first &lt;br /&gt;
calculate the size of our program. We use the information &lt;br /&gt;
found in the Trasient Program Area (TPA) to do this.&lt;br /&gt;
&lt;br /&gt;
* The address of the TPA can be found in the second word of &lt;br /&gt;
the system's stack upon program startup.&lt;br /&gt;
&lt;br /&gt;
* The GEMDOS function #74, *Mshrink*, returns unused memory &lt;br /&gt;
to the system.&lt;br /&gt;
&lt;br /&gt;
* In order to function properly, the AES requires seven &lt;br /&gt;
arrays to receive information from and to send information &lt;br /&gt;
to our program. They are the global array, the control &lt;br /&gt;
array, the int_in array, the int_out array, the addr_in &lt;br /&gt;
array, the addr_out array, and the AES parameter block.&lt;br /&gt;
&lt;br /&gt;
* To call an AES routine, we must perform five main steps: &lt;br /&gt;
Place the appropriate values into the control array, place &lt;br /&gt;
the appropriate parameters into the int_in and addr_in &lt;br /&gt;
arrays, load the address of the APB into D1, load the AES ID &lt;br /&gt;
into D0, and perform a *trap #2*.&lt;br /&gt;
&lt;br /&gt;
* The AES function #10, *appl_init* initializes a new GEM &lt;br /&gt;
application.&lt;br /&gt;
&lt;br /&gt;
* An alert box is one of the ready-made dialog boxes that &lt;br /&gt;
GEM provides.&lt;br /&gt;
&lt;br /&gt;
* The AES function #52, *form_alert*, creates an alert box &lt;br /&gt;
on the screen.&lt;br /&gt;
&lt;br /&gt;
* The AES function #19, *appl_exit*, terminates a GEM &lt;br /&gt;
application, returning all its resources to the system.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Back to [[Assembly_language_tutorials]]&lt;/div&gt;</summary>
		<author><name>&gt;Zorro 2</name></author>
	</entry>
</feed>