Well, this is embarrassing. I have discovered a pretty serious bug in the AT&T 3B2 emulator , present since the very first release, and undetected until now. The “TL;DR” version is that the largest hard disk model that the 3B2 emulator offers, a 161 MB Maxtor XT-2190, is not actually supported on a real 3B2 because it has more than 1024 cylinders. This leaves me with a pretty obvious problem: If I…
Loomcom now has dark mode! That’s right, if your system preference is for dark mode, there’s a new CSS theme for you. And if you prefer light mode, you get the same old look and feel.
I saw my first web browser in 1993 when a friend called me down to his dorm room to show me a web page that the Vatican museum had put up. I’d been on the Internet for about a year using text-based tools like Telnet, FTP, Gopher, and Usenet, but the world of hypertext was an absolute eye-opener. I remember my first reaction to seeing the World Wide Web being, “Well, Gopher is done for”. It felt…
A few days ago I turned 50 years old. Coincidentally, I’ve also been playing with a vintage computer that brings me right back to my first real job out of college, when I worked at Silicon Graphics in Mountain View, California, as a contractor. 1996 is getting perilously close to 30 years ago now. It was a much simpler time in my life, of course. I was young, I’d just moved across country, I was…
Well, I did it . I have officially moved off of my homebrewed, Emacs-based static site generator and on to an officially supported publishing platform, Zola . At the same time, I’ve created a fresh new minimalist CSS theme that I like a lot. I hope you do too. A few things really appealed to me about Zola. First, it’s written in Rust, a language I’ve become extremely enamoured of. Second, it’s got…
The question in the title refers to my blog, or I suppose more generally to my entire website. I’ve been publishing all of loomcom.com with Emacs for several years now and while I find it to be mostly acceptable, I’m by no means in love with it. There are a few major disadvantages: It’s almost entirely bespoke, meaning that if something goes wrong, I am literally the only person on the planet…
Almost every time that I give out my email address and I have to spell loomcom.com, I get a funny look or a little chuckle, like “Wait, seriously? Two coms?” And yeah, to modern ears it sounds pretty funny. Saying it out loud is clunky. Explaining that it’s short for “Loom Communications” helps, but it just adds further clunkiness to the exchange. So, why the heck is it loomcom.com, anyway?…
I just deleted my Twitter account, and gosh it felt good. 2009–2022 was a good run. If you need me on social media, you can find me very occasionally on Mastodon !
I was prompted by a Tweet this morning to dig out my copy of Jacques Vallee’s book “The Network Revolution” (And/Or Press, 1982). This passage has haunted me since I first read it: One lesson which I am not likely to forget took place at the RCA research labs in Princeton, where most of the discoveries in color television had occurred. I had been invited to give a talk on information…
Note: This blog post is no longer accurate, a lot has changed since it was published. It is left here for historical reasons. Over the last couple of days I’ve been busy ripping out a lot of the Emacs lisp code that I orignally wrote to publish my weblog with Emacs and cleaning up the project quite a bit. The most obvious changes are that there’s finally an RSS feed again, and that my weblog is…
I struggled with whether or not I should make this post because I worry that the topic of burnout is taboo. Admitting that I was burned out and that I had to take time to recover from it feels like admitting a kind of failure or a weakness, but the longer I dwelled on it the more I knew that I had to say something, if for no other reason than because I want to help anyone else who’s suffering from…
Was my last blog entry really in March? Apparently, yes, it was. Forgive me. 2020 has been a strange year. I’m sure you’ll agree. I have been lucky enough to retain a job during the global pandemic, and moreover, the job has been busy as hell. In truth, I haven’t been able to work on personal projects nearly as often as I wish I had been able to. What’s worse, while some people found themselves…
It’s now been more than three months since my last post, and I think I owe everyone an update on what I’ve been doing with my life. I’ve been working on the 3B2/1000 simulator for a while now, and at the outset, I decided to try to build a single simulator executable that could be configured as either a 3B2/400 or a 3B2/1000. In hindsight, this was a mistake, but sometimes you can’t…
In the long, dark months since September, I have not really done any work at all on my 3B2 emulator. Since it’s Christmas break for me right now, though, I’ve taken up the mantle once again and started hacking away on it with the aim of implementing Revision 3 system board support that will allow the simulator to run as a 3B2/1000 system. There’s actually quite a bit of work involved in…
It’s been a minute, hasn’t it! I’d like to talk about the state of the 3B2 Simulator and get everyone up to speed with where we are, and where we’re going. In The Beginning Way back in 2014, I set out on this adventure to build a 3B2/400 simulator because I wanted to play with a 3B2, but I couldn’t find one. Believe it or not, I knew very little about them at first. I eventually picked the…
Do you like obscure artificial intelligence workstations from the 1980s? Of course you do! So do I. That’s why, when I found out about the Tektronix 4400 series of workstations, I was immediately smitten. The 4400 series (including the 4404, 4405, and 4406) were Motorola 68010 and 68020 based workstations built to run Smalltalk-80 and Lisp, and were marketed toward the artificial intelligence…
After what feels like an inexcusably long time, the WE32106 Math Acceleration Unit (MAU) has been merged into the main SIMH tree, and the 3B2/400 simulator has support for it. This project was one of the most tedious, boring, and yet educational projects I have worked on. Join me now as I recount the harrowing details. In The Beginning Way back in September 2018, almost nine months ago…
Ever since I got the AT&T 3B2/400 emulator working well enough to share publicly, I’ve received a lot of requests for it to support the (in-)famous 3B2 Ethernet Network Interface option card, commonly referred to by its EDT name, “NI”. The NI card is based on the Common I/O Hardware (CIO) intelligent peripheral architecture, the same architecture used for the PORTS card and the CTC tape…
I’m writing this entry more for myself than for anyone else, because I always forget what a pain this is to get set up properly. The backstory starts with a kernel fault. # TRAP proc = 4022EBEC psw = 1472B pc = 400287BD PANIC: KERNEL MMU FAULT (F_ACCESS) SYSTEM FAILURE: CONSULT YOUR SYSTEM ADMINISTRATION UTILITIES GUIDE This is what happens if you install software out of order on the 3B2/310,…
Last month , I wrote about my experience building an emulator for the DMD 5620 computer terminal . Well, I’m going to revisit that, because my approach did not turn out the way I wanted it to. The short version is that my use of ElectronJS to build a fully cross-platform front end did not go quite as smoothly as I’d hoped. It went fairly well on macOS and Windows 10, albeit with performance that…
Back in the early 1980s, before GUIs were commonplace, Rob Pike and Bart Locanthi Jr. at AT&T Bell Labs created a bitmapped windowing system for use with UNIX. Originally, they called the system “jerq”, a play on the name of the Three Rivers PERQ computer. When the technology started to get showed around outside of the lab, however, they changed its name to “Blit”, from the name of the “bit blit”…
I recently started on a quest to finish up a loose end on the AT&T 3B2 emulator by finally implementing a simulation of the WE32106 Math Acceleration Unit (MAU). The MAU is an IC that accelerates floating point operations, and it could be fitted onto the 3B2 motherboard as an optional part. I’ve seen quite a few 3B2 systems that didn’t have one; if it’s not present, the 3B2 uses software floating…
This weekend’s project was to image all of my AT&T 3B2 hard disks to preserve the bits on them. To do this, I used David Gesswein’s MFM Reader and Emulator board , which allows you to either emulate an MFM hard disk, or read MFM data off of a real hard disk. A nice side effect is that the images you pull off of a hard disk are compatible with my 3B2 Emulator , so once they’ve been read off, you…
Note: This blog post is no longer accurate, a lot has changed since it was published. It is left here for historical reasons. After much hacking on elisp, I’m happy to announce two changes: First, I’ve finally implemented pagination on my blog, so the entire nine years of archives isn’t rendered in one huge page. And second, there’s now an RSS feed available at…
Note: This blog post is no longer accurate, a lot has changed since it was published. It is left here for historical reasons. You may notice something quite different about this blog if you’ve been here before. The look and feel is different, yes, but it’s more than just skin deep. For the last nine years, I’ve kept my blog in WordPress, a very capable blogging platform. But, starting today, I’ve…
On November 29, 2014, I posted the following message to the Classic Computer Mailing List. Folks, For some reason I got it in my head that writing an AT&T 3B2 emulator might be a good idea. That idea has pretty much been derailed by lack of documentation. I have been unable to find any detailed technical description of any 3B2 systems. Visual inspection of a 3B2 300 main board reveals the…
Table of Contents I had an absolute breakthrough tonight regarding how the WE32101 MMU handles caching. In fact, when I implemented the change, my simulator went from having 108 page miss errors during kernel boot, to 3 . The cache is getting hit on almost every virtual address translation, and because of what I learned, the code is more efficient, too. The key to all this was finally looking up…
I think I made a grievous error when I originally laid out how the 3B2 system timers would work in SIMH, and last night I started down the path of correcting that. The 3B2/400 has multiple sources of clocks and interrupts: There’s a programmable interval timer with three outputs being driven at 100KHz, a timer on the UART that runs at 235KHz, and a Time-of-Day clock. They’re all driven at…
I spent last night probing my 3B2/310’s hard disk controller with a logic analyzer so I can see exactly how it behaves, both with and without a hard disk attached to the system. It proved to be very tricky to get the logic analyzer probes attached because the motherboard is so incredibly dense. In fact, I couldn’t get a probe attached to the chip select line no matter how hard I tried. There…
My next mini-project in the 3B2/400 simulator will be emulating the hard disk. The 3B2/400 used a NEC µPD7261A hard disk controller ( PDF datasheet here ), which has proved to be harder to emulate correctly than I would have liked. So far, my hard disk controller emulation has been limited to the most minimal functionality needed to get the emulator to pass self-checks at all. Other than…
And just like that, it’s solved. I figured out the mystery of the Equipped Device Table . The answer was in some obscure piece of System V Release 3 source code. The 3B2 system board has a 16-bit register called the Control and Status Register (CSR). In the CSR is a bit called named TIMEO that I never figured out. It turns out that I just wasn’t reading the disassembled ROM code closely enough.…
EDIT: I have made a followup post detailing the answer to this mystery ! There is yet one more puzzling aspect of the 3B2 that I do not yet understand, and that is the equipped device table, or EDT. I’ve documented the nitty-gritty details on my main 3B2 reverse-engineering page , so I won’t bore you with the details. But here’s the short version. The EDT is what tells the system what I/O…
Over the weekend I conducted several experiments with caching using my 3B2 simulator. I learned a few critical bits of information. For background, see this post and this post . The first and most important thing I learned is that indexing cache entries only by their tags /does not work/. There are collisions galore, and no way to recover from them. However, if I index SD cache entries…
I had a Eureka! moment last night about MMU caching, but it all came tumbling down this morning. My realization was that the Segment Descriptors are 8 bytes long, and that Page Descriptors are 4 bytes long. So, if we assume that the virtual address encodes the addresses of the SDs and PDs on word-aligned boundaries (and SDs and PDs are indeed word-aligned in memory), then you don’t need the bottom…
I’m in the middle of a very long, very drawn out project to try to emulate the AT&T 3B2/400 computer . I should probably have been sharing my progress more frequently than I have been, but it has for the most part been a painful and solitary endeavor. Today, though, there is something in particular that is bothering me greatly, and I must yell into the void to get this frustration off my…
This is the story of a short time, a quarter century ago, when a little cluster of computers at Cornell University played a very important part in in my life and in the lives of my friends. It was the fall of 1992, and the Internet was growing up. It would still be another year or two before it became a household name, so for the time being it was our little playground, our special place that you…
It’s been a long time since I wrote about my tragic tale of Internet woe I owe you all an update, and I’m very happy to say that at long last, we have broadband. It’s kind of a long story. Back in February when all hell was breaking loose and we were becoming desperate for Internet connectivity, I reached out to the Kitsap Public Utility Commission (KPUD), who were listed as providing fiber optic…
At CodeMash 2012, Gary Bernhardt gave a now infamous lightning talk that has become known simply as The WAT Talk , in which he presents several of the more surprising behaviors of Ruby and JavaScript. I’ve passed the video around quite a few times, and I’ve pointed out some other JavaScript behaviors that seem pretty outlandish at first sight. But I’m feeling a little guilty about poking fun at…
In my last post , I showed you how to download Altera’s Quartus II software and get a new, empty project started for the BeMicro CV platform. This time, we’ll learn how to build a Verilog module and compile it. The Blank Slate We left off looking at a blank slate, an empty project. This is always the most intimidating part of any project. What do we want to do? The next step is to define a…
My story kind of hit social media hard this week . To say it caught me off guard is an understatement. I never in a million years expected the response to be so big. I’m just some guy, I don’t particularly enjoy all the attention suddenly paid to my problem. But, that said, I’m grateful for all the support and tips I’ve received, and I’m investigating all connectivity options. One of the frequent…
My internet fiasco aside, I think it’s time I start getting back into some technical matters here on the blog. So welcome to the first in a series of posts about FPGA development! Introduction If, like me, you’ve always wanted to try your hand at programming an FPGA, there’s no time like the present. FPGA kits that are accessible to hobbyists have become affordable and plentiful! One of the most…
UPDATE 1: See the FAQ At The Bottom of This Post UPDATE 2: Be sure to read my follow-up post . Spoiler Alert: It has a happy ending! This is a very long post, but it needs to be long to properly document all the trouble we’ve gone through with Comcast. In short: We moved into our new home in January after verifying that Comcast was available. They said no problem, and we ordered their service.…
I was a freshman at Cornell University in Fall of 1992 when I logged into my first UNIX system. I’d heard of UNIX before, of course—it was a popular subject in trade magazines of the period, and if you tinkered with computers you’d probably have heard of it—but I’d never actually used it. So one day I marched over to the campus IT department to register for a UNIX account. It took some wrangling,…
Well. Here it is, the final entry for my Summer Retrochallenge project. I wanted to do more, but as so often happens, real life intervened and I didn’t have nearly as much time to work on it as I’d wanted. C’est la vie! But I’m still proud of what I accomplished. I have a working ROM monitor, and I’m happy to report that as a final hurrah, I got it fully integrated with Lee Davison’s Enhanced 6502…
As I write this, it’s early on the evening of July 25th, and I’m staring next Thursday’s deadline in the face. I haven’t been able to work on my Retrochallenge entry for over a week, and it’s in poor shape. But am I going to give up? No way. I’m going to go down fighting. My over-enthusiastic early plans called for me to finish up my 6502 ROM monitor so early that I’d have time to work on cleaning…
I’m fairly happy with my parsing and tokenizing code now. I wanted to give a little breakdown of how it works. The over-all goal here is to take a command from the user in the form: C NNNN [(NN)NN [NN NN NN NN NN ... NN]] where C is a command such as “E” for Examine, “D” for Deposit, etc., and store it in memory, tokenized and converted from ASCII to binary. I wanted to give the user flexibility.…
[Today is kind of a big update, and not all the source code will be presented in-line here in the blog post. As always, you can look at the current source here on my Git repository .] Good news, everyone! After quite a lot of hacking, I can examine memory with my monitor. It’s a very primitive feature, right now: I can only examine one byte at a time, so I can’t dump memory regions yet. But hey,…
I’m moving kind of fast here because I really want to get to the meaty parts of the code, but I want to cover how I’m getting input from the console into the system. As you might expect, it’s all about reading from the ACIA instead of writing to it. Recall the ACIA’s addresses: ;;; ---------------------------------------------------------------------- ;;; IO Addresses ;;;…
Last night I got string output working. But what if I want to make string output generic? I want to write a STOUT (STring OUT) subroutine that can take the address of any null-terminated string and print it to the console, but there’s a problem: The 6502 is an 8-bit machine, so passing a 16-bit address as an argument takes some wrangling. To get around this, I’ve designated two locations in the…
Now that I have a skeleton 6502 assembly project set up and building, it’s time to get going and writing some real code for the ROM monitor. But wait, there’s just one more thing I need to get set up, and that’s an emulator so I can test code easily. Without an emulator, I’d have to flash a new ROM image to an EPROM and put it into a real 6502 computer every time I wanted to run it, and debugging…