64K Ought To Be Enough For Anybody !

SimH: le simulateur d'ordinausores

A SIMulator for Historic computers

SimH http://simh.trailing-edge.com/ ) est une série d'émulateurs pour des ordinateurs_ plutôt des années 60/70_ dont vous avez peut-être déjà entendu parler mais que vous n'avez probablement jamais vu en vrai.

Parmi le plus connus il y a notamment l'IBM 1401, la série des PDP de DEC/DIGITAL et l'Altair 8800. Les deux premiers sont plutôt dans la catégorie mainframe (je simplifie pour les PDP), et l'Altair 8800 est la machine qui a lancé la micro-informatique (et la carrière de Bill Gates par la même occasion).

Un PDP-11 (source Wikipédia)
Un PDP-11 (source Wikipédia)

Amusons-nous avec SimH

Une fois le logiciel téléchargé, on se retrouve avec plein d'exécutables (un par ordinateur). Ici on va jouer avec l'émulateur de PDP-11, une série d'ordinateurs 16 bits de DEC/DIGITAL.

Si vous lancez l'exécutable "pdp11" , vous allez avoir un magnifique message du style :

    PDP-11 simulator V3.8-1
    sim>

... et là logiquement vous ne savez plus quoi faire !

En fait c'est normal car ces émulateurs ne sont pas vraiment fournis "tout prêts".

Il faut dans un premier temps paramétrer l'ordinateur que l'on veut émuler. Le PDP-11 est en fait tout une série d'ordinateurs très différents les uns des autres, allant de la taille d'une pièce complète à celle d'une tour de PC, avec un (plusieurs) système(s) de bus sur lequel on va enficher des cartes pour ajouter tout un tas de fonctionnalités ...

Du coup il est indispensable de se familiariser avec le fonctionnement du "vrai" ordinateur, heureusement pour le PDP-11 on trouve à peu près toute la documentation que l'on veut ici : http://bitsavers.trailing-edge.com/bits/DEC/pdp11

Sur la suite de cet article nous allons lancer le BASIC à partir d'un lecteur de bande perforées, c'est une opération très bien décrite à plusieurs endroits, je ne vais faire que reprendre la manipulation en l'expliquant. Voir par exemple :

Donc, commençons par expliquer au simulateur à quoi ressemble la machine :

    sim> set cpu 11/05 64k
    Disabling XQ
    sim>

On vient d'expliquer à SimH que l'on veut un PDP11/05 avec 64K de RAM (c'est une machine qui est sortie en 1972, il y a une photo ici : http://gunkies.org/wiki/PDP-11/05 )

Par défaut SimH ajoute tout un tas de cartes (avec des contrôleurs disque, des contrôleurs de lecteurs à bande, etc ...). Un "show conf" permet d'ailleurs de voir cela. Ici on veut un système minimum, la série de commande suivante permet de retirer tout cela :

    sim> SET HK DISABLE
    sim> SET RHA DISABLE
    sim> SET PTP DISABLE
    sim> SET DZ DISABLE
    sim> SET RL DISABLE
    sim> SET RX DISABLE
    sim> SET RP DISABLE
    sim> SET RQ DISABLE
    sim> SET TM DISABLE
    sim> SET TQ DISABLE
    sim> SET RK DISABLE

Voilà, il ne nous reste plus qu'un CPU, de la mémoire, un port série pour le terminal. Ajoutons le lecteur de bande perforées (Paper Tape Reader) :

    sim> set ptr enable

Alors, c'est là que ça devient intéressant : l'ordinateur que l'on vient de configurer n'a strictement aucun logiciel sur lequel démarrer ! Comment va-t-on lui demander de faire quelque chose ? C'est là que le panneau avant avec tous les voyants et interrupteurs entre en jeu :

Le panneau avant d'un PDP11/70 (source Wikipédia)
Le panneau avant d'un PDP11/70 (source Wikipédia)

En plus de faire joli, les interrupteurs permettent de sélectionner une adresse et de rentrer une donnée en mémoire, et les voyants permettent d'en voir le contenu. Sur les PDP-11 plus récents (LSI-11), il n'y a plus ce panneau avant et à la place il y a un équivalent (ODT) qui prend la forme de commandes à taper sur le terminal série, directement intégré dans le microcode du CPU !

Le code de démarrage ressemble à cela :

    xx7744 016701 mov device,r1 get csr address
    xx7746 000026
    xx7750 012702 loop: mov #offset,r2 get offset
    xx7752 000352 offset:
    xx7754 005211 inc (r1) read frame
    xx7756 105711 wait: tstb (r1) wait for ready
    xx7760 100376 bpl wait
    xx7762 116162 movb (r1),bnk(r2) store data
    xx7764 000002
    xx7766 xx7400
    xx7770 005267 inc offset bump address
    xx7772 177756
    xx7774 000765 br loop
    xx7776 177550 device: HSR csr, or 177560 for teletype

(je l'ai trouvé sur le site vcfed.org)

La première colonne c'est l'adresse (on est en octal, comme souvent sur ces vieilles machines), la deuxième colonne c'est le code machine (sur 16 bits, ça donne des nombres à 6 chiffres en octal) et la troisième c'est le mnémonique en texte. En gros ce code lit les octets depuis le lecteur de bandes perforées (vu de la machine ce sont des octets qui arrivent sur un port série), et il va les ranger en mémoire les un à la suite des autres.

Pour faire cela dans SimH, il faut utiliser la commande "deposit [adresse] [donnee]" :

    DEPOSIT 157744 016701
    DEPOSIT 157746 000026
    DEPOSIT 157750 012702
    DEPOSIT 157752 000352
    DEPOSIT 157754 005211
    DEPOSIT 157756 105711
    DEPOSIT 157760 100376
    DEPOSIT 157762 116162
    DEPOSIT 157764 000002
    DEPOSIT 157766 157400
    DEPOSIT 157770 005267
    DEPOSIT 157772 177756
    DEPOSIT 157774 000765
    DEPOSIT 157776 177550
    DEPOSIT SR 157744

La dernière commande c'est pour positionner les interrupteurs en facade dans une position particulière (SR = switch register), c'est un moyen primitif de fournir un paramètre à un programme.

On est presque prêt à lire des données sur la bande perforée, il nous manque juste ... une bande perforée. On commencer par charger un bootstrap, pour cela il faut télécharger ce fichier : http://iamvirtual.ca/PDP-11/Basic-11/DEC-11-L2PC-PO.ptap et taper la commande :

    attach ptr DEC-11-L2PC-PO.ptap

On est maintenant prêt à charger le programme bootstrap, qui est une version plus évoluée du petit programme que l'on a rentré ci-dessus et sera capable de récupérer le code du BASIC (que l'on chargera depuis une deuxième bande perforée)

    GO 157744

C'est la première commande qui fait travailler notre PDP-11 virtuel ! En vrai on verrait la bande perforée défiler dans le lecteur, ici il ne se passe pas grand chose et on est gratifié d'un :

     HALT instruction, PC: 157500 (MOV PC,SP)
    sim>

Ce qui signifie que le programme a terminé et a exécuté un HALT, ce qui en vrai interrompt le CPU, et ici nous rend en plus la main sur le simulateur.

On va donc charger la deuxième bande perforée (le code du basic) dans le lecteur (fichier http://iamvirtual.ca/PDP-11/Basic-11/DEC-11-AJPB-PB.ptap) :

    ATTACH PTR DEC-11-AJPB-PB.ptap

On va pouvoir finalement charger le BASIC. Pour cela il faut mettre les interrupteurs en façade à 0 (cela correspond au démarrage normal du BASIC), et lancer le bootstrap que l'on vient de charger et qui se trouve à l'adresse 157500 :

    DEPOSIT SR 0
    GO 157500

Le prompt du BASIC s'affiche après avoir appuyé sur [entrée], et on peut faire un print "bonjour" bien mérité (IL FAUT TAPER EN MAJUSCULES SINON CA NE MARCHE PAS !)

    PDP-11 BASIC, VERSION 007A
    *O
    READY
    10 PRINT"BONJOUR"
    RUN
    BONJOUR

    STOP AT LINE   10
    READY
    LIST

    10 PRINT"BONJOUR"
    READY

Concluons dans la bonne humeur

C'était une petite introduction sans prétention à SimH, qui est un outil très intéressant pour tester ces vieilles machines inaccessibles au commun des mortels.

On voit également que juste avec un lecteur de bandes perforées c'est tout un processus pour avoir un BASIC sur le terminal ! Chose amusante j'aurais pu faire quasiment le même article avec l'Altair 8800 qui suit à peu près la même procédure pour charger le BASIC Misrosoft (voir par exemple ici https://www.youtube.com/watch?v=9s9N3OXHmN0 )

En cherchant un peu sur les forums et sur les sites des musées informatiques, on voit également qu'il est très utilisé par les restaurateurs des vraies machine (pour l'archivage de logiciels, pour générer des images de disque, etc ...)