<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>jamtronix</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/" />
    <link rel="self" type="application/atom+xml" href="http://blog.jamtronix.com/atom.xml" />
   <id>tag:blog.jamtronix.com,2008://1</id>
    <link rel="service.post" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1" title="jamtronix" />
    <updated>2008-02-03T04:56:46Z</updated>
    <subtitle>The older I get, the better I was</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.2ysb5-20051201</generator>
 
<entry>
    <title>notes on an apple iie front panel</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2008/01/notes_on_an_apple_iie_front_pa.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=99" title="notes on an apple iie front panel" />
    <id>tag:blog.jamtronix.com,2008://1.99</id>
    
    <published>2008-01-26T21:22:24Z</published>
    <updated>2008-02-03T04:56:46Z</updated>
    
    <summary><![CDATA[I'm working on some ideas that may eventually evolve into a 'front panel' for my&nbsp;//e.The proposed feature list (in descending order of likelyhood that I will have the time &amp; skill to implement):A toggle to flip between a 'standard' ROM...]]></summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
            <category term="apple ii" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p>I'm working on some ideas that may eventually evolve into a 'front panel' for my&nbsp;//e.<br />The proposed feature list (in descending order of likelyhood that I will have the time &amp; skill to implement):</p><ul><li>A toggle to flip between a 'standard' ROM and a crack-ROM (most likely &quot;Senior PROM&quot;)</li><li>A debounced 'NMI' pushbutton</li><li>A 4 digit readout of the current program counter</li><li>hardware breakpoints (i.e. an address can be entered through a 4x4 keyboard, and when that address is executed, read or written, an NMI is generated).</li><li>A 'single step' mode.</li></ul><p>I&nbsp;intend to&nbsp;use one or more Atmega8 microcontrollers in this. Here are some relevant links so I can keep track of them:</p><ul><li><a href="http://www.evilmadscientist.com/article.php/avrtargetboards">Using AVR microcontrollers: Minimalist target boards</a>&nbsp;</li><li><a href="http://klikwae.info/usbasp-usb-programmer-for-atmel-avr-controllers.htm">Building and installing USBASP-USB programmer of AVR microcontrollers&nbsp;</a></li><li><a href="http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf">Atmega8 datasheet (full version)</a></li><li><a href="http://www.jamtronix.com/7seg/">Extended 7-segment font</a>&nbsp;(I have burned this in to a 28c64, then wired D0..D6 of the 28c64 to the Segment A.. Segment G pins on a &quot;common cathode&quot; 7 segment LED display. Then sending a number between 0..0x0F on pins A0..A3 on the 28c64 causes the corresponding digit to be displayed).</li><li><a href="http://www.nongnu.org/avrdude/user-manual/avrdude.html">AVRDUDE manual</a></li><li><a href="http://my.opera.com/CrazyTerabyte/blog/2007/10/25/first-contact-with-atmega8-microcontroller-part-1">First contact with ATmega8 microcontroller</a> </li><li><a href="http://palmavr.sourceforge.net/cgi-bin/fc.cgi">Online AVR Fuse Calculator</a></li></ul>]]>
        
    </content>
</entry>
<entry>
    <title>dsktool 0.4.2</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2008/01/dsktool_042.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=98" title="dsktool 0.4.2" />
    <id>tag:blog.jamtronix.com,2008://1.98</id>
    
    <published>2008-01-01T00:17:07Z</published>
    <updated>2008-01-01T00:17:07Z</updated>
    
    <summary>I&apos;ve just released version 0.4.2 of dsktool.rb, a command line tool and library for working with DSK images, written in ruby. The major changes in this version are: * DOS 3.3 support now read/write * NADOL support (read/write) * ProDOS...</summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
            <category term="apple ii" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[I've just released version 0.4.2 of dsktool.rb, a command line tool <br />and library for working with DSK images, written in ruby. <br /><p>The major changes in this version are: <br /></p><p>* DOS 3.3 support now read/write <br />* NADOL support (read/write) <br />* ProDOS support (read only) <br />* Pascal support (read only) <br />* Hi Res Graphics converted to PNG <br /></p><p>Instructions on how to install and get started with dsktool.rb are at <br /><a href="http://dsktool.jamtronix.com/" target="_blank">http://dsktool.jamtronix.com</a> <br /></p>]]>
        
    </content>
</entry>
<entry>
    <title>quotes of the month</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/11/qoutes_of_the_month.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=97" title="quotes of the month" />
    <id>tag:blog.jamtronix.com,2007://1.97</id>
    
    <published>2007-11-11T06:26:20Z</published>
    <updated>2008-01-01T00:16:20Z</updated>
    
    <summary>Those lulls in the conversation over dinner? That&apos;s the nerd working on his project in his head. Rands In Repose : The Nerd HandbookHave you ever been fucking a blonde up the ass and then, like, pushed her face into...</summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p><em>Those lulls in the conversation over dinner? That's the nerd working on his project in his head. </em><a href="http://www.randsinrepose.com/archives/2007/11/11/the_nerd_handbook.html">Rands In Repose : The Nerd Handbook</a></p><p><em>Have you ever been fucking a blonde up the ass and then, like, pushed her face into your monitor filled with a maximized terminal window and shouted &ldquo;SUDO MAKE ME A SANDWICH, BITCH!&rdquo; That&rsquo;s hawt.</em>&nbsp;<a title="Site: dive into mark" href="http://diveintomark.org/archives/2007/11/11/installing-mysql-on-ubuntu" target="_blank">Dive Into Mark&nbsp;: Installing MySQL on Ubuntu (the NSFW way)</a></p>]]>
        
    </content>
</entry>
<entry>
    <title>the yellow scarf</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/09/the_yellow_scarf.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=96" title="the yellow scarf" />
    <id>tag:blog.jamtronix.com,2007://1.96</id>
    
    <published>2007-09-07T11:16:03Z</published>
    <updated>2007-09-07T11:16:03Z</updated>
    
    <summary>A new aussie rugby forum: The Yellow Scarf...</summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[A new aussie rugby forum: <a href="http://www.theyellowscarf.com/">The Yellow Scarf</a>]]>
        
    </content>
</entry>
<entry>
    <title>two apple 2 related items</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/08/two_apple_2_related_items.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=95" title="two apple 2 related items" />
    <id>tag:blog.jamtronix.com,2007://1.95</id>
    
    <published>2007-08-26T00:41:32Z</published>
    <updated>2007-08-26T00:41:33Z</updated>
    
    <summary><![CDATA[Item the first:&nbsp;I've turned the 'Hardcore Computist' article index into a web page so you can navigate from each article directly to the page containing the article. In the process, I've created a mirror of the scans from http://www.computist-project.net/, so...]]></summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
            <category term="apple ii" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p>Item the first:&nbsp;</p><p>I've turned the '<a href="http://www.computist-project.net/">Hardcore Computist</a>' article index into a web page so <br />you can navigate from each article directly to the page containing the <br />article. In the process, I've created a mirror of the scans from <br /><a href="http://www.computist-project.net/" target="_blank">http://www.computist-project.net/</a>, so i could link directly to a page. </p><p>The article index is at <a href="http://computist.jamtronix.com/article_index.html" target="_blank">http://computist.jamtronix.com/article_index.html</a> </p><p>Item the second:</p><p>I've released a new version of <a href="http://dsktool.rubyforge.org/">dsktool.rb</a>. Change log:<br /><br /><em>V0.2.1<br />* Added support for NADOL disks (Nibbles Away Disk Optimized Language)<br />* Added sector viewer to dskexplorer.rb<br />* DOS 3.3 support now more robust</em></p><p>If you don't know what NADOL is, it's the &quot;Nibbles Away Disk Optimized Language&quot; - a simple DOS + Pascal like language orientated towards building scripts for deprotecting disks. But it's turing complete, and has enough text and graphics commands to allow creation of (for example) a BRICKOUT clone. Docs are at <a href="http://www.textfiles.com/apple/DOCUMENTATION/nibbles.away.iii.txt">http://www.textfiles.com/apple/DOCUMENTATION/nibbles.away.iii.txt</a>&nbsp;and there's a DSK&nbsp;image at <a href="http://jamtronix.com/dsks/NADOL.DSK">http://jamtronix.com/dsks/NADOL.DSK</a>&nbsp;</p>]]>
        
    </content>
</entry>
<entry>
    <title>writing rock-paper-scissors bots in ruby</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/07/writing_rockpaperscissors_bots.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=94" title="writing rock-paper-scissors bots in ruby" />
    <id>tag:blog.jamtronix.com,2007://1.94</id>
    
    <published>2007-07-29T06:03:07Z</published>
    <updated>2007-08-26T03:13:11Z</updated>
    
    <summary>RubyShamBo is a framework for hosting RoShamBo (also known as Rock-Paper-Scissors) tournaments between different computer players (aka bots). RoShamBo is a simple game played between two players. On each turn, the players simultaneously choose one of &quot;rock&quot;, &quot;paper&quot;, or &quot;scissors&quot;....</summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
            <category term="ruby" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<a href=http://rubyshambo.rubyforge.org/>RubyShamBo</a> is a framework for hosting RoShamBo (also known as Rock-Paper-Scissors) tournaments between different computer players (aka bots).

RoShamBo is a simple game played between two players. On each turn, the players simultaneously choose one of "rock", "paper", or "scissors". If they choose
the same item, the result is a tie; otherwise paper covers rock, scissors cuts paper, or rock crushes scissors. A match consists of a series of 
turns between the two players. 
<p>
The game is trivial from a game-theory point of view. The optimal mixed strategy is to choose an action uniformly at random 
(one-third probability of each). This will ensure a break-even result in the long run, regardless of how strong (or how weak!) the opponent is. 
<p>
However, against predictable opponents, a player can attempt to detect patterns in the opponent's play, and exploit those weaknesses
with an appropriate counter-strategy. 
<p>
A RubyShamBo tournament pits ruby programs, each implimenting different strategies, against each other. RubyShamBo was inspired by the 
<a href=http://www.cs.ualberta.ca/~darse/rsbpc.html >International RoShamBo Programmming Competition</a>. Much of this 
summary has been shamelessly stolen from the <a href=http://www.cs.ualberta.ca/~darse/rsbpc1.html>original 
announcement of that competition</a>. After each turn, the winning bot recieves 1 point, and the losing bot losses 1 point. If the game ends in 
a tie, no points are awarded. At the end of the tournament, the bots are ranked by the total number of points they have gained in all matches
against all bots.
<p>
Some of the 
programs in a RubyShamBo tournament will use sub-optimal strategies, and will be vulnerable to a perceptive and adaptive opponent. Of course, 
there is always a risk associated with such a prediction, as that player may be attempting to trap its opponent by anticipating the 
reaction to previous plays. 
<p>
The most successful programs will recognize a variety of patterns and relationships, and use that information to gain an advantage 
over each opponent, without being susceptible to similar attacks. 
<p>
At this stage there are no firm plans to host a public RubyShamBo tournament, but if you'd like to enter (or even help organise) such an
event, please send an email to jonno at jamtronix dot com expressing your interest.

<h3>running a tournament</h3>

First, you will need to have ruby installed. Windows users should get the latest version of the <a href=http://rubyforge.org/frs/?group_id=167>One-Click Ruby Installer</a>.
Users of other platforms can consult the <a href=http://www.ruby-lang.org/en/downloads/>Ruby downloads site</a> for a suitable version.
<p>
Once ruby is set up on your machine, <a href=http://rubyforge.org/frs/?group_id=4133>download the zip file containing latest RubyShamBo release</a> and
unzip to somewhere on to your local drive. The zip file will include the following folders :
<ul>
	<li>lib/ which contains 'rubyshambo.rb' which has all of the code for hosting a tournament
	<li>bots/ which has a number of files each containing the code for a single bot
	<li>test/ which contains 'test_tournament.rb', which will set up and run a tournament that pits every bot defined in the bots/ 
	directory against each other, and then print out the results.
</ul>
At the command line, cd to the test/ directory and type <i>ruby test_tournament.rb</i>. After about a second, the tournament results will
be printed to the screen like so:
<pre>
C:\src\rubyshambo\test>ruby test_tournament.rb
Wagner 1            : 6027
YoungGun 1          : 2925
CivilWarBuff 1      : 2596
Bot 1               : 1
OldGeneral 1        : -442
SensitiveLefty 1    : -586
SportsFan 1         : -2608
BrokenRecord 1      : -7913
</pre>
This shows the most successful bot in this tournament is 'Wagner 1' which won 6027 more turns than it lost. The least succesful bot was 'BrokenRecord 1' which lost
7913 more turns than it won.

<h3>creating your own bot</h3>
Creating a new RubyShamBo bot requires some knowledge of programming in ruby. You should at least be able to complete the introductory browser-based tutorial at 
the <a href=http://tryruby.hobix.com/>Try Ruby!</a> website.

The rules that must be followed by each bot competing in a RubyShamBo tournament are:
<ol>
<li>The bot must be a subclass of Bot (which is defined in rubyshambo.rb)
<li>The bot must impliment a method called 'get_throw' which takes a single parameter, which is a MatchHistory object (also defined in rubyshambo.rb), and returns
a symbol, which must be either :rock, :paper, or :scissors.
<li>If you define an 'initialize' method for the bot, it must not have any mandatory parameters (else the tournament framework can't autoload it)
</ol>
<p>
The MatchHistory object that gets passed in to each call contains the following fields:
<ul>
<li> <i>turns_played</i> will be 0 on the first turn against a new opponent
<li> <i>my_throws</i> is an array recording every throw you've made in the current match. Since ruby arrays are zero-indexed, match_history.my_throws[0] will have  the
throw you selected on the first turn in this match, match_history.my_throws[6] will have the move you made on the seventh turn, and match_history.my_throws.last will
have the last throw you made.
<li> <i>opponent_throws</i> is an array recording every throw the current opponent has made in this match. The throw the opponent made last turn is in 
match_history.opponent_throws.last
<li> <i>my_score</i> is the score for the current match. The opponents score for the current match will always be the inverse of your score. i.e. if match_history.my_score is 5,
that means you have won 5 more turns than you have lost in the current match (and thus the opponent's score must be -5).
</ul>

There are some helper methods and arrays you can use:
<ul>
<li> <i>VALID_THROWS</i>  is an array containing  [:paper,:scissors,:rock], i.e. VALID_THROWS[1] will return :scissors
<li> <i>WINNING_THROW</i> is a hash where the keys are possible throws and the values are the throw that beats the key. i.e. WINNING_THROW[:rock] returns :paper.
<li> <i>Turn.random_throw</i> will return a random throw.
</ul>
<h3>an example bot</h3>
Here is the bot called 'Old General' (found in bots/oldgeneral.rb). He's called that because he's always planning to fight the last war. On the first turn he throws at random. 
On every subsequent turn, he throws whatever would have won the last turn
<pre>
class OldGeneral&lt;Bot
	def get_throw(match_history)
		if (match_history.turns_played==0) then
			return Turn.random_throw
		end
		return WINNING_THROW[match_history.opponent_throws.last]
	end	
end
</pre>

<h3>useful links</h3>
<ul>
<li><a href=http://rubyshambo.rubyforge.org/doc>RubyShamBo RDocs</a>
<li><a href=http://rubyforge.org/projects/rubyshambo/>RubyShamBo project page on RubyForge</a>
<li><a href=http://rubyforge.org/frs/?group_id=4133>Download RubyShamBo</a>
</ul>
]]>
        
    </content>
</entry>
<entry>
    <title>dskexplorer.rb</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/06/dskexplorerrb.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=93" title="dskexplorer.rb" />
    <id>tag:blog.jamtronix.com,2007://1.93</id>
    
    <published>2007-06-24T04:41:14Z</published>
    <updated>2007-06-24T04:41:14Z</updated>
    
    <summary>dskexplorer.rb is a browser based DSK archive exploring tool. It can explore both local disk and remote web archives. It is part of the dsktool.rb package. You will need to have ruby installed. To install dskexplorer.rb, you just need to...</summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[dskexplorer.rb is a browser based DSK archive exploring tool. It can explore both local disk and remote web archives. It is part of the <a href="http://dsktool.rubyforge.org/">dsktool.rb</a> package. You will need to have <a href="http://www.ruby-lang.org/en/downloads/">ruby</a> installed. <p>To install dskexplorer.rb, you just need to install the dsktool.rb rubygem. Depending on your OS, that is done by typing either <em>gem install dsktool</em> or <em>sudo gem install dsktool</em> at a command prompt. </p><p>To use, run dskexplorer.rb and specify the location of the DSK archive to explore using the '-r' switch. <br />For example <em>dskexplorer.rb -r http://www.apple2.org.za/mirrors/</em> <br />Then open a browser, and navigate to <a href="http://localhost:6502/">http://localhost:6502/</a> </p><p><a href="http://www.flickr.com/photos/jonnosan/606885843/"><img height="393" src="http://farm2.static.flickr.com/1339/606885843_071a45a845_o.png" width="491" border="0" /></a> </p><p><a href="http://www.flickr.com/photos/jonnosan/607043704/"><img height="415" src="http://farm2.static.flickr.com/1062/607043704_66da1f862a_o.png" width="572" border="0" /></a> </p><p><a href="http://www.flickr.com/photos/jonnosan/606885613/"><img height="455" src="http://farm2.static.flickr.com/1026/606885613_0d1f30b620_o.png" width="640" border="0" /></a>&nbsp;</p>]]>
        
    </content>
</entry>
<entry>
    <title>using dsktool.rb on ubuntu</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/06/using_dsktoolrb_on_ubuntu.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=92" title="using dsktool.rb on ubuntu" />
    <id>tag:blog.jamtronix.com,2007://1.92</id>
    
    <published>2007-06-17T01:44:02Z</published>
    <updated>2007-06-17T01:49:23Z</updated>
    
    <summary><![CDATA[first&nbsp;install the dsktool gem with sudo gem install dsktoolnow try to run dsktool.rb with dsktool.rb -vIf you get an error message like &quot;-bash: dsktool.rb: command not found&quot; then you will need to put the gem bin directory into your path:open...]]></summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
            <category term="apple ii" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p>first&nbsp;install the dsktool gem with <em><strong>sudo gem install dsktool</strong></em></p><p>now try to run dsktool.rb with <em><strong>dsktool.rb -v</strong></em></p><p>If you get an error message like &quot;-bash: dsktool.rb: command not found&quot; then you will need to put the gem bin directory into your path:<br />open up ~/.bashrc&nbsp; in the editor of your choice, and at the bottom of the file add&nbsp;<br /><em><strong>export PATH=$PATH:/var/lib/gems/1.8/bin</strong><br /></em>Then save .bashrc, and restart your terminal window.<br /></p><p>Now try to view&nbsp;the catalog of an online&nbsp;dsk file:</p><p><em><strong>dsktool.rb http://www.apple2.org.za/mirrors/ftp.apple.asimov.net/images/unsorted/White_Disks/white_25a.dsk.gz -c</strong></em></p><p>Your should get back a listing like:</p><p>*T 049 BASICS OF KRACKING 2<br />*A 00A HELLO<br />*T 030 KRACKING CYCLOD2<br />*T 049 BASICS OF KRACKING 3<br />*T 042 BASICS OF KRACKING 4<br />*B 01B DEMUFFIN PLUS<br />*A 003 LIST TEXT FILES: INSTRUCTIONS<br />*A 003 LIST TEXT FILES<br />*T 021 KRACKING WAY OUT<br />*T 047 KRACKING CYCLOD<br />*T 037 BASICS OF KRACKING 1<br />*T 01D KRACKING WAY OUT2</p><p>Now you can read one of the individual files, like this:<br /><em><strong>dsktool.rb http://www.apple2.org.za/mirrors/ftp.apple.asimov.net/images/unsorted/White_Disks/white_25a.dsk.gz -e &quot;BASICS OF KRACKING 1&quot; | less<br /></strong></em>to view one of the classic introductions to removing copy-protection from Apple II disks by <a href="http://ascii.textfiles.com/archives/000081.html">Krackowicz</a> </p><p>More complete docs can be found at <a href="http://dsktool.rubyforge.org/">http://dsktool.rubyforge.org/</a></p>]]>
        
    </content>
</entry>
<entry>
    <title>dsktool.rb</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/06/dsktoolrb.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=91" title="dsktool.rb" />
    <id>tag:blog.jamtronix.com,2007://1.91</id>
    
    <published>2007-06-16T05:29:33Z</published>
    <updated>2007-06-17T01:49:23Z</updated>
    
    <summary><![CDATA[dsktool.rbdsktool.rb is a command line tool + libraries (all in&nbsp;ruby)&nbsp;for manipulating DSK format images used by Apple 2 emulators. Currently only DOS 3.3 format is supported. Usage-----dsktool.rb [switches] -c | --catalog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display catalog-l | --list FILENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; monitor style listing (disassembles...]]></summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
            <category term="apple ii" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<h2><a href="http://dsktool.rubyforge.org/">dsktool.rb</a></h2>dsktool.rb is a command line tool + libraries (all in&nbsp;ruby)&nbsp;for manipulating DSK format images used by Apple 2 emulators. Currently only DOS 3.3 format is supported. <br /><br />Usage<br />-----<br />dsktool.rb [switches] <br /><br />-c | --catalog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display catalog<br />-l | --list FILENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; monitor style listing (disassembles 65C02 opcodes)<br />-e | --extract FILENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extract file by name (either to stdout,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or file specified by --output)<br />-h | --help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display this message<br />-o | --output FILENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; specify name to save extracted file as<br />-x | --explode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extract all files<br />-v | --version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; show version number<br /><br />examples:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsktool.rb -c DOS3MASTR.dsk<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsktool.rb -l FID DOS3MASTR.dsk<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsktool.rb -l fid -o fid.asm DOS3MASTR.dsk<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsktool.rb -e &quot;COLOR DEMOSOFT&quot; DOS3MASTR.dsk<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsktool.rb -e HELLO -o HELLO.bas DOS3MASTR.dsk<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsktool.rb -x DOS3MASTR.dsk<br /><ul><li><a href="http://dsktool.rubyforge.org/doc">RDoc Documentation</a> </li><li><a href="http://rubyforge.org/pm/task.php?group_id=3844&amp;group_project_id=6130">Task List</a> </li><li><a href="http://rubyforge.org/projects/dsktool">RubyForge project page</a> </li><li><a href="http://rubyforge.org/frs/?group_id=3844">Download</a> </li></ul><p>&nbsp;</p>]]>
        
    </content>
</entry>
<entry>
    <title>Apple //e Soft Switch, Status, and other I/O locations</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/06/apple_e_soft_switch_status_and.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=90" title="Apple //e Soft Switch, Status, and other I/O locations" />
    <id>tag:blog.jamtronix.com,2007://1.90</id>
    
    <published>2007-06-11T01:00:04Z</published>
    <updated>2007-06-17T01:49:23Z</updated>
    
    <summary><![CDATA[MEMORY MANAGEMENT SOFT SWITCHES $C000W80STOREOFFAllow page2 to switch video page1 page2$C001W80STOREONAllow page2 to switch main &amp; aux video memory$C002WRAMRDOFFRead enable main memory from $0200-$BFFF$C003WRAMDRON Read enable aux memory from $0200-$BFFF$C004WRAMWRTOFFWrite enable main memory from $0200-$BFFF$C005WRAMWRTONWrite enable aux memory from $0200-$BFFF$C006WINTCXROMOFFEnable...]]></summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
            <category term="apple ii" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p><strong>MEMORY MANAGEMENT SOFT SWITCHES </strong></p><p><table border="0"><tbody><tr><td>$C000</td><td>W</td><td>80STOREOFF</td><td>Allow page2 to switch video page1 page2</td></tr><tr><td>$C001</td><td>W</td><td>80STOREON</td><td>Allow page2 to switch main &amp; aux video memory</td></tr><tr><td>$C002</td><td>W</td><td>RAMRDOFF</td><td>Read enable main memory from $0200-$BFFF</td></tr><tr><td>$C003</td><td>W</td><td>RAMDRON </td><td>Read enable aux memory from $0200-$BFFF</td></tr><tr><td>$C004</td><td>W</td><td>RAMWRTOFF</td><td>Write enable main memory from $0200-$BFFF</td></tr><tr><td>$C005</td><td>W</td><td>RAMWRTON</td><td>Write enable aux memory from $0200-$BFFF</td></tr><tr><td>$C006</td><td>W</td><td>INTCXROMOFF</td><td>Enable slot ROM from $C100-$CFFF</td></tr><tr><td>$C007</td><td>W</td><td>INTCXROMON</td><td>Enable main ROM from $C100-$CFFF</td></tr><tr><td>$C008</td><td>W</td><td>ALZTPOFF</td><td>Enable main memory from $0000-$01FF &amp; avl BSR</td></tr><tr><td>$C009</td><td>W</td><td>ALTZPON </td><td>Enable aux memory from $0000-$01FF &amp; avl BSR</td></tr><tr><td>$C00A</td><td>W</td><td>SLOTC3ROMOFF</td><td>Enable main ROM from $C300-$C3FF</td></tr><tr><td>$C00B</td><td>W</td><td>SLOTC3ROMON</td><td>Enable slot ROM from $C300-$C3FF</td></tr></tbody></table></p><p><strong>VIDEO SOFT SWITCHES </strong></p><p><table border="0"><tbody><tr><td>$C00C</td><td>W</td><td>80COLOFF</td><td>Turn off 80 column display</td></tr><tr><td>$C00D</td><td>W</td><td>80COLON </td><td>Turn on 80 column display</td></tr><tr><td>$C00E</td><td>W</td><td>ALTCHARSETOFF</td><td>Turn off alternate characters</td></tr><tr><td>$C00F</td><td>W</td><td>ALTCHARSETON</td><td>Turn on alternate characters</td></tr><tr><td>$C050</td><td>R/W</td><td>TEXTOFF </td><td>Select graphics mode</td></tr><tr><td>$C051</td><td>R/W</td><td>TEXTON</td><td>Select text mode</td></tr><tr><td>$C052</td><td>R/W</td><td>MIXEDOFF</td><td>Use full screen for graphics</td></tr><tr><td>$C053</td><td>R/W</td><td>MIXEDON </td><td>Use graphics with 4 lines of text</td></tr><tr><td>$C054</td><td>R/W</td><td>PAGE2OFF</td><td>Select panel display (or main video memory)</td></tr><tr><td>$C055</td><td>R/W</td><td>PAGE2ON </td><td>Select page2 display (or aux video memory)</td></tr><tr><td>$C056</td><td>R/W</td><td>HIRESOFF</td><td>Select low resolution graphics</td></tr><tr><td>$C057</td><td>R/W</td><td>HIRESON </td><td>Select high resolution graphics</td></tr></tbody></table></p><p><strong>SOFT SWITCH STATUS FLAGS </strong></p><p><table border="0"><tbody><tr><td>$C010</td><td>R7</td><td>AKD</td><td>1=key pressed 0=keys free (clears strobe)</td></tr><tr><td>$C011</td><td>R7</td><td>BSRBANK2</td><td>1=bank2 available 0=bank1 available</td></tr><tr><td>$C012</td><td>R7</td><td>BSRREADRAM</td><td>1=BSR active for read 0=$D000-$FFFF active</td></tr><tr><td>$C013</td><td>R7</td><td>RAMRD</td><td>0=main $0200-$BFFF active reads 1=aux active</td></tr><tr><td>$C014</td><td>R7</td><td>RAMWRT</td><td>0=main $0200-$BFFF active writes 1=aux writes</td></tr><tr><td>$C015</td><td>R7</td><td>INTCXROM</td><td>1=main $C100-$CFFF ROM active 0=slot active</td></tr><tr><td>$C016</td><td>R7</td><td>ALTZP</td><td>1=aux $0000-$1FF+auxBSR 0=main available</td></tr><tr><td>$C017</td><td>R7</td><td>SLOTC3ROM</td><td>1=slot $C3 ROM active 0=main $C3 ROM active</td></tr><tr><td>$C018</td><td>R7</td><td>80STORE </td><td>1=page2 switches main/aux 0=page2 video</td></tr><tr><td>$C019</td><td>R7</td><td>VERTBLANK</td><td>1=vertical retrace on 0=vertical retrace off</td></tr><tr><td>$C01A</td><td>R7</td><td>TEXT</td><td>1=text mode is active 0=graphics mode active</td></tr><tr><td>$C01B</td><td>R7</td><td>MIXED</td><td>1=mixed graphics &amp; text </td></tr><tr><td>$C01C</td><td>R7</td><td>PAGE2</td><td>1=video page2 selected or aux</td></tr><tr><td>$C01D</td><td>R7</td><td>HIRES</td><td>1=high resolution graphics 0=low resolution</td></tr><tr><td>$C01E</td><td>R7</td><td>ALTCHARSET</td><td>1=alt character set on 0=alt char set off</td></tr><tr><td>$C01F</td><td>R7</td><td>80COL</td><td>1=80 col display on 0=80 col display off</td></tr></tbody></table></p>]]>
        
    </content>
</entry>
<entry>
    <title>Apple // Extended Debugging Monitor</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/05/apple_extended_debugging_monit.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=89" title="Apple // Extended Debugging Monitor" />
    <id>tag:blog.jamtronix.com,2007://1.89</id>
    
    <published>2007-05-24T12:18:13Z</published>
    <updated>2007-07-16T09:21:12Z</updated>
    
    <summary><![CDATA[Download the EDM ROM&nbsp;file (16k)&nbsp;This ROM was created by the same Apple engineers who created the //e and //c firmware. It was passed on to me with the following notes:The Extended Debugging Monitor (EDM) is a superset of the standard...]]></summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p><a href="http://jamtronix.com/files/IIEDBV6.BIN">Download the EDM ROM&nbsp;file (16k)</a>&nbsp;</p><p>This ROM was created by the same Apple engineers who created the //e and //c firmware. It was passed on to me with the following notes:</p><p><em>The Extended Debugging Monitor (EDM) is a superset of the standard Apple //e monitor with which can access all of the 128K of main and auxiliary memory.&nbsp; It is made available on a set of modified Apple //e ROMs.&nbsp;<br /></em></p><p><em>The standard ROM monitor was designed to really only support 48K of memory in an Apple //.&nbsp; With the addition of both the language card and now the extended 80-column card, it is now necessary to have a new monitor that can access all of the memory available in an Apple //.&nbsp;<br /></em></p><p><em>In addition to providing access to the full 128K //e memory, the monitor features a &quot;RESUME&quot; command to resume operation in a non-standard memory environment and an improved memory location display format.&nbsp;<br /></em></p><p><em>In implementing EDM, the diagnostics and cassette support have been removed and the debugging monitor extensively revised.&nbsp; However, as the remaining firmware remains untouched, applications which run on the revised //e ROMs should run on the EDM ROM.&nbsp;<br /></em></p><p><em><strong>Description:</strong>&nbsp;<br /></em></p><p><em>The EDM is a superset of the old monitor.&nbsp; Commands in the previous monitor format produce very similar results.&nbsp; Commands like SEARCH and ASSEMBLE and the as ASCII input modes added in the //e ROM revision are still available.&nbsp; The address xxxx refers to memory location xxxx under the current memory mapping configuration.&nbsp; If the memory configuration is changed by hitting soft switches like RDCARDRAM, ALTZP, xxxx may change its meaning accordingly.&nbsp; This is still true in the EDM, although hitting memory softswitches from the monitor is now neither necessary nor recommended since more direct techniques for getting to the various parts of memory are provided.&nbsp;<br /></em></p><p><em>The internal-ROM/slot-ROM softswitch has no effect in the EDM.&nbsp; Examination of the internal ROM is not permitted from the EDM since the internal ROM contains routines internal to the firmware and need not be directly accessed by the user.&nbsp; This should not be a major handicap.&nbsp;<br /></em></p><p><em>Using the old commands results in some differences.&nbsp; Memory display is 16 bytes per row when the screen width allows it, and both the hexadecimal and ASCII values are shown.&nbsp; In ASCII display, the high bit is ignored and unprintable characters are replaced by &quot;.&quot; so output can be sent to printers.&nbsp; Because memory locations will be read twice during the display, some soft switches affected by multiple accesses may be affected differently by the new monitor.&nbsp;<br /></em></p><p><em>EDM has a 65C02 disassembler and mini-assembler, but EDM itself does not use any 65C02 instructions and hence may run on machines with either an NMOS 6502 or a 65C02.&nbsp;<br /></em></p><p><em>A new address syntax is used to specify all memory.&nbsp; Addresses are represented by b/xxxx.&nbsp; b, a bank number, is either 0 or 1.&nbsp; (For b &gt; 1, even values are treated as 0, odd values as 1.)&nbsp; Bank 0 is the RAM memory on the main logic board and bank 1 is the AUX memory on the 80 column card.&nbsp; This convention applies for main or AUX Memory in the ranges $0000-$BFFF and SE000-$FFFF.&nbsp; There is a different convention for the bank switched memory and I/O areas ($C000-$DFFF).&nbsp;<br /></em></p><p><em><strong>ADDRESS SYNTAX:</strong>&nbsp;<br /></em></p><p><em>&nbsp;&nbsp;&nbsp; 0/nnnn = address nnnn in MAIN memory</em></p><p><em>&nbsp;&nbsp;&nbsp; 1/nnnn = address nnnn in AUX memory&nbsp;<br /></em></p><p><em>where nnnn is in the range $0000 - $BFFF or $E000 - $FFFF&nbsp;<br /></em></p><p><em>There is no system RAM in the address range $C000 to $CFFF.&nbsp; ROM residing there could be accessed by $Cxxx.&nbsp; Taking advantage of this opportunity, a different meaning is assigned to b/Cxxx.&nbsp; b/Cxxx refers to the main/aux language card bank 1 address $Dxxx, while b/Dxxx refers to the main/aux language card bank 2 address $Dxxx.&nbsp; Using these notations we can refer to all RAM and all ROM except the internal ROM.&nbsp; This notation can be used in commands like EXAMINE, STORE, MOVE, VERIFY, SEARCH, DISASSEMBLE and even ASSEMBLE.&nbsp; The only exception is the bank is ignored in the GO command.&nbsp;<br /></em></p><p><em><strong>ADDRESS SYNTAX:</strong>&nbsp;<br /></em></p><p><em>&nbsp;&nbsp;&nbsp; 0/Cnnn = address SDnnn in MAIN language card bank 1</em></p><p><em>&nbsp;&nbsp;&nbsp; 0/Dnnn = address $Dnnn in MAIN language card bank 2</em></p><p><em>&nbsp;&nbsp;&nbsp; 1/Cnnn = address $Dnnn in AUX&nbsp; language card bank 1</em></p><p><em>&nbsp;&nbsp;&nbsp; 1/Dnnn = address $Dnnn in AUX&nbsp; language card bank 2&nbsp;<br /></em></p><p><em>When an address range is specified as in {adrs1}.{adrs2}, the second address should not have a bank number.&nbsp; If one is present, it is ignored.&nbsp; In the mini-assembler, a bank number may be specified in the beginning address, but you cannot put a bank number in the middle of an instruction.&nbsp; BNE 1/300 is treated as an error.&nbsp;<br /></em></p><p><em>The GO command in EDM docs not use a bank number in the address.&nbsp; The syntax is exactly the same as in the standard monitor.&nbsp; If your program is running in a non-standard memory configuration, you cannot simply use the GO command to resume execution.&nbsp; In such a case, you must set up the correct memory state first.&nbsp; Whenever a BRK or an interrupt occurs, EDM handles it just as the //e revision ROM's handle it, except that EDM will correctly handle a BRK in the alternate Zero Page.&nbsp; For an interrupt or BRK, the firmware sets the machine back to the standard memory configuration and encodes the memory state in a byte located at $64.&nbsp; The GO command leaves the return address on the stack, which means that an RTS instruction will cause a return to the monitor.&nbsp;<br /></em></p><p><em>In order to allow the correct resumption of execution after an interrupt or BRK, EDM has added a RESUME command.&nbsp; The syntax is nnnn^R (^R = control-R), where nnnn is the address at which to resume execution.&nbsp; Note, this address does not use a bank number.&nbsp; The RESUME command will use the memory state value stored in location $44 to setup the correct memory state before beginning execution.&nbsp; You can modify this value in order to begin execution in any memory configuration.&nbsp; The RESUME command leaves nothing on the stack and is, therefore, a true resume operation.&nbsp; You can think of a BRK-RESUME combination as an interrupt that occurs at a specified point in your program that allows you to examine and modify memory during the &quot;interrupt&quot;.&nbsp;<br /></em></p><p><em>For both the GO and the RESUME commands if nnnn is not specified, the address stored at locations $3A and $3B is used.&nbsp;<br /></em></p><p><em>The memory state value at location $44 is displayed as register M in the register display (using the ^E command).&nbsp; The interpretation of the bits in register M is shown below:&nbsp;<br /></em></p><p><em>&nbsp;&nbsp;&nbsp; bit 7 = 1 if auxiliary zero-page/stack switched in</em></p><p><em>&nbsp;&nbsp;&nbsp; bit 6 = 1 if 80STORE and PAGE2 both on</em></p><p><em>&nbsp;&nbsp;&nbsp; bit 5 = 1 if auxiliary RAM switched in for reading</em></p><p><em>&nbsp;&nbsp;&nbsp; bit 4 = 1 if auxiliary RAM switched in for writing</em></p><p><em>&nbsp;&nbsp;&nbsp; bit 3 = 1 if bank-switched RAM being read</em></p><p><em>&nbsp;&nbsp;&nbsp; bit 2 = 1 if bank-switched $D000 page 1 switched in</em></p><p><em>&nbsp;&nbsp;&nbsp; bit 1 = 1 if bank-switched $D000 page 2 switched in</em></p><p><em>&nbsp;&nbsp;&nbsp; bit 0 = 1 if internal CX ROM switched in&nbsp;<br /></em></p><p><em>In the standard monitor location $40-$41 is set to $45, providing a short-cut for modifying the pseudo-accumulator at location $45.&nbsp; EDM now sets this location to $44 so that modifications of this type can begin with register M.&nbsp;<br /></em></p><p><em>If you want to run any program using the alternate zero page, and if you plan to use either interrupt or BRK, you must follow the stack pointer convention used by the firmware.&nbsp; Normally, the top of the stack when a BRK occurs is located at the &quot;stack-register S&quot; + 5.&nbsp; If a BRK occurs when the alternate zero-page/stack is used, the value in &quot;stack-register S&quot; is invalid.&nbsp; To find the top-of-stack of the alternate stack, look at location $101 in the alternate stack and add 1 to that value.&nbsp;<br /></em></p><p><em>Since diagnostics have been removed, SOLID-APPLE CONTROL RESET will not bring up the diagnostics.&nbsp; Instead, this will cause a direct jump into EDM without trashing any memory.&nbsp; This can be very useful for debugging.&nbsp;<br /></em></p><p><em><strong>Details on difference between EDM and the //e revision ROM:</strong>&nbsp;<br /></em></p><p><em>EDM uses some extra memory locations.&nbsp; They are located in slot 3 screen holes and slot 0 screen holes.&nbsp; Some of these are temporary locations already used by the firmware, so they should not conflict with any program.&nbsp; The slot 3 screen holes used are:&nbsp;<br /></em></p><p><em>&nbsp;&nbsp;&nbsp; $6FB - contains the bank number (normally used by PASCAL only)</em></p><p><em>&nbsp;&nbsp;&nbsp; $7FB - contains the bank number during MOVE/VERIFY</em></p><p><em>&nbsp;&nbsp;&nbsp; $67B - normally used by video firmware</em></p><p><em>&nbsp;&nbsp;&nbsp; $77B - normally used by PASCAL or video firmware&nbsp;<br /></em></p><p><em>The slot 0 screen holes are:&nbsp;<br /></em></p><p><em>&nbsp;&nbsp;&nbsp; $6F8, $778 - modified by EDM if alternative zero page is accessed.&nbsp;<br /></em></p><p><em>Entry points $FECD and $FEFD for cassette I/O are now dummy routines&nbsp;<br /></em></p><p><em>Entry points VERIFY ($FE36) and LT ($FE5E) no longer exist.&nbsp;<br /></em></p><p><em>Entry points INSTDSP ($F8D0) and LIST ($FE5E) still disassemble 1 or 20 instructions, but unless the bank register location $6FB is set up properly, you may disassemble the wrong bank.&nbsp; Valid bank values are $80 (no bank), $00 (bank 0) and $01 (bank 1).&nbsp;<br /></em></p><p><em>In the old monitor, commands of the format xxxx&lt;yyyy.zzzzC would copy locations $3E-3F to $44-45. This does not seem to serve any useful purpose and destroys machine state value in $44-45, therefore EDH no longer does this.&nbsp;<br /></em></p><p><em>Because EDM recognizes 65C02 opcodes, you must be careful to ignore any 65C02 instructions that may be displayed by the disassembler when the code does not actually contain these instructions.&nbsp;<br /></em></p><p><em>The ID byte at $FBC0 contains $E1 to identity the EDM ROM.&nbsp;<br /></em></p><p><em>EDM is identified at boot time by the display of &quot;Apple ][DB&quot;, where the &quot;DB&quot; stands for &quot;Debugging&quot;.</em></p><p>&nbsp;</p>]]>
        
    </content>
</entry>
<entry>
    <title>Apple //e links</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/04/apple_e_links.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=87" title="Apple //e links" />
    <id>tag:blog.jamtronix.com,2007://1.87</id>
    
    <published>2007-04-22T10:57:26Z</published>
    <updated>2007-09-09T09:41:34Z</updated>
    
    <summary><![CDATA[Apple //e reference manual&nbsp;(PDF - from 1000bit)Beneath Apple DOS&nbsp;( PDF - from 1000bit)Apple II : The DOS manual&nbsp;(PDF - from the Nitrozone Five apple // collection)Apple II Monitors Peeled&nbsp;(PDF - from the Nitrozone Five apple // collection)The Computist Project&nbsp;ADTPro&nbsp;- Transfers...]]></summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
            <category term="apple ii" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p><a href="http://www.1000bit.it/support/manuali/apple/appleiieref.pdf">Apple //e reference manual</a>&nbsp;(PDF - from <a href="http://www.1000bit.net/">1000bit</a>)</p><p><a href="http://www.1000bit.it/support/manuali/apple/bad.pdf">Beneath Apple DOS</a>&nbsp;( PDF - from <a href="http://www.1000bit.net/">1000bit</a>)</p><p><a href="http://www.turbo-2.com/apple/pdf/a2dos.pdf">Apple II : The DOS manual</a>&nbsp;(PDF - from the <a href="http://www.turbo-2.com/apple/">Nitrozone Five apple // collection</a>)</p><p><a href="http://www.turbo-2.com/apple/pdf/a2mp.pdf">Apple II Monitors Peeled</a>&nbsp;(PDF - from the <a href="http://www.turbo-2.com/apple/">Nitrozone Five apple // collection</a>)</p><p><a href="http://computist-project.net/">The Computist Project</a>&nbsp;</p><p><a href="http://adtpro.sourceforge.net/">ADTPro</a>&nbsp;- Transfers images between modern PC and Apple II</p><p><a href="http://homepage.mac.com/bobsc/aal/">Apple Assembly Line</a></p><p><a href="http://web.mac.com/tikimac/iWeb/Roby%20Sherman/Adventures%20in%20Silicon/7234F9E8-0EEE-4FB7-A869-3A7DE963BF73.html">Zero Page variables</a>&nbsp;</p><p><a href="http://www.textfiles.com/100/krckwczt.app">KRAKOWICZ'S KRACKING KORNER</a></p><p><a href="http://groups.google.com.au/group/comp.sys.apple2/topics">comp.sys.apple2&nbsp;newsgroup</a><br /></p><p><a href="http://www.umich.edu/~archive/apple2/technotes/">Apple 2 Technical Notes</a>&nbsp;</p><p><a href="http://linux.cis.monroeccc.edu/~paulrsm/6502/PDOS8TRM.HTM">ProDOS 8 Technical Reference Manual</a>&nbsp;</p>]]>
        
    </content>
</entry>
<entry>
    <title>AnonySMS Atom feed</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/04/anonysms_atom_feed.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=86" title="AnonySMS Atom feed" />
    <id>tag:blog.jamtronix.com,2007://1.86</id>
    
    <published>2007-04-12T11:15:43Z</published>
    <updated>2007-06-17T01:49:23Z</updated>
    
    <summary>The AnonySMS page now has an Atom feed. And it validates....</summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p>The <a href="http://anonysms.jamtronix.com/">AnonySMS</a> page now has an <a href="http://anonysms.jamtronix.com/anonysms.xml">Atom feed</a>. And <a href="http://feedvalidator.org/check.cgi?url=http%3A%2F%2Fanonysms.jamtronix.com%2Fanonysms.xml">it validates</a>.</p>]]>
        
    </content>
</entry>
<entry>
    <title>links 2007-04-11</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/04/links_20070411.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=85" title="links 2007-04-11" />
    <id>tag:blog.jamtronix.com,2007://1.85</id>
    
    <published>2007-04-10T21:34:45Z</published>
    <updated>2007-06-17T01:49:23Z</updated>
    
    <summary><![CDATA[Worse Than Failure: Soft Coding&nbsp;- the definition of Soft Coding: the practice of removing &ldquo;things that should be in source code&rdquo; from source code and placing them in some external resource.Bambrick's 8th Rule of Code Reuse&nbsp;- It's far easier and...]]></summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p>Worse Than Failure: <a href="http://worsethanfailure.com/Articles/Soft_Coding.aspx">Soft Coding</a>&nbsp;- <em>the definition of Soft Coding: the practice of removing &ldquo;things that should be in source code&rdquo; from source code and placing them in some external resource.</em></p><p><a href="http://www.secretgeek.net/open_code_sharing.asp">Bambrick's 8th Rule of Code Reuse</a>&nbsp;- <em>It's far easier and much less trouble to find and use a bug-ridden, poorly implemented snippet of code written by a 13 year old blogger on the other side of the world, than it is to find and use the equivalent piece of code, written by your team leader on the other side of a cubicle partition.</em></p><p><a href="http://secretgeek.net/howtobeaprogrammer.asp">How to be a programmer</a></p>]]>
        
    </content>
</entry>
<entry>
    <title>AnonySMS</title>
    <link rel="alternate" type="text/html" href="http://blog.jamtronix.com/2007/04/anonysms.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://jamtronix.com/blog-mt/mt-atom.cgi/weblog/blog_id=1/entry_id=84" title="AnonySMS" />
    <id>tag:blog.jamtronix.com,2007://1.84</id>
    
    <published>2007-04-09T11:28:18Z</published>
    <updated>2007-06-17T01:49:24Z</updated>
    
    <summary>AnonySMS is a SMS to web gateway with a publicly listed (and periodically changed) phone number. If you&apos;ve ever been tempted to sign up for a service that insisted on capturing a valid mobile number, but you don&apos;t want to...</summary>
    <author>
        <name>Jonno Downes</name>
        <uri>http://blog.jamtronix.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://blog.jamtronix.com/">
        <![CDATA[<p><a href="http://anonysms.jamtronix.com">AnonySMS</a> is a SMS to web gateway with a publicly listed (and periodically changed) phone number. If you've ever been tempted to sign up for a service that insisted on capturing a valid mobile number, but you don't want to be getting SMS spam forever, then use <a href="http://anonysms.jamtronix.com">AnonySMS</a> instead.</p><p>Inspired by <a href="http://www.mailinator.com/">Mailinator</a> and a long weekend. Powered by <a href="http://www.gnokii.org/">gnokii.</a></p><p>&nbsp;</p>]]>
        
    </content>
</entry>

</feed> 

