powermac-nt-hal v1.0

Windows NT 4.0 for PowerPC on the Apple Network Server 500/700: a HAL, an ADB driver and an ARC firmware, all built from source, on one boot floppy. Source on GitHub.

Download

Nothing on the floppy is Microsoft's; it is GPL-2.0-only, like everything here. You still need the Network Server's Open Firmware 2.26NT ROM and your own Windows NT 4.0 Workstation for PowerPC CD.

LICENSE18,092 bytes8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643
NOTICE7,859 bytes0090c0731bb3fc2e31ca2e8dd1ceb7bd21eadba12c96fc0c6826483e704a9cfd
SHA256SUMS347 bytes
powermac-nt-hal-v1.0-boot-floppy.img1,474,560 bytesfe7fbf3590d9556b88bdf7958e4b9805da8c7d27c17652ae92f50f41322ce84b
powermac-nt-hal-v1.0-parts.zip52,069 bytes4b43413537f4bac06e6890feaccb6ede35533b5451056eefec29f57d062f654b

Installing Windows NT 4.0 on an Apple Network Server, start to finish

Every key you press, from a cold machine to the Windows NT logon screen. About forty minutes of wall-clock time on an emulated machine, most of it NT copying files. Nothing is written to your CD image at any point.

0. What you need

The emulatorGranny Smith, main, built with make headless (or make run for the browser). EMULATOR.md is the setup page
The Open Firmware 2.26NT ROM for the Network ServerMD5 ad405e01c663340c479668c70f741f1b, from the TinkerDifferent thread. It must be the NT ROM; the production 1.1.22 ROM cannot run NT at all
A Windows NT 4.0 Workstation for PowerPC CD imageOEM 000-48303, October 1996, MD5 ab37556d72818ed082c1d01c2d7f1898. It is read, never written
Its Product IDthe digits on the Certificate of Authenticity. GUI Setup will not continue without one
clang-18, lld-18, python3to build this repository. No Microsoft tool, header or DDK

1. Build the floppy and the disk

make floppy                               # -> build/boot-floppy.img
make disk                                 # -> build/nt-disk.img, 512 MB

make floppy compiles the HAL, the ADB driver and the ARC firmware and lays them out, with a txtsetup.oem and three Open Firmware scripts, as a 1.44 MB FAT12 image of seven files. Nothing on it comes off the CD; it is GPL-2.0-only and may be shared, and every release carries one. The build is reproducible: the same tree gives a byte-identical floppy.

make disk writes an empty disk with the one thing Setup insists on before it will start: an ARC system partition, 32 MB of FAT at the front, which on a real ARC machine ARCINST.EXE would create. Install to the second partition; the first is where the firmware reads OSLOADER.EXE and HAL.DLL from.

Rebuild the floppy whenever you rebuild the HAL, the ADB driver or the ARC firmware: the copies on the floppy are the ones Setup and the disk boot load.

2. Configure the machine

ModelNetwork Server 500 (model=ans500)
ROMthe 2.26NT ROM
RAM64 MB. Not the 32 MB default; see below
CDyour NT CD at SCSI id 0 on the first fast/wide controller (/bandit/53c825@11)
Disknt-disk.img at SCSI id 0 on the second controller (/bandit/53c825@12)
Floppyboot-floppy.img in the internal drive

Headless:

./build/headless/gs-headless --speed=turbo rom=<2.26NT.rom> model=ans500 ram=65536 \
      drive=scsi:0:cd:/path/to/nt4-ppc.iso drive=scsi2:0:hd:/path/to/nt-disk.img \
      fd0=/path/to/boot-floppy.img

In the browser, set RAM to 64 MB and attach the three images; the defaults put the CD and the disk at the right ids.

The ids are hardcoded in the floppy's scripts: boot.of points the firmware at /bandit/53c825@11/sd@0,0 and bootdisk.of at /bandit/53c825@12/sd@0,0. A CD anywhere else gets you to the firmware and then arcfw: fatal: cannot load '...\PPC\SETUPLDR'.

RAM is not negotiable. setup.of puts the load address at 62 MB. On a 32 MB machine the load still says ok, and the eval then fails with an unknown word whose name prints as a run of blanks. That blank word is the signature of too little RAM.

3. The firmware: three lines

Cold-boot. The firmware tries its default device, fails, and stops at 0 >. That failure is normal.

Once per machine (it saves little-endian mode and the load addresses to NVRAM, then resets):

load fd:,\setup.of
load-base loadsize eval

Wait for 0 > to come back. Then, to install:

load fd:,\boot.of
load-base loadsize eval

You should see the firmware load, the floppy read into RAM, and SETUPLDR start off the CD:

Loading PE/COFF image_base 50000
powermac-nt-hal: reading the OEM disk into RAM (this takes a while) .........
powermac-nt-hal: B40 blocks of the OEM disk are in RAM
powermac-nt-hal: starting Windows NT Setup

Arcfw 0.1: ARC firmware for the Apple Network Server (powermac-nt-hal)
arcfw: system parameter block at 4000, 37 vector entries
arcfw: KSEG0 mapped, 800000 bytes
arcfw: configuration tree built
arcfw: booting 'multi(0)scsi(0)cdrom(0)fdisk(0)\PPC\SETUPLDR'
arcfw: loaded at 80600000..80647200, entry descriptor 80641aac
arcfw: starting the loader

then SETUPLDR's blue Windows NT Setup screen on the serial console and the monitor.

The comma after fd: is required: Open Firmware reads what follows : as a partition number. dir fd:,\ lists the floppy if you want to check the drive is live first.

4. Text-mode Setup

The first screens come through the firmware onto the serial console and the screen alike; from the kernel onward Setup draws on the monitor and takes the ADB keyboard.

ScreenPress
Select the computer type↓ to Other, Enter. Enter again for the support disk (the floppy is already in). One entry is offered, Apple Network Server 500/700: Enter
Mass storagethe step everyone skips. S, then Other, Enter, and pick Apple Desktop Bus keyboard and mouse, and the OEM disk (powermac-nt-hal). The list then shows two devices: Enter
Video adapter↑ twice from Other to Motorola Power Stack (cirrus 54xx), the CD's own entry, Enter. (Floppies built before 5 November 2026 offered Cirrus Logic 54M30 (Apple Network Server 500/700) under Other instead, carrying a patched driver; the HAL no longer needs it)
Welcome to SetupEnter
Mass storage (NT's own list)Enter
LicencePage Down eighteen times, then F8
Hardware listshould read Apple Network Server 500/700, the Cirrus Logic display you chose, XT, AT, or Enhanced Keyboard. Enter
Partitions↓ twice to D:, the 478 MB partition. Enter. Never C:, the system partition
File systemEnter on Leave the current file system intact. Not NTFS: the firmware reads FAT only, and the installed system boots from it
DirectoryEnter for \WINNT
Disk examinationEsc to skip it
Copyingten to fifteen minutes
This portion of Setup has completed successfullyEnter. NT restarts the machine through Cuda and the firmware comes back to 0 >

Why the mass-storage step matters: SETUPLDR takes your keystrokes through the firmware, so everything works until NT's own keyboard stack starts, which is several screens later. The ADB driver is what gives NT a keyboard, and [SCSI] is the one class SETUPLDR loads arbitrary drivers for. Skip it and Setup dies with "Setup did not find a keyboard connected to your computer", which is unrecoverable. The same driver serves the floppy image in RAM to the copy phase, since NT has no driver for the real drive.

5. GUI Setup and the logon screen

Back at 0 >, with the same floppy in the drive:

load fd:,\bootdisk.of
load-base loadsize eval

bootdisk.of loads this project's ARC firmware (ARCFW.EXE, built from src/arcfw; no Microsoft code runs before NT's loader), sets the ARC environment for this boot, and points the firmware at the disk. Arcfw 0.1 reports what it found (it asks only SCSI target 0 and the targets the boot variables name; setenv ARCFW-SCSI-TARGETS all at the prompt makes it scan every id, at a selection timeout for each absent one), OSLOADER's menu shows Windows NT Workstation Version 4.00, the kernel loads, the HAL comes up, and after autochk the Setup wizard is drawn:

Loading PE/COFF image_base 50000
powermac-nt-hal: starting the installed Windows NT

Arcfw 0.1: ARC firmware for the Apple Network Server (powermac-nt-hal)
arcfw: system parameter block at 4000, 37 vector entries
arcfw: KSEG0 mapped, 800000 bytes
arcfw: configuration tree built
arcfw: booting 'multi(0)scsi(1)disk(0)rdisk(0)partition(1)\os\winnt40\osloader.exe'
arcfw: loaded at 80600000..8064a800, entry descriptor 80643d38
arcfw: starting the loader
OS Loader V4.00

setenv ARCFW-DEBUG 7fff at the 0 > prompt before the load makes the firmware trace every ARC call NT's loader makes (the tree it hands over, the memory descriptors, every Open, Read and GetEnvironmentVariable) on the serial console; setenv ARCFW-DEBUG 0 turns it off again. The value is kept in NVRAM.

Every page takes Enter on its default button except the three marked.

PagePress
WelcomeEnter
Setup OptionsEnter (Typical)
Name and Organizationtype a name, Enter
Registrationthe Product ID. The boxes do not auto-advance: type the first group, Tab, the next. All seventeen digits typed straight through leaves five in the first box and "The Product Id you entered is not valid", which is not a rejected key
Computer Nametype a name, Enter
Administrator AccountEnter (an empty password is accepted)
Emergency Repair Disk↓ to No, do not create, Enter. The only floppy NT can see is the RAM disk
Select ComponentsEnter
Windows NT NetworkingEnter
How to participate on a network↑ to Do not connect this computer to a network at this time, Enter. There is no adapter driver; the default's search finds nothing and leaves Next greyed
Finishing SetupEnter
Date/Time, DisplayEnter through them. Detection names a cirrus compatible display adapter at 256 colours
Windows NT 4.00 has been installed successfullyEnter. NT restarts

At 0 > again, bootdisk.of and its eval one more time, and the installed system boots to Press Ctrl + Alt + Delete to log on. Ctrl+Alt+Del on the ADB keyboard (Option is Alt) brings up Logon Information; Enter logs Administrator on with the empty password, and the desktop comes up with its Welcome to Windows NT dialog.

The Windows NT 4.0 desktop on the Apple Network Server

6. Keeping the result

The guest's writes go to the emulator's own copy of the disk image. Before you stop the machine, export it from the emulator's shell:

machine.scsi2.device[0].image.export("nt-installed.img")

It refuses to overwrite, so remove the destination first. To put a rebuilt HAL onto an installed disk without running Setup again, the loader takes HAL.DLL from the system partition (partition 1), not from \WINNT\system32:

python3 tools/fatput.py nt-installed.img 1 '\OS\WINNT40\HAL.DLL' build/hal.dll

7. When it does not look like this

SymptomCause
load fd:\boot.of says PARTITION is not a numberthe comma: fd:,\boot.of
eval reports an unknown word printed as blanks32 MB of RAM; the machine needs 64
arcfw: fatal: cannot load '...cdrom(0)fdisk(0)\PPC\SETUPLDR'the CD is not at id 0 on the first controller, or it is not an NT 4.0 PowerPC CD
arcfw: fatal: cannot load 'multi(0)scsi(1)disk(0)...osloader.exe'the disk is not at id 0 on the second controller, or its system partition has no \OS\WINNT40\OSLOADER.EXE yet (text-mode Setup has not completed)
arcfw: fatal: no OSLOADER in the environmentbootdisk.of was not what ran; it sets the ARC variables on /options before starting the firmware
arcfw prints its banner and nothing after starting the loadersetenv ARCFW-DEBUG 7fff, boot again, and read the trace
Setup did not find a keyboard connected to your computerthe ADB driver was not added at the mass-storage screen (S, Other). Start over
The Product Id you entered is not validthe digits were typed into one box; Tab between the three
GUI Setup shows a backdrop and one grey Back buttona HAL older than 17 September on the system partition; see section 6
Restarting computer… sits for everthe same old HAL. Nothing is lost; cold-boot the machine

Granny Smith's integration tests ans-nt-install and ans-nt-installed-boot type every line and key on this page unattended; tests/integration/ans-nt-install/test.script there is the authoritative, runnable form of it.