
Émulateur PDP-11/34 au niveau circuit
ll/34 est un émulateur au niveau circuit du PDP-11/34A (1976), exécutant un processeur virtuel rétro-conçu à partir des schémas, microcode et captures logiques d’un vrai PDP-11/34A.
Il a été conçu à l’origine comme une réplique numérique du vrai processeur pour aider au dépannage au niveau des signaux. Le processeur virtuel KD11-EA est essentiellement une traduction en C des schémas, avec des consultations des tables ROM. Toutes les ROM combinatoires sont rétro-conçues, et le générateur d’horloge est modélisé avec précision.
Le niveau circuit (tables de vérité ROM + logique combinatoire) a été choisi plutôt que le niveau portes (Verilog) car il est suffisamment bas niveau pour reproduire les bugs matériels, tout en étant assez rapide pour exécuter des programmes.
Tous les périphériques sont branchés sur le fond de panier UNIBUS (unibus.c), qui effectue le décodage d’adresses, le timing et les cycles bus.
En interne, le processeur est composé des éléments suivants :
| Fichier | Description |
|---|---|
ucode_rom.h | Mémoire de microcode 512×48 bits (PROMs bipolaires), basée sur le Verilog et les dumps de Bitsavers. Chaque micro-mot contrôle l’UAL, le scratchpad, l’interface bus et le branchement pour un micro-cycle. |
combo_roms.h | ROMs combinatoires (E51–E83, E107), décodage IR (E59/E60/E63/E69/E70/E71/E74), sélection fonction UAL (E61/E82/E83), priorité trap/service (E52/E53) et logique des codes condition (E68/E107), toutes reconstituées à partir des schémas et des captures logiques. Les ROMs à collecteur ouvert font un OU câblé sur le bus MPC. |
kd11ea.c | Moteur du chemin de données. Parcourt le microcode un micro-mot par cycle. Les portes 74xx de base sont simulées à l’aide d’opérateurs logiques C (!, &&, >> etc.). L’UAL 74S181 en tranches de bits est entièrement modélisée (4 tranches, 16 bits). |
mmu.c | Gestion mémoire. Espaces d’adressage noyau/utilisateur, relogement 18 bits (3 additionneurs 74S283), 16 paires PAR/PDR, registres d’abandon SR0/SR2 avec logique de gel. |
clockgen.c | Générateur d’horloge. Modélise la ligne à retard E106 (rétroaction TAP 30/90/120, attente bus TRAN INH). Cycles courts : 180 ns, cycles longs : 240 ns, les transfers bus s’étirent jusqu’au retour de SSYN. |
clock.c | Cadencement temps réel. Maintient le temps simulé synchronisé avec le temps réel. |
int.c | Arbitre d’interruptions. File de priorité BR4–BR7, approxime l’ordre d’octroi en guirlande UNIBUS. |
Émule les commutateurs et indicateurs du panneau avant du PDP-11/34A. Active lorsque le processeur est arrêté (mise sous tension, instruction HALT ou Ctrl-P).
Elle permet d’initialiser le bus, d’amorcer le processeur, de faire du pas à pas dans le code, d’examiner et de déposer des données à des adresses arbitraires, et de quitter l’émulateur.
Le frontal est découplé du moteur, donc un panneau avant photoréaliste en interface graphique est également fourni en WebAssembly.
La console de débogage offre un débogueur interactif pour le code au niveau microcode et au niveau instruction :
s [n] : pas à pas de n micro-instructions avec affichage complet de l’état (MPC, UAL, bus, registres)b addr : définir un point d’arrêt sur PC (octal), bl pour lister, bd n pour supprimerg : reprendre l’exécutionu [addr] [n] : désassembler les instructionsc [addr] [n] : affichage mémoire (octal)mmu : afficher l’état MMU (PAR/PDR noyau + utilisateur, mode courant marqué)r : affichage des registresLe dépannage de ll-34 pendant son développement s’est avéré si similaire au dépannage du matériel réel qu’un analyseur logique interne a été implémenté pour tracer les signaux et sonder le chemin de données. Cela s’est révélé essentiel pour traquer des bogues subtils dans les ROM et le timing du processeur virtuel. Il peut également être utilisé comme référence pour dépanner le matériel réel, tout comme le matériel fonctionnel a aidé à développer l’émulateur.
L’analyseur logique permet de sonder 102 points sur les signaux majeurs du processeur, mappés aux broches physiques des puces (notation KD1:Exx:pin correspondant aux schémas DEC K1-5 à K2-9). Des alias logiques (MPC, ALU_OUT, IR, PSW…) sont fournis pour plus de commodité.
La fréquence d’échantillonnage est l’horloge temps réel du processeur (5 555 556 Hz) avec une résolution de 180 ns par échantillon. Un diviseur configurable réduit la fréquence d’échantillonnage pour des fenêtres de capture plus longues.
Les captures utilisent un tampon circulaire (jusqu’à 64K échantillons) avec déclenchement configurable sur n’importe quel signal, position de déclenchement réglable (rapport pré/post), et export CSV pour analyse hors ligne.
Les captures logiques ont été largement utilisées tout au long du projet pour cartographier et déboguer des chemins de multiplexage mal compris.
ll-34 est livré avec quelques programmes et systèmes à essayer : un Jeu de la Vie, V6 UNIX, RT-11 V4 avec le jeu Tetris original, et ATTN/11, un petit Transformer à auto-attention entraînable.
./ll-34 --rk ./wasm/demos/rtv4_rk.dsk
La ROM d’amorçage charge automatiquement depuis le RK11 et démarre le système
d’exploitation. DIR liste les fichiers, HELP affiche l’aide, RUN TETRIS
lance la démo Tetris (même si le $TERM est probablement mal configuré ?).
RUN ADVENT lance Colossal Cave Adventure,
compilé sur un vrai PDP-11/34.
./ll-34 --rk ./wasm/demos/v6bin.rk