<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8850919192497134094</id><updated>2012-02-16T02:46:29.383-08:00</updated><category term='Python'/><category term='COMFY'/><category term='Lisp Machine'/><category term='github'/><category term='ANSI-Common-Lisp'/><category term='assembler'/><category term='Regression Test'/><category term='Lisp'/><category term='Keyboard'/><category term='AppleShare'/><category term='RT'/><category term='System 7.6.1'/><category term='Multi-threading'/><category term='git'/><category term='Symbolics'/><category term='Symbolics Keyboard'/><category term='Boston Lisp'/><category term='Mac OS X'/><category term='ITS'/><category term='System 7'/><category term='COMFY assembler'/><category term='Common Lisp'/><category term='PIC0 assembler'/><category term='heathkit'/><category term='PICkit 2'/><category term='MacIvory'/><category term='Old Macintosh'/><category term='linux'/><category term='ADB'/><category term='Macintosh'/><category term='keyboard adapter'/><category term='Microchip'/><category term='Genera'/><category term='SPL assembler'/><category term='Apple II'/><category term='keyboard converter'/><category term='ADB adapter'/><category term='Red book tone routine'/><category term='6502'/><category term='PIC'/><category term='Future-Common-Lisp'/><category term='TENEX'/><category term='Fortran'/><category term='Boston Lisp Meeting'/><category term='System 7.6'/><category term='chaosnet'/><category term='TeX'/><category term='Symbolics 3600'/><category term='TOPS-20'/><category term='COMFY-6502'/><category term='PDP-10'/><title type='text'>Brasstacks</title><subtitle type='html'>Hacking and computer archaeology</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3134726962642438536</id><published>2011-12-23T11:30:00.000-08:00</published><updated>2011-12-23T11:30:50.850-08:00</updated><title type='text'>Restoring the Heathkit Jr 35</title><content type='html'>&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-KZPTY4Z9nEI/TvTWZYhfhFI/AAAAAAAAAOM/6WZjRPYz8p0/s1600/IMG_20111223_142817.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/-KZPTY4Z9nEI/TvTWZYhfhFI/AAAAAAAAAOM/6WZjRPYz8p0/s640/IMG_20111223_142817.jpg" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Heathkit Jr Electronic Workshop "35", Model JK-18&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The Heathkit Jr 35 evidently had been stored with batteries in the battery holder, which corroded badly. I replaced it with a plastic RadioShack 4 D-cell battery holder (270-389), wired into the negative power rail and the hot side of the power switch (which is part of the variable resistor).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ARaVYJz4mkw/TvTQMh5lbuI/AAAAAAAAANM/FHPL3Q3o1bo/s1600/IMG_20111223_135953.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-ARaVYJz4mkw/TvTQMh5lbuI/AAAAAAAAANM/FHPL3Q3o1bo/s320/IMG_20111223_135953.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Corroded battery holder&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TLtT8br-Kio/TvTQPaNDmzI/AAAAAAAAANU/Us_CC9YOA0Y/s1600/IMG_20111223_135939.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-TLtT8br-Kio/TvTQPaNDmzI/AAAAAAAAANU/Us_CC9YOA0Y/s320/IMG_20111223_135939.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Replacement battery holder mounted&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;I mounted the replacement battery holder with a dozen "heavy duty" 1 inch foam double-stick mounting squares (rated to hold 900g), stacked in four groups each three high to overcome the various screws protruding through the main board.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0KbGAL4UFWI/TvTWeKShkvI/AAAAAAAAAOc/qymBgsZaLlk/s1600/IMG_20111223_142840.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-0KbGAL4UFWI/TvTWeKShkvI/AAAAAAAAAOc/qymBgsZaLlk/s200/IMG_20111223_142840.jpg" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The remote speaker station&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt; The rubber foot used to protect the relay from being crushed when you turn the kit over was stuck to the remote speaker station. I put it in its rightful place.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-xf6cBX7TTIY/TvTV_1yWfcI/AAAAAAAAAN8/Z_y1P_Ony0k/s1600/IMG_20111223_142624.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-xf6cBX7TTIY/TvTV_1yWfcI/AAAAAAAAAN8/Z_y1P_Ony0k/s320/IMG_20111223_142624.jpg" width="240" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Relay with the brown rubber foot&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Earlier, I had built a couple simple circuits, which showed the meter and new battery pack working, but showed me the telegraph key switches were not making good contact. I used a Scotch-Brite scrubbing pad to remove corrosion from the key switches on the main board and the remote station.&lt;br /&gt;&lt;br /&gt;I ran through the tests in the manual appendix to check out the lamp, power switch, speaker, earphone, antenna coil continuity, remote station speaker &amp;amp; telegraph key, slide switch, and relay.&lt;br /&gt;&lt;br /&gt; I then jumped ahead of myself, building the 4-transistor AM radio experiment; I got slight hints of a audio signal if I wiggled and touched some of the wires. I'm highly suspicous of the electrolytic capacitors. I probably should have tested those (and the transistors) before using them in such a complex circuit. The wire connections to the springs are not all that reliable, and the wires might have some oxidation on them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3134726962642438536?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3134726962642438536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2011/12/restoring-heathkit-jr-35.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3134726962642438536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3134726962642438536'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2011/12/restoring-heathkit-jr-35.html' title='Restoring the Heathkit Jr 35'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-KZPTY4Z9nEI/TvTWZYhfhFI/AAAAAAAAAOM/6WZjRPYz8p0/s72-c/IMG_20111223_142817.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3733228188614583650</id><published>2011-10-01T04:23:00.000-07:00</published><updated>2011-10-01T04:23:35.169-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='heathkit'/><title type='text'>Heathkit Jr. 35</title><content type='html'>I just picked up a Heathkit Jr. "35" circuit experimenter kit on eBay. I had one of these as a child; I don't remember how it is that we came to own it, but I had an itch to re-read the manual. Buying the manual from &lt;a href="http://www.vintagemanuals.com/"&gt;vintagemanuals.com&lt;/a&gt; would have cost as much as the kit + manual. I remember being befuddled by the descriptions of how transistors worked. It turns out the descriptions of capacitors and transistors were a bit sketchy: I think it is pretty much impossible to understand how the AM radio experiments actually function from the text. The operation of the ferrite-core antenna and the various windings are unexplained as well.&lt;br /&gt;&lt;br /&gt;I was a bit surprised to find all four transistors in the kit are identical. Thanks to &lt;a href="http://www.d8apro.com/HCross.htm"&gt;this Heathkit part cross-reference&lt;/a&gt;, I see that they are part 417-118, a.k.a. &lt;a href="http://www.datasheetcatalog.org/datasheet/fairchild/2N3393.pdf"&gt;2N3393 NPN&lt;/a&gt; transistors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3733228188614583650?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3733228188614583650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2011/10/heathkit-jr-35.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3733228188614583650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3733228188614583650'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2011/10/heathkit-jr-35.html' title='Heathkit Jr. 35'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-5622667425918170497</id><published>2011-09-24T10:25:00.000-07:00</published><updated>2011-09-24T23:46:29.757-07:00</updated><title type='text'>Importing from Wordpress.com</title><content type='html'>I'm working on importing my blog from &lt;a href="http://jaoswald.wordpress.com/"&gt;Wordpress.com&lt;/a&gt;. Blogger.com apparently will let me use AdSense even with free hosting, and I should get to know more about AdSense and about the Blogger platform as well, as a Googler.&lt;br /&gt;&lt;br /&gt;I used the Wordpress.com export feature to create an XML file, and used the &lt;a href="http://wordpress2blogger.appspot.com/"&gt;http://wordpress2blogger.appspot.com/&lt;/a&gt; tool to convert it, as I was under the 1 MB size limit. The code behind that converter is evidently at&amp;nbsp;&lt;a href="http://code.google.com/p/google-blog-converters-appengine/"&gt;http://code.google.com/p/google-blog-converters-appengine/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;That tool plus Safari saved the result with an .xml.html extension, which resulted in a Blogger error code of "bX-uroqxm" when importing. Removing the extraneous .html allowed the Blogger import to mostly succeed.&lt;br /&gt;&lt;br /&gt;It does not re-map my Wordpress author identity to my Blogger profile. It also does a pretty poor job importing my source-code formatted content. So I'll be slowly publishing the old posts, tweaking that kind of thing as I go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-5622667425918170497?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/5622667425918170497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2011/09/importing-from-wordpresscom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/5622667425918170497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/5622667425918170497'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2011/09/importing-from-wordpresscom.html' title='Importing from Wordpress.com'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-5965005834623238013</id><published>2010-02-10T15:01:00.000-08:00</published><updated>2011-09-24T15:35:01.473-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='TENEX'/><category scheme='http://www.blogger.com/atom/ns#' term='TOPS-20'/><category scheme='http://www.blogger.com/atom/ns#' term='PDP-10'/><category scheme='http://www.blogger.com/atom/ns#' term='ITS'/><title type='text'>ChaosNET implementations for PDP-10</title><content type='html'>This is not particularly interesting, but I wanted to record a couple of links to ChaosNET code for the PDP-10. The ChaosNET memo describes an ITS (Incompatible Time-Sharing System) interface, for which the code is somewhere in the ITS sources, and a Lisp Machine implementation, for which code is in the CADR sources and Symbolics code base, but also a TOPS-20/TENEX implementation, a VMS/VAX implementation, and a UNIX implementation. The UNIX implementation was documented by James E. Kulp for Symbolics, and the code seems to have survived. The TOPS-20/TENEX is harder to find, but it looks like &lt;a href="http://www.bitsavers.org/bits/Foonly/" target="_blank" title="BitSavers' Foonly archive"&gt;BitSavers' Foonly archives&lt;/a&gt; have some files.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bitsavers.org/bits/Foonly/F2/text/DSK:%3CFOONEX%3ECHAOS.MAC%3b399.txt" target="_blank" title="CHAOS.MAC"&gt;DSK:&amp;lt;FOONEX&amp;gt;CHAOS.MAC;399&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bitsavers.org/bits/Foonly/F2/text/DSK:%3CFOONEX%3ECHABUG.MAC%3b8.txt" target="_blank" title="CHABUG.MAC"&gt;DSK:&amp;lt;FOONEX&amp;gt;CHABUG.MAC;8&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bitsavers.org/bits/Foonly/F2/text/DSK:%3CFOONEX%3ECHAOS0.MAC%3b3.txt" target="_blank" title="CHAOS0.MAC"&gt;DSK:&amp;lt;FOONEX&amp;gt;CHAOS0.MAC;3&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bitsavers.org/bits/Foonly/F2/text/DSK:%3CFOONEX%3ECHATTY.MAC%3b21.txt" target="_blank" title="CHATTY.MAC"&gt;DSK:&amp;lt;FOONEX&amp;gt;CHATTY.MAC;21&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have no idea whether this is at all related to the implementation the AI MEMO mentions.&lt;br /&gt;&lt;br /&gt;A Google search turns up some interesting code (might be for the PDP-11 front end, for ITS)&lt;br /&gt;&lt;br /&gt;from &lt;a href="http://www.avanthar.com/~healyzh/system/system.html"&gt;AI:SYSTEM&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.avanthar.com/~healyzh/system/ch10.defs1" target="_blank"&gt;CH10.defs1&lt;/a&gt; "PDP-10 chaosnet interface definitions"&lt;br /&gt;&lt;a href="http://www.avanthar.com/~healyzh/system/ch11.defs1" target="_blank"&gt;CH11.defs1&lt;/a&gt; "CH11 Unibus chaosnet interface definitions"&lt;br /&gt;&lt;a href="http://www.avanthar.com/~healyzh/system/chsdef.15" target="_blank"&gt;CHSDEF.15&lt;/a&gt; "Chaos net packet definition (for PDP-10s)"&lt;br /&gt;&lt;a href="http://www.avanthar.com/~healyzh/system/chaos.288" target="_blank" title="CHAOS.287"&gt;CHAOS.288&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.avanthar.com/~healyzh/system/ksnet.1" target="_blank"&gt;KSNET.1&lt;/a&gt; "Chaosnet interface on Unibus" (presumably for the KS10)&lt;br /&gt;&lt;a href="http://www.avanthar.com/~healyzh/system/ioelev.432" target="_blank" title="IOELEV.432"&gt;IOELEV.432&lt;/a&gt; "i/o eleven"&lt;br /&gt;&lt;a href="http://www.avanthar.com/~healyzh/system/net.32" target="_blank"&gt;NET.32&lt;/a&gt; General ITS networking code&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-5965005834623238013?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/5965005834623238013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2010/02/chaosnet-implementations-for-pdp-10.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/5965005834623238013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/5965005834623238013'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2010/02/chaosnet-implementations-for-pdp-10.html' title='ChaosNET implementations for PDP-10'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-7458272605500621122</id><published>2009-05-24T09:59:00.000-07:00</published><updated>2011-10-01T08:59:25.237-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbolics'/><title type='text'>Another Symbolics keyboard adapter</title><content type='html'>Hans Hübner has been at it again, and has developed code to allow a&amp;nbsp;&lt;a href="http://www.pjrc.com/teensy/" target="_blank"&gt;Teensy AVR development board&lt;/a&gt; to adapt a &lt;a href="http://netzhansa.blogspot.com/2009/04/how-to-convert-your-symbolics-keyboard.html" target="_blank"&gt;Symbolics keyboard to USB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I ordered a Teensy board of my own, and was hoping to develop a small adapter to avoid cutting up my keyboard cable, but Teensy does not work with my old Mac OS X 10.4 system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-7458272605500621122?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/7458272605500621122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2009/05/another-symbolics-keyboard-adapter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/7458272605500621122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/7458272605500621122'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2009/05/another-symbolics-keyboard-adapter.html' title='Another Symbolics keyboard adapter'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-4136370522982500133</id><published>2008-06-09T16:37:00.000-07:00</published><updated>2011-10-01T08:59:59.628-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Symbolics Keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='Keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='keyboard adapter'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbolics'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>News on Symbolics keyboard adapters</title><content type='html'>I wanted to post a link referring to recent progress on adapting Symbolics keyboards to modern PCs. Hans Hübner announced that the &lt;a href="http://kbdbabel.org/" target="_blank" title="adapters for old keyboards"&gt;kbdbabel project&lt;/a&gt; (apparently based on 8051 microcontrollers) was able to be adapted to &lt;a href="http://netzhansa.blogspot.com/2008/05/symbolics-keyboard-on-ps2-port.html" target="_blank" title="Symbolics keyboard to PS/2 adapter"&gt;support the slim-line (Rev. C) Symbolics keyboard, adapting it to PS/2 protocol&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My own work in this area ground to a halt pretty soon after I received the ADB adapter from DKS. I'm happy to see that others have been able to make progress!&lt;br /&gt;&lt;br /&gt;UPDATE: Rainer Joswig has commented on his experience using the &lt;a href="http://lispm.dyndns.org/news?ID=NEWS-2008-07-27-1"&gt;kbdbabel adapter to connect a Symbolics keyboard to a Macbook running Mac OS X&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;UPDATE 2: Hans has developed a &lt;a href="http://jaoswald.wordpress.com/2009/05/24/another-symbolics-keyboard-adapter/" target="_self"&gt;USB adapter solution&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-4136370522982500133?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/4136370522982500133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2008/06/news-on-symbolics-keyboard-adapters.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4136370522982500133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4136370522982500133'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2008/06/news-on-symbolics-keyboard-adapters.html' title='News on Symbolics keyboard adapters'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-4529937868364561876</id><published>2008-05-06T02:50:00.000-07:00</published><updated>2011-09-25T16:36:22.967-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COMFY-6502'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='COMFY'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><title type='text'>COMFY-6502: hosting at github</title><content type='html'>Mostly to support my own development on multiple computers, I've moved my Common Lisp port of COMFY-6502 to github. I chose the name cl-comfy-6502 for the repository, although the "cl" prefix is a bit ugly.&lt;br /&gt;&lt;br /&gt;The &lt;a title="30 April 2008 snapshot of Common Lisp COMFY-6502" href="http://github.com/jaoswald/cl-comfy-6502/tree/4f60b2a1d493f731f4702d29439112b31fa76f03" target="_blank"&gt;current snapshot of COMFY-6502&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-4529937868364561876?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/4529937868364561876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2008/05/comfy-6502-hosting-at-github.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4529937868364561876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4529937868364561876'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2008/05/comfy-6502-hosting-at-github.html' title='COMFY-6502: hosting at github'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-4757473154727363324</id><published>2008-03-05T01:46:00.000-08:00</published><updated>2011-09-25T16:43:52.556-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Boston Lisp Meeting'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Boston Lisp'/><title type='text'>Monthly Boston Lisp Meeting: report</title><content type='html'>Thanks to François-René Rideau (&lt;a href="http://fare.livejournal.com/" title="Fare's Blog" target="_blank"&gt;fare&lt;/a&gt;) for organizing last night's inaugural &lt;a href="http://fare.livejournal.com/120393.html" title="Monthly Boston Lisp Meeting announcement" target="_blank"&gt;Monthly Boston Lisp Meeting&lt;/a&gt; (Note: future meetings will apparently happen on the fourth Monday of the month.)&lt;br /&gt;&lt;br /&gt;I'm surprised I haven't seen reports on Planet Lisp yet, but I had an enjoyable time. I certainly didn't meet everyone there, but did get to meet &lt;a href="http://www.lisphacker.com/" title="Alastair Bridgewater"&gt;nyef&lt;/a&gt; (who showed off some of his fearless adventuring into bare-metal Lisp) and Brad Parker, got to see Kent Pitman in person, and a few other notables, as well as numerous ITA Lispers. Discussion was wide-ranging (I heard only a fraction of the multiple conversations going on), and some of the most interesting stuff to me was discussion about the background of Dylan and Lispers at Apple in the 1990s.&lt;br /&gt;&lt;br /&gt;There was at least one person taking pictures; I'm sure they'll pop up somewhere in the blogosphere.&lt;br /&gt;&lt;br /&gt;Looking forward to more great meetings in the future!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-4757473154727363324?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/4757473154727363324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2008/03/monthly-boston-lisp-meeting-report.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4757473154727363324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4757473154727363324'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2008/03/monthly-boston-lisp-meeting-report.html' title='Monthly Boston Lisp Meeting: report'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3732126037807750595</id><published>2008-03-05T01:34:00.000-08:00</published><updated>2011-09-25T10:43:30.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='COMFY'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><title type='text'>COMFY-6502: snapshot</title><content type='html'>Even though it is hardly a finished product, I've posted a &lt;a href="http://josephoswald.nfshost.com/comfy/summary.html" title="COMFY-6502 snapshot" target="_blank"&gt;snapshot of my current CL conversion of COMFY-6502&lt;/a&gt; Not that I expect a huge pent-up demand for the code, but it might be slightly more interesting than the output examples. Thanks to Henry Baker for allowing the release.&lt;br /&gt;&lt;br /&gt;The page also contains a link to the TODO file describing my next steps. (Most immediately, my attempt to include JMP elision was messy enough to convince me I need a different class to represent opcodes+arguments as a unit.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3732126037807750595?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3732126037807750595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2008/03/comfy-6502-snapshot.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3732126037807750595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3732126037807750595'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2008/03/comfy-6502-snapshot.html' title='COMFY-6502: snapshot'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-5185400822981553029</id><published>2008-02-11T01:57:00.000-08:00</published><updated>2011-09-25T10:27:29.009-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple II'/><category scheme='http://www.blogger.com/atom/ns#' term='Red book tone routine'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='COMFY'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><title type='text'>COMFY-6502: a slight correction</title><content type='html'>After all the work to write a post showing off COMFY-6502's ability to reproduce the Red Book tone routine, I made a slight mistake in translation. The code I presented differed ever-so-slightly from the Red Book routine in the case where the Y-register reached zero.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;In the original, when the Y-register reaches zero, the DEX is still executed. In the code I posted, the expiring "duration tick" skips a count on the pitch. A minor error, but one I should own up to.&lt;br /&gt;&lt;br /&gt;Here's a better effort. COMPILE-SYMBOLIC contains a MACROLET defining MODULE as a call to COMFY-6502:COMPILE.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(compile-symbolic&lt;br /&gt; (equ speaker #xc030)&lt;br /&gt; (equ duration 1)&lt;br /&gt; (equ pitch 0)&lt;br /&gt; (module&lt;br /&gt;  (comfy-6502:loop&lt;br /&gt;     ;; repeat until some clause loses: actually, only exit is&lt;br /&gt;     ;; through return, so each clause should be ensured of winning.&lt;br /&gt;   (LDX pitch)&lt;br /&gt;   (LDA speaker)&lt;br /&gt;   (not&lt;br /&gt;    (comfy-6502:loop  ;; repeat until whap time&lt;br /&gt;    DEY&lt;br /&gt;    (not (seq zero? (DEC duration) zero? return))&lt;br /&gt;    (seq DEX (not zero?)))))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;resulting in&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(; reload-pitch&lt;br /&gt;(LDX :ZERO-PAGE) (:ZERO-PAGE 0)&lt;br /&gt;(LDA :ABSOLUTE) (:ABSOLUTE 49200)&lt;br /&gt;; spin&lt;br /&gt;(DEY)&lt;br /&gt;(BNE) (:BRANCH 6) ; not-duration-tick&lt;br /&gt;(DEC :ZERO-PAGE) (:ZERO-PAGE 1)&lt;br /&gt;(BNE) (:BRANCH 2)&lt;br /&gt;(RTS)&lt;br /&gt;; not-duration-tick&lt;br /&gt;(DEX)&lt;br /&gt;(BEQ) (:BRANCH 4) ; goto-reload-pitch&lt;br /&gt;(JMP :ABSOLUTE) (:LONG-BRANCH -12) ; spin&lt;br /&gt;; goto-reload-pitch&lt;br /&gt;(JMP :ABSOLUTE) (:LONG-BRANCH -20) ; reload-pitch&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For fun, I tried to get the code to emit the RTS at the very end, as in the original.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(compile-symbolic&lt;br /&gt; (equ speaker #xc030)&lt;br /&gt; (equ duration 1)&lt;br /&gt; (equ pitch 0)&lt;br /&gt; (module&lt;br /&gt;   (alt (loop (seq (LDX pitch) (LDA speaker))&lt;br /&gt;           (not (while&lt;br /&gt;                   (seq DEY (not (seq zero? (seq (DEC duration) zero?)))&lt;br /&gt;                   (seq DEX (not zero?)))))&lt;br /&gt;         RTS)))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(; reload&lt;br /&gt; (LDX :ZERO-PAGE) (:ZERO-PAGE 0)&lt;br /&gt; (LDA :ABSOLUTE) (:ABSOLUTE 49200)&lt;br /&gt; ; spin&lt;br /&gt; (DEY)&lt;br /&gt; (BNE) (:BRANCH 5) ; not-duration&lt;br /&gt; ; duration-tick&lt;br /&gt; (DEC :ZERO-PAGE) (:ZERO-PAGE 1)&lt;br /&gt; (BEQ) (:BRANCH 10) ; exit&lt;br /&gt; ; not-duration&lt;br /&gt; (DEX)&lt;br /&gt; (BEQ) (:BRANCH 4) ; goto-reload&lt;br /&gt; ; goto-spin&lt;br /&gt; (JMP :ABSOLUTE) (:LONG-BRANCH -11)&lt;br /&gt; ; goto-reload&lt;br /&gt; (JMP :ABSOLUTE) (:LONG-BRANCH -19) ; reload&lt;br /&gt;; exit&lt;br /&gt; (RTS))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;"Loop tightening" could change (BEQ) (:BRANCH 4) to (BEQ) (:BRANCH -14); the (JMP :ABSOLUTE) (:LONG-BRANCH -19) is then never used, and could be omitted, changing (BEQ) (:BRANCH 10) to (BEQ) (:BRANCH 7).&lt;br /&gt;&lt;br /&gt;"Loop compaction" could potentially recognize (BEQ) (:BRANCH -14) (JMP :ABSOLUTE) (:LONG-BRANCH -11), where no other instruction references the JMP, could be converted to (BEQ) (:BRANCH -14) (BNE) (:BRANCH -11), shortening the (BEQ) (:BRANCH 7) one byte more to (BNE) (:BRANCH 6).&lt;br /&gt;&lt;br /&gt;Note some interesting equivalents I should probably implement as COMFY macros.&lt;br /&gt;&lt;br /&gt;(if A B C) where C is do-nothing-but-win is (not (seq A (not B)). If A wins, B is executed to determine the result of the form. If A loses, the if wins. I will probably call this (when A B).&lt;br /&gt;&lt;br /&gt;(if A B C) where B is a do-nothing-but-win is (alt A C), where alt is the "dual" of seq. (alt A B C ...) == (not (seq (not A) (not B) (not C) ...). For the two-argument case, I would call this (unless A B).&lt;br /&gt;&lt;br /&gt;The one twist I can think of is to add an "implied SEQ" to these forms. (when A B C ...) would be (when A (seq B C ...)). (unless A B C ...) would be (unless A (seq B C ...)).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-5185400822981553029?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/5185400822981553029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2008/02/comfy-6502-slight-correction.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/5185400822981553029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/5185400822981553029'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2008/02/comfy-6502-slight-correction.html' title='COMFY-6502: a slight correction'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-98493880222348013</id><published>2008-02-05T00:49:00.000-08:00</published><updated>2011-09-25T10:51:31.891-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COMFY assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple II'/><category scheme='http://www.blogger.com/atom/ns#' term='Red book tone routine'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><title type='text'>COMFY-6502: work in progress</title><content type='html'>As I've mentioned before, I've become intrigued by Baker's COMFY assembler, and have been working on porting it to Common Lisp, and making it a bit more powerful in the link stage.&lt;br /&gt;&lt;br /&gt;One metric to judge the success of this kind of "medium-level" language is how well it compiles compared to hand-written assembler code. For the 6502, there are a few examples of code created by wizards like Steve Wozniak, which you can find copies of around the web, the largest being the Apple II monitor, the Integer Basic interpreter, and some medium-sized ones like the Apple II 6502 step/trace, the mini-assembler, the floating-point "Wozpack," and the Sweet-16 virtual machine.&lt;br /&gt;&lt;br /&gt;This kind of code has a lot of quirks that make it hard to straight-forwardly translate: lots of shared "tail code", branches known by the programmer to always be taken (to save a precious extra byte consumed by an unconditional JMP), and the classic "fake RTS trick", pushing a return address picked from a table onto the stack, then using an RTS instead of a zero-page indirect JMP. Common in Woz's code is a further shortening of the code by arranging the destination addresses to all be in the same 256-byte page, so the high-order byte is a constant. Some of these ideas will likely be possible with intelligent macros, combined with address labels and computation on those labels. I'm puzzling a bit over how to optimize the "same page" condition: whether to include a "link-time assert", which will issue an error if the code is emitted so as to cross a page, or an even more intelligent "link-time computation" which, given the current available memory space, can choose a location that meets the constraints.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;That's all still in development. The first test case I used was the classic "Red Book" tone routine.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;;; the original&lt;br /&gt;;; location 00: pitch&lt;br /&gt;;; location 01: duration&lt;br /&gt;0002-  AD 30 C0   LDA  $C030 ; whap speaker&lt;br /&gt;0005-  88         DEY&lt;br /&gt;0006-  D0 04      BNE  $000C&lt;br /&gt;0008-  C6 01      DEC  $01   ; y reaches 0: a duration tick&lt;br /&gt;000A-  F0 08      BEQ  $0014 ; duration exhausted when reaches 0&lt;br /&gt;000C-  CA         DEX        ; x counts time to "whap"&lt;br /&gt;000D-  D0 F6      BNE  $0005&lt;br /&gt;000F-  A6 00      LDX  $00   ; x reached 0, reload pitch&lt;br /&gt;0011-  4C 02 00   JMP  $0002 ; and whap&lt;br /&gt;0014-  60         RTS&lt;br /&gt;&lt;/pre&gt;A few comments:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Locating the code in zero-page needlessly wastes valuable zero-page locations. The code is easily relocatable to other locations.&lt;/li&gt;&lt;li&gt;X counts from the "pitch value" down to 0 at a fixed rate, "whapping" the speaker each time it reaches zero.&lt;/li&gt;&lt;li&gt;Y cycles around continuously at basically the same rate; each time it reaches zero, one tick is subtracted from the duration value. When duration reaches zero, the routine returns.&lt;/li&gt;&lt;li&gt;This classic tone routine has the important feature that duration is absolute, and not dependent on pitch&lt;/li&gt;&lt;li&gt;Y is uninitialized, which presumably causes a slight jitter in the duration, unless BASIC ensures Y=0. Likewise, X in the first pitch countdown is uninitialized.&lt;/li&gt;&lt;li&gt;duration is destroyed by the routine, but pitch is not.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Here is my transcription to COMFY-6502. I have translated the "I", "J", and abbreviated "L", "LI", etc. opcodes for this example, but not yet changed Baker's code to accept them.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(let ((comfy-6502::*symbol-table* (make-hash-table)))&lt;br /&gt;  (equ speaker #xc030)&lt;br /&gt;  (equ pitch 0)&lt;br /&gt;  (comfy-6502-tests::compile-code&lt;br /&gt;    (comfy-6502:loop&lt;br /&gt;      ;; repeat until some clause loses: actually, only exit is&lt;br /&gt;      ;; through return, so each clause should be ensured of winning.&lt;br /&gt;      (LDX pitch)&lt;br /&gt;      (LDA speaker)&lt;br /&gt;      (not (comfy-6502:loop  ;; repeat until whap time&lt;br /&gt;             ;; "whap" time is when a clause loses;&lt;br /&gt;             ;; NOT wins, outer loop continues&lt;br /&gt;             DEY&lt;br /&gt;             (if =0? ; has Y reached zero?&lt;br /&gt;               (not (seq (DEC duration) ; Y has reached zero, duration ticks down&lt;br /&gt;                         =0?       ; if duration has not reached zero,&lt;br /&gt;                         ; SEQ fails, NOT wins, IF wins, inner loop continues&lt;br /&gt;                         RTS)) ; duration reached zero, return&lt;br /&gt;               (seq DEX ~=0?))))))) ; Y not zero, count down pitch.&lt;br /&gt;               ;; If X has reached zero, SEQ loses, IF loses, inner loop exits&lt;br /&gt;&lt;/pre&gt;To understand the code, the basic COMFY principles must be understood.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Conditional tests (such as "=0?", corresponding to a BEQ or BNE), "win" if they are true, "lose" if they are false.&lt;/li&gt;&lt;li&gt;Ordinary machine operations (such as LDA, DEX, RTS) always "win"&lt;/li&gt;&lt;li&gt;SEQ sequentially each enclosed form, until one "loses", in which case SEQ "loses", or until they all "win", in which case SEQ "wins."&lt;/li&gt;&lt;li&gt;LOOP executes each enclosed form, until one "loses", in which case LOOP "loses", continuing at the top of the loop if every form "wins." (I have introduced an "implied" seq to Baker's ELisp implementation.) It is SEQ stuck on potentially endless repeat.&lt;/li&gt;&lt;li&gt;NOT executes the single enclosed form, but changes "win" into "lose" and vice-versa. This is useful to keep a nested "loss" from terminating all the enclosing forms.&lt;/li&gt;&lt;li&gt;(IF test win-form lose-form) executes TEST. If TEST "wins", WIN-FORM is executed, and its win/lose result is passed out as the result of the IF. If TEST "loses", LOSE-FORM is executed, and its win/lose result is passed out as the result of the IF.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Note that I have chosen to initialize X on the first pass through the loop. That makes the code somewhat clearer, and I think is better style.&lt;br /&gt;&lt;br /&gt;So what code does COMFY (as of today) generate for this? Behold.&lt;br /&gt;&lt;pre&gt;(; reload-pitch&lt;br /&gt;(LDX :ZERO-PAGE) (:ZERO-PAGE 0)&lt;br /&gt;(LDA :ABSOLUTE) (:ABSOLUTE 49200)&lt;br /&gt;; spin&lt;br /&gt;(DEY)&lt;br /&gt;(BEQ) (:BRANCH 6) ; duration-tick&lt;br /&gt;(DEX)&lt;br /&gt;(BNE) (:BRANCH 8 ) ; goto spin&lt;br /&gt;(BEQ) (:BRANCH 9) ; goto reload-pitch&lt;br /&gt;; duration-tick&lt;br /&gt;(DEC :ZERO-PAGE) (:ZERO-PAGE 1)&lt;br /&gt;(BNE) (:BRANCH 2) ; goto-spin&lt;br /&gt;(RTS)&lt;br /&gt;; goto spin&lt;br /&gt;(JMP :ABSOLUTE) (:LONG-BRANCH -14)&lt;br /&gt;; goto reload-pitch&lt;br /&gt;(JMP :ABSOLUTE) (:LONG-BRANCH -22))&lt;br /&gt;&lt;/pre&gt;This is a symbolic "intermediate" form, not yet relocated and linked. Some keys for interpretation.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;(BEQ), (JMP :ABSOLUTE) etc. represent one-byte opcodes, with the specified addressing mode (redundant in the case of branch instructions, which have only the branch-relative mode).&lt;/li&gt;&lt;li&gt;(:ZERO-PAGE 0) is a single-byte, value 0, tagged to indicate that it represents a reference to zero-page location 0, and is not just a immediate argument of value zero.&lt;/li&gt;&lt;li&gt;(:ABSOLUTE 49200) is a two-byte reference to the address #xC030, which will be emitted in the usual 6502 low-byte first as #x30 and #xC0.&lt;/li&gt;&lt;li&gt;(:BRANCH n) represents a short branch. It is one byte long. Note that the destination counts relative to the BRANCH byte, not relative to the next instruction, as the 6502 branch values do. (The relocater corrects for this when converting to 6502 code bytes.)&lt;/li&gt;&lt;li&gt;(:LONG-BRANCH n) is a long branch. It is two bytes long. JMP is absolute in the 6502; the relocated will deposit the absolute address by adding this value to the location of the first byte of this pair.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I have added this intermediate form because Baker's Elisp goes directly to bytes in a fixed memory area, starting from high addresses. My goal is for a high level "COMFY module" macro to result in an intermediate form that knows its length in bytes, what zero page locations it uses, and what internal entry points it exports. Otherwise, it is relocatable by the linker. I would also like the feature that the zero-page references are symbolic (e.g. (:ZERO-PAGE duration)), in which case the linker would allocate a byte in zero-page, and all modules referring to "duration" would refer to that address. Even nicer would be the ability to do math, for instance (:ZERO-PAGE (+ duration 1)), or to emit (:ABSOLUTE (- tone-entry 1)) to encode the module entry point in the "off-by-one" method used by the "fake RTS" trick. Similarly, one could have elements such as (:BYTE (HIGH tone-entry)), representing the high-order byte of the tone-entry address, and allowing arbitrary link-time math.&lt;br /&gt;&lt;br /&gt;As for the code itself, it has &lt;strike&gt;the same&lt;/strike&gt; similar semantics as the Red book routine.[UPDATE: but not quite. See more recent post for correction.] It has a somewhat minor change in that the DEY is followed by a BNE in the original code (taken 255 out of 256 times), and by a BEQ in the COMFY version (taken only 1 out of 256 times). Any difference in the execution time will, of course, change the pitch emitted. More serious is the fact that COMFY, as coded, is biased toward forward conditional branches. The two JMP instructions after the RTS are reached only through branches that could reach their destination directly. COMFY compiles, as I mentioned, from the last instruction toward the first. Forward branches are trivially resolved, but backward branches don't know their destination, in particular, whether the destination is a short branch away or not. The backward JMPs are created by the code for LOOP, which first emits a "placeholder" absolute jump, compiles the loop forms, including branches that might land on that jump, then patches the JMP destination to point to the first form of the LOOP.&lt;br /&gt;&lt;br /&gt;That suggests that LOOP might be enhanced to include a "loop-tightening" phase which examines the body of the loop for forward branches (:BRANCH x) to jumps (:LONG-BRANCH y), and if x+y+1 is within range of a short branch, replaces it. (The +1 is for the JMP opcode itself.) The result would be&lt;br /&gt;&lt;pre&gt;(; reload pitch&lt;br /&gt;(LDX :ZERO-PAGE) (:ZERO-PAGE 0)&lt;br /&gt;(LDA :ABSOLUTE) (:ABSOLUTE #XC030)&lt;br /&gt;; spin&lt;br /&gt;(DEY)&lt;br /&gt;(BEQ) (:BRANCH 6) ; duration-tick&lt;br /&gt;(DEX)&lt;br /&gt;(BNE) (:BRANCH -5) ; spin&lt;br /&gt;(BEQ) (:BRANCH -12) ; reload-pitch&lt;br /&gt;; duration-tick&lt;br /&gt;(DEC :ZERO-PAGE) (:ZERO-PAGE 1)&lt;br /&gt;(BNE) (:BRANCH -11) ; spin&lt;br /&gt;(RTS)&lt;br /&gt;(JMP :ABSOLUTE) (:LONG-BRANCH -14)&lt;br /&gt;(JMP :ABSOLUTE) (:LONG-BRANCH -22))&lt;br /&gt;&lt;/pre&gt;The two JMPs are now unused. This is a special case, because RTS is itself a jump. Because LOOP knows that it freshly emitted the JMP, no external code can properly reference it. If all the branches to it have been patched, and the last instruction cannot reach it, the JMP itself can be omitted.Assuming I can convince COMFY to be smart enough to omit the (proven) redundant JMPs, we are ready for comparison. Let's re-write the original code to match the explicit X initialization, and use COMFY's discovery that moving the LDX to the front of the loop means the absolute JMP $0002 in the original can be replaced by a BEQ.&lt;br /&gt;&lt;pre&gt;reload-pitch LDX PITCH&lt;br /&gt;LDA $CO30&lt;br /&gt;spin         DEY&lt;br /&gt;BNE not-tick ; actually, takes branch more often&lt;br /&gt;; duration-tick&lt;br /&gt;DEC duration&lt;br /&gt;BEQ return&lt;br /&gt;not-tick     DEX&lt;br /&gt;BNE spin&lt;br /&gt;BEQ reload-pitch ; save a byte compared to original JMP&lt;br /&gt;return       RTS&lt;br /&gt;&lt;/pre&gt;COMFY, with the yet-to-be-implemented loop tightening has made the code one byte shorter, and relocatable.As mentioned before, COMFY has luckily or unluckily chosen the branch after DEY to be taken infrequently, while the author of the tone routine chose it to be taken frequently. We cannot know whether the author de-optimized to reach a lower pitch range. If so, to match the timing more closely, I can reverse the sense of the IF, causing it to emit a BNE. In this case, the hypothetical loop-tightening can eliminate one JMP, but not the other.&lt;br /&gt;&lt;pre&gt;(; reload-pitch&lt;br /&gt;(LDX :ZERO-PAGE) (:ZERO-PAGE 0)&lt;br /&gt;(LDA :ABSOLUTE) (:ABSOLUTE 49200)&lt;br /&gt;; spin&lt;br /&gt;(DEY)&lt;br /&gt;(BNE) (:BRANCH 6) ; not-duration&lt;br /&gt;(DEC :ZERO-PAGE) (:ZERO-PAGE 1)&lt;br /&gt;(BNE) (:BRANCH -6) ; spin&lt;br /&gt;(RTS)&lt;br /&gt;; not-duration&lt;br /&gt;(DEX)&lt;br /&gt;(BEQ) (:BRANCH -15) ; reload-pitch&lt;br /&gt;; goto-spin&lt;br /&gt;(JMP :ABSOLUTE) (:LONG-BRANCH -12)&lt;br /&gt;&lt;/pre&gt;We see this simple change affected the DEY test, but also affected the DEX test, biasing it to be taken less frequently.  Perhaps an annotation could added to the COMFY language to indicate "please prefer (or expect?) this test to win/lose." This would disrupt the tight recursive elegance of the GENBRC routine, but it might prove handy in modern architectures with their branch-prediction tendencies. It is also not so simple to change the test after DEC (:ZERO-PAGE 1) to BEQ to the RTS. That would require moving the RTS to be emitted at the end, i.e. compiled by COMFY first. I'm more interested in implementing the loop-tightening logic than attacking that brain-teaser right now.The moral may be that COMFY (plus yet-to-be-implemented optimization passes) can emit code very much in the ballpark of humans, at least for these toy examples. For cycle-level timing, however, I might follow the lead of Sassy and allow for the human to code branches and jumps explicitly. (Sassy's example "boot sector" code actually avoids pretty much all the COMFY primitives; however, the documentation also seems to suggest that loop tightening and similar optimizations have been implemented there.) And I have yet to successfully translate Woz's code into COMFY, probably because I have to understand it first.(Note to self: AVOID the tempting WordPress "code" button. Use the &lt;a href="http://faq.wordpress.com/2007/09/03/how-do-i-post-source-code/" target="_blank" title="How do I post sourcecode"&gt;sourcecode tag&lt;/a&gt;, although it supports neither assembler nor Lisp.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-98493880222348013?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/98493880222348013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2008/02/comfy-6502-work-in-progress.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/98493880222348013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/98493880222348013'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2008/02/comfy-6502-work-in-progress.html' title='COMFY-6502: work in progress'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-6690725144222609895</id><published>2007-12-18T18:06:00.000-08:00</published><updated>2011-09-25T16:43:16.593-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Regression Test'/><category scheme='http://www.blogger.com/atom/ns#' term='RT'/><title type='text'>Quis custodiet ipsos...</title><content type='html'>I don't know what this says about Lispers' attitudes toward automated testing, or toward the RT test framework, but the commonly-distributed versions of the RT test framework did not pass their own self-tests.&lt;br /&gt;&lt;br /&gt;The apparent cause is that the introduction of a hash-table and tail-pointer in rt.lisp to efficiently find tests by name and insert new tests at the end of the test list were not matched by the updating of the rt-test.lisp to consistently construct the miniature mock-up test suite. This &lt;a href="http://voltaire.nfshost.com/transfer/rt-test-JAO-20071218.diff" title="DIFF for rt-test.lisp" target="_blank"&gt;diff for rt-test.lisp&lt;/a&gt;, introduces code to dynamically rebind those variables. The patch, in addition to one putting the self-tests into a separate package, has been applied to the HEAD of the &lt;a href="http://cvs.savannah.gnu.org/viewvc/gcl/gcl/ansi-tests/" title="CVS repository for GNU CLISP ansi-tests directory" target="_blank"&gt;CVS repository for GNU CLISP&lt;/a&gt;. Note that changing the package changes the names of the tests themselves, which requires editing the expected output in the tests.&lt;br /&gt;&lt;br /&gt;Note how powerful and convenient the dynamic binding feature of Lisp (optional, as it should be, in Common Lisp) can be: while running the individual tests, the test procedure can effortlessly construct a sandbox in which to test out the features of the test suite, &lt;strong&gt;without&lt;/strong&gt; destroying the suite of tests that is being sequenced through, and &lt;strong&gt;automatically restoring&lt;/strong&gt; the state of the outer test suite as each test completes, even if the inner test throws an unexpected error---all with essentially no special effort on the part of the original programmer (except, as we see, to identify &lt;em&gt;all&lt;/em&gt; of the state that needs to be shadowed.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-6690725144222609895?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/6690725144222609895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/12/quis-custodiet-ipsos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/6690725144222609895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/6690725144222609895'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/12/quis-custodiet-ipsos.html' title='Quis custodiet ipsos...'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-7213269050952786152</id><published>2007-12-17T14:03:00.000-08:00</published><updated>2011-09-25T16:44:52.144-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple II'/><category scheme='http://www.blogger.com/atom/ns#' term='SPL assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC0 assembler'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><title type='text'>Another interesting mid-level assembler</title><content type='html'>While I'm still digesting COMFY in my "ample spare time," a &lt;a href="http://groups.google.com/group/comp.sys.apple2/msg/a3eadb2e419930dd?" title="Announcement of SPL on comp.sys.apple2" target="_blank"&gt;post on comp.sys.apple2 mentioned some assemblers from "Ron" having a similar flavor&lt;/a&gt;: &lt;a href="http://home.comcast.net/~oneelkruns/" title="SPL assembler for the 6502, PIC0 assembler for PIC" target="_blank"&gt;SPL for the 6502 and PIC0 for PIC 10F2xx microcontrollers&lt;/a&gt;. They are apparently implemented in Python, and inspired by Forth. They emit assembler.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-7213269050952786152?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/7213269050952786152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/12/another-interesting-mid-level-assembler.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/7213269050952786152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/7213269050952786152'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/12/another-interesting-mid-level-assembler.html' title='Another interesting mid-level assembler'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3421654010409825331</id><published>2007-12-03T03:11:00.000-08:00</published><updated>2011-10-01T04:27:32.484-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppleShare'/><category scheme='http://www.blogger.com/atom/ns#' term='Old Macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='Macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='System 7.6.1'/><category scheme='http://www.blogger.com/atom/ns#' term='System 7'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='System 7.6'/><title type='text'>System 7 Accessing Mac OS X file servers</title><content type='html'>Using my MacIvory, until now, I have been using an old Mac Powerbook running Mac OS 9 with AppleTalk file-sharing to allow me to copy files from a USB key to the Mac IIfx host running 7.6.1. Trying to access shared folders on my newer laptop running Mac OS X failed, as did sharing in the opposite direction.&lt;br /&gt;&lt;br /&gt;Presumably, the problem is that Mac OS X uses a revision of the AFP file-sharing protocol which is incompatible with the version used by the default Mac OS 7.6.1.&lt;br /&gt;&lt;br /&gt;It turns out there is a fix for this issue:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Install Open Transport 1.1.2 (a dependency for the next step) on the 7.6.1 Mac&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Install &lt;a href="http://download.info.apple.com/Apple_Support_Area/Apple_Software_Updates/MultiCountry/Macintosh/Networking-Communications/AppleShare_Client/AppleShare_Client_3.8.3/"&gt;AppleShare Client 3.8.3&lt;/a&gt; on the 7.6.1 Mac&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://docs.info.apple.com/article.html?artnum=58360"&gt;Apple article on AppleShare Client 3.8.3&lt;/a&gt; has more information on this release of the software.&lt;br /&gt;&lt;br /&gt;Apparently &lt;a href="http://docs.info.apple.com/article.html?artnum=60792#English"&gt;AppleShare 3.8.8&lt;/a&gt; requires System 8.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3421654010409825331?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3421654010409825331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/12/system-7-accessing-mac-os-x-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3421654010409825331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3421654010409825331'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/12/system-7-accessing-mac-os-x-file.html' title='System 7 Accessing Mac OS X file servers'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-6240089858143419630</id><published>2007-11-06T19:07:00.000-08:00</published><updated>2011-10-01T08:43:10.230-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Future-Common-Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='ANSI-Common-Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Genera'/><title type='text'>Learning Genera, bit by bit...</title><content type='html'>Having hacked on the COMFY code for a while in Emacs Lisp, I got the itch to move it over to my MacIvory, which has been waiting for real work to do. I've crafted some tests in the Emacs Lisp using elk-test (trying to add heirarchical suites-of-suites along the way), and wanted to port them to one of the Common Lisp test frameworks (I'm thinking of checking out Stefil, LIFT, and rt, which I've used briefly). While copying the files, I ran into a few issues.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt; I couldn't figure out an automatic way to handle line-ending issues in the text files. I ended up locating the file on the Mac OS side in the file browser, Mouse-R clicking to Edit the file, then M-%, C-q [LINE key] [Return] C-q [Return] [Return] ! in Zmacs, then saving to a file on the Ivory file system. (I like the offer to create non-existent directories on a save.) There is probably a Copy File(s) command I could have used to move them en masse, and I should have been able to code up a quick conversion routine or Zmacs keyboard macro, but it worked.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Trying to compile the RT framework, I think I had been misled by my experience in the Genera Development Tutorial. The Common-Lisp mode apparently is Common Lisp the Language, 2d ed. What I was looking for is ANSI-Common-Lisp. The confusion cause all sorts of problems with DEFPACKAGE, and the presence of FUTURE-COMMON-LISP made me even more confused. An e-mail on the SLUG list apparently &lt;a href="http://permalink.gmane.org/gmane.lisp.org.slug/10" target="_blank" title="Common-Lisp compatibility in Genera"&gt;explains the various Common-Lisp strategies on Genera&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;[UPDATE: the old link to the e-mail broke, but gmane.org still has it.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-6240089858143419630?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/6240089858143419630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/11/learning-genera-bit-by-bit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/6240089858143419630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/6240089858143419630'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/11/learning-genera-bit-by-bit.html' title='Learning Genera, bit by bit...'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3455017229724644437</id><published>2007-11-03T21:22:00.000-07:00</published><updated>2011-09-25T10:24:14.706-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple II'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='COMFY'/><category scheme='http://www.blogger.com/atom/ns#' term='6502'/><title type='text'>Baker's COMFY: a few notes</title><content type='html'>I've been working a bit with Baker's COMFY-6502 code; a few notes of what I have learned so far.&lt;br /&gt;&lt;br /&gt;First, a couple of tiny bugs in the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;genbrc&lt;/span&gt;; the code miscounts the size of the branch instructions, meaning that &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;(- l 2)&lt;/span&gt; should be a &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;(+ l 2)&lt;/span&gt; and so on. I found it handy to enumerate each clause of the cond. Each clause handles a particular case, such as when the "lose" continuation can be reached by a short branch instruction, while the "win" continuation is far enough away to require an absolute jump.&lt;br /&gt;&lt;br /&gt;Second, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;genbrc&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;genbr&lt;/span&gt;, and &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;compile&lt;/span&gt; all provide the address of the resulting "continuation" as the return value. This is perhaps clear when one traces out all the recursion, but it isn't explicitly mentioned. One interesting case is &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;genbrc&lt;/span&gt; when the "win" and "lose" branch destinations are the same: one could simply emit an unconditional branch to that destination, and return the address of that branch but actually returning the destination works just as well. (In the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;emit&lt;/span&gt; routine, if the continuation does not happen to be the next instruction, the unconditional branch is, after all, emitted, moving the continuation to the front of the instruction stream, ready for the non-branching instruction to be emitted just in front of it.)&lt;br /&gt;&lt;br /&gt;As for "upgrades" to the package, I have been focused up to this point on moving the knowledge of 6502 opcodes and addressing modes from magic decimal numbers to symbolic processing. Instead of simply emitting a decimal opcode, I have been changing the code to emit symbolic opcodes, such as &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;(ADC ABSOLUTE)&lt;/span&gt;, with routines to reduce these symbolic forms to the appropriate opcode, including checking for invalid opcodes. Baker's original code will happily emit opcodes with addressing modes not supported by the chip. Currently, the compiler emits these symbolic codes into the code vector, awaiting a processing step to convert them to the decimal equivalent. Ideally, one would detect invalid addressing modes in the compilation stage, not the post-processing stage.&lt;br /&gt;&lt;br /&gt;Some other changes I am contemplating are allowing for symbolic jump destinations, so that object code can be relocated and external labels could be used to relax the restrictions of the current scheme, which requires manually sequencing compilation and storing of addresses.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3455017229724644437?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3455017229724644437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/11/baker-comfy-few-notes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3455017229724644437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3455017229724644437'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/11/baker-comfy-few-notes.html' title='Baker&apos;s COMFY: a few notes'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-955295645247814886</id><published>2007-11-03T21:07:00.000-07:00</published><updated>2011-10-01T04:36:05.126-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Old Macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='ADB adapter'/><category scheme='http://www.blogger.com/atom/ns#' term='MacIvory'/><title type='text'>MacIvory ADB Adapter Protocol</title><content type='html'>Working with ResEdit and DeRez, I believe I have traced out the &lt;a href="http://jaoswald.wordpress.com/symbolics-adb-adapter-mapping/" title="MacIvory ADB Adapter Protocol"&gt;keyboard protocol used by the MacIvory ADB adapter&lt;/a&gt;. My adapter is on the blink, probably because of the small screw I found rattling about inside. I hope DKS can bring it back to life, or the PIC-based project I had begun will make its way back to the front burner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-955295645247814886?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/955295645247814886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/11/macivory-adb-adapter-protocol.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/955295645247814886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/955295645247814886'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/11/macivory-adb-adapter-protocol.html' title='MacIvory ADB Adapter Protocol'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3143474761858181108</id><published>2007-10-09T15:16:00.000-07:00</published><updated>2011-10-01T04:32:24.961-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Symbolics Keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='Old Macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='ADB'/><category scheme='http://www.blogger.com/atom/ns#' term='MacIvory'/><title type='text'>MacIvory Keyboard Support Software</title><content type='html'>The ADB adapter has not just given me some help uncovering the behavior of the Rev. C Symbolics keyboard protocol, but also works when attached to my MacIvory. Along the way (and with the help of David K. Schmidt) I encountered some glitches, mostly stemming from my original accidental trashing of the System file DKS installed.&lt;br /&gt;&lt;br /&gt;There are a few software components the ADB adapter box needs to convert the Symbolics keyboard to something the Mac OS 7.6.1 (including the "FEP" window which communicates to the Ivory board on a low level) will accept as a keyboard with the right keymapping, and furthermore to something the Genera application will recognize with all the Symbolics-specific keys. Without these components, you will see one of the following two stages of malfunction.&lt;br /&gt;&lt;br /&gt;Stage 1:  The mouse connected to the ADB adapter works fine. In the Mac OS (including the FEP window), there is total keyboard confusion, with the keys all scrambled. On the Genera side, things are less scrambled, but some keys are missing, such as "e", "t", "u", and "o"; the "o" in fact causes the Mac menu bar to flash. Modifier keys seem absent. If you activate the keyboard control application, Genera seems to crash easily. &lt;a href="http://groups.google.com/group/cu.slug/msg/5a93881ce4dfd7c6" target="_blank" title="MacIvory keyboard under 7.5.3"&gt;Peter Paine reported this&lt;/a&gt; at the time System 7.5.3 came out.&lt;br /&gt;&lt;br /&gt;If you do a custom install of the "Symbolics Keyboard for System 7" selection in the MacIvory software installer, you get the Symbolics Keyboard extension icon at Mac OS startup, and a Symbolics keyboard layout choice in the Keyboard control panel. The situation improves, reaching&lt;br /&gt;&lt;br /&gt;Stage 2: The alphanumeric keys work for both the Mac OS and for Symbolics. However, Genera treats a press of the "Page" key as a press of the "Line" key, treats "Escape" as "Select", and ignores the \{ and |} keys, the Hyper modifier key, and most of the large function keys (Function, Refresh, Square, Circle, Triangle, Suspend, Resume, Abort,  Network, Local, Select, Line). &lt;a href="http://groups.google.com/group/info.slug/msg/7ffebfc844fe10b7?" target="_blank" title="MacIvory keyboard support under MacOS 7.5"&gt;Kent Pitman reported this&lt;/a&gt; after an upgrade to System 7.5.&lt;br /&gt;&lt;br /&gt;The solution  is to do a full install of the MacIvory support software. I believe this is necessary to get all of the resources installed in the Mac's System file.&lt;br /&gt;&lt;br /&gt;I'll try to gather more details on the resources; it would be nice to understand how to make a box that takes, for instance, a PS/2 keyboard &amp;amp; mouse and connects it to the MacIvory, although the Symbolics keyboards and mice may be more plentiful than than the Ivory boards at this point, so it might be  mere archaeology. More practical, if ADB adapters are scarcer than Ivory boards, would be a combination of the Apple keyboard (which works well enough for MacIvory use) and a three-button PS/2 mouse with a "partial ADB adapter" allowing it to provide multi-button mouse function to Genera.&lt;br /&gt;&lt;br /&gt;UPDATE: I examined the resources, and was able to decode the &lt;a href="http://jaoswald.wordpress.com/symbolics-adb-adapter-mapping/" target="_blank" title="Symbolics ADB Adapter Keyboard Mapping"&gt;Symbolics ADB adapter encoding&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3143474761858181108?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3143474761858181108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/10/macivory-keyboard-support-software.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3143474761858181108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3143474761858181108'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/10/macivory-keyboard-support-software.html' title='MacIvory Keyboard Support Software'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-4058823345145993917</id><published>2007-09-26T03:24:00.000-07:00</published><updated>2011-10-01T04:31:20.641-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Symbolics Keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='Keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC'/><title type='text'>Symbolics Rev. C Keyboard Secrets</title><content type='html'>The ADB adapter has fulfilled its main purpose: providing an example of hardware which can speak to my Rev. C Symbolics keyboard.&lt;br /&gt;&lt;br /&gt;The apparent trick is that the clock pulses must be narrow, without being too rapid (i.e., a relatively low duty cycle.)  A 10 microsecond long low pulse on /CLR, followed 30 microseconds after the beginning of that pulse by the clock going low for roughly 9 microseconds, continuing with a clock period of approximately 50 microseconds does the trick. The ADB adapter pauses somewhat between groups of 11 clock pulses, corresponding to the natural "section breaks" of the keyboard mapping; I don't know if that is strictly necessary. My first crude approximation, using bit-bashing for the PIC with timing loops resulted in Caps Lock and Mode Lock that felt a bit sluggish---needing to be held down relatively long to "lock" or "unlock." The overall cycle time may be important in that regard.&lt;br /&gt;&lt;br /&gt;In any event, I reconstructed the &lt;a href="http://lmkbd.googlecode.com/svn/trunk/symkeys.asm" target="_blank" title="LMKBD symkeys.asm"&gt;keyboard mapping from the LMKBD project&lt;/a&gt;, although I chose to count pulses from zero, rather than n=1 in that listing.&lt;br /&gt;&lt;br /&gt;Unfortunately, this seems to make the PIC EUSART not fit the application: its clock pulses have a symmetric duty cycle. I had hoped to use the serial port intelligence to offload enough of the bit-handling to allow for rapid response that the ADB protocol seems to require. Perhaps I need to look at some of the other peripherals; can I use some pulse-width modulation output to drive the keyboard and the EUSART in synchronous slave mode together?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-4058823345145993917?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/4058823345145993917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/09/symbolics-rev-c-keyboard-secrets.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4058823345145993917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4058823345145993917'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/09/symbolics-rev-c-keyboard-secrets.html' title='Symbolics Rev. C Keyboard Secrets'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-1523611251762932787</id><published>2007-09-24T23:25:00.000-07:00</published><updated>2011-09-25T16:42:01.745-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PIC'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple II'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>Baker's COMFY for the PIC?</title><content type='html'>I encountered Henry G. Baker's COMFY compiler a couple years ago. (&lt;a href="http://home.pipeline.com/~hbaker1/" title="Henry Baker Research Paper Archive" target="_blank"&gt;Baker's site&lt;/a&gt; contains a &lt;a href="http://home.pipeline.com/~hbaker1/sigplannotices/COMFY.TXT" title="COMFY.txt" target="_blank"&gt;text article&lt;/a&gt;, a &lt;a href="http://home.pipeline.com/~hbaker1/sigplannotices/column04.tex.gz" title="COMFY.tex.gz" target="_blank"&gt;TeX format article,&lt;/a&gt; and an &lt;a href="http://home.pipeline.com/~hbaker1/sigplannotices/CFYCMP1.LSP" title="CFYCMP1.LSP" target="_blank"&gt;Emacs Lisp implementation&lt;/a&gt;. The ACM published the two articles &lt;a href="http://doi.acm.org/10.1145/261353.261356" title="COMFY---A comfortable set of control primitives for machine language programming" target="_blank"&gt;COMFY theory&lt;/a&gt; and &lt;a href="http://doi.acm.org/10.1145/270941.270947" title="The COMFY 6502 Compiler" target="_blank"&gt;COMFY-65&lt;/a&gt;) COMFY is not a very high-level language, in the conventional sense, but is an attempt to provide a clean but simple set of control structures on top of conventional machine code. Baker calls it 'medium-level.'&lt;br /&gt;&lt;br /&gt;The resulting compiler is very small; its main task in life is to automate the generation of branch instructions, which is one of the tedious parts of tightly optimizing assembly programs.  Yet it allows as well for arbitrary Lisp-style macros.&lt;br /&gt;&lt;br /&gt;I found the concept intriguing, but I found the article and the compiler code itself rather obscure. Part of the obscurity is the unconventional names for the 6502 operations, unconventional notation for the addressing modes, and decimal numbers for opcodes (because Emacs Lisp does not accept other radixes). Another is that the implementation is lean-and-mean, emitting code bytes directly into a destination vector---the only output to look at is a vector filled with decimal numbers. The manipulations on the 6502 opcodes take advantage of the low-level bit patterns without explanation. Finally, it uses the term 'continuation', which, no matter how many times I think I understand it, scares me, probably because it introduces a highly abstract term into an area like assembly programming which is relentlessly concrete.&lt;br /&gt;&lt;br /&gt;I've been learning about it by going through the code, restructuring a bit as I go. I'm beginning to be impressed by the subtlety of the code.  One thing that is just dawning on me is that the return values of the code-emitting functions is as important as the side-effect. (To those of you chuckling, you see how far I have yet to go.) Lisp can hide that from you when it "looks imperative."&lt;br /&gt;&lt;br /&gt;My longer term goal is to see if the same technique can be fruitful even within the more restrictive limits of the PIC. In order to get there, I'm going to have to gain confidence that I understand the formal concept of the 'win' and 'lose' continuations, which means, I think, having to come up with legible examples that compile to 6502 code, and use that to firm up my understanding of the compiler. Finally, I'll try to code the 'genbrc' routine for PIC branches.&lt;br /&gt;&lt;br /&gt;For the "legible examples" part, I think I will try to break the lean-and-mean single-pass direct-to-binary compiler into a "compile to a vector or list with symbolic 6502 mnemonics" followed by a very simple 6502 assembly pass. A similar enhancement might accumulate a relocation table to allow more flexible linking. (I'm still not used to the idea that the code is emitted starting in high memory and working down.) I've begun abstracting out the addressing mode bit manipulations, and probably will add error-checking to make sure invalid opcodes are not generated by mistake.&lt;br /&gt;&lt;br /&gt;One thing that I think that will have to go in the PIC version is the shallow binding mentioned in the TeX column, but not in the text version; without a stack, I'm not sure where to save anything. I'm also just a bit worried that the PIC has so many idiosyncracies (e.g., register pages controlled by special flags, instead of a uniform zero-page) that even a medium-level language doesn't help much.&lt;br /&gt;&lt;br /&gt;(I should mention in passing Frode Vatvedt Fjeld's &lt;a href="http://www.cs.uit.no/~frodef/sw/picl.lisp" title="Frodef's PIC instruction generation" target="_blank"&gt;nifty little Lisp code&lt;/a&gt; to generate PIC instructions from the bit chart.)&lt;br /&gt;&lt;br /&gt;[UPDATE: I should also mention a &lt;a href="http://www.call-with-current-continuation.org/eggs/sassy.html" title="sassy x86 assembler" target="_blank"&gt;COMFY-based assember for x86, implemented in Scheme, called `Sassy'&lt;/a&gt;, although I have never tried to use it.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-1523611251762932787?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/1523611251762932787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/09/baker-comfy-for-pic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/1523611251762932787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/1523611251762932787'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/09/baker-comfy-for-pic.html' title='Baker&amp;#39;s COMFY for the PIC?'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-1972882378216334769</id><published>2007-09-04T23:14:00.000-07:00</published><updated>2011-10-01T09:00:56.238-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC'/><title type='text'>Symbolics keyboard to PIC, step 1</title><content type='html'>The first step is to connect the Symbolics keyboard to the PIC. I am using the 16F690 which comes with the PICkit 2 starter kit on the low pin count demo board (Microchip DM164120-1). The keyboard cable mates to a 6-pin modular jack (such as Digikey part number 609-1061-ND), which I tacked onto the side of the board. Unfortunately, this mod jack has pin spacings of 50 mil "horizontally" between successive pins, so I bent up the&amp;nbsp;odd pins and soldered the&amp;nbsp;even pins to the demo board.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Mod jack pin&lt;/th&gt;&lt;th&gt;Keyboard function&lt;/th&gt;&lt;th&gt;PIC function&lt;/th&gt;&lt;th&gt;PIC pin marking&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;GND (N/C)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Vdd&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Key Data&lt;/td&gt;&lt;td&gt;RX/DT&lt;/td&gt;&lt;td&gt;RB5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;CLK&lt;/td&gt;&lt;td&gt;TX/CK&lt;/td&gt;&lt;td&gt;RB7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;/CLR&lt;/td&gt;&lt;td&gt;RC5&lt;/td&gt;&lt;td&gt;RC5&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;My first task will be to power up the keyboard, code a scanning loop, and try to detect keystrokes for a single key, such as the Left Control Key, displaying the count of key-down events in binary to the LEDs connected to RC0-RC3. If the keyboard is not debounced by the internal microcontroller, the count will not increment cleanly, but I hope to at least prove that I can talk to the keyboard and make sense of what comes back. I'm not sure how much current the keyboard will need, so I might have to power the demo board with an external supply.&lt;br /&gt;&lt;br /&gt;[UPDATE: It turns out the standard numbering of modular jack pins is the reverse of the pin numbering of the P1 header inside the keyboard. I've corrected the table above to reflect the standard modular jack scheme. Looking into the opening of the jack, with the locking tab down, pin 1 is on the left side.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-1972882378216334769?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/1972882378216334769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/09/symbolics-keyboard-to-pic-step-1.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/1972882378216334769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/1972882378216334769'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/09/symbolics-keyboard-to-pic-step-1.html' title='Symbolics keyboard to PIC, step 1'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-9063728102378293332</id><published>2007-08-27T02:12:00.000-07:00</published><updated>2011-10-01T08:47:17.144-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Old Macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC'/><title type='text'>Learning more about PIC</title><content type='html'>A few comments about the PICkit 2 learning experience.&lt;br /&gt;&lt;br /&gt;There's a slight bit of polish that could be applied to the example code.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;A few redundant instructions, such as&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Extraneous operations setting register pages&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In A-to-D examples, the data sheet seems to say the 5 microsecond settling time is needed only when changing the input source, not for every conversion, as in the examples&lt;/li&gt;&lt;br /&gt;&lt;li&gt;For the 5 microsecond interval, a few of those microseconds are covered by the non-NOP instructions before the conversions&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In one of the variable-speed rotating bits examples, the carry flag is not explicitly cleared when it needs to be clear. When I modified the example to change the sign of the pot setting-to-delay conversion, I would sometimes set the carry, putting extra bits into the display. Took me a good fifteen minutes to debug that.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I think a few extra instructions are wasted using the W register and an explicit move to the file register when the file register destination could be used instead&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I also got bitten by the issue mentioned briefly in the PICkit 2 release note: if you program the examples from the IDE, the IDE forces the line controlled by the push-button low, meaning the push-button examples fail to work, unless you program the device from the dedicated programming application and the .HEX file produced by the IDE.&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;I am slightly disappointed that&lt;/strike&gt; there &lt;strike&gt;doesn't&lt;/strike&gt; seem to be any visible progress getting the PICkit 2 with version 2 firmware to work under Mac OS X.&lt;br /&gt;&lt;br /&gt;Also, &lt;strike&gt;I find a real lack of documentation of the PICkit 2 "Debug Express" support for in-circuit debugging. This may be because Microchip doesn't want to undercut sales of the MPIDE 2 hardware. I think, however,&lt;/strike&gt; one can use a combination of the AC162061 (containing an ICD version of the 16F690) and AC164110 (to convert the ICSP six-pin interface to the modular plug used by the usual ICD interface) to do in-circuit debugging of 16F690 applications with the PICkit 2, at an additional cost of about $50.&lt;br /&gt;&lt;br /&gt;I've started sketching out some ideas for interfacing the Symbolics keyboard on a &lt;a href="http://jaoswald.blogspot.com/p/pic-based-symbolics-keyboard-adapter.html"&gt;dedicated page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[UPDATE: Microchip does, after all, document the &lt;a href="http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en023805" target="_blank" title="PICkit 2 debugging hardware"&gt;PICkit 2 Debug Express hardware requirements&lt;/a&gt; (scroll down a bit to see what I missed before.) I ordered the combination even before I found the document, and when the backorder is filled, I will be giving it a try myself.]&lt;br /&gt;&lt;br /&gt;[UPDATE: Jeff Post &lt;a href="http://groups.google.com/group/pickit-devel/t/2a0571f3085d3f5b" target="_blank" title="Pickit-devel newsgroup post"&gt;announced&lt;/a&gt; that he releasing &lt;a href="http://home.pacbell.net/theposts/picmicro/pk2-3.00-alpha12.tar.gz" title="PK2-3.00-Alpha12"&gt;alpha code&lt;/a&gt; supporting v2 firmware for the&lt;a href="http://home.pacbell.net/theposts/picmicro/" target="_blank" title="Jeff Post's PIC micro page"&gt; PICkit 2 on Linux/Mac OS X&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-9063728102378293332?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/9063728102378293332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/08/learning-more-about-pic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/9063728102378293332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/9063728102378293332'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/08/learning-more-about-pic.html' title='Learning more about PIC'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-6170727891058012688</id><published>2007-08-21T22:40:00.000-07:00</published><updated>2011-09-25T18:44:39.370-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microchip'/><category scheme='http://www.blogger.com/atom/ns#' term='Old Macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='PIC'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbolics 3600'/><category scheme='http://www.blogger.com/atom/ns#' term='PICkit 2'/><category scheme='http://www.blogger.com/atom/ns#' term='keyboard converter'/><title type='text'>Making lights blink...</title><content type='html'>My latest diversion is a Microchip PICkit2. The idea is to make something that can understand the Symbolics keyboard I have, and then connect that something to other things that can speak Apple Desktop Bus (ADB), PS/2 keyboard protocol, or USB, in roughly that order. If I can make something that takes a multi-button PS/2 mouse and a Symbolics keyboard and connects both to a MacIvory, I could be set for beautiful three-button mousing and classic keyboarding on my Lisp Machine.&lt;br /&gt;&lt;br /&gt;I've mostly traced out the schematic of my Rev. C Symbolics slim-line keyboard (thank god for simple two-layer boards!). Rev. C has LED's in the Caps Lock and Mode Lock keys, in contrast to &lt;a href="http://www.asl.dsl.pipex.com/symbolics/photos/IO/inside-keyboard.html" title="Inside Keyboard"&gt;this picture of the similar Symbolics Rev. B keyboard&lt;/a&gt;. Compared to the &lt;a href="http://lmkbd.googlecode.com/files/Symbolics3600Keyboard.png" title="LMKBD Googlecode project keyboard schematic" target="_blank"&gt;Symbolics 3600 keyboard schematic&lt;/a&gt;, mine is roughly similar, but unfortunately has a 40-pin microcontroller (an Intel 8749H, a member of the MCS-48 family) soldered in. I am certain I could make something work with the simple protocol the 3600 keyboard apparently implements, but if the microcontroller does anything beyond driving the LEDs on and off based on simply counting the corresponding keystrokes, I might be sunk.  I've fired off a few questions to people who can hopefully tell me that all of these are plug- and wire-compatible.&lt;br /&gt;&lt;br /&gt;As for the 3600, it is pretty obviously a matter of pulling the reset line low to clear the counters, and clocking through the other 127 counter states to read off the switch matrix closures on the 16 X by 8 Y (I surmise that high on the output would mean the corresponding key is down.)  I'm not sure how frequently I have to collect the bits to avoid missing keypresses, and what debouncing I might have to do.&lt;br /&gt;&lt;br /&gt;The strange thing about my Rev C is that the ICs driving what I guess is the X direction are a pair of 74145  devices with what the datasheet claims are open-collector outputs, and the IC connected to what I guess is the the Y direction is a 7442 with conventional TTL outputs. That seems to mean that scanning an X column with a pressed key causes an open-collector pulling low to compete with the TTL high output on the Y row, except when the Y scan tests that line with a TTL low. What good that does is a mystery. That, and I haven't finished tracing out the part of the circuit with an LM319 comparator. The 3600 schematic drives the X columns (one low, the rest high) and muxes the Y rows (driving ordinary inputs through any pressed keys) to the readout.&lt;br /&gt;&lt;br /&gt;[UPDATE: Seems that the keyboard protocol should be identical, so I'm going to forge ahead with the plan, and assume the circuit knows how to work itself.]&lt;br /&gt;&lt;br /&gt;[UPDATE 2: fixed the link to the online 3600 schematic.]&lt;br /&gt;&lt;br /&gt;[UPDATE 3: I probably should have given more explicit acknowledgment for the inspiration of the project. If I had not seen &lt;a href="http://www.asciilifeform.com/" title="asciilifeform's blog" target="_blank"&gt;asciilifeform&lt;/a&gt;'s schematic revealing the simplicity of the protocol, I'm sure I would have been far less tempted to start this project.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-6170727891058012688?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/6170727891058012688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/08/making-lights-blink.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/6170727891058012688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/6170727891058012688'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/08/making-lights-blink.html' title='Making lights blink...'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-4194263553750548346</id><published>2007-08-08T13:32:00.000-07:00</published><updated>2011-09-25T10:30:39.166-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='Old Macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><title type='text'>MacIvory speaks!</title><content type='html'>I've only had a bit of time to play with my MacIvory, but already things are getting interesting.&lt;br /&gt;&lt;br /&gt;One is getting used to the system administration style: typical UNIX system configuration resides in text files, and the boot process reads them. Genera is different. The state of the system is contained in the memory image ("world"); you change it through various operations---some interactive, some by loading Lisp files---and preserve it by saving a new world as a file, which can be defined incrementally based on an existing world. The boot process involves loading that saved file back into the living Lisp machine. I haven't yet developed the sense to complete a block of tasks before saving the world, and how much change pushes one from incremental to a complete world.&lt;br /&gt;&lt;br /&gt;Another was getting the network to speak, and part of that is the timewarp of working in Mac OS 7, an era in which Mac networking was going through the introduction of Open Transport, and an AppleTalk era which Mac OS X refuses to acknowledge. Luckily, I've got a PowerBook G3 that runs Mac OS 9. My first ethernet card didn't work, either because I screwed up some software setting or because the hardware was bad. (More embarrassing disclosure later.) DKS sent me a replacement, which worked immediately. I've only got ChaosNet configured on the MacIvory side at this point, and my ChaosNet work isn't up-to-date on my Powerbook, so I've only seen raw ethernet packets in tcpdump, but my archaeology is already progressing---documentation to follow soon, as well as getting some Python software (with libpcap or Mac OS X kernel packet filters?) to respond to Chaos-formatted Ethernet packets.&lt;br /&gt;&lt;br /&gt;As for the embarrasing disclosure, one of the first things I did was try to set the video card to a mode not supported by my Sony Multisync 15sf monitor. Instead of waiting for the change to timeout and revert, I hit Esc or Command-. or some other key which confirmed the change, leaving me with a blank screen. I tried various reboot, PRAM zapping, or magic key sequences to force the Radius Precision Color 24X to a good mode, but none of that worked, and at some point I screwed up the system. Once I hooked up the Dell 2007fp that understood 1152x870, I saw the floppy-with-blinking-question-mark. Recovery without a working network card involved the ancient hassles of multiple-floppy installs.&lt;br /&gt;&lt;br /&gt;I have a Kensington ADB multi-button mouse, but all the drivers I have downloaded are either for Mac OS 8 or cause serious bugginess: system freezes or error -192 when launching the configuration application. I hope I don't have to roll my own software to get multi-button goodness to work with the Ivory. (At this date, few vendors pay much attention to 68k Macintosh support.)&lt;br /&gt;&lt;br /&gt;UPDATE: I've captured a bit of the tcpdump results in my &lt;a href="http://jaoswald.blogspot.com/p/chaosnet-information.html" target="_blank" title="ChaosNET information"&gt;ChaosNET information page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-4194263553750548346?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/4194263553750548346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/08/macivory-speaks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4194263553750548346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4194263553750548346'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/08/macivory-speaks.html' title='MacIvory speaks!'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-8392724603554748551</id><published>2007-07-11T17:03:00.000-07:00</published><updated>2011-09-24T23:00:38.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>Ordering a Lisp machine</title><content type='html'>Just sent off the Paypal payment for a MacIvory II system with 2.6 MW of memory. I'm hoping also to get a Symbolics keyboard, although Symbolics is apparently out of the ADB box that allows the keyboard to be used with the vintage Macs.&lt;br /&gt;&lt;br /&gt;It was a tough call whether to splurge for this or, for about twice the money, a new MacBook Pro. I'm hoping the Symbolics machine will be much more entertaining.&lt;br /&gt;&lt;br /&gt;My main idea of a project is to use the Lisp Machine as a Chaos FILE host, in order to allow development on the CADR simulator with a versioned file system, without having to simulate and learn ITS or TOPS-20.&amp;nbsp; To get that to work, I probably will need to do a little bit of investigation to understand how the Symbolics box gets configured to talk on the network, what Chaos packets look like on the Ethernet, how to get those to my Python/Lisp code on the modern machine, and, for data security what would be needed to talk to a CD-ROM drive on a remote computer, or to use a remote computer to do backups (to a simulated tape drive?).&amp;nbsp; In order to get 2.6 MW of NuBus memory, I had to choose a Mac config without a CD-ROM drive, and I'm not too excited about trying to get an external SCSI drive for this old machine. Backing up to floppies is another thing I don't want to relive.&lt;br /&gt;&lt;br /&gt;Some other things I'm looking forward to are Zmail, Concordia (to generate HTML output, anyone?) and Document Examiner,&amp;nbsp; using CLIM, and grokking the Symbolics compiler(s).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-8392724603554748551?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/8392724603554748551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/07/ordering-lisp-machine.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8392724603554748551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8392724603554748551'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/07/ordering-lisp-machine.html' title='Ordering a Lisp machine'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-6099116608904960948</id><published>2007-03-13T11:37:00.000-07:00</published><updated>2011-10-01T04:29:28.662-07:00</updated><title type='text'>My non-blog web site</title><content type='html'>I should mention my &lt;a href="http://josephoswald.nfshost.com/" title="My main home page"&gt;non-blog site&lt;/a&gt;, which exists pretty much to hold information for recruiters who want to get some idea of my software experience. Don't expect much exciting there. I am, by the way, currently and happily employed, but am interested in opportunities in the New York City metropolitan area.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-6099116608904960948?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/6099116608904960948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/03/my-non-blog-web-site.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/6099116608904960948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/6099116608904960948'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/03/my-non-blog-web-site.html' title='My non-blog web site'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-2100483064695873566</id><published>2007-02-05T12:30:00.000-08:00</published><updated>2011-09-24T22:59:47.674-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='PDP-10'/><category scheme='http://www.blogger.com/atom/ns#' term='ITS'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>ChaosNET and Python</title><content type='html'>My blogging has been much less frequent of late, mostly because of an unfortunate abundance of non-computer issues. Despite those, I believe I have made some progress in my Chaosnet-on-OpenMCL work, but I've switched most of my hobby-development to Python, mostly to get in touch with trends outside the Lisp Universe.&lt;br /&gt;&lt;br /&gt;My current main project circulates around ChaosNET emulation; the main thing going for Python here is a socket interface that is roughly compatible between UNIX-like and Windows operating systems. Lisp can support that as well, but not for my favorite and familiar implementations. (One thing I hope to try before I get through this is to get an asyncore-like framework set up in CLISP.)&lt;br /&gt;&lt;br /&gt;So far, I have implemented a `chaosd' process in Python that simulates multiple ChaosNET `ethers' in the form of localhost TCP streams (on Windows or UNIX-like) or UNIX-domain sockets (on UNIX-like); each stream corresponds to a subnet. The idea has manifold goals:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Allow the usim CADR simulator to communicate on Windows with minimal alterations using Winsock in place of BSD sockets (Done) (Brad Parker's server, however, works with forking and other UNIXisms that would require more work)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Allow separation between local activity and activity exposed or connected to the wider Internet&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Provide 'masquerade' and 'network translation' bridges, to flexibly map external resources, such as an ITS or TOPS-20 simulator into something that appears to be a local network. (The translation here is necessary because ChaosNET is a LAN architecture; outside resources might have their own incompatible scheme of subnetting and addressing. These translating gateways would allow me to place external UDP-responding resources into arbitrary Chaos addresses in my local scheme, without requiring any change on the external resource.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Eventually, provide small modular `gateway' simulators that appear to be ChaosNET resources on a local subnet, but translate to external services such as AOL Instant Messenger or IRC.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Recreate `historically accurate' network organizations for amusement&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If I ever break down and get a real Symbolics machine, I expect it to be able to speak Chaos over IP or raw Ethernet; I would like some way to connect that to multiple simulators on a single Mac or PC&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;As a step in this direction, I have implemented a stream-to-UDP masquerade, that automatically takes traffic on a local `ether' for a particular address and feeds it over UDP using Bjorn Victor's protocol. Running this on two machines, I am able (mostly) to allow a Lisp machine simulator on my Linux box and another on my Windows box to both believe they are on a single Chaosnet LAN, and to communicate with one another. The next step is to get something like a local ITS or TOPS-20 simulator running in KLH-10 on Linux supporting Bjorn's UDP protocol (or possibly Bjorn's machine) to provide FILE service and e-mail service to my Lisp machine simulators on either machine. I have been learning to recompile ITS, with mixed success. My initial impressions on Python in another post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-2100483064695873566?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/2100483064695873566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2007/02/chaosnet-and-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/2100483064695873566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/2100483064695873566'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2007/02/chaosnet-and-python.html' title='ChaosNET and Python'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3543292333440235135</id><published>2006-08-07T14:56:00.000-07:00</published><updated>2011-09-25T18:40:59.772-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Dell 2007FP and xorg.conf</title><content type='html'>In order to better serve those folks Googling "2007FP xorg.conf", I've included an annotated &lt;a title="Xorg.conf for Dell 2007FP" target="_blank" href="http://voltaire.nfshost.com/transfer/xorg.conf"&gt;xorg.conf&lt;/a&gt; file that seems to work well for me and my Dell 2007FP monitor. I hope it helps you. (It is, naturally, provided "as is", without warranty of any kind, etc., etc., because it could very well damage your hardware, although nowadays monitors are much more forgiving than they once were.)&lt;br /&gt;&lt;br /&gt;(It seems from my site logs that my venting about my adventures with Linux, xorg.conf, and the 2007FP is one of the more popular Google hits for my site now, just one day after it was posted.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3543292333440235135?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3543292333440235135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/08/dell-2007fp-and-xorgconf.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3543292333440235135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3543292333440235135'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/08/dell-2007fp-and-xorgconf.html' title='Dell 2007FP and xorg.conf'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-2831641019642000038</id><published>2006-08-02T16:28:00.000-07:00</published><updated>2011-09-25T18:42:00.112-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Venting about Linux</title><content type='html'>Time for a "Linux is not ready for the desktop" rant.&lt;br /&gt;&lt;br /&gt;Some time ago, I picked up a Slackware 10.1 4-disc set. I've been trying to use it on a Dell Precision 610 MT workstation, Xeon Pentium III. (That's what you can read on the label.) Through some struggling through the initial start up screens, I was able to determine the box has two SCSI internal drives. I also have a Dell 2007FP monitor (pretty nice).&lt;br /&gt;&lt;br /&gt;Getting X to come up in something other than 1024x768 was an ordeal. Perhaps I should have realized that no amount of so-called "handholding" was going to help me, and gone to the xorg.conf man page directly. Silly me, I thought this would be like a normal desktop environment, where I would open something called something like a "control panel" and find a sub-thingy labelled "Display" (KDE buries this under Peripheral) and select the 1600x1200 resolution my display claims to support. No. Only 1024x768 or worse.&lt;br /&gt;&lt;br /&gt;So I go to slackware.com; the FAQ is skeletally brief. It talks about xorgsetup (must run as root, not just using "su" but "su -"), which dumps a uselessly generic xorg.conf file in /etc/X11. xorgconfig asks me to answer vague questions about my mouse and keyboard EVERY time, and scroll through long lists of video cards, none of which is a close match to what the Dell startup screeen says: "Diamond Viper V770D 32MB" It asks me for refresh rates, but doesn't allow me to specify that "at 1600x1200, this monitor only allows 60 Hz vertical refresh". The slackware page config/x.php says something vague about "run X -probeonly" but "startx" seems only to feed its arguments to xterm, then puke when xterm does not accept it. I cycle through various efforts, copying the result to /etc/X11/xorg.conf, and get a blank screen with the monitor complaining "frequency out of range: use 1600x1200@60Hz."&lt;br /&gt;&lt;br /&gt;A search through the the &lt;a href="http://www.tldp.org/HOWTO/Hardware-HOWTO/video.html" title="Linux Documentation Project Hardware-HOWTO"&gt;Video HOWTO&lt;/a&gt; for Diamond Viper 770 shows me RIVATNT2 XF86_SVGA and nv.&lt;br /&gt;&lt;br /&gt;Finally, I break down and edit xorg.conf by hand. It takes a while but I start to realize that various identifiers (described just as "free form" by xorgconf, actually are used to refer to various entities in later descriptions. I hand edit my xorg.conf to indicate my "Monitor" can HorizSync at 30-82, only VertRefresh at 60 Hz, my "Device" has driver "nv", and my "Screen" is that Mointor, Device, with Modes "1600x1200" "1280x1024", etc.&lt;br /&gt;&lt;br /&gt;Finally. It seems to work.&lt;br /&gt;&lt;br /&gt;Next up, try to get USB flash memory key to be recognized, without following directions which tell me to use the SCSI /dev/sda files that are, ahem, being used for my SCSI hard disks.&lt;br /&gt;&lt;br /&gt;[UPDATE: Fixed the link to the Linux Hardware-HOWTO video section.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-2831641019642000038?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/2831641019642000038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/08/venting-about-linux.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/2831641019642000038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/2831641019642000038'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/08/venting-about-linux.html' title='Venting about Linux'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-2959290867240963791</id><published>2006-08-01T15:59:00.000-07:00</published><updated>2011-09-25T16:37:42.198-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TeX'/><category scheme='http://www.blogger.com/atom/ns#' term='Fortran'/><title type='text'>Clive Page’s Free Fortran 77 guide</title><content type='html'>&lt;a title="Clive G. Page" href="http://www.star.le.ac.uk/~cgp"&gt;Clive G. Page&lt;/a&gt;'s &lt;a title="prof77.tex" href="http://programming.ccp14.ac.uk/fortran-resources/~cgp/prof77.tex"&gt;Professional Programmer's Guide to Fortran 77&lt;/a&gt; is available under the Gnu Free Documentation License. I suppose this means I should dig up my texinfo translation of his LaTeX, which I did a number of years ago, merge in his more recent changes, and release it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-2959290867240963791?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/2959290867240963791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/08/clive-pages-free-fortran-77-guide.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/2959290867240963791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/2959290867240963791'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/08/clive-pages-free-fortran-77-guide.html' title='Clive Page’s Free Fortran 77 guide'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3440484784212734835</id><published>2006-07-31T10:39:00.000-07:00</published><updated>2011-09-24T22:58:50.702-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><title type='text'>More adventures in multithreading</title><content type='html'>Just wanted to capture a few more thoughts; over the weekend, I experienced what I think was my first case of deadlock. My chaosnet-on-OpenMCL implementation had worked just fine when the two sides of a connection were careful to exchange only one packet at a time, taking turns. When I tried to listen to a SEND (the Lisp machine analogue to an instant message), the CADR emulator sent two packets in quick succession, and my OpenMCL process would freeze trying to receive it.&lt;br /&gt;&lt;br /&gt;As an aside, I get the feeling that I don't really know how to debug this kind of thing in OpenMCL: looking at backtraces does not always make it completely obvious which semaphore or lock is being waited for in the various threads, and I don't think it is possible to look at semaphores to see which thread(s) are waiting.&lt;br /&gt;&lt;br /&gt;In any case, I concluded that my somewhat haphazard use of a "count lock" to protect access to packet number information in a connection was either being used recursively, or violating a lock heirarchy. So, after some time trying to apply my powers of deduction, I decided to look at the ChaosNET problem from a high level to determine what locking is actually necessary.&lt;br /&gt;&lt;br /&gt;The main complexity has to do with the transmission window. In theory, it seems like an ideal case for a counting semaphore: the send window is a limited resource, and sending processes must wait until a spot within the window is available. (Generally, one would wish to preserve FIFO order, but strictly speaking, multiple threads trying to transmit on the same channel might not deserve any guarantees that their packets will happen in any particular order.)&lt;br /&gt;&lt;br /&gt;&lt;em&gt;However&lt;/em&gt;, there are several things unusual about the window: the thread handling incoming packets can get both acknowledgements in ordinary packets, as the receiving user process consumes packets from the window, and in STS packets that could, at any time &lt;em&gt;resize&lt;/em&gt; the window. In the usual semaphore model, it is not easy to deterministically reduce the maximum level of the semaphore. I coded an unsatisfactory approach which does a trial-wait-on-semaphore for the number of window packets that have been taken away. But these might not succeed, if the window is filled above the new capacity. In that case, the window must presumably be allowed to drain below the new level before any waiting process gets allowed to put packets in. It might be possible to have a separate integer variable tracking the "excess window consumption," and for processes to loop back and wait again for the semaphore if the window has been "tightened" since they first waited. I don't know if it is possible for threads to maintain their original FIFO order in this case, or whether it matters. (I'm not sure it is reasonable for Chaos processes to reduce the window, once it is declared in the initial STS negotiating the connection, as opposed to widening it to allow for better throughput. The AIM memo is silent on this.)&lt;br /&gt;&lt;br /&gt;Interestingly, the draft chaosnet memo does discuss enlarging and shrinking the window, and mentions WIN and WTS packets.&lt;br /&gt;&lt;br /&gt;In terms of avoiding deadlock, there are many participants: the user reading process looks at the window to see if the connection might be getting "stymied", and needs an STS to be transmitted. When STS or acknowledgements come in, the retransmission of the receipted or acknowledged packets should be suppressed, and the acknowledgements (but not receipts) open up space in the window. In the Lisp Machine design, the receive-sts et al. use the RECEIPT function to trim the send-pkts list. I felt that contending with the sending/retransmitting process was asking for trouble. Therefore, I chose to have the retransmission process look at the receipt and acknowledgement status to clean up the send-pkts while it needs exclusive access to the send-pkts list anyway. The retransmission process needs access to the send-pkts list to retransmit, and to the counters if it is required to do clean up. Furthermore, updates of the acknowledgement and receipt states should rachet only forward, i.e., a stale packet coming through the pipe should not erase the acknowledgement or receipting indicated by the logically latest packet received up to this point. That requires locking to protect the read-modify-write update of those status numbers.&lt;br /&gt;&lt;br /&gt;One interesting gap in the ChaosNET documentation is whether retransmitted packets can or should update their acknowledgement and receipt information to reflect what has happened to the connection in the meantime. The Lisp Machine implementation seems to retransmit the packet byte-for-byte. An alternative would be to update those packets. In practice, I suspect retransmission should be conservative; it is necessary when the receiving process has fallen behind, or the channel is experiencing loss, and the bias should be toward more retransmission than strictly necessary, instead of hoping to "make up for lost time" by advancing the state of the return channel.&lt;br /&gt;&lt;br /&gt;I have created enough of a system to work with the SEND transaction, except for one detail: in a Chaos "stream", my functions indicate an EOF condition only when the request for a byte has gone "off the end." I felt the EOF detection should predict whether the next byte request should succeed; but I could not remember how this works elsewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3440484784212734835?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3440484784212734835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/07/more-adventures-in-multithreading.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3440484784212734835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3440484784212734835'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/07/more-adventures-in-multithreading.html' title='More adventures in multithreading'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-8338659135238759275</id><published>2006-07-25T10:11:00.000-07:00</published><updated>2011-09-25T16:41:24.119-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple II'/><title type='text'>Apple II Disk Transfer</title><content type='html'>It seems that others have also had the desire to upgrade the ADT (Apple Disk Transfer) tool to work with disks other than the Disk II 5-1/4 inch floppy format under DOS 3.3.&lt;br /&gt;&lt;br /&gt;&lt;a title="ADTPro" href="http://adtpro.sourceforge.net/"&gt;ADTPro&lt;/a&gt; is a ProDOS-based version of ADT. It should presumably work with all block devices recognized by ProDOS. I e-mailed some code to David Schmidt which allowed ADT to work with the ordinary IIgs serial ports; direct access to the Z8530 chip might allow for faster transfers; that's a potential project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-8338659135238759275?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/8338659135238759275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/07/apple-ii-disk-transfer.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8338659135238759275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8338659135238759275'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/07/apple-ii-disk-transfer.html' title='Apple II Disk Transfer'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3124568634468865798</id><published>2006-07-19T09:44:00.000-07:00</published><updated>2011-09-24T23:44:58.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='Multi-threading'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><title type='text'>More thinking about multithreaded queueing</title><content type='html'>Looking back on my previous post about multithreaded queues, and based on a little hacking I was able to do last night on my multithreaded-Lisp-user-mode-Chaos-client, and having read a bit more in the Little Book of Semaphores, (must stop typing 'sempahores'!), in particular the turnstile pattern, and the barbershop problem, there are a few other ways to slice the onion.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;A "waiting room", i.e., the privilege of blocking on the queue is exclusive. That actually makes a certain amount of sense when, for instance, Chaos packets are already sorted by the destination connection. Does it really make sense for multiple consumers to be concurrently transacting on a single connection? What would make sense, in a C10k kind of way, is rapidly generating server connections in response to RFCs, and handing these connections to waiting server threads. Or, if a connection is known to have independent incoming packets, or is deliberately recycled, connections can queue through a turnstile, each take one incoming packet, then go off to chew on it. I think the mechanism could be a simple lock.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;"Signal enough" can be expanded to include a "turnstile" approach, where a disappointed consumer signals the semaphore on his way "out" so that the next waiting consumer can be disappointed as well. The idea that the reason for the disappointment should be visible to incoming consumers before they block is really optional. The main reason to prefer it is that, if we believe the "disappointment" is permanent, that we will eventually want to discard the queue, but we presumably cannot do so if consumers can continue to block. That is, if the disposal process must race against the arrival of new consumers. Discarding a queue when the semaphore still indicates the presence of (non-existent) packets and no threads are waiting is OK. Discarding a queue when the semaphore indicates no packets, but threads are blocking requires a well-defined mechanism for blocking threads to cleanly deal with a "killed" semaphore. I.e. the "abort" mechanism.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I really like the Little Book of Semaphores. However, I find it hard to be sure that I truly grasp the concepts. I can read through the solutions to the problems, and understand the discussion, but that doesn't give me a huge amount of confidence in my own solutions to slight variations on the problem. Maybe this kind of programming is simply hard.&lt;br /&gt;&lt;br /&gt;I've tried casting some of the solutions in OpenMCL Common Lisp. It's hard to verify that things don't work by accident. One thing that wasn't particularly clear to me is whether it is kosher to do things like&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(let ((semaphore (ccl:make-semaphore)))&lt;br /&gt;   (labels ((client-function () #|...|#)&lt;br /&gt;             (server-function () #|...|#))&lt;br /&gt;      (let ((thread1 (ccl:process-run-function #'client-function))&lt;br /&gt;             (thread2 (ccl:process-run-function #'server-function)))&lt;br /&gt;         (#|...some way to wait for both threads to terminate..|#))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It seems to work, except I haven't yet tried to make a clean "wait for both threads to terminate", and have just waited for the length of a global list to get to a certain point, or similar kludges. The idea, however, that the let can create "global" variables, but the lambdas can have "thread-local" storage, seems not to be formally specified.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3124568634468865798?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3124568634468865798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/07/more-thinking-about-multithreaded.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3124568634468865798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3124568634468865798'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/07/more-thinking-about-multithreaded.html' title='More thinking about multithreaded queueing'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-8601187550709078761</id><published>2006-06-27T22:32:00.000-07:00</published><updated>2011-09-25T16:39:13.682-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='TeX'/><title type='text'>Some old thoughts about TeX</title><content type='html'>I saw a link on reddit the other day regarding some math-related videos, including a &lt;a title="Don Knuth 'other' lectures" href="http://scpd.stanford.edu/scpd/students/Dam_ui/pages/ArchivedVideoList56K.asp?Include=knuthOther"&gt;series of lectures by Don Knuth&lt;/a&gt;, including some on TeX internals. (One frustrating bit about the Web video is the blurriness of his terminal. Another is that he uses what is now a slightly-out-of-date version of TeX itself).&lt;br /&gt;&lt;br /&gt;He made a comment near the beginning of section 3, probably similar to things he has written, to the effect that in his education he had benefited both from reading badly-written programs, because they were evidence he could do better, and from well-written programs, because they were a pleasure to read. He then wondered aloud which category TeX is in, but that either way it was a win. I'm not at all sure myself. Perhaps TeX is a monument to the best that can be done in Pascal, and simultaneously a warning that it is the best that can be done in Pascal.&lt;br /&gt;&lt;br /&gt;I had a definite feeling during grad school, when I was learning LaTeX to write my thesis, and learning Lisp on the side, that a large chunk of TeX internals was spent managing things that manage themselves in Lisp&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Dynamic memory (including variable-length strings and reference-counted objects)&lt;/li&gt;&lt;li&gt;Interned static strings (i.e. symbols)&lt;/li&gt;&lt;li&gt;Rational arithmetic protected from overflow and portable between machines&lt;/li&gt;&lt;li&gt;Heterogeneous lists&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Knuth also spent a good deal of time, however, fretting about the "inner loop" of TeX, so perhaps re-implementing it in a higher-level language would incur a performance penalty of large constant factors in the runtime of TeX.&lt;br /&gt;&lt;br /&gt;I spent a few odd hours with &lt;em&gt;TeX, The Program&lt;/em&gt;, coding a few bits in Lisp, as well as beginning a few sketches that could serve as commentary. (One of the most grievous flaws in &lt;em&gt;TeX, The Program&lt;/em&gt; is its utter lack of diagrams, apart from the rough memory map on the back flyleaf.) The main topic of the commentary was to sketch memory structures and the overall memory map in diagram form.&lt;br /&gt;&lt;br /&gt;Another grievous flaw I saw, perhaps related to the efficiency concerns, was the monolithic architecture. He speaks of TeX's eyes and mouth and digestive tract, but the WEB presentation blurs this all together; as far as I could tell with my limited reading the TeX syntax is processed directly into lower level memory structures without any clear documentation of how those memory structures should be thought of as logical constructs. That is, there is no &lt;strong&gt;higher order&lt;/strong&gt; description of how TeX should behave in the code, simply procedures to take TeX and produce almost raw bytes, and then slurp up those raw bytes into DVI output, with certain very carefully designed algorithms for math layout and paragraph breaking hidden inside.&lt;br /&gt;&lt;br /&gt;Knuth's approach to the lack of abstraction in the Pascal expression is to add English prose, both in the WEB format of the code, and in the &lt;em&gt;TeXbook&lt;/em&gt;'s user documentation, but not to present a more abstract, formal, or diagrammatic description of the architecture. (He does describe some small algorithms in more precise ways, such as the DVI optimizations using &lt;em&gt;down_ptr&lt;/em&gt; and &lt;em&gt;right_ptr&lt;/em&gt;.) I would hope to replace this by an elegant Lisp description of the underlying structures and algorithms, leaving the messy hand-made arithmetic and memory management off to the side as part of the unfortunate need to run on 1982-era platforms. But I get the nagging feeling that the whole design of TeX the language and the data structures and the algorithms is just one big ball of mud that will resist such analysis.&lt;br /&gt;&lt;br /&gt;I am slightly annoyed by the use of numerical coincidence (e.g. using the numerical ordering and grouping of an enumeration to simplify some decision logic) and a few related hidden limits (must get my copy of &lt;em&gt;TeX, The Program&lt;/em&gt; to see where I wrote one in the margin). Seems rather too low-level for someone trying to present things clearly.&lt;br /&gt;&lt;br /&gt;Another one of my past TeX-related projects was to try to get a from-scratch Pascal-based WEB system producing TeX on Mac OS X, so that I could really understand the WEB code, e.g. by enhancing the TeX internal debugger, instead of simply using a Web2c translation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-8601187550709078761?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/8601187550709078761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/06/some-old-thoughts-about-tex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8601187550709078761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8601187550709078761'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/06/some-old-thoughts-about-tex.html' title='Some old thoughts about TeX'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-4028324315391401570</id><published>2006-02-23T11:42:00.000-08:00</published><updated>2011-09-24T22:56:46.097-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='PDP-10'/><category scheme='http://www.blogger.com/atom/ns#' term='ITS'/><title type='text'>link dump for 22 Feb 2006</title><content type='html'>A bunch of stuff I was reading back then&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.haible.de/bruno/papers/cs/weak/WeakDatastructures-writeup.html"&gt;Weak Data Structures&lt;/a&gt; write-up by Bruno Haible, courtesy of &lt;a href="http://www.metabang.com/unclog/publisha/thatssow.html"&gt;Gary King&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The classic &lt;a href="http://www.simson.net/ref/ugh.pdf"&gt;UNIX HATERS Handbook.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Panda's &lt;a href="http://panda.com/tops-20/"&gt;TOPS-20&lt;/a&gt; System.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sparetimegizmos.com/Store.htm"&gt;Spare Time Gizmos&lt;/a&gt; store front to buy actual hardware emulators of the PDP-8.&lt;br /&gt;&lt;a href="http://lists.tunes.org/archives/lispos/1997-May/000379.html"&gt;Rainer Joswig e-mail on feel of old Symbolics Lisp Machines&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;An e-mail discussion about &lt;a href="http://www-mice.cs.ucl.ac.uk/multimedia/misc/tcp_ip/8602.mm.www/0363.html"&gt;CHAOS vs. TCP in port collisions, a list of Symbolics CHAOS services&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://72.14.207.104/search?q=cache:rJBY6jMcvrUJ:www.mahalito.net/mirrors/Lisp/chaosnet/195.197.252.78/%25257Eazure/tmp/chaos/cmd/AAREADME+chaos+qfile&amp;amp;hl=en&amp;amp;gl=us&amp;amp;ct=clnk&amp;amp;cd=10"&gt;Google cache of mahalito&lt;/a&gt;&lt;br /&gt;&lt;a href="http://starfish.rcsri.org/rcs/Symbolics/Technology/og2y2k.text"&gt;Symbolics Y2K statement&lt;/a&gt;&lt;br /&gt;&lt;a href="http://its.svensson.org/hack;"&gt;ITS site HACK directory&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Google Groups discussion on &lt;a href="http://groups.google.com/group/comp.protocols.tcp-ip/browse_frm/thread/1e240d4aeee03ea/8dbb10e2126c64d8?lnk=st&amp;amp;q=chaosnet&amp;amp;rnum=5#8dbb10e2126c64d8"&gt;Basic Chaosnet information&lt;/a&gt;&lt;br /&gt;Google Groups discussion on &lt;a href="http://groups.google.com/group/comp.protocols.tcp-ip/browse_frm/thread/3eaa40a39e041272/541237440d0f5990?lnk=st&amp;amp;q=chaosnet&amp;amp;rnum=20#541237440d0f5990" title="Chaosnet and ARP"&gt;Chaosnet and ARP&lt;/a&gt;&lt;br /&gt;Google Groups discussion on &lt;a href="http://groups.google.com/group/alt.folklore.computers/browse_frm/thread/51f225bdcde6cbe4/288fd8a8f787bcd4?lnk=st&amp;amp;q=chaosnet&amp;amp;rnum=4#288fd8a8f787bcd4"&gt;Transmitting Chaosnet over Ethernet&lt;/a&gt;&lt;br /&gt;Google Groups discussion on &lt;a href="http://groups.google.com/group/alt.folklore.computers/browse_frm/thread/52d1b06c8c90490/4beaf7c525aa2a6e?lnk=st&amp;amp;q=chaosnet&amp;amp;rnum=1#4beaf7c525aa2a6e"&gt;Why Chaosnet (nostalgia)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/groups?q=chaosnet&amp;amp;start=20&amp;amp;ie=UTF-8"&gt;Google groups search for chaosnet&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;ITS build information &lt;a href="http://www.cosmic.com/u/mirian/its/files/build.doc.txt"&gt;build.doc.txt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.36bit.org/dec/"&gt;36bit.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.brouhaha.com/~eric/retrocomputing/pdp-10/"&gt;Retro PDP-10&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-4028324315391401570?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/4028324315391401570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/02/link-dump-for-22-feb-2006.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4028324315391401570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/4028324315391401570'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/02/link-dump-for-22-feb-2006.html' title='link dump for 22 Feb 2006'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-8044271557665011404</id><published>2006-02-16T12:03:00.000-08:00</published><updated>2011-09-24T22:55:51.162-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='PDP-10'/><category scheme='http://www.blogger.com/atom/ns#' term='ITS'/><title type='text'>Some ITS links</title><content type='html'>Wanted to collect a few links on ITS, the &lt;a href="http://en.wikipedia.org/wiki/Incompatible_Timesharing_System" title="Wikipedia ITS link"&gt;Incompatible Time-Sharing System&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The ITS 1.5 &lt;a href="http://www.sigfs.org/its-reference/its-reference-1.5.html" title="ITS 1.5 Reference Manual"&gt;Reference Manual&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Bjorn Victor's &lt;a href="http://victor.se/bjorn/its/luser.php" title="Luser's Guide to ITS"&gt;Luser's Guide&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Bjorn Victor's &lt;a href="http://victor.se/bjorn/its/mail-setup.php" title="An ITS e-mail setup"&gt;e-mail setup&lt;/a&gt; (perhaps useful information for Lispm Zmail setup)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The &lt;a href="http://klh10.trailing-edge.com/" title="KLH10 PDP-10 emulator"&gt;KLH10&lt;/a&gt; PDP-10 emulator&lt;/li&gt;&lt;br /&gt;&lt;li&gt;More information on &lt;a href="http://www.aracnet.com/~healyzh/pdp10emu.html" title="PDP-10 emulation"&gt;PDP-10 emulation&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The &lt;a href="http://www.its.os.org/" title="ITS machine dumps"&gt;www.its.os.org&lt;/a&gt; archive of AI &amp;amp; MC&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Paul Svensson's &lt;a href="http://its.svensson.org/" title="SV ITS system"&gt;ITS system&lt;/a&gt; on the Web&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-8044271557665011404?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/8044271557665011404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/02/some-its-links.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8044271557665011404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8044271557665011404'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/02/some-its-links.html' title='Some ITS links'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-3554432822548678594</id><published>2006-02-14T07:21:00.000-08:00</published><updated>2011-09-24T15:37:52.171-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><title type='text'>Some ChaosNET thoughts</title><content type='html'>I looked a little more closely at &lt;a href="http://www.victor.se/bjorn/" title="Bjorn Victor"&gt;Bjorn Victor's&lt;/a&gt; (TODO: add diacritic to o in Bjorn) work on Chaos emulation for ITS emulators, particularly the CHUDP protocol for passing Chaos packets through UDP.&lt;br /&gt;&lt;br /&gt;Apparently, it uses a simple header (different from the user-mode UNIX header), and dynamically adds to its routing table when it receives incoming packets. This seems particularly handy.&lt;br /&gt;&lt;br /&gt;Also, I noticed that the chaosd/server code for the user-mode UNIX implementation does not typically check the hardware destination, but jumps right to the software header for the destination information. This seems wrong.&lt;br /&gt;&lt;br /&gt;I'm trying to figure out the most useful way to improve the Chaos support. Some of the use cases would be&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;use Internet hosts as repositories for CADR Lisp Machine microcode and "world" bands&lt;/li&gt;&lt;br /&gt;&lt;li&gt;use Internet hosts as file servers for Lisp machine source code&lt;/li&gt;&lt;br /&gt;&lt;li&gt;provide Internet-based early-21st-century substitutes for 1980's functionality, such as e-mail and instant messaging (e.g. get Zmail to use Google's Gmail service, use Jabber or AIM to support instant SEND messages, use NTP to provide TIME service)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Some of these would simply be a local process posing as a Chaos server which could respond to various contact names with useful functionality, configured by various users to, e.g., use the instant messaging protocol or e-mail provider of choice. Some of this would require or allow collaboration between nostalgists: someone volunteers, similar to the ITS community, to host the equivalent of AI, and provide ITS-like FILE service on an IP address &amp;amp; port, with a corresponding Chaos subnet/host address.&lt;br /&gt;&lt;br /&gt;I suppose part of my problem is I don't understand all the issues involved in internetworking. Chaos addresses were supposed to be roughly "institution-wide" with specific gateways to other networks, advertised by response to a particular Chaos contact name (such as ARPA). How does this translate to isolated hosts on the Internet posing as institutions with Chaos servers? Can we replace it with a DNS-mediated free-for-all where various IP-based users advertise Chaos DNS entries? How would subnets be allocated? Or will we depend on strictly local, handmade routing tables, where each chaos address gets mapped to an IP host &amp;amp; port? In this case, how do the Chaos source and destination addresses get fixed up when they make it to the IP host &amp;amp; port? Can the sender and receiver basically hide their respective internal Chaos subnetting schemes from each other?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-3554432822548678594?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/3554432822548678594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/02/some-chaosnet-thoughts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3554432822548678594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/3554432822548678594'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/02/some-chaosnet-thoughts.html' title='Some ChaosNET thoughts'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-7957963420047788786</id><published>2006-02-08T23:57:00.000-08:00</published><updated>2011-09-24T15:27:12.122-07:00</updated><title type='text'>What’s in a name?</title><content type='html'>I started this blog with a perfectly cryptic name: "wpblog." I suppose it is a natural impulse shared by many people who download WordPress and are faced with a blank box. I spent an additional minute on the issue today, and decided this was a blog about "getting down to brass tacks." Hence, my current name "BrassTacks." I'm not sure how good Google is at measuring the "uniqueness" of this sort of thing. "Voltaire" as the web host was a nod to my previous blog impulse left unfulfilled at blogger.com, when I was hoping to develop a vicious talent for satire. The name alone proved ineffective, but easy to remember.&lt;br/&gt;&lt;br/&gt;It turns out I have a few good names stored up; one is a nom de guerre, which, for security reasons, I will keep secret. I also have here a good name for an instrumental group: "The Cooper Brass Choir." Properly euphonious. If you have a good enough name for a techie blog, you may have it in exchange.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-7957963420047788786?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/7957963420047788786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/02/whats-in-name.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/7957963420047788786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/7957963420047788786'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/02/whats-in-name.html' title='What’s in a name?'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8850919192497134094.post-8671691608775313168</id><published>2006-01-29T18:39:00.000-08:00</published><updated>2011-09-24T15:28:46.623-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chaosnet'/><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple II'/><title type='text'>What is this about</title><content type='html'>This blog is a simple experiment for now, to understand what is available for a "scratchpad on the Web."&lt;br /&gt;&lt;br /&gt;I have a picture which is something more like a lab notebook for my various hacking projects. The requirements are roughly&lt;br /&gt;&lt;ul&gt;&lt;li&gt;access from various places where hacking might happen; an idea for a project can happen at work, but I don't want my personal laptop with me at all times.&lt;/li&gt;&lt;li&gt;some kind of permanence, as suits a lab notebook. Various things this might mean:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;version control with timestamping&lt;/li&gt;&lt;li&gt;no revisions allowed at all (this seems extreme: one wants to separate a polished presentation view from the underlying archival lab notebook. One can revise slides for a talk without altering the historical record of the lab notebook)&lt;/li&gt;&lt;li&gt;ability to archive into a big .tgz for burning to disk as necessary&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;flexible project documentation&lt;br /&gt;&lt;ul&gt;&lt;li&gt;easy way to archive associated files; diffs, error messages, screen shots, sketches, links, data sheets downloaded for the web.&lt;/li&gt;&lt;li&gt;perhaps I need to wait for my copy of Kanare's &lt;a href="http://www.oup.com/us/catalog/general/subject/Chemistry/AnalyticalChemistry/?view=usa&amp;amp;ci=0841209332"&gt;Writing the Laboratory Notebook&lt;/a&gt; (&lt;a href="http://lispmeister.com/blog/books/writing-the-laboratory-notebook.html"&gt;as seen on Lispmeister&lt;/a&gt;) to arrive to understand what should be required here.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Some projects to comment on here&lt;br /&gt;&lt;ul&gt;&lt;li&gt;work on &lt;a href="http://www.unlambda.com/" title="CADR emulator"&gt;CADR emulator&lt;/a&gt; and &lt;a href="http://www.unlambda.com/mit/index.html" title="MIT Lisp Machine code"&gt;MIT-released Lisp machine code&lt;/a&gt;&lt;ul&gt;&lt;li&gt;make it work on Mac OS X/PPC for my laptop&lt;/li&gt;&lt;li&gt;make &lt;a href="http://voltaire.nfshost.com/code/wordpress/blog/?page_id=3" title="CHAOS"&gt;Chaos&lt;/a&gt; emulation work on Mac OS X&lt;/li&gt;&lt;li&gt;fix some Y2K-type issues, site configuration&lt;/li&gt;&lt;li&gt;create Chaos layer in OpenMCL or more portable Common Lisp, to develop gateways to things like&lt;/li&gt;&lt;ul&gt;&lt;li&gt;AIM/Jabber&lt;/li&gt;&lt;li&gt;regular e-mail&lt;/li&gt;&lt;li&gt;other retro people running Chaos emulation&lt;/li&gt;&lt;li&gt;support versioning file system semantics (e.g. blah.type~version~) on a UNIX FILE host.&lt;/li&gt;&lt;li&gt;build a world from the MIT-provided code, alllowing bootstrap&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Apple II file transfer (extend ADT = Apple Disk Transfer) to include 140k, 800k ProDOS and Macintosh HFS floppy formats&lt;/li&gt;&lt;li&gt;Possibly, an Apple II compatible USB peripheral interface, to allow easy transfers to a Mac/PC with USB connection&lt;/li&gt;&lt;li&gt;Mac OS X support for foot-pedal shift &amp;amp; mouse-click operations&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Interesting that [for Wordpress] Netscape 7 on Windows gives me little editing widgets on my post that Safari on Mac OS 10.4 didn't give me (as I recall.) Perhaps I should check, try to add that capability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8850919192497134094-8671691608775313168?l=jaoswald.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jaoswald.blogspot.com/feeds/8671691608775313168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jaoswald.blogspot.com/2006/01/what-is-this-about.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8671691608775313168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8850919192497134094/posts/default/8671691608775313168'/><link rel='alternate' type='text/html' href='http://jaoswald.blogspot.com/2006/01/what-is-this-about.html' title='What is this about'/><author><name>Joseph Oswald</name><uri>http://www.blogger.com/profile/05114626327747438550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
