Emulador de DEC PDP-11/40 en Teensy 4.1
En este artículo vamos a emular sobre una Teensy 4.1 uno de los miniordenadores más icónicos de la historia de la informática, el PDP-11.
Sobre DEC PDP-11/40
En enero de 1972, Digital Equipment Corporation presentó la serie 40 de la familia PDP-11. Esta mantendría la compatibilidad con la arquitectura general de la familia, aunque mejora rendimiento, memoria y soporte de sistemas operativos respecto a los modelos anteriores.
A nivel de arquitectura, el PDP-11/40 presenta una CPU de 16 bits basada en lógica discreta TTL y memoria de ferrita de hasta 256 KB. Implementa el bus Unibus para la comunicación entre CPU, memoria y periféricos.
Emulador
Utilizaremos como base el emulador Teensy11 sobre esta misma plataforma.
Cambios en nuestro emulador
Se realizan cambios en el código original incluyendo:
- Se deshabilita el panel visual.
- Se deshabilita el servicio TFTP.
- Actualización de rutas en platform.ini para permitir compilación correcta desde Linux.
Entorno e instalación del emulador
Elementos
Vamos a necesitar los siguientes elementos:
- Placa Teensy 4.1.
- Tarjeta microSD con formato FAT32.
Instalación
Nos basta con descargar el código fuente de GitHub.
$ git clone https://github.com/RafaGS/Teensy11_lite.git Construimos los binarios y los subimos a la placa.
Preparación de la microSD
Vamos a ejecutar en nuestro emulador el sistema operativo Unix Version 6 (V6), desarrollado por Bell Labs (AT&T) en 1975.
Para ello, necesitaremos la versión en cinta de este SO para PDP-11.
$ wget https://www.tuhs.org/Archive/Distributions/Research/Ken_Wellsch_v6/v6.tape.gz $ gunzip v6.tape.gz Asimismo, crearemos un disco RK05 vacío, que replicaremos en 3 unidades.
$ dd if=/dev/zero of=empty.rkx bs=512 count=4872 $ cp empty.rkx r.rk0 $ cp empty.rkx s.rk1 $ cp empty.rkx d.rk2 Copiaremos los archivos anteriores, junto a mkdevs.tap distribuido en el repositorio de GitHub, al directorio raíz de la microSD.
$ cp r.rk0 s.rk1 d.rk2 v6.tape mkdevs.tap /mnt/sd/ Emulación
Una vez realizada la subida, y conectada la microSD a la Teensy, nos conectamos vía serie. Aparecerá información sobre la placa y el prompt del monitor del emulador.
Comenzamos montando la cinta.
$ tm 0 v6.tape A lo que el sistema nos dará una confirmación.
attached v6.tape on tm0Igualmente, adjuntaremos el disco virtual r.rk0 al controlador RK05.
$ rk 0 r.rk0 A lo que el sistema nos dará otra confirmación.
attached r.rk0 on rk0A continuación, indicamos 6 valores para que se carguen en la RAM del PDP-11 a partir de la dirección octal 100000. Esos 6 valores representan código máquina que ejecutaremos con la orden G. Con este código indicamos al controlador TM11 que lea un bloque de la cinta y lo deposite en la dirección 0 de la RAM.
$ > 100000 012700 172526 010040 012740 060003 000777 $ G 100000 El sistema entrará en loop, del que saldremos pulsando [Ctrl][P]. Este nos devolverá información de estado.
2730459 instr/s, mmu: offR0 172522 R1 000000 R2 000000 R3 000000
R4 000000 R5 000000 R6 000000 R7 100012 PS [kK ]
Lo siguiente es ejecutar lo que se ha cargado en la RAM desde la cinta.
$ G 0 Automáticamente, se envía una orden de rebobinado a la cinta y nos aparece el prompt del instalador de V6, un «=».
tm11: rewindtm11: rewind done, MTS: 000041, MTC: 060217
=
Introducimos el comando tmrk, que copia bloques de cinta a disco RK05.
=tmrk Nos pedirá disk offset, tape offset y count, a lo que responderemos respectivamente 0, 100 y 1.
tm11: rewindtm11: rewind done, MTS: 000041, MTC: 060217
tm11: rewind
tm11: rewind done, MTS: 000041, MTC: 060217
disk offset
0
tape offset
100
count
1
Repetimos la copia para los valores de 1, 100 y 3999.
=tmrk tm11: rewindtm11: rewind done, MTS: 000041, MTC: 060217
tm11: rewind
tm11: rewind done, MTS: 000041, MTC: 060217
disk offset
1
tape offset
101
count
3999
Salimos del prompt del instalador con [Ctrl][P] y volvemos al del monitor, desde donde llamamos un reinicio.
$ reset Tras el reinicio, arrancamos V6. Para ello, volvemos a adjuntar el disco virtual r.rk0 al controlador RK05.
$ rk 0 r.rk0 attached r.rk0 on rk0Lo siguiente es escribir el valor 173030 en el Switch Register del PDP-11, lo que equivale a dar la orden de arrancar desde el disco RK05 número 0 una vez que introduzcamos la consecuente orden boot.
$ > 777570 173030 $ boot Vuelve a cambiar el prompt, esta vez al del bootloader. Indicamos que use el kernel para RK05 con rkunix.
@rkunix Aparecerá el mensaje de inicio del sistema operativo.
Antes de nada, forzaremos una sincronización introduciendo tres veces seguidas la orden sync.
$ SYNC $ SYNC $ SYNC Nos habremos percatado de que nos sale todo en mayúsculas, cuando lo normal en los UNIX es trabajar en minúsculas. Solucionaremos esto con la orden stty.
$ STTY -LCASE Vemos cómo las entradas aparecen por defecto en minúsculas. Así, podremos utilizar órdenes típicas de UNIX.
Y, por supuesto, escribir un «Hola mundo» apropiado, esta vez en lenguaje C.
Nótese que en esta antigua versión de C printf está implícito en la sintaxis del lenguaje.
#1973 #DEC #PJRCTeensy41




