<?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=Perihelion_tutorial_8</id>
	<title>Perihelion tutorial 8 - 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=Perihelion_tutorial_8"/>
	<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;action=history"/>
	<updated>2026-05-02T14:22:12Z</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=Perihelion_tutorial_8&amp;diff=16045&amp;oldid=prev</id>
		<title>&gt;Af0l: Separated code blocks and fixed some special characters</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;diff=16045&amp;oldid=prev"/>
		<updated>2015-04-11T19:13:34Z</updated>

		<summary type="html">&lt;p&gt;Separated code blocks and fixed some special characters&lt;/p&gt;
&lt;a href=&quot;https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;amp;diff=16045&amp;amp;oldid=16044&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>&gt;Af0l</name></author>
	</entry>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;diff=16044&amp;oldid=prev</id>
		<title>&gt;Wongck at 03:33, 19 February 2012</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;diff=16044&amp;oldid=prev"/>
		<updated>2012-02-19T03:33: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 23:33, 18 February 2012&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-l713&quot;&gt;Line 713:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 713:&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;Last edited 2002-06-14&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;Last edited 2002-06-14&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;&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;&amp;lt;br/&gt;&amp;lt;br/&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;Go back to [[Perihelion tutorial 7]]&amp;lt;br/&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;Proceed to [[Perihelion tutorial 9]]&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;[[Category: Perihelions Atari ST M68000 tutorial]]&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: Perihelions Atari ST M68000 tutorial]]&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=Perihelion_tutorial_8&amp;diff=16043&amp;oldid=prev</id>
		<title>&gt;Wongck at 14:34, 12 October 2011</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;diff=16043&amp;oldid=prev"/>
		<updated>2011-10-12T14:34:21Z</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 10:34, 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-l713&quot;&gt;Line 713:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 713:&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;Last edited 2002-06-14&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;Last edited 2002-06-14&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;&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; 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;Category &lt;/del&gt;Perihelions Atari ST M68000 tutorial&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&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; &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;[[Category: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: Perihelions Atari ST M68000 tutorial]]&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;[[Category:Assembly Language&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;/table&gt;</summary>
		<author><name>&gt;Wongck</name></author>
	</entry>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;diff=16042&amp;oldid=prev</id>
		<title>&gt;Silver Surfer: clean up</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;diff=16042&amp;oldid=prev"/>
		<updated>2009-05-03T15:38:59Z</updated>

		<summary type="html">&lt;p&gt;clean up&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:38, 3 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-l715&quot;&gt;Line 715:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 715:&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:Category Perihelions Atari ST M68000 tutorial]]&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:Category Perihelions Atari ST M68000 tutorial]]&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;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:Assembly Language]]&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=Perihelion_tutorial_8&amp;diff=16041&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=Perihelion_tutorial_8&amp;diff=16041&amp;oldid=prev"/>
		<updated>2009-05-02T19:52:53Z</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 15:52, 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-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&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; 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;[[Category:Category Perihelions Atari ST M68000 tutorial]]&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;The Atari ST M68000 tutorial part 8 â€“ of scrolling 8 pixels per VBL using double buffer&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;The Atari ST M68000 tutorial part 8 â€“ of scrolling 8 pixels per VBL using double buffer&lt;/div&gt;&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-l714&quot;&gt;Line 714:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 713:&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;Last edited 2002-06-14&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;Last edited 2002-06-14&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;&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;[[Category:Category Perihelions Atari ST M68000 tutorial]]&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;[[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=Perihelion_tutorial_8&amp;diff=16040&amp;oldid=prev</id>
		<title>&gt;Zorro 2 at 15:34, 2 October 2006</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;diff=16040&amp;oldid=prev"/>
		<updated>2006-10-02T15:34:27Z</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:34, 2 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-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&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;&amp;lt;pre&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;[[Category:Category Perihelions Atari ST M68000 tutorial]]&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:Category Perihelions Atari ST M68000 tutorial]]&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 colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l712&quot;&gt;Line 712:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 713:&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;Last edited 2002-06-14&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;Last edited 2002-06-14&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;&amp;lt;/pre&gt;&lt;/ins&gt;&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=Perihelion_tutorial_8&amp;diff=16039&amp;oldid=prev</id>
		<title>&gt;Admin at 19:01, 31 January 2006</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=Perihelion_tutorial_8&amp;diff=16039&amp;oldid=prev"/>
		<updated>2006-01-31T19:01:10Z</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;[[Category:Category Perihelions Atari ST M68000 tutorial]]&lt;br /&gt;
&lt;br /&gt;
The Atari ST M68000 tutorial part 8 â€“ of scrolling 8 pixels per VBL using double buffer&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
           In the last few days, Iâ€™ve had the great opportunity to get lots of introduction to the Atari scene. mOdmate of Checkpoint told me about #atariscne, and since then heâ€™s guided me through the stuff, giving me links to good sites and generally telling me what I need to know to orient myself. Iâ€™ve met some great people that have helped me understand things and being a better coder. Also, letâ€™s not forget the importance of Maarten Martens for converting this text file to html and banging me on the head whenever I take a wrong step. I could not write this stuff alone, lots of thanks to all of you who make this text possible. I also want to thank God, for giving me the luck and opportunity to be where I am, my mother for giving birth to me and always being there and all â€¦ (end of Hollywood speech)&lt;br /&gt;
&lt;br /&gt;
            In order to get an even better understanding of the bit planes, Iâ€™ve done an 8 pixel scroller. The thing with this is that you must be careful not to misalign the bit planes, which we didnâ€™t have to worry about when scrolling 16 pixels per VBL. Since not to much have changed since the 16 pixel scroller, I thought Iâ€™d cover some other stuff as well.  &lt;br /&gt;
&lt;br /&gt;
            First, I need to cover the shift command in order to be able to tell you about double buffering (there are more than one shift command, but they'll be covered later). The shift command will shift bits either left or right, as many â€œslotsâ€ as you want to. The command for shifting left is lsl, meaning Logical Shift Left, and right is lsr for Logical Shift Right. If you have a number in d0 and right shift, like so&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.l 	#%10110001,d0 	d0 = 177&lt;br /&gt;
	lsr.l 	#2,d0 	&lt;br /&gt;
	Then d0 will contain 		&lt;br /&gt;
	%00101100 	44 	&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
            All bits will jump two spaces to the right, and 0â€™s have moved in from the left. Also note that this was the same as dividing 177 by 4 and throwing away the remainder. Left shifting will move bits to the left, and move 0â€™s in from the right. Right shifting one is the same as dividing by 2. Thus a lsr.l #2 is the same as divu.l #4, and a lsl.l #2 is the same as a mulu.l #4. Only thing is that a shift is soooo much faster than a mulu or divu, but more on that later. Itâ€™s very important to note how big the shift area is, if you have a data register filled with bits, but only shift a byte, lsr.b, only the first 8 pixels will be affected. Like so&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.w 	#%1010101010101010,d0 	&lt;br /&gt;
	lsr.b&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#4,d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
		Upper byte 	Lower byte&lt;br /&gt;
	d0 = 	%1010101 	%000001010&lt;br /&gt;
&lt;br /&gt;
            Note how the upper byte of the word was completely unchanged by the shift operation, since we used a lsr.b operation.&lt;br /&gt;
&lt;br /&gt;
            Now we can go on with double buffering. This is an extremely important technique. The screen is painted by an electron beam that goes from upper left, and then sweeps one horizontal line, down to the bottom right, just as the screen coordinates. Now, what happens if you start to make changes to the screen where the electron beam is painting? You will experience flicker or a distorted line or any other horrible thing. In short, when you write to screen memory, youâ€™ll most likely interrupt the electron beam in its work.&lt;br /&gt;
&lt;br /&gt;
            It is possible to change the area of memory that is the screen memory, any area of memory can be the screen memory actually. So for every VBL (or even often), we can change what area of memory is the screen memory. A solution begins to crystallize. We have to screen area sized areas of memory, one which is the actual screen memory (being shown on the monitor) and the other works as a buffer.&lt;br /&gt;
&lt;br /&gt;
            What we do is to update the buffer, while leaving the other screen alone, in this way, nothing will happen to the screen memory while the electron beam is painting. Then, just in the beginning of the next VBL, we make the buffer the screen memory and the screen memory the buffer. In this way, we will never paint to the actual screen memory. One can also all the memory that is being displayed for the physical base, and the area of memory not being displayed for the logical base. So far, weâ€™ve gotten the address to the physical base by calling trap #2 of the XBIOS, if you call trap #3, youâ€™ll get the logical base. Usually, both of these point to the same memory area.&lt;br /&gt;
&lt;br /&gt;
            Instead of getting the physical address from the Atari, we will now define our own area of memory and input that address directly into memory. Thereâ€™s only one important thing to know about the screen memory; it must be on a 256 byte boundary (unless you have a Ste). What this means is that the start address of the screen memory must be a multiple of 256. This can be achieved by clearing the lower byte of the address, meaning that youâ€™ll need 256 bytes extra memory for your screen memory, so you can clear the lower byte. Why? Because clearing away the byte will clear away anything not multipliable by 256, the size of a byte.&lt;br /&gt;
&lt;br /&gt;
            So, how do we make a memory area the screen memory? Smack up the memory.txt file, and search for something appropriate, like â€œscreenâ€. We see this.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
$FF8201 	|byte |Video screen memory position (high Byte) 	|R/W&lt;br /&gt;
$FF8203        	|byte |Video screen memory position (mid Byte) 	|R/W&lt;br /&gt;
$FF820D 	|byte |Video screen memory position (low Byte) 	|R/W  (STe)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
            Sure, ok, seems to be what we need. The low byte in $ff820d is for STeâ€™s only, and should be cleared at all times to avoid trouble. Then the middle byte of the screen address goes into $ff8203 and the high byte goes into $ff8201. In order to get the middle and high byte of the screen address, we shift the address. By shifting down the eight bits constituting the byte, we can easily move out bytes from the screen address by move.b commands.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	High byte 	Middle byte 	Low byte 	&lt;br /&gt;
screen   	%00010111 	%01001101 	%10111110 	$174dbe&lt;br /&gt;
&lt;br /&gt;
            First we clear the low byte in order to put it on a 256 boundary.&lt;br /&gt;
	move.l 	#screen,d0 		&lt;br /&gt;
	clr.b&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		&lt;br /&gt;
	High byte 	Middle byte 	Low byte 	&lt;br /&gt;
screen 	%00010111 	%01001101 	%00000000 	&lt;br /&gt;
&lt;br /&gt;
              Now we need to move the middle byte into $ff8203&lt;br /&gt;
	lsr.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#8,d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		&lt;br /&gt;
	High byte 	Middle byte 	Low byte 	&lt;br /&gt;
screen&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%00000000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%00010111&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%01001101&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
	move.b 	d0,$ff8203 		&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
            As you see, the middle byte gets shifted into the lower byte. With a move.b command the only thing we move is the lowest byte of d0. Thus, we have isolated the middle byte by shifting it into a more convenient position. Now for the last one.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	lsr.w&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#8,d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
		&lt;br /&gt;
	High byte 	Middle byte 	Low byte 	&lt;br /&gt;
screen&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%00000000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%00000000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%00010111&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
	move.b 	d0,$ff8201 		&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
            And thatâ€™s it. We have now cleared the lowest byte of the screen address, and moved the middle and high bytes of it into the correct memory position. screen is now the screen memory. The compact code snippet looks like this.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.l 	#screen1,d0 	put screen1 	address in d0&lt;br /&gt;
	clr.b&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	put on 256 byte boundary &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	clr.b 	$ffff820d 	clear STe extra bit&lt;br /&gt;
	lsr.l 	#8,d0 	&lt;br /&gt;
	move.b 	d0,$ffff8203 	put in mid screen address byte&lt;br /&gt;
	lsr.w 	#8,d0 	&lt;br /&gt;
	move.b 	d0,$ffff8201 	put in high screen address byte&lt;br /&gt;
	section bss 		&lt;br /&gt;
	ds.b 	256 	256 clear buffer&lt;br /&gt;
screen 	ds.b 	32000 	the screen &lt;br /&gt;
&lt;br /&gt;
            Now, this doesnâ€™t make for any double buffer at all, since weâ€™re only using one screen. In order to achieve double buffering, we need two screen areas, and two pointers to point to each area. In each VBL, one screen is made into screen memory, and then the pointers are flipped  so that the other screen is made screen memory for next VBL. This really makes what you see on the screen appear 1/50th of a second slower than what you draw.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
            prepare addresses&lt;br /&gt;
&lt;br /&gt;
            make next and last point to screen1 and screen2&lt;br /&gt;
&lt;br /&gt;
main&lt;br /&gt;
&lt;br /&gt;
           wait VBL&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
&lt;br /&gt;
            move.l            next,d0&lt;br /&gt;
&lt;br /&gt;
            make address in d0 screen address&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
            move.l            last,a0&lt;br /&gt;
&lt;br /&gt;
            move.l            next,a1             load screens&lt;br /&gt;
&lt;br /&gt;
            move.l            a1,last              and flip them for next time around&lt;br /&gt;
&lt;br /&gt;
            move.l           a0,next             double buffering :)     &lt;br /&gt;
&lt;br /&gt;
* loads the screen addresses and flips them around&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
&lt;br /&gt;
            do your stuff, like putting graphics to the address in a1&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
            repeat main loop       &lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
                              section data&lt;br /&gt;
&lt;br /&gt;
            last            dc.l            0&lt;br /&gt;
&lt;br /&gt;
            next           dc.l            0&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
                               section bss&lt;br /&gt;
&lt;br /&gt;
                              ds.b            256&lt;br /&gt;
&lt;br /&gt;
            screen1       ds.b            32000&lt;br /&gt;
&lt;br /&gt;
            screen2       ds.b            32000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
            I also thought we might mention timing as well. This is quite the issue really, as you must have understood, you canâ€™t perform an infinite number of instructions. Included here should be two text files, called CYCTIMES.TXT and PIXELTIM.TXT. The CYCTIMES.TXT explains how much time it takes to do each instruction. This can vary greatly, for example, a division takes way over 100 clock cycles, and a shift takes under 10, so you see, itâ€™s a good thing to replace your divuâ€™s with lslâ€™s if possible. Also, when you can, work with byte or word size, instead of long, since this saves some time also. Clock cycle is the quantity in which â€œtimeâ€ is measured. Each instruction takes a certain amount of clock cycles.&lt;br /&gt;
&lt;br /&gt;
            The PIXELTIM.TXT was extracted by me from the ST Internals text file by Jim Boulton. One interesting thing to note there is the amount of clock cycles per VBL; 160256. This is a very exact number, and if your main loop ever takes more time than that, youâ€™re screwed (if you work with VBL main loops as weâ€™ve done so far that is). One way to get a graphical pointer of how much time your main routine does take, is to change the background colour just at the start of the routine, then change it back in the end.&lt;br /&gt;
&lt;br /&gt;
            Letâ€™s say we have a routine that takes 80000 clock cycles, our original background is black, but in the beginning of our main loop, we set it to red. What will happen is that the electron beam will paint red background, but when our 80000 clock cycles worth of instructions have taken place, the background is switched back to black, which means that for the time it takes to wait for the next VBL, the electron beam will paint black. So, in this case, the screen would be half red background and half black background. If we use this technique, weâ€™ll see exactly how much time our main routine takes. The example program in this tutorial takes up most of the processor, which leaves little time for other stuff to be done. Granted, the scroller is completely un-optimized.&lt;br /&gt;
&lt;br /&gt;
            Phew, now we have covered lots of small things of big importance. Finally, now comes the 8 pixel scroller part. Just look at the source code, itâ€™s well commented. Nah, Iâ€™m just kidding with you, of course Iâ€™ll explain. Since we now want to scroll 8 pixels, this means for starters that we need to move bytes. The first byte represents the first 8 pixels, and the second the coming 8 pixels. Then, the third word again has to do with the first 8 pixels, and the fourth word has to do with the 8 coming pixels and so on. Thus, we cannot simply barge in and do some scroll loop. We need to move every second byte.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Index 	First byte 	Index 	Second byte 	 &lt;br /&gt;
0 	%11000000 	1 	%00000000 	first word&lt;br /&gt;
2 	%11000000 	3 	%00000101 	second word&lt;br /&gt;
4 	%01000000 	5 	%00000110 	third word&lt;br /&gt;
6&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%01100000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	7&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%00000000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	fourth word&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
0-7&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	$3F800000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	8-15&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	$00000642&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	pixels&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Index 	First byte 	Index 	Second byte 	 &lt;br /&gt;
8 	%00000110 	9 	%00100000 	first word&lt;br /&gt;
10 	%00000010 	11 	%00100100 	second word&lt;br /&gt;
12 	%00000000 	13 	%10000010 	third word&lt;br /&gt;
14 	%00100010 	15 	%00010000 	fourth word&lt;br /&gt;
16-23 	$008001B0 	24-31 	$40380240 	pixels&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
            It is tempting to read the memory top down, but this is not so, it is to be read from left to right. So index 5 for example is the second byte in the third word, and affects pixels 8 â€“ 15. The memory without comments look like this, split into bytes for ease of reading.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%11000000 	%00000000 	%11000000 	%00000101 	%01000000&lt;br /&gt;
	%00000110 	%01100000 	%00000000 	%00000110 	%00100000&lt;br /&gt;
	%00000010 	%00100100 	%00000000  	%10000010 	%00100010&lt;br /&gt;
	%00010000 	â€¦ 			&lt;br /&gt;
&lt;br /&gt;
             &lt;br /&gt;
&lt;br /&gt;
            So in order to scroll 8 pixels, index 0, 2, 4 and 6 will de dropped, because they represent the first 8 pixels. Then index 1, 3, 5 and 7 will be moved into index 0, 2, 4 and 6. Then index 8, 10, 12 and 14 will be moved into index 1, 3, 5 and 7. Then index 9, 11, 13 and 15 will be moved into index 8, 10, 12 and 14. This will make pixels 0-7 to drop, 8-15 to be moved into 0-7, 16-23 will be moved into 8-15 and 24-31 will move into 16-23. After these move instructions, the memory will look like this&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Index 	First byte 	Index 	Second byte 	&lt;br /&gt;
0 	%00000000 	1 	%00000110 	first word&lt;br /&gt;
2 	%00000101 	3 	%00000010 	second word&lt;br /&gt;
4 	%00000110 	5 	%00000000 	third word&lt;br /&gt;
6&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%00000000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	7&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%00100010&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	fourth word&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
0-7&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	$00000642&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	8-15&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	$008001B0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	pixels&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Index 	First byte 	index 	Second byte 	&lt;br /&gt;
8 	%00100000 	9 	â€¦ 	first word&lt;br /&gt;
10 	%00100100 	11 	â€¦ 	second word&lt;br /&gt;
12 	%10000010 	13 	â€¦ 	third word&lt;br /&gt;
14&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	%00010000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	15&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	â€¦&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	fourth word&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
16-23 	$40380240 	24-31 	â€¦ 	pixels&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
            It is of the utmost importance that you realize why this is so. If you do not, set yourself down and work it out until you get it and understand it 100%. Without understanding this, youâ€™ll not understand bit planes, without understanding bit planes, you canâ€™t understand how the graphics on the Atari works. Expressed in code, this will be (a0 points to screen memory)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
            move.b            1(a0),(a0)&lt;br /&gt;
&lt;br /&gt;
            move.b            3(a0),2(a0)&lt;br /&gt;
&lt;br /&gt;
            move.b            5(a0),4(a0)&lt;br /&gt;
&lt;br /&gt;
            move.b            7(a0),6(a0)                 8 pixels moved&lt;br /&gt;
&lt;br /&gt;
            move.b            8(a0),1(a0)                 watch carefully!&lt;br /&gt;
&lt;br /&gt;
            move.b            10(a0),3(a0)&lt;br /&gt;
&lt;br /&gt;
            move.b            12(a0),5(a0)&lt;br /&gt;
&lt;br /&gt;
            move.b            14(a0),7(a0)               first 4 word area filled&lt;br /&gt;
&lt;br /&gt;
            move.b            9(a0),8(a0)                 start of second 4 word area&lt;br /&gt;
&lt;br /&gt;
            move.b            11(a0),10(a0)&lt;br /&gt;
&lt;br /&gt;
            â€¦&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
            and so on. So first, four bytes are moved just one step to the left, but then you need to go into the next 4 word area, to fetch the bytes that go into the second area of the first 4 word area and so on. This is the theory behind 8 pixel scrolling, I donâ€™t think I can explain it better than that. This is the source code for the scroller.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	jsr 	initialise 	&lt;br /&gt;
	move.l 	#screen1,d0 	put screen1 address in d0&lt;br /&gt;
	clr.b 	d0 	put on 256 byte boundary&lt;br /&gt;
	move.l   	d0,next 	store address&lt;br /&gt;
	add.l 	#32000,d0 	next screen area&lt;br /&gt;
	move.l    &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d0,last&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	store address&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	movem.l 	font+2,d0-d7 	&lt;br /&gt;
	movem.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d0-d7,$ff8240&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	palette moved in&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
main 			&lt;br /&gt;
	move.w 	#37,-(sp) 	wait vbl&lt;br /&gt;
	trap 	#14 	&lt;br /&gt;
	addq.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#2,sp&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
	move.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	next,d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
	clr.b 	$ffff820d 	clear STe extra bit&lt;br /&gt;
	lsr.l 	#8,d0 	&lt;br /&gt;
	move.b 	d0,$ffff8203 	put in mid screen address byte&lt;br /&gt;
	lsr.w 	#8,d0 	&lt;br /&gt;
	move.b&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d0,$ffff8201&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	put in high screen address byte&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.w&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#$707,$ff8240 &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	too see clock cycles&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	cmp&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#0,font_counter&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	check if new character in message&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	bne 	has_character 	if not, skip get new character&lt;br /&gt;
	move.w 	#4,font_counter 	reset font_counter&lt;br /&gt;
* we need to point to a new characetr in the font&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.l 	message_pointer,a0  	pointer into the message&lt;br /&gt;
	clr.l 	d0 	clear, just to be sure&lt;br /&gt;
	move.b&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	(a0),d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	put letter ascii value in d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	cmp 	#0,d0 	end of message?&lt;br /&gt;
	bne&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	not_end&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	if not, branch&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.l  	#message,message_pointer 	reset message_pointer&lt;br /&gt;
	move.l 	message_pointer,a0 	&lt;br /&gt;
	clr.l 	d0 	clear, just to be sure&lt;br /&gt;
	move.b  	(a0),d0 	put letter ascii value in d0&lt;br /&gt;
not_end 			&lt;br /&gt;
* now we have a character in d0 for sure&lt;br /&gt;
	add.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#1,message_pointer&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	point to next character&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	add.b 	#-$20,d0 	align ascii with font number&lt;br /&gt;
	divu&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#10,d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	10 letters per row&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.w 	d0,d1 	d1 contains y value&lt;br /&gt;
	swap 	d0 	&lt;br /&gt;
	move.w&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d0,d2&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d2 contains x value&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	mulu 	#16,d2 	16 bytes for each letter&lt;br /&gt;
	mulu 	#32,d1 	32 lines per row&lt;br /&gt;
	mulu&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#160,d1&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	160 bytes per row&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#font+34,a0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	put font screen start in a0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	add.l 	d2,d1 	add x and y value together&lt;br /&gt;
	add.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d1,a0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	a0 points to correct letter&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	a0,font_address&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	store calculated pointer&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
has_character 			&lt;br /&gt;
	add.w&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#-1,font_counter&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
	move.l 	last,a0 	&lt;br /&gt;
	move.l 	next,a1  	load screens&lt;br /&gt;
	move.l     	a1,last 	and flip them for next time around&lt;br /&gt;
	move.l 	a0,next      	doubble buffering :)&lt;br /&gt;
	move.l    	font_address,a2       	font address&lt;br /&gt;
	move.l 	#31,d1 	32 lines to scroll&lt;br /&gt;
	move.l 	#18,d0     	19 16 pixel clusters + font part&lt;br /&gt;
scroll 			&lt;br /&gt;
	move.b 	1(a0),(a1) 	&lt;br /&gt;
	move.b       	3(a0),2(a1) 	&lt;br /&gt;
	move.b 	5(a0),4(a1) 	&lt;br /&gt;
	move.b 	7(a0),6(a1)       	8 pixels moved&lt;br /&gt;
	move.b 	8(a0),1(a1)   	watch carefully!&lt;br /&gt;
	move.b 	10(a0),3(a1) 	&lt;br /&gt;
	move.b 	12(a0),5(a1) 	&lt;br /&gt;
	move.b &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	14(a0),7(a1)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	first 4 word area filled&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	add.l 	#8,a0 	jump to next 4 word area&lt;br /&gt;
	add.l 	#8,a1     	jump to next 4 word area&lt;br /&gt;
	dbf&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d0,scroll    &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	keep moving 16 pixel clusters&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#18,d0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	reset loop counter&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.b 	1(a0),(a1) 	&lt;br /&gt;
	move.b 	3(a0),2(a1) 	&lt;br /&gt;
	move.b     	5(a0),4(a1) 	&lt;br /&gt;
	move.b&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	7(a0),6(a1)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	152 pixels scrolled&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	move.b 	(a2),1(a1) 	now last 8 pixels from font&lt;br /&gt;
	move.b 	2(a2),3(a1) 	&lt;br /&gt;
	move.b 	4(a2),5(a1) 	&lt;br /&gt;
	move.b&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	6(a2),7(a1)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	8 pixels from font&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	add.l 	#8,a0 	point to beginning of next line&lt;br /&gt;
	add.l 	#8,a1 	point to beginning of next line&lt;br /&gt;
	add.l 	#160,a2 	next line of font&lt;br /&gt;
	dbf&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	d1,scroll&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	do another line&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	add.l 	#1,font_address 	next byte in font&lt;br /&gt;
	cmp 	#2,font_counter 	see if it's time to change&lt;br /&gt;
	bne 	font_increment 	&lt;br /&gt;
	add.l 	#6,font_address 	align to next 16 pixels&lt;br /&gt;
font_increment&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
			&lt;br /&gt;
	move.w 	#$0,$ff8240 	black background again&lt;br /&gt;
	cmp.b 	#$39,$fffc02 	space pressed?&lt;br /&gt;
	bne&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	main&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	if not, repeat main&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	jsr&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	restore&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
	clr.l 	-(a7) 	&lt;br /&gt;
	trap&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	#1&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
	include&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	initlib.s&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&lt;br /&gt;
	section data 	&lt;br /&gt;
font  	incbin 	font.pi1 	&lt;br /&gt;
screen  dc.l     	0 		&lt;br /&gt;
font_address 	dc.l 	0 	&lt;br /&gt;
font_counter 	dc.w 	0 	&lt;br /&gt;
message 	dc.b 	&amp;quot;A COOL SCROLLER!   MOVING 8 PIXELS PER VBL &amp;quot;&lt;br /&gt;
	dc.b&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	&amp;quot;AND USING DOUBBLE BUFFERING    &amp;quot;,0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
message_pointer&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	dc.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	message&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
next 	dc.l 	0&lt;br /&gt;
last&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	dc.l&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	0&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
	section bss 	&lt;br /&gt;
	ds.b 	256&lt;br /&gt;
screen1  	ds.b 	32000&lt;br /&gt;
screen2    	ds.b 	32000&lt;br /&gt;
&lt;br /&gt;
            Not too much has been changed since the 16 pixel scroller. In the beginning, thereâ€™s the code for setting up two screen areas. Then, in the main routine, we put one screen address in. Notice also how the font_counter is now 4 instead of 2, because we only need new font data every fourth VBL. The scroller part however is completely new, not surprising is it? It begins with loading both screen areas into a0 and a1, and then flips them for next time around. Data is moved as described above for 19 loops, this means 304 pixels are moved, the last 16 need special care though.&lt;br /&gt;
&lt;br /&gt;
            First 8 pixels scrolled as usual, but the last 8 must come from the font. This is also not to strange, since every second byte is moved into the second bytes of the words on the screen. Then 1 is added to the font address, to point to the second bytes in the words. However, this wonâ€™t quite do, as you may know. The step from the second byte of the first 16 pixels to the first byte of the coming 16 pixels is a bigger jump than 1, as described above.&lt;br /&gt;
&lt;br /&gt;
            In order to make this bigger step, I test the font_counter, to see if itâ€™s time, and then add another extra 6 to the font, making it point to the right place. If we donâ€™t do this extra addition, 16 pixels will be moved in from the font ok, but when pixels 16 â€“ 24 are about to be moved, the font address will point to index 2 (meaning the first 8 pixels again) instead of index 8 into the font memory. Just scroll up to the memory example, then work through the scroll loop on a piece of paper or in your head and it will hopefully become obvious. If it doesnâ€™t, mail me.&lt;br /&gt;
&lt;br /&gt;
            That, I think, was that. The big problem here is the understanding and alignment of bytes in the bit plane. What to keep in mind really is that first, take every second byte, then jump a bit to get on the next 16 pixel boundary, then continue in that way. Indexing goes like 0, 1, 8, 9, so to speak. Thus, every second time thereâ€™s a little gap. Since I didnâ€™t do any timers this tutorial, maybe weâ€™ll do them next time.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Warrior Munk of poSTmortem, 2002-05-05 &lt;br /&gt;
&lt;br /&gt;
â€œBe formless, shapeless, like water. Now you put water into a cup; it becomes the cup. You put water into a bottle; it becomes the bottle. You put it into a tea pot; it becomes the tea pot. Now water can flow, or it can crash. Be water my friend.â€ &lt;br /&gt;
&lt;br /&gt;
- Bruce Lee&lt;br /&gt;
&lt;br /&gt;
Last edited 2002-06-14&lt;/div&gt;</summary>
		<author><name>&gt;Admin</name></author>
	</entry>
</feed>