My favourite PowerMac is a Nintendo Wii

(This is a guest post by Rairii)

Mac OS 7.6 booting on the Wii
Mac OS 9.2.2 booted on the Wii

So today I reached a nice milestone in one of my projects: my work porting classic Mac OS to PowerPC systems with what I affectionately call ArtX chipsets (Nintendo GameCube, Wii, eventually Wii U; the GameCube’s Flipper integrated chipset was very much designed by ArtX as it was effectively finished when ATI acquired the company, and the Wii’s Vegas (and its later revision Bollywood) and Wii U’s Latte are effectively straight successors) reached the desktop for the first time, most likely the first time since the CHRP clone era that someone outside of Apple brought up classic Mac OS on a new system to the desktop. Despite still being nowhere near ready for a public release, I want to talk about the challenges I faced with this project so far.

But first, why port classic Mac OS to this hardware in the first place? I’d already ported NT of course, and during that work I acquired some PowerPC Mac laptops which I also ended up porting NT to, work on one port improved the others and so on. This got me acquainted with the classic Mac OS, and I fell in love with the jank as it were (hacks upon hacks upon hacks going back to the 1980s is something I’d definitely describe as “jank”). Not to mention the m68k part of the TBXI is called “SuperMario”, and was for the entire PowerPC era. I wonder if a developer was a fan in the early 1990s?

Also, for the record: I started this project on 2025-06-22 (when I forked upstream openbios), no kind of coding agent or LLM was used, all coding, reversing and debugging work done by myself. I do these projects for fun and to learn, if I used “AI” it wouldn’t be fun and I wouldn’t learn anything.

Let’s start with the initial boot. “New World” classic Mac OS starts out with a bootloader called the “Trampoline”, which runs on an Open Firmware environment. So I needed to port OpenBIOS. Luckily, around this time Goldfish64 had started his own port of Mac OS X to the Wii, and he’d made an OpenBIOS port that I could use some drivers from, although for various reasons I didn’t just want to use his port directly (which was only targeting Wii/Wii U, I wanted to target GameCube too). I also decided to reuse some existing code to make some driver development easier (specifically the display driver), and thus changed my existing NT ARC firmware loader to load a big endian ELF instead.

I needed some small number of disk drivers for initial bringup, so decided to port my two drivers for devices on the EXI bus (this is just Nintendo and Macronix’s name for SPI), the “SD Gecko” (which is just a straight through adapter for a GameCube memory card slot allowing for SD over SPI), and the “EXI-IDE” (my driver is actually not correct to real hardware, but to my inaccurate emulation in my Dolphin tree allowing for testing under emulator with the low level debugging support that implies).

I wasn’t sure what kind of on-disk format I wanted to use (these drivers on my earlier NT port ran entirely using disk images on a FAT filesystem, due to the requirement for compatibiltiy with existing homebrew loaders that load executables from FAT filesystems, but this would naturally be limited to 4GB images for FAT32, and later versions of classic Mac OS needed more), so for initial testing I just took the “Mac OS ROM” TBXI file and placed it directly on a FAT filesystem as \ppc\bootinfo.txt for OpenBIOS to load it on boot.

So with that I could get the Trampoline running. I decided that I should try and apply as many patches to the image as possible as close to run-time as possible, so mostly untouched existing CD images could be used eventually.

The first issue I had was that the Trampoline makes some assumptions of the physical address space layout that are not true for this system. The physical address of a buffer gets calculated as an invalid address, so I patched that to an address guaranteed to be valid, and also the corresponding code setting up the memory chunk list/page table entries for the kernel.

Additionally, the Trampoline expects that physical addresses from 0x8000_0000 onwards corresponds to memory mapped I/O (on existing systems this code ran on, this would correspond to PCI-bus address space). This is not the case here, and in fact on Wii U, this address would correspond to part of RAM. There was also another assumption that broke on these systems, with holes between areas of RAM in the physical address space, some of which were partially filled by memory-mapped I/O.

The way I fixed this was to patch the initialisation of this MMIO mapping in the kernel memory chunk list, to a map of physical address 0x0100_0000 (partway through one area of RAM) to virtual address 0xE000_0000, with length 0x1000_0000. This specifically maps the whole of the MMIO, plus the end of one RAM area and (for post-GameCube systems) the start of another. (I may change this in future, as on the Wii U, physical address range 0xD000_0000-0xEFFF_FFFF is mapped to a part of the Radeon R7xx GPU called “HDP”, which can be used to map a view of physical memory with specific swizzling and/or endianness swapping, such that a texture in some GPU-specific format can appear to be a linear framebuffer. It depends on whether I need to use this block ) The function used for initialising a mapping in the Trampoline changed at some point and I ended up detecting the older version and hooking the function so I could work around it (earlier versions used a 16-bit page count, later versions used 32-bit). Additionally, older versions of the Trampoline sets up unconditional 1:1 mappings for physical memory above 0x8000_0000, which needs to be removed as they conflict with the mappings set up earlier.

There follows various assorted patches that assume specific hardware. These include: patching out setting some bitflags which correspond to the presence of a microcontroller found on all PowerPC Macintosh hardware, attempting to recalculate the bus frequency using a specific hardware timer, and various register writes and fixups related to a specific interrupt controller device (it’s little endian because it’s on the PCI bus, and naturally, not present here).

Finally, the final call to jump into the loaded kernel initialisation code is hooked so additional patches can be made later after everything is loaded into memory.

Additionally, the device tree must be hacked up a bit to be in a shape the Trampoline will accept. The interrupt controller is faked to be one of the recognised ones (the little endian one from above, because at a register level it’s closest to the Flipper interrupt controller present on all the ArtX chipsets, albeit on Wii U it was changed somewhat to add support for the additional PowerPC cores). The address of the frame buffer in the device tree is changed to the uncached virtual address (in the 0xExxx_xxxx mapping), and finally a fake Mac99-compatible power management device is added to the device tree, so the Trampoline prepares a power management driver for it, that can be replaced later.

As mentioned above, the kernel initialisation is hooked so extra patches can be made. On the kernel side, there is only one patch to be made: the kernel contains several interrupt controller drivers, the one chosen is patched to match the Flipper interrupt controller, with one of the unused ones sacrificed to gain more space for this. The main difference here is that the expected interrupt controller (whose driver is patched) has a legacy mode where it raises a PowerPC interrupt whenever the interrupts change (not just when interrupts are raised) so this needs to be worked around by masking the raised interrupts in the kernel and then unmasking them later on in drivers’ interrupt handlers.

Additional patches are made in the “SuperMario” m68k code, and in PowerPC native executables. The m68k code has various codepaths that read and write directly to native interrupt controller registers, these need to be patched. The function pointers for enabling and disabling audio interrupts need to be stubbed out (there’s already an entry in that table that points to a stub, which is helpful). A function called early in the boot process to initialise the ADB and power management microcontroller does not check if the hardware actually exists, and if it doesn’t it clobbers parts of low memory. A function for initialising hardware interrupts has a bug due to a copy-paste blunder, the intent was to skip past the code for initialising the interrupt for serial port 2 if the hardware isn’t present, but the developers forgot to change the jump label when copy-pasting the code from serial port 1, which causes an infinite loop if serial port 2 doesn’t exist. As for native code, there’s more code that reads and writes to interrupt controller registers which needs to be correctly patched. The USBShimKeyboard driver initialisation code fails to handle the state where no USB controller exists and in that case will call a NULL pointer inside the m68k emulator. The power management driver mentioned above is also replaced entirely here (currently I use the stub driver from BlueBox but plan to write my own later to add proper support for shutting down and restarting).

All of this is enough to get the TBXI to boot to blinking floppy – after that I wrote a display driver (thanks to Elliott Nunn for his virtio driver, it was very helpful) so I could see it correctly, followed by a driver for the gamecube controller ports (porting from my NT driver for the same) so I could move the mouse cursor around without USB.

At this point I started to implement a block IO driver (for EXI devices), but ended up getting stuck thinking about how to deal with how the disk format should be laid out and how the driver should work. Then Mac OS for CHRP got dumped, and I got sidetracked with patching up the later TBXI images to boot it, thinking running 7.x would be useful on a GameCube which doesn’t even have enough RAM to support 8.0 at minimum requirements, and after that I got sidetracked with other projects. Almost a year later I came back to it, implemented my preferred disk format in OpenBIOS and decided to hack up a driver faking SCSI (some other drivers did this, most notably classic Mac OS drivers for various SATA controllers). There were a few issues I found when writing the fake-SCSI driver too: I had to add another patch to the m68k code to force loading the disk driver (and I mean this, a driver loaded from the disk itself, basically implementing the actual disk devices on top of some partitioned block device) as a newer type rather than the older type (the older type was effectively obsolete when the first PowerPC systems released anyway, and I don’t even support the old-style calls from my fake SCSI driver, which is probably why it crashed trying to load it as an older type driver), and also found an interesting quirk where the optical disc driver (loaded from the block device itself) emulates 512-byte sectors on 2048- or 2352-byte sector block devices by making a read call setting up 3 scatter-gather buffers, except it never checked if the underlying SCSI driver actually supports scatter-gather, so I had to implement support for that on reads.

I still saw a blinking floppy though, some debugging showed me what was being rejected, a PowerPC function StartLib!GetStartupDevice was being called to get the boot device, and it made some assumptions of both the device tree and that there was some kind of built in SCSI device that needed separate handling. The first one was simple enough (fix the device tree in my driver’s initialisation code), the second one was more interesting in that I had to grovel into internal structures to fix an index in 3 different places (including the device tree) to ensure it was non-zero and so the correct code path would be executed.

With this done I saw a happy Mac icon for the first time, but then got rejected by the HFS boot sector (something errored and it returned). This turned out to be a bug in my own driver: I was debugging in dolphin with a hacked up EXI-IDE device; reading and writing data in PIO mode for IDE devices deals in 16-bit words, and I didn’t expect my code to get passed a completely unaligned odd buffer address (low 4 bits equal to 1), so I had to modify my low level driver to not even attempt EXI DMA for such an address. The bug manifested as a byte effectively failing to be written out, with remaining data getting offset by one byte; at least this happened when reading the header of a resource fork, and what failed was the validity checks for this data, making it much easier to debug (I ended up dumping RAM and comparing with the expected data from the disk image I was using).

After this, Mac OS 9.2.2 started to boot in my hacked up Dolphin tree, very slowly. It took an hour before it finally crashed, and then I tried 7.6, which also crashed, but earlier. I realised that it was probably crashing trying to load MacsBug, removed it, and after about 20 minutes I was staring at the desktop.

Mac OS 7.6 booted in my hacked up Dolphin tree

The following morning I tested on real hardware (using SD over SPI). This basically booted 7.6 within 40 seconds, and this was supposed to be the slowest access mode for an SD card! My previous experience was writing an NT driver for SD over SPI though, and perhaps that is more of an outlier. See this video installing NT on a GameCube using such a block device, and note that the NT text setup file copy is sped up 64 times – it’s VERY slow. The difference here is that I get to hog the whole CPU when performing a transfer – in fact there’s no other option, if I return a value specifying the transfer is asynchronous, the caller proceeds to busy-wait for interrupts in a loop waiting for the transfer to complete (although the busy-wait does check for all controllers present on the system).

Later on I added some hacked up crash handler so I could try to debug what was going on with MacsBug… it turned out to be an emulation error, no such crash occured when loading MacsBug on real hardware. I then found out the reason Mac OS 9.2.2 was crashing on boot was because of Open Transport, removing it from the Extensions folder caused it to boot perfectly fine. My guess is that Open Transport can’t handle no serial or network device being present at all.

As I mentioned, my port is still nowhere near release. Next up will be bringing up the Wii’s SD controller, then the USB controller (I’ve already done some reversing work related to that, I know there’s a vibecoded EHCI driver now, that’ll probably only aid in reversing work really), then getting the port brought up on the Wii U. At some point I want to play around with patches for blowing through at least some of the RAM barriers too.

AIX 4.1.5 on QEMU

(This is a guest post by Antoni Sawicki aka Tenox)

AIX on QEMU is hardly any news. It has been done over and over again. Especially thanks to Artyom Tarasenko and subject to even more posts by Neozeed. However it was mostly plagued by having only serial console and using outdated QEMU. For a long time I wasn’t able to run it. Had to fire up some IBM rust if I wanted to build/test something on AIX. Lack of local UI was also pain. AIX 4.1.5 is full of cool GUI software, CATIA, Corel Draw, Word Perfect, FrameMaker, Lotus Notes, not to mention VisualAge! I know that you can connect to it via Xephyr/Xnest etc, but having a local console is way better!

Behold! AIX 4.1.5 in a full glory on emulated IBM RS/6000 7020-40P with PowerPC 604 and GXT110P video adapter. Also featuring front the panel display:

Balls of AIX!

Let’s look at some cool apps!

Acrobat Exchange
FrameMaker
Corel Word Perfect
WABI
SoftWindows
SimCity on AIX
VisualAge IDE
Lotus Notes 4

I have prepared a ready to run, portable QEMU image with binaries for MacOS/Linux/Windows. Download and run: https://files.42718.net/mirror/tenox/os/aix/Virtual/aix415rs6k-qemu.tar.lz

Have Fun with Virtualization!

PS You may also be interested in AIX 3.2.5 in QEMU

Personal Computer Simulator/6000

(This is a guest post by Antoni Sawicki aka Tenox)

Previously I ran a whole series of articles about vintage hypervisors and dos emulators for unix. Some of them: Merge, VP/ix, Wabi, SoftWindows, etc. Today we have a special gem: PC Simulator on AIX 3.x on POWER!

I recently virtualized AIX 3.2.5 on QEMU. While browsing Info Explorer I noticed this curiosity:

As you can imagine in 2026 this would be pretty much unobtanium relic. Fortunately Plamen, now confirmed having a time machine was able to score this:

PCSIM – Personal Computer Simulator/6000

Above is a plain text / ascii mode.

There also is X11 version!

Capable of VGA graphics!

Microsoft Flight Simulator on PCSIM on AIX 3.2 on QEMU

Usage: pcsim. For X11/VGA mode: -dmode VGA. The pcsim can be launched with PC BASIC bios, or load DOS from floppy disk or HD image. For hd image: -Cdrive /usr/local/pcsim/pcdos5.img – In order to quit press ESC + type pcsim.

The pcsim tarball is here: https://files.42718.net/mirror/tenox/os/aix/3.2/pcsim-1.2-aix325-full.tar.Z

AIX 3.2.5 in QEMU

(This is a guest post by Antoni Sawicki aka Tenox)

Behold! AIX 3.2.5 now runs in QEMU!

Along with full X11 AIXwindows Desktop support on emulated GXT150L.

Also featuring the 3 digit diag display with key switch for service mode! The display is addressable from the os via /usr/lib/methods/showled.

There are some gnu/pds apps in /usr/local/bin.

The exact machine emulated is 7006-41T (POWERstation 41T, 1994) + GXT150L

The QEMU branch: https://github.com/tenox7/qemu/tree/aix3

Ready to run portable QEMU image: http://files.42718.net/mirror/tenox/os/aix/Virtual/aix325rs6000-qemu.tar.lz

Have fun with Virtualization!

Updates:

CorelDRAW on AIX!
PCSIM – PC Simulator!
PCSIM VGA graphical mode!

OS/2 PowerPC Edition on QEMU

(This is a guest post by Antoni Sawicki aka Tenox)

Yesterday I featured a QEMU branch capable of booting Windows NT PowerPC. I was asked in comments if this by any chance also supports OS/2 on this architecture. The answer is: YES!

Here is the result:

Here is a link to a ready to run image: http://files.42718.net/mirror/tenox/os/os2/virtual/os2powerpc-qemu.tar.lz – it takes a little bit of time appearing stuck on PowerPC logo with a warning sign, but not too worry it will boot up.

The branch is https://github.com/tenox7/qemu/tree/powerpc

You can learn more about OS/2 PowerPC edition at OS/2 Museum.

Windows NT 4.0 PowerPC on QEMU

(This is a guest post by Antoni Sawicki aka Tenox)

Another day another NT QEMU post. This time we have stock Windows NT 4.0 PowerPC running on QEMU, with complete emulation of the BIOS / Firmware and everything. Networking and 1280×1024 resolution.

QEMU branch: https://github.com/tenox7/qemu/tree/powerpc

Ready to run image: http://files.42718.net/mirror/tenox/os/winnt/VMs/qemu-ppc/nt40powerpc-qemu.tar.lz

The image includes recently acquired Microsoft Office, SDK Tools, Visual Studio and a bunch of ported tools and utilities.

You may also be interested in Windows NT on IBM RS/6000 โ€“ Definitive Guide

Running back to 2002 (the hard way)

PowerBook G4 Titanium running OS X 10.2 & Microsoft Office 2004

This honestly should have been much easier.

Or maybe Iโ€™ve just forgotten how absolutely hostile early OS X could be.

The mistake begins

It started, as these things always do, with someone mentioning the PowerBook G4 Titanium. One quick eBay search later and, well ยฃ30 later I owned one.

โ€œThey got me.โ€

It showed up absurdly fast (Sunday delivery? really?), in surprisingly good condition, and I already had a charger. So naturally, the sensible thing to do wasโ€ฆ

Install Tiger.
Which worked. Immediately. Of course it did.

But that wasnโ€™t good enough

Tiger is fine. Great, even.

But itโ€™s not Jaguar.

10.2 was always my favorite early OS X, that weird in-between era where it still felt experimental but usable. And according to basically everything online, early Titanium PowerBooks should run it.

So I grabbed a cheap โ€œreproductionโ€ 10.2 CD set.

And this is where everything went wrong.

Kernel panic

Not a great start.

At first glance it looks like some kind of network address corruption, but in reality itโ€™s just the kernel screaming because something is very wrong at a hardware level.

Time to go verbose.

Welcome back to Open Firmware

You canโ€™t just hold C and Cmd+V like a normal person.

No, this is 2002.

So into Open Firmware we go:

boot cd:,\\:tbxi -v

Now we get actual outputโ€ฆ and a much clearer failure.

Kernel panic in the FireWire driver

FireWire: the red herring

The panic traces back to:

com.apple.driver.AppleFWOHCI

Ah yes โ€” FireWire.

Because of course it is.

So the obvious thing to do is disable it from Open Firmware:

dev /pci@f4000000/firewire
" disabled" encode-string " status" property

Andโ€ฆ it works.

Kind of.

The system gets further. No panic. Progress!

The ‘stop sign’ meaning this OS isn’t supported on this Mac

And then: the stop sign

Instead of a crash, we now get a ๐Ÿšซ

The classic โ€œthis OS is not supported on this Macโ€ symbol.

Which is when it finally clicks:

This machine is a PowerBook3,5 (867MHz)
And 10.2.0 predates it

So no, this was never going to work.

The FireWire panic wasnโ€™t the root problem; it was just the first thing new enough hardware broke.

At this point, a normal person would stop

I did not stop.

If Apple wonโ€™t build it, we will

If 10.2.0 wonโ€™t run, then clearly the answer is:

  • build a 10.2.8 install manually
  • using QEMU
  • on a completely different machine
  • then sneak it onto the laptop

Perfectly reasonable.

Building Jaguar in exile

QEMU can emulate a G4 well enough to:

  1. Install Tiger
  2. Install Jaguar
  3. Update Jaguar โ†’ 10.2.8

Something like:

qemu-system-ppc \
-M mac99 \
-cpu G4 \
-m 512 \
-drive file=macosx_6gb.vmdk \
-boot c

From there:

  • swap disks around
  • update Jaguar
  • boot back into Tiger
  • use Disk Utility to create a compressed image

Eventually producing:

osx-10.2.8.dmg

Of course it’s not that easy!

First off is to get ISO images. I actually started this process with the Tiger I already have in hand. To grab an ISO under macOS 26 it’s a simple command:

hdiutil convert /dev/disk4 -format UDTO -o OSX_Tiger_10.5.iso

And about 20 minutes of the DVD drive spinning around I got my ISO image.

 % file OSX_Tiger_10.5.iso 
OSX_Tiger_10.5.iso: Apple Driver Map, blocksize 512, blockcount 5531738, devtype 0, devid 0, driver count 1, contains[@0x200]: Apple Partition Map, map block count 4, start block 1, block count 63, name Apple, type Apple_partition_map, valid, allocated, contains[@0x400]: Apple Partition Map, map block count 4, start block 64, block count 8, name Macintosh, type Apple_Driver_ATAPI, boot arguments DMMY, valid, allocated, real driver, chain driver, contains[@0x600]: Apple Partition Map, map block count 4, start block 72, block count 5531656, name Mac_OS_X, type Apple_HFS, boot arguments goon, valid, allocated, readable, writable, mount at startup, contains[@0x800]: Apple Partition Map, map block count 4, start block 5531728, block count 10, type Apple_Free

Now to run it under qemu:

qemu-system-ppc \
-L pc-bios \
-M mac99,via=pmu \
-cpu G4 \
-m 512 \
-prom-env 'auto-boot?=true' \
-prom-env 'boot-args=-v' \
-drive file=tiger.iso,media=cdrom,format=raw \
-drive file=macosx_6gb.vmdk,format=vmdk,cache=unsafe \
-boot d \
-net none \
-no-reboot
Tiger on QEMU / OS X Tahoe 26.4

And in a minute or so on my mac mini running “QEMU emulator version 10.1.2” from homebrew I was up and running. yay. I don’t need or care about audio/networking as this is just to get a PowerPC OS up and running, using the media I have in hand. Bring up the disk util, partition the VMDK, the install the OS. You’ve probably seen/done it a dozen times so nothing to really see here.

Once my 10.2 reproduction media arrive, I went through the hardware boot to only find out that 10.2.0 just won’t run on my PowerBook G4. This is where we use the emulation route. Could I simply grab an ISO using hdiutil?

NO

Of course not. Why would it work? It comes down to the older versions of OS X being very MacOS 9 style disks, which hdiutil simply will not grab. You end up with meaningless data. What about ‘dd’ on /dev/disk4? /dev/rdisk4? did you set bs=2048? YES YES YES… none worked.

So back in homebrew I got the cdrutils from Joerg Schilling which gives me the readcd command, which finally let me grab the ISO’s

% file OSX_Jaguar_10.2-disc1.iso
OSX_Jaguar_10.2-disc1.iso: Apple Driver Map, blocksize 2048, blockcount 331264, devtype 1, devid 1, driver count 4, contains[@0x200]: Apple Partition Map, map block count 10, start block 1, block count 63, name Apple, type Apple_partition_map, valid, allocated, in use, readable, contains[@0x400]: Apple Partition Map, map block count 10, start block 64, block count 56, name Macintosh, type Apple_Driver43, boot arguments ptDR, valid, allocated, in use, has boot info, readable, writable, pic boot code, real driver, chain driver, contains[@0x600]: Apple Partition Map, map block count 10, start block 120, block count 140, name Macintosh, type Apple_Driver43_CD, boot arguments CDrv, valid, allocated, in use, has boot info, readable, writable, pic boot code, real driver, chain driver, contains[@0x800]: Apple Partition Map, map block count 10, start block 0, block count 0, type Apple_Void, contains[@0xA00]: Apple Partition Map, map block count 10, start block 260, block count 56, name Macintosh, type Apple_Driver_ATAPI, boot arguments ptDR, valid, allocated, in use, has boot info, readable, writable, pic boot code, real driver, chain driver, contains[@0xC00]: Apple Partition Map, map block count 10, start block 316, block count 140, name Macintosh, type Apple_Driver_ATAPI, boot arguments ATPI, valid, allocated, in use, has boot info, readable, writable, pic boot code, real driver, chain driver, contains[@0xE00]: Apple Partition Map, map block count 10, start block 456, block count 512, name Patch Partition, type Apple_Patches, valid, contains[@0x1000]: Apple Partition Map, map block count 10, start block 0, block count 0, type Apple_Void

As you can see it’s a lot of partitions, and various bits that it’s expecting. Kind of annoying that the system utils cannot grab these kinds of images, but in the end we got there.

Naturally, Jaguar has to be run differently as it’s just more tied to older hardware:

qemu-system-ppc \
-machine mac99 \
-cpu G4 -m 1G \
-name "Mac OS X 10.2" \
-hda "macosx_6gb.vmdk" \
-cdrom "OSX_Jaguar_10.2-disc1.iso" \
-device pci-ohci,id=usb1 \
-device usb-mouse,bus=usb1.0 \
-device usb-kbd,bus=usb-bus.0 \
-device usb-audio,bus=usb1.0,audiodev=audio \
-audiodev id=audio,driver=coreaudio \
-device sungem,netdev=network \
-netdev id=network,type=user \
-no-reboot \
-accel tcg \
-boot d
Jaguar installer

The next catch is that the diskutil just hangs partitioning the hard disk. I’ve no idea why.

It just currently hangs forever on 10.2

So, the solution is to boot back into Tiger, add a second disk, partition it there, and then use that disk in the Jaguar boot. After that it installs just fine. I enabled the sound and network just to setup NTP so at least my image isn’t too stuck in 2002.

Oh, one trick I found out decades too late, is that you can cloverQ the named registration, so you don’t have to make up bogus phone numbers and a semi valid mailing address. I didn’t know is that, it’ll just kick you to the account creation screen, and you are good to go!

OS X 10.2.0 installed into QEMU

After that it’s just a matter of running the 10.2.8 combination patch, to bring the VM up to 10.2.8

10.2.8 Combo update

From there the final hurdel is to create a RAW disk image to transfer the Tiger diskutil ‘disk image’ to. This way you can easily mount the RAW image by renaming the extension to .dmg and OS X (thankfully) still supprots HFS+ so you can simply use finder or ‘cp’ to copy off the compressed disk image onto a USB drive, and now we are ready to image the PowerBook using our updated OS X Jaguar!

The USB betrayal

Naturally, the Tiger installer refused to mount USB.

Because of course it did.

The final workaround

So instead:

  1. Repartition internal disk
    • small staging partition (~4GB)
    • main target partition (remainder of the disk)
  2. Install Tiger (again)
  3. Copy 10.2.8.dmg to staging partition
  4. Boot Tiger installer
  5. Use Disk Utility โ†’ Restore image onto main partition

And finallyโ€ฆ

10.2.8 running on the PowerBook G4

Success

Jaguar 10.2.8.

On a machine that absolutely refused to run 10.2.0.

With Office 2004, because why not.


Lessons learned

  • Early OS X is tightly hardware-bound, not just โ€œolderโ€
  • Kernel panics are often symptoms, not causes
  • FireWire was innocent (this time)
  • USB support in installers wasโ€ฆ optimistic

And most importantly:

Just because you can reconstruct a historically accurate install pipeline via emulation and disk imagingโ€ฆ
doesnโ€™t mean you should.

The obvious solution (that I ignored)

A single FireWire cable.

Target Disk Mode.

Done in 20 minutes, by using my B&W G3 PowerMac that is currently running Windows NT, but it wouldn’t matter as I could just hold option and select the FireWire target disk to boot to/from as it’ll happily boot/install 10.2.0 without a hitch. It being a G3 makes no difference as the same kernel works on G3/G4 processors.

But whereโ€™s the fun in that?

For those brave enough to get to the end of the post, I uploaded all my Jaguar images onto archive.org. I’m sure it’s been preserved before, but since I was in the mood, I also uploaded Office 2004.

Microsoft Word 6.0 for PowerPC NT

(This is a guest post by Antoni Sawicki aka Tenox)

It appears that up until just now we did not have archived copy of MS Word 6.0 for PPC. There were copies floating for Alpha and MIPS, for example https://archive.org/details/ms-word60-nt. However PPC version was nowhere to be found…

Until Term24 pointed me to this eBay auction:

Since it clearly said PowerPC on the box I got it… and here it is:

MS Word 6.0 on Windows NT 4.0 PowerPC / PPC

Now thanks to Rairii you can enjoy it on a PowerMac or WII!

Download ISO or RAR

Update: now you can enjoy it virtualized on QEMU!

A quick video on installing Windows NT 4.0 with Wack0’s maciNTosh 0.05

First, I have to say it works incredibly well!

The biggest gotcha seems to be that the MSDE/Visual C++ 4.0 studio crashes. And pinball doesn’t work. Very possible some issue with the dingus PowerMac emulator.

For anyone wanting to follow along, I put the CD-ROM Image on archive.org:

https://archive.org/details/nt40wks-en_grackle_0.05

Along with everything needed for dingusppc:

https://archive.org/details/dingusppc

And I run it simply run it as:

dingusppc.exe -r -m imacg3 -b imacboot.u3 --rambank1_size=128 --hdd_img=2000.disk --cdr_img=nt40wks-en_grackle_0.05.iso

I did add some quality-of-life updates including:

  • Service Pack 2 for Windows NT
  • Internet Explorer 3.0
  • Wx86 (run limited x86 binaries on PowerPC)
  • Info Zip/Unzip
  • Neko 98
  • DooM
  • Neko Project II 
  • Command line Visual C++ 4.0

I’ve tried to port MAME 0.36 & Fallout1-RE, but both I’m having some DirectX issues. I’m honestly surprised MAME links. It’s getting harder and harder to find those old win32 update packages for MAME. Not sure anyone saved them?

Windows NT 3.51

And as a bonus, for those wanting 3.51, I’ve also setup a CD-ROM with SP5:

Windows NT 3.51 Workstation for PowerPC with maciNTosh/grackle 0.05

Installation is about the same, just use the 3.x framebuffer driver.

Patreon

I also want to give a huge thanks to the fine folks over on my Patreon for helping to finance stuff like this:

B&W G3 incoming!

With any luck, it’ll get me to a native experience, and allow for some debugging!

Rairii’s incredible port of ARC & Drivers for NT PowerPC to G3 Macintoshes

Windows NT on a Macintosh Powerbook G3 (Lombard)

This has been a rush of excitement! Rairii published their port of the ARC & Drivers needed to get NT 4.0 working on commodity PowerMac hardware over on github. And what about running it under emulation? Once more again Rairii provided a custom fork of dingusppc, again over on github!

A custom CD-ROM worked best (for me?!) for installation, combining the ARC & Drivers, along with a copy of Windows NT Workstation onto a single disc. Rairii provided the magical recipie for creating the ISO:

genisoimage -joliet-long -r -V 'NT_arcfw' -o ../jj.iso --iso-level 4 --netatalk -hfs -probe -map ../hfs.map -hfs-parms MAX_XTCSIZE=2656248 -part -no-desktop -hfs-bless ./System -hfs-volid NT/ppc_arcfw .

And the needed hfs.map:

# ext.  xlate  creator  type    comment
.hqx    Ascii  'BnHx'   'TEXT'  "BinHex file"
.sit    Raw    'SIT!'   'SITD'  "StuffIT Expander"
.mov    Raw    'TVOD'   'MooV'  "QuickTime Movie"
.deb    Raw    'Debn'   'bina'  "Debian package"
.bin    Raw    'ddsk'   'DDim'  "Floppy or ramdisk image"
.img    Raw    'ddsk'   'DDim'  "Floppy or ramdisk image"
.b      Raw    'UNIX'   'tbxi'  "bootstrap"
BootX   Raw    'UNIX'   'tbxi'  "bootstrap"
yaboot  Raw    'UNIX'   'boot'  "bootstrap"
vmlinux Raw    'UNIX'   'boot'  "bootstrap"
.conf   Raw    'UNIX'   'conf'  "bootstrap"
*       Ascii  '????'   '????'  "Text file"

I went ahead and made the image, and added in Service Pack 2, Internet Explorer 3 and IIS3 onto the same CD-ROM to make things easier for me to deal with. It’s on archive.org.

On Discord and impromptu porting session broke, out and we got NP21 up and running!

NP21

Unfortunately, it is very slow. I have no idea how it performs on real hardware, it’s entirely possible that it really is unplayable. It’s still pretty amazing that the OS booted up and I could actually compile something!

Even the usual fun text mode stuff from Phoon, Infocom’87, F2C, compiled!

Phoon!

But will it run DooM?

DooM & Atlantis

Of course, it runs! I’m using the 32bit C code from Sydney (ChatGPT), which runs just great.

Into 3D space

I was able to compile GLuT on the way to try to build ssystem but there is two textured OpenGL calls missing, meaning that the more fun OpenGL stuff simply will not work.

Setting expectations

As a matter of fact, lots of weird stuff doesn’t work, the install is very touchy so don’t expect a rock-solid experience, but instead it was incredibly fun to try to get a bunch of stuff up and running.

Thanks again to @Rairii for all their hard work! This is beyond amazing!

— it’s 3am and I’m exhausted, but I had to share this out some how some way!

NT ON PowerPC! It’s happening!