Rhapsody DR2 FAT Project

tl;dr Here is a driver/toolchain/hack for Rhapsody DR2 Intel to read FAT floppies, developed on a ThinkPad 560E.

I will be brief, for my short date of breath is not so long as is a tedious tale.

Rhapsody is our favorite lost bridge between OpenStep and OS X, the OS Apple built, shipped to developers, and then quietly shot behind the barn in 1999. Like everyone else, I've read about it for years, hypnotized by the entire mythos. Last October I finally went all the way in: all I wanted was that lean, fast, beautiful "OpenStep 5" running on real hardware.

It had to be a ThinkPad 560E. Partly because it's a perfect little machine, partly because—I won't die on this hill, I just read it somewhere—Steve Jobs carried a 560E when he went back to Apple. Like he would hold it up and say, "This is what we should be building." I spent way too long on eBay, I filled a box with enough parts to build like four of them… You know exactly how that goes.

Then I hit the first wall: Apple had excised the OpenStep PCMCIA-to-SCSI drivers from Rhapsody. No PCMCIA meant no SCSI meant no CD-ROM on a 560E. No CD-ROM meant no standard install.

So I built the machine backwards: I staged the entire OS installation inside an x86 emulator on an M1 MacBook Pro, then raw-copied the 4GB image via dd onto a CF card meant to replace the ThinkPad's internal drive. I know lots of people have done Virtual-installations of Obsolete Operating Systems, but this was my turn; I had to trick the machine into existence before it even saw power. This is fine.

And then I fought the real boss: Rhapsody is… aggressively useless. Rhapsody is almost artistically useless.

"Please Be Useful" became the entire project. The first move was to rebuild the kernel from source, following VirtuallyFun's rebuild-Darwin-from-source guide, because why not, why stop now. Then I packed in every Unix tool that would fit, updated existing tools and added new ones; it's mostly period accurate (because it's not possible to install things too far beyond the fold).

Then I decided I wanted Rhapsody to read FAT floppies, like every other computer built since 1981.

(Honestly, I just wanted an easy way to transfer information; even macOS 26.5 can write to FAT.)

Rhapsody never shipped a working FAT filesystem, not by accident. The Intel branch had quietly flipped its UFS to little-endian, the same filesystem as OpenStep but byte-for-byte backwards and mutually unreadable, plus a rebuilt DriverKit that wouldn't take any of OpenStep's old drivers, and no Blue Box to need HFS. So the only way out was through: build the filesystem, from source, against the Rhapsody/Darwin kernel, and then again, and again... By the time it worked I was on build thirty-one. It kept me occupied when work was slow.

But. B31 worked…the paths of glory lead but to the grave. I tried a mount daemon. A boot script. A thing I named FloppyBridge. I tried routing the floppy through the CD-ROM filesystem, because cd9660 worked and I was losing the plot. I tried stamping a fake NeXT disklabel onto floppies to sneak past the native driver's "no valid label" check—that actually mounted, gloriously, and showed zero files, because the label was on top of the FAT.

By now I had the filesystem, but a filesystem does nothing by itself. It's just dead code sitting in the kernel, waiting for a manager to handle the mount. Rhapsody’s Workspace is normally that manager—but Workspace wouldn't go anywhere near a DOS floppy.

So I became the manager. I built a utility called msdos.util that demand-loaded the filesystem into the kernel and mounted the raw floppy device straight from the Terminal. And it worked: executing msdos.util -m fd0 /FLOPPY spawned a real directory. I dropped files in, and they stuck.

Workspace refused to recognize it as valid media. It used a generic icon, locked out the "Eject" command, and would routinely mount the same disk half a dozen times simultaneously just to mock me.

Then the autodiskmount days. Byte-patched the binary, wired the dead HFS code into a FAT probe, watched it confidently probe the hard disk instead of the floppy... figured out Workspace's "Check For Disk" doesn't call autodiskmount at all. So I reverse-engineered the OpenStep floppy driver, worked out precisely why it won't just load on Rhapsody (a selector list with six keys where this kernel wants seven), grafted the missing method onto IODevice by hand at load time, got it to attach... and realized I never needed that driver either.

The bricks were a genre unto themselves. Fake labels, intercepting /sbin/mount and /sbin/fsck (bad idea; the fake-fsck interceptor led to a kernel panic which led to the ThinkPad trying to boot without fsck…); dropping in Apple's own Floppy.config (two more kernel panics). I became fluent, fluent I say, in single-user mode.

The final breakthrough: the "no valid label" wall wasn't in the kernel at all.

It was four little conditional-jump instructions sitting in the floppy driver binary. I NOP'd all four, 90 90, and the disk just... read.

The fix was four bytes. Finding which four bytes took three months.

One last lie to kill: the driver cached too eagerly and would happily hand you a previous floppy's files. So the final bit was a mount tool that fires a software-eject on mount & unmount, and it stopped… lying. For now. You still need to "Update Viewers."

Today, now, Rhapsody DR2 Intel can read & write FAT floppies: "Check For Disk," DOS icon, files, subfolders, round-trips to modern machines, proper media change. It still mounts every disk as "Floppy," because Workspace picks the mount point itself and never bothers to probe what the volume's actually called. It won't pop the "you may remove the floppy" dialog on eject. Workspace saves that little courtesy for disks it considers first-class, so a foreign disk just gets its icon yanked. (Those problems live in the Workspace binary, which is next month's problem.)

Modern Disk Utility-formatted FAT disks don't work (yet) because they come back partitioned instead of raw BPB-at-sector-zero DOS floppies; reading a partition table is a someday problem. For now, you need true legacy media (I have a box of disks from 1996 that work great). The cache flush also makes the drive do a spin-pause-spin ritual before it settles.

But it works.

Install this and Rhapsody can read FAT floppies. (archive includes bossy sounding instructions.)

It's just not polite about it yet.

*As far as I can tell, this is the first publicly documented native-ish Rhapsody DR2 Intel path for reading and writing FAT volumes from the internal floppy drive, integrated far enough that Workspace can see the disk after “Check For Disk.” Earlier NeXTSTEP/OPENSTEP systems could do DOS floppies, and there were userland/NFS-style tools like vmount, but I found no existing public Rhapsody DR2 i386 fix for the broken floppy/media path.

*is there anyone that repairs ancient ThinkPad batteries? I have like six dead batteries, would love one or two that worked.
 

Attachments

  • Rhapsody_FAT.zip
    Rhapsody_FAT.zip
    130.2 KB · Views: 0
  • msdos.fs.jpg
    msdos.fs.jpg
    2.5 KB · Views: 2
  • ThinkPad560E.jpg
    ThinkPad560E.jpg
    328.7 KB · Views: 2
Back
Top