Saturday, December 5, 2020

A Small Detour: PDP-11 Rescue!

(I do have some new MDP-1000 information, I do, really.  There's even some at the end of this post.  So read on!)

Sometimes you gotta do something stupid for your hobby.  Like, really, really stupid.  This is one of those times. Back in October, a post appeared on the Vintage Computer Forums:


In case it's not clear from the text, a collector in Silicon Valley was looking to part with a pile of PDP-11 systems that had been in a fire many years ago.  Here's a couple of larger pictures:


What we have here are two of the more interesting (and desirable) blinkenlights PDP-11 systems:  A PDP-11/70 and a PDP-11/45.  Unfortunately, neither of them looked to be in particularly great condition -- the 11/45 in particular looked like it spent some time in a blast furnace.  My first thought was that these systems were a lost cause.

But.

But but but.

The 11/70 is on my short list of "Computers I Just Gotta Have" but they're rare enough, and sought out enough in the collector community that finding one for a price I can afford seems almost an impossibility.  (The 11/45 is a really nice computer, too.)

Hmm.

Despite their condition, I was intrigued, and so I reached out to the seller who informed me that I was the only one who'd contacted him, which I still find very surprising.  I don't live in California but I have a friend who lives near the seller, and he kindly offered to go out and take some more detailed pictures so I could more accurately assess the condition of the systems.  

And wouldn't you know it, things didn't look so bad on the inside:  Here's a few shots of the innards of the 11/70:





Filthy, yes.  Melted?  Not so much.  Except for those fans at the top there, where the plastic fan blades kind of became liquid and dripped down on everything below them.

Melty!

Apart from the melted front panel and fans, the thing looked totally fine.  Backplane clean, wirewrap undamaged, power supplies present, CPU board set complete.  And more interestingly, take a closer look at the cards in the card cage in that first picture there.  Those of you keen of eye and well-versed in PDP-11/70 lore might notice the "Setasi" label on the boards on the left-hand side.  That's an aftermarket boardset -- the Setasi Hypercache + PEP70, which replaces the original memory and cache of the PDP-11/70 system.  It gives the system a full 4MB of memory, and that memory runs at the speed of the 11/70's cache.  It's a rare upgrade, and aside from making the system faster, it's really useful:  normally the 11/70's memory resided in an external rack and took up multiple cabinets with their own large power supplies.  The PEP70 provides an entire 4MB of memory on a single board!  Here's another view of those boards:

Oh yeah.  That's the stuff right there.

Well, that's tantalizing, for sure.  But what about the 11/45?



It's a bit more rough.  In that top picture you can see that in addition to the front panel being melted away, the power distribution wiring harness is completely toast.  And there's not much paint left on the thing and rust has taken its place.  But again, the boards are all there and look to be in decent nick (apart from a slightly melted handle on that M9301 Bootstrap Terminator there in front).  And miraculously the backplane looks to be completely unharmed, apart from some charred detritus stuck in the wirewrap pins.  It seems like the metal of the chassis and the power supplies shielded the processor from the brunt of the heat.

Needless to say I decided to take the plunge.  I had already been planning a trip to the bay area to pick up some other items and to help out a friend with a Xerox Alto restoration, why not add a couple of rusty racks worth of slightly melted PDP-11 gear to the haul?  I struck a deal with the seller, and the first weekend in November I rented a cargo van and drove 14 hours from Seattle, WA to Cambpell, CA.  

All told, that weekend I picked up the two PDP-11s, a Three Rivers PERQ 1A workstation, two General Automation SPC-12 minicomputers, a Symbolics 3620 workstation, a pile of Symbolics and TI Explorer documentation and parts, and two Unibus memory cabinets that might have been a part of C.mmp at one point.

Oh, and a replacement front panel for the 11/70, kindly sold to me at a very reasonable price by a good friend of mine:

Is there anything more beautiful?

Then I got in the van and drove back.

Over the past couple of weeks I've been slowly going over the two PDP-11 systems, preparing a plan to tackle their restorations.  I've decided to start with the 11/70 since it's the cleaner (and more exciting) of the two systems.  The rack has been lightly sanded down and cleaned, so it's no longer covered in a gritty layer of rust and soot and melted plastic, and the same process has been started for the processor chassis.  Once spring rolls around I plan to repaint the rack and the chassis, but for now I just want them clean enough so that my hands don't get filthy when I work on them.

The next step is to clean the backplane and the boards and then tackle restoring and testing the power supplies.  I've ordered a ton of isopropyl alcohol for cleaning the backplane slots, and once it arrives the cleaning can commence.

What about the MDP-1000, huh?

Sure, sure.  Recall that I mentioned picking up a couple of SPC-12s in my California haul?  Well, here they are!


As I mentioned in my last post, the MDP-1000 is a rebadged/repackaged SPC-12.  Now I have the original to hack on as well!  And I have some documentation for these!  More information in my next post, I swear!

Until next time!





Monday, October 19, 2020

The Motorola MDP-1000

So having found myself gainfully employed again after a rather stressful hiatus over the summer, I decided to reward myself and splurge on this sexy bit of kit:

The Motorola MDP-1000 Minicomputer

Prior to this showing up on eBay, I wasn't even aware that Motorola had ever made a minicomputer (more on that later), but there it was.  I knew I had to have it.  It arrived last week and I've been digging into the system and trying to find out more about its history.  Unfortunately not much is out there, so I thought that it would be a perfect subject to write about here so that the majesty of the MDP-1000 might be more widely shared with the world.  Also, what else am I going to do with myself late on a Sunday evening?

The Hardware

The MDP-1000 was introduced in late 1968 or early 1969 and is built from discrete TTL and DTL chips.  It was apparently manufactured by Motorola's Instrumentation and Control Systems Division in Phoenix, Arizona, and was intended for real-time industrial control applications.  It's a strange little machine: It's nominally a 12-bit computer -- the instruction word, registers and ALU are all 12 bits wide -- but the memory is only 8 bits wide.  Instructions normally occupy two bytes (16 bits) in memory but there's a special "shared-byte" encoding which allows certain classes of instructions to share their second byte, by taking it from a pool of 64 bytes in memory.  This allows a more compact encoding of instructions, at the expense of making things more complicated to understand and disassemble.  Oh, and that 12-bit ALU?  The carry bit comes out of bit 7, not bit 11.  The system includes a current loop serial interface that has to be read in manually, one bit at a time, with software reassembling the bits into bytes.  It has an interrupt system, but it has to be polled.  This thing is weird.  I've never seen anything quite like this computer in my voyages through the bowels of computing history.

The MDP-1000 can address up to 16K of core memory.  Like the PDP-8, only 4K are directly addressable at a time due to the 12-bit registers, but there's a 3-bit wide extended memory register that swaps out the top 2K of the memory space.  A variety of I/O devices were available, from the typical teletype interface to relay controllers and analog-to-digital converters.

I know only a little about the history of this specific specimen of the MDP-1000.  The seller was kind enough to share what he knew about it.  It was bought by the Saskatchewan Research Council in the late 1960s or early 1970s, and was being disposed of in the 90's when the seller acquired it.  There is an article on page 36 of the December 1969 issue of Computers and Automation magazine mentioning an MDP-1000 being used for glacial surveys in Canada -- it's entirely possible the article is talking about the same computer I have on my bench right now.

The only detailed picture of an MDP-1000 I've found -- from the System Description manual

 The system I have isn't actually an MDP-1000: it's a ruggedized version of the MDP-1000, designated on the rear as an MDP-6650.  The chassis is quite tall, but only about a foot deep, whereas the original MDP-1000 was about 5 inches tall and 21 inches deep.  All the boards in the 6650 are approximately 17"x15", and covered in conformal coating.  I assume the MDP-1000 had similar internals, repackaged.  The power supplies for both were external.

MDP-1000 CPU Board

As mentioned before, the system is made from TTL and DTL chips, manufactured by TI and marked with house numbers, making identification a challenge.  What on earth is an SN4812 or SN6392?  The only Motorola ICs are on the core memory board, used as part of the sense amps for the core planes.  These too have strange in-house part numbers (SC5330) that defy my attempts to identify.  Debugging and repairing this system is going to be a big challenge, so my hope is that there's not too much wrong with it.



MDP-1000 Core Memory board (4K)




The Plot Thickens

My purchase included a three-ring binder full of documentation but no detailed information on the hardware.  No schematics for the logic or wiring diagrams for the power supply connector on the rear of the chassis.  I put the word out in the usual places but there were no bites.

Searches on the Internet yielded some interesting articles and ads in early computer magazines but nothing more.  Until I stumbled on this Usenet post.  In the middle of what I assume was a scintillating and incredibly informative and productive discussion about the relative advantages of the Motorola 68000 versus the Intel 8086, there was this comment:

For that matter what was a "Motorola machine" in the relevant time period, an MDP-1000, a.k.a. a rebadged General Automation SPC-12? I see zero architectural similarity between the MC6800 and the MDP-1000 except that they both used 8 bit wide memory systems.

Holy cow, the poster was right!  The MDP-1000 was clearly an SPC-12 in slightly different duds, as was easily confirmed by a trip to good ol' Bitsavers:

A stack of SPC-12s!

 

Interesting that Motorola chose to rebadge the SPC-12 for their Control Systems Division.  Try as I might, I haven't been able to find any information detailing a partnership or agreement between General Automation and Motorola.  As far as system documentation goes, There's a bit more information out there on the SPC-12 than there is for the MDP-1000, I even found a program for it written as part of a Master's thesis done at Texas Tech: "Interpreter for the SPC-12 General Automation Computer. (This, apart from the paper tape bootstrap loader remains the only bit of software I've found for the system.)

Alas, still no schematics.  But I did find another collector who has a couple of SPC-12s, and he's posted some nice pictures of the internals.  Here's the CPU board from an SPC-12:


Look at all familiar?  It's not 100% identical to the CPU in the MDP-1000, but it's close.  And best of all, the ICs have normal part designations on them, so I can use these pictures as a cross-reference for the house numbers on the MDP-1000's boards.  (Turns out an SN4812 is a straight-up SN7400 chip.)  Not too bad.

Power Supply

The system itself was fairly clean.  Musty, but clean.  A bit of soap and water on the backplane at the bottom of the chassis (bottomplane?) that had accrued a bit of dirt and dust and the occasional dead insect, followed by some drying and rigorous application of contact cleaner and scotchbrite brought it back to service:

MDP-1000 backplane prior to cleaning.  Note the grody tin-plated contacts.  Gross.

The next order of business was to figure out how to power the MDP-1000 up.  The MDP's power supply was external and was not included with the system, having been lost long ago.  I had a few clues as to the system's needs for power: +5V at 5A, and +/-15V at 3.6A would do the trick.  As to how that power got into the system, I was on my own.

As you can see on the above photos, there's a row of colored test points for the power supply on the right-hand side.  These made it relatively easy to figure out how the power supply was meant to be wired up.  The edge connector on the lower right is the power connector and it was a simple matter to beep the connections out with my multimeter, leaving only a few mysterious signals on the connector not directly related to power.  One pair went off to the relay you see on the left side, in the middle.  The others went off to the logic on the top-middle of the board.  I suspect the relay is related to power sequencing and the logic is related to the line-time clock hardware, but these are just guesses at this time.

I had a reasonable +5V supply on hand already.  I went on eBay and I found a suitable Lambda supply for the +/-15V, and I ordered up a 24-conductor card edge connector for the wiring.  The parts arrived in a week or so and I cobbled this monstrosity together:

Cobbled together power supply.  Lambda on the right.

And the first power-up was a success, no smoke or anything.  The front panel was responsive, though many of the switches did not behave reliably -- they will need some cleaning.  No response from the memory, however.  But that's a task for another day...



Wednesday, July 1, 2020

On the closing of Living Computers: Museum+Labs

As you might have heard, Living Computers: Museum+Labs has shut down; its doors will remain closed for at least the next twelve to eighteen months, and the staff is off to find new adventures.

I have had the honor of being an engineer at LCM+L for the last five years and I am still struggling to come to terms with this -- I've had time to let the shock settle in since I heard the news a month ago and I am still unable to really grasp the finality of the situation.  I don't know how to say goodbye.

These past few weeks I have been working on-site at the museum, helping to shut things down in an orderly fashion.  It feels like I'm preparing to bury a close friend, building an ornate wooden box, polishing it, lining it and driving the nails in.  Digging a hole.  Preparing some final words.  

And it really is a living, breathing entity that we're saying goodbye to; this museum is an undertaking that spans decades and has involved the blood, sweat, and tears of every person that has worked here.  It encompasses the souls and dreams and ideas of dozens of dedicated individuals -- educators, engineers, guest services, archivists, curators and benefactors. This museum that we built together has touched many thousands of lives across the world and each of them in turn has added something of their own.  It is meaningful, and it is important.

It hurts to let go, to bury all of this.  

I helped shut the big systems down on Monday with the rest of the engineering staff.  I have never heard the computer room this quiet before.  I'd be lying if I didn't shed a tear when turning Rosencrantz (the VAX, running perpetually for a decade) off, wondering when it would run again. 

Every artifact I look at as I wander through the rows of computers in the museum's basement brings back memories, or a longing for potential now out of reach.  I remember some of the first things I did after joining the team -- restoring the Interdata 7/32 and getting Wollongong V6 UNIX running for the first time and being able to share that with the world was really something else.  Working on the Alto emulator, I found myself chatting with legends from Xerox PARC, an experience that will be tough to top.  In the months before we closed, we all worked together to get V0 UNIX running on our restored PDP-7 and in so doing brought some truly important history back to life.  

I almost got over my fear of public speaking doing our engineering gallery talks and I came to realize that I actually enjoyed it.  I loved chatting with visitors, and the enthusiasm they all had for the place was amazing.  

We all did some amazing things here.  We all have so many stories and memories.  We all have so much to be proud of.

I want to thank all the wonderful folks I worked with at LCM.  This has been the greatest job I've ever had and that's due in no small part to the people I shared it with.  I will miss you all.  I also want to thank everyone who came to visit the museum over these many years -- thank you for letting us share it with you.  I have met so many new people, shared so many stories and have learned so many extremely cool things and I will never, ever forget it.  

Today was my last day.  At 5:45pm I walked out of the doors of the museum for the last time.  The hurt is still here in my heart as I write this but I know things will get better and that I will be able to move on. 

And someday, I hope, the museum will live again.

.KJOB
.

Wednesday, June 17, 2020

At Home With Josh Part 8: Lisp System Installation

In our last installment our intrepid adventurer had gotten the Interphase 2181 SMD controller running again, and had used it to do a low-level format of a gigantic 160mb Fujitsu hard drive. This left him with all the ingredients needed to put together a running LMI Lambda system, at least in theory.

Tapes and Tape Drives

I had intended to wait until I’d found the proper 9-track tape drive for the system before attempting to go through the installation process. As you might recall, the Qualstar drive I have on the system is functional but extremely slow; it takes several minutes to find and load tiny diagnostic programs from tape. As system installation requires copying 20-30 megabytes from tape (i.e. a lot of data), it seemed to me that doing an installation from the Qualstar would simply take too long to be practical.

But on the other hand, the drive was functional and it occurred to me that possibly it was just the SDU “tar” utility’s simplicity that might be causing the extremely slow transfer rate: if it was overly conservative in its reads from tape, on an unbuffered drive like the Qualstar it might end up being very inefficient. Maybe the “load” tool would be a bit more intelligent in its tape handling. Or perhaps not — but there’s no harm in trying, right? And while I’d tracked down a proper Cipher F880 tape drive, it would require waiting until the current quarantine was lifted to go and pick it up. I demanded instant gratification so off I went. Except…

Shiny new 9-track tapes!
Ok, they’re still twenty years old.
That’s pretty new!
The other pressing issue was one of tapes. I have a small pile of blank (or otherwise unimportant) 9-track tapes here at home but all of them were showing signs of shedding and none of them worked well enough for me to write out a complete Lambda Install tape. Despite a few cleaning passes, eventually enough oxide would shed off the tape to gum up the heads and cause errors. Clearly I would need to find some better tapes, so I hit up eBay and found a stack of 5 tapes, new-old stock (apparently from NASA). And waited patiently for them to arrive.

[About a week passes…]

The Actual Installation

With new tapes in hand I was finally able to write out the “Install” tape without errors. And thus, with my fingers crossed and a rabbit’s foot in my pocket I started the installation process. The “load” utility is used to set up new hard disks and can copy files to and from tape to do installation and maintenance tasks. Here’s a transcription of the operation:

SDU Monitor version 102 >> disksetup What kind of disk do you have? Select one of { eagle cdc-515 t-302 micro-169 cdc-9766 }: micro-169 >> /tar/load using 220K in slot 9 load version 307 (creating block-22 mini-label) (creating mini-label) Disk is micro-169 Loading "/tar/bigtape" Loading "/tar/st2181" Disk unit 0 needs to be initialized: Disk has no label, or mini-label is wrong. Create new unit 0 label from scratch? (y/n) y Creating lisp label from scratch. How many LAMBDA processors: 1 Type "?" for command list. load >

The initial steps above tell the SDU that I have a “micro-169″ disk (the 8-inch equivalent of the giant 14” Fujitsu I actually have installed). This is necessary to allow the load program to know the characteristics of the system’s disk. /tar/load is then executed and since it finds an empty disk, it sets up the disk’s label, the LMI’s equivalent of a partition table — information written to the beginning of the disk that describes the disk and slices the its space into partitions that can be used to hold files or entire filesystems. Even though this Lambda is a “2X2” system (with two LAMBDA processors) it would be a tight squeeze to run both of them in the the 160mb capacity of the drive, so for now I will only be running one of the two processors. Or trying to, anyway. (Oooh, foreshadowing!)

Continuing on:
load > install ***************************************************** The new backup label track number is 16340. Record this number and keep it with the machine. ***************************************************** Writing unit 0 label Using half-inch tape Installing track-0 disk driver ... copying 10 blocks from "/tar/disk" to "disk" copy done Tape-ID = "FRED gm 7/23/86 12:33:34 522520414 " File is "SDU5 3.0 rev 14"; 1500 blocks. "SDU5 3.0 rev 14" wants to be loaded into UNX6. reading 1500 blocks into UNX6. copying 1500 blocks from "bigtape" to "UNX6" copy done Next file ... File is "ULAMBDA 1764"; 204 blocks. Default partition to load into is LMC3 reading 204 blocks into LMC3. copying 204 blocks from "bigtape" to "LMC3" copy done Next file ... File is " 500.0 (12/8)"; 23189 blocks. Default partition to load into is LOD1 reading 23189 blocks into LOD1. copying 23189 blocks from "bigtape" to "LOD1" copy done Next file ... End of tape. Writing unit 0 label load >

There are three tape files that the install process brings in; you can see them being copied above. The first (“SDU5 3.0 rev 14”) contains a set of tools for the SDU to use, diagnostics and bootstrap programs. The second (“ULAMBDA 1764″) contains a set of microcode files for use by the Lambda processor. The Lambda CPU is microcoded, and the SDU must load the proper microcode into the processor before it can run. The final file (cryptically named ” 500.0 (12/8)” is a load band. (The Symbolics analogue is a “world” file). This is (roughly) a snapshot of a running Lisp system’s virtual memory. At boot time, the load band is copied to the system’s paging partition, and memory-resident portions are paged into the Lambda’s memory and executed to bring the Lisp system to life.


As suspected the tape drive’s throughput was higher during installation than during diagnostic load. But not by much. The above process took about two hours and as you can see it completed without errors, or much fanfare. But it did complete!

Time now for the culmination of the last month’s time and effort: will it actually boot into Lisp? Nervously, I walk over to the LMI’s console, power it on, and issue the newboot command:
The “newboot” herald, inviting me to continue…

Newboot loaded right up and prompted me for a command. To start the system, all you need to do is type boot. And so I did, and away it went, loading boot microcode from disk and executing it, to bring the Lisp system in from the load band. Then the breaker tripped. Yes, I’m still running this all off a standard 15A circuit in my basement, and the addition of the Fujitsu drive has pushed it to its limit. Don’t do this at home, people.

I unplugged the tape drive to reduce the power load a bit, reset the breaker and turned the Lambda on again. Let’s have us another go, shall we?

(I apologize in advance for the poor quality of the videos that follow. One of the side-effects of being stuck at home is that all I have is a cellphone camera…)

(Warning, the above video is long, and also my phone gave out after 3:12. Just watch the first 30 seconds or so and you’ll get the gist of it.)

Long story short: about two minutes after the video above ended, the screen cleared. This normally indicates that Lisp is starting up, and is a good sign. And then… nothing. And more nothing. No disk activity. I gave it another couple of minutes, and then I pinged my friend Daniel Seagraves, the LMI expert. He told me to press “META-CTRL-META-CTRL-LINE” on the keyboard (that’s the META and CTRL keys on both the left and right side of the keyboard, and the LINE key, all held down at once). This returns control to the SDU and to newboot; at this point the “why” command will attempt to provide context detailing what’s going on with the Lambda CPU:


Tell me why, I gotta know why!

Since Daniel knows the system inside and out, he was able to determine exactly where things were going off the rails during Lisp startup. The error being reported indicated that a primitive operator expected an integer as an operand and was getting some other type. This hints at a problem inside the CPU logic, that either ended up loading a bogus operand, or that reported a valid operand as having a bogus type.

Out of superstition, I tried rebooting the system to see if anything changed but it failed identically, with exactly the same trace information from “why.”

In the absence of working diagnostics, schematics, or even detailed hardware information, debugging this problem was going to be an interesting endeavor.

But all was not lost. This is a 2×2 system, after all. There’s a second set of CPU boards in the chassis just waiting to be tested…


This time, after the screen clears (where the video above starts) you can see the “run lights” flashing at the bottom of the screen. (These tiny indicators reflect system and CPU activity while the system is running). Then the status line at the bottom loaded in and I almost fell over from shock. Holy cow, this thing is actually working after all this time!

I have one working Lambda CPU out of the two. I’m hoping that someday soon I can devise a plan for debugging the faulty processor. In particular, I think the missing “double-double” TRAM file opined about in Part 6 of this series has turned up on one of the moldy 9-track tapes I rescued from the Pennsylvania garage — this should hopefully allow me to run the Lambda CPU diagnostics, but it will have to wait until I have a larger disk to play with, as this file resides in a UNIX partition that I don’t currently have space for.

In the meantime since I have a known working set of CPU boards (recall from Part 2 that the Lambda processor consists of four boards), it was a simple matter to isolate the fault to a single board by swapping boards between the sets one at a time. The issue turns out to be somewhere on the CM (“Control Memory”) board in CPU 0.

Meanwhile, not everything is exactly rosy with CPU 1… what’s with the system clock?


System beeps are high-pitched squeaks and the wall clock on the status line counts about 4x faster than it should. Daniel and I are unsure exactly what the cause is at this time, but we narrowed it down to the RG (“ReGisters”) board. In many systems there is a periodic timer, sometimes derived from the AC line frequency (60Hz in the US) that is used to keep time and run the operating system’s process scheduler. The LMI uses something similar, and clearly it is malfunctioning.

Another fairly major issue is the lack of a working mouse. Way back in Part 2 I noted that the RJ11 connector had corroded into a green blob. This still needs repair and as it turns out, getting a working mouse on this system ended up being a journey all its own…

But that’s for my next installment. Until then, keep on keepin’ on!

Lookin’ good, LMI. Lookin’ good.


At Home With Josh Part 7: Putting the “Mass” in “Mass Storage”

Continuing from the conclusion of my last post, I had gotten to the point of testing the LMI’s Interphase SMD 2181 disk controller, but was getting troubling looking diagnostic output:
SDU Monitor version 102 >>/tar/2181 -C Initializing controller 2181: error 3 test 0 Alarm went off - gave up waiting for IO completion 2181: error 3 test 0 Alarm went off - gave up waiting for IO completion 2181: error 10 test 0 no completion (either ok or error) from iopb status iopb: cyl=0 head=0 sector=0 (TRACK 0) 87 11 00 00 00 00 00 00 00 00 00 00 10 00 c5 62 00 40 00 00 00 00 c5 3a
My immediate suspicion was that this was truly indicating a real failure with the controller. The “gave up waiting for IO completion” message was the canary in the coal mine here. The way a controller like this communicates with the host processor (in this case the SDU) is via a block of data in memory that the controller reads, this is the “iopb” (likely short for “I/O Program Block”) mentioned in the output above. The iopb contains the command to the controller, the controller executes that command then returns the status of the operation in the same iopb, and may interrupt the host processor to let it know that it’s done so. (More on interrupts later.)

What the above diagnostic failure appears to be indicating is that the SDU is setting up an initialization command in the iopb and waiting for the 2181 to return a result. And it waits. And it waits. And it waits. And then it gives up after a few milliseconds because the response has taken too long: the 2181 is not replying, indicating a hardware problem.

But the absence of any real documentation or instructions for these diagnostics or the 2181 controller itself left open other possibilities. The biggest one was that I did not at that time have an actual disk hooked up to the controller. The “-C” option to the 2181 diagnostic looked like it was supposed to run in the absence of a disk, but that could be an incorrect assumption on my part. It may well be that the 2181 itself requires a disk to be connected in order to be minimally functional, though based on experience with other controllers this seemed to me to be unlikely. But again: no documentation, anything could be possible.

The lack of a disk was a situation I could rectify. The Lambda’s original disk was a Fujitsu Eagle (model M2351), a monster of a drive storing about 470mb on 10.5″ platters. It drew 600 watts and took up most of the bottom of the cabinet. At the time of this writing I am still trying to hunt one of these drives down. The Eagle used the industry-standard SMD interface, so in theory another SMD drive could be made to work in its stead. And I had just such a drive lying dormant…

If the Eagle is a monster of a drive, its predecessor, the M2284 is Godzilla. This drive stores 160MB on 14″ platters and draws up to 9.5 Amps while getting those platters spinning at 3,000 RPM. The drive itself occupies the same space as the Eagle so it will fit in the bottom of the Lambda. It has an external power supply that won’t, so it’ll be hanging out the back of the cabinet for awhile. It also has a really cool translucent cover, so you can watch the platters spinning and the heads moving: 

The Fujitsu M2284, freshly installed in the Lambda.

The drive is significantly smaller in capacity than the Eagle, but it’s enough to test things out with. It also conveniently has the same geometry as another, later Fujitsu disk that the SDU’s “disksetup” program knows about (the “Micro-169”), which makes setup easy. I’d previously had this drive hooked up to a PDP-11/44 and was working at that time. With any amount of luck, it still is.

Only one thing needed to be modified on the drive to make it compatible with the Lambda — the sector size. As currently configured, the drive is set up to provide 32 sectors per track; the Lambda wants 18 sectors. This sector division is provided by the drive hardware. The physical drive itself provides storage for 20,480 bytes per track. These 20,480 bytes can be divided up into any number of equally sized sectors (up to 128 sectors per track) by setting a bank of DIP switches inside the drive. Different drive controllers or different operating systems might require a different sector size.

The 32 sector configuration was for a controller that wanted 512-byte sectors — but dividing 20,480 by 32 yields 640. Why 640? Each sector requires a small amount of overhead: among other things there are two timing gaps at the beginning and end of each sector, as well as an address that uniquely identifies the sector, and a CRCs at the end of the sector. The address allows the controller to verify that the sector it’s reading is the one it’s expecting to get. The CRC allows the controller to confirm that the data that was read was valid.

What a single sector looks like on the Fujitsu.




The more sectors you have per track, the more data space you lose to this overhead. The Lambda wants 1024-byte sectors, which means we can fit 18 sectors per track. 20,480 divided by 18 is approximately 1138 bytes — 114 bytes are used per sector as overhead. The configuration of the DIP switches is carefully described in the service manual: 

Everyone got that? There will be a quiz later. No calculators allowed.

Following the instructions and doing the math here yields: 20,480 / 18 = 1137.7777…, so we truncate to 1137 and add 1, yielding 1138. Then we subtract 1 again (Fujitsu enjoys wasting my time, apparently) and configure the dip switches to add up to 1137. 1137 in binary is 10 001 110 001 (1024 + 64 + 32 + 16 + 1), so switches SW1-1, SW1-5, SW1-6, SW1-7 are turned on, along with SW2-4. Simple as falling off a log!

With that rigamarole completed, I hooked the cables up, powered the drive up and set to loading the Interphase 2181 diagnostic again:

SDU Monitor version 102
>>/tar/2181 -C
Initializing controller
2181: error 3 test 0 Alarm went off - gave up waiting for IO completion
2181: error 3 test 0 Alarm went off - gave up waiting for IO completion
2181: error 10 test 0 no completion (either ok or error) from iopb status
iopb: cyl=0 head=0 sector=0 (TRACK 0)
87 11 00 00 00 00 00 00 00 00 00 00 10 00 c5 62 00 40 00 00 00 00 c5 3a

Darn. Looks like having a drive present wasn’t going to make this issue go away.

About that time, a local friend of mine had chimed in and let me know he had a 2181 controller in his collection. It had been installed in a Sun-1 workstation at some point in its life, and was a slightly different revision. I figured that if nothing else, comparison in behavior between his and mine might shed a bit of light on my issue so I went over to his house to do a (socially distanced) pickup.

Annoyingly, the revisional differences between his 2181 and mine were fairly substantial:


Two Interphase 2181’s. Can YOU spot the differences?

You can see the commonality between the two controllers, but there are many differences, especially with regard to configuration jumpers — and since (as I have oft repeated) there is no documentation, I have no idea how to configure the newer board to match the old.

So this is a dead end, the revisional differences are just too great. I did attempt to run diagnostics against the new board, but it simply reported a different set of failures — though at least it was clear that the controller was responding.

Well it was well past the time to start actually thinking about the problem rather than hoping for a deus ex machina to swoop in and save the day. I wasn’t going to find another 2181, and documentation wasn’t about to fall out of the sky. As with my earlier SDU debugging expedition, it seemed useful to start poking at the 2181’s processor, in this case an Intel 8085. This is an 8-bit processor, an update of the 8080 with a few enhancements. Like with the SDU’s 8088, looking at power, clock and reset signals was a prudent way to start off.

Unlike with the SDU, all three of these looked fine — power was present, the clock was counting out time, and the processor wasn’t being reset. Well, let’s take a look at the pinout of the 8085 and see what else we might be able to look at:

8085 pinout, courtesy Wikimedia Commons (https://commons.wikimedia.org/wiki/File:Anschlussbelegung_8085.gif)



Oscillation overthruster
The AD0 through AD7 and A15 pins are the multiplexed address/data bus: When the 8085 is addressing memory, AD0-AD7 plus the A8-A15 pins form the 16-bit memory address; when a read or write takes place, AD0-AD7 contain the 8-bits of data being read or written. Looking for activity on these pins is a good way to see if the CPU is actually running — a running CPU will be accessing and addressing memory constantly — and sure enough, looking with an oscilloscope showed pulsing on these pins.

The TRAP, RST7.5, RST6.5, RST5.5, and INTR signals are used to allow external devices to interrupt the 8085’s operation and are typically used to let software running on the CPU know that a hardware event has occurred: a transfer has completed or a button was pushed, for example. When such an interrupt occurs, the CPU jumps to a specific memory location (called an interrupt vector) and begins executing code from it (referred to as an interrupt service routine), then returns to where it was before the interrupt happened. If any of these signals were being triggered erroneously it could cause the software running on the CPU to behave badly.

Probing the RST7.5, 6.5 and 5.5 signals revealed a constant 3.5V signal at RST7.5, a logic “1” — something connected to the 8085 was constantly interrupting it! This would result in the CPU running nothing but the interrupt service routine, over and over again. No wonder the controller was unable to respond to the Lambda’s SDU.

Now the question is: what’s connected to the RST7.5 signal? It could potentially come from anywhere, but the most obvious source to check on this controller is one chip, an Intel 8254 Programmable Interval Timer. As the name suggests, this device can be programmed to provide timing signals — it contains three independent clocks that can be used to provide precise timing for hardware and software events. The outputs of these timers are often connected to interrupt pins on microprocessors, to allow the timers to interrupt running code.

The Intel 8254 Programmable Interrupt Timer
And, as it turns out, pin 17 (OUT 2) of the 8254 is directly connected to pin 7 (RST7.5) of the 8085. OUT 2 is the data output for the third counter, and goes high (logic “1”) when that timer elapses. Based on what I’m seeing on the oscilloscope, this signal is stuck high, likely indicating that the 8254 is faulty. Fortunately it’s socketed, so it’s easy to test that theory. I simply swapped the 8254s between my controller and the one I’m borrowing from my friend and…

Success! Probing RST7.5 on the 8085 now shows a logic “0”, the CPU is no longer constantly being pestered by a broken interval timer and is off and running. The diagnostic LEDs on the board reflect this change in behavior — now only one is lit, instead of both. This may still indicate a fault, but it’s at least a different fault, and that’s always exciting.

Well, the controller is possibly fixed, and I already have a disk hooked up and spinning… let’s go for broke here and see if we can’t format the sucker. The “-tvsFD” flags tell the controller to format and test the drive, doing a one-pass verify after formatting. Here’s a shaky, vertically oriented video (sorry) of the diagnostic in action:


And here’s the log of the output:
SDU Monitor version 102 >> reset >> disksetup What kind of disk do you have? Select one of { eagle cdc-515 t-302 micro-169 cdc-9766 }: micro-169 >> /tar/2181 -tvsFD Initializing controller 2181: status disk area tested is from cyl 0 track 0 to cyl 822 track 9 2181: status format the tracks Doing normal one-pass format ... 2181:at test 0 test reset passed 2181: test 1 test restore passed 2181: test 2 test interrupt passed failedginning of cyl 159 ... at beginning of cyl 0 ... 2181: error 18 test 4 header read shows a seek error iopb: cyl=0 head=0 sector=0 (TRACK 0) 00 00 82 12 00 00 00 00 00 00 00 12 10 00 c5 62 00 40 00 00 00 00 c5 3a 2181: error 18 test 4 header read shows a seek error The 1 new bad tracks are:... bad: track 1591; cyl=159 head=1 ... mapped to track 8229; cyl=822 head=9 There were 1 new bad tracks Number of usable tracks is 8228 (822 cyls). (creating block-10 mini-label) Disk is micro-169 2181: test 5 read random sectors in range passed 2181: status read 500 random sectors 2181: test 6 write random sectors in range passed 2181: status write to 500 random sectors 2181: test 8 muliple sector test passed 2181: test 9 iopb linking test passed 2181: test 10 bus-width test passed 2181: test 0 test reset 0 errors 2181: test 1 test restore 0 errors 2181: test 2 test interrupt 0 errors 2181: test 4 track verify 2 errors 2181: test 5 read random sectors in range 0 errors 2181: test 6 write random sectors in range 0 errors 2181: test 8 muliple sector test 0 errors 2181: test 9 iopb linking test 0 errors 2181: test 10 bus-width test 0 errors >>
And some video of the drive doing its thing during the verification pass:



As the log indicates, one bad track was found. This is normal — there is no such thing as a perfect drive (modern drives, both spinning rust and SSD have embedded controllers that automatically remap bad sectors from a set of spares, providing the illusion of a flawless disk). Drives in the era of this Fujitsu actually came with a long list of defects (the “defect map”) from the factory. A longer verification phase would likely have revealed more bad spots on the disk.

Holy cow. I have a working disk controller. And a working disk. And a working tape drive. Can a running system be far off? Find out next time!

Tuesday, June 16, 2020

At Home With Josh Part 6: Diagnostic Time!

In our last exciting episode, after a minor setback I got the Lambda’s SDU to load programs from 9-track tape. Now it’s time to see if I can actually test the hardware with the available diagnostics.
Tape Images

Tape images of the Lambda Release and System tapes are available online. Daniel Seagraves has been working on updating the system and has his latest and greatest are available here. A tape image is a file that contains a bit-for-bit copy of the data on the original tape. Using this file in conjunction with a real 9-track drive allows an exact copy of the original media to be made. In my case, I have an HP 7980S 9-track drive connected to a Linux PC for occasions such as these. At the museum we have an M4 Data 9-track drive set up to do the same thing. The old unix workhorse tool “dd” can be used to write these files back to tape, one at a time:

$ dd if=file1 of=/dev/nst0 bs=1024

(Your UNIX might name tape devices differently, consult your local system administrator for more information.)

Data on 9-track tapes is typically stored as a sequence of files, each file being separated by a file mark. The Lambda Release tape contains five such files, the first two being relevant for diagnostics and installation, and the remainder containing Lisp load bands and microcode that get copied onto disk when a Lisp system is installed.

The first file on tape is actually an executable used by the SDU — it is a tiny 2K program that can extract files from UNIX tar archives on tape and execute them. Not coincidentally, this program is called “tar.” The second tape file is an actual tar archive that contains a variety of utility programs and diagnostics. Here’s a rundown of the interesting files we have at our disposal:
  • 3com – Diagnostic for the Multibus 3Com Ethernet controller
  • 2181 – Diagnostic for the Interphase 2181 SMD controller
  • cpu – Diagnostic for the 68010 UNIX processor
  • lam – Diagnostic for the Lambda’s Lisp processors
  • load – Utility for loading a new system: partitioning disks and copying files from tape.
  • ram – Diagnostic for testing NuBus memory
  • setup – Utility for configuring the system
  • vcmem – Diagnostic for testing the VCMEM (console interface) boards.
The unfortunate thing is: there is no documentation for most of these beyond searching for strings in the files that might reveal secrets. Daniel worked out the syntax for some of them while writing his LambdaDelta emulator, but a lot of details are still mysterious.

In case you missed it, I summarized the hardware in the system along with a huge pile of pictures of the installed boards in an earlier post — it might be helpful to reacquaint yourself to get some context for the following diagnostic runs. Plus pictures are pretty.

I arbitrarily decided to start by testing the NuBus memory boards, starting with the 16mb board in slot 9 (which I’d moved from slot 12 since the last writeup). The diagnostic is loaded and executed using the aforementioned tar program as below. The “-v” is the verbose flag, so we’ll get more detailed output. the “-S 9” indicates to the diagnostic that we want to test the board in slot 12.
SDU Monitor version 102 >> reset >> /tar/ram -v -S 9 ram: error 6 test 1 bad reset state, addr=0xf9ffdfe0, =0x1, should=0x4 ram: error11 test 3 bad configuration rom ram: error 1 test 6 bad check bits 0xffff, should be 0xc, data 0x0 ram: error 1 test 7 bad check bits 0xffff, should be 0xc, data 0xffffffff ram: error 7 test 8 for dbe w/flags off, DBE isn't on ram: error 7 test 9 for dbe w/flags off, DBE isn't on ram: status fill addr 0xf9000000 ram: status fill addr 0xf9002000 ... [elided for brevity] ... ram: status fill addr 0xf903c000 ram: status fill addr 0xf903e000 ram: status fill check addr 0xf9000000 ram: status fill check addr 0xf9002000 ... [elided for brevity] ... ram: status fill check addr 0xf903c000 ram: status fill check addr 0xf903e000
Well, the first few lines don’t look exactly promising what with all the errors being reported. The test does continue on to fill and check regions of the memory but only up through address 0xf907e000 (the first 512KB of memory on the board, that is). Thereafter:
ram: status fill check addr 0xf907c000 ram: status fill check addr 0xf907e000 ram: status block of length 0x4000 at 0xf9000000 ram: status stepsize 4 forward ram: error 4 test 16 addr 0xf9000004 is 0xffffffff sb 0x0 (data f/o) ram: error 4 test 16 addr 0xf9000008 is 0xffffffff sb 0x0 (data f/o) ram: error 4 test 16 addr 0xf900000c is 0xffffffff sb 0x0 (data f/o) ram: error 4 test 16 addr 0xf9000010 is 0xffffffff sb 0x0 (data f/o) ram: error 4 test 16 addr 0xf9000014 is 0xffffffff sb 0x0 (data f/o) ram: error 4 test 16 addr 0xf9000018 is 0xffffffff sb 0x0 (data f/o) ram: error 4 test 16 addr 0xf900001c is 0xffffffff sb 0x0 (data f/o) ram: error 4 test 16 addr 0xf9000020 is 0xffffffff sb 0x0 (data f/o) ram: error 4 test 16 addr 0xf9000024 is 0xffffffff sb 0x0 (data f/o) ram: error 4 test 16 addr 0xf9000028 is 0xffffffff sb 0x0 (data f/o)
And so on and so forth, probably across the entire region from 0xf9000000-0xf907ffff. This would take a long time to run to completion (remember, this output is coming across a 9600bps serial line — each line takes about a second to print) so I wasn’t about to test this theory. The output appears to be indicating that memory reads are returning all 1’s (0xffffffff) where they’re supposed to be 0 (0x0).

So this isn’t looking very good, but there’s a twist: These diagnostics fail identically under Daniel’s emulator. After some further discussion with Daniel it turns out these diagnostics do not apply to the memory boards I have installed in the system (or that the emulator simulates). The Memory boards that were available at the time of the Lambda’s introduction were tiny in capacity: Half megabyte boards were standard and it was only later that larger (1, 2, 4, 8, and 16mb boards) were developed. The only memory boards I have are the later 4 and 16mb boards and these use different control registers and as a result the available diagnostics don’t work properly. If there ever was a diagnostic written for these newer, larger RAM boards, it has been lost to the ages.

This means that I won’t be able to do a thorough check of the memory boards, at least not yet. But maybe I can test the Lisp CPU? I slotted the RG, CM, MI and DP boards into the first four slots of the backplane and started up the lam diagnostic program:

SDU Monitor version 102 >> reset >> /tar/lam -v /tar/lam version 6 compiled by wer on Wed Mar 28 15:24:02 1984 from machine capricorn setting up maps initializing lambda starting conreg = 344 PMR passed ones test passed zeros test TRAM-ADR passed ones test passed zeros test TRAM passed ones test passed zeros test loading tram; double-double disk timed out; unit=0x0 cmd=0x8F stat=0x0 err=0x0 disk unit 0 not ready can't open c.tram-d-d SPY: passed ones test passed zeros test HPTR: Previous uinst destination sequence was non-zero after force-source-code-word during lam-execute-r Previous uinst destination sequence was non-zero after force-source-code-word during lam-execute-r Previous uinst destination sequence was non-zero after force-source-code-word ... [and so on and so forth] ...
Testing starts off looking pretty good — the control registers and TRAM (“Timing RAM”) tests pass, and then it tries to load a TRAM file from disk. Aww. I don’t have a disk connected yet, and even if I did it wouldn’t have any files on it. And to add insult to injury, as it turns out even the file it’s trying to load (“double-double”) is unavailable — like the later RAM diagnostics, it is lost to the ages. The TRAM controls the speed of the execution of the lisp processor and the “double-double” TRAM file causes the processor to run slowly enough that the SDU can interrogate it while running diagnostics. Without a running disk containing that file I won’t be able to proceed here.

So, as with the memory I can verify that the processor’s hardware is there and at least responding to the outside world, but I cannot do a complete test. Well, shucks, this is getting kind of disappointing.

The vcmem diagnostic tests the VCMEM board — this board contains the display controller and memory that drives the high-resolution terminals that I restored in a previous writeup. It also contains the serial interfaces for the terminal’s keyboard and mouse. Perhaps it’s finally time to test out the High-Resolution Terminals for real. I made some space on the bench next to the Lambda and set the terminal and keyboard up there, and grabbed one of the two console cables and plugged it in. After powering up the Lambda, I was greeted with a display full of garbage!

Isn’t that the most beautiful garbage you’ve ever seen?
This may not look like much, but this was a good sign: The monitor was syncing to the video signal, and the display (while full of random pixels) is crisp and clear and stable. The garbage being displayed was likely due to the video memory being uninitialized: Nothing had yet cleared the memory or reset the VCMEM registers. There is an SDU command called “ttyset” that assigns the SDU’s console to various devices; currently I’d been starting the Lambda up in a mode that forces it to use the serial port on the back as the console, but by executing

>> ttyset keytty
The SDU will start using the High-Resolution terminal as the console instead. And, sure enough, executing this caused the display to clear and then:

It lives!

There we are, a valid display on the screen! The keyboard appeared to work properly and I was able to issue commands to the SDU using it. So even without running the vcmem diagnostic, it’s apparent that the VCMEM board is at least minimally functional. But I really wanted to see one of these diagnostics do its job, so I ran it anyway:
SDU Monitor version 102 /tar/vcmem -v -S 8 vcmem: status addr = 0xf8020000 vcmem: status fill addr 0xf8020000 ... [elided again for brevity] ... vcmem: status fill addr 0xf803e000 vcmem: status fill check addr 0xf8020000 vcmem: status fill check addr 0xf8022000 vcmem: status fill check addr 0xf8024000 vcmem: status fill check addr 0xf8026000 ... vcmem: status fill check addr 0xf8036000 vcmem: status fill check addr 0xf8038000 vcmem: status fill check addr 0xf803a000 vcmem: status fill check addr 0xf803c000 vcmem: status fill check addr 0xf803e000
As the test continued, patterns on the screen slowly changed, reflecting the memory being tested. Many different memory patterns are tested over the next 15 minutes.
vcmem: status movi block at 0xf803c000 vcmem: status movi stepsize 2 forward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000 vcmem: status movi stepsize 2 backward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000 vcmem: status movi stepsize 4 forward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000 vcmem: status movi stepsize 4 backward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000 vcmem: status movi stepsize 8 forward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000 vcmem: status movi stepsize 8 backward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000 ... [elided] ... vcmem: status movi stepsize 4096 forward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000 vcmem: status movi stepsize 4096 backward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000 vcmem: status movi stepsize 8192 forward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000 vcmem: status movi stepsize 8192 backward vcmem: status movi checking 0x0000 writing 0xffff vcmem: status movi checking 0xffff writing 0x0000
And at last the test finished with no errors reported, leaving a test pattern on the display. How about that, a diagnostic that works with the hardware I have.

Not your optometrist’s eye chart…
Looking crisp, clear, and nice and straight. This monitor is working fine — what about the other one? As you might recall, I got two High-Resolution Terminals with this system and pre-emptively cleaned and replaced all the capacitors in both of them. The second of these would not display anything on the screen when powered up (unlike the first) though I was seeing evidence that it was otherwise working. Now that I’d verified that the VCMEM board was working and producing a valid video signal, I thought I’d see if I could get anything out of the second monitor.


Well, what do you know? Note the cataracts in the corners.

Lo and behold: it works! I soon discovered the reason for the difference in behavior between the two monitors: The potentiometer (aka “knob”) that controls the contrast on this display is non-functional; with it turned up on the first monitor you can see the retrace, with it turned down it disappears. Interestingly the broken contrast control doesn’t seem to have a detrimental effect on the display, as seen above.

So that’s a VCMEM board, two High-Resolution Terminals, and the keyboard tested successfully, with the CPU and Memory boards only partially covered. I have yet to test the Ethernet and Disk controllers. The 3com test runs:
SDU Monitor version 102 >> /tar/3com -v 3com: status Reading station address rom start addr=0xff030600 3com: status Reading station address ram start addr=0xff030400 3com: status Transmit buffer: 0xff030800 to 0xff030fff. 3com: status Receive A buffer: 0xff031000 to 0xff0317ff. 3com: status Receive B buffer: 0xff031800 to 0xff031fff. 3com: status Receive buffer A - 0x1000 to 0x17ff. 3com: status Receive buffer B - 0x1800 to 0x1fff. >>
Hex editors to the rescue!
No errors reported and the test exits without complaining so it looks like things are OK here. Now onto the disk controller. I don’t have a disk hooked up at the moment, but after a bit of digging into the test’s binary, it looks like the “-C” option should run controller-only tests:



SDU Monitor version 102 >>/tar/2181 -C Initializing controller 2181: error 3 test 0 Alarm went off - gave up waiting for IO completion 2181: error 3 test 0 Alarm went off - gave up waiting for IO completion 2181: error 10 test 0 no completion (either ok or error) from iopb status iopb: cyl=0 head=0 sector=0 (TRACK 0) 87 11 00 00 00 00 00 00 00 00 00 00 10 00 c5 62 00 40 00 00 00 00 c5 3a 2181: error 3 test 0 Alarm went off - gave up waiting for IO completion 2181: error 3 test 0 Alarm went off - gave up waiting for IO completion 2181: error 10 test 0 no completion (either ok or error) from iopb status iopb: cyl=0 head=0 sector=0 (TRACK 0) 87 11 00 00 00 00 00 00 00 00 00 00 10 00 c5 62 00 40 00 00 00 00 c5 3a 2181: error 3 test 0 Alarm went off - gave up waiting for IO completion 2181: error 3 test 0 Alarm went off - gave up waiting for IO completion 2181: error 10 test 0 no completion (either ok or error) from iopb status iopb: cyl=0 head=0 sector=0 (TRACK 0) 87 11 00 00 00 00 00 00 00 00 00 00 10 00 c5 62 00 40 00 00 00 00 c5 3a 2181: error 3 test 0 Alarm went off - gave up waiting for IO completion
This portends a problem. The output seems to indicate that the test is asking the controller to do something and then report a status (either “OK” or “Error”) and the controller isn’t responding at all within the allotted time, so the diagnostic gives up and reports a problem.

This could be caused by the lack of a disk, perhaps the “-C” option isn’t really doing what it seems like it should, but my hacker sense was tingling, and my thought was that there was a real problem here.

Compounding this problem is a lack of any technical information on the Interphase SMD 2181 controller. Not even a user’s manual. The Lambda came with a huge stack of (very moldy) documentation, including binders covering the hardware: “Hardware 1” and “Hardware 3.” There’s supposed to be a “Hardware 2” binder but it’s missing… and guess which binder contains the 2181 manual? Sigh.

There are two LEDs on the controller itself and at power-up they both come on, one solid, one dim. In many cases LEDs such as these are used to indicate self-test status — but lacking documentation I have no way to interpret this pattern. I put out a call on the Interwebs to see if I could scare up anything, but to no avail.

Looks like my diagnostic pass at the system was a mixed bag: Outdated diagnostics, meager documentation, and what looks like a bad disk controller combined with the success of the consoles and at least a basic verification of most of the Lambda’s hardware.

In my next installment, I’ll hook up a disk and see if I can’t suss out the problem with the Interphase 2181. Until then, keep on chooglin’.