Thursday, April 14, 2016

1213486160 or 1347703880

As a public service, I would like to remind everyone that 1213486160 == 0x48545450 is 'HTTP' as a 32-bit integer on a big-endian machine using ASCII or UTF-8. 1347703880 = 0x50545448 would be 'HTTP' in little-endian 32-bit format. Neither is likely to be a packet length.

Monday, January 21, 2013

Converting ITS documentation

I've been playing around a bit more with the Incompatible Timesharing System (ITS). I figured out enough networking on my Mac to be able to use the Java Supdup terminal application to interact with KLH-10 simulating the KS10 architecture.

As part of my study, I have also been converting some INFO files to Texinfo, starting the with the file (slow link to ITS system) INFO;DDT > which Bjorn Victor converted to an HTML version: DDT Primer). I like Texinfo because it can (theoretically) print nice looking books for an ebook reader like my new Kindle Paperwhite, as well as Info compatible for Emacs navigation, and HTML.

Actually distributing these files is problematic. ITS generally seems to have operated with a pretty free notion of distribution: send a magnetic tape to pretty much anyone with a PDP-10 who asked, without executing any kind of explicit license agreement, or even having copyright notices on the text. Anyone with access to the system could take it upon themselves to edit these files. It is pretty much impossible to tell who wrote or collaborated on these files, at what time, for whom they were working, and what their employer (mostly the AI Lab at MIT) agreed to allow. Some of these files were electronic versions of AI memos and other MIT publications.

MIT apparently released a fraction of the ITS code (not enough to actually use, and without the documents) under GPL, but fuller distributions have been made informally, probably originating with the former operators of the ITS systems. Some initial versions of these dumps had a bunch of personal e-mail files and the personal data in the user data base, and later versions were scrubbed of most of this information. Even these scrubbed versions are generally unavailable, though this may be from negligence in the web hosting rather than the result of a legal takedown request.

Technically speaking, the ebook conversions are still a bit messy: I am using dbtoepub (a Ruby script converting Docbook to EPUB, and a 'texinfo-to-mobi' shell script which invokes makeinfo, dbtoepub, and Amazon's kindlegen binary to create a Kindle document. I have issues with the Table of Contents, Chapter headings for untitled chapters, and links from the index not navigating to the ideal place. I also found Emacs Info doesn't like it if I use a UTF-8 multibyte character: it seems to improperly count by characters where makeinfo counted by bytes.

I am using UTF-8 to provide a (SAIL-style?) lozenge rendering of "Altmode." Altmode is ASCII code ESC (27 decimal, 33 octal, 0x1B hex), although sometimes it is octal 175; it seems ASCII and terminals changed what they meant. Much of the time, Altmode echoes as a dollar sign $. In Supdup (see RFC 734), octal 4033 is apparently the ◊ lozenge character, and *that* can be used to echo Altmode. I like the lozenge better; it definitely stands out in Courier-style script more than $ does. Unicode denotes this as U+25CA. The TeX side of Texinfo doesn't really "get" Unicode, or even very much "funny characters," but I was able to find a TeX macro in plain.tex for \diamond that I could hack into my texinfo document and my conversion tools translated this to Unicode acceptably.

The "keystroke" index is a bit funky: it doesn't like my altmode characters. Metavariable notation using <var> is not supported by the semantic markup: info would show it as VAR, which I think is a really bad choice when all the other command keys are in upper case. Likewise for Control characters; I'd like ^Z, etc., to look nice, and be semantically understood for indexing, but not use C-Z or C-z notation. I'd like to be able to specify initial Texinfo variable settings from the command line (so that I could say 'makeinfo --altmodechar=$' or '--altmodechar=\033' to render my Info files in other ways), but I can only specify boolean flags that way.

Thursday, December 13, 2012

Basic ITS hacking

OK, so ITS has only one level of directory in its file system, otherwise known as the SNAME portion of a filename.

How do you create a directory if there isn't one already? For instance, if you login as an unknown user JAO and ITS complains it can't find MD:USERS1;LOGIN JAO, and Emacs won't let you create a file USERS1;LOGIN JAO because USERS1; doesn't exist, what do you do?

I expected there to be a DDT command to create a directory. But there isn't one. I found a cryptic comment to "look at the documentation for the OPEN UUO." So I did. Examining SYSDOC;_CALLS.124
The file names  ..NEW. (UDIR)  cause a new directory
to be created with the given sname if none already
exists.  Creating a directory in this way causes a
message to be printed on the system console.
(A directory is destroyed only when the disks are
salvaged by the stand-alone salvager, which is generally
run just before the time-sharing system is restarted.
A directory is then destroyed iff it contains no files.) 
I.e., a magic file name which, if opened, causes a new SNAME to be created. I used Emacs Find File: ^X^F USERS1; DSK: ..NEW. (UDIR) (note that Emacs is a bit scrambled in how it presents file names) but you probably should do something simpler like asking DDT to
TODO: Document here what I did for PWORD, PANDA

Still to puzzle out: what to do with INQUIR and how to simulate ACOUNT if I have already logged in as the user.

Getting KLH-10 and ITS to work under Mac OS X

I've cycled back to being interested in the Incompatible Timesharing System (ITS). In the interim, I replaced my G4 iBook with a Intel-based MacBookPro. With a bit of hacking, I was actually able to get local networking to communicate with the simulated PDP-10, and thought I would record some of the details.

I needed to
  • Install tuntaposx. I used the macports version.
  • Crudely hack the ks-base-its build in klh10-2.0h from panda-dist (and additional patches) to define KLH10_NET_TUN=1 under Mac OS X. I need to clean up my own sources and put them up on github. Also, I needed to hack around the removal of "mtio.h" from Mac OS X 10.6, borrowing the minimum definitions from FreeBSD headers. I guess Apple decided they really didn't want tape drives connected to their machines. Maybe it is still in OS X server?
  • There are a few rough edges in tun/tap support. Following a hint I found online, I open a bash shell as root, and execute
    • exec 4<> /dev/tap0 # create the interface by opening the device
    • ifconfig tap0 # .100.110 is the address for the KLH10, 200.105 is the host Mac OS X network address
  • In KLH10, configure dpimp parameters to open the tap interface address
    • devdef imp  ub3   lhdh   addr=767600 br=6 vec=250 ipaddr= gwaddr= debug=0 ifc=tun0 dpdebug=0 dedic=true doarp=true
  • Boot ITS using the MD image, built to expect as the IMP address and dumped.
    • set the value of the environment variable KLH10_HOME
    • cd ${KLH10_HOME}
    • ./kn10-ks klh10-md.ini
  • Once ITS is up From another shell, I can then 
    • telnet
    • :TCTYP vt52 # convince ITS I am not using a hardcopy terminal
  • Using the Java supdup client from Bjorn Victor's site, can can
    • File > Connect
I'm still a bit foggy on what dpimp is doing with /dev/(tap|tun)0 and arp commands. The arp seems to fail, but the network still is up. It isn't accessible to other computers on my LAN, although (surprise!) my Mac OS X firewall seems to have been turned off. Ignoring for now that ITS is a dangerously trusting Internet host, I think it should be possible for ITS itself to respond to ARP. What I don't understand yet is whether tap/tun will show the ARP requests from other machines to ITS, whether ITS knows how to reply to them, or whether I need to get the Mac OS X network stack to either route external packets for .100.110 to appear on the tap interface, broadcast that routing information, or reply to ARP requests on behalf the the ITS machine.

What I really want is a chapter suitable for inclusion in Steven's TCP/IP networking book that explains tun/tap and how networking with virtual machines can work. The existing documentation for these kinds of things tends to be "here's a script that works" and not solid explanations.

Friday, December 23, 2011

Restoring the Heathkit Jr 35

Heathkit Jr Electronic Workshop "35", Model JK-18

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).
Corroded battery holder
Replacement battery holder mounted
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.
The remote speaker station

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.
Relay with the brown rubber foot
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.

I ran through the tests in the manual appendix to check out the lamp, power switch, speaker, earphone, antenna coil continuity, remote station speaker & telegraph key, slide switch, and relay.

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.

Saturday, October 1, 2011

Heathkit Jr. 35

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 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.

I was a bit surprised to find all four transistors in the kit are identical. Thanks to this Heathkit part cross-reference, I see that they are part 417-118, a.k.a. 2N3393 NPN transistors.

Saturday, September 24, 2011

Importing from

I'm working on importing my blog from 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.

I used the export feature to create an XML file, and used the tool to convert it, as I was under the 1 MB size limit. The code behind that converter is evidently at

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.

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.