<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Oldskooler Ramblings</title>
	<atom:link href="http://trixter.oldskool.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://trixter.oldskool.org</link>
	<description>the unlikely child born of the home computer wars</description>
	<lastBuildDate>Fri, 17 May 2013 16:50:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='trixter.oldskool.org' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Oldskooler Ramblings</title>
		<link>http://trixter.oldskool.org</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://trixter.oldskool.org/osd.xml" title="Oldskooler Ramblings" />
	<atom:link rel='hub' href='http://trixter.oldskool.org/?pushpress=hub'/>
		<item>
		<title>Upcoming Trixter Sighting + Retroprogramming</title>
		<link>http://trixter.oldskool.org/2013/05/15/upcoming-trixter-sighting-retroprogramming/</link>
		<comments>http://trixter.oldskool.org/2013/05/15/upcoming-trixter-sighting-retroprogramming/#comments</comments>
		<pubDate>Wed, 15 May 2013 21:17:03 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Demoscene]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=976</guid>
		<description><![CDATA[June 14-16 you should be able to see me at @party in Boston.  (If anyone is looking to share a hotel room, drop me a line!)  I am scheduled to give a 30-minute version of the PCjr presentation I had worked on for NOTACON, and hopefully enter a compo or two with some oldskool hardware [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=976&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>June 14-16 you should be able to see me at <a href="http://atparty-demoscene.net/">@party</a> in Boston.  (If anyone is looking to share a hotel room, drop me a line!)  I am scheduled to give a 30-minute version of the PCjr presentation I had worked on for NOTACON, and hopefully enter a compo or two with some oldskool hardware I will be shipping to arrive ahead of me.</p>
<p>Speaking of entering a compo: I really, really dig retroprogramming.  The cool part is, after 10 years of retroprogramming in spare time, my kung fu is getting advanced enough where I not only know how to do what I want in assembly, but I know the fastest possible <em>method</em> to getting it done on the target hardware. For example, I recently implemented a vertical-retrace interrupt in software because <strong>the hardware one wasn&#8217;t good enough</strong>. It&#8217;s sick that I know how to do that, but sicker that I know <strong>why</strong> I need to do that.</p>
<p>I still get a kick out of impressing Jim-of-20-years-ago.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/demoscene/'>Demoscene</a>, <a href='http://trixter.oldskool.org/category/programming/'>Programming</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/976/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/976/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=976&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/05/15/upcoming-trixter-sighting-retroprogramming/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Journey&#8217;s End</title>
		<link>http://trixter.oldskool.org/2013/04/21/journeysend/</link>
		<comments>http://trixter.oldskool.org/2013/04/21/journeysend/#comments</comments>
		<pubDate>Sun, 21 Apr 2013 17:36:06 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Gaming]]></category>
		<category><![CDATA[Home Ownership]]></category>
		<category><![CDATA[Lifehacks]]></category>
		<category><![CDATA[MobyGames]]></category>
		<category><![CDATA[Software Piracy]]></category>
		<category><![CDATA[Vintage Computing]]></category>
		<category><![CDATA[curated collections]]></category>
		<category><![CDATA[gaming]]></category>
		<category><![CDATA[technology]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=974</guid>
		<description><![CDATA[I was part of the first wave of people tackling the gigantic task of preserving personal computing gaming history in the early 1990s.  (I suppose pirating software in the 1980s counts too, but scanning materials and interviewing people began, for me, in the 1990s.)  Without connecting to others or knowing what was out there, I [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=974&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I was part of the first wave of people tackling the gigantic task of preserving personal computing gaming history in the early 1990s.  (I suppose <a href="http://www.pcworld.com/article/248571/why_history_needs_software_piracy.html">pirating software in the 1980s counts too</a>, but scanning materials and interviewing people began, for me, in the 1990s.)  Without connecting to others or knowing what was out there, I started to hoard software and hardware where financially possible and appropriate.  I collected software I considered hidden gems, that should be given their due in some public forum before being forgotten.  I grabbed many Tandy 1000s and other early PCs to ensure various works could be run and studied.  I was an original member of the abandonware movement.  I wrote articles on how to <a href="http://www.oldskool.org/guides/oldonnew">get old software running on modern machines</a>, and contributed to <a href="http://www.oldskool.org/pc/flopper">software</a> that did the same.  I co-founded <a href="http://www.mobygames.com/">the world&#8217;s largest gaming database</a> so that information about these works could be consumed and researched by millions.</p>
<p>I did this all before Y2K.  When you&#8217;re <a href="http://en.wikipedia.org/wiki/They_live">the only guy shouting in a crowd</a>, you tend to look the lunatic, and that&#8217;s pretty much how most of my friends and family saw me.</p>
<p>Look around the preservation landscape today and much of what I was working towards for years has come to pass.  There are many vintage hardware and software museums, both <a href="http://www.computerhistory.org/">physical</a> and virtual, including <a href="http://www.icheg.org/">some dedicated to gaming</a>.  There are some <a href="http://www.dosbox.com/">wonderful emulators</a> that get closer and <a href="http://www.tommowalker.co.uk/pcem.html">closer to the real thing</a> each year.  There are even some <a href="http://archive.org/details/software">curated collections</a> online.  (There are many more curated collections offline, orders of magnitude larger than what is online, but in a decade or so I believe these will move online as well.)  Most importantly, there are <a href="http://www.vintage-computer.com/vcforum/forum.php">established</a> <a href="https://groups.google.com/forum/#!forum/swcollect">communities</a> that <a href="http://six.pairlist.net/mailman/listinfo/game_preservation">support these efforts</a>.  All in all, I&#8217;m pretty happy with how things have turned out.</p>
<p>Looking around all of my possessions inside my home, I see the fallout of what I was trying to accomplish many years ago.  I see no less than five PCjrs, three identical Tandy 1000s, three identical IBM PC 5150s, and multiples of Macs, Apples, C64s, and Amigas.  I see crates and bookshelves and closets filled with hardware and software.  I see clutter where there should be a nice desk for displaying a computer in a respectful way, or an easy chair for reading or watching TV.  It&#8217;s too much.  It&#8217;s time to let most of it go, and focus like a laser on the things that are the most important.  I will be disseminating most of my collection, both software and hardware, in the following year.</p>
<p>What I will continue to do, however, is archive and preserve software, as there is still a ton of IBM PC software from the 1980s that has not yet been released into the wild.  I am also committed to creating the &#8220;sound card museum&#8221; project I keep threatening to do.  To those ends, I will retain a few systems that will allow me to achieve both of those goals.</p>
<p>So, I&#8217;ll still keep buying and collecting vintage software &#8212; the difference is, I won&#8217;t <em>retain</em> the software after preserving it.  Consider me a vintage personal computing clearing house.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/family/'>Family</a>, <a href='http://trixter.oldskool.org/category/gaming/'>Gaming</a>, <a href='http://trixter.oldskool.org/category/home-ownership/'>Home Ownership</a>, <a href='http://trixter.oldskool.org/category/lifehacks/'>Lifehacks</a>, <a href='http://trixter.oldskool.org/category/mobygames/'>MobyGames</a>, <a href='http://trixter.oldskool.org/category/software-piracy/'>Software Piracy</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/974/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/974/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=974&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/04/21/journeysend/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>PCjr talk cancelled</title>
		<link>http://trixter.oldskool.org/2013/04/18/pcjr-talk-cancelled/</link>
		<comments>http://trixter.oldskool.org/2013/04/18/pcjr-talk-cancelled/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 16:13:15 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">https://trixter.wordpress.com/?p=972</guid>
		<description><![CDATA[Our basement flooded due to Illinois floodrains. I will not be traveling to notacon; there will be no PCjr talk this weekend. Filed under: Uncategorized<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=972&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Our basement flooded due to Illinois floodrains. I will not be traveling to notacon; there will be no PCjr talk this weekend.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/972/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/972/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=972&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/04/18/pcjr-talk-cancelled/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>PCjr Presentation Details</title>
		<link>http://trixter.oldskool.org/2013/04/16/pcjr-presentation-details/</link>
		<comments>http://trixter.oldskool.org/2013/04/16/pcjr-presentation-details/#comments</comments>
		<pubDate>Tue, 16 Apr 2013 19:06:00 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Entertainment]]></category>
		<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=968</guid>
		<description><![CDATA[As previously mentioned, I&#8217;ll be giving my PCjr history/hacking talk &#8220;Admiring one of IBM&#8217;s Biggest Mistakes&#8221; this weekend in Cleveland, OH at NOTACON, but I didn&#8217;t know the exact details until a few days ago, so here they are:  My talk is at 1pm Saturday, plenty of time to wake up, find some lunch, and [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=968&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>As previously mentioned, I&#8217;ll be giving my PCjr history/hacking talk &#8220;Admiring one of IBM&#8217;s Biggest Mistakes&#8221; this weekend in Cleveland, OH at <a href="http://www.notacon.org/">NOTACON</a>, but I didn&#8217;t know the exact details until a few days ago, so here they are:  My talk is at 1pm Saturday, plenty of time to wake up, find some lunch, and  settle in.  (I say this to reassure myself, not give instructions to potential audience members.  I will likely be freaking out about the PCjr-to-projector hookup, since the jr&#8217;s video output is not quite spec.)</p>
<p>Because they gave me a larger time slot, the talk has been expanded from 50 minutes to 90 minutes.  There will be some media to watch, as well as a real PCjr showing off its more unique features.</p>
<p>I&#8217;m not sure what to do with the extra time &#8212; I&#8217;ll have the room for 2.5 hours, and I can&#8217;t imagine people having more than 5 minutes&#8217; worth of questions.  How to fill the time?  Boot up the original first version of King&#8217;s Quest (which has additional functionality on PCjr) on the projector and let people have at it?  Connect it to the internet and join an IRC channel?  Take game requests?  Show off additional software that supported the PCjr?  I&#8217;m open to suggestions.</p>
<p>Rumor has it I might have something silly to submit into the wild compo.  Maybe.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/entertainment/'>Entertainment</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/968/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/968/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=968&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/04/16/pcjr-presentation-details/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>The PCjr: Wasn&#8217;t That a Time!</title>
		<link>http://trixter.oldskool.org/2013/03/06/the-pcjr-wasnt-that-a-time/</link>
		<comments>http://trixter.oldskool.org/2013/03/06/the-pcjr-wasnt-that-a-time/#comments</comments>
		<pubDate>Wed, 06 Mar 2013 07:56:57 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=959</guid>
		<description><![CDATA[2013 is the 30th anniversary of the IBM PCjr, and heck, I love that little machine too much to let an opportunity like this go by without educating the unwilling public about it.  So, I&#8217;ll be giving a presentation on the PCjr at NOTACON 10 in Cleveland OH in April, and again at the Vintage [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=959&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>2013 is the 30th anniversary of the IBM PCjr, and heck, I love that little machine too much to let an opportunity like this go by without educating the unwilling public about it.  So, <a href="http://www.notacon.org/event-information-2/speakers-and-presenters/#Trixter">I&#8217;ll be giving a presentation on the PCjr at NOTACON 10</a> in Cleveland OH in April, and again at the Vintage Computer Festival Midwest in September in Lombard, Illinois (more on VCFMW as the website becomes available).  The title is &#8220;Admiring one of IBM&#8217;s biggest mistakes: The IBM PCjr&#8221; and I will be covering what the PCjr was, its strengths and weaknesses, how it flopped so <em>incredibly</em> hard, and how it managed to change the home computer industry anyway.  Also, old hardware withstanding, I will have a PCjr with me to demonstrate a few things, so you can gawk at or admire it at your discretion.</p>
<p>What&#8217;s this pee-sea-june-your I speak of?  Well, I&#8217;ll let Ebeneezer Scrooge and Bob Cratchet explain:</p>
<span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='640' height='390' src='http://www.youtube.com/embed/vkHIXGr7Xqo?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span>
<br />Filed under: <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/959/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/959/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=959&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/03/06/the-pcjr-wasnt-that-a-time/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>LZ4 on the 8088: One small drop</title>
		<link>http://trixter.oldskool.org/2013/02/09/lz4-on-the-8088-one-small-drop/</link>
		<comments>http://trixter.oldskool.org/2013/02/09/lz4-on-the-8088-one-small-drop/#comments</comments>
		<pubDate>Sun, 10 Feb 2013 05:51:43 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Vintage Computing]]></category>
		<category><![CDATA[decompressor]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=955</guid>
		<description><![CDATA[I thought I had squeezed every drop of blood from the stone that is LZ4 decompression on the 8088, but with some help from Peter Ferrie and Terje Mathisen, we&#8217;ve managed to improve the decompression speed by another 1%.  1% may seem laughable, but believe me, it&#8217;s quite an accomplishment if you followed my previous [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=955&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I thought I had squeezed every drop of blood from the stone that is LZ4 decompression on the 8088, but with some help from Peter Ferrie and Terje Mathisen, we&#8217;ve managed to improve the decompression speed by another 1%.  1% may seem laughable, but believe me, it&#8217;s quite an accomplishment if you followed <a href="http://trixter.oldskool.org/2013/01/10/optimizing-for-the-8088-and-8086-cpu-part-1/">my previous 3-part series on optimizing for the 8088</a>.</p>
<p>In addition to even faster code, I thought it would be interesting to see how small an LZ4 decompressor could get, so with Peter&#8217;s help we managed to come up with a version of the code that trades speed for size.  It&#8217;s 30% slower on average, but it compiles to only 78 bytes.</p>
<p>The <a href="http://www.oldskool.org/pc/lz4_8088/#do">downloads section</a> of <a href="http://www.oldskool.org/pc/lz4_8088/">the LZ4_8088 website</a> has been updated to contain both versions in the single .zip file.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/programming/'>Programming</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/955/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/955/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=955&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/02/09/lz4-on-the-8088-one-small-drop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Optimizing for the 8088 and 8086 CPU, Part 3: A Case Study In Speed</title>
		<link>http://trixter.oldskool.org/2013/01/18/optimizing-for-the-8088-and-8086-cpu-part-3-a-case-study-in-speed/</link>
		<comments>http://trixter.oldskool.org/2013/01/18/optimizing-for-the-8088-and-8086-cpu-part-3-a-case-study-in-speed/#comments</comments>
		<pubDate>Sat, 19 Jan 2013 05:00:59 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=911</guid>
		<description><![CDATA[In this final part of 8088 optimization posts, I present a case study for 8088 optimization. Specifically, I&#8217;ll cover a problem that I needed to solve, how I solved it, how long it took to optimize my solution for 8088, and what the performance benefit was from that optimization. For the TL;DR crowd who will [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=911&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>In this final part of <a href="http://trixter.oldskool.org/2013/01/10/optimizing-for-the-8088-and-8086-cpu-part-1/">8088 optimization posts</a>, I present a case study for 8088 optimization. Specifically, I&#8217;ll cover a problem that I needed to solve, how I solved it, how long it took to optimize my solution for 8088, and what the performance benefit was from that optimization.</p>
<p>For the TL;DR crowd who will likely skip to the end of the article: Through clever 8088 optimization and a thorough understanding of our problem, a decompression routine was created that not only <strong>beats all known methods previously created for 8088</strong>, but can actually <strong>exceed the speed of a memcopy</strong> given the right input. But to see how this was achieved, you&#8217;ll have to grab a snack and settle down for 10 minutes.</p>
<p>Now, on with our case study.</p>
<p><span id="more-911"></span></p>
<h1>Background</h1>
<p>My interest in speed optimization stems from being a lifelong fan of the <a href="http://en.wikipedia.org/wiki/Demoscene">demoscene</a>. I&#8217;ve written <a href="http://www.pouet.net/groups.php?which=541">some productions</a> and unleashed <a href="http://www.oldskool.org/pc/8088_Corruption">a few cheap tricks</a> here and there, but my core strength has actually been &#8220;glue&#8221; &#8212; understanding the underlying hardware and marrying the code to it. For example, while I coded a few effects in <a href="http://www.pouet.net/prod.php?which=2500">Explicit</a>, my core role was actually assembling the demo itself &#8212; the timer/interrupt system, the music library, the 3D library, asset management, decompression, debugging, event handling, etc. all fell to me. And that&#8217;s fine, I enjoy doing it. (Next time you run Explicit, hold down the ALT key and you&#8217;ll see some realtime debug stats overlayed onscreen while the demo is running.) So this is why I tend to write the underlying framework of a demo before actually writing the individual effects, because if the framework is solid, the rest is &#8220;easy&#8221;. To me, anyway.</p>
<p>For many years, I&#8217;ve been threatening to write a proper demo for the 8088. 8088+CGA has been done a few times back in the day by <a href="http://www.pouet.net/groups.php?which=1398">Sourcerers</a>, and there was a nice <a href="http://www.pouet.net/prod.php?which=19250">slideshow+music demo done for the Tandy 1000</a> as part of the <a href="http://www.pouet.net/party.php?which=204&amp;when=1996">8086 compo</a>, but there really hasn&#8217;t been a proper demo for the 8088 &#8212; 3D, graphics hardware tricks, nice design, the works. Every year I get closer, writing another piece of something that will eventually turn into a demo. A month ago, that piece turned out to be a need for fast decompression. (What I am going to use fast decompression for is left as an exercise for the democoder!) And by fast, I mean fast enough to be considered transparent: The user/programmer should not be aware that the decompression step took any time at all. Democoder parlance for this is &#8220;realtime&#8221; decompression.</p>
<p>So, a proper definition of the problem we&#8217;re trying to solve would be:</p>
<ul>
<li>We need to store data on disk in a form that takes up less space than its normal working state (ie. compression must actually occur &#8212; you can&#8217;t shrink 16 bytes out of a 64KB file and then call it a day)</li>
<li>To be useful for most situations, we must be able to decompress the data with a minimum of work for the programmer (ie. one simple call with no special preparation or preexisting state required)</li>
<li>Decompression must be fast enough to be considered transparent to the programmer (ie. take not much more time than a straight copy of the uncompressed data would)</li>
</ul>
<p>For that last stipulation to be quantifiable, we need to decide what &#8220;fast enough&#8221; is. For our purposes, we will define &#8220;fast enough&#8221; to be roughly 4x slower than a straight memory copy (which 8088/8086 implements as a REP MOVSW). That kind of speed is respectable on any platform, so this seems like a fair starting point to gauge our progress.</p>
<h1>The (de)Compression Method</h1>
<p>So, what compression format will we write a decompression routine for? What formats lend themselves to fast decompression? What formats are even <em>possible</em> to decompress on our lowly 8088 with RAM that is measured in kilobytes instead of gigabytes? The answer, it turns out, is obvious &#8212; but only if you know what to look for. Like compression itself, we have to take a long time researching our problem before coming to a short conclusion.</p>
<h2>A Quick Primer</h2>
<p>Before picking a compression format to use, I will offer this extremely short primer to readers unfamilar with compression basics, so that the rest of the article will make sense. If you&#8217;re already familiar with what compression is, skip this part.</p>
<p>For our purposes, compression is the process of removing the redundancy out of a file so that it consists of only the unique parts and not the repeated or redundant parts. Consider this sentence:</p>
<p style="padding-left:30px;">She sells seashells by the seashore. (36 characters)</p>
<p>You can see that both &#8220;sells&#8221; and &#8220;seashells&#8221; share a sequence of letters (&#8220;ells &#8220;), as does &#8220;seashells&#8221; and &#8220;seashore&#8221; (&#8220;seash&#8221;). If we notice this and assign a custom code to both pieces (ie. <strong>AA</strong>=&#8221;ells &#8221; and <strong>BB</strong>=&#8221;seash&#8221;), and then replace those portions of the sentence with the codes, we can shorten the space the sentence takes up:</p>
<p style="padding-left:30px;">She s<strong>AABBAA</strong>by the <strong>BB</strong>ore. (24 characters)</p>
<p>Was actual compression achieved? Yes, because while the codes and what they represent take up space, we got to use them twice each. A code takes up two characters, but it represents five characters. So the sentence+codes take up 24 characters in compressed form, and the code definitions take up 10 more characters, so our total space usage is 34 characters compared to the original 36.</p>
<p>Saving two characters is nothing to write home about, but that was a single sentence. When you extend the idea to an entire novel, you begin to see how the coded sequences can get used more and more often until you have real space savings on your hands. We only used our codes twice, but across an entire novel, and combined with other codes, they&#8217;ll get used thousands of times, saving bytes here and there each time.</p>
<h2>A Quick Primer (For Programmers)</h2>
<p>There are many ways to compress data but the fastest methods are almost universally based on <a href="http://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77">LZ77</a>. LZ77 produces a compressed format that boils down to two types of sequences:</p>
<ul>
<li>Data that must be inserted directly into the target buffer (because we couldn&#8217;t find smaller ways to represent it), called LITERALS</li>
<li>Data we already have somewhere that can be copied into the target buffer, called MATCHES</li>
</ul>
<p>In our quest for high-speed decompression, we will only be considering LZ77-style compression methods. Not only are they fast to decode, but they&#8217;re also very easy to understand.</p>
<p>Again, the above is oversimplified for our purposes. For an excellent write-up on compression methods for low-resource platforms such as 8-bit CPUs, consult <a href="http://www.cs.tut.fi/~albert/Dev/pucrunch/">Pasi Ojala&#8217;s pucrunch page</a>.</p>
<h2>What To Compare Against</h2>
<p>If you asked most DOS users in the early 1990s what the fastest compression/decompression software was, most of them would likely answer PKZIP. PKZIP was popular precisely because of its speed and reasonably good compression, and was so popular that it&#8217;s a format much of the world still uses more than 20 years later. PKWare released a <a href="http://books.google.com/books?id=TFAEAAAAMBAJ&amp;pg=PA16&amp;lpg=PA16&amp;dq=pkware+%22data+compression+library%22+dos&amp;source=bl&amp;ots=yHoNMygFtB&amp;sig=ZNm3wtNUqPM-sczOuv34BTB-d3Y&amp;hl=en&amp;sa=X&amp;ei=I7TsUI-kKO-42QX7zoCgDA&amp;ved=0CGUQ6AEwBw#v=onepage&amp;q=pkware%20%22data%20compression%20library%22%20dos&amp;f=false">Data Compression Library</a> (DCL) of assembler-optimized routines for compression and decompression in 1991 for commercial use, which perform at roughly the same speed and ratio as PKZIP.</p>
<p>If this library exists, why are we bothering to write our own decompression routine? Why not just use the DCL for our needs? We&#8217;re writing our own because we want to explore what the state of the art can be for the 8088, and also because we aren&#8217;t sure what the state of the art actually is. Since the DCL was considered by many to be the best overall solution in terms of compression ratio and speed, that is the benchmark we will compare ourselves to. (It also helps that the DCL&#8217;s execution speed can be exactly timed just like we will be timing our code &#8212; more on timing later in this article.) In other words, if we can beat the DCL, we must be doing well.</p>
<p>(Compression nerds like myself may point out that the DCL uses Implode rather than PKZIP&#8217;s <a href="http://en.wikipedia.org/wiki/DEFLATE">DEFLATE</a>, but <a href="http://encode.ru/threads/1652-Research-question-Difference-between-quot-implode-quot-vs-quot-deflate-quot">the two are nearly identical</a> so I feel it is a fair comparison to use the DCL.)</p>
<h2>The Current State Of The Art</h2>
<p>There are many high-speed compression/decompression open-source libraries in use today. The oldest one still in wide use is <a href="http://www.oberhumer.com/opensource/ucl/">UCL</a>, written in the mid 1990s; there are newer ones written in the last five years that routinely compete for the top speed spot, such as <a href="http://www.quicklz.com/">QuickLZ</a>, <a href="http://code.google.com/p/snappy/">Snappy</a>, and <a href="http://fastcompression.blogspot.com/p/lz4.html">LZ4</a>. My original idea was to examine all four of these to see what made the most sense to implement on the 8088. UCL was appealing because it had assembler code already written for the 8088/8086 as part of the library, but it was full of conditional branches and bit shifting/isolation, something the 8088 just isn&#8217;t very good at; there is also no published UCL data format (as far as I could find) so if I ran into issues, I&#8217;d likely be out of luck. QuickLZ is C code that assumes the underlying architecture is 32-bit or better, so while I could have written a decompression routine for QuickLZ data, it would have involved a lot of 32-bit memory values, adding to the complexity of the implementation. So both of these were out pretty quickly.</p>
<p>Snappy is Google&#8217;s library, and it looked very promising, mostly because it was implemented the way I would have written my own compression format: Simple code expansion, variable lengths, codes that are packed into data aligned by bytes. Source and <a href="http://code.google.com/p/snappy/source/browse/trunk/format_description.txt">format are fully documented</a>, easy to understand, and in use by Google. No real downsides, right?</p>
<p>Snappy <em>was</em> going to be my first choice, but then I researched <a href="http://code.google.com/p/lz4/">LZ4</a>. As soon as I saw LZ4, I knew immediately it was the correct choice for the 8088 and got very excited. Not only was it the right choice for ease of implementation on 8088, but a unique design decision for the format lent itself to speed that I hadn&#8217;t seen before. Here&#8217;s what got me so excited:</p>
<p style="padding-left:30px;"><strong>Interleaved literal-match structure</strong>: This is the innovative discovery of LZ4. Yann Collet (the author of LZ4) realized that all compressed LZ77 data consisted of both literal runs and match runs, so rather than try to devise complicated codes that branch based on run type, he organzied the format so that there are always literals, then matches, then literals, then matches, etc. repeating until the end of the compressed data. This eliminates a lot of literal/matchcode-based branching. There are really only three branches ever required for decompressing LZ4: Two length calculations (and only if they&#8217;re needed), and a check to see if we&#8217;re out of codes to expand. <strong>Those three are the only major conditional branches!</strong> This is REALLY HUGE and is why LZ4 is at <a href="http://mattmahoney.net/dc/text.html">the top of the speed charts</a> for nearly every platform.</p>
<p style="padding-left:30px;"><strong>64KB window size, 16-bit offsets</strong>: A 64K window size means that decompressing LZ4 doesn&#8217;t need any special handling &#8212; if you only have 64K to decompress (likely on our platform), you don&#8217;t have to worry about switching segments after the first 64K. And a 16-bit offset is a single word read, no unpacking. It&#8217;s like LZ4 was specifically created for <a href="http://en.wikipedia.org/wiki/Intel_Memory_Model#Memory_models">Intel memory models</a>, but it wasn&#8217;t &#8212; it was actually created in the very early 1990s for Yann&#8217;s HP48 calculator, which used a CPU based on nybbles. Which explains the code packing in the next advantage:</p>
<p style="padding-left:30px;"><strong>Simple codes</strong>: The literal lengths and match lengths are, if 14 or lower, stored as two nybbles in the same byte. That means both can be read with a single byte read and then cached as necessary. Even if the lengths are larger than 14, it only takes a few byte reads to get the full length. No wacky code unpacking like <a href="http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Stac">LZS</a> or higher <a href="http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Oberhumer">LZO</a> levels.</p>
<p style="padding-left:30px;"><strong>No setup</strong>: All it takes to decompress one buffer into another is both buffers &#8212; no hash tables to initialize, no dictionary to load or build, no need to know the length of the decompressed size beforehand, etc.</p>
<p style="padding-left:30px;"><a href="http://www.cbloom.com/algs/dictionary.html#optimal"><strong>Optimal Parsing</strong></a>: This is the secret sauce. It has nothing to do with how we will write our decompression routine, but it does have to do with decent compression ratios. And also speed, because LZ77-style compression schemes decompress in mostly linear time. Meaning, the smaller a file is, the faster it will decompress (ie. there is less actual work to do). LZ4_HC is the LZ4 variant that will take as much time as it needs to find the absolute perfect representation of the source data given the supplied encoding, and it is included in the LZ4 library and example programs.</p>
<p>All of the above makes LZ4 a winner for our architecture. But is it a winner for our workflow? If LZ4 was proprietary and difficult to use, that could be a problem. With stable vetted code, a BSD license, and Windows and Linux binaries for the compressor, it is a good fit for most cross-development workflows. (Most modern hobbyist retroprogramming is cross-development, with only speed-sensitive code requiring the actual hardware for testing.)</p>
<p>I&#8217;m not the only one to come to this conclusion; LZ4 is finding its way into tons of things from <a href="https://issues.apache.org/jira/browse/HADOOP-7657?focusedCommentId=13170733&amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13170733">Apache Hadoop</a> to <a href="http://wiki.illumos.org/display/illumos/LZ4+Compression+In+ZFS">Solaris kernels</a>. Buy Yann a beer the next time you see him.</p>
<h2>A Naive Implementation</h2>
<p>Starting with only the <a href="http://code.google.com/p/lz4/source/browse/trunk/lz4_format_description.txt">format description</a> and format diagram, I was able to code up a naive but functional decompressor in about half an hour in assembly. Normally I would have written it up in a HLL first to make sure my understanding was sound, but the format was so simple I thought that assembly would have been just as fast to code, and it was. I won&#8217;t reproduce 200 lines of assembler code here (a link to the finished code will come later), but it might help to know how I organized the routine:</p>
<p>DS:SI &#8211; Location of compressed data (the source)<br />
ES:DI &#8211; Location of decompressed data (the target)<br />
AX &#8211; scratch<br />
BX &#8211; translation table<br />
CX &#8211; loops, literal/match run lengths<br />
DX &#8211; &#8220;cache&#8221; for literal and match length token<br />
BP &#8211; size of compressed data (so we know when to stop!)</p>
<p>Here is what compressed LZ4 data looks like:</p>
<p><a href="http://trixter.oldskool.org/2013/01/18/optimizing-for-the-8088-and-8086-cpu-part-3-a-case-study-in-speed/lz4_format/" rel="attachment wp-att-941"><img class="aligncenter size-full wp-image-941" alt="LZ4_format" src="http://trixter.files.wordpress.com/2013/01/lz4_format.png?w=632&#038;h=132" width="632" height="132" /></a></p>
<p>Yes, it really is this simple, which means you should be able to code up a naive implementation just from looking at the above diagram and reading <a href="http://fastcompression.blogspot.com/2011/05/lz4-explained.html">the format explanation</a>.</p>
<h1>Assume Nothing!</h1>
<p>The #1 suggestion I can give anyone trying to optimize code has nothing to do with either assembler or the 8088: Benchmark, benchmark, benchmark. Know exactly how fast your code runs <em>on the hardware you are targeting</em>. If you don&#8217;t, you don&#8217;t have a basis for comparison and are flying blind when you optimize.</p>
<p>Following my own advice, I wrote a test harness for the decompression code and linked it with a modified version of <a href="http://www.phatcode.net/res/224/files/html/ch03/03-01.html">Michael Abrash&#8217;s Zen Timer</a>, which gives nearly perfect microsecond timing of sections of code using the <a href="http://en.wikipedia.org/wiki/Intel_8253">8253 PIT</a> built into (or emulated in) every PC. I then created a variety of &#8220;test subjects&#8221; to run through the decompressor, and made sure the test harness compared the output of the routine with the original source material to verify it wasn&#8217;t getting mangled on output. I chose three typical files to do most of my timing with &#8212; &#8220;typical&#8221; in that they were the most likely things I would be decompressing: Compiled code, plain-English text, and a hand-drawn CGA picture. Each had their strengths and weaknesses and provided different stresses to the routine: The picture had a lot of large matches, the text had a lot of small matches, and the binary didn&#8217;t have much of either. The picture also had a lot of &#8220;runs&#8221; where a single value was repeated. Measuring with the Zen Timer, all three datatypes took a total of 530434 microseconds (usecs), or 0.53 seconds, to decompress.</p>
<p>After checking the output was correct for my test data, I then proceeded to write a harness for PKWare&#8217;s DCL that did the same thing: Compressed all three test subjects into its own format, then decompressed all three to memory and recorded the decompression time. While I knew the DCL traded some size for speed, it was still the fastest general-purpose algorithm in use at the time so I was expecting some real competition. To my surprise, the DCL took 7.75 seconds to decompress the test data &#8212; over <span style="text-decoration:underline;">14 times</span> slower!</p>
<p>Thoroughly satisfied, I almost stopped right there, as my goal of beating the DCL was already accomplished. But I just couldn&#8217;t help thinking what a proper optimization would do, and exactly how both perform on more different types of data (was my sample size too small?), so I decided to go through with the optimization exercise anyway.</p>
<h1>Chapter 27, In Which It Blows Up In My Face</h1>
<p>I&#8217;m not going to cover every optimization in meticulous detail, because that would likely lose what few readers have made it to this point. However, one optimization attempt deserves special attention for the fact that it uncovered a bug in all Intel x86 CPUs made through the 80286, and illustrates the importance of having a proper test harness for your code.</p>
<p>Looking closer at how I chose to copy matched data around in the ES:DI destination buffer, it seemed wasteful to preserve DS, point DS to the match, then restore DS when I was only copying a handful of bytes in some cases. Most memory operations on 8088 can take a segment override, even the string operations in some cases, so with a single prefix you can turn this:</p>
<pre class="brush: plain; title: ; notranslate">
MOVSB           ; Copy a byte from DS:SI to ES:DI
</pre>
<p>&#8230;to this:</p>
<pre class="brush: plain; title: ; notranslate">
ES: MOVSB       ; Copy a byte from ES:SI to ES:DI
</pre>
<p>So, I got rid of the DS setup/restore code, changed REP MOVSB to REP ES: MOVSB, and patted myself on the back. Imagine my horror when a test run showed the output buffer had entire chunks that were either <strong>incorrect</strong> or <strong>in the wrong place</strong>. Worse, on a subsequent run, it was still wrong but in <em>different</em> places! I spent hours single-stepping through the code in a debugger, looking for things like uninitialized registers or incorrect compressed data. Finding nothing wrong, I then spent another hour testing my hard disk and RAM to see if my 30-yr-old IBM 5160 was finally starting to die.</p>
<p>Finding nothing, and noting that the code worked if I reverted my changes, I looked at REP ES: MOVSB and wondered if I was encoding it improperly. So I switched the order of the prefixes to ES: REP MOVSB. This resulted in the <strong>jaw-dropping </strong>result of<strong> mangling the entire output buffer</strong>. What the hell was going on?</p>
<p>With some research,  and clarification from Robert Wessel on comp.lang.asm.x86, I confirmed that all CPUs from the 8086 through the 80286 have a bug where returning from an interrupt only resumes the most recent prefix, not both. So after an interrupt, a REP ES: MOVSB continues as ES: MOVSB which copies a single byte and then stops. My second attempt made things worse, as an interrupted ES: REP MOVSB continues as REP MOVSB which, without the ES: override, copies data from the wrong location!</p>
<p>One way to fix this is to disable interrupts before you run that code, then re-enable when done, but I didn&#8217;t want to do that because you never know if someone will need interrupts to run while decompression is occuring. (I know I do, anyway.) I decided to work around the problem like this:</p>
<pre class="brush: plain; title: ; notranslate">
again:  REP ES: MOVSB   ; could get interrupted and bug out...
        JCXZ next       ; continue if REP completed
        LOOP @again     ; keep trying if REP never completed
next:
</pre>
<p>With a fix in place, and valid output confirmed, I timed the code. After all that heartache, I found that the overall routine slowed down by 8209 cycles, because the ES: override adds two cycles to every byte copy. The entire concept was a bust, so I reverted the code.</p>
<p>This just goes to show you why timing your code is important. In your head or on paper, some optimizations can seem like a win, but conditions outside your understanding or control can affect the final result.</p>
<h1>It&#8217;s Obvious</h1>
<p>Some optimizations, using the information provided in part 1 and part 2 of this guide, were easy to implement and usually didn&#8217;t result in a lot of code shuffling around. Here&#8217;s an abbreviated table of what was done and how many cycles it saved. (Remember, the three test cases took roughly 500000 usec to execute, so every 5000 usecs saved is 1% shaved off the execution time.)</p>
<table border="1">
<tbody>
<tr>
<th>Optimization</th>
<th>usec Savings</th>
</tr>
<tr>
<td height="20"></td>
<td></td>
</tr>
<tr>
<td height="20">Replacing &#8220;ADD CX,4&#8243; with &#8220;MOVSW; MOVSW&#8221;</td>
<td align="right">2573</td>
</tr>
<tr>
<td height="20">Isolating upper nybble using a translation table instead of &#8220;MOV CL,4; SHR AL,CL&#8221;</td>
<td align="right">4087</td>
</tr>
<tr>
<td height="20">Rearranging register use so that AL/AX is used for scratch more than DX is</td>
<td align="right">8414</td>
</tr>
<tr>
<td height="20">Change &#8220;MOV DX,AX&#8221; to &#8220;XCHG DX,AX&#8221;</td>
<td align="right">8712</td>
</tr>
<tr>
<td height="20">Change &#8220;CMP CL,immed&#8221; to &#8220;CMP AL,immed&#8221;</td>
<td align="right">3430</td>
</tr>
<tr>
<td height="20">Rearranging length build to fall through for the common case, and jump only for the uncommon case</td>
<td align="right">12146</td>
</tr>
<tr>
<td height="20">Change all instances of &#8220;MOV reg,AX&#8221; to &#8220;XCHG reg,AX&#8221;</td>
<td align="right">4028</td>
</tr>
</tbody>
</table>
<p>Not everything I touched turned to gold. Here is a summary of optimization attempts that failed and were subsequently rolled back:</p>
<ul>
<li>Eliminating a &#8220;nothing to do&#8221; check (turns out the check-and-jump saved us some time after all)</li>
<li>Eliminating the REP MOVSW optimization f0r literal copies (I thought the special handling wasted time, but the MOVSW gains are worth the trouble)</li>
<li>Handling very short literal lengths manually with individual MOV&#8217;s (as opposed to letting REP MOVS do it)</li>
<li>Handling very short match lengths manually with individual ES: MOVSW statements (as opposed to letting the REP MOVS do it)</li>
</ul>
<p>With 43390 usecs saved, I was a man possessed: I wanted to speed it up further, but had run out of 8088 tricks. The only way I was going to continue on this journey was to gain further insight into the data I was dealing with, so I wrote an LZ4 data analyzer.</p>
<h1>Not So Obvious</h1>
<p>One of my favorite quotes from Zen of Assembly: &#8220;The best optimizer is between yours ears.&#8221; It alludes to dumb/blind optimization &#8212; what I was doing up until this point, working like a human peephole optimizer &#8212; being inferior to &#8220;smart&#8221; optimization, where you analyze the problem itself to come up with different ways to solve it.</p>
<p>I had made some assumptions about the structure and frequency of LZ4 data, so to confirm those assumptions, I wrote a simple program to walk through my compressed sample set and print out some stats: What the shortest lengths were, the longest, the averages, and anything else that might give me some ideas. Some sample output:</p>
<p style="padding-left:30px;">====== robotron.lz4 Compressed size: 21040 Decompressed size: 40704 =====<br />
Literals: Minimum: 0 Average: 3 Maximum: 385 Total: 11336 # of events: 3139<br />
Matches: Minimum: 4 Average: 9 Maximum: 512 Total: 28634 # of events: 3098<br />
1-byte runs: Minimum: 4 Average: 31 Maximum: 217 Total: 593 # of events: 19<br />
2-byte runs: Minimum: 4 Average: 6 Maximum: 14 Total: 141 # of events: 21</p>
<p>Looking at various outputs, I was struck by how many match offsets of 1 and 2 there were. Offsets that small, with lengths larger than the offsets, essentially translate into <a href="http://en.wikipedia.org/wiki/Run-length_encoding">RLE sequences</a>. LZ77 code usually deals with this by just copying the same bytes over and over, but x86 architecture has a string opcode that can do this more efficiently: REP STOS. Put a value into AL or AX, a count into CX, and off you go, filling memory with that value until the count runs out. What is especially notable about STOS is that it is <em>faster than every other instruction for putting a value in memory</em>, faster than even a raw REP MOVSW copy. So if you can use it, you can exceed memcopy speeds for short sections. Adding special handling for offsets of 1 and 2 and redirecting them to special-case code that used STOS resulted in a larger-than-expected 32281 usec savings all by itself &#8212; that&#8217;s the largest single savings out of all the attempts &#8212; and it also resulted in a special surprise which I&#8217;ll cover later.</p>
<p>After I ran out of ideas looking at the analyzer output, on a hunch I looked a the LZ4 format description a second time and noticed that, by design, the last five bytes are always literals. The current structure of the code would check for this exit condition, then process matches, then jump to the next token and continue. By unrolling some code to move the &#8220;are we done?&#8221; test to the end of the loop instead of the middle, I was able to combine both the test and the loop jump into a single instruction. This saved cycles every iteration, leading to the second largest savings at 10946 usecs.</p>
<p>The analyzer also confirmed some of my suspicions, such as <strong>most lengths were 14 or less</strong> and would rarely need to jump to the &#8220;build a longer length&#8221; section of the code.  By structuring the code such that the most common cases &#8220;fell through&#8221;, I was saving cycles each iteration.</p>
<p>So, when all was said and done, what was our time savings?</p>
<h1>Results</h1>
<p>After all of the above work (which incidentally took about ten hours of free time spread out over a few weeks), we managed to take an already fast routine and shave 95856 usecs from it &#8212; an <span style="text-decoration:underline;">18% improvement</span> from the already fast routine where we started.  Was 18% worth the effort? I definitely think so. It may not sound like much, but think about the savings like this: If a user would wait a full minute for decompression of a lot of data to finish, they now only have to wait 50 seconds. What was a 5-minute task now only takes 4 minutes. (And believe me, on an 8088, it wasn&#8217;t uncommon to be sitting in front of the machine waiting 5 minutes for something to finish.)</p>
<p>But that&#8217;s not the end of the story. Looking at more varied data than our three test subjects, we make an astonishing discovery (lower numbers are better):</p>
<table class="aligncenter" width="463" border="1" cellspacing="0" cellpadding="0">
<col width="153" />
<col width="108" />
<col width="95" />
<col width="107" />
<tbody>
<tr>
<td width="153" height="60">Data Type</td>
<td width="108">Filename</td>
<td width="95">memcpy() time in µs (REP MOVSW)</td>
<td width="107">Decompression Speed (x slower than memcpy)</td>
</tr>
<tr>
<td height="20">Sparse bitmap</td>
<td>shuttle.pic</td>
<td align="right">44989</td>
<td align="right">1.91</td>
</tr>
<tr>
<td height="20"><strong>RLE bitmap</strong></td>
<td><strong>rle.dmp</strong></td>
<td align="right"><strong>44977</strong></td>
<td align="right"><span style="color:#ff0000;"><strong>0.76</strong></span></td>
</tr>
<tr>
<td height="20">Small text file</td>
<td>text.txt</td>
<td align="right">13716</td>
<td align="right">3.17</td>
</tr>
<tr>
<td height="20">Large text file</td>
<td>largetxt.txt</td>
<td align="right">156457</td>
<td align="right">3.17</td>
</tr>
<tr>
<td height="20">Sparse compiled binary</td>
<td>robotron.com</td>
<td align="right">112036</td>
<td align="right">2.75</td>
</tr>
<tr>
<td height="20">Dense compiled binary</td>
<td>linewars.exe</td>
<td align="right">169924</td>
<td align="right">2.16</td>
</tr>
<tr>
<td height="20">Uncompressable data</td>
<td>random.bin</td>
<td align="right">176113</td>
<td align="right">1.39</td>
</tr>
</tbody>
</table>
<p>For data that has a lot of 1-byte and 2-byte runs &#8212; runs that we specifically catch and handle with REP STOSW, as noted previously &#8212; we see that decompression <em>exceeds REP MOVSW copy time</em>. <em><strong>It is actually faster to decompress such data than it is to merely copy it</strong></em>. That is crazy.</p>
<p>I&#8217;m still smug from the speed victory over the DCL, so let&#8217;s kick it while it&#8217;s down and compare its speed to ours (lower numbers are better):</p>
<table class="aligncenter" width="505" border="1" cellspacing="0" cellpadding="0">
<col width="153" />
<col width="178" />
<col width="174" />
<tbody>
<tr>
<td width="153" height="60">Data Type</td>
<td width="178">LZ4 Decompression Speed (x slower than memcpy)</td>
<td width="178">PKUNZIP &#8220;Explode&#8221; Speed (x slower than memcpy)</td>
</tr>
<tr>
<td height="20">Sparse bitmap</td>
<td>1.91</td>
<td>20.50</td>
</tr>
<tr>
<td height="20">RLE bitmap</td>
<td>0.76</td>
<td>5.79</td>
</tr>
<tr>
<td height="20">Small text file</td>
<td>3.17</td>
<td>61.21</td>
</tr>
<tr>
<td height="20">Large text file</td>
<td>3.17</td>
<td>54.43</td>
</tr>
<tr>
<td height="20">Sparse compiled binary</td>
<td>2.75</td>
<td>53.51</td>
</tr>
<tr>
<td height="20">Dense compiled binary</td>
<td>2.16</td>
<td>70.08</td>
</tr>
<tr>
<td height="20">Uncompressable data</td>
<td>1.39</td>
<td>116.14 (no special handling)</td>
</tr>
</tbody>
</table>
<p>Now, all this doesn&#8217;t mean anything if the actual compression LZ4 provides is horrible. Thanks to optimal parsing, it&#8217;s not &#8212; in fact, compared to the DCL&#8217;s Implode, it&#8217;s extremely close. LZ4 and Implode differ by only a few percentage points:</p>
<h1><a href="http://trixter.oldskool.org/2013/01/18/optimizing-for-the-8088-and-8086-cpu-part-3-a-case-study-in-speed/lz4_pkware_sizes/" rel="attachment wp-att-938"><img class="aligncenter size-full wp-image-938" alt="lz4_pkware_sizes" src="http://trixter.files.wordpress.com/2013/01/lz4_pkware_sizes.png?w=724&#038;h=422" width="724" height="422" /></a></h1>
<h1>Conclusion and Downloads</h1>
<p>Hopefully I&#8217;ve illustrated why optimization can be worth the effort. Having transparant decompression can solve a lot of problems in any program that has to manage a lot of assets. And maybe I&#8217;m crazy, but I found it extremely fun to see just how much blood I could squeeze from a stone.</p>
<p>Can the routine be sped up further? It can, actually, but doing so would require a lot of additional work on the part of the programmer (such as storing the compressed data on the stack and using POP to retrieve data).  I also toyed with the idea of translating the LZ4 compressed data into a slightly different format that was more optimal to parse, but some quick tests showed that the transformed data is slightly larger as a result, which resulted in more data to read, which took up more time than the cycles saved by a more efficient implementation. About the only thing I can think of is that it might make sense to build literal/match lengths using REP SCASW looking for a word that wasn&#8217;t FFFF, but only if you knew had large lengths beforehand in your compressed data, which is unlikely.</p>
<p>So, as is, I believe this to be the very fastest implementation of LZ4 decompression possible on an 8088 CPU.  All this in 436 bytes of compiled code (180 for the code and 256 for a translation table), and without requiring the programmer to jump through hoops to use it.  This was a blast.</p>
<p>All <a href="http://www.oldskool.org/pc/lz4_8088">code, binaries, and examples</a> are available under what I&#8217;m calling <a href="http://www.oldskool.org/pc/lz4_8088/#li">the DSL (Demoscene License)</a> so <a href="http://www.oldskool.org/pc/lz4_8088/#do">leech away</a>. I&#8217;ve also made two versions of the Zen Timer available; <a href="ftp://ftp.oldskool.org/pub/misc/ZTIMER11.ZIP">an older package</a> that extends support to C and Turbo Pascal, and <a href="ftp://ftp.oldskool.org/pub/misc/ZTIMER23.ZIP">a newer package</a> that drops TP support but adds 32-bit protected mode C compiler support. Both packages have a &#8220;long timer&#8221; mode that can time periods larger than 54ms, albeit with a hair of jitter due to background interrupt noise.</p>
<p>Now, anyone want to help teach me fast 3D?  This demo won&#8217;t write itself, ya know.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/programming/'>Programming</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/911/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/911/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=911&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/01/18/optimizing-for-the-8088-and-8086-cpu-part-3-a-case-study-in-speed/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>

		<media:content url="http://trixter.files.wordpress.com/2013/01/lz4_format.png" medium="image">
			<media:title type="html">LZ4_format</media:title>
		</media:content>

		<media:content url="http://trixter.files.wordpress.com/2013/01/lz4_pkware_sizes.png" medium="image">
			<media:title type="html">lz4_pkware_sizes</media:title>
		</media:content>
	</item>
		<item>
		<title>Optimizing for the 8088 and 8086 CPU: Part 2</title>
		<link>http://trixter.oldskool.org/2013/01/11/optimizing-for-the-8088-and-8086-cpu-part-2/</link>
		<comments>http://trixter.oldskool.org/2013/01/11/optimizing-for-the-8088-and-8086-cpu-part-2/#comments</comments>
		<pubDate>Sat, 12 Jan 2013 03:02:59 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=894</guid>
		<description><![CDATA[Welcome back to our little crash course on how to optimize code for maximum speed on the 8088 and 8086 CPU. Let&#8217;s jump right back in with a quick way to transmogrify the contents of a buffer. Lost In Translation Everyone knows that lookup tables trade memory for speed; if you can calculate all possible [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=894&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Welcome back to our little crash course on how to optimize code for maximum speed on the 8088 and 8086 CPU. Let&#8217;s jump right back in with a quick way to transmogrify the contents of a buffer.</p>
<p><span id="more-894"></span></p>
<h1>Lost In Translation</h1>
<p>Everyone knows that lookup tables trade memory for speed; if you can calculate all possible values for a particular operation, then performing the &#8220;calculation&#8221; is reduced to retrieving a value from the table. Intel thought of this when they were designing instructions to help with strings and created XLAT, which stands for &#8220;translate&#8221;. XLAT replaces AL with whatever AL is referencing in a table pointed to by DS:BX, and it does it in a single byte and takes only 11 cycles to do so. So you can replace this:</p>
<pre class="brush: plain; title: ; notranslate">
XOR AH,AH
MOV SI,AX
MOV AL,[BX+SI]
</pre>
<p>with this:</p>
<pre class="brush: plain; title: ; notranslate">
XLAT
</pre>
<p>Think of XLAT as &#8220;MOV AL,DS:[BX+AL]&#8221; (except that [BX+AL] is illegal on the 8088 and 8086.)  Intel meant for XLAT to be &#8220;useful for translating characters from one code to another, the classic example being ASCII to EBCDIC or the reverse,&#8221; but nothing says you have to use it with strings. I&#8217;ve used it as a replacement for isolating nybbles, because the 8088 is slow at shifting if you have to do it more than a few times. For example, I can replace this:</p>
<pre class="brush: plain; title: ; notranslate">
MOV CL,4
SHR AL,CL
</pre>
<p>with just XLAT, with BX pointing to a table that has all 256 values shifted right by 4.  While this burns 256 bytes for the table, the end result is a shift that finishes in half the time than Intel&#8217;s actual shift instruction.  This has saved my bacon in inner loops.</p>
<h1>Branching Out</h1>
<p>Conditional branches (jumping to another location based on the result of a test) are a necessary evil of most programming languages. Unfortunately, they cost you in two ways. The first is the obvious cost &#8212; a jump takes some time to perform, which is never quick. The second cost is more subtle, but just as valid: When a jump is performed, everything in the prefetch queue gets jettisoned, because it is no longer the correct stream of instructions to be executed. You really want the prefetch queue to be as full as possible most of the time, because when it isn&#8217;t, the CPU has to wait around for its BIU to grab instructions. This is less of a problem on the 8088 because it is hard to keep the queue full, but on the 8086 where it&#8217;s easy to keep the queue full, this is a real penalty.</p>
<p>For those who need an example of why this is important, let&#8217;s say you were a bit of a nerd who loved to research everything you did (not really a stretch because you&#8217;re reading this guide right now!), and your girlfriend wanted to visit an art museum. To save time, you fetched a set of art books to read on the way there before it was time to leave. But just before you leave, your girlfriend changes her mind and wants to go to a baseball game instead. The art books you&#8217;re carrying now don&#8217;t apply to where you&#8217;re going, so you dump them and start fetching books on baseball instead, and now you&#8217;re both going to be late because it takes time to fetch books. Your girlfriend changing her mind is a conditional branch being taken, and dumping the first set of books because they don&#8217;t apply any more is emptying the prefetch queue.</p>
<p>Because of this property, you should always be thinking of ways to eliminate branches. This can range from obvious solutions down to decidedly <a href="http://en.wikipedia.org/wiki/Multiple_rule-based_problems">non-linear thinking</a> to come up with a clever solution. This is difficult to visualize, so let&#8217;s look at a few examples. Let&#8217;s say you needed to set a register value to either 0 if it is even, or 4 if it was odd. Here&#8217;s a straightforward way to do this:</p>
<pre class="brush: plain; title: ; notranslate">
  TEST AL,1     ;test if first bit set
  JZ @even      ;if not, it is an even number
  MOV AL,4      ;odd number, set it to 4
  JMP @continue ;continue execution
@even:
  MOV AL,0      ;even number, set it to 0
@continue:      ;execution continues
</pre>
<p>This works, but no matter what the number is, you&#8217;re going to take a jump. Here&#8217;s a branchless way of doing the same thing, recognizing that 4 is a <a href="http://en.wikipedia.org/wiki/Power_of_two">power of two</a>:</p>
<pre class="brush: plain; title: ; notranslate">
AND AL,1        ;AL = either 0 or 1
SHL AL,1        ;Shift AL left (AL = AL * 2)
SHL AL,1        ;Shift AL left (AL = AL * 2)
                ;AL = 0 if it was originally even, 4 if odd
</pre>
<p>Let&#8217;s look at another common operation, converting a hex nybble value in AL to a printable ASCII character. First, the naive way:</p>
<pre class="brush: plain; title: ; notranslate">
  CMP AL,10     ;Digit or letter?
  JB @1         ;Jump if a digit
  ADD AL,7      ;Adjust for letters
@1:
  ADD AL,'0'    ;Convert to hex printable char
</pre>
<p>This works, sure, but if you stop and think about the problem for a few minutes, you might come up with a really cool branchless way to do the same thing, such as Norbert Juffa did:</p>
<pre class="brush: plain; title: ; notranslate">
CMP AL,10       ;if x&lt;10, set CF=1
SBB AL,69h      ;0-9: 96h..9Fh, A-F: A1h..A6h
DAS             ;0-9: subtract 66h -&gt; 30h-39h
                ;A-F: subtract 60h -&gt; 41h-46h
</pre>
<p>(Of course, XLAT is the fastest way, but if space is at a premium or BX isn&#8217;t free, XLAT isn&#8217;t an option.</p>
<p>Let&#8217;s not forget about LOOP. LOOP is a branching instruction as well, and every time it loops, you lose 17 cycles. If you know you&#8217;ll be looping only a small number of times, unroll the loop. So this:</p>
<pre class="brush: plain; title: ; notranslate">
  MOV CX,4
@trans:
  LODSB         ;load byte from DS:SI to AL; inc SI
  XLAT          ;translate using table at DS:BX
  STOSB         ;store byte in AL to ES:DI; inc DI
  loop @trans   ;decrease CX and loop while CX != 0
</pre>
<p>&#8230;turns into this:</p>
<pre class="brush: plain; title: ; notranslate">
LODSB           ;load byte from DS:SI to AL; inc SI
XLAT            ;translate using table at DS:BX
STOSB           ;store byte in AL to ES:DI; inc DI
LODSB           ;(do it three more times)
XLAT
STOSB
LODSB
XLAT
STOSB
LODSB
XLAT
STOSB
</pre>
<p>By unrolling the loop, we not only save 17 cycles per jump taken, but we have a better chance of keeping the prefetch queue full (and all three of those are 1-byte opcodes, so it&#8217;s definitely full).</p>
<p>If you <strong>absolutely must</strong> branch, at least try to arrange your code so that the common cases &#8220;fall through&#8221; the conditional branch. This is because a conditional branch takes 4 cycles if the jump is not taken, but 16 if it jumps. Arranging your code properly requires advance knowledge of the problem you&#8217;re trying to solve. For example, if you are processing some data and only one value needs special handling, arrange your code like this:</p>
<pre class="brush: plain; title: ; notranslate">
CMP reg,immed
JE @specialhandling
</pre>
<p>That way, most of the common cases will &#8220;fall through&#8221; in 4 cycles, with only the special case needing the full 16 cycles to jump to a new location for handling.</p>
<h1>Random Optimization Tip Firehose</h1>
<p>Use spare registers to preserve/restore variables when possible instead of the stack. If you need to preserve something and AX is free, XCHG AX,reg is smaller and faster than PUSH reg; POP reg.</p>
<p>Did you know JCXZ exists? JCXZ is a freebie left over from Intel implementing LOOP, and it jumps if CX=0, or falls through if it isn&#8217;t. So you can replace this:</p>
<pre class="brush: plain; title: ; notranslate">
OR CX,CX        ;test if CX is 0
JZ @somewhere   ;jump if it is
</pre>
<p>with this:</p>
<pre class="brush: plain; title: ; notranslate">
JCXZ @somewhere
</pre>
<h1>Putting It All Together</h1>
<p>Here are some random examples that illustrate what we&#8217;ve been talking about.</p>
<h2>Example 1: All programming can be viewed as an exercise in caching (Terje Mathisen)</h2>
<p>Translating a buffer from one set of values to another? String ops and XLAT are your friend:</p>
<pre class="brush: plain; title: ; notranslate">
@trans:
  LODSB         ;load byte from DS:SI to AL; inc SI
  XLAT          ;translate using table at DS:BX
  STOSB         ;store byte in AL to ES:DI; inc DI
  loop @trans   ;decrease CX and loop while CX != 0
</pre>
<p>Hey wait a second, we have 16-bit versions of those! We can use the 16-bit versions to speed things up by loading and storing two bytes at a time:</p>
<pre class="brush: plain; title: ; notranslate">
@trans:
  LODSW         ;load word from DS:SI to AL; SI=SI+2
  XLAT          ;translate AL using table at DS:BX
  XCHG AH,AL    ;swap AH and AH
  XLAT          ;translate AL again
  XCHG AH,AL    ;swap AH and AH
  STOSW         ;store word in AL to ES:DI; DI=DI+2
  loop @trans   ;decrease CX and loop while CX != 0
</pre>
<p>While the 8086 gets a bigger impact from this due to being able to snag both bytes in 4 cycles, it is still a speed win on 8088 because we are loading and storing double the bytes with the same 1-byte load/store string instructions. And although we have three more instructions sandwiched inbetween, the prefetch queue helps out just enough that the overall speed is faster than the first example.</p>
<h2>Example 2: Working in 16 bits, branchless</h2>
<p>Copying a block of memory around and you don&#8217;t know how large the block will be beforehand? The general-purpose way is this:</p>
<pre class="brush: plain; title: ; notranslate">
MOV CX,immed
REP MOVSB
</pre>
<p>That handles both even and odd lengths, but as we saw from the previous example, it is faster to do things 16 bits at a time. Here&#8217;s a way to use the 16-bit string ops and also correctly handle odd lengths, and all without branches:</p>
<pre class="brush: plain; title: ; notranslate">
MOV CX,immed
SHR CX,1        ;CX = CX / 2; even/odd bit went into carry
REP MOVSW       ;Copy by words
ADC CX,CX       ;Add carry to CX; CX = 1 if odd, 0 if even
REP MOVSB       ;Will copy either 1 byte if odd or do nothing if even
</pre>
<h2>Example 3: Instruction reordering</h2>
<p>Try to reorganize code with the prefetch queue in mind if changing the order of instructions doesn&#8217;t affect what your code is trying to do. Here&#8217;s a sample &#8220;before&#8221; sequence:</p>
<pre class="brush: plain; title: ; notranslate">
INC SI
ADD SI,BX
MUL CX
CMP AL,3
JBE loc
</pre>
<p>In the above, we notice that MUL takes a long time, there is a prefetch-queue-emptying jump shortly after it, and the stuff above the MUL isn&#8217;t dependent on or affect MUL&#8217;s result. So by simply rearranging some code to come after the MUL&#8230;</p>
<pre class="brush: plain; title: ; notranslate">
MUL CX
INC SI
ADD SI,BX
CMP AL,3
JBE locr
</pre>
<p>&#8230;we can guarantee the prefetch queue will fill up while the slow MUL is executing, and then what&#8217;s in the queue gets executed faster before the queue eventually gets emptied.</p>
<h1>Reference Materials and Further Reading</h1>
<p>Thus ends our coverage of general tips and tricks. Believe it or not, this article is really only a beginner&#8217;s guide to 808x optimization; for the most comprehensive coverage of writing fast 808x code, I highly recommend Michael Abrash&#8217;s seminal work on the subject, <a href="http://www.amazon.com/Zen-Assembly-Language-Knowledge-Programming/dp/0673386023">Zen of Assembly Language</a>. That book, as well as other helpful references for programming the 8088 (and CGA too) including Intel&#8217;s original documentation on the 8086, can be found inside <a href="ftp://ftp.oldskool.org/pub/misc/8088%20Programming.rar">ftp://ftp.oldskool.org/pub/misc/8088%20Programming.rar</a> if you can&#8217;t find a dead tree copy elsewhere (everything in that archive is long out of print). All PDFs inside the archive have been OCR&#8217;d and are searchable.  (One note about the Intel&#8217;s 8086 documentation: All timings are for both byte and word transfers.  If you&#8217;re counting cycles on 8088, be sure to add 4 additional cycles for word transfers.)</p>
<p>There are some additional techniques for gaining even more speed on the IBM PC that are not specifically 8088-related, such as temporarily disabling DRAM refresh, copying memory using the DMA controller, or getting the entire machine into lockstep so that you can use software timing for events instead of interrupts. Those are highly specialized and beyond the scope of this guide, so I won&#8217;t be covering them any time soon, sorry.  (They&#8217;re also difficult to pull off without crashing the computer, and don&#8217;t work on machines that aren&#8217;t truly 100% compatible with the original IBM PC, so you&#8217;re not missing much.)</p>
<p>In Part 3, I&#8217;ll show you how I utilized all of the above knowledge to implement realtime decompression on the 8088 (and by &#8220;realtime&#8221; I mean &#8220;decompression faster than REP MOVSW&#8221;). Not a misprint! Stay tuned.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/programming/'>Programming</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/894/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/894/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=894&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/01/11/optimizing-for-the-8088-and-8086-cpu-part-2/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Optimizing for the 8088 and 8086 CPU: Part 1</title>
		<link>http://trixter.oldskool.org/2013/01/10/optimizing-for-the-8088-and-8086-cpu-part-1/</link>
		<comments>http://trixter.oldskool.org/2013/01/10/optimizing-for-the-8088-and-8086-cpu-part-1/#comments</comments>
		<pubDate>Thu, 10 Jan 2013 21:00:16 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=871</guid>
		<description><![CDATA[There is a small but slowly growing hobby around retroprogramming for old PCs and compatibles. This hobby has existed for decades for other platforms, as evidenced by the active demoscenes on each retro platform, but the IBM PC (and other 4.77MHz 8088 compatibles) has only recently started to gain that same sort of attention. As [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=871&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>There is a small but slowly growing hobby around retroprogramming for old PCs and compatibles. This hobby has existed for decades for other platforms, as evidenced by the active demoscenes on <a href="http://www.pouet.net/prodlist.php?platform%5B%5D=Commodore+64&amp;order=&amp;x=23&amp;y=4&amp;page=1&amp;order=">each</a> <a href="http://www.pouet.net/prodlist.php?platform%5B%5D=ZX+Spectrum&amp;order=&amp;x=31&amp;y=7&amp;page=1&amp;order=">retro</a> <a href="http://www.pouet.net/prodlist.php?platform%5B%5D=Atari+XL%2FXE&amp;order=&amp;x=28&amp;y=7&amp;page=1&amp;order=">platform</a>, but the IBM PC (and other 4.77MHz 8088 compatibles) has only recently started to gain that same sort of attention. As a public service to the 8088 retroprogramming community &#8212; &#8220;All four of you, huh?&#8221; &#8212; I&#8217;ve decided to write a crash-course on optimizing your code for maximum speed on the 8088. This information is targeted to people who already know either modern x86 assembly or assembly for other CPUs, and are programming for the 8088 or 8086 for the first time (or the first time in a long while).</p>
<p><span id="more-871"></span></p>
<p>Before we begin, let me clarify that while I&#8217;m using &#8220;8088&#8243; throughout most of this text, what I am writing applies equally to the 8086 as well. The 8086 and 8088 are functionally identical, with the 8086 being slightly faster due to a having a 16-bit bus and a larger prefetch queue, both of which are covered later. Despite the extra speed, what holds for 8088 optimization also applies to the 8086, so you can just equate the two for the remainder of this guide.</p>
<p>Contrary to what you might think about a CPU old enough to be Justin Bieber&#8217;s father, it is possible to wring acceptable speed out of an 8088 if you understand the situation most 8088s are forced into (the slow RAM of the IBM PC) and how to deal with it, as well as the CISC-like advantages the chip has. By understanding both, it is possible to write assembly code that can run faster than the best 6502 or Z80 code at similar clock speeds. Let&#8217;s look at both sides, and because I like hearing good news after bad, we&#8217;ll start with the bad news.</p>
<h1>Disadvantages of the 8088</h1>
<p><span style="text-decoration:underline;"><strong>Slow RAM access</strong></span>. While other CPUs of the 1970s enjoy single-cycle access to a byte of memory, the 8088 takes 4 cycles to access a byte. The 8086 is a little better, and can access either one or two bytes in 4 cycles.</p>
<p><strong><span style="text-decoration:underline;">Tiny prefetch queue</span></strong>. <a href="http://en.wikipedia.org/wiki/Intel_8086#Performance">The 8088 is made up of two halves</a>, the Execution Unit (EU) and the Bus Interface Unit (BIU). They can work more or less independently, with the BIU grabbing the next instruction opcodes while the EU works on the previous ones. The only drawback to this arrangement is that the BIU only has a 4-byte buffer (the prefetch queue). So it can only &#8220;cache&#8221; up to 4 bytes in advance to feed the EU. As you can imagine, it is empty most of the time, because instructions execute faster than they can be fetched thanks to the sucky access time I mentioned in the previous paragraph. The 8086, again, is a little better; it has a 6-byte queue that it can usually keep full thanks to it&#8217;s faster RAM access.</p>
<p><span style="text-decoration:underline;"><strong>Register specialization</strong></span>. The 8088 has four general-purpose registers, but all four of them are tied to specialized functions that you can&#8217;t use if you&#8217;re using them for, well, general purposes. For example, it&#8217;s possible to do a tight loop of some operations, but that uses CX as the counter, so you can&#8217;t use CX inside the loop.</p>
<h1>Advantages of the 8088</h1>
<p><span style="text-decoration:underline;"><strong>CISC architecture</strong></span>. <a href="http://en.wikipedia.org/wiki/Complex_instruction_set_computing">CISC</a> was all the rage at Intel in 1976, so they built in some &#8220;metainstructions&#8221; that do several things with a single opcode. For example, MOVSB will copy a byte from DS:SI to ES:DI, then advance both SI and DI so you can do it again, and it does all three in much less time than if you did it yourself. Couple MOVSB with the REP prefix and you can do this repeatedly at high speed. XLAT is another one, which will replace a register value with a like value in a translation table. We&#8217;ll cover some of the better ones later in this guide.</p>
<p><span style="text-decoration:underline;"><strong>Multiplication and division</strong></span>. Unlike most home computer CPUs of its era, the 8088 has a built in MUL and DIV. If you need to do 16-bit multiplies or divisions where the operands/divisors are not known beforehand, nothing beats them. (If you need to mul/div smaller values, however, they&#8217;re slower than they should be and you can usually beat them using <a href="http://en.wikipedia.org/wiki/Multiplication_algorithm#Quarter_square_multiplication">Quarter Square Multiplication</a> or<a href="http://en.wikipedia.org/wiki/Multiplication_algorithm#Shift_and_add"> shift-and-adding</a>.)</p>
<p><span style="text-decoration:underline;"><strong>Register specialization</strong></span>. Hey, didn&#8217;t we mention this previously as a negative? Yes, but sometimes the specialization works in our favor. For example, some opcode encodings that use the accumulator (AX) are only a single byte in size, and as we&#8217;ll see later on, smaller is better. Heck, let&#8217;s start now:</p>
<h1>Smaller Is Better</h1>
<p>Because it takes 4 cycles to read a byte, and because the prefetch queue is so tiny, smaller code is usually better. When writing or optimizing your code, keep the following chart handy, which lists all general-purpose 8088 1-byte opcodes. (This is not a full list, just a list of what I find most useful. For a full list, read the 8086 Family Users Manual from Intel.) If you can replace something you&#8217;re doing with one of these instructions, it&#8217;s almost always a win.</p>
<table border="1">
<tbody>
<tr>
<th>Opcode</th>
<th>Instruction</th>
<th>Description</th>
</tr>
<tr>
<td>37</td>
<td>AAA</td>
<td>ASCII adjust AL (carry into AH) after addition</td>
</tr>
<tr>
<td>3F</td>
<td>AAS</td>
<td>ASCII adjust AL (borrow from AH) after subtraction</td>
</tr>
<tr>
<td>27</td>
<td>DAA</td>
<td>Decimal adjust AL after addition</td>
</tr>
<tr>
<td>2F</td>
<td>DAS</td>
<td>Decimal adjust AL after subtraction</td>
</tr>
<tr>
<td>98</td>
<td>CBW</td>
<td>Convert byte into word (AH = top bit of AL)</td>
</tr>
<tr>
<td>99</td>
<td>CWD</td>
<td>Convert word to doubleword (DX = top bit of AX)</td>
</tr>
<tr>
<td>F8</td>
<td>CLC</td>
<td>Clear carry flag</td>
</tr>
<tr>
<td>F9</td>
<td>STC</td>
<td>Set carry flag</td>
</tr>
<tr>
<td>F5</td>
<td>CMC</td>
<td>Complement carry flag</td>
</tr>
<tr>
<td>EC</td>
<td>IN AL,DX</td>
<td>Input byte from port DX into AL</td>
</tr>
<tr>
<td>9F</td>
<td>LAHF</td>
<td>Load: AH = flags SF ZF xx AF xx PF xx CF</td>
</tr>
<tr>
<td>9E</td>
<td>SAHF</td>
<td>Store AH into flags SF ZF xx AF xx PF xx CF</td>
</tr>
<tr>
<td>EE</td>
<td>OUT DX,AL</td>
<td>Output byte AL to port number DX</td>
</tr>
<tr>
<td>0E</td>
<td>PUSH CS</td>
<td>Set [SP-2] to CS, then decrement SP by 2</td>
</tr>
<tr>
<td>1E</td>
<td>PUSH DS</td>
<td>Set [SP-2] to DS, then decrement SP by 2</td>
</tr>
<tr>
<td>06</td>
<td>PUSH ES</td>
<td>Set [SP-2] to ES, then decrement SP by 2</td>
</tr>
<tr>
<td>16</td>
<td>PUSH SS</td>
<td>Set [SP-2] to SS, then decrement SP by 2</td>
</tr>
<tr>
<td>1F</td>
<td>POP DS</td>
<td>Set DS to top of stack, increment SP by 2</td>
</tr>
<tr>
<td>07</td>
<td>POP ES</td>
<td>Set ES to top of stack, increment SP by 2</td>
</tr>
<tr>
<td>17</td>
<td>POP SS</td>
<td>Set SS to top of stack, increment SP by 2</td>
</tr>
<tr>
<td>9C</td>
<td>PUSHF</td>
<td>Set [SP-2] to flags register, then decrement SP by 2</td>
</tr>
<tr>
<td>9D</td>
<td>POPF</td>
<td>Set flags register to top of stack, increment SP by 2</td>
</tr>
<tr>
<td>C3</td>
<td>RETN</td>
<td>Return to near caller (pop offset only)</td>
</tr>
<tr>
<td>D7</td>
<td>XLATB</td>
<td>Set AL to memory byte DS:[BX + unsigned AL]</td>
</tr>
</tbody>
</table>
<p>Something handy to print out and keep next to you while you code.</p>
<h1>Accumulating Speed</h1>
<p>Register specializations suck, but when it comes to the accumulator (AX), Intel built in optimized forms of instructions that are one byte shorter, one cycle faster, or both. Try to reorganize your code so that AX or AL can be used for these optimized forms, especially in an inner loop: (&#8220;accum&#8221; here means either AX or AL, and &#8220;immed&#8221; means any immediate value)</p>
<table border="1">
<tbody>
<tr>
<th>Instruction</th>
<th>Description</th>
</tr>
<tr>
<td>ADD accum,immed</td>
<td>Add</td>
</tr>
<tr>
<td>SUB accum,immed</td>
<td>Subtract</td>
</tr>
<tr>
<td>ADC accum,immed</td>
<td>Add with carry</td>
</tr>
<tr>
<td>SBB accum,immed</td>
<td>Subtract with borrow</td>
</tr>
<tr>
<td>AND accum,immed</td>
<td>Logical AND</td>
</tr>
<tr>
<td>OR accum,immed</td>
<td>Logical OR</td>
</tr>
<tr>
<td>XOR accum,immed</td>
<td>Logical Exclusive-OR</td>
</tr>
<tr>
<td>IN AL,DX</td>
<td>Read from port</td>
</tr>
<tr>
<td>OUT DX,AL</td>
<td>Write to port</td>
</tr>
<tr>
<td>MOV mem,accum</td>
<td>Copy to memory</td>
</tr>
<tr>
<td>MOV accum,mem</td>
<td>Copy to register</td>
</tr>
<tr>
<td>CMP accum,immed</td>
<td>Compare (perform subtraction, but only set flags)</td>
</tr>
<tr>
<td>TEST accum,immed</td>
<td>Test (perform logical AND, but only set flags)</td>
</tr>
<tr>
<td>XCHG reg,AX</td>
<td>Exchange values</td>
</tr>
</tbody>
</table>
<p>That last one is a doozy; XCHG reg,AX is 1 byte and 3 cycles. This was part of Intel&#8217;s plan to pair both LOCK and XCHG together as a way to implement atomic semaphores, so they optimized it in the silicon. (See page 2-18 of the 8086 Family Users Manual for details.)</p>
<h1>It&#8217;s Called A Coprocessor For A Reason</h1>
<p>If your project is going to work with floating point and needs both speed and accuracy, read this section. If you know you&#8217;ll never need that, skip to the next section.</p>
<p>Everyone knows that the <a href="http://en.wikipedia.org/wiki/8087">8087 math coprocessor</a> is much faster than the 8088 if you need to perform <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE floating point</a> math operations (including square roots, tangents, arctangents, etc.). What people seem to forget is the word &#8220;coprocessor&#8221; in the name. It&#8217;s a true coprocessor, which means it can be crunching away on an operation in the background while the 8088 is off doing something else.</p>
<p>This is HUGE. If your program needs the accuracy of IEEE floating point and has to do a lot of difficult slow stuff with it, you can essentially get background computing of floating point for free. The sequence of operations for 8088 code is essentially this:</p>
<ol>
<li>Load 8087&#8242;s stack with values</li>
<li>Give it a command</li>
<li>Go off and do whatever you want</li>
<li>When you&#8217;re ready for the result, issue a WAIT</li>
<li>Pop your result(s) off the 8087 stack</li>
</ol>
<p>This almost feels like cheating.</p>
<h1>Stringing Up The CPU</h1>
<p>Another byproduct of <a href="http://en.wikipedia.org/wiki/X86">Intel&#8217;s CISC rage</a> were the string instructions. These are ludicrously powerful in the right circumstances, and you should use them whenever possible. Intel called them &#8220;string operations&#8221; because they were designed to assist in text string manipulation. Each of these opcodes are golden for three reasons:</p>
<ul>
<li>They are 1 byte long</li>
<li>They perform multiple operations faster than the individual steps would take</li>
<li>They can be automatically REPeated without using any jump/loop instructions</li>
</ul>
<p>Here are the five string instructions:</p>
<p style="padding-left:30px;">LODSB &#8211; Load byte from DS:SI into AL, then advance SI<br />
STOSB &#8211; Store byte in AL to ES:DI, then advance DI<br />
MOVSB &#8211; Copy byte from DS:SI to ES:DI, then advance both SI and DI<br />
SCASB &#8211; Load byte from ES:DI and compare it to AL (sets flags equal to a subtraction), then advance DI<br />
CMPSB &#8211; Compare byte from DS:SI to byte at ES:DI (sets flags equal to a subtraction), then advance both SI and DI</p>
<p>But wait, that&#8217;s not all! You also get 16-bit versions of the same instructions!</p>
<p style="padding-left:30px;">LODSW &#8211; Load word from DS:SI into AL, then advance SI +2<br />
STOSW &#8211; Store word in AX to ES:DI, then advance DI +2<br />
MOVSW &#8211; Copy word from DS:SI to ES:DI, then advance both SI and DI +2<br />
SCASW &#8211; Load word from ES:DI and compare it to AX (sets flags equal to a subtraction), then advance DI +2<br />
CMPSW &#8211; Compare word from DS:SI to word at ES:DI (sets flags equal to a subtraction), then advance both SI and DI +2</p>
<p>These can be called individually, but really shine when they are used with a REP prefix, which will repeat them for CX times (meaning, REP will run a string instruction, then decrement CX, then if CX is 0 it will stop). The last two are used with additional repeat prefixes: REPE/REPZ (repeat while equal/zero) and REPNE/REPNZ (repeat while not equal/not zero), so that the loop ends (or continues) based on the result of the comparison.</p>
<p>There&#8217;s a lot you can make fun of the 8088 for, but <em>nobody</em> makes fun of the string instructions. If you need to copy memory around, scan a buffer for a value, fill a buffer to a certain value, or compare two buffers for equality, they are an order of magnitude faster than doing things the long way. I mean, seriously, a single CMPSW done the long way would look like this:</p>
<pre class="brush: plain; title: ; notranslate">PUSH AX        ; CMPSW doesn't change any registers, so we can't either
PUSH BX
MOV AX,DS:[SI] ; Load DS:SI somewhere
ADD SI,2       ; Advance SI
MOV BX,ES:[DI] ; Load ES:DI somewhere
ADD DI,2       ; Advance DI
CMP AX,BX      ; Do the comparison (sets flags equal to subtraction)
POP BX         ; CMPSW doesn't change any registers, so we can't either
POP AX</pre>
<p>Maybe now you&#8217;ll understand why I love the string opcodes so much!</p>
<p>This is the end of Part 1 of our crash course. In Part 2, I&#8217;ll continue with various tips and examples. In Part 3, I&#8217;ll present a case study that shows what kind of benefit you can realize from taking the time to optimize for speed.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/programming/'>Programming</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/871/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/871/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=871&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/01/10/optimizing-for-the-8088-and-8086-cpu-part-1/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>No love for the IBM PC</title>
		<link>http://trixter.oldskool.org/2013/01/09/where-is-the-love/</link>
		<comments>http://trixter.oldskool.org/2013/01/09/where-is-the-love/#comments</comments>
		<pubDate>Wed, 09 Jan 2013 19:37:43 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=868</guid>
		<description><![CDATA[I&#8217;ve always wondered why the IBM PC never really gained a massive retro following that the Apple II, C64, Amiga, etc. have. There was the half-assed birth of the Abandonware movement, but otherwise nothing. Where are the podcasts dedicated to old PC hardware and games? I only know of two worth watching. Where are the Kansasfests and ECCCs for [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=868&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve always wondered why the IBM PC never really gained a massive retro following that the <a href="http://apple2history.org/">Apple II</a>, <a href="http://www.c64.com/">C64</a>, <a href="http://amiga.org/">Amiga</a>, etc. have. There was the half-assed <a href="http://www.abandonwarering.com/?Page=FAQ#1F">birth of the Abandonware movement</a>, but otherwise nothing. Where are the podcasts dedicated to old PC hardware and games? I only know of two <a href="http://www.pixelships.com/adg/index.html">worth</a> <a href="http://www.lazygamereviews.com/">watching</a>. Where are the <a href="http://www.kansasfest.org/">Kansasfest</a>s and <a href="http://starbase.globalpc.net/eccc/">ECCC</a>s for the IBM PC and old compatibles? Where are the cycle-exact emulators (<a href="http://www.tommowalker.co.uk/pcem.html">PCem</a> comes very close) and <a href="http://arstechnica.com/gaming/2011/08/accuracy-takes-power-one-mans-3ghz-quest-to-build-a-perfect-snes-emulator/">pixel-clock-accurate video emulation</a> that other platforms enjoy?  And, other than the wonderful and excellent <a href="http://www.vintage-computer.com/vcforum/">Vintage Computer Forum</a>, where are the forums?</p>
<p>I think it&#8217;s because the PC won the home computer wars. All of the other retro revivals are for platforms that most definitely ended; the PC just stayed relevant and, today, is what everyone has on their desks. Even Mac desktops run Intel hardware. So the IBM PC never really went away, and you can&#8217;t revive something that never really died.</p>
<p>I think the classic Mac &#8220;scene&#8221; had/has the same problem. I haven&#8217;t seen any <a href="http://en.wikipedia.org/wiki/C64_Direct-to-TV">retroware emulation compilations</a> with classic B&amp;W Mac software that exist for other platforms.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/868/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/868/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=868&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2013/01/09/where-is-the-love/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>The IBM PC 5150: What if?</title>
		<link>http://trixter.oldskool.org/2012/12/27/the-ibm-pc-5150-what-if/</link>
		<comments>http://trixter.oldskool.org/2012/12/27/the-ibm-pc-5150-what-if/#comments</comments>
		<pubDate>Thu, 27 Dec 2012 20:10:53 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=853</guid>
		<description><![CDATA[Did you know that the IBM PC was  not originally designed around the i8088?  Various sources conflict somewhat (including offline sources such as &#8220;Blue Magic: The People, Power and Politics Behind the IBM Personal Computer&#8220;), but the general consensus is that early 5150 designs considered CPUs that were both less powerful (such as the MOS [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=853&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Did you know that the IBM PC was  not originally designed around the <a href="http://en.wikipedia.org/wiki/Intel_8088">i8088</a>?  Various sources conflict somewhat (including offline sources such as &#8220;<a href="http://www.amazon.com/Blue-Magic-Politics-Personal-Computer/dp/0816013918/ref=sr_1_1">Blue Magic: The People, Power and Politics Behind the IBM Personal Computer</a>&#8220;), but the general consensus is that <a href="http://en.wikipedia.org/wiki/Intel_8088#Selection_for_use_in_the_IBM_PC">early 5150 designs</a> considered CPUs that were both less powerful (such as the <a href="http://en.wikipedia.org/wiki/6502">MOS 6502</a> and <a href="http://en.wikipedia.org/wiki/Z80">Zilog Z80</a>) and also <em>more</em> powerful (such as IBM&#8217;s POWER predecessor <a href="http://en.wikipedia.org/wiki/IBM_801">801</a>, or the <a href="http://en.wikipedia.org/wiki/Motorola_68000">Motorola 68000</a> CPU).</p>
<p>I find this fascinating to daydream about sometimes.  What if the IBM PC had <em>not</em> been built around the 8088?  How would have the personal computer industry progressed in the 1980s?  Who would the leader(s) be today?</p>
<p><span id="more-853"></span></p>
<p>The CPU possibility I keep drifting to is the 68000.  The IBM PC+8088 design had limitations that the industry spent nearly <strong>15 years</strong> working around, the most infamous being limited to 1MB RAM (640KB typically available) and, adding insult to injury, only being able to access it one 64K segment at a time.  But while an address translation chip could have provided a flat 16:16 address space, there were some annoying limitations in the 8088 itself, such as only having four general-purpose 16-bit registers (and of those four, each had a specialization married to some sets of instructions, so you couldn&#8217;t use them as flexibly as you would have liked).  The 68000 by comparison was immensely more powerful and had none of these limitations:  It had <em>eight</em> 32-bit general-purpose registers, and another eight 32-bit addressing registers.  On top of that, the 68000 had a flat 16MB address space (no segments!)  The 68000 had some drawbacks too (big-endian architecture, misaligned code would crash the CPU) but the core architecture was so much more powerful that it would have drastically changed how the IBM PC was perceived and used.</p>
<p>However, it would have also drastically changed how the IBM PC was <em>marketed</em>.  The original price of the PC was already expensive at launch ($1565 without any monitor or disk drives, about $3800 today) but designing the machine around the 68000 would have required more expensive components.  This, along with IBM&#8217;s existing familiarity with the i8086 family which would shave months off the time to market, was ultimately behind IBM&#8217;s decision to abandon all others and go with the i8088.</p>
<p>The 68000 was used in more powerful home computers that came after the IBM PC, such as the Apple Macintosh, Atari ST, and Amiga 1000.  On launch day for each of those computers, they greatly outshone the original IBM PC.  (BTW, the Amiga launch is particularly impressive and fascinating to <a href="http://www.youtube.com/watch?v=3oqUd8utr14">watch</a> although I can only find a small snippet of the full launch video online.)  If the 68000 had been used in the PC, would those later machines have ever existed?  While it&#8217;s interesting to fantasize that a 68000-based PC would have prevented the Atari ST and Amiga from ever existing, I think a more realistic outcome would be that the PC would have been treated like the Apple Lisa:  Powerful, but <strong>way</strong> too expensive, and perceived as a high-end business workstation that would find its way into some niche business markets but never considered a computer for the home.  (As to what computer(s) would have triumphed in the PC&#8217;s absence, that&#8217;s a What If? for another day.)</p>
<p>What about other potential CPUs?  What do you think might have happened to the IBM PC if it had been based on the same CPU as found in the Commodore 64 or the ZX Spectrum?</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/853/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/853/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=853&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/12/27/the-ibm-pc-5150-what-if/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Maze Generation In Thirteen Bytes</title>
		<link>http://trixter.oldskool.org/2012/12/17/maze-generation-in-thirteen-bytes/</link>
		<comments>http://trixter.oldskool.org/2012/12/17/maze-generation-in-thirteen-bytes/#comments</comments>
		<pubDate>Mon, 17 Dec 2012 16:42:55 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Demoscene]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=811</guid>
		<description><![CDATA[Update 12/7/2012 @ 13:46: Peter Ferrie smashed my record by a single byte, so the record is now held by him at 12 bytes.  Congrats, and I feel like a fool for missing it :-)  I&#8217;ve tacked on his optimization to the end of my original post. Update 1/7/2013: herm1t further smashed the record, down [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=811&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><strong>Update 12/7/2012 @ 13:46: Peter Ferrie smashed my record by a single byte, so the record is now held by him at 12 bytes.  Congrats, and I feel like a fool for missing it :-)  I&#8217;ve tacked on his optimization to the end of my original post.</strong></p>
<p><strong>Update 1/7/2013: <a href="http://lj.rossia.org/users/herm1t/66490.html">herm1t further smashed the record, down to 11 bytes</a>!</strong></p>
<p><strong>Update 1/7/2013 @ 18:00: Peter bounces back and reclaims the record with 10 bytes! It kind-of breaks my target platform (uses an undocumented opcode that only works on Intel processors) but hey, a record&#8217;s a record! I&#8217;ve updated the article below.</strong></p>
<p>In the past, when I&#8217;ve had a democoding breakthrough, I kept quiet and either used my discovery in a production, or just bragged to my demoscene friends privately.  However, my opportunities to achieve democoding &#8220;world firsts&#8221; are just about gone, and <a href="http://www.hugi.scene.org/compo/compoold.htm">size coding compos</a> seem to be dead, so I&#8217;ve decided to just write a blog post about what I&#8217;ve done instead: I&#8217;ve written a maze generator in only 13 bytes of x86 machine code.</p>
<p><span id="more-811"></span>To understand my 13b achievement, you need to be familiar with <strong>10 PRINT</strong>.  <strong>10 PRINT</strong> is the name given to a single short line of Commodore 64 BASIC code that, when run, appears to generate a never-ending complicated maze.  The output isn&#8217;t really a true maze &#8212; it has no proper beginning and end, and some avenues lead nowhere &#8212; but it <em>looks</em> like one because our brains are the most powerful pattern recognition engines on the planet.  The appreciation for <strong>10 PRINT</strong> comes from the seemingly infinite complexity produced from a very simple single line of code.  For you non-technical people, consider <strong>10 PRINT</strong> the programming equivalent of a haiku.</p>
<p><strong>10 PRINT</strong> is also the name of <a href="http://10print.org/">a 324-page book dedicated to the code</a>, its output, and 300 other pages that explore code, art, perception, culture, randomness, mazes, and almost anything else the authors thought of when pondering the code.  (The book is legally free for download, although you can purchase a copy to benefit the non-profit organizations PLAYPOWER and The MIT Press, so if the first hundred pages interest you, buy the book to help them out.)  It is hundreds of pages more than I would ever write about fascinating minutiae and borders on stonergazing, but the authors have done such a thorough job and made the subject material accessible to so many people that it&#8217;s really hard for me to criticize them.  I recommend you give it a read, as there&#8217;s something in there for everyone and the presentation of the material is top-notch.</p>
<h1>42 bytes</h1>
<p>Anyway, back to my code.  I was reading the <strong>10 PRINT</strong> book and got to page 242 where it explains that the BASIC code can be represented even smaller as C64 machine code, and challenges the reader to improve on it.  Sure enough, checking <a href="http://noname.c64.org/csdb/release/?id=106044">4-Mat&#8217;s and Wisdom&#8217;s attempts</a>, the smallest possible version clocks in at 15 bytes, which is pretty amazing.  For kicks, I wondered what an x86 equivalent would look like, so I wrote up an x86 version of 10 PRINT.  Here&#8217;s the easy-to-follow, friendly attempt:</p>
<pre class="brush: plain; title: ; notranslate">
; Simple program to duplicate &quot;10 PRINT&quot; output, also known as DataGlyphs.
; This version &quot;plays nice&quot; by grabbing from a &quot;true&quot; random data source
; and not making any assumptions about register contents.
; We also change to a low-resolution mode to have a friendlier aspect ratio
; and exit cleanly once the &quot;maze&quot; is done printing.

init:   mov     ax,0001h
        int     10h             ;force 40x25 color
        xor     bh,bh           ;we just set video, so set vidpage=0
        mov     cx,(40*23)      ;number of chars to write

getrnd: xor     ax,ax           ;to get al=0
        pushf
        cli                     ;disable interrupts, timer read must be atomic
        out     43h,al          ;latch count register
        in      al,40h          ;read lobyte of count
        mov     ah,al
        in      al,40h          ;read hibyte of count
        popf                    ;enable interrupts
        xchg    ah,al           ;fixup; now contains 8253 raw 16-bit word

pickch: shr     ax,1            ;BIOSes init in count-by-2, 1st bit always lo
        shr     ax,1            ;carry = &quot;random&quot; bit
        mov     al,'\'
        jc      writec          ;if bit set, write immediately
        mov     al,'/'          ;otherwise, choose other character

writec: mov     ah,0eh          ;write char in teletype mode
        int     10h
        loop    getrnd

        int     20h             ;exit back to DOS
</pre>
<p>This code is well-behaved; it doesn&#8217;t make assumptions about the state of the processor, and it exits cleanly (even though the original <strong>10 PRINT</strong> code loops forever).  It also manages to come up with a halfway decent random number, taken from the hardware timer which counts from 65535 down to 0 every second.  Compiled with <a href="http://eji.com/a86/">a86</a>, it results in a 42-byte .COM file.  The size suffers compared to the C64 version in two major places: The random number generation, and picking the character.  In picking the character, the C64 has an advantage in that both slashes are right next to each other in <a href="http://en.wikipedia.org/wiki/PETSCII">PETSCII</a> values, so if you have a random bit, you just add it to the first slash and you&#8217;ll get either no change, or the second slash.  No such luck on the PC; the ASCII values for both slashes are far apart, so I use a conditional branch that picks one or the other based on the random bit.</p>
<p>Because I&#8217;m used to optimizing for speed, I decided to eliminate the branch where the slash character is chosen to see what it looked like (branches are a speed penalty on most CPUs).  Despite being far away in value, the bit patterns for both slashes were only different by a single bit once you shifted one of them:</p>
<pre class="brush: plain; title: ; notranslate">
&quot;/&quot;=2f and &quot;\&quot;=5c
2f=00101111
5c=01011100
</pre>
<p>This led to replacing the pick-a-character chunk &#8220;pickch&#8221; with this:</p>
<pre class="brush: plain; title: ; notranslate">
pickch: shr     ax,1            ;BIOSes init in count-by-2, 1st bit always low
        push    cx              ;Save our loop counter for later
        mov     cl,al           ;copy random value to cl
        and     cl,1            ;cl is now either 0 or 1
        mov     al,'\'          ;seed character as '\'
        shr     al,cl
        or      al,cl           ;if cl=1, '\' is now '/', otherwise no change
</pre>
<p>While pleased with myself, this increased the size to 48 bytes, so I discarded the idea.</p>
<p>Another optimization thought was to change the character print routine (&#8220;writec&#8221;) to something that just stuck bytes directly into video memory.  That shaved two bytes off the print routine, but it took 4 bytes to set up (5 bytes if I wanted to stay compatible with the 8086), so it was a net loss that also got discarded.</p>
<h1>25 bytes</h1>
<p>I then turned my attention to the biggest chunk in the code, the random number generator.  Running the program a few times, it was clear that the quality of randomness didn&#8217;t need to be very high; just enough to avoid obvious runs or patterns.  This meant I could get my random data from almost anywhere, so I replaced the entire &#8220;getrnd&#8221; block with a single instruction: LODSB.  This retrieves a byte from memory and then advances position, so if you call it repeatedly you get a sequence of bytes from memory, one after the other.  The sequence I got back was from wherever DS:SI points to on program startup; for a DOS .COM file, it points to the current program code.  So my &#8220;random&#8221; stream of bytes was actually the compiled code itself (ha!) plus whatever remnants of prior programs were still left in memory.  This led to a massive reduction down to 25 bytes.</p>
<h1>15 bytes</h1>
<p>When I saw 25 bytes, I got excited because it was now in the realm of possibility to catch up to the C64 version.  There was still a lot of fluff in the program, so I took advantage of more &#8220;safe&#8221; startup assumptions and jettisoned nice-but-unnecessary things like changing the video mode, a clean exit (it loops forever, just like the original), and initializing some registers.  In the end, it looked like this:</p>
<pre class="brush: plain; title: ; notranslate">
init:   mov     ah,0eh          ;prime 10h for &quot;write char in teletype mode&quot;

getrnd: lodsb                   ;read a byte from wherever DS:SI points at

pickch: shr     al,1            ;carry = &quot;random&quot; bit
        mov     al,'\'
        jc      writec          ;if bit set, write immediately
        mov     al,'/'          ;otherwise, choose other character

writec: int     10h             ;write the character
        jmp     getrnd          ;loop endlessly
</pre>
<p>This compiled to 15 bytes.  Success!</p>
<h1>13 bytes</h1>
<p>I&#8217;d matched the C64 version, but looking at the &#8220;pickch&#8221; block I kept feeling like I could improve it.  That block starts by setting the carry flag to a random value, but the 8086 has a parity flag that is automatically set by some operations, and you can jump based on its state.  Unfortunately, LODSB does not set any flags.  Any math operation will set the parity flag, but most math operations would take up additional space and rob me of space savings.  If only there was a single-byte instruction that could do what LODSB does <em>and</em> set the parity flag based on the input&#8230;</p>
<p>Turns out, there is!  SCAS is an instruction that loads a byte and then compares it with AL, and then sets flags based on the comparison.  Like LODSB, it advances through memory, and it was meant to be used in a REPeat loop &#8212; but there&#8217;s nothing preventing you from using it outside of a loop.  So I did, and here is the final result:</p>
<pre class="brush: plain; title: ; notranslate">
; Simple program to duplicate &quot;10 PRINT&quot; output, sometimes called DataGlyphs.
; Written by Trixter / Hornet, trixter@oldskool.org, 20121214
; For more information about &quot;10 PRINT&quot;, consult http://10print.org

init:   mov     ah,0eh          ;prime 10h for &quot;write char in teletype mode&quot;

getrnd: scasb                   ;read from ES:DI points and compare to AL
                                ;this sets flags similar to a subtraction

pickch: mov     al,'\'          ;choose a character
        jp      writec          ;if parity bit set, write immediately
        mov     al,'/'          ;otherwise, choose other character

writec: int     10h             ;write the character
        jmp     getrnd          ;loop endlessly
</pre>
<p>And there you have it:  13 bytes.  As an added bonus, it works on an old IBM PC too, since it doesn&#8217;t use any 80186+ instructions.  Sample output below (if system is booted in 40-column mode, just like a C64):  (click on the picture directly if your browser isn&#8217;t displaying it properly)</p>
<p style="text-align:center;"><a href="http://trixter.oldskool.org/2012/12/17/maze-generation-in-thirteen-bytes/10print6_002/" rel="attachment wp-att-839"><img class="aligncenter  wp-image-839" alt="10print6_002" src="http://trixter.files.wordpress.com/2012/12/10print6_002.png?w=640&#038;h=400" width="640" height="400" /></a></p>
<p><del>I believe this is as small as it can get on x86, courtesy of Intel <a href="http://en.wikipedia.org/wiki/Complex_instruction_set_computing">CISC</a>.  I also think this is a <strong>10 PRINT</strong> size world record for <em>any</em> platform, but if I&#8217;m wrong, please let me know.</del></p>
<h1>12 bytes</h1>
<p>As the update above shows, Peter Ferrie was able to improve my design by a single byte.  His code is as follows, with my annotations:</p>
<pre class="brush: plain; title: ; notranslate">
init:   mov     ax,0e5ch        ;Load AH with &quot;write char&quot; cmd and AL with '\'
        scasb                   ;read from where ES:DI points and compare to AL
                                ;this sets flags similar to a subtraction
pickch: jp      writec          ;If parity set, jump to writing char in AL
        mov     al,’/’          ;otherwise, choose other slash char
writec: int     10h             ;write char in AL
        jmp     init            ;loop endlessly
</pre>
<p>Bravo, sir. But even further than that, using DOS&#8217;s &#8220;write character&#8221; int 29h, herm1t got it down to:</p>
<h1>11 bytes</h1>
<pre class="brush: plain; title: ; notranslate">
init:   mov     al, '\'
        scasb
        jp      writec
        mov     al, '/'
writec:	int     29h
        jmp     init
</pre>
<p>Clever. At the time I wrote the original 13-byte version, I&#8217;d been working on self-booting code with no OS, so I wasn&#8217;t considering DOS at any point. My loss is herm1t&#8217;s gain!</p>
<p>But wait, that&#8217;s not all:</p>
<h1>10 bytes</h1>
<pre class="brush: plain; title: ; notranslate">
init:   scasb
        salc
        and al,'\'-'/'
        add al,'/'
        int 29h
        jmp init
</pre>
<p>Peter bounces back with another byte shaved! (if you run Intel CPUs &#8212; trying to run this on a non-intel CPU such as an NEC V20 or V30 will hang the machine).</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/demoscene/'>Demoscene</a>, <a href='http://trixter.oldskool.org/category/programming/'>Programming</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/811/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/811/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=811&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/12/17/maze-generation-in-thirteen-bytes/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>

		<media:content url="http://trixter.files.wordpress.com/2012/12/10print6_002.png" medium="image">
			<media:title type="html">10print6_002</media:title>
		</media:content>
	</item>
		<item>
		<title>Sleeping in a Mall</title>
		<link>http://trixter.oldskool.org/2012/12/12/sleeping-in-a-mall/</link>
		<comments>http://trixter.oldskool.org/2012/12/12/sleeping-in-a-mall/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 04:48:50 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Sociology]]></category>
		<category><![CDATA[Christmas]]></category>
		<category><![CDATA[northbrook court]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=807</guid>
		<description><![CDATA[Just now, watching some 80&#8242;s music videos, it dawned on me that today &#8212; the second Wednesday of December &#8212; is the 25th anniversary of the time I slept overnight in a shopping mall.  I keep meaning to write about that night, but keep losing interest&#8230; but today being the 25th anniversary of that night [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=807&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Just now, watching some 80&#8242;s music videos, it dawned on me that today &#8212; the second Wednesday of December &#8212; is the 25th anniversary of the time I slept overnight in a shopping mall.  I keep meaning to write about that night, but keep losing interest&#8230; but today being the 25th anniversary of that night is too much of a coincidence to pass up, so here goes.</p>
<p><span id="more-807"></span>In 1987, I was a junior in high school lucky enough to work part-time at Babbage&#8217;s (a great source of software, <a href="http://trixter.oldskool.org/2008/07/21/from-courier-to-supplier/">something I&#8217;ve written about before</a>) in Northbrook Court, an upscale mall in the <a href="http://en.wikipedia.org/wiki/North_Shore_(Chicago)">North Shore</a>.  I would take a bus directly from high school to get there at 4pm, work two hours, and catch the last bus home at 6pm when I got off work.  On this particular Wednesday, however, I was careless with money and didn&#8217;t have enough cash for the bus home, and by the time I thought to ask someone for some money, the last bus had left.  My next option was to use what little change I had left to call my house for a ride home, but both parents were at a Christmas party, so there was nobody there to answer the phone.  Adding insult to injury, we didn&#8217;t own an answering machine, so I couldn&#8217;t even tell them I was stranded at the mall.  I wasn&#8217;t sure what to do, so I decided to sit in the food court and do homework until I had a better idea.</p>
<p>Eventually it was closing time, and the mall patrons were instructed to leave.  I waited inside one of the double-door entrances to the mall, still not really sure of how I was going to get home.  I did some more homework, and at 10pm a janitor walked into the vestibule and asked me what was going on.  I told him I was &#8220;waiting for my ride&#8221; to buy some more time: My plan at that point was to wait until my parents came home, call them collect, and get picked up.  It was very cold that night, so instead of kicking me out, he grunted and locked the outer set of doors so that they only opened from the inside.  The inner set of doors &#8212; <em>the doors to the inside of the mall</em> &#8212; he left unlocked.</p>
<p>He was expecting me to leave the mall, not go back inside.  But since the vestibule was starting to get cold, at 10:30pm I did precisely that: I went back inside the mall.  My first goal was to look for a comfortable place to sit down and wait until midnight so I could try calling home again.  The drawback was that I couldn&#8217;t be seen, because if they caught me I knew I really <em>would</em> be ejected from the mall, and I wasn&#8217;t looking forward to being outside in -15C/0F weather with no money and no ride.  So I had to find a way to stay hidden for a couple of hours.</p>
<p>My first thought was to return to the food court, as it was dark and there were many corners I could sit in.  However, the Army of Janitors had emerged from the woodwork and were cleaning that area, so that was out.  My next thought was that I could hide in a bathroom, but I dismissed that idea after a few minutes because 1. they were filthy after a full day of patronage, and 2. I was <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/JumpScare">terrified of getting surprised</a> by someone and having us both nearly die of shock.  I briefly entertained going into the <a href="http://ask.metafilter.com/116835/Does-anyone-know-anything-about-the-back-corridors-in-malls-behind-the-stores">back corridors</a> to wait things out, but since that&#8217;s where all the garbage goes, I was sure I&#8217;d be found by the janitorial staff.  (Also, it looks <strong>very very bad</strong> if you are caught in an area of the back corridors that you have no business being in, since it looks like you&#8217;re scoping the joint and/or attempting to burglarize a store from its inside entrance.  When I worked at Babbage&#8217;s, we were instructed to take the trash to the dumpster and then immediately return, no detours.)  I couldn&#8217;t think of anything else, so I gave up and decided to throw myself on the mercy of the janitors and hope that one of them understood English well enough to cut me a break.  I started walking to the food court&#8230; which took me past the Santa&#8217;s Workshop display, where the mall Santa would sit kids on his knee and charge for photos.</p>
<p>I don&#8217;t know what it looks like today, but back then, the Santa display was gigantic.  It was half-surrounded by fake trees, large candy canes, plastic snowmen and reindeer, and oversized mock presents, all with a long winding path to where Santa sits.  The chair itself had a back almost 10 feet tall, was painted in gold, and upholstered in red velveteen and looked more like a throne than a chair.  And because that wasn&#8217;t quite good enough for an upscale mall, the chair was set inside an elaborate  &#8221;workshop&#8221; mockup that was one-and-a-half stories tall and about 15 feet deep to the back and sides.</p>
<p>If I had been one year younger or one year older, I would have walked right on past it and stuck to the plan.  But I was 16, moody, and a little rebellious.  I decided to wait for midnight to roll around sitting in Santa&#8217;s Chair.</p>
<p>Sitting perfectly still, with my red ski jacket on, I blended into the chair and silently watched the janitorial staff clean the mall: Buffing the floors, washing the storefront windows, emptying the garbage.  One woman got within 15 feet of me and never saw me; I stifled a chuckle.  I was an invisible teenage king sitting on my yuletide throne.</p>
<p>Midnight rolled around, and most of the overhead lighting in the mall shut off.  The janitors disappeared, and I made my way back to the pay phone in the vestibule.  Propping the inner door open with my backpack for fear of getting locked out, I made a collect call to home.  Nobody answered!  I guessed my parents were having a good time at the Christmas party and hadn&#8217;t come home yet, so I made my way back to Santa&#8217;s chair to wait a little while longer.  However, I was pretty tired by this time and worried I was going to fall asleep, so with the janitorial staff gone I decided to walk around a little bit.  Almost immediately, I made a discovery: The &#8220;workshop&#8221; behind Santa&#8217;s chair had a tiny functional room in it!  The coat rack in the room gave away its true purpose as a changing room for &#8220;Santa&#8221;.  There was also a folding chair, and a small table with a box of chocolate gold coins for &#8220;Santa&#8221; to line his pockets (which I immediately proceeded to fill my backpack with).  This made for a much nicer spot to wait half an hour to call my parents again, so I sat down in the folding chair.</p>
<p>At this point, you should be able to infer what happened next.  It was past midnight, I was tired, I had nothing to do, I was in a dark room, and the folding chair was really uncomfortable to sit in.  Sheer teenage stupidity set in, and I decided to take a small nap before calling home again.</p>
<p>When I woke up, I had to pee something fierce, so I made my way to the bathrooms by the food court.  As I was relieving myself, <em>the very thing I tried to prevent earlier</em> happened as a janitor walked in on me and we both nearly crapped our pants.  He stuttered in broken English &#8220;You!  You the boy!  This way!&#8221; and he led me to the security office where I learned three very troubling things:</p>
<ol>
<li>The mall <strong>had</strong> a security office</li>
<li>I was not asleep for 30 minutes, but rather had slept for <strong>five hours</strong></li>
<li>The security guard informed me that, three hours <em>earlier</em>, he and my father had been <strong>roaming the mall, looking for me and <em>calling out my name</em></strong></li>
</ol>
<p>I was horrified.  He called my father to come pick me up.  As I waited in the security office, I tried to come up with a reasonable excuse for what had happened.  I had created a whole new level of stupid for not realizing earlier that all malls probably have a damn security office &#8212; I should have just gone there at 10pm and kept calling home every half hour!  I had no idea what I was going to tell my father, who probably couldn&#8217;t understand how I had slept through people yelling my name all over an empty mall.  I sleep like the dead!  (Seriously, ask my wife!)</p>
<p>The ride home was mostly silent.  I got into bed, slept until 10am, then got to school shortly before lunch and finished the rest of the school day.  When I went back to work that day, my manager <a href="http://en.wikipedia.org/wiki/Riot_Act#.22Read_the_Riot_Act.22">read me the riot act</a>, more out of concern for my safety than actual anger.  &#8221;You could have been lying in a ditch!&#8221; is a phrase I still remember to this day.  That night, my family didn&#8217;t talk about what had happened.  We were somewhat dysfunctional back then, following an if-we-ignore-it-then-it-didn&#8217;t-happen philosophy.  I received no punishment, other than what I gave myself over the next few days.</p>
<p>So, what was the outcome of this little stunt?  Other than a neat story to tell my friends the next day, I didn&#8217;t think there was any outcome at all until I mentioned it four years later to my father-in-law.  I was telling the story during a car ride to pass the time, and he turned around at a stoplight and said, &#8220;That was you?&#8221;  He was a mall manager at the time, and it turns out that my little stunt led to discussion in the mall retail industry, and later, policy reform in how large malls handle security.  As a result of my antics, floor displays no longer have changing rooms/hiding places, security guards must walk the floor routinely (I never once saw the security guard walking around that night), and all vestibule doors are locked and checked every walkaround.</p>
<p>I always made sure I had bus money after that.  Oh, and my parents bought an answering machine.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/family/'>Family</a>, <a href='http://trixter.oldskool.org/category/sociology/'>Sociology</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/807/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/807/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=807&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/12/12/sleeping-in-a-mall/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Anthropomorphising Computers</title>
		<link>http://trixter.oldskool.org/2012/12/04/anthropomorphising-computers/</link>
		<comments>http://trixter.oldskool.org/2012/12/04/anthropomorphising-computers/#comments</comments>
		<pubDate>Wed, 05 Dec 2012 02:13:45 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Sociology]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=800</guid>
		<description><![CDATA[A recent comment on a Slashdot story actually got me to laugh out loud at work enough to attract some attention, and that&#8217;s pretty rare for me (laughing at something I see on the internet).  What got me to laugh?  Human characterization of a computer.  It makes me laugh because I do the same thing [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=800&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>A recent comment on a Slashdot story actually got me to laugh out loud at work enough to attract some attention, and that&#8217;s pretty rare for me (laughing at something I see on the internet).  What got me to laugh?  Human characterization of a computer.  It makes me laugh because I do the same thing &#8212; I give machines personalities when I think about or work with them.  (To those researching autism spectrum disorders, you might want to scribble something in your notebook right about now.)</p>
<p>Most people trying to comprehend what this is like would probably imagine something flamboyant and animated, such as <a href="http://www.youtube.com/watch?v=9mg6wrYCT9Q">Eric Schwartz&#8217;s tribute to the Amiga</a>.  While such characterizations are creative and nice, that&#8217;s not what gets me laughing.  What does it for me is a computer that acts like a fallible human.  <a href="http://linux.slashdot.org/comments.pl?sid=3284125&amp;cid=42139031">Here&#8217;s the post</a> that got me laughing, paraphrased slightly (for the uninitiated, ext4 is a method of storing files in a Linux system, and the context is an application &#8220;talking&#8221; to the operating system):</p>
<blockquote><p>I don&#8217;t quite trust ext4 for writes.</p>
<p><span style="text-decoration:underline;">app</span>: Hey, can you write this data out to<br />
<span style="text-decoration:underline;">ext4</span>: DONE!<br />
<span style="text-decoration:underline;">app</span>: Uhh, that wasn&#8217;t long enough to actually write the data.<br />
<span style="text-decoration:underline;">ext4</span>: Sure it was! I&#8217;m super faGRRRRRRRRRRRRRst at writing too.<br />
<span style="text-decoration:underline;">app</span>: Wait &#8212; did you just cache that write and report it written, but then not actually write it to disk until 30 seconds later?<br />
<span style="text-decoration:underline;">ext4</span>: Yeah, so?</p></blockquote>
<p>I routinely do this sometimes when dealing with a unix server that is hurting, such as having so many spawned threads due to an unforseen condition that there are several times more threads running than there are CPUs to handle them.  I imagine each CPU as a juggler frantically trying to keep 20 pins in the air at once, sweating profusely, and calling out to the other CPUs for help only to have them yell back they are just as screwed as he is.</p>
<p>Does anyone else do this, or is it just me?</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/sociology/'>Sociology</a>, <a href='http://trixter.oldskool.org/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/800/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/800/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=800&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/12/04/anthropomorphising-computers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Living with autism</title>
		<link>http://trixter.oldskool.org/2012/11/28/living-with-autism/</link>
		<comments>http://trixter.oldskool.org/2012/11/28/living-with-autism/#comments</comments>
		<pubDate>Wed, 28 Nov 2012 18:09:11 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Family]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=796</guid>
		<description><![CDATA[Sam, my eldest son, is autistic.  We are fortunate that he is high-functioning, but it is something that the entire family will deal with for the rest of our lives as we try to find a pocket of the world for him. When people ask me what autism is like, my one-shot answer used to [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=796&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Sam, my eldest son, is autistic.  We are fortunate that he is high-functioning, but it is something that the entire family will deal with for the rest of our lives as we try to find a pocket of the world for him.</p>
<p>When people ask me what autism is like, my one-shot answer used to be, &#8220;Ever seen Rain Man?  It&#8217;s kind-of like that, but without a 25 million-dollar budget.&#8221;  After last night, however, I have a new answer:  Living with an autistic child or sibling is damn near exactly as portrayed in <a href="http://en.wikipedia.org/wiki/The_Black_Balloon_(film)">The Black Balloon</a>, a movie written and directed by a filmmaker who grew up with two autistic brothers.  The movie is full of insights and situations that come from that real place, such as what meltdowns are and what prompts them, reward systems, and how society reacts to something it doesn&#8217;t understand.</p>
<p>I highly recommend The Black Balloon if you want a quick introduction to what families with autism go through.  Although it can be hard to watch at times for those already familiar with autism, I recommend they watch it as well, because it reminds you how you&#8217;re not alone, and that life on all spectrum levels can be fulfilling.  The Black Balloon is available for Instant Play streaming on <a href="http://www.netflix.com">Netflix</a>.  <a href="http://www.youtube.com/watch?v=IiyAfaXmbrk">A trailer for it is on YouTube</a>.</p>
<p>A few times a year, I hear this from people learning for the first time about some of the difficulties our family has been through: &#8220;How brave!  Where do you find the strength?  How do you do it?&#8221;  The answer should be obvious &#8212; <strong>because we <em>have</em> to</strong>!  Spoken with a smile and a laugh, of course.  And that is the feeling perfectly portrayed in The Black Balloon.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/family/'>Family</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/796/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/796/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=796&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/11/28/living-with-autism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>MindCandy Black Friday Deal</title>
		<link>http://trixter.oldskool.org/2012/11/23/mindcandy-black-friday-deal/</link>
		<comments>http://trixter.oldskool.org/2012/11/23/mindcandy-black-friday-deal/#comments</comments>
		<pubDate>Fri, 23 Nov 2012 20:16:33 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Demoscene]]></category>
		<category><![CDATA[MindCandy]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=792</guid>
		<description><![CDATA[A year ago, myself and a few friends completed our demoscene video trilogy with MindCandy Volume 3.  This was the first volume to be rendered at 60 frames per second for Blu-ray; it makes for a great home theater showcase.  Like all MindCandy volumes, most of the demos contain commentary from the original authors, so [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=792&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>A year ago, myself and a few friends completed our <a href="http://en.wikipedia.org/wiki/Demoscene">demoscene</a> video trilogy with <a href="http://www.mindcandydvd.com/3/info.html">MindCandy Volume 3</a>.  This was the first volume to be rendered at 60 frames per second for Blu-ray; it makes for a great home theater showcase.  Like all MindCandy volumes, most of the demos contain commentary from the original authors, so you can get some insight as to how they got their ideas and programmed the effects.</p>
<p>We still have some left, so <a href="http://www.mindcandydvd.com/3/order.html">we&#8217;ve lowered the price</a> for Black Friday (and the rest of the holiday buying season) down to $17 for the US and $19 for Canada.  (If overseas, you can try <a href="http://www.mindcandy.de/en/MindCandy-Volume-3-PC-Demos-2003-2010/">Maz Sound</a>, <a href="http://csw-verlag.com/en/Audio-Video/MINDCANDY-Volume-3.html">CSW Verlag</a>, and <a href="http://www.amazon.co.uk/Mindcandy-Demos-2003-2010-Blu-ray-Import/dp/B0069Z9DDA/ref=sr_1_1?ie=UTF8&amp;qid=1353701565&amp;sr=8-1">Amazon UK</a> for the best deals.)</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/demoscene/'>Demoscene</a>, <a href='http://trixter.oldskool.org/category/demoscene/mindcandy/'>MindCandy</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/792/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/792/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=792&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/11/23/mindcandy-black-friday-deal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Reverse-engineering an old wound</title>
		<link>http://trixter.oldskool.org/2012/11/08/re-old-wound/</link>
		<comments>http://trixter.oldskool.org/2012/11/08/re-old-wound/#comments</comments>
		<pubDate>Fri, 09 Nov 2012 04:20:13 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Demoscene]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=774</guid>
		<description><![CDATA[Nearly two decades ago on the usenet newsgroups comp.sys.ibm.pc.demos and comp.sys.ibm.pc.soundcard, there were some accusations flung around that Josh Jensen (Cyberstrike of Renaissance, for those who still remember the PC demoscene) had copied entire chunks of Mark J. Cox&#8216;s MODPLAY to use in his own modplayer SuperProPlay (and later MASI sound system). Just as time [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=774&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Nearly two decades ago on the usenet newsgroups comp.sys.ibm.pc.demos and comp.sys.ibm.pc.soundcard, there were some accusations flung around that Josh Jensen (Cyberstrike of Renaissance, for those who still remember the PC demoscene) had copied entire chunks of <a href="http://www.awe.com/mark/blog">Mark J. Cox</a>&#8216;s <a href="http://www.awe.com/mark/dev/modplay.html">MODPLAY</a> to use in his own <a href="http://en.wikipedia.org/wiki/MOD_(file_format)">mod</a><a href="http://en.wikipedia.org/wiki/List_of_Amiga_music_format_players">player</a> SuperProPlay (and later MASI sound system). Just as time has a way of healing old wounds, advances in technology has a way of ripping them open again, and a chance encounter with some familiar assembly code in October got me thinking about the accusations against Jensen all those years ago. I didn&#8217;t give it much attention back then, but I&#8217;m a different person now, with much more skill than I had 20 years ago. With decades of x86 assembler, reverse-engineering, and programming skills under my belt, I decided to take another look at this issue to see if it could be answered definitively. I armed myself with much better RE tools (<a href="http://www.hex-rays.com/products/ida/index.shtml">IDA</a>) as well as Josh&#8217;s released Protracker Playing Source (PPS) v1.10 source code (<a href="http://www.scene.org/file.php?file=%2F..%2Fpub%2Fmirrors%2Fhornet%2Fcode%2Faudio%2Fplayers%2Fpps110.zip&amp;fileinfo">PPS110.ZIP</a>) and spent about an hour looking at them both.</p>
<p>My verdict: Josh quite absolutely copied entire chunks of MODPLAY for use in his own code.</p>
<p><span id="more-774"></span>When accused, Josh&#8217;s paraphrased explanation at the time was &#8220;it&#8217;s a modplayer, of course some things are going to be the same from player to player&#8221;, but that only makes sense at a high level. Yes, the <em>basics</em> of playing a mod are the same across all players, such as interpreting the data structures and effects, mixing four channels into a single output channel, etc. But the devil is in the details, and it is the details that point to copying. The code is not 100% identical at an assembler level, but there are some very unique choices Mark made in the original MODPLAY that mysteriously show up in Josh&#8217;s source, such as internal housekeeping, and the inner mixing loop.</p>
<p>The mixing loop, I have found, is a good &#8220;fingerprint&#8221; for a modplayer &#8212; almost every author implements it in a different way. There are bare-metal fastest-possible implementation loops (such as the self- modifying fixed-length code of <a href="http://www.mobygames.com/developer/sheet/view/developerId,5204/">Carlo</a>&#8216;s <a href="http://www.scene.org/file_dl.php?url=ftp://ftp.scene.org/pub/mirrors/hornet/music/programs/players/glx212.zip&amp;id=334944">Galaxy Player</a>), loops optimized for low memory usage (such as MODPLAY&#8217;s loop which uses a MUL in the inner loop), loops that trade memory for speed (such as <a href="http://www.oldskool.org/guides/tvdog/sound.html">TANTRAKR</a> which uses a 128K lookup table to eliminate MUL), and all targets inbetween. 4 channels or N channels? 32-bit mixing or 16-bit mixing? Logarithmic or linear volume tables? Cubic interpolation or linear interpolation? Just about every x86 mixing modplayer is different. And the choice Mark Cox made &#8212; utilizing a MUL in the inner loop and making heavy use of memory variables &#8212; was because he knew his target was a 286 or later and could handle it. You can also tell from the MODPLAY disassembly that Mark was working in a vacuum, because his performance-sensitive code is nowhere near as optimized as it could be (sorry Mark!). Looking at Jensen&#8217;s source, you can see exactly the same methods at play, including the inner loop (although Jensen made a few tiny 1- and 2-opcode optimization changes here and there).</p>
<p>As much as I love the inner loop as a fingerprint, the most convincing evidence that copying occurred is actually in the most boring sections of both programs: General housekeeping (things like program startup/initialization, maintaining player state, etc.) Mark does something in MODPLAY that struck me as odd; he calls two tiny procedures to set some variables based on whether or not a mod has 15 or 31 instruments (labels are mine; I don&#8217;t have access to Mark&#8217;s source code):</p>
<pre class="brush: plain; title: ; notranslate">sub_1E23 proc near
  mov sequence_offset, 1D8h
  mov word_124, 258h
  mov header_size, 258h
  mov num_inst, 0Fh
  retn
sub_1E23 endp

sub_1E3C proc near
  mov sequence_offset, 3B8h
  mov word_124, 438h
  mov header_size, 43Ch
  mov num_inst, 1Fh
  retn
sub_1E3C endp</pre>
<p>That&#8217;s a weird way to set some vars. You don&#8217;t normally call a tiny procedure simply to set a handful of memory variables to fixed values; usually, you just set the values directly. I don&#8217;t know Mark&#8217;s motivation for doing it this way. This is a very unusual section of code that I wouldn&#8217;t expect to see again&#8230;</p>
<p>&#8230;and yet, Jensen follows the very same odd practice in PPM.ASM:</p>
<pre class="brush: plain; title: ; notranslate">proc sd_Set15Ins
 uses ds
 mov ax,@data
 mov ds,ax
 mov [Word NumberInstruments],15
 mov [Word SequenceOffset],01D8h
 mov [Word HeaderSize],0258h
 ret
endp sd_Set15Ins

proc sd_Set31Ins
 uses ds
 mov ax,@data
 mov ds,ax
 mov [Word NumberInstruments],31
 mov [Word SequenceOffset],03B8h
 mov [Word HeaderSize],043Ch
 ret
endp sd_Set31Ins</pre>
<p>Again, it&#8217;s not the exact instructions that are copied or their order, it&#8217;s that entire <strong>concepts</strong> were copied, and because Mark implemented them in a unique way, they stand out in Jensen&#8217;s code.</p>
<p>As someone who has done a lot of cracking and reverse-engineering of vintage software &#8212; including, I&#8217;m ashamed to say, outright theft of other people&#8217;s code &#8212; I sense other subtle touches in Jensen&#8217;s released source that indicate large sections of it are not his original work. The most obvious are switching between hex and decimal values as a basic notation from procedure to procedure; the copied chunks favor hexidecimal notation, while the original code favors decimal. Also, all throughout the code some lines are indented using 8-character tab stops while other lines use spaces for padding, which is indicative of generating a file using one padding style and then editing it using another style, which would not typically happen if you wrote all the code from scratch.</p>
<p>In the last 20 years, Jensen has remained a professional programmer, and just as my skills and integrity have increased over that time, I have no doubt that his have increased as well. It is not my intention to libel Jensen as a whole; I simply wish to set the record straight regarding only one of his claims.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/demoscene/'>Demoscene</a>, <a href='http://trixter.oldskool.org/category/programming/'>Programming</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/774/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/774/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=774&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/11/08/re-old-wound/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Internet Detox Addendum</title>
		<link>http://trixter.oldskool.org/2012/11/03/internet-detox-addendum/</link>
		<comments>http://trixter.oldskool.org/2012/11/03/internet-detox-addendum/#comments</comments>
		<pubDate>Sat, 03 Nov 2012 19:35:00 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Lifehacks]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=772</guid>
		<description><![CDATA[While on my internet sabbatical, I watched most of the new season of The Outer Limits and was pleased to discover an episode that illustrated one of the concerns that led to my sabbatical in the first place.  Titled Stream of Consciousness, it explores some possible downsides of being able to access all information all [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=772&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>While on my internet sabbatical, I watched most of the new season of The Outer Limits and was pleased to discover an episode that illustrated one of the concerns that led to my sabbatical in the first place.  Titled <a href="http://en.wikipedia.org/wiki/Stream_of_Consciousness_(The_Outer_Limits)">Stream of Consciousness</a>, it explores some possible downsides of being able to access all information all the time.  It&#8217;s a little lightweight; no issues are ever explored in great depth.  But I still recommend <a href="http://www.hulu.com/watch/67554">giving it a view</a>.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/lifehacks/'>Lifehacks</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/772/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/772/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=772&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/11/03/internet-detox-addendum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>November Lifehacking: The Walking Dad</title>
		<link>http://trixter.oldskool.org/2012/11/01/november-lifehacking-the-walking-dad/</link>
		<comments>http://trixter.oldskool.org/2012/11/01/november-lifehacking-the-walking-dad/#comments</comments>
		<pubDate>Fri, 02 Nov 2012 02:15:13 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Lifehacks]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=769</guid>
		<description><![CDATA[November&#8217;s lifehacking experiment is inspired by three things: I gained weight during last month&#8217;s experiment. I am winded going up stairs. My kids have never known me without a roll of fat around my neck. I am 41 years old, 6&#8217;2&#8243;, and weight 247 pounds. That&#8217;s at least 45 pounds too much, and about 65 [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=769&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>November&#8217;s lifehacking experiment is inspired by three things:</p>
<ol>
<li>I gained weight during last month&#8217;s experiment.</li>
<li>I am winded going up stairs.</li>
<li>My kids have never known me without a roll of fat around my neck.</li>
</ol>
<p>I am 41 years old, 6&#8217;2&#8243;, and weight 247 pounds. That&#8217;s at least 45 pounds too much, and about 65 pounds away from looking normal. I have tried very many things, but lost the willpower to follow through with all of them: A gym membership, home calisthenics (even <a href="http://en.wikipedia.org/wiki/Yourself!Fitness">computer-aided</a>), and the <a href="http://www.c25k.com/">Couch-to-5K</a> program. All have failed, save for a wonderful 3-month period in 2004 where I successfully trained for the <a href="http://en.wikipedia.org/wiki/Run_Hit_Wonder">Run Hit Wonder</a> and got a front-row position at the following Devo concert.</p>
<p>As I discovered last month just how much anxiety I keep at bay, I was reminded of The Walking Man. Walking Man is a former neighbor of ours who used to go for several walks a day. He was a retired nuclear physicist  and had the unofficial reputation of being quite brilliant. Once or twice a day, you could look outside and see him either coming or going. However, as the years went by, I started seeing him in more places around town: The park at the end of the subdivision; the Trader Joes 10 blocks away; the bike trail near the river. It wasn&#8217;t until I saw him walking downtown, several miles away, that I realized what he was doing: He wasn&#8217;t taking several walks per day, but rather taking one <strong>massive</strong> walk that lasted hours per day. Downtown is 5 miles away, so he walked a minimum of three hours every day. Not surprisingly, he was a little on the thin side.</p>
<p>I hold no illusion that I am like a brilliant nuclear physicist, but I can identify with him on some level. Some neighbors told me his walking was a way for him to think and sort out whatever was going on in his life; the physical fitness was just a side benefit. I am inspired, and am going to emulate The Walking Man so that I can kill two birds with one stone (anxiety and exercise). However, to make it as easy as possible to perform, I will be doing it indoors on a level treadmill. The treadmill is in front of the television, so I will have some entertainment while I walk. Finally, I&#8217;ll be walking in whatever clothes I am currently wearing. All of the previous excuses with other methods &#8212; driving to gym, changing into special clothes, dealing with the elements &#8212; are gone. I really have no other excuses!</p>
<p>So what&#8217;s the plan?</p>
<ul>
<li>On day 1, perform my treadmill&#8217;s fitness test with the aid of a heart monitor. Record result.</li>
<li>Walk 5K (3.1 miles) every single day for 30 days. Initial walking speed will be 3.1 miles per hour, but after the first week I will increase the speed slightly to match the duration of the TV series I plan to watch while walking. Apply &#8220;body glide&#8221; strategically to prevent chafing and welts.</li>
<li>Weight and percentage body fat will be recorded every single morning before my first meal.</li>
<li>On day 30, perform fitness test again and compare result with day 1.</li>
</ul>
<p>What do I hope will happen?</p>
<ul>
<li>More effective sleep</li>
<li>Less anxious</li>
<li>Higher performance at my day job</li>
<li>Weight loss</li>
<li>Better mood/less depression</li>
</ul>
<p>This is a lot less pressure than Couch-to-5k and I can&#8217;t honestly see any downsides (except possibly blisters).  I start tomorrow morning with the fitness test.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/lifehacks/'>Lifehacks</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/769/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/769/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=769&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/11/01/november-lifehacking-the-walking-dad/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Internet Detox: Results</title>
		<link>http://trixter.oldskool.org/2012/10/31/internet-detox-results/</link>
		<comments>http://trixter.oldskool.org/2012/10/31/internet-detox-results/#comments</comments>
		<pubDate>Wed, 31 Oct 2012 06:25:53 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Lifehacks]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=762</guid>
		<description><![CDATA[October&#8217;s lifehacking experiment is over! I&#8217;m back online and trying not to salivate. There&#8217;s a lot to update here, so I&#8217;ll start with the summary conclusions first, then work my way down to the statistics, and finally end this post with entries from my daily log that I recorded as the experiment progressed.  If you [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=762&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>October&#8217;s lifehacking experiment is over! I&#8217;m back online and trying not to salivate.</p>
<p>There&#8217;s a lot to update here, so I&#8217;ll start with the summary conclusions first, then work my way down to the statistics, and finally end this post with entries from my daily log that I recorded as the experiment progressed.  If you only have one minute to read this, you&#8217;ll get the meaty bits first.</p>
<h1>Conclusions</h1>
<p>I gained two major personal insights as a result of this experiment.  The first was that I am my own worst enemy.  Much of the email that would take up my time was actually opted-in by me: Sale notifications, new things on ebay I might like, forum replies, etc. Over the next few days I am going to take a hard look at what I&#8217;m receiving and pare it down. I&#8217;m not completely to blame; over 1000 emails were spam that got through my filters, so I&#8217;ll have to look into more filtering beyond what I already have (I currently use <a href="http://spamassassin.apache.org/">spamassassin</a>, <a href="http://www.tummy.com/Community/software/tumgreyspf/">greylisting</a>, and <a href="http://kb.mozillazine.org/Junk_Mail_Controls">bayesian filtering in my MUA</a>).</p>
<p>The second insight was the discovery that I have more nervous energy than I realized, and am more anxious than I should be. As I get older, I lack the ability to keep it in check.  I find aging interesting from the standpoint of an engineer:  While the <strong>amplitude</strong> of my mood swings has decreased over the years, the <strong>frequency</strong> has <em>increased</em>.  I used to deal with anxiety using programming, action games, IRC, web browsing, email, online communities, etc. to distract me.  With most of those removed this past month, I turned to other avenues such as nervous eating (I gained two pounds) and snapping at my family during particularly low periods. :-(</p>
<p>The solution, I think, is not to go back on the sauce completely, but regulate it. Work smarter, not harder.  Keep doing email, but only useful email &#8212; all these automated notifications and alerts simply must go away.  Keep reading news, but pare down my newsfeed to just the bare essentials (sorry woot-offs, don&#8217;t let the door hit you on the way out).  And I&#8217;m giving serious thought to having some days (like the weekend) be &#8220;no-internet&#8221; days.</p>
<p>Did I get more meaningful things done in my free time, or did I just find other ways to waste it? Both meaningful (programming) and meaningless (tv, movies) activities increased at roughly the same amount.  Did I spend more time with family? A bit more, but there was no significant change.  Did I get around to reading Neuromancer? Nope. In fact, I didn&#8217;t read any books at all, other than technical information on FAT12/FAT16, and &#8220;The Pro Audio Spectrum&#8221; book sent to me by my good friend Mike Melanson.  Did I miss facebook? Not one bit. Did facebook miss me? Not really :-) but that doesn&#8217;t bother me either.  Was I inundated with spam? Despite my predictions, spam did not increase exponentially as the spambots received confirmation that  I was a real person through my vacation message auto-replies. MAILER DAEMON bounces were less than 6% of the email I received.</p>
<p>Am I glad I did it? Absolutely. I also brainstormed at least 12 more month-long experiments to try, half of which deal with my physical health and the other half with my mental health. (I&#8217;ll stay online for those, I promise!)</p>
<h1>Experiment Statistics</h1>
<p><span style="text-decoration:underline;">Health</span>: Weight gained/lost: +2 pounds :-(</p>
<p><span style="text-decoration:underline;">Email</span>:</p>
<ul>
<li>For the month of October, I received 5690 emails, 3913 (69%) of which were obvious spam. Over 1000 more were non-obvious spam &#8212; spamassassin didn&#8217;t catch them, and neither did the bayesian filtering I have in my MUA.</li>
<li>Of the remaining 1777 emails, 8 of the top 10 senders were services that I signed up for &#8212; voluntary spam!  Those 8 were: ebay.com, kickstarter.com, paypal.com, (my bank).com, netflix.com, (another bank).com, vintage-computer.com, and linkedin.com.</li>
<li>I received 174 emails from other things like hobbyist mailing lists and groups &#8212; stuff I want to keep on top of, but things that I now realize a daily or weekly summary would suffice.</li>
<li>I received around 35 personal or truly important emails during the entire month out of all 5690, roughly 1 per day.</li>
</ul>
<p><span style="text-decoration:underline;">RSS feed</span>: Received over 1200 news articles, 1000 of them daily tech news. I will be paring 25% of those down.  I&#8217;m also not sure if I&#8217;m going to read them all to catch up.</p>
<p><span style="text-decoration:underline;">Movies watched</span>:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/The_Weavers:_Wasn%27t_That_a_Time!">The Weavers: Wasn&#8217;t that a time!</a></li>
<li><a href="http://en.wikipedia.org/wiki/Starship_Troopers_(film)">Starship Troopers</a> (with and without commentary)</li>
<li><a href="http://www.amazon.com/Alien-Anthology-Blu-ray-Sigourney-Weaver/dp/B001AQO3QA">Alien Anthology</a> &#8220;Alien&#8221; and &#8220;Aliens&#8221; featurettes</li>
<li><a href="http://en.wikipedia.org/wiki/Looper_(film)">Looper</a> (on a date with Melissa :-)</li>
<li><a href="http://en.wikipedia.org/wiki/The_Dead_Zone_(film)">The Dead Zone</a></li>
<li><a href="http://en.wikipedia.org/wiki/Broadway_Danny_Rose">Broadway Danny Rose</a></li>
<li><a href="http://en.wikipedia.org/wiki/Rock_and_rule">Rock and Rule</a></li>
<li><a href="http://en.wikipedia.org/wiki/Blade_II">Blade II</a></li>
<li><a href="http://en.wikipedia.org/wiki/Taken_2">Taken 2</a></li>
</ul>
<p><span style="text-decoration:underline;">TV Shows/Miniseries watched</span>:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Jane_(comic_strip)#Adaptations">Jane</a> (1982 TV adaptation )</li>
<li><a href="http://en.wikipedia.org/wiki/Who_Am_I_This_Time%3F_(film)">Who Am I This Time?</a> (1982)</li>
<li><a href="http://en.wikipedia.org/wiki/Mortal_Kombat_Legacy">Mortal Kombat Legacy</a></li>
<li><a href="http://en.wikipedia.org/wiki/Legend_(TV_series)">Legend</a> (1995)</li>
<li><a href="http://en.wikipedia.org/wiki/Monsters_(TV_series)">Monsters</a></li>
<li><a href="http://en.wikipedia.org/wiki/Penn_%26_Teller_Tell_a_Lie">Penn &amp; Teller Tell a Lie</a></li>
<li><a href="http://en.wikipedia.org/wiki/Tales_from_the_Crypt_(TV_series)">Tales from the Crypt</a> (entire series)</li>
<li><a href="http://en.wikipedia.org/wiki/Venture_brothers">Venture Brothers</a> (seasons 1 and 2)</li>
<li><a href="http://en.wikipedia.org/wiki/Terriers_(TV_series)">Terriers</a></li>
<li><a href="http://en.wikipedia.org/wiki/In_Living_Color">In Living Color</a> (seasons 1 and 2)</li>
<li><a href="http://en.wikipedia.org/wiki/The_Walking_Dead_(TV_series)">The Walking Dead</a> (seasons 1 and 2)</li>
<li><a href="http://en.wikipedia.org/wiki/Space_Precinct">Space Precinct</a></li>
<li><a href="http://en.wikipedia.org/wiki/Perversions_of_Science">Perversions of Science</a> (entire series)</li>
<li><a href="http://en.wikipedia.org/wiki/The_Outer_Limits_(1995_TV_series)">The Outer Limits</a> (seasons 1 through 5)</li>
</ul>
<p><span style="text-decoration:underline;">Games played</span>:</p>
<ul>
<li><a href="http://www.mobygames.com/game/windows/black-mesa">Black Mesa</a> (finished)</li>
<li><a href="http://www.mobygames.com/game/wizorb">Wizorb</a> (finished)</li>
<li><a href="http://www.mobygames.com/game/windows/vessel">Vessel</a></li>
<li><a href="http://www.mobygames.com/game/windows/battlefield-bad-company-2">Battlefield: Bad Company 2</a></li>
<li><a href="http://www.mobygames.com/game/windows/half-life-opposing-force">Half-Life: Opposing Force</a></li>
<li><a href="http://www.mobygames.com/game/windows/half-life-source">Half-Life: Source</a></li>
<li><a href="http://www.mobygames.com/game/windows/braid">Braid</a> (Did Not Like!  I was very irritated that time reversed only some things, and not everything.)</li>
<li><a href="http://www.mobygames.com/game/windows/jamestown-legend-of-the-lost-colony">Jamestown</a></li>
<li><a href="http://www.mobygames.com/game/windows/rochard">Rochard</a></li>
<li><a href="http://www.mobygames.com/game/windows/shatter">Shatter</a></li>
<li><a href="http://www.mobygames.com/game/pc-booter/hi-res-adventure-4-ulysses-and-the-golden-fleece">Ulysses and the Golden Fleece</a> (finished, but aided with a walkthrough)</li>
</ul>
<p><span style="text-decoration:underline;">Notable activities performed</span>:</p>
<ul>
<li>Performed firmware and BIOS update to my <a href="http://www.lo-tech.co.uk/introducing-the-lo-tech-xt-cfv2/">XTCfv2</a> prototype.</li>
<li>Significantly rewrote <a href="http://www.oldskool.org/pc/8088_Corruption">8088flex</a> player &#8211; 60fps sustained is now possible! (if the bandwidth is there).  I&#8217;ll blog about that later.</li>
<li>Digitized and edited more <a href="http://www.youtube.com/user/80sVideoTrix">found footage</a> from my VHS tapes.</li>
<li>Took my kids to a comic book store and bought them some yu-gi-oh cards; they played games with each other afterwards.</li>
<li>Took Sam out to dinner at Buffalo Wild Wings, just him and Dad.</li>
<li>Wrote a deleted data recovery program for FAT12 and FAT16 filesystems.  I&#8217;ll blog about that later.</li>
</ul>
<h1>Daily Log</h1>
<h3>Day 0:</h3>
<p>I prepared by configuring and testing vacation messages for both my home-grown traditional mbox mailbox that has been servicing @oldskool.org for eons, as well as the gmail address I alternately use. I then moved my entire inbox (about 100 items still unread, that may be a lifehack for another month) to a separate folder so that I had a clear delineation of what I had to empty before going back to my old inbox. I wanted to watch some new seasons of shows with my kids in October, so at the 11th hour I ordered some DVDs from Amazon. I turned off Data Network Mode on my phone so that it wouldn&#8217;t be constantly trying to check email and update news unless I was at home on wifi where I could ignore it a little easier. I also removed the news widgets (rss aggregator, youtube channels, facebook, twitter) from my phone&#8217;s home screens so I wouldn&#8217;t be distracted by them. Finally, I made sure all of my podcast subscriptions were current and downloaded to my phone for listening (I don&#8217;t consider this a cheat as I used to listen to the radio and mixtapes on a portable cassette player two decades ago).</p>
<h3>Day 1:</h3>
<p>Exceptions started on the first day, when I needed to access some online benefit information for work, and the only way to do that was over the public internet. But the experiment wasn&#8217;t to cut out all internet usage, it was to cut out all unnecessary distractions and wasted time, so I felt these that acceptable. Another exception was because I wanted to keep a log for this experiment in a file, not a paper notebook, so I allowed myself to ssh to my home server from wherever I was so I could record new info into the log. Again, I don&#8217;t feel this was against the spirit of the experiment; I could keep a paper notebook log, but I can&#8217;t stand writing longhand.</p>
<p>Already on the first day I had to catch myself; I had just finished watching a documentary on The Weavers and wanted to learn a little more about them, so reflexively I started to pull up wikipedia. I was halfway through typing &#8220;Weavers&#8221; before I mentally slapped my hand and closed the browser. Later that day I wanted to confirm an artist&#8217;s tour dates, and I struggled with the decision to designate that as an exception because I honestly couldn&#8217;t tell if there was any other way to look that information up other than the artist&#8217;s website. I caved and spent about 90 seconds confirming the artists&#8217;s tour dates. (Speaking of which, how did people look up tour dates before the internet? I&#8217;m serious, I really want to know. Other than posters plastered up at local venues, and maybe a fanzine or fan club newsletter, I can&#8217;t figure out how people knew when and where to catch a show.)</p>
<p>I also quickly made an exception for work-related conversation. When someone asks you about the new Nook tablet or Galaxy Note II or some other tech news as part of interoffice chit chat, answering &#8220;I have no idea, I&#8217;m on an internet sabbatical&#8221; does not improve comradery among coworkers. That kind of response is less &#8220;social scientist&#8221; and more &#8221;antisocial hipster douchebag&#8221;. So whenever that came up, I allowed myself a few minutes to get familiar with what they were talking about. This policy was in addition to the previous exception that anything specifically work-related was ok (dictionary, reference material, vendor tech support forum, etc.) Lifehacking experiments cease to be fun when they screw with my ability to provide for my family, so I didn&#8217;t feel it was cheating making these exceptions.</p>
<p>Other first-day oddities included a high sense of anxiety &#8212; I was picking at my fingers all day, something I do when I&#8217;m nervous &#8212; as well as getting a song stuck in my head for several hours (and I hadn&#8217;t even listened to the song, just thought about it for a few seconds). I&#8217;m not convinced these behaviors were related to the experiment, however; correlation != causation.</p>
<h3>Day 2:</h3>
<p>I peeked at my email to make sure delivery and vacation messages were still working. 420+ emails, 99% of them appear to be spam. Scanned subjects and didn&#8217;t look like I was missing anything important. Total time: 90 seconds.</p>
<p>Told co-workers about my experiment at lunch; they were not impressed. In fact, we only talked about it for a minute and then moved on.</p>
<p>Added another exception for my weather app widget on my phone&#8217;s home screen. I would normally turn on the radio, read a newspaper, or just stick my head out the window to determine the weather, and I only glance at the app once a day, so I don&#8217;t consider leaving the weather app enabled a &#8220;cheat&#8221;.</p>
<p>Same song from day 1 still stuck in my head.</p>
<h3>Day 3:</h3>
<p>Peeked at email again for another 90 seconds just to make sure it was working ok. So far so good. Almost 800 emails, but most are spam. (I have an effective spam filtering strategy with multiple components, but a portion of it is bayesian filtering on the part of my MUA and since I&#8217;m not running my MUA, the spam is still in my inbox.)</p>
<p>Finally cracked and had my first real &#8220;infraction&#8221;: I overheard someone mention spending $300 on <a href="http://en.wikipedia.org/wiki/Salt_therapy">Halotherapy</a> which sounded suspiciously like <a href="http://en.wikipedia.org/wiki/Pseudoscientific">woo-woo junk science</a>. Curiosity burned me up  so much that I just had to confirm if I was right or not. (I was.)  Total time spent online: 2 minutes.</p>
<p>I think my nervous-energy mind is having trouble adjusting to this new schedule, as I have come back to this log four times today to update it and the day is only half over. I continue to pick at my fingers. I may need to find some other way of releasing anxiety.</p>
<p>Same song from day 1 still stuck in my head!!</p>
<h3>Day 4:</h3>
<p>Watched 45 minutes of the 2012 Presidential Debate on my phone using a justification that I now can&#8217;t recall. I think I tried to justify it using some sort of scheduled VHS tape analogy. I think I messed up royally here. The only mitigating factor is that I watched all 45 minutes contiguously, calmly, and gave it my full attention.  Unfortunately, now I don&#8217;t want to vote for either of them.</p>
<p>Drowning out the stuck song in my head using a dance/electro/hiNRG/techno playlist on shuffle.</p>
<h3>Day 6:</h3>
<p>Got online to go directly to ebay to handle some auction sales. (This was an exception that I agreed on before I started the experiment, because it&#8217;s not worth borking my ebay feedback rating and deny people merch just because I&#8217;m doing an experiment.)  Once done, did not feel the need to go browsing or check email.</p>
<h3>Day 7:</h3>
<p>While seeing a matinee, saw a poster for Taken 2. Hadn&#8217;t even realized it was being made, let alone in theaters! Went to Roger Ebert&#8217;s online reviews to check out a review, which I justified as being no different than picking up the paper to do the same.</p>
<p>Matinee was Looper. It was good &#8212; not great, just good. The best thing about the movie was watching Joseph Gordon-Levitt do his best to look and act like Bruce Willis. Prosthetics were involved.</p>
<h3>Day 8:</h3>
<p>Coworker mentioned to me that Jellybean might actually work on my craptastic Epic 4g and pointed me to <a href="http://get.cm/?device=epicmtd">http://get.cm/?device=epicmtd</a> . Now my phone is burning a hole in my pocket until the end of the month!</p>
<h3>Day 9:</h3>
<p>Completely and utterly fell off the wagon when I ran into a programming problem and couldn&#8217;t find the answer. Searched the &#8216;net for 2 hours before concluding that I could probably figure out the problem myself if I just think about it for a while. Gotta get back up on the horse!</p>
<h3>Day 11:</h3>
<p>I was stumped by a programming problem and couldn&#8217;t resist the urge to ask someone online for help. If I was asking any random person I would probably have been able to resist, but the Internet is the great equalizer, so it was very easy for me to perform the equivalent of asking <a href="http://en.wikipedia.org/wiki/Anton_Chekhov">Chekov</a> advice on how to write a play. That&#8217;s pretty hard to resist. (The advice I got back was extremely helpful; it was worth it.)</p>
<h3>Day 12:</h3>
<p>Watched a documentary on the Zodiac killer with Melissa; took both boys to a comic book store to get some more Yu-Gi-Oh cards, and Max discovered Magic: The Gathering and is now 50+ cards down that rabbit hole.</p>
<h3>Day 13:</h3>
<p>Measured my weight and was shocked to learn that I had actually gained half a pound instead of losing weight like I thought I would during this experiment.</p>
<p>Did three loads of laundry, which is about 2.5 more loads than I do in a week.</p>
<h3>Day 14:</h3>
<p>Did 4 loads of laundry in the breaks between programming sessions.</p>
<h3>Day 16:</h3>
<p>Halfway point achieved! Max told me he was impressed I made it this far.  :)</p>
<p>Not having to check email constantly is a huge win IMO, although I feel somewhat guilty,  like I am avoiding responsibility or something.</p>
<p>It has been effortless to resist the pull of facebook and twitter; it  just seems like so much <a href="http://www.hark.com/clips/rwynklsyrw-all-the-noise">noise, noise, noise, noise</a> . I miss cracked.com the most, as I usually read it in bed as part of my falling asleep ritual. I am compensating with tv shows instead. I should probably be reading  a book or something (or nothing!)</p>
<h3>Day 17:</h3>
<p>I bricked my phone trying to flash it. Because the USB port is broken on it, there is no way to flash a recovery image to it &#8212; so I am going to be without my phone for about 3 days. This should get interesting.</p>
<h3>Day 19:</h3>
<p>Got phone back, and found that I didn&#8217;t really miss it.</p>
<p>Noticed that I don&#8217;t seem to miss my email at all. In fact, it&#8217;s kind of a relief. The first two weeks I felt like I was shirking some sort of responsibility, but now it just seems like a burden has been lifted. It&#8217;s a shame it can&#8217;t last.</p>
<p>First real fallout of not checking email found today: My NAS dropped a drive on the 13th, and I never saw the error because I wasn&#8217;t checking email which is where I have the errors sent. This morning, it dropped another drive and I lost the entire NAS. It&#8217;s backed up, but I could have prevented the upcoming week of rebuilding and restoring if I had just replaced that drive on the 13th.</p>
<h3>Day 20:</h3>
<p>Was able to recover the NAS without resorting to backups. <strong><a href="http://en.wikipedia.org/wiki/Zfs">ZFS</a> <a href="http://www.youtube.com/watch?v=NT5VkFnU554">ROX DA HOUSE Y&#8217;ALL</a></strong></p>
<h3>Day 24:</h3>
<p>Over the last week, my willpower has eroded to the point where I&#8217;m using the Internet about 10 minutes a day. I needed some questions answered for my programming project, so I have been on Usenet to get help. I&#8217;ve also visted IMDB to look up trivia for movies or shows I&#8217;d just watched. This is still a far cry from where I used to be (at least an hour every night) but I still feel sheepish.</p>
<h3>Day 28:</h3>
<p>Spent most of the weekend finishing up programming a data recovery utility for FAT12/FAT16 filesystems.  Was extremely calming, relaxing. I wish I&#8217;d programmed it 25 years ago though, since I built two novel functions into it that no other recovery utility of the 1980s had. I could have made a lot of money back then.</p>
<h3>Day 29:</h3>
<p>I don&#8217;t miss my email at all, but I&#8217;ll need to deal with it soon, so I broke my rules for about 10 minutes to research how best to gather statistics from mbox files and grab some source tarballs. I ran October&#8217;s email through the excellent <a href="http://www.marki-online.net/MLS/">MailListStat</a> program.  The results are somewhat what I feared: I appear to be my own worst enemy. Most of the email I&#8217;ve received I signed myself up for. Information overload. I will be correcting that in a big way in November!</p>
<h1>Next?</h1>
<p>Stay tuned for November&#8217;s lifehacking experiment: My health!</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/lifehacks/'>Lifehacks</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/762/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/762/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=762&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/10/31/internet-detox-results/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>October Lifehacking: Internet Detox</title>
		<link>http://trixter.oldskool.org/2012/09/29/october-lifehacking-internet-detox/</link>
		<comments>http://trixter.oldskool.org/2012/09/29/october-lifehacking-internet-detox/#comments</comments>
		<pubDate>Sun, 30 Sep 2012 04:41:21 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Lifehacks]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=760</guid>
		<description><![CDATA[The month of October marks the 20th anniversary of when I first obtained internet access (thanks Brian!) and started accessing the internet at least once every single day.  Back then it was mostly FTP transfers and Usenet reading; my first email address came a year later, and I didn&#8217;t fall into the IRC trap until [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=760&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>The month of October marks the 20th anniversary of when I first obtained internet access (thanks Brian!) and started accessing the internet at least once every single day.  Back then it was mostly FTP transfers and Usenet reading; my first email address came a year later, and I didn&#8217;t fall into the IRC trap until a year after that (and gave up IRC somewhat for good in 1999, as my IRC addiction was affecting my job).  Despite being connected to the world at 9600 baud back then, I used the &#8216;net for at least <em>something</em> every single day, and that hasn&#8217;t changed in 20 years.</p>
<p>Actually&#8230;  I don&#8217;t recall using the internet on my wedding day, honeymoon, and during the birth of my children.  But the &#8216;net and I definitely have a <a href="http://en.wikipedia.org/wiki/High_availability">five nines</a> relationship.</p>
<p>A few days ago, I came across a 3-article summary on slashdot on <a href="http://science.slashdot.org/story/12/09/27/0255235/why-its-bad-that-smartphones-have-banished-boredom">how smartphones have banished boredom, and whether or not that&#8217;s a good thing</a>.  It got me thinking about how I spend the majority of my free time &#8212; or rather, how I tend to waste most of it &#8212; so I decided to try a little experiment:  I will go on an <strong>internet sabbatical</strong> for one month, specifically the entire month of October. Absolutely no voluntary internet access whatsoever (I&#8217;m sure my internet-connected devices will continue on their merry autonomous way without me).  The rules I am imposing on myself are as follows:</p>
<ul>
<li>No web access</li>
<li>No reading or responding to email</li>
<li>No browsing social network feeds (<a href="http://twitter.com/MobyGamer">twitter</a>, <a href="http://www.facebook.com/jim.leonard">facebook</a>, <a href="https://plus.google.com/u/0/114274883114204706131/posts">google+</a>) in any capacity (smartphone or PC)</li>
<li>No Netflix streaming access</li>
</ul>
<p>To avoid too much disruption, there are a few exceptions to the above.  I will check email/web Saturday October 6th because I have an ebay auction ongoing, and will need to send the winning bidder their merch.  Also, I will allow myself web access at work if I need it to perform my job duties, or at home if I need to respond to something time-sensitive (like enrolling for work health benefits, etc.).  And if Melissa wants to watch a movie on Netflix with me, obviously I will oblige.  But otherwise, that&#8217;s it.  I&#8217;ll slap a vacation message on my email addresses and come back a month later.</p>
<p><em>Lack of internet access doesn&#8217;t mean I&#8217;m sequestering myself from society</em>.  If you need to get a hold of me, please call or text me &#8212; you know, like before the internet was popular.  I&#8217;ll have my cell phone on me at all times.</p>
<p>I&#8217;ve never done anything like this before and have many questions.  Will I spend more time with my family?  Will I get more sleep?  Will I finally read Neuromancer?  Will I spend more time playing games?  Will it affect my weight?  Will it affect my work performance?  Will it affect my anxiety?</p>
<p>I&#8217;ll come back with answers in November.  See you then!</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/lifehacks/'>Lifehacks</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/760/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/760/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=760&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/09/29/october-lifehacking-internet-detox/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Emulation vs. the Real Thing</title>
		<link>http://trixter.oldskool.org/2012/09/27/emulation-vs-the-real-thing/</link>
		<comments>http://trixter.oldskool.org/2012/09/27/emulation-vs-the-real-thing/#comments</comments>
		<pubDate>Fri, 28 Sep 2012 01:33:28 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Gaming]]></category>
		<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=754</guid>
		<description><![CDATA[A fellow vintage computer enthusiast recently asked a group of like-minded hobbyists if they use emulation (ie. running a program that simulates a vintage computer, as opposed to using a vintage computer directly) and, if so, what they use emulation for. Having used, owned, programmed on, and contributed to emulators for very many machines over [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=754&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>A fellow vintage computer enthusiast recently asked a group of like-minded hobbyists if they use emulation (ie. running a program that simulates a vintage computer, as opposed to using a vintage computer directly) and, if so, what they use emulation for. Having used, owned, programmed on, and contributed to emulators for very many machines over a long period of time, I had a lot to say. What follows is a slightly expanded version of what I replied back to him. For the purpose of this article, I define &#8220;emulation&#8221; as &#8220;interacting with software running in a virtual environment that mimics <em>the physical environment the software was <span style="text-decoration:underline;">originally</span> designed to run under</em>&#8220;. I also define a &#8220;work&#8221; as the software you are running in said environment, and is not limited to games (although most emulators are indeed used overwhelmingly for gaming).</p>
<p><span style="text-decoration:underline;">For the TL;DR crowd:</span> You need both vintage hardware <em>and</em> emulation to properly research something.</p>
<p>I&#8217;ve contributed to a few emulators in varying capacities over the last decade, and in that time, some of my emulation colleagues have expressed surprise when I mention that I have a large collection of functional vintage machinery (both personal computing as well as console gaming) hiding in my crawlspace, and that I rotate pieces in and out on a regular basis for both enjoyment and research. This is not a statement against emulation; some emulators are packed with features that make interacting with the original works very easy and flexible (such as <a href="http://www.dosbox.com/">DOSBox</a>, <a href="http://www.mess.org/">MESS</a>, and <a href="http://mamedev.org/">MAME</a>) while others are dedicated to accuracy to extreme levels (such as <a href="http://byuu.org/bsnes/">bsnes</a>). The state of most <a href="http://www.emulator-zone.com/">emulation scenes</a> today is thriving and most emulators are quite stable and practical to use as a replacement for the real thing.</p>
<p>So if that&#8217;s the case, why maintain so many physical machines? It&#8217;s because emulation can only go so far. No matter how good the emulation is, you can&#8217;t change the fact that you are running a work on a physically different computer than what it was designed for. For most works, this is perfectly acceptable, but there will always be something missing no matter how good the emulator is. In my vintage computing research, I use a mixture of both emulation and real machines so that I can reap the benefits of both. To illustrate this, I&#8217;m going to explain the advantages of both emulators and vintage hardware.</p>
<h1>Vintage Hardware Advantages</h1>
<p>People who never had access to vintage hardware, and always have success running software inside their emulators, sometimes can&#8217;t understand what is missing when you emulate, even using one as hyper-accurate as bsnes. Most emualtors handle the obvious (CPU and Video display subsystem) well, because those are required for basic operation; they also handle CPU &#8220;speed&#8221; and system timing well, as mishandling them would prevent performance-sensitive software from running properly. So what&#8217;s missing? Here&#8217;s a short list:</p>
<ul>
<li><span style="text-decoration:underline;">Video display properties</span>: Color temperature, screen curvature, scanlines, response time, phosphor layout, phosphor speed. All of these are important, some more than others. Vintage game graphics were composed with all of these properties in mind, from color choices down to individual pixel placement by the artist. If you are viewing a classic game&#8217;s graphics on a progressive display, the end result can be either too bright or too dim, over-saturated or under-saturated &#8212; no matter the outcome, it&#8217;s definitely not what the artist intended. Thankfully, this is changing thanks to ever-increasing GPU power in the form of <a href="http://filthypants.blogspot.com/2011/05/more-emulator-pixel-shaders-crt-updated.html">plug-in shaders</a>.  But as awesome as modern shaders are, they can&#8217;t overdrive hardware. Anyone doing serious research on vector arcade games absolutely <strong>must</strong> see at least one in person to get a feel for just how bright and intense the vectors can be. (I personally recommend the mint-condition Asteroids currently operating at the <a href="http://gallopingghostarcade.com/">Galloping Ghost arcade</a> &#8212; <a href="https://lh4.googleusercontent.com/-oZFlbWwXfNw/UGT2UwKXOzI/AAAAAAAAChQ/fohtkL-DFkA/s973/2012-07-15+17.21.52.JPG">very bright</a>, currently no burn-in.)</li>
<li><span style="text-decoration:underline;">Interface properties</span>: Input device layout, button placement, tension/stiffness, etc. This is just as important for computer emulation than game console emulation, because computers have input devices specialized for general-purpose computing (keyboards, mice) and not gaming. For example, some games on the PC used F9 and F10 for lateral movement in games, which initially doesn&#8217;t make any sense until you look at a vintage 83-key PC keyboard and see that F9/F10 were located at the very <a href="http://www.clickykeyboard.com/2011/jul09/003.jpg">lower-left of the keyboard</a> &#8212; optimal placement for gaming with the left hand. And younger Mac users may wonder why classic mac games only use a single button until they <a href="http://www.mousearena.com/wp-content/uploads/2012/08/apple-macintosh-plus-mouse.jpg">physically see why</a>. This is most easily fixed by connecting vintage input devices directly to the machine performing the emulation, although such connections can range from a commercial adapter to a homebrew wire-wrapped monstrosity. But it&#8217;s worth the effort, so that you can see why Intellivision or Colecovision games require you to quickly navigate menus using the 1, 3, 7, and 9 keys (look at the controllers, you&#8217;ll <a href="http://gamester81.com/wp-content/uploads/Intellivision-Controller.jpeg">see</a> what I <a href="http://files.sharenator.com/coleco_colecovision_controller_For_all_you_gamers_out_there_What_was_the_first_video_game_you_remember_playing-s450x474-85349-580.jpg">mean</a>).</li>
<li><span style="text-decoration:underline;">I/O properties</span>: Because most emulation research is in the field of gaming, little attention is paid to emulating I/O as it was on the original hardware, such as the speed of the storage subsystem, any noise it made, and so on. (In fact, most emulators attempt to speed up I/O as much as possible so that programs load much faster than they did on the original hardware.) <a href="http://www.youtube.com/watch?v=TCDtnQiZlSc">Some emulators make noise</a>, such as <a href="http://www.winuae.net/">WinUAE</a>, but the overwhelming majority do not, and I think that&#8217;s a shame. For gaming, I/O isn&#8217;t usually a concern, but for any historical research, it can provide a visceral response that would otherwise be missing.</li>
</ul>
<p>This last one is hard to understand, so I&#8217;ll provide a real-world example: When playing the game <a href="http://www.mobygames.com/game/apple2/wizardry-proving-grounds-of-the-mad-overlord/screenshots/gameShotId,43910/">Wizardry on a real Apple II</a> or IBM PC, it loads from a single floppy disk frequently while the game progresses, to load new graphics, maze data, etc. due to the computer&#8217;s memory being smaller than what a floppy disk holds. Wizardry is a role-playing game, which lends itself to repetitive tasks: Enter dungeon, explore new area, fight party of monsters, etc. As you play Wizardry on these systems, you begin to recognize, either consciously or subconsciously the floppy disk access patterns &#8212; the &#8220;whirr, thunk, buzz&#8221; noises coming from the drive &#8212; for these repetitive tasks as the game runs. Open a chest, &#8220;thunk&#8221;; go down a level, &#8220;thunk-THUNK whirr thunk&#8221;, you get the idea. Now, imagine that your party is wounded and desperately heading to get to the surface to heal, while navigating an unfamiliar dungeon trying to avoid conflicts. You K)ick down a door, and instead of the familiar &#8220;whirr thunk&#8221; of finding an empty room, or &#8220;whirr buzz thunk&#8221; of finding a chest, you hear &#8220;whirr buzz thunk-thunk <em>BUZZ THUNK <strong>THUNK-THUNK-THUNK-THUNK</strong></em>&#8221; and realize, with growing horror, that the game is loading a lot more data than usual because it is trying to put a bone-crushing, game-ending party of monsters behind that door. But my example doesn&#8217;t end there! Not only is the I/O subsystem contributing to a real feeling of anxiety and dread, but it is also offering you a choice: If you act quickly enough, you can &#8220;dive for the drive&#8221; and pull the floppy disk out, preventing the game from loading the data it needs to seal your party&#8217;s fate. This works because Wizardry only saves your progress at two places: When you die (which in this example is in about two seconds from now), or out of the dungeon, back in town. Ripping the disk out means you unfortunately lose your progress since the last time you saved, but more importantly it cheats death &#8212; and in Wizardry, death is (mostly) permanent, even across saved games.</p>
<h1>Emulation Advantages</h1>
<p>For vintage gaming research, emulation provides many benefits that the original hardware would struggle with, or in some cases, are impossible. My favorite emulation advantages are, in order of importance (to me):</p>
<ul>
<li><span style="text-decoration:underline;">Instant searching</span>. Software loads quickly while emulated, so you can sample one game a minute, faster if you&#8217;re organized and a quick typist. This is great if you&#8217;re trying to blow through 50+ games looking for something (a game character, a programmer or graphics artist in the credits, a specific gameplay mechanic, etc.) Handy for answering quick historical questions.</li>
<li><span style="text-decoration:underline;">Interchangeable hardware</span>. For PC emulation, any combination of video and sound standards can be quickly loaded and tested. Trying to do this with vintage hardware is time consuming and very costly (<em><strong>you</strong></em> try buying  every single vintage sound card ever made from ebay!)  My most common use of this is listening to all of the different ways a composer tried to optimize a game score for a specific hardware device. For example, load <a href="http://www.youtube.com/watch?v=19r6RnReAf4">a game that uses 8-note polyphony with a MIDI device</a>, and then <a href="http://www.youtube.com/watch?v=X_yxIzk8MxY">load it again with the 3-voice Tandy/PCjr audio chip</a> and hear how the musical elements were scaled down to a drastically limited output device. This practice can also lead to some interesting discoveries, such as how <a href="http://queststudios.com/smf/index.php?topic=3204.0">Rob Hubbard bit-banged a single SN76496 channel to make it perform like a crude DAC on Tandy machines</a>, leading to some music soundtracks you can <a href="http://www.symphoniae.com/elw/tandy/688ast_intro.mp3">only hear properly on that platform</a>.</li>
<li><span style="text-decoration:underline;">Easy video and audio capture</span>. While audio/video capture is not a substitute for the real thing, it is excellent for quickly illustrating gameplay mechanics or concepts to an audience that can&#8217;t (or won&#8217;t) run emulators. Capturing video or audio from real vintage hardware ranges from &#8220;easy and high-quality&#8221; to &#8220;nearly impossible&#8221; (requiring hardware modification to tap the necessary signals for capture).</li>
<li><span style="text-decoration:underline;">Expanded capabilities</span>. Emulation can enhance your experience of a work, which can greatly increase your enjoyment or appreciation of it. My favorite example of this is playing early multiplayer serial/modem/IPX games, or even 2-player game console games, across the internet with another player. In the 1980s, if you wanted to play a console or computer game with another person, you both had to be physically present. In the case of computer hardware, you had to connect computers via a serial cable, a modem connection over phone lines, or <a href="http://en.wikipedia.org/wiki/MIDI_Maze">some other wacky physical connection such as a MIDI cable</a>. The difficulty of establishing connectivity limited the experience. Nowadays, that situation has completely flipped &#8212; connectivity is standardized and widespread across international boundaries. Emulation bridges what the vintage hardware expects with what the real world can provide, and makes it possible for two people to play the same vintage console or computer game as if they were sitting side-by-side.</li>
<li><span style="text-decoration:underline;">Inspection</span>. I absolutely love this. Many top-flight emulators have an embedded debugger that allow you to pause the emulated system, inspect memory and registers, set execution breakpoints/conditions, and more. This is an absolute boon to researchers (and preservationists, who wish to &#8220;crack&#8221; copy-protected games so that they can survive past the failure of their media). This has answered a great deal of historical questions for me, from why Galaxy Player is the fastest in the world on 8088 (answer: saturated register additions + self-modifying code), to how some vintage games manipulate a 3-D virtual space and calculate rotation and perspective transformations (answer: Just like everyone else, with matrix math and nine MULs, but with a 16.16 fixed-point worldspace and 256 degrees per circle instead of the usual 360).</li>
</ul>
<p>So there you have it: You need both vintage hardware <em>and</em> emulation software to get a better picture of what you&#8217;re researching.</p>
<p>(Note that I didn&#8217;t say &#8220;to get the full picture&#8221;, because it&#8217;s impossible to get the &#8220;full&#8221; picture of a particular work. The &#8220;full&#8221; picture would conceivably include facets of the work that may be impossible to obtain, such as experience with the social and political direction of the time period in which the work was created, the background of the people who created the work, the business and financial pressures that led to the funding of the work and controlled its motivation and direction, etc.)</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/gaming/'>Gaming</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/754/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/754/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=754&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/09/27/emulation-vs-the-real-thing/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://www.symphoniae.com/elw/tandy/688ast_intro.mp3" length="3733419" type="audio/mpeg" />
<enclosure url="http://www.symphoniae.com/elw/tandy/688ast_intro.mp3" length="3733419" type="audio/mpeg" />
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>A Quick Vignette</title>
		<link>http://trixter.oldskool.org/2012/09/16/a-quick-vignette/</link>
		<comments>http://trixter.oldskool.org/2012/09/16/a-quick-vignette/#comments</comments>
		<pubDate>Mon, 17 Sep 2012 03:36:01 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=739</guid>
		<description><![CDATA[My 12-yr-old recently wanted to purchase something truly stupid, expensive, and transitory with his hard-earned money, and rather than try to convince him otherwise, I went ahead and let him.  Being disappointed with a purchase is something I would rather he learn sooner than later, so he can start making good decisions quicker. I was [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=739&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>My 12-yr-old recently wanted to purchase something truly stupid, expensive, and transitory with his hard-earned money, and rather than try to convince him otherwise, I went ahead and let him.  Being disappointed with a purchase is something I would rather he learn sooner than later, so he can start making good decisions quicker.</p>
<p>I was not as lucky.  I bought some real crap in my time (the name Emerson should strike fear into everyone&#8217;s heart) and while it taught me to stop buying cheap crap (stuff that broke, stuff that was disappointing, etc.), it took longer than it should have.  My most cringe-inducing purchase was <a href="http://en.wikipedia.org/wiki/Miami_Vice#Fashion">a Miami vice-like outfit</a> the summer before high school (this is summer of 1985 for those wishing stage public humiliation &#8211; it&#8217;s okay, I don&#8217;t mind).  I put it on and walked nearly 2 miles to a party some girl I thought I had a crush on was throwing.  I thought I was going to be hot shit, but as I approached the outdoor party, everyone laughed at the Miami vice thing since it was cheezy (and I was in Illinois, not California).  Seriously, I had not even reached the front door when I&#8217;d gotten my third uncomfortable comment&#8230; so I kept walking, never stopped, turned the corner and came home, another 2 miles.  My grandmother was house-sitting at the time, and she saw me come in the front door less than an hour after I&#8217;d left, and wisely didn’t say anything.  I took off the outfit, hung it up, and never wore it again.</p>
<p>I should have thrown it away immediately.  It might still be in the closet in the house I grew up in.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/family/'>Family</a>, <a href='http://trixter.oldskool.org/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/739/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/739/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=739&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/09/16/a-quick-vignette/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>The esoteric side of DOS-era soundcards</title>
		<link>http://trixter.oldskool.org/2012/08/30/the-esoteric-side-of-dos-era-soundcards/</link>
		<comments>http://trixter.oldskool.org/2012/08/30/the-esoteric-side-of-dos-era-soundcards/#comments</comments>
		<pubDate>Fri, 31 Aug 2012 00:03:46 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Demoscene]]></category>
		<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=728</guid>
		<description><![CDATA[A user on a vintage computing forum recently asked if anyone had an Adlib Gold for sale.  Actually, pleading would be more accurate, because the Adlib Gold is an exceedingly rare card due to being completely crushed in the marketplace by Creative.  (Which is a shame, because the Gold had much better digital and FM [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=728&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>A user on a vintage computing forum recently asked if anyone had an <a href="http://en.wikipedia.org/wiki/Ad_Lib,_Inc.#AdLib_Gold">Adlib Gold</a> for sale.  Actually, <em>pleading</em> would be more accurate, because the Adlib Gold is an exceedingly rare card due to being completely crushed in the marketplace by Creative.  (Which is a shame, because the Gold had much better digital and FM sound quality, but as many industries illustrate, being first (or best, or even first+best) in the marketplace does not guarantee success.  Microsoft and Apple have many interesting multicolored stains on the soles of their boots.)</p>
<p>I&#8217;m one of the people this user probably hates, as I own not one but two Adlib Golds, one loose and another open-but-hopefully-complete-in-box. (I also have three <a href="http://www.vintage-computer.com/vcforum/showwiki.php?title=Hardware:IBM+Music+feature+card">IBM Music Feature</a> cards, as well as an <a href="https://groups.google.com/forum/?fromgroups=#!topic/comp.sys.ibm.pc.hardware/gOEg7bA9DoE">MSound Stereo</a>, giving him four more reasons to hate me.) And until I get my &#8220;Sound Card Museum&#8221; project up and running, and have the card fully documented, I&#8217;m unwilling to let either of mine go.</p>
<p>But it got me thinking:  If you want to have fun exploring a high-quality, quirky, or just historically interesting sound card for your vintage rig, there are plenty of other options that grace ebay on a semi-monthly basis.  For example, the <a href="http://en.wikipedia.org/wiki/Media_Vision_Pro_AudioSpectrum">Pro Audio Spectrum series</a> is interesting in that one of the models (maybe more?) can be put into an 8-bit ISA slot and give even a lowly 808x machine 16-bit 44.1Khz stereo sound. Later PAS cards had 3D in the name (Pro 3D Spectrum IIRC) and had a &#8220;surround&#8221; bit you could flip for some fake surround. Some clone cards could do all sorts of wacky emulation; I have an Aztech Sound Galaxy NX Pro 16 that can emulate the <a href="http://en.wikipedia.org/wiki/Covox_Speech_Thing">Covox Speech Thing and Disney Sound Source</a>. Some cards somehow manage to tap port ox60 so they can route PC speaker sound through the card (and some Sound Blasters and other cards have a cable jack that plug into the motherboard for that). The <a href="http://www.wavetable.nl/?cat=114">Sound Blaster 16 ASP</a> has a programmable DSP that can be used for realtime compression/decompression of ADPCM audio as well as <a href="http://en.wikipedia.org/wiki/QSound">QSound</a>, although only one game supports the ASP that I know of, name escapes me at the moment. You can almost always find an <a href="http://en.wikipedia.org/wiki/MT-32">MT-32</a> or an<a href="http://en.wikipedia.org/wiki/Roland_LAPC-I"> LAPC-1</a> on ebay now and then, and those will obviously add dimension to most games published from 1989 to 1993. For truly amazing General MIDI sound, you can still sometimes find the original <a href="http://en.wikipedia.org/wiki/Roland_SCC-1#Roland_SCC-1">Roland SCC-1</a> which not only practically defined <a href="http://en.wikipedia.org/wiki/General_MIDI">the GMIDI standard</a> but still remains one of the best-sounding cards for GMIDI (some of the MIDI files that actually use the <a href="http://en.wikipedia.org/wiki/Roland_GS">GS extensions</a> sound pretty damn amazing). While high-end and not very compatible with games, the <a href="http://alasir.com/software/multisound/">Turtle Beach Multisound</a> has really great MIDI wavetable that should be heard at least once.</p>
<p>King of the &#8220;interesting&#8221; sound cards is the <a href="http://en.wikipedia.org/wiki/Gravis_Ultrasound">Gravis Ultrasound</a>. Very wacky, very capable, very limited, very unlimited. It can produce simultaneously the very worst and the very VERY best sound you&#8217;ve ever heard, depending on how well the application programmers understood the card. Some games get small speed-ups with a Gravis card because it is capable of playing up to 32 digital channels out of its onboard wavetable RAM, giving the CPU some more time to render frames. You can put the Gravis into any 286 or higher that has a true NMI. If you put it in a 386 or higher, <a href="http://www.oldskool.org/demos/explained/demo_reviews.html#featureddemos">find yourself some demos</a> that support the GUS and prepare to be amazed at what your old slow computer can do. (Bonus non-sound-related hint: You can get Doom (not Doom II) running at nearly the full framerate on a 386-40 by hitting F5 as soon as the game starts to throw it into low-res mode.)</p>
<p>Sometimes a very uninteresting/dull/plain card can be put to very interesting uses; for example, DOS-era MPC-era gaming, where the audio consists entirely of redbook audio tracks (even the interactive speaking parts). This is something that emulation still has some trouble getting right (namely, the sync is delayed/off/slips), but on real hardware it usually works. I have a Tandy 2500 sx-25 that has a CDROM interface card with stereo RCA jacks &#8212; it&#8217;s perfectly capable of playing <a href="http://www.mobygames.com/game/dos/jones-in-the-fast-lane">Jones in the Fast Lane</a> or <a href="http://www.mobygames.com/game/dos/loom">Loom</a> or <a href="http://www.mobygames.com/game/dos/secret-of-monkey-island">Monkey Island</a> (MPC edition) or <a href="http://www.mobygames.com/game/dos/inca">INCA</a> or any other redbook audio-based game with no sync issues whatsoever without needing a secondary sound card (although having a real sound card adds more dimension to those games).</p>
<p>And finally, if you want to give even a truly shitty card the opportunity to sound awesome, grab yourself some decent <a href="http://modarchive.org/">Amiga MODs (or .S3Ms, or .ITs, or .XMs) </a>and fire up a decent modplayer (or better, the tracker that originally created them). A 386-25 can calculate 8 or more digital channels mixed together in decent quality realtime and then feed that to your crap SB clone. If you have a Tandy TL/SL/RL machine with the built-in DAC, &#8220;<a href="http://www.oldskool.org/guides/tvdog/sound.html">TANTRAKR</a>&#8221; is an excellent modplayer that uses the DAC and even on an 8086 can play 4-channel MODs decently.</p>
<p>You can even have some fun with the Covox Speech Thing (and other LPT DACs like the Disney Sound Source). The Covox by itself isn&#8217;t very interesting and also draws quite a bit of CPU when playing audio, but if you have the [B]software[/B] that came with the Speech Thing, it gets more interesting. The software contains some interesting utilities including an 8:1 speech compression method that actually works (modified <a href="http://en.wikipedia.org/wiki/Continuously_variable_slope_delta_modulation">CVSD</a>) as well as a 2:1 compression scheme that works very well with music. Don&#8217;t have a Speech Thing? <a href="http://www.epanorama.net/circuits/lptpower.html">Build your own</a> using a handful of resistors and some wire!</p>
<p>So yes, it is unfortunate that the Adlib Gold is somewhat of a holy grail when it comes to PC DOS-era soundcards, but that doesn&#8217;t mean you can&#8217;t explore <a href="http://shiru.untergrund.net/1bit/pivot/entry.php?id=162">some other dark corners of DOS audio</a>.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/demoscene/'>Demoscene</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/728/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/728/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=728&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/08/30/the-esoteric-side-of-dos-era-soundcards/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>You couldn&#8217;t be a total idiot</title>
		<link>http://trixter.oldskool.org/2012/07/09/you-couldnt-be-a-total-idiot/</link>
		<comments>http://trixter.oldskool.org/2012/07/09/you-couldnt-be-a-total-idiot/#comments</comments>
		<pubDate>Tue, 10 Jul 2012 01:22:09 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Sociology]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=715</guid>
		<description><![CDATA[One of the things I miss about the first decade of personal computing was that nearly every computer enthusiast you met  &#8211; on BBSes, in computer stores, etc. &#8212; was pretty good at using them.  Early personal computing meant you couldn&#8217;t be a total idiot and still use a computer, unlike today.  So if you [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=715&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>One of the things I miss about the first decade of personal computing was that nearly every computer enthusiast you met  &#8211; on BBSes, in computer stores, etc. &#8212; was pretty good at using them.  Early personal computing meant you couldn&#8217;t be a total idiot and still use a computer, unlike today.  So if you met someone who used computers enough and liked doing so, chances are they were not an idiot.</p>
<p>I think it&#8217;s amazing how much of a commodity personal computers have become.  Last year, my then 2-yr-old nephew could navigate an ipad without any help, even though he wasn&#8217;t talking yet.  My 12-yr-old son has a typical smartphone, which means he can send sound, images, and data to anyone in the entire world no matter where he is &#8212; that&#8217;s stuff I used to watch on Star Trek, and now it&#8217;s reality!  That&#8217;s both pretty damn scary and pretty awesome.  But I think what&#8217;s missing is the element of discovery, of natural intellectual curiosity, trying to figure out what the machine can do, why and how it does what it does, and how to push it farther.  That&#8217;s what I miss about the early days, and is probably why I have 27 old computers stuffed into my crawlspace, with 1 or 2 in regular circulation.</p>
<p>I feel like that intellectual-curiosity-for-tech has been lost from the general public in the last 10-15 years.  Maybe I&#8217;m wrong and it never existed at all, and I was just lucky enough to always be surrounded by people who were interested in computers in my youth.</p>
<p>A month ago, the newly-unearthed <a href="http://www.mobygames.com/game/pc-booter/mule">M.U.L.E. for the PC</a> (more on that in a later post) got hours of use as my 12-yr-old and his friend played several games.  Because we didn&#8217;t have the manual at the time, there was much experimentation and probing on what keys to press and how the game mechanics worked.  A few months ago, they did the same thing playing 2-player simultaneous <a href="http://www.mobygames.com/game/pc-booter/zyll">Zyll</a>, where they poked and prodded every square inch of the game to try to see what made it tick (and when I surprised them with a dot-matrix-printed Zyll FAQ after they&#8217;d played for a few hours, they just about lost their shit).</p>
<p>My point is that they were really into it, and I can&#8217;t help but wonder why they aren&#8217;t into much neater tech they own that has vastly more power and flexibility.  I never see them as enthusiastic around their xbox or iphone as they were playing these old games and trying to figure out how to drive them.  They might be enthusiastic about the game they&#8217;re playing or the people they&#8217;re playing with, but never the machine itself.</p>
<p>Why is that?  Does a device lose all interest once it has been through commoditization?</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/sociology/'>Sociology</a>, <a href='http://trixter.oldskool.org/category/technology/'>Technology</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/715/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/715/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=715&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/07/09/you-couldnt-be-a-total-idiot/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Wow, that stuff sure is old</title>
		<link>http://trixter.oldskool.org/2012/06/14/wow-that-stuff-sure-is-old/</link>
		<comments>http://trixter.oldskool.org/2012/06/14/wow-that-stuff-sure-is-old/#comments</comments>
		<pubDate>Thu, 14 Jun 2012 20:07:29 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Vintage Computing]]></category>
		<category><![CDATA[pc clone]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=719</guid>
		<description><![CDATA[Much of the retrocomputing hobby today is about looking at old stuff and saying Wow, that stuff sure is old!  Things sure were different back then!  Well, screw that.  For me, retrocomputing falls into two required categories:  Learning and Doing.  If your website or podcast just shows old things without either 1. Extensive history or [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=719&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Much of the retrocomputing hobby today is about looking at old stuff and saying <strong>Wow, that stuff sure is old!</strong>  <strong>Things sure were different back then!</strong>  Well, screw that.  For me, retrocomputing falls into two required categories:  Learning and Doing.  If your website or podcast just shows old things without either 1. Extensive history or 2. Drawing some conclusions about the item and/or relating it to something relevant, then you’re just wasting everyone’s time.  &#8221;Doing&#8221; feeds into &#8220;Learning&#8221;, because there’s an entire level of information hidden from you until you touch it.  Don’t just look at the damn thing, make it do something!</p>
<p>There are generally two types of retrocomputing snobs:  People who think that “computers were better back then” and just want to reminisce because today’s world is complicated, confusing, and scary, and people like me who think that there should be a point to the hobby.  There are way too many of the former and not nearly enough of the latter.</p>
<p>On that note, this is probably a good time to announce that I&#8217;ll be working on an &#8220;oldskool PC&#8221; podcast late this summer.  There are many podcasts dedicated to the C64, Apple II, Amiga, Atari, etc. machines but none<a href="#footnote"><span style="text-decoration:underline;">*</span></a> that cover the first decade of IBM PC and PC clone retrocomputing.  That&#8217;ll be me.</p>
<p>Suggestions welcome, but I already have about 30 topics I plan on covering, like hooking an old PC up to the internet, archiving data off old machines and floppies, interesting programming quirks, music and sound, and of course games and gaming.  Because I dislike long rambling podcasts I can&#8217;t consume in short bites, each episode will likely be under 15 minutes in length, and extremely dense.  If you&#8217;re curious what I sound like, I recorded <a href="http://hackerpublicradio.org/eps.php?id=0660">my very first podcast for Hacker Public Radio</a> last year, which you are free to point and laugh at.  (Unfortunately, I rambled a bit in that one, but hey, first podcast.)</p>
<p><a name="footnote"></a><br />
<em><small><span style="text-decoration:underline;">*</span> There are <a href="http://trixter.oldskool.org/2011/02/13/dopplegangers/">a few</a>, but they deal mostly with gaming and not with retrocomputing itself.  I&#8217;m also familiar with the<a href="http://rcrpodcast.com/"> Retro Computing Roundable</a>, but they only rarely cover PC/clones.</small></em></p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/719/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/719/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=719&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/06/14/wow-that-stuff-sure-is-old/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Memories of NAID</title>
		<link>http://trixter.oldskool.org/2012/06/06/memories-of-naid/</link>
		<comments>http://trixter.oldskool.org/2012/06/06/memories-of-naid/#comments</comments>
		<pubDate>Wed, 06 Jun 2012 22:45:13 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Demoscene]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=711</guid>
		<description><![CDATA[In anticipation of the NAID organizers visiting @party this year, and unable to attend myself, I spent some time working up a video DVD of all the high-quality NAID footage I had copies of.  It&#8217;s called &#8220;Memories of NAID&#8221; and includes the following footage: &#8220;NAID &#8217;95&#8243; tape compiled by the organizers &#8220;NAID &#8217;96&#8243; tape compiled [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=711&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>In anticipation of <a href="http://atparty-demoscene.net/whos-coming-so-far/">the NAID organizers visiting @party this year</a>, and unable to attend myself, I spent some time working up a video DVD of all the high-quality NAID footage I had copies of.  It&#8217;s called &#8220;Memories of NAID&#8221; and includes the following footage:</p>
<ul>
<li>&#8220;NAID &#8217;95&#8243; tape compiled by the organizers</li>
<li>&#8220;NAID &#8217;96&#8243; tape compiled by the organizers</li>
<li>&#8220;IC and Soundgun do NAID &#8217;96&#8243; by IC, with a 2012 introduction by IC</li>
<li>Four local news programs on NAID &#8217;95</li>
<li>8 minutes of NAID &#8217;95 registration and guestbook signing with lots of familiar faces</li>
<li>2 minutes of NAID &#8217;96 classroom footage</li>
</ul>
<p>It&#8217;s a little over 2 hours of footage of the height of the 1990s NA demoscene.  Also included on the DVD-ROM section is Phoenix&#8217;s <a href="http://web.archive.org/web/20020115141439/http://users.erols.com/vossa/naid/">NAIDorabilia</a> which is all of the demos, music, party reports, and other miscellany associated with both NAID parties.</p>
<p>The footage is fully interlaced, preserving that &#8220;video verite&#8221; look. I chose to distribute it as a DVD because that was the only way I could guarantee people would see all 60 fields per second. (Unless something has changed in the last year, no online streaming video service (Youtube, Vimeo, etc.) supports 30i material properly&#8230; although that&#8217;s a moot point anyway, since there is some very well-known copyrighted music in parts of the footage which would probably get it rejected from such services anyway.)</p>
<p>You can <a href="http://archive.org/details/memories-of-naid-dvd">download the DVD .ISO at archive.org</a>, but if that is gone for some reason, there is a slower download link here:  <a href="ftp://ftp.oldskool.org/pub/misc/Video/MemoriesOfNAID.iso">ftp://ftp.oldskool.org/pub/misc/Video/MemoriesOfNAID.iso</a></p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/demoscene/'>Demoscene</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/711/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/711/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=711&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/06/06/memories-of-naid/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Data Preservation Case Study: AT&amp;T 6312 WGS</title>
		<link>http://trixter.oldskool.org/2012/05/27/data-preservation-case-study-att-6312-wgs/</link>
		<comments>http://trixter.oldskool.org/2012/05/27/data-preservation-case-study-att-6312-wgs/#comments</comments>
		<pubDate>Sun, 27 May 2012 18:59:26 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=700</guid>
		<description><![CDATA[One of my hobbies is taking old IBM PCs (and clones) and restoring them.  &#8221;Restoring them&#8221; can mean anything, but for me, it usually means these three things: Get the hardware functional and booting up Archive the data off of any internal hard drives Wipe the hard drives clean and set it up for appropriate [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=700&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://trixter.files.wordpress.com/2012/05/2012-05-26-15-44-001.jpg"><img class="aligncenter size-full wp-image-702" title="AT&amp;T 6312 archival setup" src="http://trixter.files.wordpress.com/2012/05/2012-05-26-15-44-001.jpg?w=1024&#038;h=768" alt="" width="1024" height="768" /></a></p>
<p>One of my hobbies is taking old IBM PCs (and clones) and restoring them.  &#8221;Restoring them&#8221; can mean anything, but for me, it usually means these three things:</p>
<ol>
<li>Get the hardware functional and booting up</li>
<li>Archive the data off of any internal hard drives</li>
<li>Wipe the hard drives clean and set it up for appropriate use</li>
</ol>
<p>I did that last night to a new acquisition, an AT&amp;T 6312 WGS.  This is one of the later &#8220;workstation&#8221;-class 286 machines that AT&amp;T OEM&#8217;d from Olivetti, and I got it from a former AT&amp;T/Teletype/Lucent employee (which is common, since they sold them to internal employees at a discount.  If you want to learn more about AT&amp;T and their computer history, check out <a href="http://www.youtube.com/watch?v=mUCh46_MzZU">a video I made on the AT&amp;T PC 6300</a>.)</p>
<h1>Step 1: Get the hardware functional and booting up</h1>
<p>On opening it up, I saw both an internal hard drive and a second hardcard, a Western Digital PS30 which was a 32MB drive+card meant for the PS/2 Model 30.  I also saw a rechargeable battery pack, long since depleted, and sure enough, on bootup, the 6312 complained that it had no idea what the date/time was or what hard drive was installed in the system.  Furthermore, the PS30 hardcard started executing its option ROM at CA00 but then later spat out the dreaded <strong>1701</strong> error message, indicating that the drive was non-functional.  Fixing this requires the setup disk for the 6312 (which it helpfully barked at me during the BIOS POST), and thankfully <a href="http://www5.ncr.com/support/support_drivers_patches.asp?Class=pc_library_63xx">NCR still had it available for download.</a>  But when I got the file, I noticed with frustration that it was <em>not</em> a bootable disk image, but rather just a collection of files that came <em>from</em> the original bootable disk &#8212; and it had a specialized COMMAND.COM, which means they likely wouldn&#8217;t run by themselves and needed the specific boot disk environment to work.  You can&#8217;t just copy the DOS kernel files IBMBIO.COM and IBMDOS.COM to a disk and expect them to boot properly without a lot of work (usually the SYS command does this, but only for the DOS you currently have booted, so that wouldn&#8217;t work for me).</p>
<p>Sometimes restoration work requires creativity, and sometimes it just requires experience and educated guesses.  I used the latter to reconstruct the 6312 setup disk.  First, I looked at the <a href="http://www.pagetable.com/?p=184">IBMBIO.COM</a> and IBMDOS.COM startup portions of DOS in a hex editor and determined that it was an AT&amp;T OEM version of DOS (not surprising, really).  I figured I could find disk images of that DOS and use those to make a bootable disk on another vintage computer and then copy the 6312 setup files onto it.  Luckily, AT&amp;T only produced two versions of DOS that supported hard drives, 3.2 and 3.3.  I checked the 3.2 image and sure enough the copyright string was identical and so were the IBMBIO/IBMDOS sizes, so I now had my bootable DOS disk to use.  But I had another problem:  The setup files were larger than a 360K disk.  This meant the 6312 setup disk was a 1.2MB floppy &#8212; and I didn&#8217;t have any vintage machines set up and working with a 5.25&#8243; high-density 1.2MB floppy.  I know I could have tried to do things like take out the drive cage and swap cables, but I have a strong philosophy on trying to get the data off of the machine <strong>before</strong> messing with its innards (in case I break something).  So, I used a second vintage machine with both a double-density 5.25&#8243; (360K) and 3.5&#8243; (720K) drives in it to help me, and followed this procedure:</p>
<ol>
<li>Helper PC: Make an AT&amp;T DOS 3.2 bootable 360K disk.  Make a .ZIP file of the setup files and put those on a 720K disk along with pkunzip.exe</li>
<li>6312: Boot the 360K disk and use it to run &#8220;format a: /s&#8221; to make a working 1.2MB bootable disk.  Put in the 720K disk and extract the setup files to the 1.2MB A: drive, taking care <em>not</em> to touch IBMBIO.COM and IBMDOS.COM.</li>
</ol>
<p>That wasn&#8217;t so terrible, and I didn&#8217;t have to crack the drive cage open or attempt other trickery.</p>
<p>Once I could boot the setup program, I noticed I had over 30 hard drive types to choose from, and I couldn&#8217;t determine what the internal drive was because it was located underneath the floppy drives.  How to pick the right type without removing the drive to look at it?  While I could have tried all 30+ combinations, rebooting after each one and seeing if that worked, I did something much easier:  I set it to Type 1, a &#8220;10 MB&#8221; drive, just so the system would try to boot.  I then booted off of a floppy with Norton Diskedit and used it to look at the first sector of the drive (which will always work no matter what drive type you have, because it&#8217;s track 0 head 0 sector 0), choosing View-&gt;As Partition Table, and seeing how many tracks/sides/sectors per track there were.  There were 611 tracks defined, 17 sectors per track, and everything added up to 20MB.  So, we have a 20MB drive.  I checked a few CMOS drive table types online looking for 20MB drives with 600-ish tracks and 17spt and decided to try Type 16, which worked!  I could see the first hard drive&#8217;s contents, and after using LIST to check a few files, I was confident I had the geometry right.</p>
<p>This brought me to the second hard drive, the PS30 hardcard.  Every boot, I kept getting the 1701 error, which is usually drive death.  But on closer examination, I could see that the stepper motor axle was exposed &#8212; I could literally turn it with my fingers without dismantling anything.  I worked the stepper motor a few times, turned the machine back on, and it spun up and seeked!  The ROM on the card was smart enough to handle being the second drive as well as setting up the drive type/table; when I booted the machine, it showed up as D: and everything on it was readadble.</p>
<p>At this point, we have the 6312 back to its original operational capacity.  This entire process took about 2 hours, about half of which was careful thought on how to proceed.</p>
<h1>Step 2: Archive the data off of any internal hard drives</h1>
<p>There are two schools of thought on dealing with the data on old machines: Wipe the drives clean, or archive them.  Some people immediately wipe them, out of a sense of privacy for the previous owner, or maybe because they don&#8217;t want to unintentionally break any privacy laws.  I don&#8217;t do this; I try to preserve everything.  The main reason is that there might be a driver on the hard drive that is necessary in getting the thing working.  For example, there&#8217;s an extended memory board in this 6312 that, with the custom AT&amp;T driver, can also be set up as a hardware LIM EMS board.  Without that driver, I would never have that option.  Another reason is that there might be some rare software on there that has been lost to the ages.  On this machine, I found a fantastic DOS version of VI that works better than any other VI clone I&#8217;ve run on a DOS machine, and I&#8217;d never heard of the product or the company before.  Researching it further, there&#8217;s a good reason:  It&#8217;s Custom Software Systems&#8217; &#8220;PC/VI&#8221; and it was based on AT&amp;T source which is why it works so damn well &#8212; and they hadn&#8217;t purchased a license for the source and it went off the market after only a year, which is why I hadn&#8217;t heard of it!</p>
<p>Poking around an old hard drive is sometimes like archaeology; you always find a piece of the prior owner there.  My favorite example of this was a no-name taiwanese clone I got as a gift a few years back.  The previous owner was a Chinese immigrant and had her college homework on it.  She was studying both business and politics, and the homework reflected how dry and boring it all was.  But tucked away in a corner of the drive was a single directory that contained several poems written by her &#8212; an oasis of creativity in the middle of all the tedium of trying to get an MBA.</p>
<p>To date, I haven&#8217;t spread my &#8220;system archives&#8221; around, out of respect for the prior owner.  (I&#8217;m not worried about privacy laws though:  If they threw it out, then they threw out their right to privacy.  This is why dumpster diving is legal, and why private investigators dig through people&#8217;s trash &#8212; anything they find, they can legally use.)</p>
<p>Okay, you&#8217;ve made the decision to get the data off the drives before they go bad, and a requirement is that the drives not be written to or altered during the process.  There are many different ways to do this, so I&#8217;ll outline a few:</p>
<ol>
<li>The hard way (floppies).  Using completely free software (ARJ, RAR for DOS, or PKZIP) and some pre-formatted floppies, you can just start archiving.  The big disadvantage to this is time, effort (it&#8217;s a manual process), and the risk of getting a bad floppy that you can&#8217;t read on the target halfway through your stack.  I only do this if I have one floppy&#8217;s worth of data to suck off the drive.</li>
<li>Use a backup program.  This is the fastest way to format and write to floppy disk media, and you get error-correction thrown in for free, but the drawback is that you need another vintage computer to read the backups (one that can accept the floppy media and has enough space to hold the files, as well as a way to get them off to something more usable like through a network connection).</li>
<li>Install a network card.  You can attempt setting up <a href="ftp://ftp.microsoft.com/BusSys/Clients/LANMAN/">MS Lan Manager</a> to mount a samba share as a drive letter, but sometimes I like to just load a packet driver and use <a href="http://www.brutman.com/mTCP/">mTCP</a> to set up an FTP server and just suck the files off.  A lot less hassle.</li>
<li>Connect external storage.  <a href="http://www.ebay.com/sch/i.html?_nkw=iomega+zip+drive+100+parallel&amp;_sacat=0&amp;_odkw=iomega+zip+drive+parallel&amp;_osacat=0">ebay is just <strong>maggoty</strong> with Iomega parallel-port ZIP drives</a>, and as long as you&#8217;re trying to suck data off of a 286 or higher and can boot DOS 5.0 or higher (even from a floppy disk), they work great.  Each disk holds 100MB which is more than enough for most MFM and RLL drives.  One of these and XCOPY or PKZIP is all you need, and if you don&#8217;t have another machine to hook them up to, you can turn around and pull #3 (install network card) and upload the results.</li>
<li>Parallel or Serial cable.  Laplink, FastLynx, and even DOS 6.x&#8217;s built-in INTERLNK can all transfer files over cable.  It&#8217;s inconvenient and not too swift, but it works.  I prefer FastLynx, which has exactly the same code as INTERLNK but has a nifty interface and can use realtime compression.</li>
</ol>
<p>For the 6312, I chose the zip-drive-then-ftp-to-my-fileserver route.</p>
<h1>Step 3: Wipe the hard drives clean and set it up for appropriate use</h1>
<p>Wiping the drives clean is easy &#8212; you can just delete all of the data and then run Norton WIPEDISK.  If you&#8217;re more paranoid, you get to locate your drive&#8217;s low-level format program and have at it, secure in the knowledge that you&#8217;re laying down the low-level format at the same time (just make sure you enter in the defect table from the sticker on top of the drive!).</p>
<p>As for &#8220;appropriate use&#8221;, that is completely in the eye of the beholder.  Because this is an AT&amp;T &#8220;WGS&#8221; machine (meant for <strong>w</strong>ork<strong>g</strong>roups), I&#8217;m going to leave all of the AT&amp;T-specific software on it (there are some terminal emulators on it, etc.) and I&#8217;m going to set it up as a business-class PC:  A word processor or two, all of my typical programming tools and environments (Turbo Pascal, Turbo Debugger, Turbo Assembler, and a86/d86), and a network card with both the mTCP suite on it as well as MS LAN Manager.  I&#8217;ll configure the machine to boot up and set the time automatically via SNTP, and I&#8217;ll also investigate MS lanman so that it can mount my local SAMBA shares.  This will require a more beefy DOS than 3.2, so PC DOS 2000 is probably going to go on there.</p>
<p>Of course I&#8217;m going to throw some games on it too :-) Every system needs games.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/700/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/700/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=700&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/05/27/data-preservation-case-study-att-6312-wgs/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>

		<media:content url="http://trixter.files.wordpress.com/2012/05/2012-05-26-15-44-001.jpg" medium="image">
			<media:title type="html">AT&#38;T 6312 archival setup</media:title>
		</media:content>
	</item>
		<item>
		<title>I grow tired of the technologically ignorant</title>
		<link>http://trixter.oldskool.org/2012/02/29/i-grow-tired-of-the-technologically-ignorant/</link>
		<comments>http://trixter.oldskool.org/2012/02/29/i-grow-tired-of-the-technologically-ignorant/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 19:30:13 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Digital Video]]></category>
		<category><![CDATA[Entertainment]]></category>
		<category><![CDATA[Sociology]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Vintage Computing]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=682</guid>
		<description><![CDATA[(This post is overly subjective, more opinionated than my usual efforts, and contains some cussing.  Consider yourself warned.) I am sick and tired of people who shun technology and progress under the guise of &#8220;I&#8217;m an old tech veteran, I&#8217;ve been working with technology for 30 years, and the new stuff is crap compared to [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=682&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>(This post is overly subjective, more opinionated than my usual efforts, and contains some cussing.  Consider yourself warned.)</p>
<p>I am sick and tired of people who shun technology and progress under the guise of &#8220;I&#8217;m an old tech veteran, I&#8217;ve been working with technology for 30 years, and the new stuff is crap compared to the old stuff.&#8221;  People who defend this viewpoint are idiots.  I&#8217;m not talking about audiophiles or other self-delusional &#8220;prosumers&#8221;; I&#8217;m talking about people who have worked a tech trade or had hands-on access to technology for many years and think that their perceptions trump reality.  It&#8217;s a perverse combination of technology and <a href="http://en.wikipedia.org/wiki/Anti-intellectualism">anti-intellectualism</a> &#8211; a form of hipsterism for the over-40 set.</p>
<p>I was prompted to cover this by a recent post on why widescreen monitors are a rip-off (which I will not link to because I truly enjoy the other 99% of this person&#8217;s blog, and linking to it would imply that I don&#8217;t like him or his site), but the underlying irritation of the entire mindset has been percolating for many years.  Viewpoints that drive me crazy include:</p>
<h2>Widescreen monitors don&#8217;t make any sense</h2>
<p>People think that widescreen monitors are stupid on laptops because most people use laptops for text work, and since text is more comfortable to read in columns, wide columns are harder to read.  This mindset has had the doubly idiotic result of making people think that websites need to be column-limited.  I just love going to a website and having the text squished into a 640-pixel-wide column with 75% of the screen unused.  Don&#8217;t like how narrow columns look on a widescreen monitor?  Use the extra space however you want &#8212; put up two web pages side by side, or simply <em>don&#8217;t look at the unused space</em>.  It&#8217;s people like these that also complain that 4:3 video has black bars on either side of it when viewed on a widescreen TV.  It&#8217;s called <a href="http://en.wikipedia.org/wiki/Pillarbox">pillarboxing</a>, you idiot, and it&#8217;s there to prevent your movie from <a href="http://2.bp.blogspot.com/_HBxGU2ecXSs/SxQYD5Ow7-I/AAAAAAAABoQ/JKj70mzpiAc/s1600/16_9_with_4_3_stretch.jpg">looking like a funhouse mirror</a>.</p>
<p>Widescreen monitors have made modern laptops <em>better</em>.  A widescreen laptop monitor allows the keyboard to be wider without the depth of the laptop getting too high (to support the height of a 4:3 monitor).  Having a decent keyboard on a laptop used to be impossible without <a href="http://en.wikipedia.org/wiki/IBM_ThinkPad_Butterfly_keyboard">clever wacky engineering tricks</a>; now it is.  Widescreen monitors made ultra-small netbooks possible, so if you&#8217;re reading this on a netbook but somehow still disagree with me, you&#8217;re a hypocrite.</p>
<h2>Analog audio is better than digital</h2>
<p>There are entire websites (and <a href="http://en.wikipedia.org/wiki/Comparison_of_analog_and_digital_recording">wikipedia pages</a>) dedicated to this, usually under the guise of &#8220;vinyl is better than CD&#8221;.  Most opinions on this subject were formed when analog audio had several decades of mature mastering and production processes, and digital was brand-new (for example vinyl vs. CD in 1983).  Early efforts to put things on CD resulted in some less-than-stellar A/D conversion, which created a type of distortion that most people weren&#8217;t used to hearing.  People formed opinions then that have perservered more than 25 years later, even though the technology has gotten much better and all of the early mastering problems have long since been corrected.</p>
<p>People who think vinyl sounds better than CD have nostalgia blinders on.  They bought an album in their youth, played it endlessly, loved it.  Then they buy the same album on CD decades later and condemn the entire format as inferior because it sounds different.  Want to know why it sounds different?  It has a wider frequency range, lacks rumble, lacks hiss, sounds exactly the same after 10+ playbacks, and was remastered with better technology and mixing conditions under the guidance and approval of the original artist when he wasn&#8217;t coked or drunk or stoned out of his mind.  People like Pete Townsend, Neil Young and Geddy Lee not only approve of the latest digital technology but are <a href="http://ultimateclassicrock.com/the-whos-pete-townshend-reveals-how-he-curated-the-quadrophenia-box-set/">actively utilizing it and going through great pains to remaster their classic albums with it</a>.  People are missing the point that it is the mastering and digital compression that causes issues, not the technology itself.  <a href="http://www.wired.com/epicenter/2012/01/neil-young-steve-jobs-atd/">Neil Young recently spoke at a conference</a> where he damned digital music, but not because it is digital &#8212; rather, because it is delivered differently than the artists intended.  Neil Young would like nothing better than for everyone to be able to <a href="http://www.neilyoungarchives.com/NYAFAQ.html">listen to his music at 24/192</a>.  Can&#8217;t do that on vinyl, bitches.</p>
<p>Even people who write about <a href="http://en.wikipedia.org/wiki/Loudness_war">the loudness war</a> get it wrong, despite that it&#8217;s an easy concept to understand.  Massive dynamic compression drowns out subtle details and can add distortion, which is horrible &#8212; but it is not exclusive to digital audio, nor caused by it.  <a href="http://www.lenrek.net/arts/loudness-war/">One author</a> correctly notes that massive dynamic compression butchers mixes, but then subtlety implies that all CDs that &#8220;clip&#8221; have distorted audio.  Digital audio &#8220;clips&#8221; only if you drive the signal beyond its digital limits.  If you took an audio waveform and normalized it such that the highest peak reached exactly the highest value, it is &#8220;positioned at maximum volume&#8221;, not clipped.  Nothing is lost (to be fair, nothing is gained either).</p>
<p>The problem is the mastering and production process, not the technology.  Which segues nicely into:</p>
<h2>&#8220;I will never buy Blu-ray&#8221;</h2>
<p>The only <strong>valid</strong> argument against Blu-ray is that it is harder to make a backup copy of the content.  It is indeed harder than it is for DVD, or laserdisc, or videotape.  That is <strong>it</strong>.  All other arguments are beyond moronic.  Even the cheapest possible 1080p HDTV viewing setup has <strong>five times</strong> the resolution of DVD and lacks signal degradation in the output path.  If you view a Blu-ray and can&#8217;t tell the difference between it and DVD, you have either a shitty viewing setup, a shitty Blu-ray, or a shitty <a href="http://en.wikipedia.org/wiki/Visual_cortex">visual cortex</a>.</p>
<p>Someone recently tried to argue with me that DVDs have the same or better picture than Blu-ray and used Robocop as an example.  The comparison was weighted, as they were comparing the $9 Blu-ray that MGM belched out when Blu-ray was only a year old to <a href="http://www.criterion.com/films/542-robocop">the Criterion DVD treatment</a>.  I own both, so I checked them out and I agree that the DVD has better color tonality throughout the film.  However, the Blu-ray thoroughly stomped the DVD in every single other area, most obviously resolution.  So much picture detail is added by the increase in resolution that I actually prefer it despite the lack of Criterion oversight.</p>
<p>The real problem, as previously stated, is how the mastering and preproduction process was handled.  Even with new 2012 DVD releases, you can still see the &#8220;loudness war&#8221; video equivalent of digital ringing, which used to be an accident but was later introduced <em>on purpose</em> as part of a misguided &#8220;<a href="http://en.wikipedia.org/wiki/Edge_enhancement">sharpening</a>&#8221; step.  Listen up:  Any sharpening filter added to any signal doesn&#8217;t make things sharper; it makes them <em>appear</em> sharper by overlaying a high-frequency permutation signal over the original content, which increases the <a href="http://en.wikipedia.org/wiki/Acutance">acutance</a>.  Quality is actually <strong>lost</strong> when you do this, as the high-frequency info <em>obscures actual picture detail</em>.</p>
<p>This is another example of perception vs. reality, which not coincidentally also segues into:</p>
<h2>&#8220;Computing was better in the old days&#8221;</h2>
<p>I love retrocomputing as a hobby.  I think about it nearly every day; this blog was partially created to talk about vintage computing.  But even I wouldn&#8217;t say that things were better in the old days.  People who say this don&#8217;t realize they are really trying to say something else.  For example, people who say that &#8220;<a href="http://en.wikipedia.org/wiki/Bulletin_board_system">BBS</a>es were better than web forums are today&#8221; are actually referring to the sociological fact that, when you communicated with people on a BBS, you were communicating with people who met a minimum level of technical competence &#8212; because, if they hadn&#8217;t, they would have been too stupid to access a BBS, let alone be proficient with a computer.  The overall technological quality level of everyone you met on a BBS in the 1980s was higher than other places, like a laundromat or a bar.  What such people fail to consider is that modern web boards, while having a higher quotient of trolls and <a href="http://en.wikipedia.org/wiki/B1FF">B1FF</a>s, are open to the entire world.  The massive scale of humanity you can encounter on even a tiny niche topic is levels of magnitude higher than it used to be.  The sheer scale of information and interaction you can now achieve is staggering, and completely outweighs any minor niggle that you have to deal with 3 or 4 more asshats per day now.</p>
<p>Here&#8217;s another example:  &#8221;Computer games were better back in the old days.&#8221;  This is wrong.  The proper thing to say is that &#8220;Some computer game <strong>genres</strong> were better back in the old days.&#8221;  I can get behind that.  For example, graphics were so terrible (or non-existent!) at the birth of computer gaming that <a href="http://en.wikipedia.org/wiki/Interactive_fiction#Commercial_era">entire industries</a> sprang up focusing on narrative.  For such genres (mainly adventure games), several times more effort was put into the story than other genres.  As technology and audiences changed over time, such genres morphed and combined until they no longer resembled their origins.  That doesn&#8217;t mean modern games are terrible; it just means that you need to shop around to get what you&#8217;re looking for your entertainment.  Don&#8217;t play Uncharted 2 expecting a fantastic story with engaging narrative.  (Dialog, maybe, not not narrative.)  Heck, some genres are <strong>genuinely awesome</strong> today compared to 30 years ago.  For example, Portal and Portal 2 are technically puzzle games, but the storytelling in them &#8212; despite never interacting directly with a human &#8212; is among the very best I&#8217;ve ever encountered.</p>
<p>About the only argument that <em>does</em> work involves the complexity of older computers &#8212; they were simpler, and you could study them intensely until you could very nearly understand every single circuit of the board, nuance of the video hardware, and opcode of the CPU.  Today, <a href="http://prog21.dadgum.com/129.html">a complete understanding of a computer is no longer possible</a>, which probably explains why <a href="http://www.arduino.cc/">Arduino</a> sets and <a href="http://en.wikipedia.org/wiki/Raspberry_Pi">Raspberry Pi</a> are getting so much attention.</p>
<h2>Conclusion</h2>
<p>I have no conclusion.  Stop being an old-fogey anti-intellectual technophobe, you ignorant hipster fuck.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/digital-video/'>Digital Video</a>, <a href='http://trixter.oldskool.org/category/entertainment/'>Entertainment</a>, <a href='http://trixter.oldskool.org/category/sociology/'>Sociology</a>, <a href='http://trixter.oldskool.org/category/technology/'>Technology</a>, <a href='http://trixter.oldskool.org/category/vintage-computing/'>Vintage Computing</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/682/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/682/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=682&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/02/29/i-grow-tired-of-the-technologically-ignorant/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
		<item>
		<title>Collections</title>
		<link>http://trixter.oldskool.org/2012/01/18/collections/</link>
		<comments>http://trixter.oldskool.org/2012/01/18/collections/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 03:37:44 +0000</pubDate>
		<dc:creator>Trixter</dc:creator>
				<category><![CDATA[Lifehacks]]></category>
		<category><![CDATA[Sociology]]></category>

		<guid isPermaLink="false">http://trixter.oldskool.org/?p=678</guid>
		<description><![CDATA[Now that MindCandy is out the door, I’ve had time to return to some of my more favorite pastimes, like retrocomputing.  Perodically the topic of conversation in a retrocomputing forum turns inward as people ask: Why do we collect old computers?  Why dedicate space, power, and time to restoring and using slow, impractical machines when [&#8230;]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=678&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Now that <a href="http://www.mindcandydvd.com/3">MindCandy</a> is out the door, I’ve had time to return to some of my more favorite pastimes, like <a href="http://en.wikipedia.org/wiki/Retrocomputing">retrocomputing</a>.  Perodically <a href="http://www.vintage-computer.com/vcforum/showthread.php?28769-Letting-go-of-a-collection-is-hard">the topic of conversation in a retrocomputing forum turns inward</a> as people ask: Why do we collect old computers?  Why dedicate space, power, and time to restoring and using slow, impractical machines when better ones exist?  I think the question can be expanded to all collectors:  Why does anyone collect anything?  Why go through the trouble of gathering up material items?  Why do we assign personal value to inanimate objects, or derive comfort from them?</p>
<p>I think I can sum it up in three words:  Fear of death.</p>
<p>Everybody needs a coping mechanism for dealing with the inevitability of death.  Social interaction, religion, family, blind ignorance, sex, drugs, and various causes (environmental, human rights) are the most common, but there are people for whom none of those apply.  I believe these people turn to anything that gives them comfort, or used to give them comfort.  Ventriloquists collect <a href="http://www.bestweekever.tv/2011-09-12/the-30-creepiest-stills-from-the-hoarders-ventriloquist-episode/">ventriloquist dummies</a>, maybe because they remind the owner of receiving adoration on stage.  Housewives collect porcelain dolls to glorify their memories of youth.  <a href="http://www.myspace.com/hollywoodsuperman1967">Christopher Dennis</a> has an extensive <a href="http://farm2.static.flickr.com/1058/1224571528_43382a90d8.jpg">collection of Superman memorabilia</a> because the image of Superman is what keeps him alive.  But you don’t have to be down on your luck or unhappy to have a collection; just look at <a href="http://www.jaylenosgarage.com/">Jay Leno</a> or <a href="http://redknotstudio.com/compleatsteve/essays/lifelong.htm">Steve Martin</a>.</p>
<p>For those who grew up using early computers to better themselves or others, it’s not inconceivable that such objects would give them comfort.  I am one of those people, so I have a collection of computers.  It is modest by most hard-core retrocomputist standards; I have around 30, and many are duplicates for parts.  But I definitely spend otherwise productive time hauling them out, getting them working, running old favorites (or new discoveries) on them, and writing software for them.  It reminds me of a time when I was the technological wunderkid, and had control over my environment &#8212; you tell a computer to do something, and it <em>actually does it</em>.  When I “retrocompute”, I have something pleasant to occupy my thoughts, and I gain a sense of accomplishment and completion.</p>
<p>Some collectors in my hobby look at their crawlspace, storage space, shed, or warehouse and wonder how their collection got so big and how they’ll ever get rid of it.  I think the answer is to recognize your collection for what it is:  A coping mechanism.  It should not have any more value beyond that.  Your collection is not a replacement for people.  Your collection is not more important than your job, your marriage, or your kids.  Once you realize that, you can start letting it go.  Maybe only one piece at a time&#8230; maybe never all of it completely.  But you can let go.</p>
<br />Filed under: <a href='http://trixter.oldskool.org/category/lifehacks/'>Lifehacks</a>, <a href='http://trixter.oldskool.org/category/sociology/'>Sociology</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/trixter.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/trixter.wordpress.com/678/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=trixter.oldskool.org&#038;blog=23286&#038;post=678&#038;subd=trixter&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://trixter.oldskool.org/2012/01/18/collections/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/95363aee12ad9bff5db2c4425b22b313?s=96&#38;d=retro&#38;r=PG" medium="image">
			<media:title type="html">Trixter</media:title>
		</media:content>
	</item>
	</channel>
</rss>
