Installing A/UX 1.1 like it’s the 90s | Thomas
Recently, I have been successful in making A/UX boot and run stable on my vintage<br>Macintosh emulator; Snow. A/UX was Apple’s version of UNIX<br>that ran on the 68k-based series Macs. It required a Memory Management Unit to achieve<br>process isolation; either the optional 68851 PMMU on the original 68020-based Macintosh<br>II or the integrated MMU in the 68030- and 68040-based machines. It also required an<br>FPU; making it only run on the higher end machines such as the Macintosh II series<br>and later the Quadra, but the LC was out of luck.<br>A/UX Penelope is a nice resource on A/UX compatibility<br>info.
You can try A/UX 3.1.1 on the Macintosh IIx emulated by Snow in your browser on<br>Infinite Mac.
Recently I had the chance to play with a newly archived A/UX 1.1 installation<br>media set, courtesy of Dominic Sharp, whom I had been talking to on<br>Tinker Different. Dominic obtained this set and wanted<br>to archive it publicly, but wasn’t sure about the state of the disks.<br>I’m not aware of any A/UX 1.1 software being publicly archived; the closest is a<br>preinstalled image of 1.1.1, which didn’t work yet on Snow at the time.<br>Dominic agreed to share the set with me so I could give it a try and fix Snow in the<br>process.
The set consists of 34 floppy images, all 800K GCR. They came as raw flux images,<br>which I first converted using Applesauce.
First, the proper emulated hardware had to be available. Snow emulates the machine,<br>CPU, FPU and PMMU required, but only emulated the Macintosh Display Card 8-24, which<br>I wasn’t sure was supported by A/UX 1.x, which is particularly picky about its video<br>hardware. According to A/UX Penelope, the Macintosh II video card (“Toby”) is natively<br>supported, so I first implemented this card as an additional option in Snow.
Then it was time to get to work with the installation. A/UX came with lovely<br>very UNIX-y binders, which you definitely needed as the OS and installation<br>aren’t exactly straight forward.
Luckily, that is archived on Bitsavers.<br>Armed with my digital binders, I proceeded with the installation.
To start off the install, we begin with the “System setup and README” disk. We need<br>to partition the disk, and then do something counter-intuitive: install System 6 on<br>a Mac partition. This is because there’s a Mac application that kicks off the A/UX<br>boot process: SASH; the A/UX standalone shell. This ‘pre-boot environment’ allows for<br>launching an A/UX kernel and also some disk and recovery operations.
Partitioning is through the familiar HD SC Setup and can be pretty straightforward;<br>the included HD SC Setup includes a template layout for A/UX.
And then, we can move on to install a pretty bare System 6 and afterwards copy the<br>contents of the “SASH and utilities” disk to the new installation.
Now, it’s finally time to actually get into A/UX. This happens by booting off the<br>“Floppy Launch” disk. This disk autostarts a SASH, launches an A/UX kernel and will<br>then request the “Floppy Root” disk. This begins part 1 of the installation, which<br>formats the A/UX partitions and copies a bootstrapping system into it.
At this point, I had to fix a Snow bug, which was causing the modifier keys to be<br>stuck due to an invalid ADB Talk 2 implementation. Interestingly first time this<br>is an issue; even A/UX 3.x was fine with it before.
diff --git a/core/src/mac/adb/keyboard.rs b/core/src/mac/adb/keyboard.rs<br>index 4e828fc..9edf31e 100644<br>--- a/core/src/mac/adb/keyboard.rs<br>+++ b/core/src/mac/adb/keyboard.rs<br>@@ -140,29 +146,34 @@ impl AdbDevice for AdbKeyboard {<br>response<br>2 => AdbDeviceResponse::from_iter(<br>- AdbKeyboardReg2::default()<br>+ // The key/modifier bits of register 2 are ACTIVE LOW<br>+ AdbKeyboardReg2(0xFFFF)<br>+ // LED state bits (0..2) are host-controlled and active-high<br>.with_led_numlock(self.keystate[SC_NUMLOCK as usize])<br>.with_led_capslock(self.capslock)<br>.with_led_scrolllock(self.keystate[SC_SCROLLOCK as usize])<br>- .with_numlock(self.keystate[SC_NUMLOCK as usize])<br>- .with_capslock(self.capslock)<br>- .with_scrolllock(self.keystate[SC_SCROLLOCK as usize])<br>- .with_cmd(self.keystate[SC_COMMAND as usize])<br>+ .with_numlock(!self.keystate[SC_NUMLOCK as usize])<br>+ .with_capslock(!self.capslock)<br>+ .with_scrolllock(!self.keystate[SC_SCROLLOCK as usize])<br>+ .with_cmd(!self.keystate[SC_COMMAND as usize])<br>.with_control(<br>- self.keystate[SC_LCTRL as usize] || self.keystate[SC_RCTRL as usize],<br>+ !(self.keystate[SC_LCTRL as usize] || self.keystate[SC_RCTRL as usize]),<br>.with_option(<br>- self.keystate[SC_LOPTION as usize] || self.keystate[SC_ROPTION as usize],<br>+ !(self.keystate[SC_LOPTION as usize] || self.keystate[SC_ROPTION as usize]),<br>- .with_delete(self.keystate[SC_DELETE as usize])<br>+ .with_shift(<br>+ !(self.keystate[SC_LSHIFT as usize] || self.keystate[SC_RSHIFT as usize]),<br>+ )<br>+ .with_delete(!self.keystate[SC_DELETE as usize])<br>.to_be_bytes(),<br>),<br>3 => AdbDeviceResponse::from_iter(<br>AdbReg3::default()<br>.with_exceptional(true)<br>.with_srq(true)<br>- .with_address(Self::INITIAL_ADDRESS)<br>-...