
PDP-11/34-Emulator auf Schaltungsebene
ll/34 ist ein Schaltkreis-Emulator für die PDP-11/34A (1976), der eine virtuelle CPU ausführt, die aus den Schaltplänen, dem Mikrocode und den Logikaufzeichnungen einer echten PDP-11/34A zurückentwickelt wurde.
Ursprünglich wurde es als digitales Abbild der echten CPU entwickelt, um bei der Fehlersuche auf Signalebene zu helfen. Die virtuelle KD11-EA CPU besteht im Wesentlichen aus einer C-Übersetzung der Schaltpläne und Lookups auf die ROM-Tabellen. Alle kombinatorischen ROMs sind zurückentwickelt, und der Taktgenerator ist präzise modelliert.
Die Schaltkreisebene (ROM-Wahrheitstabellen + kombinatorische Logik) wurde der Gatterebene (Verilog) vorgezogen, da sie niedrig genug ist, um Hardware-Fehler zu reproduzieren, aber dennoch schnell genug für Programme.
Alle Geräte sind in den UNIBUS-Rückwandbus (unibus.c) eingesteckt, der Adressdecodierung, Zeitsteuerung und Buszyklen durchführt.
Intern besteht die CPU aus folgenden Komponenten:
| Datei | Beschreibung |
|---|---|
ucode_rom.h | 512x48-Bit Mikrocode-Speicher (bipolare PROMs), basierend auf Bitsavers Verilog und Dumps. Jedes Mikrowort steuert ALU, Zwischenspeicher, Bus-Schnittstelle und Verzweigung für einen Mikrozyklus. |
combo_roms.h | Kombinatorische ROMs (E51-E83, E107), IR-Dekodierung (E59/E60/E63/E69/E70/E71/E74), ALU-Funktionsauswahl (E61/E82/E83), Trap/Service-Priorität (E52/E53) und Bedingungscode-Logik (E68/E107), alle rekonstituiert aus den Schaltplänen und Logikaufzeichnungen. Open-Collector-ROMs verdrahten-ODER auf den MPC-Bus. |
kd11ea.c | Datenpfad-Engine. Durchläuft den Mikrocode einen Mikrobefehl pro Zyklus. Grundlegende 74xx-Gatter werden mit C-Logikoperatoren (!, &&, >> usw.) simuliert. Die 74S181 Bit-Slice-ALU ist vollständig modelliert (4 Slices, 16-Bit). |
mmu.c | Speicherverwaltung. Kernel/Benutzer-Adressräume, 18-Bit-Relocation (3x 74S283 Addierer), 16 PAR/PDR-Paare, SR0/SR2-Abort-Register mit Freeze-Logik. |
clockgen.c | Taktgenerator. Modelliert die E106-Verzögerungsleitung (TAP 30/90/120 Rückkopplung, TRAN INH Bus-Warten). Kurze Zyklen: 180 ns, lange Zyklen: 240 ns, Bus-Transfers dehnen sich bis SSYN zurückkommt. |
clock.c | Echtzeit-Taktung. Hält die simulierte Zeit synchron mit der Wanduhrzeit. |
int.c | Interrupt-Arbiter. BR4-BR7 Prioritätswarteschlange, nähert die UNIBUS Daisy-Chain Grant-Reihenfolge an. |
Emuliert die Frontschalter und Anzeigen der PDP-11/34A. Aktiv, wenn die CPU angehalten ist (Einschalten, HALT-Befehl oder Strg-P).
Erlaubt das Initialisieren des Busses, Booten der CPU, Einzelschritt-Ausführung, Anzeigen und Ablegen von Daten an beliebigen Adressen sowie Beenden des Emulators.
Das Frontend ist von der Engine entkoppelt, so dass auch eine fotorealistische Frontpanel-GUI in WebAssembly bereitgestellt wird.
Die Debug-Konsole bietet einen interaktiven Debugger sowohl auf Mikrocode- als auch auf Befehlsebene:
s [n]: Einzelschritt von n Mikroinstruktionen mit vollständigem Zustandsdump (MPC, ALU, Bus, Register)b addr: Setze PC-Breakpoint (oktal), bl zum Auflisten, bd n zum Löscheng: Ausführung fortsetzenu [addr] [n]: Befehle disassemblierenc [addr] [n]: Speicherdump (oktal)mmu: MMU-Status anzeigen (Kernel + Benutzer PAR/PDR, aktueller Modus markiert)r: RegisterdumpDie Fehlersuche an ll-34 während seiner Entwicklung erwies sich als so ähnlich wie die Fehlersuche an der echten Hardware, dass ein interner Logikanalysator implementiert wurde, um die Signale zu verfolgen und den Datenpfad zu untersuchen. Dies erwies sich als unverzichtbar, um subtile ROM- und Timing-Fehler in der virtuellen CPU aufzuspüren. Er kann auch als Referenz zur Fehlersuche an der echten Hardware verwendet werden, genauso wie die funktionierende Hardware bei der Entwicklung des Emulators half.
Der Logikanalysator ermöglicht das Abfragen von 102 Punkten auf wichtigen CPU-Signalen, abgebildet auf physische Chip-Pins (KD1:Exx:Pin-Notation entsprechend den DEC-Schaltplänen K1-5 bis K2-9). Logische Aliasnamen (MPC, ALU_OUT, IR, PSW…) werden zur Bequemlichkeit bereitgestellt.
Die Abtastrate ist der Echtzeit-CPU-Takt (5.555.556 Hz) mit einer Auflösung von 180 ns pro Abtastung. Ein konfigurierbarer Teiler reduziert die Abtastrate für längere Aufzeichnungsfenster.
Aufzeichnungen verwenden einen Ringpuffer (bis zu 64K Abtastungen) mit konfigurierbarem Trigger auf jedem Signal, einstellbarer Triggerposition (Pre/Post-Verhältnis) und CSV-Export für die Offline-Analyse.
Logikaufzeichnungen wurden im gesamten Projekt großzügig verwendet, um schlecht verstandene Multiplexing-Pfade zu kartieren und zu debuggen.
ll-34 enthält einige Programme und Systeme zum Ausprobieren: ein Game of Life, V6 UNIX, RT-11 V4 mit dem originalen Tetris-Spiel und ATTN/11, ein kleiner trainierbarer Transformer mit Self-Attention.
./ll-34 --rk ./wasm/demos/rtv4_rk.dsk
Das Boot-ROM lädt automatisch vom RK11 und startet das Betriebssystem. DIR listet Dateien auf, HELP gibt Hilfe aus, RUN TETRIS startet das Tetris-Demo (obwohl das $TERM wahrscheinlich falsch sein wird?). RUN ADVENT startet das Colossal Cave Adventure, erstellt auf einer echten PDP-11/34.
./ll-34 --rk ./wasm/demos/v6bin.rk
Der Bootloader gibt eine minimale @-Eingabeaufforderung aus. Geben Sie rkunix ein und drücken Sie die Eingabetaste, und nach einigen Sekunden sollten Sie eine login:-Eingabeaufforderung erhalten. Geben Sie den Benutzernamen root ohne Passwort ein und Sie sind drin! Eine Anmerkung: cd heißt in frühen Unix-Versionen chdir.
make + ein C11-Compiler, es gibt keine weiteren Abhängigkeiten.
Verifiziert, dass es auf Linux (x86_64 und aarch64) sowohl mit musl als auch glibc, macOS aarch64 und NetBSD 10 aarch64 ohne Warnungen kompiliert.
Neben der CLI ist eine eigenständige WebAssembly-Version mit fotorealistischer GUI hier verfügbar: https://dbrll.github.io/ll-34.
Hinweis: ll-34 ist ein ressourcenintensiver Emulator. Im Gegensatz zu Befehlsemulatoren durchläuft er den Mikrocode Zyklus für Zyklus und führt bei jedem Schritt die ALU, kombinatorische ROMs, Zwischenspeicher, Taktgenerator und Bustiming aus. Der Host muss den 5,5 MHz Taktgenerator kontinuierlich aufrechterhalten, um zyklengenau zu bleiben.
Beim Start führt der Emulator einen Benchmark durch und meldet seine Geschwindigkeit relativ zu einer echten KD11-EA. Ein Verhältnis unter 1x bedeutet, dass der Host nicht mithalten kann und die Zeitgenauigkeit nicht garantiert ist. Der Benchmark ist in der WebAssembly-Version nicht verfügbar, da die Browser-Zeitauflösung ihn unzuverlässig macht. Da der WASM-Build langsamer ist als der native, ist das Ausführen auf einem Smartphone in der Regel zu langsam.