MacOS Extensions pack voor de Apple Network Server v1.0

De ANS was sterk gebaseerd op de Power Macintosh 9500. Tijdens de ontwikkeling heeft Apple de ANS met Mac OS gedemonstreerd, maar dit zorgde voor verwarring bij potentiële kopers. Hierdoor werd de mogelijkheid om Mac OS op te starten verwijderd uit de productieversies. Hoewel CTO Ellen Hancock in 1997 beweerde dat een ROM-swap het mogelijk zou maken om de ANS opnieuw met Mac OS en Windows NT op te starten, werd aangenomen dat deze ROM's vapourware waren. Dit veranderde toen een oud-medewerker van Apple een werkende dump presenteerde van zowel de pre-productie ROM als de latere ANS Mac OS ROM. Ook verscheen er een prototype Windows NT ROM van een andere oud-medewerker, hoewel daar delen van ontbreken en het native booten van Windows NT op de ANS nog steeds een werk in uitvoering is.

Het bleek dat ik zelf een van de pre-productie ROM's had zonder te weten wat het was. Omdat de latere Mac OS ROM blijkbaar onvoltooid was, ondersteunt deze de L2-cache niet correct en draait hij daardoor aanzienlijk langzamer; bovendien kan hij AIX niet booten. De pre-productie ROM boot echter beide besturingssystemen en ondersteunt de cache wel. Aan de andere kant ondersteunt deze ROM niet de ingebouwde video of de frontale Fast Wide SCSI-2 controller, werkt de on-board MACE Ethernet niet, en resulteert een herstart na de eerste Mac OS-boot in een zwart scherm als de PRAM niet wordt gereset.

Het goede nieuws is dat veel van de problemen met de pre-productie ROM in Mac OS via software kunnen worden opgelost of omzeild. Ik heb veel van deze punten aangepakt: de MACE Ethernet is hersteld, de on-board video wordt nu ondersteund en de ANS kan correct herstarten naar Mac OS. Bovendien kun je, omdat het de pre-productie ROM is, nog steeds AIX booten, waardoor de historische reden voor het bestaan van de "Shiner" behouden blijft. Hieronder volgt de eerste versie van die software en de uitleg over hoe deze is ontwikkeld.

Benodigdheden en hardware-installatie

De eerste stap is het bemachtigen van een Apple Network Server en de pre-productie ROM versie 1.1.20.1 (de productieversie is 1.1.22). Replica ROM's zijn inmiddels beschikbaar, onder andere bij Joe's Computer Museum. Ik heb het originele ontwerp van deze ROM DIMM's getest, die ter beschikking werden gesteld door Jeff Walther. Jeff assembleerde en doneerde deze batch aan Joe Strosnider, die ze verkoopt en de opbrengst doneert aan het onderhoud van het Tinker Different-forum.

Zodra de hardware aanwezig is, moet Mac OS worden geïnstalleerd op een extern bootbaar SCSI-volume. Voor dit project gebruik ik een 25-pins BlueSCSI die direct is aangesloten op de achterste SCSI-poort van de ANS en werkt op terminatievoeding. Maak een leeg schijmbeeld van de gewenste grootte aan op de (micro)SD-kaart en geef dit de gewenste SCSI-ID (voor de ANS is dit doorgaans SCSI ID 2).

Als je een andere Mac met een SCSI-poort hebt, is het het eenvoudigst om de installatie van Mac OS op het externe volume via dat systeem te doen. Zorg ervoor dat Mac OS wordt geïnstalleerd voor elke ondersteunde Mac, vooral als je een model-specifieke installatie-CD gebruikt. Versies tot en met Mac OS 9.1 booten direct op de ANS; ik gebruik hier versie 9.1. Versie 7.6 werkt ook, en late versies van System 7.5 zouden kunnen werken, maar ik raad ten minste 8.1 of later aan. Als je alleen de ANS hebt, kun je de installatie op de machine zelf doen, maar dit is lastiger. Je hebt dan een bootbaar Mac OS CD-image nodig (ID 0) en een Power Mac-compatibele PCI-videokaart (zoals een Twin Turbo 128MA of een ATI Rage Orion).

Ten slotte: koppel de server van de stroom, open de hoofdplaat-lade, verwijder de PRAM-batterij, installeer de pre-productie ROM DIMM en laat de lade enkele minuten openstaan terwijl het systeem volledig stroomloos is.

Configuratie-overzicht

Op mijn test-ANS 700 is de monitor aangesloten op de videopoort van de 700, de BlueSCSI op de SCSI-connector, en een Farallon AAUI-naar-twisted-pair dongle op de on-board MACE Ethernet AAUI-poort.

Daarnaast heb ik een Twin Turbo videokaart in slot 1 en, als alternatief voor de MACE Ethernet, een zeldzame 10Mbit ANS Ethernet PCI-kaart in slot 6. Deze kaart werkt in AIX en latere versies van Mac OS (niet in 7.6, mogelijk in 8, zeker in 9). Een reguliere Power Mac-compatibele Ethernet PCI-kaart volstaat als je alleen Mac OS wilt draaien.

Drivers en PCI-apparaten op Power Macs

Gebruikers van het klassieke Mac OS zijn bekend met INITs en CDEVs: extensies en controlepanelen die het besturingssysteem uitbreiden. Voor apparaatondersteuning was een DRVR-resource nodig, die kon worden opgeslagen in de declaratie-ROM van een NuBus-kaart, in een INIT/CDEV tijdens het bootproces, of in een applicatie die on-demand werd geladen. Na de overstap naar PowerPC in 1994 moest veel van deze code nog steeds in 68K zijn voor achterwaartse compatibiliteit, wat emulatie vereiste.

Apple probeerde dit prestatieprobleem op te lossen in "Copland", een poging om Mac OS stapsgewijs te moderniseren. De relevante nieuwe driver-architectuur van Copland was bedoeld om 68K-code te isoleren in een "coöperatieve" adresruimte, terwijl nieuwe drivers volledig in native PowerPC-code werden geschreven. Deze native drivers maakten gebruik van de HAL (Hardware Abstraction Layer) en de Name Registry, een objectdatabase die apparaten op het systeem bijhield.

Hoewel Copland als project faalde, werden delen ervan gebruikt als overbrugging naar Mac OS 8. Bij de overgang van NuBus naar PCI (nodig omdat IBM NuBus niet ondersteunde in AIX 4) voegde Apple een poort van de Copland Name Registry toe aan de ROM's van de eerste PCI Power Macs, beginnend met de 9500 in 1995.

Hoe de Name Registry werkt

In dit schema initialiseert de systeem-ROM de hardware en draagt de controle over aan Open Firmware, die de device tree maakt voor alle apparaten (PCI-kaarten, processor, logic board). De Code Fragment Manager in de ROM draait vervolgens code uit PCI-expansie-ROM's en drivers in de Mac ROM. Deze code creëert een node in de Name Registry met informatie om het apparaat te identificeren.

Zodra de Name Registry is opgebouwd, start de Mac ROM de Display Manager, SCSI Manager en/of ATA Manager. Wanneer de File Manager en Resource Manager actief zijn, wordt de Extensies-map gescand naar native drivers (opgeslagen als code fragments met type ndrv). Deze worden geladen voordat andere extensies worden aangeroepen.

Op een ANS 700 die boot naar Mac OS 9.1 met de pre-productie ROM, bevat de Name Registry veel meer nodes dan alleen PCI-kaarten. Je ziet de CPU, L2-cache, Mac ROM en apparaten verbonden via "Grand Central" (de brug tussen PCI en traditionele Mac-apparaten), zoals:

  • De AWACS-geluidschip (Crystal CS4217 codec).
  • De interne SWIM III floppy-controller.
  • De AMD AM79C950KC "Super Combo" CURIO, die een NCR 53C96 SCSI-controller (voor de externe poort), een AMD 85C30 seriële chip en een AMD 79C940 Media Access Controller (MACE) voor Ethernet bevat.

De Extensions Pack: Componenten en Implementatie

De eerste versie van deze pack bestaat uit drie componenten:

  1. ANS MACE Fixer: Een INIT die de Ethernet-configuratie patcht.
  2. ANS Video Enabler: Een ndrv die de 54M30 interne video in 8-bit modus mogelijk maakt.
  3. ANS Startup Fixer: Een applicatie voor de Startup Items-map die de NVRAM herschrijft om foutieve instellingen te verwijderen.

1. De Video Driver

Deze driver is direct overgenomen uit de 2.0 ANS Mac OS ROM. Met behulp van Hex Fiend en de ROM Fiend-extensie van Eric Harmon is de driver uit de ROM-dump geëxtraheerd. De driver is een Preferred Executable Format (PEF) binary.

Om deze extensie te laten werken, moest de type-code worden gewijzigd naar ndrv (niet INIT) en werd een skelet cfrg-resource toegevoegd om het code fragment te markeren. Hoewel de driver werkt, ondersteunt hij alleen 8-bit kleurdiepte en geen 2D-acceleratie, omdat Apple nooit een byteswap-functie schreef voor de 54M30 chip.

2. De Startup Fixer

Bij het afsluiten van de machine moest ik vaak de PRAM resetten omdat Mac OS de NVRAM-instellingen van de ANS aanpast alsof het een Power Mac 9500 is. Het installeert een ongepaste nvramrc OpenFirmware-script en zet de in- en uitvoerapparaten op seriële poort ttya (serial port 2). Hierdoor start de machine op met een zwart scherm.

Ik heb een hard-coded versie van de tool "Boot Variables" (origineel van Paul Mackerras) gebouwd. Wanneer deze in de Startup Items-map staat, herstelt hij bij elke boot automatisch de instellingen naar kbd (ADB-toetsenbord) en screen (onboard 54M30 video) en installeert hij een eigen nvramrc.

3. De MACE Fixer (Ethernet)

De Ethernet-problemen komen voort uit het feit dat de ANS slechts één AAUI-poort heeft, terwijl andere PCI Macs schakelen tussen AAUI en RJ-45. De MACE-chip in de CURIO heeft een register genaamd PLSCC (Physical Layer Signaling Configuration Control) dat bepaalt welke poort actief is. In de ANS moet deze waarde 1 zijn voor een directe AUI-verbinding, terwijl Mac OS standaard waarde 7 gebruikt.

Omdat de ANS voor Mac OS lijkt op een Power Mac 9500, moet deze waarde worden doorgegeven voordat de Apple Enet INIT draait. Dit wordt op twee manieren opgelost:

  1. Via de nvramrc in de Startup Fixer.
  2. Via de ANS MACE Fixer extensie. Deze gebruikt een kleine hoeveelheid PowerPC-code om direct in de Name Registry de PLSCCPort property op 1 te zetten. Om te garanderen dat dit vóór de Ethernet-driver gebeurt, heeft de extensie het bestandstype scri (WorldScript), omdat deze eerder worden geladen dan reguliere INITs.
// Fragment van de MACE Fixer PowerPC code
void main(void) {
    OSErr err;
    RegEntryID regEntryID;
    // Controleer of dit een ANS ROM is die AIX kan booten
    err = RegistryCStrEntryLookup(NULL, "Devices:device-tree:packages:aix-boot", &regEntryID);
    if (err != noErr) return;

    // Zoek MACE en zet de PLSCCPort property op 1
    err = RegistryCStrEntryLookup(NULL, "Devices:device-tree:bandit:gc:mace", &regEntryID);
    if (err == noErr) {
        RegPropertyValueSize s;
        err = RegistryPropertyGetSize(&regEntryID, "PLSCCPort", &s);
        if (err == nrNotFoundErr) {
            UInt32 port = 1;
            err = RegistryPropertyCreate(&regEntryID, "PLSCCPort", &port, sizeof(UInt32));
        }
    }
}

De strijd met de interne SCSI

Ik heb geprobeerd om de interne SCSI-bays werkend te krijgen door de ndrv uit de ANS Mac OS ROM te extraheren. Ondanks pogingen om de node-namen aan te passen (bijv. van apple53C8xx naar 53c825), leidde dit tot crashes tijdens het booten.

Het probleem lijkt te liggen bij de SIM (SCSI Interface Module) implementatie. De PCI DDK-documentatie suggereert dat de SCSI-expert anders omgaat met disk-gebaseerde drivers dan met ROM-gebaseerde drivers. Vooralsnog is het niet gelukt om de interne SCSI-bus via software te activeren.

Installatie-instructies

Voorbereiding

  1. Plaats de ANS MACE Fixer en ANS Video Enabler in de Extensions map van je Mac OS volume.
  2. Plaats de ANS Startup Fixer in de Startup Items map.
  3. Zorg dat de pre-productie ROM (1.1.20.1) is geïnstalleerd.

Opstarten

  1. Sluit de monitor aan op de on-board VGA-poort.
  2. Zet de server aan. Als je een replica ROM gebruikt, moet je mogelijk Ctrl-Cmd-Reset indrukken voor het opstartgeluid.
  3. De machine zal in Open Firmware booten. Typ bye op de ok prompt.
  4. Je zult de melding zien: /AAPL,ROM MacOS is currently unsupported, use at your own risk.
  5. Het systeem boot nu naar Mac OS.

Let op: De Startup Fixer moet bij elke boot draaien, anders krijg je bij de volgende start een zwart scherm. Als dit gebeurt, kun je via een seriële verbinding (Poort 2, 38400bps) de instellingen handmatig herstellen: setenv input-device kbd, setenv output-device screen, setenv use-nvramrc? false en vervolgens reset all.

Toekomstige stappen

Er zijn nog enkele zaken die opgelost moeten worden:

  • Interne SCSI: Ik overweeg het gebruik van een MacOS-bootbare SCSI PCI-kaart die direct verbonden wordt met de frontale SCSI-bussen via de 68-pins connectoren op het moederbord.
  • Long RAM Test: Bij een reboot gaat de ANS soms in een tijdrovende RAM-test. Ik vermoed dat dit via een ROM-patch opgelost kan worden, maar voorlopig kan dit worden afgebroken met Ctrl-Cmd-Reset.