<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>Retro - TechTinkering</title>
<link>http://techtinkering.com/</link>
<description>Retro Articles from TechTinkering - The site devoted to Technical Tinkering, covering Retro computers, Linux, Programming and General Technical Tinkering.</description>
<lastBuildDate>Tue, 16 Jun 2009 14:35:00 GMT</lastBuildDate>
<language>en-gb</language>
<copyright>Copyright 2008 vLife Systems Ltd</copyright><category>Retro</category><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Retro-Techtinkering" type="application/rss+xml" /><item><title>A Quickstart Guide to Editing Paper Tape with the Symbolic Tape Editor on the DEC PDP-8</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/__u_2fwJZpk/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=29</guid><pubDate>Tue, 16 Jun 2009 15:27:26 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]A Quickstart Guide to Editing Paper Tape With the Symbolic Tape Editor on the DEC PDP-8[/title] --&gt;
&lt;!-- [tags]Retro,PDP-8,Editors,DEC[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="115" height="100" src="http://techtinkering.com/images/?id=small_paper_tape.jpg" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;
Before re-writable storage devices, such as tape drives, become popular for the DEC PDP-8, owners had to rely on paper tape.&amp;nbsp; This was fine for loading programs on pre-punched tape, but left the problem of how to put new data onto punched tape and how to edit existing data.&amp;nbsp; This could be done off-line, but a better way was to use DEC&amp;#039;s Symbolic Editor.&amp;nbsp; This made life much easier as it allowed you to interactively edit a tape in a buffer, check the alterations and then output a new tape.&amp;nbsp; This editor was used for quite a few years by those wanting to edit Assembly or FORTRAN source code.&amp;nbsp; What follows is a brief introduction to using this editor.
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;h2&gt;Obtaining the Symbolic Editor and Its Manual&lt;/h2&gt;
The Symbolic Editor can be obtained from, the invaluable resource for retro software and documentation, &lt;a href="http://bitsavers.org"&gt;Bitsavers&lt;/a&gt;.&amp;nbsp; The paper-tape image is called: &lt;a href="http://bitsavers.org/bits/DEC/pdp8/From_pdp8.hachti.de/hachti-pdp8-tapes/DEC-08-ESAB-PB.bin"&gt;DEC-08-ESAB-PB.bin&lt;/a&gt;.&amp;nbsp; This file is loadable by emulators such as SimH, but owners of a real PDP-8 will have to find a way to punch this image to paper-tape.&amp;nbsp; The &lt;a href="http://www.bitsavers.org/pdf/dec/pdp8/software/DEC-08-ESAB-D_EDITOR_Man.pdf"&gt;Symbolic Editor Programming Manual&lt;/a&gt; is also available from bitsavers in PDF format.

&lt;h2&gt;Theory of Operation&lt;/h2&gt;
The editor works by containing the text you are editing in a buffer in memory referred to as a page.&amp;nbsp; So when you read in a paper-tape, it will read as much as it can into the free memory and then ring a bell to indicate that you may begin editing.&amp;nbsp; You can then edit this text and write it to a new paper tape.&lt;br /&gt;
&lt;br /&gt;
The editor works a bit like the Unix editor, vi, in that it has two modes of operation: &lt;em&gt;command mode&lt;/em&gt; and &lt;em&gt;text mode&lt;/em&gt;.&amp;nbsp; When in &lt;em&gt;command mode&lt;/em&gt; all text typed via the teletype is interpreted as text editing commands.&amp;nbsp; When in &lt;em&gt;text mode&lt;/em&gt; all text typed in via the teletype is either adding to or altering the text in the buffer.&lt;br /&gt;
&lt;br /&gt;
When the editor is first loaded it starts off in &lt;em&gt;command mode&lt;/em&gt;, you can then type your desired command followed by &lt;em&gt;RETURN&lt;/em&gt; to action it.&amp;nbsp; Depending on the command, the editor may now switch to &lt;em&gt;text mode&lt;/em&gt; and allow you to edit the buffer.&lt;br /&gt;
&lt;br /&gt;
When in &lt;em&gt;text mode&lt;/em&gt; you must press &lt;em&gt;RETURN&lt;/em&gt; after each line that you enter to save it to the buffer.&amp;nbsp; To return to &lt;em&gt;command mode&lt;/em&gt; and to cancel the current line you are typing press &lt;em&gt;CTRL+FORM&lt;/em&gt; (&lt;em&gt;CTRL+L&lt;/em&gt;).

&lt;h2&gt;Starting the Editor&lt;/h2&gt;
&lt;h3&gt;Instructions for Owners of a Real PDP-8&lt;/h3&gt;
To load the editor from paper-tape on a real PDP-8 just load the Binary Loader first and then the editor from paper-tape in the normal way.&amp;nbsp; The program can then be started at Octal address 200.&amp;nbsp; If you have a high-speed punch or reader then you will want to set Switch Register bit 10 to high for a high-speed punch and bit 11 to high for a high-speed reader (See section 1.4 of Symbolic Editor Programming Manual).&lt;br /&gt;
&lt;h3&gt;Instructions for Those Using SimH to Emulate a PDP-8&lt;/h3&gt;
If you are using SimH, then the following applies:&lt;br /&gt;
&lt;br /&gt;
To load the editor&amp;#039;s paper-tape image from the current directory in SimH:&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; load DEC-08-ESAB-PB.bin&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
SimH emulates a high-speed punch and reader, so you will want to set Switch Register bits 10 and 11 to high to tell the editor that this is what you will be using:&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; de sr 3&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
To run the editor (200 here is in Octal):&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; run 200&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;

&lt;h2&gt;Commands&lt;/h2&gt;
The commands take the following form where &lt;em&gt;E&lt;/em&gt; represents any command:&lt;br /&gt;
&lt;table class="neatTable"&gt;
&lt;tr&gt;&lt;th&gt;Command Structure&lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;Perform command &lt;em&gt;E&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;nE&lt;/td&gt;&lt;td&gt;Perform command &lt;em&gt;E&lt;/em&gt; on line &lt;em&gt;n&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;m,nE&lt;/td&gt;&lt;td&gt;Perform command &lt;em&gt;E&lt;/em&gt; on lines &lt;em&gt;m&lt;/em&gt; to &lt;em&gt;n&lt;/em&gt;, inclusive.&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
Below is a brief list of useful commands to get you started:&lt;br /&gt;
&lt;table class="neatTable"&gt;
&lt;tr&gt;&lt;th&gt;Command&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;Appends the text from the teletype to the buffer, if the buffer is blank then this can be used to create a new paper-tape&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;Changes the specified line or range of lines&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;Deletes a line or range of lines from the buffer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;I&lt;/td&gt;&lt;td&gt;Inserts text before line 1 or before the specified line&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;K&lt;/td&gt;&lt;td&gt;Kill the entire page buffer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;L&lt;/td&gt;&lt;td&gt;Lists a page, line or range of lines from the buffer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;P&lt;/td&gt;&lt;td&gt;Punches the contents of the buffer, line or range of lines to the paper-tape punch&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;Reads a page of text from the paper-tape reader and appends it to the buffer&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;h2&gt;Example&lt;/h2&gt;
If we wanted to create a new paper-tape with source code for a FORTRAN program we could do the following:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Start the Editor as above, note that when it is started it doesn&amp;#039;t come up with a prompt, so don&amp;#039;t worry if it looks as if it isn&amp;#039;t doing anything.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Owners of a real PDP-8, attach a blank piece of paper-tape to the punch.&lt;br /&gt;
&lt;br /&gt;If using SimH, then press CTRL+E to get to the &lt;em&gt;sim&lt;/em&gt; prompt and attach a file to the paper-tape punch:&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; attach ptp factorials.ft&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
To get back to the editor:&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; cont&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;The editor starts with a blank buffer.&amp;nbsp; To append the following source code to it, used the command: &lt;em&gt;A&lt;/em&gt;, and then enter:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;C;      THIS PROGRAM CALCULATES FACTORIALS
5;      TYPE 200
10;     ACCEPT 300,X
        FACT=Y=1.
        IF (X) 5,32,30
30;     IF (X-Y) 41,32,33
32;     TYPE 400,X,FACT
        GO TO 10
33;     FACT=FACT*(Y=Y+1.)
        GO TO 30
41;     PAUSE
        GO TO 5
200;    FORMAT (/, "PLEASE TYPE A POSITIVE NUMBER", /)
300;    FORMAT (E)
400;    FORMAT (/,E, "FACTORIAL IS",E)
        END
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Remember to press &lt;em&gt;RETURN&lt;/em&gt; after each line including the last line to make sure that it is saved to the buffer.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Press CTRL+FORM (CTRL+L) to go back to command mode.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Test some of the commands such as: &lt;em&gt;1,5L&lt;/em&gt;, to list the first 5 lines in the buffer.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Punch the buffer to paper-tape with the command: &lt;em&gt;P&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
If you wanted to read an existing paper-tape into the editor:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;If the editor isn&amp;#039;t already started do so as above, otherwise use the command: &lt;em&gt;K&lt;/em&gt; to clear the contents of the buffer.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Owners of a real PDP-8, attach the paper-tape that you want to edit to the paper-tape reader.&lt;br /&gt;
&lt;br /&gt;If using SimH, then press CTRL+E to get to the &lt;em&gt;sim&lt;/em&gt; prompt.&lt;br /&gt;
&lt;br /&gt;
If you haven&amp;#039;t already detached the file above from the paper-tape punch then:&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; detach ptp&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
To attach the file we made previously to the paper-tape reader:&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; attach ptr factorials.ft&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
To get back to the editor:&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; cont&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Read the paper-tape into the buffer with the command: &lt;em&gt;R&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;List its contents with the command: &lt;em&gt;L&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Where Now?&lt;/h2&gt;
This editor can be really quite flexible and you can even create separate tape editing tapes which will automatically run the tape editors commands over a tape to be edited.&amp;nbsp; More information can be found by reading the &lt;a href="http://www.bitsavers.org/pdf/dec/pdp8/software/DEC-08-ESAB-D_EDITOR_Man.pdf"&gt;Symbolic Editor Programming Manual&lt;/a&gt;.&amp;nbsp; In addition if you haven&amp;#039;t used SimH before, take a look at my article: &lt;a href="http://techtinkering.com/articles/?id=27"&gt;Emulating a DEC PDP-8 with SimH&lt;/a&gt;.&amp;nbsp; I intend to follow this article with some further articles on programming the PDP-8 and will be using this editor to do this shortly.
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;A Quickstart Guide to Editing Paper Tape with the Symbolic Tape Editor on the DEC PDP-8&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=29" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fTPMqP2Pxe6xEsh7TbyFgAUvvAc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fTPMqP2Pxe6xEsh7TbyFgAUvvAc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fTPMqP2Pxe6xEsh7TbyFgAUvvAc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fTPMqP2Pxe6xEsh7TbyFgAUvvAc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/__u_2fwJZpk" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=29</feedburner:origLink></item><item><title>Book Review: Electronic Brains: Stories from the Dawn of the Computer Age by Mike Hally</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/CX0O5Wpdq2k/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=28</guid><pubDate>Wed, 03 Jun 2009 12:40:11 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Book Review: Electronic Brains: Stories from the Dawn of the Computer Age by Mike Hally[/title] --&gt;
&lt;!-- [tags]Books,Retro,Reviews,History[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;a class="amazonLink" href="http://www.amazon.co.uk/gp/product/1862078394?ie=UTF8&amp;amp;tag=techtinkering-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=1862078394" title="Buy from Amazon"&gt;&lt;img border="0" src="http://techtinkering.com/images/?id=book_electronic_brains.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Amazon&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=techtinkering-21&amp;amp;l=as2&amp;amp;o=2&amp;amp;a=1862078394" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;
This is an interesting history of computer development around the world during the 1940s and 50s.&amp;nbsp; The book grew out of a radio series on BBS Radio 4 and contains lots of original material gained from interviews in 2001 and 2004.&amp;nbsp; It is very accessible as it focuses slightly more on the events and people involved than the technical details, although it has enough of the latter to show how the technology evolved.  

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;table class="bookDetails"&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Electronic Brains: Stories from the Dawn of the Computer Age&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Author&lt;/th&gt;&lt;td&gt;Mike Hally&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Pages&lt;/th&gt;&lt;td&gt;304&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Edition&lt;/th&gt;&lt;td&gt;Second Edition (2006)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Publisher&lt;/th&gt;&lt;td&gt;Granta Books&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;ISBN&lt;/th&gt;&lt;td&gt;1-86207-839-4&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;


&lt;p&gt;While reading this I came across quite a few surprises, such as the early successes in Australia.&amp;nbsp; There is also a chapter on Remington Rand's Rand 409, another early computer which I don't think has been covered much elsewhere.&amp;nbsp;    Finally it tries to explain how IBM became the market leader despite its late entry into the field.&lt;/p&gt;

&lt;p&gt;Throughout the book the author tries to show how each team and country may have influenced each other and where they may have innovated in isolation.&amp;nbsp; He also tries to tackle the often debated question: Which was the first computer?&amp;nbsp;  His answer essentially comes down to what you call a computer, and therefore there are a number of firsts depending on how you define this.&lt;/p&gt;

&lt;p&gt;I highly recommend this book to anyone interested in how the first computers came into being and particularly to those who want to look beyond Britain and America.&lt;/p&gt;
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Book Review: Electronic Brains: Stories from the Dawn of the Computer Age by Mike Hally&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=28" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/c9UW0tZqUsuZshmWtJILJF4lYL8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c9UW0tZqUsuZshmWtJILJF4lYL8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/c9UW0tZqUsuZshmWtJILJF4lYL8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/c9UW0tZqUsuZshmWtJILJF4lYL8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/CX0O5Wpdq2k" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=28</feedburner:origLink></item><item><title>Emulating a DEC PDP-8 with SimH</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/dbVTRf9m_EU/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=27</guid><pubDate>Tue, 26 May 2009 15:00:33 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Emulating a DEC PDP-8 with SimH[/title] --&gt;
&lt;!-- [tags]Emulators, Retro, PDP-8,SimH[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="212" height="98" src="http://techtinkering.com/images/?id=small_dec_pdp8_fpanel.jpg" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;
The DEC PDP-8 mini-computer was launched on 22 March 1965 and was a great success.&amp;nbsp; It was fairly cheap for the day and could easily be expanded.&amp;nbsp; What attracts me most to the PDP-8 is its simple design.&amp;nbsp; I therefore decided to experiment with the SimH emulation of this machine, but found that the documentation wasn&amp;#039;t always straightforward.&amp;nbsp; This article intends to show how easy SimH is and how powerful it can be.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;


&lt;h2&gt;Obtaining SimH&lt;/h2&gt;
SimH can be obtained from &lt;a href="http://simh.trailing-edge.com/"&gt;The Computer History Simulation Project&lt;/a&gt;.&amp;nbsp; It is available as a Windows executable or as source code which can be compiled on many different systems.&amp;nbsp; In addition it is included with most Linux distributions.&amp;nbsp; SimH actually emulates a number of computer systems, and all are included.


&lt;h2&gt;Starting the PDP-8 SimH Emulator&lt;/h2&gt;
SimH is very easy to use once you get the hang of the way that it works.&amp;nbsp; The PDP-8 emulator is started with the command: &lt;em&gt;pdp8&lt;/em&gt;.&amp;nbsp; The first thing that you generally see is the version of the simulator followed by the &lt;em&gt;sim&amp;gt;&lt;/em&gt; prompt.&amp;nbsp; At this prompt you can control the simulated hardware of the machine, configure various options and once you start a program it will be taken over by the Console Input/Output of the emulated computer.&lt;br /&gt;
&lt;br /&gt;
SimH will allow you to run a PDP-8 just using the front panel switches, or you can use simulated paper tape and a teletype, as well as a number of other devices.&amp;nbsp; Some programs run directly on the PDP-8 and there are a few operating systems available with their associated software.&lt;br /&gt;
&lt;br /&gt;
Once you have had enough, you can exit the emulator with the following command at the &lt;em&gt;sim&amp;gt;&lt;/em&gt; prompt:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="commands"&gt;
exit                         Returns to host Operating System&lt;/pre&gt;

&lt;h2&gt;Configuring the Emulator&lt;/h2&gt;
SimH is highly configurable and has a number of options which can be set from the &lt;em&gt;sim&amp;gt;&lt;/em&gt; command prompt.&amp;nbsp; Below are the most useful to start with.&lt;br /&gt;
&lt;br /&gt;

&lt;h3&gt;Controlling the Emulation Speed&lt;/h3&gt;
On some host machines, the emulator can be made more realistic by slowing down the speed of execution.&amp;nbsp; This is done using one of the following commands:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="commands"&gt;
set throttle xM              Set execution rate to x mips
set throttle xK              Set execution rate to x kips
set throttle x%              Limit simulator to x% of host time
set nothrottle               Turn off throttling
&lt;/pre&gt;

&lt;h3&gt;Reducing Resource Use on the Host Machine&lt;/h3&gt;
Some host machines support the following command to control how resources are used.
&lt;pre class="commands"&gt;
set cpu idle                 Reduces drain on host machine when emulated cpu is idle
set cpu noidle               Constant drain on host machine&lt;/pre&gt;

&lt;h3&gt;Connecting the Console to a Telnet Port&lt;/h3&gt;
If you wish to connect the output of the console to a telnet port, this can be done with the following:&lt;br /&gt;
&lt;pre class="commands"&gt;
set console telnet=&amp;lt;port&amp;gt;    Connect console terminal to Telnet session on &lt;em&gt;port&lt;/em&gt;
set console notelnet         Disable console Telnet&lt;/pre&gt;

&lt;h3&gt;Automating the Configuration&lt;/h3&gt;
The above configuration options can be stored in a file so that each time the PDP-8 emulator is started, they will take effect.&amp;nbsp; To do this put any of the options above into a file called &lt;em&gt;pdp8.ini&lt;/em&gt;.&amp;nbsp; Now when the PDP-8 emulator is started, it will look to see if the file &lt;em&gt;pdp8.ini&lt;/em&gt; is in the current directory, if it is then the lines from it will be read in just as if you had typed them at the &lt;em&gt;sim&amp;gt;&lt;/em&gt; prompt.&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Example pdp8.ini file&lt;/h4&gt;
If the following lines are put in a file called &lt;em&gt;pdp8.ini&lt;/em&gt;, the emulator will not hog so many resources on the host system, will emulate at 500,000 Instructions Per Second and the console will be reachable through telnet on port 18977.&amp;nbsp; However, not all of these settings will work on all machines.&lt;br /&gt;

&lt;pre&gt;&lt;code&gt;set cpu idle
set throttling 500k 
set console telnet=18977
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Devices&lt;/h2&gt;
SimH can emulate a large number of the devices that were attached to the PDP-8.&amp;nbsp; Each of these devices can be connected to a file on the host system, e.g. The line Printer (LPT) could be connected to a file called &lt;em&gt;print.out&lt;/em&gt; and then if anything was printed from the PDP-8, it would go to that file.&amp;nbsp; The most important devices for the purpose of this article and up-coming ones are:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="neatTable"&gt;
&lt;tr&gt;&lt;th&gt;Unit&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PTR&lt;/td&gt;&lt;td&gt;High-Speed Paper Tape Reader&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PTP&lt;/td&gt;&lt;td&gt;High-Speed Paper Tape Punch&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;LPT&lt;/td&gt;&lt;td&gt;Line Printer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;RX&lt;/td&gt;&lt;td&gt;Floppy Disk (RX01 and RX02)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;RF&lt;/td&gt;&lt;td&gt;Fixed Head Disk&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DT&lt;/td&gt;&lt;td&gt;DECtape (DT00 to DT07)&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;
Devices can be connected to files or disconnected with the following commands:&lt;br /&gt;
&lt;pre class="commands"&gt;
attach &amp;lt;unit&amp;gt; &amp;lt;filename&amp;gt;
detach &amp;lt;unit&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;



&lt;h2&gt;Octal Addressing&lt;/h2&gt;
The natural way of abbreviating binary numbers on the PDP-8 is in octal.&amp;nbsp; This is a base 8 number system where each octal digit represents 3 bits.&amp;nbsp; The machine uses 12-bit addressing and hence 4 octal digits represent these 12 bits.&amp;nbsp; When these bits are referred to it must be remembered that the PDP-8 uses big-endian bit numbering (that is, bit 0, the left most bit, is the most significant).


&lt;h2&gt;Low-level Access to the Machine&lt;/h2&gt;
The PDP-8 often required you to access registers and memory addresses directly and it was particularly common for software to require you to configure certain option by setting the front panel switches.&amp;nbsp; Below are the most important registers that can be set through SimH:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="neatTable"&gt;
&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Size in bits&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PC&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Program Counter, including IF as high 3 bits&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AC&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Accumulator&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;L&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Link&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;MQ&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Multiplier Quotient&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;IF&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Instruction Field&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DF&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Date Field&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SR&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Switch Register (Front Panel Switches)&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;h3&gt;Commands to Change/Examine Memory/Registers&lt;/h3&gt;
There are two main commands that can be used to change or examine memory locations and registers:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="commands"&gt;
examine &amp;lt;Register|Memory Location&amp;gt;              Examine a &lt;em&gt;Register|Memory Location&lt;/em&gt;
deposit &amp;lt;Register|Memory Location&amp;gt; &amp;lt;Value&amp;gt;      Deposit &lt;em&gt;Value&lt;/em&gt; in the &lt;em&gt;Register|Memory Location&lt;/em&gt;
&lt;/pre&gt;
&lt;br /&gt;
To make this easier, &lt;em&gt;examine&lt;/em&gt; can be abbreviated to &lt;em&gt;e&lt;/em&gt; and &lt;em&gt;depost&lt;/em&gt; can be abbreviated to &lt;em&gt;d&lt;/em&gt;.

&lt;h2&gt;Controlling Programs&lt;/h2&gt;
There are a number of commands to start a program running and control its execution:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="commands"&gt;
run [&amp;lt;address&amp;gt;]              Resets all devices and starts execution at &lt;em&gt;address&lt;/em&gt; 
                             or &lt;em&gt;PC&lt;/em&gt; if &lt;em&gt;address&lt;/em&gt; not specified
go [&amp;lt;address&amp;gt;]               As above, but doesn&amp;#039;t reset devices
cont                         Does not reset devices and continues execution at &lt;em&gt;PC&lt;/em&gt;
boot &amp;lt;unit&amp;gt;                  Resets all devices and bootstraps the device and unit given by its argument. 
                             If no unit is supplied, unit 0 is bootstrapped
&lt;/pre&gt;
&lt;br /&gt;
On a real PDP-8 to load a program the first step is often to enter a short program via the front-panel switches that loads paper tape in RIM format.&amp;nbsp; This is then generally used to load a Binary Loader program via paper tape.&amp;nbsp; This Binary Loader can then load programs via paper tape in BIN format.&amp;nbsp; The BIN format is normally used for programs as it is more compact.&amp;nbsp; You could follow this process with SimH, but there are some shortcuts to make things easier:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="commands"&gt;
load -r &amp;lt;filename&amp;gt;            Loads a file from the host system in RIM format
load &amp;lt;filename&amp;gt;               Loads a file from the host system in BIN format
&lt;/pre&gt;
&lt;br /&gt;
You can use CTRL+E to get back to the &lt;em&gt;sim&amp;gt;&lt;/em&gt; prompt when talking to the emulated PDP-8 via the Console Input/Output.&amp;nbsp; This is defined by the WRU (Where are you) console option and is initially set to 005 (CTRL+E).&amp;nbsp; To continue execution you would just use the &lt;em&gt;cont&lt;/em&gt; command above.


&lt;h2&gt;FOCAL-69&lt;/h2&gt;
To give a quick demonstration of SimH, I have chosen to use FOCAL-69.&amp;nbsp; FOCAL-69 was an important version of the FOCAL (FOrmula CALculator) programming language, created by Richard Merrill.&amp;nbsp; It would run even on systems with only 4K of memory but could use more if available.&amp;nbsp; A copy of the &lt;a href="http://www.cs.uiowa.edu/~jones/pdp8/focal/focal69.html"&gt;FOCAL-69 Promotional Booklet&lt;/a&gt; is available from &lt;a href="http://www.cs.uiowa.edu/~jones/pdp8/"&gt;Douglas W. Jones&amp;#039;s PDP-8 page&lt;/a&gt; and a &lt;a href="http://simh.trailing-edge.com/kits/foclswre.tar.Z"&gt;FOCAL-69 binary paper tape image&lt;/a&gt; is available from the &lt;a href="http://simh.trailing-edge.com/software.html "&gt;SimH Software Kits Page&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
To try out FOCAL-69 in the PDP-8 emulator, first uncompress the file containing the FOCAL-69 binary paper tape image downloaded above.&amp;nbsp; This will give you a file called &lt;em&gt;focal69.bin&lt;/em&gt;.&amp;nbsp; Now run, &lt;em&gt;pdp8&lt;/em&gt; in the directory in which focal69.bin is located.&lt;br /&gt;
&lt;br /&gt;
To load the paper tape image into memory type:&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; load focal69.bin&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Programs loaded from paper tape in binary format often start at Octal address 200 and this is the case here.&amp;nbsp; To start the program run:&lt;br /&gt;
&lt;strong&gt;sim&amp;gt; run 200&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
FOCAL-69 will now start and present you with the &lt;em&gt;*&lt;/em&gt; prompt.&amp;nbsp; To say hello to the world type the following excluding the &lt;em&gt;*&lt;/em&gt; which is the prompt:&lt;br /&gt;
&lt;strong&gt;* _TYPE "HELLO, WORLD"&lt;/strong&gt;&lt;br /&gt;


&lt;h2&gt;Where Now?&lt;/h2&gt;
More information is available at the &lt;a href="http://simh.trailing-edge.com/"&gt;The Computer History Simulation Project&lt;/a&gt;, particularly on the &lt;a href="http://simh.trailing-edge.com/pdf/all_docs.html"&gt;Simulator Documentation&lt;/a&gt; page.&amp;nbsp; There are several &lt;a href="http://simh.trailing-edge.com/software.html"&gt;software kits&lt;/a&gt; available to run on the PDP-8 and documentation for these can be found on the &lt;a href="http://simh.trailing-edge.com/pdf/all_docs.html"&gt;Simulator Documentation&lt;/a&gt; page.&amp;nbsp; Another good source of software and documentation is at &lt;a href="http://bitsavers.org/"&gt;bitsavers.org&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I will shortly be writing some more articles on the PDP-8, so stay tuned.

&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Emulating a DEC PDP-8 with SimH&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=27" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GnoX2dOgywAALff_UD8AQ8Xc2vM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GnoX2dOgywAALff_UD8AQ8Xc2vM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GnoX2dOgywAALff_UD8AQ8Xc2vM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GnoX2dOgywAALff_UD8AQ8Xc2vM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/dbVTRf9m_EU" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=27</feedburner:origLink></item><item><title>Connecting a Parallel Printer to a Modern Linux Machine Using a LogiLink USB to Parallel Cable, D-SUB 25pin</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/VdFFN65vOoQ/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=25</guid><pubDate>Wed, 06 May 2009 11:34:28 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Connecting a Parallel Printer to a Modern Linux Machine Using a LogiLink USB to Parallel Cable, D-SUB 25pin[/title] --&gt;
&lt;!-- [tags]Retro,Reviews,Linux[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;a class="amazonLink" href="http://www.amazon.co.uk/gp/product/B000Q6JRHU?ie=UTF8&amp;amp;tag=techtinkering-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=B000Q6JRHU" title="Buy from Amazon"&gt;&lt;img border="0" src="http://techtinkering.com/images/?id=cable_usb_to_parallel.jpg" alt="" /&gt;&lt;br /&gt;Amazon&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=techtinkering-21&amp;amp;l=as2&amp;amp;o=2&amp;amp;a=B000Q6JRHU" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;
I have a number of older printers that I would like to connect to my modern machine, but have been unable to do so because my computer doesn&amp;#039;t have a parallel interface.&amp;nbsp; After searching the internet for a review of a usb to parallel cable that works reliably with Linux, I pretty much drew a blank.&amp;nbsp; I then decided to look on Amazon and just give one a go.&amp;nbsp; Below is my brief review of the product that I found to work.&amp;nbsp; I hope that it is of some help to others who are looking for a similar cable.

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;
&lt;br /&gt;
I decided to purchase the &lt;a class="amazonLink" href="http://www.amazon.co.uk/gp/product/B000Q6JRHU?ie=UTF8&amp;amp;tag=techtinkering-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=B000Q6JRHU" title="Buy from Amazon"&gt;USB Parallel Printer Port Cable 25 pin female socket&lt;/a&gt; advertised on Amazon by Cablestar.&amp;nbsp; I went for the version with a female 25pin D-SUB on the end, as not all my printers have a standard Centronics interface.&amp;nbsp; My HP LaserJet 1100, for example, has a Mini-Centronics interface.&amp;nbsp; When the package arrived two days later I found that it was a &lt;em&gt;LogiLink USB to Parallel Cable, D-SUB 25pin&lt;/em&gt;.&amp;nbsp; The package had the standard drivers for various flavours of Windows, but no drivers for Linux.&amp;nbsp; This came as no surprise, indeed I really would have been surprised if there had been drivers for Linux.&lt;br /&gt;
&lt;br /&gt;
Now it was time to see whether my kernel (2.6.26 on Debian Lenny 5.01) would recognise this cable.&amp;nbsp; I plugged the cable into a free USB port on my computer and plugged my printer&amp;#039;s parallel cable into the other end; straight away a printer port was created at &lt;em&gt;/dev/usb/lp0&lt;/em&gt;.&amp;nbsp; All I had to do then was configure CUPS to see this printer, which was easily achieved through the &lt;em&gt;Printing&lt;/em&gt; configuration option in the &lt;em&gt;Administration&lt;/em&gt; menu of &lt;em&gt;Gnome&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
Even now I can&amp;#039;t get over how easy this was, I was expecting at least a few little difficulties, but it really couldn&amp;#039;t have been easier.&amp;nbsp; I therefore recommend this product unreservedly.
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Connecting a Parallel Printer to a Modern Linux Machine Using a LogiLink USB to Parallel Cable&amp;sbquo; D-SUB 25pin&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=25" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8DwH8e1tN2xtYXHK_L3DF2AibGs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8DwH8e1tN2xtYXHK_L3DF2AibGs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8DwH8e1tN2xtYXHK_L3DF2AibGs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8DwH8e1tN2xtYXHK_L3DF2AibGs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/VdFFN65vOoQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=25</feedburner:origLink></item><item><title>An Introduction to Corewar</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/05TpRXxkEV0/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=24</guid><pubDate>Thu, 30 Apr 2009 13:03:07 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]An Introduction to Corewar[/title] --&gt;
&lt;!-- [tags]Programming,Corewar,Programming Games,Retro[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="100" height="100" src="http://techtinkering.com/images/?id=small_corewar.jpg" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;
I remember reading about Corewar roughly 20 years ago and thinking that I will have to have a go at that when I get the time.&amp;nbsp; As often happens in life, things got in the way and I only recently managed to give it a go.&amp;nbsp; I love the challenge of programming and the competitive aspect of this programming game really appeals to me.&amp;nbsp; The object of the game is to write a battle program that will take over a virtual computer and kill the other battle programs running upon it.&amp;nbsp; Since the game recently celebrated it&amp;#039;s 25th birthday, I thought that I would write the following brief introduction to the game to whet peoples&amp;#039; appetite and encourage new interest.
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;h2&gt;History&lt;/h2&gt;
The game was first described in &lt;a href="http://corewar.co.uk/cwg.txt"&gt;Core War Guidelines&lt;/a&gt; by D. G. Jones and A. K. Dewdney in March 1984 and was introduced to the public
in May 1984 via Dewdney&amp;#039;s &lt;a href="http://www.corewar.co.uk/vogtmann/first.htm"&gt;Computer Recreation&lt;/a&gt; column in &lt;em&gt;Scientific American&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
There have been several revisions to REDCODE (the form of assembly language in which the programs are written).&amp;nbsp; The most used is currently The International Core Wars Society (ICWS) 1994 standard with the extensions introduced by pMARS 0.8.&amp;nbsp; There is also some interest in the older ICWS &amp;#039;88 standard.

&lt;h2&gt;The MARS Environment&lt;/h2&gt;
The programs are run in the MARS (Memory Array Redcode Simulator) environment.&amp;nbsp; The object of the game is for the programs to take over the environment&amp;#039;s memory (Core), and kill the other programs.&amp;nbsp; The core is circular and memory addresses are relative to the current position.&amp;nbsp; This is so that it does&amp;#039;t matter where a program starts in the core.&amp;nbsp; The biggest difference from a real processor is that each memory location consists of an instruction and its two operands.&lt;br /&gt;
&lt;br /&gt;
As mentioned above, the programs are written in a form of assembly language called REDCODE.&amp;nbsp; The most common version of this gives the following instructions:&lt;br /&gt;
&lt;br /&gt;

&lt;table class="neatTable"&gt;
&lt;tr&gt;&lt;td&gt;DAT&lt;/td&gt;&lt;td&gt;Data&lt;/td&gt;&lt;td&gt;Kills the current process&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;MOV&lt;/td&gt;&lt;td&gt;Move&lt;/td&gt;&lt;td&gt;Copies data from one address to another&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ADD&lt;/td&gt;&lt;td&gt;Add&lt;/td&gt;&lt;td&gt;Adds one number to another&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SUB&lt;/td&gt;&lt;td&gt;Subtract&lt;/td&gt;&lt;td&gt;Subtracts one number from another&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;MUL&lt;/td&gt;&lt;td&gt;Multiply&lt;/td&gt;&lt;td&gt;Multiplies one number by another&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DIV&lt;/td&gt;&lt;td&gt;Divide&lt;/td&gt;&lt;td&gt;Divides one number by another&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;MOD&lt;/td&gt;&lt;td&gt;Modulus&lt;/td&gt;&lt;td&gt;Divides one number by another and gives the remainder&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;JMP&lt;/td&gt;&lt;td&gt;Jump&lt;/td&gt;&lt;td&gt;Continues execution from another address&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;JMZ&lt;/td&gt;&lt;td&gt;Jump if zero&lt;/td&gt;&lt;td&gt;Tests a number and jumps to an address if it&amp;#039;s 0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;JMN&lt;/td&gt;&lt;td&gt;Jump if not zero&lt;/td&gt;&lt;td&gt;Tests a number and jumps if it isn&amp;#039;t 0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DJN&lt;/td&gt;&lt;td&gt;Decrement and jump if not zero&lt;/td&gt;&lt;td&gt;Decrements a number by one, and jumps unless the result is 0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SPL&lt;/td&gt;&lt;td&gt;Split&lt;/td&gt;&lt;td&gt;Starts a second process at another address&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CMP&lt;/td&gt;&lt;td&gt;Compare&lt;/td&gt;&lt;td&gt;Same as SEQ&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SEQ&lt;/td&gt;&lt;td&gt;Skip if equal&lt;/td&gt;&lt;td&gt;Compares two locations, and skips the next instruction if they are equal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SNE&lt;/td&gt;&lt;td&gt;Skip if not equal&lt;/td&gt;&lt;td&gt;Compares two locations, and skips the next instruction if they aren&amp;#039;t equal&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SLT&lt;/td&gt;&lt;td&gt;Skip if less than&lt;/td&gt;&lt;td&gt;Compares two locations, and skips the next instruction if the first is less than the second&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;LDP&lt;/td&gt;&lt;td&gt;Load from p-space&lt;/td&gt;&lt;td&gt;Loads a number from private storage space&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;STP&lt;/td&gt;&lt;td&gt;Store to p-space&lt;/td&gt;&lt;td&gt;Stores a number to private storage space&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;NOP&lt;/td&gt;&lt;td&gt;No operation&lt;/td&gt;&lt;td&gt;Does nothing&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;
In addition, there are a number of different addressing modes and instruction modifiers which change the way that they act.&amp;nbsp; These combine to make REDCODE able to express a lot in very little code.

&lt;h2&gt;Example Programs&lt;/h2&gt;
I have provided slightly altered versions of the standard example programs written by A. K. Dewdney to give you an idea of how the programs work.

&lt;h3&gt;IMP&lt;/h3&gt;
This is one of the simplest program that can be written in REDCODE.&amp;nbsp; It just replicates itself throughout the core and consists of only one instruction:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;    mov.i 0, 1&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
This copies memory location 0 to memory location 1.&amp;nbsp; The &lt;em&gt;.i&lt;/em&gt; suffix is an instruction modifier which means that &lt;em&gt;mov&lt;/em&gt; is to copy the whole of the memory location.&amp;nbsp; Therefore, in this case the instruction copies the current instruction at location 0 (remember that the addressing is relative and a memory location contains an instruction and it&amp;#039;s operands) to location 1 (the next location).&amp;nbsp; Execution then continues at the next memory location, which now contains the same instruction as the last, so this program rapidly replicates itself throughout the core.&lt;br /&gt;
&lt;br /&gt;
However, the program does not kill the other programs, so where it writes over another program, the other program will just execute this code instead.&amp;nbsp; This is useful to make another program ineffective, but it still needs to be killed by getting it to execute a DAT instruction, otherwise the outcome is likely to be a tie.

&lt;h3&gt;DWARF&lt;/h3&gt;
As mentioned above the IMP won&amp;#039;t kill another process.&amp;nbsp; To do this you need to get a process to execute a &lt;em&gt;DAT&lt;/em&gt; instruction.&amp;nbsp; This is therefore what the following program does:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;    add.ab  #4, 3        
    mov.i   2, @2
    jmp    -2
    dat    #0, #0&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
The program starts by adding the literal number 4 to memory location 3, which contains the &lt;em&gt;DAT&lt;/em&gt; instruction.&amp;nbsp; This &lt;em&gt;DAT&lt;/em&gt; instruction is known as the bomb as it is what will stop another process.&amp;nbsp; The &lt;em&gt;.ab&lt;/em&gt; suffix indicates that the A field (containing #4) of the source should be added to the B field (containing #0) of the destination.&amp;nbsp; The bomb at memory location 2, is then copied to the memory location pointed to by the B field of the bomb.&amp;nbsp; In-direct addressing via the B field is indicated by the &lt;em&gt;@&lt;/em&gt; symbol.&amp;nbsp; Finally the program starts back again at the beginning.&amp;nbsp; You can therefore see that this copies a bomb to every fourth memory location, and if the core is divisible by four, it will never bomb itself.

&lt;h2&gt;Strategies&lt;/h2&gt;
Strategies range from the examples given above of code that replicates itself or bombs other programs, to code that scans for other programs before disabling them or killing them.&amp;nbsp; Decoys can be used to fool the scanners and you can combine strategies to increase effectiveness.&amp;nbsp; The latest developments are self-repairing code and battle programs that have been evolved.&amp;nbsp; The possibilities really are endless.


&lt;h2&gt;Competing and Other Activities&lt;/h2&gt;
There are a number of ways that you can compete and add interest to REDCODE programming:
&lt;ul&gt;
&lt;li&gt;You can run other peoples&amp;#039; programs against your own via a simulator on your computer.&lt;/li&gt;
&lt;li&gt;Once you have created an effective battle program you could submit it to a hill such as &lt;a href="http://www.koth.org/index.html"&gt;King of the Hill&lt;/a&gt;, where it will compete against other battle programs.&lt;/li&gt;
&lt;li&gt;Engage in &lt;a href="http://labarga.atspace.com/mc.html"&gt;The Mini Challenge&lt;/a&gt;, where specific programming challenges are set.&lt;/li&gt;
&lt;li&gt;You can use the constraints placed upon the programmer by REDCODE as an interesting platform to experiment with.&amp;nbsp; This is the focus of a lot of the posts on &lt;a href="http://impomatic.blogspot.com/"&gt;Thoughts on Corewar...&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Where Now?&lt;/h2&gt;
To begin you will need to download a simulator such as &lt;a href="http://sourceforge.net/projects/corewar"&gt;pMARS&lt;/a&gt; and a tutorial such as &lt;a href="http://vyznev.net/corewar/guide.html"&gt;The beginners' guide to Redcode&lt;/a&gt;.&amp;nbsp; Further information can be found at the excellent site: &lt;a href="http://www.corewar.co.uk/"&gt;Corewar - the war of the programmers&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I must warn you before you try it yourselves; it is incredibly addictive as you will nearly always want to make just one more tweak to improve a battle program.&amp;nbsp; Have fun, but remember it is only a game.
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;An Introduction to Corewar&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=24" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Kn5VZ3xtMHwrymlL6W9mobUW5jw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Kn5VZ3xtMHwrymlL6W9mobUW5jw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Kn5VZ3xtMHwrymlL6W9mobUW5jw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Kn5VZ3xtMHwrymlL6W9mobUW5jw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/05TpRXxkEV0" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=24</feedburner:origLink></item><item><title>The Smallest Communication Program in the World?</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/uGqbbWi1vwI/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=23</guid><pubDate>Thu, 23 Apr 2009 11:32:46 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]The Smallest Communication Program in the World?[/title] --&gt;
&lt;!-- [tags]Programming,80x86,Retro,DOS[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="207" height="100" src="http://techtinkering.com/images/?id=small_small_comm_program.jpg" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;
I was going through a backup of my dos machine, taken in 1998, and came across some source code which I haven&amp;#039;t seen for a long time.&amp;nbsp; It was great to see that old code, and I must set-up a machine so that I can run some of it again.&amp;nbsp; In particular I came across an attempt at writing the world&amp;#039;s smallest communication program for an x86 based PC running DOS.&amp;nbsp; I used to love writing these sort of little programs to test different things.&amp;nbsp; I know we get more done these days, but it was fun tinkering around at such a low-level.&amp;nbsp; So here follows the program.
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;h2&gt;The Assembly Code&lt;/h2&gt;
The following code was written, for Borland Turbo Assembler, when I was 17.&amp;nbsp; It maybe that, with experience, I could now write a smaller version, so my boast of 15 years ago may no longer be true!&lt;br /&gt; 
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;;----------------------------------------------------------------------------
; This is probably the smallest modem communication program in the world,
; and was written to make a smaller program than Doug Cox's comms program,
; which was claimed to be the smallest.
;
; Doug Cox's program : 72 bytes
; My program         : 50 bytes
;
; You use AT commands to control the modem.
;
; The following functions are also provided:
;       ALT + C    Clear the screen
;       ALT + X    Exit
;
;----------------------------------------------------------------------------
;   Program name : ljatcom
;   File name	 : ljatcom.asm
;   Author	 : Lawrence Woodman
;   Date         : 11 December 1994
;----------------------------------------------------------------------------
.model small
.code
org 100h

pregetstatus:
  mov  ax, 3
  int  10h

getstatus:
  mov  dx, 2FDh              ; Line status Register
  in   al, dx
  and  al,1
  jz   check_for_key         ; If nothing from modem
  mov  dx,2F8h               ; Receive/Transmit Date Register
  in   al,dx                 ; Receive it
  mov  ah,0Eh                ; Function to write char on screen
  int  10h
  jmp  short getstatus

check_for_key:
  mov  ah, 1                 ; Function to get keyboard status
  int  16h
  jz   getstatus             ; If no keyboard input
  dec  ah                    ; Function to get keyboard char
  int  16h
  cmp  ax,2E00h              ; ALT-C
  je   pregetstatus
  cmp  ax,2D00h              ; ALT-X
  je   exit
  mov  dx,2F8h               ; Receive/Transmit Data Register
  out  dx,al                 ; Send it
  jmp  short getstatus

exit:
  ret

end pregetstatus
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Assembling&lt;/h2&gt;

I used Borland Turbo Assembler to assemble this file and produce an executable &lt;em&gt;.COM&lt;/em&gt; file:&lt;br /&gt;
&lt;strong&gt;C:\&gt; tasm ljatcom.asm&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;C:\&gt; tlink ljatcom /x /tdc&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If you don&amp;#039;t have this assembler, the source can easily be converted to the format of your favourite assembler.

&lt;h2&gt;Using Debug to Create the Executable&lt;/h2&gt;

For those not able to assemble the above code, I created a script with &lt;em&gt;HEXBUG&lt;/em&gt; which can be run through the DOS command, &lt;em&gt;debug&lt;/em&gt;, which will create the executable &lt;em&gt;.COM&lt;/em&gt; file.&lt;br /&gt;
&lt;br /&gt;
Copy the following script into &lt;em&gt;ljatcom.bug&lt;/em&gt;&lt;br /&gt;

&lt;pre&gt;&lt;code&gt; NLJATCOM.COM
 E100 B8 3 0 CD 10 BA FD 3 EC"$"1"t"A BA F8 3 EC B4 E CD 10 EB EE B4
 E118 1 CD 16"t"E8 B4 0 CD 16"="0".t"DA"="0"-t"6 BA F8 3 EE EB D4 C3
 RCX
 32
 W
 Q HEXBUG Version 1.02 by Chad Wagner&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Run this script through debug:&lt;br /&gt;
&lt;strong&gt;C:\&gt; debug &amp;lt; ljatcom.bug&lt;/strong&gt;&lt;br /&gt;

&lt;h2&gt;Using the Program&lt;/h2&gt;
This program is very simple, as you can see, and operates on COM1.&amp;nbsp; It is so small because it relies on your ability to command the modem directly.&lt;br /&gt;
&lt;br /&gt;
To run it just type:&lt;br /&gt;
&lt;strong&gt;C:\&gt; ljatcom&lt;/strong&gt;&lt;br /&gt;

&lt;h3&gt;Commanding a Hayes Compatible Modem&lt;/h3&gt;

To reset the modem:&lt;br /&gt;
&lt;strong&gt;ATZ&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
To dial a number, where &lt;em&gt;number&lt;/em&gt; is the number that you wish to dial:&lt;br /&gt;
&lt;strong&gt;ATD&lt;/strong&gt;&lt;em&gt;number&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;

&lt;h3&gt;Operating Once the Connection Has Been Established&lt;/h3&gt;
Once the number has been dialed, by using the above commands, the modem will establish the connection and you will be linked to the computer on the other end of the modem.&amp;nbsp; Most dial-up systems, however, use a variety of terminal emulations to control how to display things on your screen, so you will have to use a basic plain text protocol. 

&lt;h2&gt;File Transfer&lt;/h2&gt;
I once had an old machine on which the 5&amp;frac14;&amp;quot; drive wasn&amp;#039;t working, so I couldn&amp;#039;t transfer anything to or from it.&amp;nbsp; I had no other drive with me to replace it, so I connected the machine to another using a null-modem cable.&amp;nbsp; I then entered a slightly altered version of the above program, using debug, into both machines.&amp;nbsp; This allowed me to redirect it&amp;#039;s output to a file on one end, and send a serial transfer program to it from the other end.&amp;nbsp; To make this transfer reliable enough, all I had to do was slow the COM port down with the DOS command &lt;em&gt;mode&lt;/em&gt;.&amp;nbsp; For these sorts of transfers, if nothing else, the program could still be of some use to those operating older machines.
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;The Smallest Communication Program in the World?&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=23" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Op0NoV-O_LOm_U64OVTPdaOLnJM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Op0NoV-O_LOm_U64OVTPdaOLnJM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Op0NoV-O_LOm_U64OVTPdaOLnJM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Op0NoV-O_LOm_U64OVTPdaOLnJM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/uGqbbWi1vwI" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=23</feedburner:origLink></item><item><title>xAce - A Jupiter Ace Emulator for Unix (Patched to correct garbled display)</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/AUKg_bOtlT4/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=19</guid><pubDate>Thu, 12 Feb 2009 16:24:46 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]xAce - A Jupiter Ace Emulator for Unix (Patched to correct garbled display)[/title] --&gt;
&lt;!-- [tags]Retro,Emulators,Jupiter Ace[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="114" height="100" src="http://techtinkering.com/images/?id=small_jupiter_ace.jpg" title="A Jupiter Ace" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;
I love the idea of the Jupiter Ace and think that the choice of the forth programming language was perfect for such a low-spec machine.&amp;nbsp; It is a real shame that forth wasn&amp;#039;t chosen for more computers of the period, instead of their using basic.&amp;nbsp; I have not found many emulators for this machine and only one that I could run natively under Linux.&amp;nbsp; This did, however, need patching, as without it the screen wasn&amp;#039;t displaying properly.&amp;nbsp; I will show how to patch it in this short post.
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;p&gt;The only Jupiter Ace emulator that I found, which would work under Linux, was written by Edward Patel and is called &lt;a href="http://hem.passagen.se/tiletech/ace.htm"&gt;xace&lt;/a&gt;.&amp;nbsp; There is also a Windows version available, but I don&amp;#039;t know anything more about that.&amp;nbsp; The following instructions, taken partially from the site&amp;#039;s &lt;a href="http://hem.passagen.se/tiletech/ace.txt
"&gt;help instructions&lt;/a&gt;, will show how to install it under Linux.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download the tarball: &lt;a href="http://hem.passagen.se/tiletech/xace-0.4.tar.gz"&gt;xace-0.4.tar.gz&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;Extracted the files:&lt;br /&gt;
&lt;strong&gt;$ tar -xvzf xace-0.4.tar.gz&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;Changed into the extracted directory:&lt;br /&gt;
&lt;strong&gt;$ cd xace-0.4&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;Ran xmkmf to create a makefile from an imake file&lt;br /&gt;
&lt;strong&gt;$ xmkmf&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;I have created a patch which is an amalgamation of several patches which I found on the internet.&amp;nbsp; Each had problems, which I have fixed.&amp;nbsp; The patch can be downloaded from &lt;a href="http://techtinkering.com/downloads/retro/xace-0.4.patch"&gt;here&lt;/a&gt;.&amp;nbsp; Save it as &lt;em&gt;xace-0.4.patch&lt;/em&gt; in the same directory as the xAce source files.&lt;/li&gt;

&lt;li&gt;Patch &lt;em&gt;xmain.c&lt;/em&gt; using the patch downloaded above:&lt;br /&gt;
&lt;strong&gt;$  patch xmain.c xace-0.4.patch&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;Make the project:&lt;br /&gt;
&lt;strong&gt;$ make&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;You can then run the emulator using:&lt;br /&gt;
&lt;strong&gt;$ ./xace&lt;/strong&gt;&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;A Quick Test&lt;/h2&gt;
When entering any of the following definitions, please make sure that you enter them exactly with the correct placement of spaces.&lt;br /&gt;
&lt;br /&gt;
Try entering the following to create a word called &lt;em&gt;star&lt;/em&gt;:&lt;br /&gt;
&lt;strong&gt;: star ." *" ;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Now when you type &lt;em&gt;star&lt;/em&gt; and press return, a star is output.&lt;br /&gt;
&lt;br /&gt;
You could also create a word called &lt;em&gt;stars&lt;/em&gt;:&lt;br /&gt;
&lt;strong&gt;: stars 0 do star loop cr ;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
When you enter &lt;em&gt;stars&lt;/em&gt; preceded by a number it will printer that number of stars, e.g. the following will print 4 stars:&lt;br /&gt;
&lt;strong&gt;4 stars&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
There is a problem with the &lt;em&gt;stars&lt;/em&gt; definition however.&amp;nbsp; If you ask for 0 stars, you will still get one star.&amp;nbsp; There are plenty of resources to learn forth out there, so you shouldn&amp;#039;t find it difficult working out how to correct this one.&amp;nbsp; Think of it as your first little forth programming test.

&lt;h2&gt;Where Now?&lt;/h2&gt;
There aren&amp;#039;t many Jupiter Ace websites around, but one that is particularly good is &lt;a href="http://www.jupiter-ace.co.uk/"&gt;The Jupiter Ace Resource Site&lt;/a&gt;.&amp;nbsp; Another useful source of information is &lt;a href="http://hem.passagen.se/tiletech/forth.htm"&gt;Edward Patel&amp;#039;s crash course in forth&lt;/a&gt;.&amp;nbsp; This is particularly useful as it mentions Jupiter Ace specific words.&amp;nbsp; I hope that you enjoy playing with this emulator and hopefully for those who haven&amp;#039;t used forth, you will gain a new appreciation of it.

&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;xAce - A Jupiter Ace Emulator for Unix (Patched to correct garbled display)&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=19" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/z7UxlPRHUOifVKC7T1AkvzPsFME/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z7UxlPRHUOifVKC7T1AkvzPsFME/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/z7UxlPRHUOifVKC7T1AkvzPsFME/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z7UxlPRHUOifVKC7T1AkvzPsFME/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/AUKg_bOtlT4" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=19</feedburner:origLink></item><item><title>Book Review: The Mythical Man-Month: Essays on Software Engineering by Frederick P. Brooks, Jr.</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/THLNJdSl9f0/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=18</guid><pubDate>Mon, 26 Jan 2009 16:28:26 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Book Review: The Mythical Man-Month: Essays on Software Engineering by Frederick P. Brooks, Jr.[/title] --&gt;
&lt;!-- [tags]Books,Retro,Reviews,Programming[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;a class="amazonLink" href="http://www.amazon.co.uk/gp/product/0201835959?ie=UTF8&amp;tag=techtinkering-21&amp;linkCode=as2&amp;camp=1634&amp;creative=6738&amp;creativeASIN=0201835959" title="Buy from Amazon"&gt;&lt;img border="0" src="http://techtinkering.com/images/?id=book_mythical_man_month.jpg"&gt;&lt;br /&gt;&lt;br /&gt;Amazon&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=techtinkering-21&amp;l=as2&amp;o=2&amp;a=0201835959" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;
This book, written in 1975, offers a fascinating insight into the software engineering process used at that time.&amp;nbsp; The author draws from his experience as project manager for the IBM System/360 and OS/360, and in doing so also sheds light on how they were put together.&amp;nbsp; The 1995 edition, reviewed here, is particularly good as it presents the same 1975 text with only typographical alterations, followed by a couple of extra essays and reflection on the previous essays after 20 years.

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;table class="bookDetails"&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;The Mythical Man-Month: Essays on Software Engineering&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Author&lt;/th&gt;&lt;td&gt;Frederick P. Brooks, Jr.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Pages&lt;/th&gt;&lt;td&gt;336&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Edition&lt;/th&gt;&lt;td&gt;Second Edition (1995)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Publisher&lt;/th&gt;&lt;td&gt;Addison Wesley&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;ISBN&lt;/th&gt;&lt;td&gt;978-0-201-83595-3&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;


&lt;p&gt;The basic premise of the book is that Men and Months are not interchangeable on a software project, and that their design and management can be dramatically improved, but will still remain the most comples part of the process.&amp;nbsp;  The book demonstrates that this premise is true and then offers some advice on how to successfully improve the management of software projects.&amp;nbsp; The advice provided is really helpful and well explained.&amp;nbsp; Despite technology&amp;#039;s rapid advance, the information in this book is still relevant.&lt;/p&gt;

&lt;p&gt;The computer world had changed massively since that time.&amp;nbsp; Throughout the essays you can see glimpses into that world as computers were moving from off-line preparation and batch processing towards a more interactive experience.&amp;nbsp; So many things have changed, and it is fascinating to look back to when programmers had to make space and cost considerations which seem so different from today.&amp;nbsp; As an example, the book mentions renting memory on an IBM Model 165 at $12 per kilobyte per month!&amp;nbsp; At those prices you were sure to keep you code tight! &lt;/p&gt;

&lt;p&gt;This work is well worth reading, whether for its retro value or for the insights that it can still offer today.&lt;/p&gt;

&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Book Review: The Mythical Man-Month: Essays on Software Engineering by Frederick P. Brooks&amp;sbquo; Jr.&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=18" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/p-AQ29yhXb6Rat96Bu6ZHXVr_dE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p-AQ29yhXb6Rat96Bu6ZHXVr_dE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/p-AQ29yhXb6Rat96Bu6ZHXVr_dE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p-AQ29yhXb6Rat96Bu6ZHXVr_dE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/THLNJdSl9f0" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=18</feedburner:origLink></item><item><title>Bouncing Babies</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/bcZTcjXrn5c/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=17</guid><pubDate>Tue, 16 Dec 2008 11:02:51 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Bouncing Babies[/title] --&gt;
&lt;!-- [tags]Retro,Games,DOS[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="163" height="100" src="http://techtinkering.com/images/?id=small_bouncing_babies_splash.jpg" title="Screenshot of Bouncing Babies Splash Screen" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

Bouncing Babies is one of the first games I remember playing on an IBM PC Compatible.&amp;nbsp; I recall looking at this funny game and thinking that it really was a strange concept.&amp;nbsp; It was released as Shareware by Dave Baskin, but I believe that it is now Freeware.

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;table&gt;&lt;tr&gt;
&lt;td style="width:400px;"&gt; 
&lt;img class="articleSummaryPic" style="margin-right:1em; margin-top:1em; margin-bottom:1em;" width="400" height="247" src="http://techtinkering.com/images/?id=bouncing_babies.jpg" title="Screenshot of Bouncing Babies" alt="Screenshot of Bouncing Babies"/&gt;&lt;/td&gt;
&lt;td style="vertical-align:top; margin-top:1em;"&gt;
Here you can see the CGA graphics as the game is played.&amp;nbsp; You control the two men carrying a stretcher and have to bounce the babies into the ambulance as as they fall from the burning building.&amp;nbsp; You gain points for each baby you rescue and have lives in the form of the number of babies that you lose.&amp;nbsp; As the level increases you find that multiple babies are jumping at the same time, so you have to be very quick moving the stretcher back and forth to not drop any.&lt;br /&gt;
&lt;br /&gt;
It is an unusual game and can be strangely addictive when you are in the mood for it.&amp;nbsp; The only real problem with playing it today, on more modern hardware, is that it can be much too quick and needs a utility to slow the machine down.&amp;nbsp; Alternatively if using an emulator then you should be able to slow it down via the emulator&amp;#039;s controls.&amp;nbsp; In the case of DOSBox use CTRL+F11 to reduce the speed.
&lt;/td&gt;

&lt;/tr&gt;
&lt;/table&gt;

&lt;h2 style="margin-top:2em;"&gt;How can I play this great game today?&lt;/h2&gt;
The game can be downloaded from the &lt;a href="http://dosgamesarchive.com"&gt;Dos Games Archive&lt;/a&gt; site &lt;a href="http://www.dosgamesarchive.com/download/game/100"&gt;here&lt;/a&gt;.&amp;nbsp; If you don&amp;#039;t have a suitable machine to play it on then you could use the DOSBox emulator.&amp;nbsp; For more information see my article: &lt;a href="http://techtinkering.com/articles/?id=8"&gt;Using DOSBox to Run DOS Games and Applications&lt;/a&gt;.

&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Bouncing Babies&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=17" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1zp4_EMkkdVlwanF1VJiKt1Je5E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1zp4_EMkkdVlwanF1VJiKt1Je5E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1zp4_EMkkdVlwanF1VJiKt1Je5E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1zp4_EMkkdVlwanF1VJiKt1Je5E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/bcZTcjXrn5c" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=17</feedburner:origLink></item><item><title>My Top 10 Commodore 64 Demos</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/iIOQciZQDK0/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=15</guid><pubDate>Mon, 24 Nov 2008 16:44:27 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]My Top 10 Commodore 64 Demos[/title] --&gt;
&lt;!-- [tags]Retro,Commodore,C64,Demos[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="144" height="100" src="http://techtinkering.com/images/?id=small_crest_deus_ex_machina_face.jpg" title="High Resolution Artwork" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

There are so many great demos for the Commodore 64 and the demo scene is still thriving.&amp;nbsp; Surprisingly there are even new effects being created for this machine.&amp;nbsp; I have spent many hours going through a huge amount of demos to compile this list and I know that some of the entries are controversial, but they are my personal favourites.&amp;nbsp; There are plenty of demos that people will wonder why they have been left out.&amp;nbsp; This is mainly because the demos in this list already contain most of what they offer and I wanted to show a broad range of styles and effects.

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;ul&gt;

&lt;li&gt;&lt;strong&gt;10. Oxyron - Parts&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="228" src="http://techtinkering.com/images/?id=oxyron_parts_ball.jpg" title="Spherical Projection of a woman&amp;#039;s face" alt=""/&gt;
This was released in 1995 and is really just a collection of cool routines without any overall theme tying it together, hence the name, Parts.&amp;nbsp; That said, this demo has a truly superb effect where they wobble a picture which is really quick and smooth.&amp;nbsp; I&amp;#039;m having trouble getting over how cool it is to see this effect done on the 64.&amp;nbsp; I also like the spherical projection of a woman&amp;#039;s face rotating about on a sphere.&amp;nbsp; Truly short and sweet.
&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;9. The Ancient Temple - Air dance IV&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="227" src="http://techtinkering.com/images/?id=tat_airdance4_chicks.jpg" title="Singing Chicks" alt=""/&gt;
This is quite a controversial choice and I admit that I included it mainly for the singing chicks on side 2.&amp;nbsp; The chicks use sampled audio throughout a song in quite a clever way that is well put together and works well.&amp;nbsp; It was released in 1991 and this shows a little with some of the graphical effects but I do like the spinning globe.&amp;nbsp; It does, however, have some nice music, particularly the softer more introspective pieces.
&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;8. Byte Rapers - Follow the sign 3 / Unsound minds&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="226" src="http://techtinkering.com/images/?id=byterapers_follow_the_sign3_ball.jpg" title="Low Resolution spinning ball" alt=""/&gt;
Released at Assembly 1996, this is a wonderful example of what can be done with low resolution effects.&amp;nbsp; There are also a couple of examples of good high resolution artwork.&amp;nbsp; I particularly like the way the music is used to add tension and stimulate different feelings throughout the demo.
&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;7. Chorus + Resource - Desert Dream&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="227" src="http://techtinkering.com/images/?id=resource_desert_dream_pyramid.jpg" title="Pyramids from the movie style intro" alt=""/&gt;
This is a remake of the original Amiga demo that was released at Breakpoint 2007.&amp;nbsp; It starts with a short 3D movie including movie style credits, which is so well done that it really makes you sit up and pay attention.&amp;nbsp; Accompanying the movie and throughout the demo is some highly charged pumping music perfectly suited to the action.&amp;nbsp; After the movie is finished there is a fairly normal demo, but I do like the horizontal raster bars forming a rotating 3D box. 

&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;6. Reflex - Mathematica&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="225" src="http://techtinkering.com/images/?id=reflex_mathematica_dungeon.jpg" title="Low Resolution dungeon with rotating fractal images on the wall" alt=""/&gt;
This demo, which was released at The Party 1995, has been included mainly for the Wolfenstein 3D dungeon with rotating pictures on the wall.&amp;nbsp; It does have, however, some other good low resolution effects such as a multi-coloured tunnel and a good rotating 3D torus.&amp;nbsp; The music nicely matches the action and is used well to aid transitions.
&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;5. Taboo - Altered States 50%&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="224" src="http://techtinkering.com/images/?id=taboo_altered_states_horse.jpg" title="High Resolution Artwork" alt=""/&gt;
This was released in 1994 and has earned its place for a number of reasons.&amp;nbsp; There is some brilliant high resolution artwork and some good graphical effects.&amp;nbsp; The wormhole is truly excellent and provides a lovely smooth and quick effect.&amp;nbsp; It is also features a section that has fast spinning 3D objects which smoothly transform from one shape to another.
&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;4. Plush - +H2K&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="226" src="http://techtinkering.com/images/?id=plush_h2k_animation.jpg" title="Animation" alt=""/&gt;
Now it gets really difficult to decide the order of the demos.&amp;nbsp; This one, released at Mekka &amp;amp; Symposium 2000, begins with some beating music which I do find a bit annoying, but it is well synced with the display.&amp;nbsp; This does improve, however, and there is some great high energy tunes later on.&amp;nbsp; Of particular note in this demo is the cool wobbly text scroller, the glass ball moving over an image and the rotating chess board.&amp;nbsp; People not used to seeing the c64 show animations will also be impressed by the Walker animation sequence.
&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;3. Booze Design - Edge of Disgrace&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="226" src="http://techtinkering.com/images/?id=booze_design_edge_of_disgrace_cyborg.jpg" title="Cyborg Artwork" alt=""/&gt;
A brand new title, released at X'2008, shows that original demos can still be produced.&amp;nbsp; People have raved about this release and I found even the simpler effects, such as the disco light floor, to be very rewarding.&amp;nbsp; I also like the zooming water effect on an image and the nicely done 3D spinning transforming objects.
&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;2. Resource - Soiled Legacy&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="226" src="http://techtinkering.com/images/?id=resource_soiled_legacy_face.jpg" title="3D face with moving light and shade effect" alt=""/&gt;
This was released at X'2001 and has wonderful music that integrates well with the action and I really liked the light and shade effect moving over a 3D face.
&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;1. Crest and Oxyron - Dues ex machina&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="227" src="http://techtinkering.com/images/?id=crest_deus_ex_machina_intro.jpg" title="High Resolution Artwork" alt=""/&gt;
As soon as this demo begins you know you are in for a treat.&amp;nbsp; The combination of superb high resolution artwork and brilliant atmospheric music is a winning combination.&amp;nbsp; Partner this with some unbeaten effects such as a spinning and skewing cola can, and it is not hard to see why it won its place.&amp;nbsp; I can&amp;#039;t get over how quick and fluid the cola can effect is, especially considering that it moves while doing the effects.&amp;nbsp; I also like the super fast zooming and moving over images and the rotating 3D boxes mapped with images.&amp;nbsp; It was released at Mekka &amp;amp; Symposium 2000 and could well be in the top slot for quite some time to come.
&lt;/li&gt;


&lt;/ul&gt;
&lt;br style="clear:left" /&gt;
&lt;h2 style="margin-top:2em;"&gt;Where can I obtain these great demos?&lt;/h2&gt;
There are a number of sources for these demos, the best ones are:&lt;br /&gt;
&lt;a href="http://noname.c64.org/csdb/"&gt;The Commodore 64 Scene Database&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://c64.ch/demos/"&gt;The C64 Demo Portal&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.pouet.net"&gt;Pouet&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I hope that you have enjoyed seeing my favourite demos and who knows, they may inspire you to have a go at writing your own!



&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;My Top 10 Commodore 64 Demos&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=15" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3y8NqDE0yrXRAk1peS9_QAVLD9w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3y8NqDE0yrXRAk1peS9_QAVLD9w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3y8NqDE0yrXRAk1peS9_QAVLD9w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3y8NqDE0yrXRAk1peS9_QAVLD9w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/iIOQciZQDK0" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=15</feedburner:origLink></item><item><title>Beneath a Steel Sky, My Favourite Graphical Adventure Game</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/OCMSvBVz3p4/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=14</guid><pubDate>Thu, 13 Nov 2008 15:42:18 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Beneath a Steel Sky, My Favourite Graphical Adventure Game[/title] --&gt;
&lt;!-- [tags]Retro,Adventure Games, Games[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="159" height="100" src="http://techtinkering.com/images/?id=small_beneath_a_steel_sky_trash_elevator.jpg" title="Screenshot of Beneath a Steel Sky" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

Beneath a Steel Sky was released for the PC in 1994 by &lt;a href="http://www.revolution.co.uk/"&gt;Revolution Software&lt;/a&gt;.&amp;nbsp; It was received well and has gone on to be considered a cult classic.&amp;nbsp; It uses the Virtual Theatre engine which was first used in Lure of the Temptress and among other things allows the non-player characters to have a basic level of artificial intelligence.


&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

It is set in a dystopian future where man has damaged the earth.&amp;nbsp; The action is confined to Australia within a totalitarian city state called Union City, and you play Robert Foster who has just been kidnapped from an area outside the city known as the Gap.&amp;nbsp; Before Robert knows why he has been kidnapped his helicopter crashes in the city and he makes a bid for freedom.&amp;nbsp; It is now your task to find out why he was kidnapped and keep him safe.&lt;br /&gt;
&lt;br /&gt;
&lt;img style="vertical-align:top; float:right; margin-left: 1em; margin-bottom:1em;" align="right" width="320" height="200" src="http://techtinkering.com/images/?id=beneath_a_steel_sky_beginning_outside.jpg" title="Screenshot of Beneath a Steel Sky" alt=""/&gt;

Despite the games dark storyline and brooding atmospheric graphics, the game is full of humour.&amp;nbsp; The characters are warm and engaging and their speech completes their characterisation.&amp;nbsp; Interacting with the characters is realistic and draws you further into this world.&lt;br /&gt;
&lt;br /&gt;
The music is not the best you&amp;#039;ve ever heard, but it does work well to add to the tension and feel of the game.&amp;nbsp; In particular it is clever how the musical score and sound effects make good use of low pitched sound to increase the sense of unease.&amp;nbsp; In some rooms you directly feel the effects in the pit of your stomach, and this can put you quite on edge.&lt;br /&gt;
&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em; margin-bottom: 1em;" align="left" width="320" height="201" src="http://techtinkering.com/images/?id=beneath_a_steel_sky_bar.jpg" title="Screenshot of Beneath a Steel Sky" alt=""/&gt;
The easy to use interface means that you face little distraction during the game, and hence you feel more a part of it.&amp;nbsp; You left mouse click to examine items, and right mouse click to trigger actions.&amp;nbsp; The inventory is reached by moving your mouse to the top of the screen.&amp;nbsp; It couldn&amp;#039;t be easier and this saves you from having to go through lots of strange actions to see what works.&amp;nbsp; I&amp;#039;m also happy to report that although there are a few places that you can die, there are no actions that can&amp;#039;t be undone which stop you from progressing later on.&lt;br /&gt;
&lt;br /&gt;
I have fond memories of playing this game and really feeling a part of the action.&amp;nbsp; Once I had finished it, although I was happy to have completed the adventure, I did feel a little sad that I was no longer exploring that world.&amp;nbsp; I can see myself playing this game again soon.&lt;br /&gt;

&lt;h2 style="clear:left;"&gt;How Can I Play It Today?&lt;/h2&gt;
In 2003, Revolution Software made the game available for free.&amp;nbsp; It can now be run via the &lt;a href="http://www.scummvm.org/" title="ScummVM homepage"&gt;ScummVM&lt;/a&gt; emulator on most modern platforms.&amp;nbsp; For more information about ScummVM, why not take a look at my article: &lt;a href="http://techtinkering.com/articles/?id=12"&gt;Using ScummVM to Play Classic Adventure Games&lt;/a&gt;.&amp;nbsp; Beneath a Steel Sky can be downloaded from the ScummVM site&amp;#039;s &lt;a href="http://www.scummvm.org/downloads.php"&gt;download page&lt;/a&gt;.&amp;nbsp; I hope you enjoy playing this game as much as I did.
&lt;br /&gt;
&lt;br /&gt;
Remember: Be Vigilant!
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Beneath a Steel Sky&amp;sbquo; My Favourite Graphical Adventure Game&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=14" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qwe8KofasHE-x5pUfNWFYqqGDxY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qwe8KofasHE-x5pUfNWFYqqGDxY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qwe8KofasHE-x5pUfNWFYqqGDxY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qwe8KofasHE-x5pUfNWFYqqGDxY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/OCMSvBVz3p4" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=14</feedburner:origLink></item><item><title>Using ScummVM to Play Classic Adventure Games</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/y5Gi34-YYgo/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=12</guid><pubDate>Mon, 10 Nov 2008 11:13:16 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Using ScummVM to Play Classic Adventure Games[/title] --&gt;
&lt;!-- [tags]Retro,Adventure Games,Games,Emulators[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="160" height="100" src="http://techtinkering.com/images/?id=small_scummvm_menu.jpg" title="ScummVM game selection screen" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

&lt;a href="http://www.scummvm.org"&gt;ScummVM&lt;/a&gt; is Virtual Machine, that allows you to run adventure games created for a number of game creation engines.&amp;nbsp; This is a great way of playing those classic adventure games that you loved so much, or never got a chance to play at the time.&amp;nbsp; Some of them such as &lt;a href="http://techtinkering.com/articles/?id=14" title="Beneath a Steel Sky‚ My Favourite Graphical Adventure Game"&gt;Beneath a Steel Sky&lt;/a&gt; have rarely been bettered and can provide hours of fun.

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;h2&gt;Supported Game Creation Engines&lt;/h2&gt;The virtual machine supports a number of game engines, but the most well known are:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SCUMM (Script Creation Utility for Maniac Mansion)&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="200" src="http://techtinkering.com/images/?id=maniac_mansion_library.jpg" title="Screenshot of Maniac Mansion" alt=""/&gt;
This, as the full name suggests, was written by Lucasfilm Games/LucasArts to make creating the game, &lt;a href="http://en.wikipedia.org/wiki/Maniac_Mansion"&gt;Maniac Mansion&lt;/a&gt;, on the Commodore 64 easier.&amp;nbsp;  Because the game was created using the &lt;a href="http://en.wikipedia.org/wiki/SCUMM"&gt;SCUMM&lt;/a&gt; engine, it made porting the game much simpler and hence found it&amp;#039;s way to numerous platforms.&amp;nbsp; This engine and later versions of it were used for other classic adventure games such as &lt;a href="http://en.wikipedia.org/wiki/Zak_McKracken_and_the_Alien_Mindbenders"&gt;Zak McKracken and the Alien Mindbenders&lt;/a&gt;.
&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;AGI (Adventure Game Interpreter)&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="200" src="http://techtinkering.com/images/?id=kings_quest.jpg" title="Screenshot of Kings Quest" alt=""/&gt;
This was developed by Sierra online to create their early adventure games.&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Adventure_Game_Interpreter"&gt;AGI&lt;/a&gt; was best known for its use in the &lt;a href="http://en.wikipedia.org/wiki/Kings_Quest"&gt;Kings Quest&lt;/a&gt;  and &lt;a href="http://en.wikipedia.org/wiki/Space_Quest"&gt;Space Quest&lt;/a&gt; series of games.&lt;/li&gt;

&lt;li style="clear:left; padding-top: 1em;"&gt;&lt;strong&gt;Virtual Theatre&lt;/strong&gt;&lt;br /&gt;
&lt;img style="vertical-align:top; float:left; margin-right: 1em;" align="left" width="320" height="200" src="http://techtinkering.com/images/?id=beneath_a_steel_sky_factory.jpg" title="Screenshot of Beneath a Steel Sky" alt=""/&gt;
This engine was developed by &lt;a href="http://www.revolution.co.uk/"&gt;Revolution Software&lt;/a&gt; to create their new adventure games.&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Virtual_Theatre"&gt;Virtual Theatre&lt;/a&gt; was used in a number of games including my favourite, Beneath a Steel Sky.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 style="clear:left; padding-top: 2em;"&gt;Getting ScummVM&lt;/h2&gt;
ScummVM comes included with most of the popular Linux distributions.&amp;nbsp; It is also available for lots of other platforms such as AmigaOS, Wii, Mac OS X, Windows and many more.&amp;nbsp; There are pre-compiled binaries available from the &lt;a href="http://www.scummvm.org/downloads.php"&gt;download&lt;/a&gt; page of their site together with clear installation instructions.

&lt;h2&gt;Getting Games to Play on ScummVM&lt;/h2&gt;There are a few games that have been made available for free, and can be downloaded from the ScummVM &lt;a href="http://www.scummvm.org/downloads.php"&gt;download&lt;/a&gt; page.&amp;nbsp; Alternatively you can look at the documentation on &lt;a href="http://wiki.scummvm.org/index.php/Datafiles"&gt;which files are needed to use your game with ScummVM&lt;/a&gt;.&amp;nbsp; A full list of compatible games can be found &lt;a href="http://www.scummvm.org/compatibility.php"&gt;here&lt;/a&gt;.&amp;nbsp; The games are regularly sold on Ebay and some of them are available in compilations from Amazon:

&lt;a href="http://www.amazon.co.uk/gp/product/B000P0JQFA?ie=UTF8&amp;amp;tag=techtinkering-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=B000P0JQFA"&gt;Classic Collections: King's Quest Collection (PC)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=techtinkering-21&amp;amp;l=as2&amp;amp;o=2&amp;amp;a=B000P0JQFA" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;,

&lt;a href="http://www.amazon.co.uk/gp/product/B000P0JQF0?ie=UTF8&amp;amp;tag=techtinkering-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=B000P0JQF0"&gt;Classic Collections: Space Quest Collection (PC)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=techtinkering-21&amp;amp;l=as2&amp;amp;o=2&amp;amp;a=B000P0JQF0" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;,

&lt;a href="http://www.amazon.co.uk/gp/product/B000P0JQFK?ie=UTF8&amp;amp;tag=techtinkering-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=B000P0JQFK"&gt;Classic Collections: Police Quest Collection (PC)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.co.uk/e/ir?t=techtinkering-21&amp;amp;l=as2&amp;amp;o=2&amp;amp;a=B000P0JQFK" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;



&lt;h2&gt;Where Now?&lt;/h2&gt;I would begin by downloading Beneath a Steel Sky from the ScummVM &lt;a href="http://www.scummvm.org/downloads.php"&gt;download&lt;/a&gt; page.&amp;nbsp; This is probably one of the best games available for it, and it is free.&amp;nbsp; Hmm, have I mentioned Beneath a Steel Sky enough yet?&amp;nbsp; No I don&amp;#039;t think so, why not take a look at my article: &lt;a href="http://techtinkering.com/articles/?id=14"&gt;Beneath a Steel Sky‚ My Favourite Graphical Adventure Game&lt;/a&gt;.
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Using ScummVM to Play Classic Adventure Games&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=12" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NNPjffKNEmQbQ0OfoNeJGiov3uQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NNPjffKNEmQbQ0OfoNeJGiov3uQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NNPjffKNEmQbQ0OfoNeJGiov3uQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NNPjffKNEmQbQ0OfoNeJGiov3uQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/y5Gi34-YYgo" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=12</feedburner:origLink></item><item><title>Writing My First Program To Toggle In To The IMSAI 8080</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/uz1FIseeajw/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=11</guid><pubDate>Wed, 05 Nov 2008 10:21:23 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Writing My First Program To Toggle In To The IMSAI 8080[/title] --&gt;
&lt;!-- [tags]Retro,8080,Programming,IMSAI[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="246" height="100" src="http://techtinkering.com/images/?id=small_imsai_frontpanel_z80pack_ones_zeros.jpg" title="I have been staring at Binary for too long" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

I have long been fascinated with entering programs into computers by methods not involving a standard keyboard and monitor.&amp;nbsp; This interest was peeked by my last article: &lt;a href="http://techtinkering.com/articles/?id=10"&gt;Using the latest z80pack&amp;sbquo; version 1.17&amp;sbquo; to emulate an Altair 8800 or IMSAI 8080 using the new graphical FrontPanel&lt;/a&gt;.&amp;nbsp; I have therefore chosen to design and write a program for the IMSAI 8080.&amp;nbsp; In this article I will show you how I went about it, and how you could do the same.&amp;nbsp; You may want to look at &lt;a href="http://techtinkering.com/articles/?id=10" title="Using the latest z80pack&amp;sbquo; version 1.17&amp;sbquo; to emulate an Altair 8800 or IMSAI 8080 using the new graphical FrontPanel"&gt;this article&lt;/a&gt;, if you don&amp;#039;t own an IMSAI 8080 and don&amp;#039;t already have an emulator for it.
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;h2&gt;Gathering Information&lt;/h2&gt;Having never programmed an IMSAI 8080 before, I needed to gather some information about it and the Intel 8080 CPU that it uses.&amp;nbsp; I didn&amp;#039;t find much out there, but what I did is listed below.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="ftp://ftp.unix4fun.org/z80pack/imsai/IMSAI-8080_manual.pdf"&gt;IMSAI 8080 User&amp;#039;s Manual (pdf)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nemesis.lonestar.org/computers/tandy/software/apps/m4/qd/opcodes.html"&gt;Intel 8080/Z80 Instruction Set and Comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.conservapedia.com/Intel_8080"&gt;Intel 8080 Architecture information&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://maben.homeip.net/static/S100/altair/software/8080.txt"&gt;Intel 8080 Brief Explanation of the instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://comsci.us/cpu/8080/isindex.html"&gt;Intel 8080 Instruction Set&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

Armed with the above information and the knowledge that the PROGRAMMED INPUT/OUTPUT on the Front Panel is available via port 0xFF, I could now proceed.


&lt;h2&gt;Specification of Program&lt;/h2&gt;The main consideration in choosing what program to create, is that it has to be small as I want to toggle it in via the front panel switches.&amp;nbsp; I would also like to be able to control it via the PROGRAMMED INPUT switches.&amp;nbsp; After some deliberation, I have decided to write a program to bounce a light back and forth on the PROGRAMMED OUTPUT.&amp;nbsp; The speed of the light&amp;#039;s movement will be controlled by the PROGRAMMED INPUT, so that when set to 0x00 it will be fast and then get slower as the PROGRAMMED INPUT is increased to 0xFF.&amp;nbsp; This may not be the most exciting program ever, but with all that switch flipping, I don&amp;#039;t want to attempt anything too ambitious.


&lt;h2&gt;Designing the Program&lt;/h2&gt;The program needs to be well designed before it is entered into the computer due to the difficulty of making changes once it has been entered.&amp;nbsp; I am therefore going to use a form of Top-Down, Stepwise Refinement to ensure that the program is correct before entering.

&lt;h3&gt;High Level Pseudo Code&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;Initialise variables
do {
    Change direction of light if at either end
    Move position of light
    Output position of light to PROGRAMMED_OUTPUT display
    Delay for a period of time controlled by the PROGRAMMED_INPUT
} while(true)&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Refined Pseudo Code&lt;/h3&gt;&lt;pre&gt;&lt;code&gt;// Initialise variables
direction = right   
position = 1

// Block of code that is repeated indefinitely
do {

    // Change direction of light if at either end
    if( position == 128 || position == 1 )
        direction = ~direction
	
    // Move position of light
    if( direction == left )
        rotateLeft position
    else
        rotateRight position


    // Output light to PROGRAMMED_OUTPUT display
    output PROGRAMMED_OUTPUT, position

    // Delay for a period of time controlled by the PROGRAMMED_INPUT
    for( userDelay = (input PROGRAMMED_INPUT)+1; userDelay &amp;gt; 0; userDelay-- ) {
        for( i = 2; i &amp;gt; 0; i-- ) {
            for( j = 255; j &amp;gt; 0; j-- ) {}
        }
    }
	
} while(true)	// Loop indefinitely
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
I have chosen to store the position of the light as the value of the bit set in that position&amp;sbquo; so that I can then easily output it to the PROGRAMMED OUTPUT.

&lt;h2&gt;Testing the Design&lt;/h2&gt;Before I implement the design in Machine Code, I want to test that it is correct.&amp;nbsp; This is particularly important due to the difficulty in toggling programs in to the IMSAI.&amp;nbsp; To do this I want to look at several points in the code when they are presented with certain values.&amp;nbsp; I will run through the design in the following table:&lt;br /&gt;&lt;br /&gt;
&lt;table class="neatTable"&gt;&lt;tr&gt;&lt;th&gt;Direction&lt;/th&gt;&lt;th&gt;Position&lt;/th&gt;&lt;th&gt;Code&lt;/th&gt;&lt;th&gt;Comment&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;direction = right&lt;/td&gt;&lt;td&gt;Start of program&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;right&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;position = 1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;right&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;if( position == 128 || position == 1 )&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;right&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;direction = ~direction&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;if( direction == left )&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;rotateLeft position&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; :&lt;/td&gt;&lt;td&gt;Output and delay&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;if( position == 128 || position == 1 )&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;if( direction == left )&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;rotateLeft position&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; :&lt;/td&gt;&lt;td&gt;Output and delay&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; :&lt;/td&gt;&lt;td&gt;After a few iterations&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;if( position == 128 || position == 1 )&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;left&lt;/td&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;direction = ~direction&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;right&lt;/td&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;if( direction == left )&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;right&lt;/td&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;rotateRight position&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;right&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;&amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; :&lt;/td&gt;&lt;td&gt;Output and delay&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;
I am happy that the design is correct from looking at this table.&amp;nbsp; The first light to be turned on will be light 2, which is fine as the light is moving anyway.&amp;nbsp; It is easy to alter this if you are so inclined.&amp;nbsp; You can also use this method to check that the machine code implementation below is correct.

&lt;h2&gt;Implementing the Design in Machine Code&lt;/h2&gt;To make the implementation easier I am going to store the Direction and Position variables in registers.&amp;nbsp; I will use the following process to convert the design into machine code:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Write the program out in assembler using labels to record program locations.&lt;/li&gt;
&lt;li&gt;Put the hex equivalents to the assembler next to the appropriate lines, leaving unknown addresses marked with ????.&lt;/li&gt;
&lt;li&gt;Put the address of each line at the start of it.&lt;/li&gt;
&lt;li&gt;Go back and fill in the addresses marked with ????.&lt;/li&gt;
&lt;li&gt;Convert the hex into binary next to each line.&lt;/li&gt;
&lt;/ol&gt;

This gives me the following code:
&lt;pre&gt;&lt;code&gt;      //-----------------------------------
      // Initialise the register variables
      //-----------------------------------
0000  mvi c,FF            // Set direction = right                0EFF   = 0000 1110
                          // 0 is left, 0xFF is right                      1111 1111
0002  mvi d,0             // Set position = 1                     1601   = 0001 0110
                                                                           0000 0001

:loop
      //-----------------------------------------
      // Move the recorded position of the light
      //-----------------------------------------
0004  mov a,d             // Load Position into Accumulator       7A     = 0111 1010
0005  cpi 128                                                     FE80   = 1111 1110
                                                                           1000 0000
0007  jz switchDirection  // Position = 128?                      CA0F00 = 1100 1010
                                                                           0000 1111
                                                                           0000 0000
000A  cpi 1                                                       FE01   = 1111 1110
                                                                           0000 0001
000C  jnz movePosition    // Position != 1?                       C21200 = 1100 0010
                                                                           0001 0010
                                                                           0000 0000

      // Switch the direction of the light
:switchDirection
000F  mov a,c             // Load Direction into Accumulator      79     = 0111 1001
0010  cma                 // Compliment the accumulator           2F     = 0010 1111
0011  mov c,a             // Store result back in the Direction   4F     = 0100 1111

:movePosition
0012  mov a,c             // Load Direction into Accumulator      79     = 0111 1001
0013  cpi 0               // Direction != left?                   FE00   = 1111 1110
                                                                           0000 0000
0015  jnz moveRight                                               C21E00 = 1100 0010
                                                                           0001 1110
                                                                           0000 0000
      // Move position Left
0018  mov a,d             // Load Position into Accumulator       7A     = 0111 1010
0019  ral                 // Rotate left                          17     = 0001 0111
001A  mov d,a             // Store result back in the Position    57     = 0101 0111
001B  jmp outputLight                                             C32100 = 1100 0011
                                                                           0010 0001
                                                                           0000 0000
      // Move position Right
:moveRight
001E  mov a,d             // Load Position into Accumulator      7A      = 0111 1010
001F  rar                 // Rotate right                        1F      = 0001 1111
0020  mov d,a             // Store result back in Position       57      = 0101 0111
		
      //-----------------------------------------------
      // Output the light to PROGRAMMED OUTPUT display
      //-----------------------------------------------
:outputLight
0021  mov a,d             // Load Position into Accumulator      7A      = 0111 1010
0022  cma                 // Compliment Accumulator due          2F      = 0010 1111
                          // to way PROGRAMMED OUTPUT works
0023  out FF              // Output to PROGRAMMED OUTPUT         D3FF    = 1101 0011
                                                                           1111 1111

      //-----------------------
      // User controlled Delay
      //-----------------------
0025  in FF               // User delay from PROGRAMMED INPUT    DBFF    = 1101 1011
                          // port 0xFF                                     1111 1111
0027  inr a               // Make sure 0 is minimum delay        3C      = 0011 1100

:delayOuter
0028  mvi b, 02           // Set register B loop delay to 2      0602    = 0000 0110
                                                                           0000 0010

:delayInner1
002A  mvi e, FF           // Set register E loop delay to 255    1EFF    = 0001 1110
                                                                           1111 1111

:delayInner2
002C  dcr e               // Decrement Register E                1D      = 0001 1101
002D  jnz delayInner2     // Loop until Register E = 0           C22C00  = 1100 0010
                                                                           0010 1100
                                                                           0000 0000

0030  dcr b               // Decrement Register B                05      = 0000 0101
0031  jnz delayInner1     // Loop until Register B = 0           C22A00  = 1100 0010
                                                                           0010 1010
                                                                           0000 0000

0034  dcr a               // Decrement Accumulator               3D      = 0011 1101
0035  jnz delayOuter      // Loop until Register A = 0           C22800  = 1100 0010
                                                                           0010 1000
                                                                           0000 0000
      //-------------------
      // Loop indefinitely
      //-------------------
0038  jmp loop                                                   C30400  = 1100 0011
                                                                           0000 0100
                                                                           0000 0000&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Entering the program into the IMSAI 8080&lt;/h2&gt;The next bit is a little nerve racking and quite laborious.&amp;nbsp; There are 0x40 bytes of code here, which is 512 bits.&amp;nbsp; 512 ones and zeros that have to be entered exactly.&amp;nbsp; 512 ones and zeros that if not entered correctly mean either re-entering the whole program again&amp;sbquo; or going back through them to check which were entered incorrectly.&amp;nbsp; As well as this; if the program doesn&amp;#039;t work&amp;sbquo; is it because the program is wrong&amp;sbquo; or because I entered it in wrong?&amp;nbsp; But now is not the time to worry, I have tested the program on paper, the design is sound, I need to grab the bull by the horns and enter this program.&lt;br /&gt;
&lt;br /&gt;
To enter the program follow these instructions:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Turn the machine on by moving the &lt;strong&gt;PWR ON / PWR OFF&lt;/strong&gt; switch to &lt;strong&gt;PWR ON&lt;/strong&gt;.&amp;nbsp; This switch is located at the far-right of the unit.&lt;/li&gt;
&lt;li&gt;The machine is now at address 0.&amp;nbsp; To input the first line of the program move the middle set of switches so that positions 3,2,1 are down.&amp;nbsp; This corresponds to binary: 0000 1110 from Address 0 of the program.&lt;/li&gt;
&lt;li&gt;Press the &lt;strong&gt;DEPOSIT / DEPOSIT NEXT&lt;/strong&gt; switch into the &lt;strong&gt;DEPOST&lt;/strong&gt; position.&amp;nbsp; This puts the data from the switches set above into memory at the current address, which is currently 0.&lt;/li&gt;
&lt;li&gt;Set the middle group of switches so that it corresponds to the binary in the next group of 8 bits of the program.&lt;/li&gt;
&lt;li&gt;Press the &lt;strong&gt;DEPOST / DEPOSIT NEXT&lt;/strong&gt; switch into the &lt;strong&gt;DEPOSIT NEXT&lt;/strong&gt; position.&amp;nbsp; This increments the current address, and there it puts the data from the switches just set.&lt;/li&gt;
&lt;li&gt;Repeat lines 4 and 5 until the program has been entered.&lt;/li&gt;
&lt;/ol&gt; 

The program can now be run by moving the &lt;strong&gt;RUN / STOP&lt;/strong&gt; switch into the &lt;strong&gt;RUN&lt;/strong&gt; position.&amp;nbsp; You should now see the light bouncing back and forth in the PROGRAMMED OUTPUT at the top left of the unit.&amp;nbsp; If you now move any of the &lt;strong&gt;PROGRAMMED INPUT&lt;/strong&gt; switches, you will see that the light&amp;#039;s movement changes speed.

&lt;h2&gt;Debugging the Program&lt;/h2&gt;There are three main methods to help debug a program on the IMSAI:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Step through the program&lt;/strong&gt;&lt;br /&gt;Do this by moving the &lt;strong&gt;RUN / STOP&lt;/strong&gt; switch into the &lt;strong&gt;STOP&lt;/strong&gt; position.&amp;nbsp; Now press the &lt;strong&gt;SINGLE STEP&lt;/strong&gt; switch for each step you want to see.&amp;nbsp; The current address will be displayed in the bottom middle lights, and it&amp;#039;s contents in the top middle lights.&amp;nbsp; To run or step from a certain point, just examine that address first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Examine the contents of an address in memory&lt;/strong&gt;&lt;br /&gt;Do this by setting the left and middle group of switches to the address you want to examine, then move the &lt;strong&gt;EXAMINE / EXAMINE NEXT&lt;/strong&gt; switch into the &lt;strong&gt;EXAMINE&lt;/strong&gt; position.&amp;nbsp; You will now see it&amp;#039;s contents in the middle top group of lights.&amp;nbsp; To see the contents of the next address just press &lt;strong&gt;EXAMINE NEXT&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change the contents of an address in memory&lt;/strong&gt;&lt;br /&gt;Do this by first examining the contents of the address using the &lt;strong&gt;EXAMINE&lt;/strong&gt; switch as above.&amp;nbsp; Then set the middle group of switches to the data you want to put there, and press &lt;strong&gt;DEPOSIT&lt;/strong&gt;.&amp;nbsp; To continue entering data just set the middle switches to the next byte you want to enter and press &lt;strong&gt;DEPOSIT NEXT&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
The program listing I have given works fine.&amp;nbsp; However when I first wrote it, I had line 0x0028 read:
&lt;pre&gt;&lt;code&gt;0028  mvi b, FF           // Set register B loop delay to 255    06FF    = 0000 0110
                                                                           1111 1111&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
This made the program much too slow, and at first I didn&amp;#039;t think the program was working at all.&amp;nbsp; Using the above debugging methods it was easy to step through the program and work out what was happening.&amp;nbsp; I just changed the byte at 0x0029 to 02, then examined address 0x0000, and pressed the &lt;strong&gt;RUN&lt;/strong&gt; switch to run the program from 0x0000 (The start).&amp;nbsp; I then felt waves of euphoria as my program worked correctly.&amp;nbsp; I had done it with only one small hitch. 

&lt;h2&gt;The Program Running on a Real IMSAI 8080&lt;/h2&gt;
&lt;object style="margin-right:1em; margin-bottm:1em;" align="left" width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7op5spoIcW4&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/7op5spoIcW4&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;

Since writing this article I have been contacted by Mike Loewen, who has a real IMSAI and has kindly allowed me to upload this footage of my program running on his machine.&amp;nbsp; Mike has 
an interesting site about his &lt;a href="http://sturgeon.css.psu.edu/~mloewen/Oldtech/"&gt;Old Technology Collection&lt;/a&gt; which features his &lt;a href="http://sturgeon.css.psu.edu/~mloewen/Oldtech/IMSAI/"&gt;Restoration of an IMSAI 8080&lt;/a&gt;.&amp;nbsp; I must say it was really good to see my program running on a real machine.&amp;nbsp; If only I could lay my hands on one.&lt;br /&gt;

&lt;div style="clear: left; margin-top:1em;"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;Where Now?&lt;/h2&gt;Now is the time to get really creative.&amp;nbsp; To do this though, you need to really understand the machine, so the links at the start of the article should help you understand more about the machine and the Intel 8080 chip that powers it.&amp;nbsp; If you remember the importance of designing and testing the program properly before you enter it, you should be fine.&amp;nbsp; Good luck and have fun.
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Writing My First Program To Toggle In To The IMSAI 8080&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=11" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/p_Ad8Hvej3g6q5_nw-6s6o2mqI8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p_Ad8Hvej3g6q5_nw-6s6o2mqI8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/p_Ad8Hvej3g6q5_nw-6s6o2mqI8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/p_Ad8Hvej3g6q5_nw-6s6o2mqI8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/uz1FIseeajw" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=11</feedburner:origLink></item><item><title>Using the latest  z80pack, version 1.17, to emulate an Altair 8800 or IMSAI 8080 using the new graphical FrontPanel</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/27TrESBQ_qQ/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=10</guid><pubDate>Wed, 29 Oct 2008 04:13:54 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Using the latest  z80pack, version 1.17, to emulate an Altair 8800 or IMSAI 8080 using the new graphical FrontPanel[/title] --&gt;
&lt;!-- [tags]Retro,8080,Emulators,Altair,IMSAI[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="246" height="100" src="http://techtinkering.com/images/?id=small_imsai_frontpanel_z80pack.jpg" title="Screenshot of z80pack using FrontPanel to emulate an IMSAI 8080" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

Udo Munk has just released the latest version of his &lt;a href="http://www.unix4fun.org/z80pack/"&gt;z80pack&lt;/a&gt; emulator, version 1.17, which now includes John Kichury&amp;#039;s FrontPanel library.&amp;nbsp; As well as being a superb emulator to run CP/M on, it now gives you a great graphical representation of the &lt;a href="http://en.wikipedia.org/wiki/Altair_8800" title="Altair 8800 Wikipedia Article"&gt;Altair 8800&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/IMSAI_8080" title="IMSAI 8080 Wikipedia Article"&gt;IMSAI 8080&lt;/a&gt; with fully functional switches and flashing lights.&amp;nbsp; If you&amp;#039;ve ever wondered what it would be like to use one of these machines, why not give it a try?

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;


&lt;h2&gt;Installing z80pack&lt;/h2&gt;The following installation instructions are only for the Altair 8800 and IMSAI 8080 systems.&amp;nbsp; For installation instructions of the complete system, why not have a look at my previous article: &lt;a href="http://techtinkering.com/articles/?id=5"&gt;Setting up z80pack to create an emulated CP/M system&lt;/a&gt;.
&lt;ol&gt;
&lt;li&gt;First download the source (z80pack-x.y.tgz, currently z80pack-1.17.tgz) for &lt;a href="http://www.unix4fun.org/z80pack/" title="z80pack main site"&gt;z80pack&lt;/a&gt; from its &lt;a href="ftp://ftp.unix4fun.org/z80pack"&gt;ftp site&lt;/a&gt;.&amp;nbsp; The following &lt;a href="http://www.unix4fun.org/z80pack/#dri_quick" title="Installation instructions for z80pack"&gt;installation instructions&lt;/a&gt; are taken from the z80pack site.&amp;nbsp; More information can be found there, in particular, information on installing z80pack on non Linux/Unix systems.&lt;/li&gt;
&lt;li&gt;Unpack the source archive in your home directory:&lt;br /&gt;
	&lt;strong&gt;$ tar xzvf z80pack-x.y.tgz&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Change the directory it is extracted to, to make this article easier to explain.&amp;nbsp; There is no need for you to do this.&lt;br /&gt;
	&lt;strong&gt;$ mv z80pack-1.17 z80pack&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Compile the FrontPanel library:&lt;br /&gt;
	&lt;strong&gt;$ cd ~/z80pack/frontpanel&lt;br /&gt;
		$ make&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Copy the front panel library to &lt;em&gt;/usr/lib&lt;/em&gt;&lt;br /&gt;
	&lt;strong&gt;$ cp libfrontpanel.so /usr/lib/&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Compile the Altair 8800 emulator:&lt;br /&gt;
	&lt;strong&gt;$ cd ~/z80pack/altairsim/srcsim&lt;br /&gt;
		$ make&lt;br /&gt;
		$ make clean&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Compile the IMSAI 8080 emulator:&lt;br /&gt;
	&lt;strong&gt;$ cd ~/z80pack/imsaisim/srcsim&lt;br /&gt;
		$ make&lt;br /&gt;
		$ make clean&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;I don&amp;#039;t like the 3D version of the IMSAI, so I changed it to 2D:&lt;br /&gt;
	&lt;strong&gt;$ cd ~/z80pack/imsaisim&lt;br /&gt;
		$ rm conf&lt;br /&gt;
		$ ln -s conf_2d conf&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Getting Altair and IMSAI documentation&lt;/h2&gt;The z80pack ftp site has some documentation for the Altair and IMSAI machines which has been scanned in from the originals.&amp;nbsp; For the Altair there is the &lt;a href="ftp://ftp.unix4fun.org/z80pack/altair/88opman.pdf"&gt;Altair 8800 Operator&amp;#039;s Manual&lt;/a&gt; and for the IMSAI there is the &lt;a href="ftp://ftp.unix4fun.org/z80pack/imsai/IMSAI-8080_manual.pdf"&gt;IMSAI 8080 User&amp;#039;s Manual&lt;/a&gt;.&amp;nbsp; There is also some other relevant documentation and files in the &lt;a href="ftp://ftp.unix4fun.org/z80pack/altair"&gt;altair&lt;/a&gt; and &lt;a href="ftp://ftp.unix4fun.org/z80pack/imsai"&gt;imsai&lt;/a&gt; ftp directories.

&lt;h2&gt;Running a test program on the IMSAI 8080&lt;/h2&gt;To start the IMSAI 8080 emulator:&lt;br /&gt;
	&lt;strong&gt;$ cd ~/z80pack/imsaisim&lt;br /&gt;
		$ imsaisim&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
The IMSAI 8080 front panel:&lt;br /&gt;
&lt;img class="articleSummaryPic" width="500" height="203" src="http://techtinkering.com/images/?id=imsai_frontpanel_z80pack.jpg" title="Screenshot of z80pack using FrontPanel to emulate an IMSAI 8080" alt=""/&gt;

&lt;p&gt;The example program we are going to use is taken from the IMSAI 8080 User&amp;#039;s Manual mentioned above and can be found from page 19.&amp;nbsp; The program takes input from the &lt;strong&gt;PROGRAMMED INPUT&lt;/strong&gt; switches at the bottom left of the unit and outputs it to the &lt;strong&gt;PROGRAMMED OUTPUT&lt;/strong&gt; at the top left.&lt;/p&gt;
&lt;table class="neatTable"&gt;
&lt;tr&gt;&lt;th&gt;Address&lt;/th&gt;&lt;th&gt;Hex&lt;/th&gt;&lt;th&gt;Binary&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;DB&lt;/td&gt;&lt;td&gt;1101 1011&lt;/td&gt;&lt;td&gt;IN&amp;nbsp;&amp;nbsp;  - Input into Accumulator&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;FF&lt;/td&gt;&lt;td&gt;1111 1111&lt;/td&gt;&lt;td&gt;Address of Programmed I/O Port to get input from&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2F&lt;/td&gt;&lt;td&gt;0010 1111&lt;/td&gt;&lt;td&gt;CMA - Complement Data in Accumulator&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;D3&lt;/td&gt;&lt;td&gt;1101 0011&lt;/td&gt;&lt;td&gt;OUT - Output Data from Accumulator&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;FF&lt;/td&gt;&lt;td&gt;1111 1111&lt;/td&gt;&lt;td&gt;Address of Programmed I/O Port to put output to&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;C3&lt;/td&gt;&lt;td&gt;1100 0011&lt;/td&gt;&lt;td&gt;JMP - Jump&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;00&lt;/td&gt;&lt;td&gt;0000 0000&lt;/td&gt;&lt;td&gt;Low Address of beginning of program&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;00&lt;/td&gt;&lt;td&gt;0000 0000&lt;/td&gt;&lt;td&gt;High Address of beginning of program&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;
To enter the program follow these instructions:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Turn the machine on by moving the &lt;strong&gt;PWR ON / PWR OFF&lt;/strong&gt; switch to &lt;strong&gt;PWR ON&lt;/strong&gt;.&amp;nbsp; This switch is located at the far-right of the unit.&lt;/li&gt;
&lt;li&gt;The machine is now at address 0.&amp;nbsp; To input the first line of the program move the middle set of switches so that positions 7,6,4,3,1,0 are down.&amp;nbsp; This corresponds to binary: 1101 1011 from Address 0 of the program.&lt;/li&gt;
&lt;li&gt;Press the &lt;strong&gt;DEPOSIT / DEPOSIT NEXT&lt;/strong&gt; switch into the &lt;strong&gt;DEPOST&lt;/strong&gt; position.&amp;nbsp; This puts the data from the switches set above into memory at the current address, which is currently 0.&lt;/li&gt;
&lt;li&gt;Set the middle group of switches so that it corresponds to the binary in the next line of the program.&lt;/li&gt;
&lt;li&gt;Press the &lt;strong&gt;DEPOST / DEPOSIT NEXT&lt;/strong&gt; switch into the &lt;strong&gt;DEPOSIT NEXT&lt;/strong&gt; position.&amp;nbsp; This increments the current address, and there it puts the data from the switches just set.&lt;/li&gt;
&lt;li&gt;Repeat lines 4 and 5 until the program has been entered.&lt;/li&gt;
&lt;/ol&gt;
The program can now be run by moving the &lt;strong&gt;RUN / STOP&lt;/strong&gt; switch into the &lt;strong&gt;RUN&lt;/strong&gt; position.&amp;nbsp; If you now move any of the &lt;strong&gt;PROGRAMMED INPUT&lt;/strong&gt; switches, you will see them represented in the lights of the &lt;strong&gt;PROGRAMMED OUTPUT&lt;/strong&gt;.&amp;nbsp; Congratulations, you may have just run your first program on the IMSAI 8080.


&lt;h2&gt;Where Now?&lt;/h2&gt;There is plenty of information in the manuals I have mentioned, and these should be your first port of call.&amp;nbsp; The Altair 8800 Operator&amp;#039;s Manual has a similar example to the one given for the IMSAI, and begins on page 33.&amp;nbsp; You may also be interested in my next article: &lt;a href="http://techtinkering.com/articles/?id=11"&gt;Writing My First Program To Toggle In To The IMSAI 8080&lt;/a&gt;.&amp;nbsp; Have fun, and I hope your mouse finger doesn&amp;#039;t get sore clicking all those switches!
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Using the latest  z80pack&amp;sbquo; version 1.17&amp;sbquo; to emulate an Altair 8800 or IMSAI 8080 using the new graphical FrontPanel&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=10" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8jP1CS1PJ7C9c1w9fnxlUaMX11g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8jP1CS1PJ7C9c1w9fnxlUaMX11g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8jP1CS1PJ7C9c1w9fnxlUaMX11g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8jP1CS1PJ7C9c1w9fnxlUaMX11g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/27TrESBQ_qQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=10</feedburner:origLink></item><item><title>Using DOSBox to Run DOS Games and Applications</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/VGRMKdRegl0/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=8</guid><pubDate>Fri, 24 Oct 2008 11:55:53 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Using DOSBox to Run DOS Games and Applications[/title] --&gt;
&lt;!-- [tags]Retro,DOS,Emulators[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="159" height="100" src="http://techtinkering.com/images/?id=small_cnc_ingame.png" title="Command and Conquer In-Game Screenshot" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

There were some brilliant games and applications released for DOS, and some of the games such as Command and Conquer are still very playable.&amp;nbsp; There are a number of options to play these games today, from using a Virtual Machine such as &lt;a href="http://bellard.org/qemu/"&gt;QEMU&lt;/a&gt;, to &lt;a href="http://dosbox.com"&gt;DOSBox&lt;/a&gt; which is a dedicated DOS emulator.&amp;nbsp; Both of these are included in most Linux distributions.&amp;nbsp; I have chosen DOSBox as it is quick and very easy to use, you don't need to install a DOS compatible operating system on it, and it uses your native file system for storage.


&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;


&lt;h2&gt;Configuring DOSBox&lt;/h2&gt;If DOSBox isn&amp;#039;t included with your Linux distribution then it can be obtained from the &lt;a href="http://www.dosbox.com/download.php?main=1"&gt;download&lt;/a&gt; section of their site.&amp;nbsp; Below is a quick example of how to configure DOSBox once you have it installed.&amp;nbsp; More information can be found by looking at the &lt;a href="http://www.dosbox.com/wiki/Basic_Setup_and_Installation_of_DosBox"&gt;Installation Instructions&lt;/a&gt; on the emulator&amp;#039;s site.&lt;br /&gt;
&lt;br /&gt;
First create a directory to store you DOS files in:&lt;br /&gt;
&lt;strong&gt;$ mkdir ~/dos_c&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Now run DOSBox from your home directory:&lt;br /&gt;
&lt;strong&gt;$ dosbox&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
You should see a screen similar to the following:&lt;br /&gt;
&lt;img class="articleSummaryPic" width="482" height="300" src="http://techtinkering.com/images/?id=dosbox.png" title="DOSBox Startup Screen" alt="Picture of DOSBox Startup Screen"/&gt;

&lt;p&gt;&lt;br /&gt;From within the DOSBox emulation window create a &lt;em&gt;dosbox.conf&lt;/em&gt; file in the current native directory:&lt;br /&gt;
&lt;strong&gt;Z:\&amp;gt; CONFIG -writeconf dosbox.conf&lt;/strong&gt;&lt;/p&gt;
&lt;br /&gt;
Leave DOSBox:&lt;br /&gt;
&lt;strong&gt;Z:&amp;gt; exit&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
To get DOSBox to automatically mount the &lt;em&gt;~/dos_c&lt;/em&gt; directory as drive C:, add the following lines to &lt;em&gt;dosbox.conf&lt;/em&gt;:&lt;br /&gt;
&lt;strong&gt;mount c ~/dos_c&lt;br /&gt;
c:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;

&lt;h2&gt;Installing Software on DOSBox&lt;/h2&gt;Now comes the real beauty of DOSBox.&amp;nbsp; All you have to do is put your games or applications in &lt;em&gt;~/dos_c&lt;/em&gt;, start DOSBox, and they will be on the C: drive.

&lt;h3&gt;An Example Using Command and Conquer&lt;/h3&gt;As an example I have chosen to use Command and Conquer.&amp;nbsp; This is available from the &lt;a href="http://www.abandonia.com"&gt;Abandonia&lt;/a&gt; website &lt;a href="http://www.abandonia.com/en/games/378/Command+%2526+Conquer.html"&gt;here&lt;/a&gt;.&amp;nbsp; It is available free, and the site says that it is &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Freeware"&gt;Freeware&lt;/a&gt;&lt;/em&gt;.&amp;nbsp; Please be aware that some of the software on the site is termed &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Abandonware"&gt;Abandonware&lt;/a&gt;&lt;/em&gt;, which has disputed legality.&amp;nbsp; If you want to be sure, just pick software marked as &lt;em&gt;Freeware&lt;/em&gt; or &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Shareware"&gt;Shareware&lt;/a&gt;&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
To start, it would be useful to create a subdirectory in &lt;em&gt;~/dos_c/&lt;/em&gt; called &lt;em&gt;cnc&lt;/em&gt;.&amp;nbsp; In it, unzip the file, &lt;em&gt;Command &amp;amp; Conquer.zip&lt;/em&gt;, that you obtained from the Abandonia website.&amp;nbsp; Now start DOSBox from your home directory:&lt;br /&gt;
&lt;strong&gt;$ dosbox&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Within the emulation window change to the cnc directory:&lt;br /&gt;
&lt;strong&gt;C:\&amp;gt; cd\cnc&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
To run the English version (&lt;strong&gt;cnc_de&lt;/strong&gt; for German version, &lt;strong&gt;cnc_fr&lt;/strong&gt; for French version):&lt;br /&gt;
&lt;strong&gt;C:\CNC&amp;gt; cnc_en&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
The splash screen should come up, and then present you with a menu:&lt;br /&gt;
&lt;img class="articleSummaryPic" width="482" height="300" src="http://techtinkering.com/images/?id=cnc_menu.jpg" title="Command and Conquer Menu" alt="Picture of Command and Conquer Menu"/&gt;

&lt;p&gt;&lt;br /&gt;If you click on the emulation window with your mouse, then the emulation window will grab your mouse and you can use it to move the mouse in the DOS window.&amp;nbsp; &lt;strong&gt;CTRL+F10&lt;/strong&gt; will release the mouse.&amp;nbsp; &lt;strong&gt;ALT+ENTER&lt;/strong&gt; will toggle between full screen and normal screen mode.&lt;/p&gt;

If you haven&amp;#039;t got any sound, try installing the &lt;strong&gt;alsa-oss&lt;/strong&gt; module to have the OSS sound system routed to your ALSA sound system.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Where Now?&lt;/h2&gt;Now you can load your old DOS software onto your new machine and remember the good old days.&amp;nbsp; Alternatively you can download DOS software from a number of websites on the internet for free.&amp;nbsp; It is worth checking the legality of some of the software before downloading, but there is still plenty of free legal software to download, as well as some to buy.&amp;nbsp; For more information about DOS, have a look at the &lt;a href="http://techtinkering.com/resources"&gt;Resources&lt;/a&gt; section under &lt;a href="http://techtinkering.com/resources/dos.php"&gt;DOS&lt;/a&gt;.

&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Using DOSBox to Run DOS Games and Applications&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=8" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XZjCC13zf_rh-YzGaoMvpS7LXOw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XZjCC13zf_rh-YzGaoMvpS7LXOw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XZjCC13zf_rh-YzGaoMvpS7LXOw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XZjCC13zf_rh-YzGaoMvpS7LXOw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/VGRMKdRegl0" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=8</feedburner:origLink></item><item><title>Installing the HI-TECH Z80 C Compiler for CP/M</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/zaSFebTdE4k/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=7</guid><pubDate>Wed, 22 Oct 2008 11:24:44 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Installing the HI-TECH Z80 C Compiler for CP/M[/title] --&gt;
&lt;!-- [tags]CP/M,Z80,Retro,C,Programming[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="140" height="100" src="http://techtinkering.com/images/?id=small_war_c.png" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

My language of choice is C and I am currently getting more involved with the CP/M operating system.&amp;nbsp; I have therefore decided that it would be nice to have a C compiler working under CP/M.&amp;nbsp; There are a number of options available in the archives, but I have found that &lt;a href="http://www.hitech.com.au/"&gt;HI-TECH&lt;/a&gt; are allowing their &lt;a href="http://www.hitech.com.au/products/compilers/CPM.php"&gt;CP/M C compiler&lt;/a&gt; to be downloaded for free.&amp;nbsp; This is a very good product, has good documentation, is almost ANSI C compliant and can be used for commercial and non-commercial use.&amp;nbsp; This, therefore, is the one I have chosen.

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;


&lt;h2&gt;Downloading the HI-TECH Z80 CP/M C Compiler&lt;/h2&gt;This can be downloaded from their site, &lt;a href="http://www.hitech.com.au/products/compilers/CPM.php"&gt;here&lt;/a&gt;.&amp;nbsp; You do need to register, but it is a simple process and doesn&amp;#039;t take long.&lt;br /&gt;
&lt;br /&gt;

The files are self-extracting lharc&amp;#039;ed archives so I installed &lt;a href="http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/"&gt;lha&lt;/a&gt;, which is part of my Debian distro.&amp;nbsp; To extract the contents of the main compiler archive, I created a subdirectory called &lt;em&gt;z80v309&lt;/em&gt;.&amp;nbsp; I entered it and ran:&lt;br /&gt;
&lt;strong&gt;$ lha e ../z80v309.exe&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
The extracted contents comes to 413k which is too large for the 8" SD disks that my emulator supports, so I used &lt;a href="http://www.moria.de/~michael/cpmtools/"&gt;Cpmtools&lt;/a&gt; to create a 4Mb HDD image to put the files on.&amp;nbsp; Hopefully however, this should fit on your disks.&amp;nbsp;

&lt;h2&gt;Using the C compiler&lt;/h2&gt;To test the C compiler I went to the B: drive, where I&amp;#039;m storing my development work, and created a file called &lt;em&gt;hello.c&lt;/em&gt; containing the classic "hello, world" source code:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;void main(void)
{
   printf("hello, world\n");
}
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;

To compile the source (&lt;em&gt;hello.c&lt;/em&gt; on my B: drive) in verbose mode, using the compiler on my I: drive, I run the following:&lt;br /&gt;
&lt;strong&gt;I&amp;gt; c -v b:hello.c&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
This leaves the executable &lt;strong&gt;hello.com&lt;/strong&gt; on the I: drive.&amp;nbsp; Now all we need to do is run it to ensure that it has compiled properly:&lt;br /&gt;
&lt;strong&gt;I&amp;gt; hello&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Which gives the correct output as below:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;I&gt;hello
hello, world
&lt;/pre&gt;

&lt;h2&gt;Where Now?&lt;/h2&gt;The next step, if you haven't already done it, is to extract the documentation file, &lt;em&gt;z80doc.exe&lt;/em&gt;.&amp;nbsp; This is an extensive document that should really help you get to grips with using the compiler.&amp;nbsp; Now all you have to do is start tinkering and see what you can create.&amp;nbsp;
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Installing the HI-TECH Z80 C Compiler for CP/M&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=7" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/L8qfORcBn9SHGXC_CgdEZos-5eA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L8qfORcBn9SHGXC_CgdEZos-5eA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/L8qfORcBn9SHGXC_CgdEZos-5eA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/L8qfORcBn9SHGXC_CgdEZos-5eA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/zaSFebTdE4k" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=7</feedburner:origLink></item><item><title>Installing ZDE 1.6, a programmers editor for CP/M</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/oqURgTQtU6k/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=6</guid><pubDate>Tue, 21 Oct 2008 10:39:21 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Installing ZDE 1.6, a programmers editor for CP/M[/title] --&gt;
&lt;!-- [tags]CP/M,Z80,Retro,Editors,Programming[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="140" height="100" src="http://techtinkering.com/images/?id=small_zde16_screenshot.png" title="ZDE 1.6 viewing ZDE10.DOC and showing help menu" alt=""/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

To do any serious programming under CP/M, the first thing you need is a good programmers editor.&amp;nbsp; There aren&amp;#039;t many in the archives, but I have tried most of them and found ZDE to be the best.&amp;nbsp; It is small, has lots of features, and uses Wordstar commands which are familiar to me and easy to learn.

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;h2&gt;Downloading files for ZDE&lt;/h2&gt;The ZDE 1.6 editor can be downloaded from Bo Zimmerman&amp;#039;s CP/M archive &lt;a href="http://zimmers.net/anonftp/pub/cpm/editors/zde16.pma"&gt;here&lt;/a&gt;.&amp;nbsp; This file is in a &lt;em&gt;.PMA&lt;/em&gt; archive, so we also need the utility, &lt;a href="http://zimmers.net/anonftp/pub/cpm/archivers/pmautoae.com"&gt;pmautoae.com&lt;/a&gt;, to uncompress it, again from Bo Zimmerman&amp;#039; site.&amp;nbsp; These two files should be copied onto a floppy disk or disk image if using an emulator.

&lt;h2&gt;Unpacking ZDE&lt;/h2&gt;I am currently using an emulator which only has 8" SD disks which are not big enough to unpack ZDE onto and contain the compressed file.&amp;nbsp; Therefore I will have the files &lt;strong&gt;pmautoae.com&lt;/strong&gt; and &lt;strong&gt;zde16.pma&lt;/strong&gt; on a disk in my C: drive and will uncompress them to a blank disk in my B: drive.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;pmautoae.com&lt;/strong&gt; is a self-expanding archive so to expand it onto my B: drive from the archive on my C: drive, I run:&lt;br /&gt;
&lt;strong&gt;B&amp;gt; c:pmautoae&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Then to extract the contents of the &lt;strong&gt;zde16.pma&lt;/strong&gt; archive held on my C: drive to the B: drive, I run:&lt;br /&gt;
&lt;strong&gt;B&amp;gt; pmext c:zde16.pma b:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If your disks are big enough, then you can do the above all on one disk, say the B: drive; in which case do the above, but change references to &lt;em&gt;c:&lt;/em&gt; to &lt;em&gt;b:&lt;/em&gt;
&lt;h2&gt;Configuring ZDE&lt;/h2&gt;Before the editor can be used, it needs to be configured.&amp;nbsp; The most important thing to configure is the Terminal type, which is done as follows:&lt;br /&gt;
&lt;strong&gt;B&amp;gt; zdenst16 zde16&lt;/strong&gt;&lt;br /&gt;

Select &lt;strong&gt;t&lt;/strong&gt; to configure the terminal, then &lt;strong&gt;l&lt;/strong&gt; to list the terminals.&amp;nbsp; Press return until your terminal is shown, then press &lt;strong&gt;y&lt;/strong&gt; next to it.&amp;nbsp; I am using &lt;a href="http://www.unix4fun.org/z80pack/"&gt;z80pack&lt;/a&gt; so therefore choose &lt;strong&gt;ANSI standard&lt;/strong&gt;.&amp;nbsp; Now press &lt;strong&gt;ESC&lt;/strong&gt; then &lt;strong&gt;s&lt;/strong&gt; to save the changes.&amp;nbsp; If you are unsure which terminal to select, try each in turn, then start ZDE to see if it works, pressing &lt;strong&gt;ESC q&lt;/strong&gt; to quit.&lt;br /&gt;
&lt;br /&gt;

ZDE should be ready to go at this point.&amp;nbsp; To read the ZDE documentation, type the following:&lt;br /&gt;
&lt;strong&gt;B&amp;gt; zde16 zde10.doc&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;

&lt;h3&gt;Using ZDE&lt;/h3&gt;The editor is started with the command &lt;strong&gt;zde16&lt;/strong&gt; and can be run with a filename as an argument.&amp;nbsp; If a filename is supplied, the editor will try to open it, if it doesn't exist then it will start a new file with the name supplied.&lt;br /&gt;
&lt;br /&gt;ZDE uses the Wordstar key combinations which are explained in the ZDE documentation.&amp;nbsp; On some machines the main command key &lt;strong&gt;CTRL+k&lt;/strong&gt; is used as a cursor key, in which case &lt;strong&gt;ESC&lt;/strong&gt; can be used instead.&amp;nbsp; The most important commands are listed below:&lt;br /&gt;
&lt;br /&gt;
&lt;table class="neatTable"&gt;
&lt;tr&gt;&lt;th&gt;Command&lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ESC h&lt;/td&gt;&lt;td&gt;Bring up the command key help&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+k q / ESC q&lt;/td&gt;&lt;td&gt;Quit editor without saving&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+k x / ESC x&lt;/td&gt;&lt;td&gt;Exist and Save&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+k l / ESC l&lt;/td&gt;&lt;td&gt;Load a new file&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+k s / ESC s&lt;/td&gt;&lt;td&gt;Save the current file&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+r&lt;/td&gt;&lt;td&gt;Page up&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+c&lt;/td&gt;&lt;td&gt;Page down&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+e / cursor&lt;/td&gt;&lt;td&gt;Line up&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+x / cursor&lt;/td&gt;&lt;td&gt;Line down&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+s / cursor&lt;/td&gt;&lt;td&gt;Cursor left&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CTRL+d / cursor&lt;/td&gt;&lt;td&gt;Cursor right&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;

ZDE is a great editor and well worth the time to learn.&amp;nbsp; It has many facilities to make life easier for the programmer and will definitely help make your retro programming more productive.


&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Installing ZDE 1.6&amp;sbquo; a programmers editor for CP/M&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=6" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/z23-76c5nTAp8rrYKjNT_pvQLXQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z23-76c5nTAp8rrYKjNT_pvQLXQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/z23-76c5nTAp8rrYKjNT_pvQLXQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z23-76c5nTAp8rrYKjNT_pvQLXQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/oqURgTQtU6k" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=6</feedburner:origLink></item><item><title>Setting up z80pack to create an emulated CP/M system</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/CkVkq2RlB7o/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=5</guid><pubDate>Fri, 17 Oct 2008 06:22:45 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Setting up z80pack to create an emulated CP/M system[/title] --&gt;
&lt;!-- [tags]CP/M,Emulators,Z80,Retro[/tags] --&gt;
&lt;!-- [licence]cc_attrib[/licence] --&gt;

&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="140" height="100" src="http://techtinkering.com/images/?id=small_z80pack_cpm3.png" title="Loading Screen for CP/M 3.0 on z80pack" alt="Picture of loading screen for CP/M 3.0 on z80pack"/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;

I have decided to try out some old CP/M software, but need something to run it on.&amp;nbsp; I could either do this on my Commodore 128 or through emulation.&amp;nbsp; Unfortunately the 1571 disk drive for my Commodore is currently out of action, so that leaves me with emulation.&amp;nbsp; I was going to use &lt;a href="http://www.viceteam.org/"&gt;vice&lt;/a&gt; to emulate a C128, but have always found it a pain to get CP/M files onto .D64/71 disk images.&amp;nbsp; After looking around for the best emulator to run CP/M on, I came up with either &lt;a href="http://www.mathematik.uni-ulm.de/users/ag/yaze-ag/"&gt;YAZE-AG&lt;/a&gt; or &lt;a href="http://www.unix4fun.org/z80pack/"&gt;z80pack&lt;/a&gt;.&amp;nbsp; z80pack seems to be better supported, has more documentation and is being actively developed, so that&amp;#039;s the one I have chosen for this article.

&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;h2&gt;Installing z80pack&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;First download the source (z80pack-x.y.tgz, currently z80pack-1.16.tgz) for &lt;a href="http://www.unix4fun.org/z80pack/" title="z80pack main site"&gt;z80pack&lt;/a&gt; from its &lt;a href="ftp://ftp.unix4fun.org/z80pack"&gt;ftp site&lt;/a&gt;.&amp;nbsp; The following &lt;a href="http://www.unix4fun.org/z80pack/#dri_quick" title="Installation instructions for z80pack"&gt;installation instructions&lt;/a&gt; are taken from the z80pack site.&amp;nbsp; More information can be found there, in particular, information on installing z80pack on non Linux/Unix systems.&lt;/li&gt;
&lt;li&gt;Unpack the source archive in your home directory:&lt;br /&gt;
	&lt;strong&gt;$ tar xzvf z80pack-x.y.tgz&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Change the directory it is extracted to, to make this article easier to explain.&amp;nbsp; There is no need for you to do this.&lt;br /&gt;
	&lt;strong&gt;$ mv z80pack-1.16 z80pack&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Compile the emulator:&lt;br /&gt;
	&lt;strong&gt;$ cd ~/z80pack/cpmsim/srcsim&lt;br /&gt;
		$ make&lt;br /&gt;
		$ make clean&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Compile the support programs:&lt;br /&gt;
	&lt;strong&gt;$ cd ~/z80pack/cpmsim/srctools&lt;br /&gt;
		$ make&lt;br /&gt;
		$ make clean&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;


This is leaves, on Linux, a few bash scripts in the &lt;em&gt;~/z80pack/cpmsim/&lt;/em&gt; directory, &lt;strong&gt;cpm2&lt;/strong&gt;, &lt;strong&gt;cpm3&lt;/strong&gt;, &lt;strong&gt;mpm&lt;/strong&gt;, which automatically start the emulator by booting into CP/M 2.2, CP/M 3.0, MP/M, etc.

&lt;h2&gt;Creating disk images&lt;/h2&gt;We now needed to create some disk images; to do this I recommend &lt;a href="http://www.moria.de/~michael/cpmtools/"&gt;Cpmtools&lt;/a&gt; which is a part of many Linux distros.&amp;nbsp; If you don&amp;#039;t have this as part of your distro, the source can be downloaded from &lt;a href="http://www.moria.de/~michael/cpmtools/cpmtools-2.7.tar.gz"&gt;here&lt;/a&gt;.&amp;nbsp; Cpmtools is a great collection of tools used to manipulate CP/M images and file systems in a variety of formats and works well with z80pack.&lt;br /&gt;

&lt;h3&gt;Create a 4Mb Hard Disk Image&lt;/h3&gt;It would be useful to create a 4Mb Hard Disk Image, as this may be needed if we want to use any bigger applications such as a C compiler.&amp;nbsp; To create this we can use Cpmtools, but first we need to make sure that it has the correct disk definition by editing &lt;em&gt;/etc/cpmtools/diskdefs&lt;/em&gt; and adding the following lines:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;# 4mb HDD for z80pack
diskdef hd
  seclen 128
  tracks 255
  sectrk 128
  blocksize 2048
  maxdir 1024
  skew 0
  boottrk 0
  os 3.0
end&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;

CP/M has 16 &amp;#039;user areas&amp;#039; which can be used to organize data on a disk.&amp;nbsp; They are effectively like a crude directory system.&amp;nbsp; User area 0 is the default and the only one we will work with in this article.&lt;br /&gt;
&lt;br /&gt;

To create a blank 4Mb Hard Disk image called &lt;em&gt;main.hd4.cpm&lt;/em&gt;, run:&lt;br /&gt;
&lt;strong&gt;$ mkfs.cpm -fhd main.hd4.cpm&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Then to copy all the &lt;em&gt;.COM&lt;/em&gt; files from the current directory into the image in user area 0, run:&lt;br /&gt;
&lt;strong&gt;$ cpmcp -fhd hd4.cpm *.COM 0:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;

&lt;h3&gt;Create a Floppy Diskette Image&lt;/h3&gt;To create a floppy diskette image called, &lt;em&gt;work.dsk.cpm&lt;/em&gt;, run:&lt;br /&gt;
&lt;strong&gt;$ mkfs.cpm work.dsk.cpm&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Then to copy all the &lt;em&gt;.DOC&lt;/em&gt; files from the current directory into the image in user area 0: run:&lt;br /&gt;
&lt;strong&gt;$ cpmcp work.dsk.cpm *.DOC 0:&lt;/strong&gt;&lt;br /&gt;


&lt;h2&gt;Configuring z80pack&lt;/h2&gt;We now have a 4mb disk image and a floppy disk image.&amp;nbsp; We can connect them to the emulator by creating a script in the &lt;em&gt;~/z80pack/cpmsim/&lt;/em&gt; directory called &lt;strong&gt;work&lt;/strong&gt;.&amp;nbsp; First copy &lt;em&gt;main.hd4.cpm&lt;/em&gt; and &lt;em&gt;work.dsk.cpm&lt;/em&gt; to the &lt;em&gt;~z80pack/cpmsim/disks/library/&lt;/em&gt; directory.&amp;nbsp; It is also worth copying them to the backups directory as well: &lt;em&gt;~/z80pack/cpmsim/disks/backups/&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
Now create a script in &lt;em&gt;~/z80pack/cpmsim/&lt;/em&gt; called &lt;strong&gt;work&lt;/strong&gt; to start z80pack with our disk image files attached:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh

rm -f disks/drive[abci].cpm
ln disks/library/cpm3-1.dsk disks/drivea.cpm
ln disks/library/cpm3-2.dsk disks/driveb.cpm
ln disks/library/work.dsk.cpm disks/drivec.cpm
ln disks/library/main.hd4.cpm disks/drivei.cpm
./cpmsim -f4
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
This attaches the two CP/M disks on drive A and B, our &lt;em&gt;work.dsk.cpm&lt;/em&gt; image on drive C, and our main.hd4.cpm image on I:&lt;br /&gt;
The line &lt;code&gt;./cpmsim -f4&lt;/code&gt; tells the emulator to run at 4Mhz, which makes it a bit more realistic.

&lt;h2&gt;Starting the emulator&lt;/h2&gt;From the &lt;em&gt;~/z80pack/cpmsim/&lt;/em&gt; directory, run the script we created:&lt;br /&gt;
&lt;strong&gt;$ ./work&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;

The CP/M operating system will now boot up and leave you at the &lt;strong&gt;A&amp;gt;&lt;/strong&gt; prompt.&lt;br /&gt;
&lt;br /&gt;
To leave the emulator type:&lt;br /&gt;
&lt;strong&gt;A&amp;gt; a:bye&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Where Now?&lt;/h2&gt;For more information on CP/M take a look at the &lt;a href="http://techtinkering.com/resources"&gt;Resources&lt;/a&gt; section under &lt;a href="http://techtinkering.com/resources/cpm.php"&gt;CP/M&lt;/a&gt;.
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Setting up z80pack to create an emulated CP/M system&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=5" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mAIE-AVRWvHfR9NH5DJ0J_Pos1s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mAIE-AVRWvHfR9NH5DJ0J_Pos1s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mAIE-AVRWvHfR9NH5DJ0J_Pos1s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mAIE-AVRWvHfR9NH5DJ0J_Pos1s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/CkVkq2RlB7o" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=5</feedburner:origLink></item><item><title>PDP 8 in 'Three Days of the Condor'</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/aABHCtbRlSQ/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=4</guid><pubDate>Tue, 14 Oct 2008 01:08:49 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]PDP 8 in 'Three Days of the Condor'[/title] --&gt;
&lt;!-- [tags]Computers in Movies,Dec PDP 8,Retro[/tags] --&gt;
&lt;!-- [licence]none[/licence] --&gt;
&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;img class="articleSummaryPic" width="140" height="100" src="http://techtinkering.com/images/?id=small_third_day_of_the_condor_pdp_8_1.jpg" title="PDP 8/E from Three Days of the Condor" alt="Picture of a PDP 8/E from Three Days of the Condor"/&gt;
&lt;/td&gt;&lt;td style="vertical-align:top;"&gt;
I watched &amp;#039;Three Days of the Condor&amp;#039; the other night and loved seeing what I believe is a Dec PDP 8/E being used.&amp;nbsp; Also featured in connection with this machine was a DecWriter, paper tape reader and possibly a VT-52 video terminal.

&lt;p&gt;The film revolves around a CIA researcher, Robert Redford, finding out about a secret section within the CIA, and their attempts to silence him.&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;table&gt;&lt;tr&gt;&lt;td style="width:400px;"&gt;
&lt;img class="articleSummaryPic" style="margin-right:1em; margin-top:1em; margin-bottom:1em;" width="400" height="286" src="http://techtinkering.com/images/?id=third_day_of_the_condor_pdp_8_1.jpg" title="PDP 8/E from Three Days of the Condor" alt="Picture of a PDP 8/E"/&gt;
&lt;img class="articleSummaryPic" width="400" height="244" src="http://techtinkering.com/images/?id=third_day_of_the_condor_pdp_8_2.jpg" title="PDP 8/E from Three Days of the Condor" alt="Picture of a PDP 8/E"/&gt;

&lt;/td&gt;
&lt;td style="vertical-align:top"&gt;
&lt;p&gt;While the film itself is great, I was really pleased to spot the PDP 8, and was interested to see it doing OCR scanning.&amp;nbsp; I am told that it was indeed used for OCR scanning sometimes and there were even add on cards to improve the speed of this.&amp;nbsp; The computer isn&amp;#039;t in the film for long, but it does show a computer operator unloading a Dectape, although things don&amp;#039;t turn out well for her, as you can see from the final picture.&lt;/p&gt; 
&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Q8x_3fy-uXAB_DGit5Zekcp6jZ4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q8x_3fy-uXAB_DGit5Zekcp6jZ4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Q8x_3fy-uXAB_DGit5Zekcp6jZ4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q8x_3fy-uXAB_DGit5Zekcp6jZ4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/aABHCtbRlSQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=4</feedburner:origLink></item><item><title>Book Review: Fundamentals of Operating Systems by A.M. Lister - Second Edition</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/xA7B5Z4400k/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=3</guid><pubDate>Tue, 07 Oct 2008 17:06:00 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Book Review: Fundamentals of Operating Systems by A.M. Lister - Second Edition[/title] --&gt;
&lt;table class="articleSummary"&gt;&lt;tr&gt;&lt;td class="asPic"&gt;
&lt;a class="amazonLink" href="http://www.amazon.co.uk/gp/product/0333272870?ie=UTF8&amp;amp;tag=trustafriend-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0333272870" title="Buy from Amazon" &gt;
&lt;img class="articleSummaryPic" height="100" src="http://techtinkering.com/images/?id=book_fundamentals_operating_systems.png" title="Buy from Amazon" alt=""/&gt;&lt;/a&gt;
&lt;div&gt;&lt;a class="amazonLink" href="http://www.amazon.co.uk/gp/product/0333272870?ie=UTF8&amp;amp;tag=trustafriend-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=6738&amp;amp;creativeASIN=0333272870" title="Buy from Amazon" &gt;Amazon&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td&gt;
It was fascinating to read this book from 1979 and see how operating system design was viewed then, compared to now.&amp;nbsp; The biggest change being the shift in importance from batch processing to the interactive use of computers.&amp;nbsp; Despite the advances since this book was written, it is surprising how many themes are just as relevant. 
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;a name="more"&gt;&lt;/a&gt;

&lt;table class="bookDetails"&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Fundamentals of Operating Systems&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Author&lt;/th&gt;&lt;td&gt;A.M. Lister&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Pages&lt;/th&gt;&lt;td&gt;176&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Edition&lt;/th&gt;&lt;td&gt;Second Edition (1979)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Publisher&lt;/th&gt;&lt;td&gt;The Macmillan Press Ltd&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;ISBN&lt;/th&gt;&lt;td&gt;0 333 27287 0&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;


&lt;p&gt;I loved the comparisons between the different mainframes and minis of the day, such as the PDP-11 and IBM 370 series, and how various functions were implemented in their operating systems.&amp;nbsp; This book gives you a really good insight into the relatively early days of operating systems, so that you can better understand how we got to where we are now.&lt;/p&gt;

&lt;p&gt;While covering issues such as &lt;em&gt;Virtual Memory&lt;/em&gt;, &lt;em&gt;Memory Management&lt;/em&gt;, &lt;em&gt;Concurrent Processing&lt;/em&gt;, &lt;em&gt;File Systems&lt;/em&gt; and &lt;em&gt;Resource Allocation&lt;/em&gt; the author discusses differing approaches which makes for interesting reading as there was no agreed consensus, as to the best strategy, at that time.&lt;/p&gt;

&lt;p&gt;This book is still useful if you want to understand the basics of operating systems design, but is of real interest to the computer historian, who will find a wealth of information in an easy to understand format.&lt;/p&gt;
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Book Review: Fundamentals of Operating Systems by A.M. Lister - Second Edition&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=3" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FggfJxQOGNnGEs2ZnVSxvTsJyW8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FggfJxQOGNnGEs2ZnVSxvTsJyW8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FggfJxQOGNnGEs2ZnVSxvTsJyW8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FggfJxQOGNnGEs2ZnVSxvTsJyW8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/xA7B5Z4400k" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=3</feedburner:origLink></item><item><title>Is COBOL really understandable after 14 years?</title><link>http://feedproxy.google.com/~r/Retro-Techtinkering/~3/et4E6CiG7Q0/</link><guid isPermaLink="false">http://techtinkering.com/articles/?id=1</guid><pubDate>Fri, 08 Aug 2008 15:36:00 GMT</pubDate><category domain="http://techtinkering.com/articles?tag=retro">Retro</category><description>&lt;style type="text/css"&gt;
body 
{	
	color: black; 
	font: Arial, Helvetica, sans-serif;
	font-weight: normal;
	line-height: 150%;
}  

pre {
	background: #F0F0D1;
	border-style: solid;
	border-width: 1px;
	border-color: #dadada;
	font-family: monospace;
	overflow: auto;
	margin-top:0;
	margin-bottom:0;
	margin-left: 0;
	margin-right: 0;
	line-height: 1.2em;
/*	display: inline;*/

}


code {
	color: #8A3A06; /*#007060;*/
	font-family: monospace;
} 

/**
 * Used to explain commands
 */
pre.commands {
	background: white;
	border: none;
	font-family: monospace;
	overflow: auto;
	margin-left: 2em;
}


table.articleSummary
{
	border: none;
}

table.articleSummary td
{
	vertical-align: top;
}

table.articleSummary td.asPic
{
	padding-right: 1em;
	text-align: center;
}

img.articleSummaryPic
{
	border: none;
	padding-bottom: 1em;
}

a.amazonLink 
{ 
	color:blue;
	font-weight: normal;
	text-decoration: none;
}

a.amazonLink:hover 
{ 
	color: #C50103; 
	text-decoration: underline; 
}

h2
{
	font-size: 150%;
	font-weight: bold;
	margin-top: 1em;
	margin-bottom:0.2em;
	clear: left;
}

h3
{
	font-size: 120%;
	margin-top:1em;
	margin-bottom:0.2em;
}


h4
{
	font-size: 100%;
	margin-top:1em;
	margin-bottom:0.2em;
}


table.neatTable td,th
{
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable
{
	border-collapse: collapse;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable td
{
	border: 1px solid gray;
	text-align: left;
	padding-left: 1em;
	padding-right: 1em;
}

table.neatBorderedTable th
{
	border: 1px solid gray;
	font-weight: bold;
	text-align: center;
	padding-left: 1em;
	padding-right: 1em;
}
&lt;/style&gt;&lt;!-- [title]Is COBOL really understandable after 14 years?[/title] --&gt;
COBOL has been in the news quite a lot recently and I have been reading that there are still huge amounts of COBOL code running and being written.  This led me to wonder why this language was still being used.  I therefore decided to look at a few sites about COBOL and see what they said was good about the language.  The main benefits appeared to be that it is portable and self-documenting.  Indeed, I often read about how COBOL programmers say that they can go to code written 10-15 years ago and still easily understand what is happening.&lt;br /&gt;
&lt;a name="more"&gt;&lt;/a&gt;
&lt;br /&gt;
In 1994, while at college, I did a year of COBOL.  I haven't touched it since that time, and have barely even thought about it.  I therefore thought that this would be a good test.  I admit that the premise above, about the ease of understanding code written a long time ago, refers to people with more COBOL experience than I.  However, I was curious to see how much I would understand.&lt;br /&gt;  
&lt;br /&gt;
The code I have chosen was originally written to run under MS-DOS, but unfortunately I can't remember which compiler was used.  It probably isn't the best COBOL code ever written, but I hope that it will help me to explore how easy it is to return to old code.  At times throughout this article I may well refer to things by the wrong name, please bear in mind that the purpose of the article is to test the premise "Is COBOL really understandable after 14 years?", not to teach COBOL.&lt;br /&gt;
&lt;br /&gt;
I have put the full code, associated data file, example output and instructions on how to compile and run the program at the bottom of this article.&lt;br /&gt;

&lt;h2&gt;Analysis of the code&lt;/h2&gt;
After taking a quick look at the code I remember that COBOL is split into DIVISIONs, SECTIONs and paragraphs.  I will go through each DIVISION in turn and try to explain what is happening.  I have purposely not looked up anything while doing this to try and test the premise fully.

&lt;h3&gt;The IDENTIFICATION DIVISION&lt;/h3&gt;
This is fairly unremarkable and is just used to identify what the code is and who wrote it.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;       IDENTIFICATION DIVISION.
       PROGRAM-ID. ASSIGN1.
       AUTHOR. xxxxxxxxxx
      * Assignment 1 for COBOL.
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;The ENVIRONMENT DIVISION&lt;/h3&gt;
This DIVISION is used to specify the environment in which the code will run.  The power of this DIVISION is that you can easily change the environment in which the program is running just by making alterations here.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT TAG2-FILE ASSIGN TO "TAG2.DAT".
       SELECT REP-FILE ASSIGN TO "PRN".
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
Within the above DIVISION we can see the INPUT-OUTPUT SECTION and within that we can see the FILE-CONTROL paragraph.  This is telling the program what names to use to refer to the files and what those files are called.  I can see from this that we have a file called TAG2.DAT and another called PRN.  Under MS-DOS, PRN referred to the printer.  However when this is run under Linux it will just create a file called PRN. 

&lt;h3&gt;The DATA DIVISION&lt;/h3&gt;
This DIVISION specifies how data is stored and structured.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;       DATA DIVISION.
       FILE SECTION.
       FD TAG2-FILE.
       01 TAG2-RCD.
          03 TAG2-ORD-NBR  PIC 9(4).
          03 TAG2-ACC-NBR  PIC A9(7)A.
          03 TAG2-COLOUR   PIC A(3).
          03 TAG2-PRN      PIC A(2).
          03 TAG2-QTY      PIC 9(2).
          03 TAG2-TAG      PIC A(20).
          03 TAG2-DATE     PIC X(6).

       FD REP-FILE.
       01 REP-RCD.
          03 REP-ACC-NBR   PIC A9(7)A.
          03 FILLER        PIC X(7)       VALUE SPACES.
          03 REP-TAG       PIC A(20).
          03 FILLER        PIC X(9)       VALUE SPACES.
          03 REP-PRN       PIC AA.
          03 FILLER        PIC X(6)       VALUE SPACES.
          03 REP-QTY       PIC Z9.
          03 FILLER        PIC X(6)       VALUE SPACES.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
The first SECTION here is the FILE SECTION, which is specifying how the files assigned in the ENVIRONMENT DIVISION to TAG2-FILE and REP-FILE are structured.&lt;br /&gt;
&lt;br /&gt;
If we take TAG2-FILE we can see that it's biggest structure is TAG2-RCD which is representing a record.  This record is split into 7 fields.  The PIC statements after the names of the field specify the format of the field.  For TAG2-ORD-NBR this is 9(4) representing 4 numeric characters.  For TAG2-ACC-NBR this is A9(7)A representing an alphabetical character then 7 numeric characters then an alphabetical character.  Finally TAG2-DAT has X(6) representing 6 characters of any type.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;        WORKING-STORAGE SECTION.
           01 WS1-AREA.
              03 WS1-LCNT  PIC 99 VALUE 70.

              03 WS1-DATE.
                 05 WS1-YR   PIC XX.
                 05 WS1-MT   PIC XX.
                 05 WS1-DY   PIC XX.

              03 WS1-HDR-AREA.
                 05 WS1-DAY       PIC XX.
                 05 FILLER        PIC X VALUE '/'.
                 05 WS1-MTH       PIC XX.
                 05 FILLER        PIC X VALUE '/'.
                 05 WS1-YER       PIC XX.
                 05 FILLER        PIC X(10) VALUE SPACES.
                 05 FILLER        PIC X(19) VALUE 'NAME TAG REPORT - 2'.
                 05 FILLER        PIC X(15) VALUE SPACES.
                 05 FILLER        PIC X(4)  VALUE 'PAGE'.
                 05 FILLER        PIC X(1)  VALUE SPACES.
                 05 WS1-PAGE-NBR  PIC Z9.

             03 WS1-PAGE-EDIT    PIC 99 VALUE 0.

             03 WS1-SUB-HDR.
                05 FILLER        PIC X(19) VALUE SPACES.
                05 FILLER        PIC X(9)  VALUE 'COLOUR - '.
                05 SUB-COLOUR    PIC X(5)  VALUE SPACES.

             03 WS1-SUB-HDR2.
                05 FILLER        PIC X(9)  VALUE 'Acct.Nbr.'.
                05 FILLER        PIC X(7)  VALUE SPACES.
                05 FILLER        PIC X(11) VALUE 'Name on Tag'.
                05 FILLER        PIC X(18) VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'Type'.
                05 FILLER        PIC X(4)  VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'Qty.'.

             03 WS1-COLOR-CHECK PIC A(3)   VALUE SPACES.

             03 WS1-RESULT1.
                05 FILLER        PIC X(5)  VALUE SPACES.
                05 FILLER        PIC X(23) VALUE
                                      'RED.........QUANTITY - '.
                05 WS1-RED-TOTAL PIC ZZZ9.
                05 FILLER        PIC X(7)  VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'COST'.
                05 FILLER        PIC X     VALUE SPACE.
                05 WS1-RED-COST  PIC $$$$9.99.

             03 WS1-RESULT2.
                05 FILLER        PIC X(5)  VALUE SPACES.
                05 FILLER        PIC X(23) VALUE
                                      'BLUE........QUANTITY - '.
                05 WS1-BLU-TOTAL PIC ZZZ9.
                05 FILLER        PIC X(7)  VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'COST'.
                05 FILLER        PIC X     VALUE SPACE.
                05 WS1-BLU-COST  PIC $$$$9.99.

             03 WS1-RESULT3.
                05 FILLER        PIC X(5)  VALUE SPACES.
                05 FILLER        PIC X(23) VALUE
                                      'BLACK.......QUANTITY - '.
                05 WS1-BLA-TOTAL PIC ZZZ9.
                05 FILLER        PIC X(7)  VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'COST'.
                05 FILLER        PIC X     VALUE SPACE.
                05 WS1-BLA-COST  PIC $$$$9.99.

             03 RESULT-CALC.
                05 WS1-BLU-ADD   PIC 9999 VALUE 0.
                05 WS1-RED-ADD   PIC 9999 VALUE 0.
                05 WS1-BLA-ADD   PIC 9999 VALUE 0.
                05 WS1-BLU-TOT   PIC 9(5)V99 VALUE 0.
                05 WS1-RED-TOT   PIC 9(5)V99 VALUE 0.
                05 WS1-BLA-TOT   PIC 9(5)V99 VALUE 0.

             03 WS1-CONTROL-HDR.
                05 FILLER        PIC X(19) VALUE SPACES.
                05 FILLER        PIC X(9)  VALUE 'CONTROLS'.
                05 FILLER        PIC X(4)  VALUE SPACES.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
The next section is the WORKING-STORAGE SECTION.  This is where the variables are specified.  The variables are set out in the same way as the files.  If we look at RESULT-CALC we can see that it is made up of 6 fields each with an initial value of 0.  The V used in the last 3 PIC statements represents a decimal point.&lt;br /&gt;  
&lt;br /&gt;
The variables can be referred to by any of the names specified above and will include each of the subdivisions of that name.  So you can refer to RESULT-CALC and it will also automatically be referring to each of its fields as well, or you can just refer to the fields directly e.g. WS1-BLU-ADD.  There is no need to refer to the fields by way of the record.  Which does mean that you have to be careful about not reusing names.&lt;br /&gt;


&lt;h3&gt;The PROCEDURE DIVISION&lt;/h3&gt;
This is the DIVISION where all the processing gets done.  It can be split into SECTIONs so that you can have subroutines.  However, this piece of code doesn't have any SECTIONs within the PROCEDURE DIVISION.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;       PROCEDURE DIVISION.
           OPEN INPUT TAG2-FILE.
           OPEN OUTPUT REP-FILE.

      * Get the Date
           ACCEPT WS1-DATE FROM DATE.
           MOVE WS1-YR TO WS1-YER.
           MOVE WS1-MT TO WS1-MTH.
           MOVE WS1-DY TO WS1-DAY.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
This is opening the files mentioned earlier for INPUT and OUTPUT.  Then today's date is put into WS1-DATE.  After that, the fields in WS1-DATE are specified directly, e.g. WS1-YR.  These fields are moved into fields from WS1-HDR-AREA, e.g. WS1-YER.  Note the Y2K problem here as it is only using a 6 byte date.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;       A01-OP-LINE.
           READ TAG2-FILE AT END GO TO A90-END.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
A01-OP-LINE is a paragraph label that is used to form a loop.  The next line reads a record from TAG2-FILE and if the end of file is reached it jumps to the paragraph A90-END.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;      * Put Correct Colour Name in Sub Heading
           IF TAG2-COLOUR = 'BLU'
           THEN MOVE SPACES TO SUB-COLOUR
                MOVE 'BLUE' TO SUB-COLOUR
           ELSE IF TAG2-COLOUR = 'RED'
                THEN MOVE SPACES TO SUB-COLOUR
                     MOVE 'RED' TO SUB-COLOUR
                ELSE MOVE SPACES TO SUB-COLOUR
                     MOVE 'BLACK' TO SUB-COLOUR.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
This puts the colour of the tag record read in from the TAG2-FILE into SUB-COLOUR which is a field of WS1-SUB-HDR.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;      * If the number of lines printed &gt; 57 then put up the page heading
           IF WS1-LCNT &gt; 57
           THEN ADD 1 TO WS1-PAGE-EDIT
                MOVE "  " TO WS1-PAGE-NBR
                MOVE WS1-PAGE-EDIT TO WS1-PAGE-NBR
                WRITE REP-RCD FROM WS1-HDR-AREA AFTER ADVANCING PAGE
                MOVE ZERO TO WS1-LCNT
      * Output Colour Sub Heading
                MOVE SPACES TO WS1-COLOR-CHECK
                MOVE TAG2-COLOUR TO WS1-COLOR-CHECK
                WRITE REP-RCD FROM WS1-SUB-HDR AFTER ADVANCING 3 LINES
                WRITE REP-RCD FROM WS1-SUB-HDR2 AFTER ADVANCING 1 LINE
                ADD 4 TO WS1-LCNT
                MOVE SPACES TO REP-RCD.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
This prints a header for the page if more than 57 lines have been printed and also prints a heading for the current colour table.  WS1-LCNT is initialised with the value of 70 in the WORKING-STORAGE SECTION, so a header is printed on the first page.  The code if fairly self explanatory.  The MOVE statements copy the literal or variable being referred to into the variable specified.  SPACES represent a full field of space characters.  ZERO is the numerical literal 0.  WRITE REP-RCD... writes the record specified by FROM to the file REP-FILE which is associated with REP-RCD.  The THEN statement will execute everything up to the period, this is called a sentence.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;           IF WS1-COLOR-CHECK = TAG2-COLOUR
           THEN NEXT SENTENCE
           ELSE MOVE SPACES TO WS1-COLOR-CHECK
                MOVE TAG2-COLOUR TO WS1-COLOR-CHECK
                WRITE REP-RCD FROM WS1-SUB-HDR AFTER ADVANCING 3 LINES
                WRITE REP-RCD FROM WS1-SUB-HDR2 AFTER ADVANCING 1 LINE
                ADD 4 TO WS1-LCNT
                MOVE SPACES TO REP-RCD.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;

This checks if the record just read from TAG2-FILE is a different colour from the current table colour.  If the colour is the same then it skips to the NEXT SENTENCE, i.e. after the period.  Otherwise it prints a heading for the table.  The AFTER ADVANCING 3 LINES outputs 3 newlines to the file before writing the record.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;           MOVE TAG2-ACC-NBR TO REP-ACC-NBR.
           MOVE TAG2-TAG TO REP-TAG.
           MOVE TAG2-PRN TO REP-PRN.
           MOVE TAG2-QTY TO REP-QTY.
           WRITE REP-RCD AFTER ADVANCING 1 LINE.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;

This copies some of the fields of the record TAG2-RCD read in from TAG2-FILE to some of the fields of the record REP-RCD.  The REP-RCD record is then written to the associated REP-FILE.  If you look at REP-RCD in the FILE SECTION you will see that each field is seperated by FILLER spaces.  This is so that a neat table can be built for output.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;      * Add up Tag Quantity for each Colour
           IF TAG2-COLOUR = 'BLU'
           THEN ADD TAG2-QTY TO WS1-BLU-ADD
           ELSE IF TAG2-COLOUR = 'RED'
                THEN ADD TAG2-QTY TO WS1-RED-ADD
                ELSE ADD TAG2-QTY TO WS1-BLA-ADD.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;

This determines which colour the current record is from TAG2-COLOUR, then adds the quantity of the current record to the relevant variable.  E.g. for the case of TAG2-COLOUR = 'BLU' the quantity TAG2-QTY is added to the variable WS1-BLU-ADD.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;      * Add up Tag Cost for each Colour
           IF TAG2-COLOUR = 'BLU' AND TAG2-QTY = 24
           THEN ADD 2.25 TO WS1-BLU-TOT
           ELSE IF TAG2-COLOUR = 'BLU' AND TAG2-QTY = 36
                THEN ADD 3.00 TO WS1-BLU-TOT.

           IF TAG2-COLOUR = 'RED' AND TAG2-QTY = 24
           THEN ADD 2.25 TO WS1-RED-TOT
           ELSE IF TAG2-COLOUR = 'RED' AND TAG2-QTY = 36
                THEN ADD 3.00 TO WS1-RED-TOT.

           IF TAG2-COLOUR = 'BLA' AND TAG2-QTY = 24
           THEN ADD 2.25 TO WS1-BLA-TOT
           ELSE IF TAG2-COLOUR = 'BLA' AND TAG2-QTY = 36
                THEN ADD 3.00 TO WS1-BLA-TOT.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;

This determines the cost to add to each colour's total.  There are a choice of two quantities than can be ordered.  Either 24 or 36.  It can be seen that here the code should be re-written to have the costs for each quantity stored as a variable for each colour.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;           ADD 1 TO WS1-LCNT.
           GO TO A01-OP-LINE.
       A90-END.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;

This adds 1 to the line count (WS1-LCNT).  Then jumps back to paragraph label A01-OP-LINE.  A90-END is a paragraph label which is used near the start of the code to jump to when the end of the file TAG2-FILE is reached.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;      * Print Control Report
           MOVE WS1-BLU-ADD TO WS1-BLU-TOTAL.
           MOVE WS1-RED-ADD TO WS1-RED-TOTAL.
           MOVE WS1-BLA-ADD TO WS1-BLA-TOTAL.
           MOVE WS1-BLU-TOT TO WS1-BLU-COST.
           MOVE WS1-RED-TOT TO WS1-RED-COST.
           MOVE WS1-BLA-TOT TO WS1-BLA-COST.
           WRITE REP-RCD FROM WS1-CONTROL-HDR AFTER ADVANCING 4 LINES.
           WRITE REP-RCD FROM WS1-RESULT1 AFTER ADVANCING 1 LINE.
           WRITE REP-RCD FROM WS1-RESULT2 AFTER ADVANCING 1 LINE.
           WRITE REP-RCD FROM WS1-RESULT3 AFTER ADVANCING 1 LINE.
           CLOSE TAG2-FILE REP-FILE.
           STOP RUN.
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;

The code finishes by copying the running cost and quantity totals to the fields in the records WS1-RESULT1, WS1-RESULT2, WS1-RESULT3.  Then writing a header to REP-FILE using WS-CONTROL-HDR, and writing the quantity and cost for each colour.  The files are then closed and the program is stopped.&lt;br /&gt;

&lt;h2&gt;Summary of the program&lt;/h2&gt;
The program reads in name tag records from TAG2.DAT and outputs a report to PRN.

&lt;h2&gt;Conclusion&lt;/h2&gt;
Once I had remembered how COBOL is set out, I found this program easy to understand and believe that it would be easy to maintain and expand.  I admit that this is only a trivial example, but then I haven't used COBOL for a long time, so I think it is a fair investigation.  I can see from the code why COBOL is so good at processing transactions and in particular batch processing.  A similar program written in Java, the new standard in the business world, would be considerably more complex and difficult to understand.  That said, I do recognise that while most of the added complexity would be with the code to read in the structured input file, the output report writing would be considerably easier by just using formatted strings. 

&lt;h2&gt;Afterwards&lt;/h2&gt;
After writing this article I decided to look at COBOL in more depth.  My main conclusion is that COBOL has advanced quite considerably since this code was written.  In fact I think that the style of COBOL we were taught in 1994 was already quite dated.  I have enjoyed this trip down memory lane, but now want to see if COBOL can offer anything for the present and into the future.  The most recent advance in COBOL appear to be an object orientated standard, which offers some considerable improvements while maintaining backwards compatibility.  Unfortunately the uptake on this seems to be slow.  COBOL does have a bad press, and after looking at modern COBOL, most of the complaints refer to problems that have been fixed over 30 years ago.  If COBOL is to halt its decline it needs more vocal advocates to show why it is so good and to help explain the COBOL mindset.  One further problem COBOL has long had is the lack of free compilers.  There are a couple of projects out there but they need support.  The most advanced project for Linux appears to be &lt;a href="http://opencobol.org"&gt;OpenCOBOL&lt;/a&gt;.  Another project which, though incomplete, should offer a great compiler in the long term is &lt;a href="http://cobolforgcc.sourceforge.net/"&gt;Cobol for GCC&lt;/a&gt;.  I wish these projects well, and hope that COBOL can regain the respect it deserves.&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;

&lt;h2&gt;The full code (ASSIGN1.CBL)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;       IDENTIFICATION DIVISION.
       PROGRAM-ID. ASSIGN1.
       AUTHOR. Lawrence Woodman
      * Assignment 1 for COBOL.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT TAG2-FILE ASSIGN TO "TAG2.DAT".
       SELECT REP-FILE ASSIGN TO "PRN".

       DATA DIVISION.
       FILE SECTION.
       FD TAG2-FILE.
       01 TAG2-RCD.
          03 TAG2-ORD-NBR  PIC 9(4).
          03 TAG2-ACC-NBR  PIC A9(7)A.
          03 TAG2-COLOUR   PIC A(3).
          03 TAG2-PRN      PIC A(2).
          03 TAG2-QTY      PIC 9(2).
          03 TAG2-TAG      PIC A(20).
          03 TAG2-DATE     PIC X(6).

       FD REP-FILE.
       01 REP-RCD.
          03 REP-ACC-NBR   PIC A9(7)A.
          03 FILLER        PIC X(7)       VALUE SPACES.
          03 REP-TAG       PIC A(20).
          03 FILLER        PIC X(9)       VALUE SPACES.
          03 REP-PRN       PIC AA.
          03 FILLER        PIC X(6)       VALUE SPACES.
          03 REP-QTY       PIC Z9.
          03 FILLER        PIC X(6)       VALUE SPACES.

        WORKING-STORAGE SECTION.
           01 WS1-AREA.
              03 WS1-LCNT  PIC 99 VALUE 70.

              03 WS1-DATE.
                 05 WS1-YR   PIC XX.
                 05 WS1-MT   PIC XX.
                 05 WS1-DY   PIC XX.

              03 WS1-HDR-AREA.
                 05 WS1-DAY       PIC XX.
                 05 FILLER        PIC X VALUE '/'.
                 05 WS1-MTH       PIC XX.
                 05 FILLER        PIC X VALUE '/'.
                 05 WS1-YER       PIC XX.
                 05 FILLER        PIC X(10) VALUE SPACES.
                 05 FILLER        PIC X(19) VALUE 'NAME TAG REPORT - 2'.
                 05 FILLER        PIC X(15) VALUE SPACES.
                 05 FILLER        PIC X(4)  VALUE 'PAGE'.
                 05 FILLER        PIC X(1)  VALUE SPACES.
                 05 WS1-PAGE-NBR  PIC Z9.

             03 WS1-PAGE-EDIT    PIC 99 VALUE 0.

             03 WS1-SUB-HDR.
                05 FILLER        PIC X(19) VALUE SPACES.
                05 FILLER        PIC X(9)  VALUE 'COLOUR - '.
                05 SUB-COLOUR    PIC X(5)  VALUE SPACES.

             03 WS1-SUB-HDR2.
                05 FILLER        PIC X(9)  VALUE 'Acct.Nbr.'.
                05 FILLER        PIC X(7)  VALUE SPACES.
                05 FILLER        PIC X(11) VALUE 'Name on Tag'.
                05 FILLER        PIC X(18) VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'Type'.
                05 FILLER        PIC X(4)  VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'Qty.'.

             03 WS1-COLOR-CHECK PIC A(3)   VALUE SPACES.

             03 WS1-RESULT1.
                05 FILLER        PIC X(5)  VALUE SPACES.
                05 FILLER        PIC X(23) VALUE
                                      'RED.........QUANTITY - '.
                05 WS1-RED-TOTAL PIC ZZZ9.
                05 FILLER        PIC X(7)  VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'COST'.
                05 FILLER        PIC X     VALUE SPACE.
                05 WS1-RED-COST  PIC $$$$9.99.

             03 WS1-RESULT2.
                05 FILLER        PIC X(5)  VALUE SPACES.
                05 FILLER        PIC X(23) VALUE
                                      'BLUE........QUANTITY - '.
                05 WS1-BLU-TOTAL PIC ZZZ9.
                05 FILLER        PIC X(7)  VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'COST'.
                05 FILLER        PIC X     VALUE SPACE.
                05 WS1-BLU-COST  PIC $$$$9.99.

             03 WS1-RESULT3.
                05 FILLER        PIC X(5)  VALUE SPACES.
                05 FILLER        PIC X(23) VALUE
                                      'BLACK.......QUANTITY - '.
                05 WS1-BLA-TOTAL PIC ZZZ9.
                05 FILLER        PIC X(7)  VALUE SPACES.
                05 FILLER        PIC X(4)  VALUE 'COST'.
                05 FILLER        PIC X     VALUE SPACE.
                05 WS1-BLA-COST  PIC $$$$9.99.

             03 RESULT-CALC.
                05 WS1-BLU-ADD   PIC 9999 VALUE 0.
                05 WS1-RED-ADD   PIC 9999 VALUE 0.
                05 WS1-BLA-ADD   PIC 9999 VALUE 0.
                05 WS1-BLU-TOT   PIC 9(5)V99 VALUE 0.
                05 WS1-RED-TOT   PIC 9(5)V99 VALUE 0.
                05 WS1-BLA-TOT   PIC 9(5)V99 VALUE 0.

             03 WS1-CONTROL-HDR.
                05 FILLER        PIC X(19) VALUE SPACES.
                05 FILLER        PIC X(9)  VALUE 'CONTROLS'.
                05 FILLER        PIC X(4)  VALUE SPACES.

       PROCEDURE DIVISION.
           OPEN INPUT TAG2-FILE.
           OPEN OUTPUT REP-FILE.

      * Get the Date
           ACCEPT WS1-DATE FROM DATE.
           MOVE WS1-YR TO WS1-YER.
           MOVE WS1-MT TO WS1-MTH.
           MOVE WS1-DY TO WS1-DAY.

       A01-OP-LINE.
           READ TAG2-FILE AT END GO TO A90-END.

      * Put Correct Colour Name in Sub Heading
           IF TAG2-COLOUR = 'BLU'
           THEN MOVE SPACES TO SUB-COLOUR
                MOVE 'BLUE' TO SUB-COLOUR
           ELSE IF TAG2-COLOUR = 'RED'
                THEN MOVE SPACES TO SUB-COLOUR
                     MOVE 'RED' TO SUB-COLOUR
                ELSE MOVE SPACES TO SUB-COLOUR
                     MOVE 'BLACK' TO SUB-COLOUR.

      * If the number of lines printed &gt; 57 then put up the page heading
           IF WS1-LCNT &gt; 57
           THEN ADD 1 TO WS1-PAGE-EDIT
                MOVE "  " TO WS1-PAGE-NBR
                MOVE WS1-PAGE-EDIT TO WS1-PAGE-NBR
                WRITE REP-RCD FROM WS1-HDR-AREA AFTER ADVANCING PAGE
                MOVE ZERO TO WS1-LCNT
      * Output Colour Sub Heading
                MOVE SPACES TO WS1-COLOR-CHECK
                MOVE TAG2-COLOUR TO WS1-COLOR-CHECK
                WRITE REP-RCD FROM WS1-SUB-HDR AFTER ADVANCING 3 LINES
                WRITE REP-RCD FROM WS1-SUB-HDR2 AFTER ADVANCING 1 LINE
                ADD 4 TO WS1-LCNT
                MOVE SPACES TO REP-RCD.

           IF WS1-COLOR-CHECK = TAG2-COLOUR
           THEN NEXT SENTENCE
           ELSE MOVE SPACES TO WS1-COLOR-CHECK
                MOVE TAG2-COLOUR TO WS1-COLOR-CHECK
                WRITE REP-RCD FROM WS1-SUB-HDR AFTER ADVANCING 3 LINES
                WRITE REP-RCD FROM WS1-SUB-HDR2 AFTER ADVANCING 1 LINE
                ADD 4 TO WS1-LCNT
                MOVE SPACES TO REP-RCD.

           MOVE TAG2-ACC-NBR TO REP-ACC-NBR.
           MOVE TAG2-TAG TO REP-TAG.
           MOVE TAG2-PRN TO REP-PRN.
           MOVE TAG2-QTY TO REP-QTY.
           WRITE REP-RCD AFTER ADVANCING 1 LINE.

      * Add up Tag Quantity for each Colour
           IF TAG2-COLOUR = 'BLU'
           THEN ADD TAG2-QTY TO WS1-BLU-ADD
           ELSE IF TAG2-COLOUR = 'RED'
                THEN ADD TAG2-QTY TO WS1-RED-ADD
                ELSE ADD TAG2-QTY TO WS1-BLA-ADD.

      * Add up Tag Cost for each Colour
           IF TAG2-COLOUR = 'BLU' AND TAG2-QTY = 24
           THEN ADD 2.25 TO WS1-BLU-TOT
           ELSE IF TAG2-COLOUR = 'BLU' AND TAG2-QTY = 36
                THEN ADD 3.00 TO WS1-BLU-TOT.

           IF TAG2-COLOUR = 'RED' AND TAG2-QTY = 24
           THEN ADD 2.25 TO WS1-RED-TOT
           ELSE IF TAG2-COLOUR = 'RED' AND TAG2-QTY = 36
                THEN ADD 3.00 TO WS1-RED-TOT.

           IF TAG2-COLOUR = 'BLA' AND TAG2-QTY = 24
           THEN ADD 2.25 TO WS1-BLA-TOT
           ELSE IF TAG2-COLOUR = 'BLA' AND TAG2-QTY = 36
                THEN ADD 3.00 TO WS1-BLA-TOT.

           ADD 1 TO WS1-LCNT.
           GO TO A01-OP-LINE.
       A90-END.
      * Print Control Report
           MOVE WS1-BLU-ADD TO WS1-BLU-TOTAL.
           MOVE WS1-RED-ADD TO WS1-RED-TOTAL.
           MOVE WS1-BLA-ADD TO WS1-BLA-TOTAL.
           MOVE WS1-BLU-TOT TO WS1-BLU-COST.
           MOVE WS1-RED-TOT TO WS1-RED-COST.
           MOVE WS1-BLA-TOT TO WS1-BLA-COST.
           WRITE REP-RCD FROM WS1-CONTROL-HDR AFTER ADVANCING 4 LINES.
           WRITE REP-RCD FROM WS1-RESULT1 AFTER ADVANCING 1 LINE.
           WRITE REP-RCD FROM WS1-RESULT2 AFTER ADVANCING 1 LINE.
           WRITE REP-RCD FROM WS1-RESULT3 AFTER ADVANCING 1 LINE.
           CLOSE TAG2-FILE REP-FILE.
           STOP RUN.
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Uuencode data file (TAG2.DAT)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;begin-base64 644 TAG2.DAT
MDAwMWEwMDAwMDAxYVJFRFNDMjRKaiAgICAgICAgICAgICAgICAgIDk0MTEy
MjAwMDJhMDAwMDAwMmFSRURTQzM2RC5Ccm93biAgICAgICAgICAgICA5NDEx
MjIwMDAzYTAwMDAwMDNhUkVEU1QyNFQuSm9uZXMgICAgICAgICAgICAgOTQx
MTIyMDAwNGEwMDAwMDA0YVJFRFNUMzZSLlRhbGJvdCAgICAgICAgICAgIDk0
MTEyMjAwMDVhMDAwMDAwNWFCTFVTQzI0Ui5KICAgICAgICAgICAgICAgICA5
NDExMjIwMDA2YTAwMDAwMDZhQkxVU0MzNkguTCAgICAgICAgICAgICAgICAg
OTQxMTIyMDAwN2EwMDAwMDA3YUJMVVNUMjRSLlAgICAgICAgICAgICAgICAg
IDk0MTEyMjAwMDhhMDAwMDAwOGFCTFVTVDM2Si5LICAgICAgICAgICAgICAg
ICA5NDExMjIwMDA5YTAwMDAwMDlhQkxBU0MyNFIuUCAgICAgICAgICAgICAg
ICAgOTQxMTIyMDAxMGEwMDAwMDEwYUJMQVNDMzZQLlAgICAgICAgICAgICAg
ICAgIDk0MTEyMjAwMTFhMDAwMDAxMWFCTEFTVDI0US5RICAgICAgICAgICAg
ICAgICA5NDExMjIwMDEyYTAwMDAwMTJhQkxBU1QzNk8uTyAgICAgICAgICAg
ICAgICAgOTQxMTIyCg==
====
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Compiling and running the program&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;To compile this code I am using &lt;a href="http://opencobol.org"&gt;OpenCOBOL&lt;/a&gt; under Linux.  I compile it to en executable using: &lt;code&gt;cobc -x ASSIGN1.CBL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;To create the TAG2.DAT file that is needed copy the uuencoded data above to a file, say tag2.uue.  Then run: &lt;code&gt;uudecode tag2.uue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;To execute the program, make sure that TAG2.DAT is in the same directory as the executable ASSIGN1.  Then run &lt;code&gt;./ASSIGN1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

After running the program you should find a file called PRN has been created which contains the report.

&lt;h2&gt;Example report (PRN)&lt;/h2&gt;
&lt;pre&gt;&lt;samp&gt;26/08/08          NAME TAG REPORT - 2               PAGE  1  


                   COLOUR - RED                              
Acct.Nbr.       Name on Tag                  Type    Qty.    
a0000001a       Jj                           SC      24      
a0000002a       D.Brown                      SC      36      
a0000003a       T.Jones                      ST      24      
a0000004a       R.Talbot                     ST      36      


                   COLOUR - BLUE                             
Acct.Nbr.       Name on Tag                  Type    Qty.    
a0000005a       R.J                          SC      24      
a0000006a       H.L                          SC      36      
a0000007a       R.P                          ST      24      
a0000008a       J.K                          ST      36      


                   COLOUR - BLACK                            
Acct.Nbr.       Name on Tag                  Type    Qty.    
a0000009a       R.P                          SC      24      
a0000010a       P.P                          SC      36      
a0000011a       Q.Q                          ST      24      
a0000012a       O.O                          ST      36      



                   CONTROLS                                  
     RED.........QUANTITY -  120       COST   $10.50         
     BLUE........QUANTITY -  120       COST   $10.50         
     BLACK.......QUANTITY -  120       COST   $10.50         
&lt;/samp&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;hr /&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/2.0/uk/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type"&gt;Is COBOL really understandable after 14 years?&lt;/span&gt;&lt;br/&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://techtinkering.com/articles/?id=1" property="cc:attributionName" rel="cc:attributionURL"&gt;TechTinkering&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/2.0/uk/"&gt;Creative Commons Attribution 2.0 UK: England &amp;amp; Wales License&lt;/a&gt;.
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lkrRFQ9LFNIg2F2bOzvHaP_JidM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lkrRFQ9LFNIg2F2bOzvHaP_JidM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lkrRFQ9LFNIg2F2bOzvHaP_JidM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lkrRFQ9LFNIg2F2bOzvHaP_JidM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Retro-Techtinkering/~4/et4E6CiG7Q0" height="1" width="1"/&gt;</description><feedburner:origLink>http://techtinkering.com/articles/?id=1</feedburner:origLink></item></channel>
</rss>
