martes, 23 de noviembre de 2021

¿Cómo emulo una PDP-8/I con TSS/8 en Ubuntu?

¡Trabajadores!

Para volvernos peritos en la Conducción de los hombres se requiere de un estudio concienzudo de la historia del Arte, que es el sentido práctico de toda esta biblioteca que me acompaña en el despacho.

Es que de lo antiguo hemos de aprender para proyectarnos en el futuro pues lo que funcionó en el pasado lo hará en el futuro si las condiciones son emuladas.

Decía Napoleón que un ejemplo suele aclararlo todo.

Vean señores, el TSS/8 fue un sistema operativo de tiempo compartido para la minicomputadora DEC PDP-8 diseñado originalmente por Adrian van de Goor, estudiante (graduado de la Universidad de Cornell Mellon) y luego mejorado y comercializado como sistema completo por la Digital Equipment Corporation a partir de 1968. 

Permitía a varios usuarios emplear esta máquina de 12 bits, pero con una cómoda terminal teletipo de manera local, o bien con un muy caro conmutador paralelo se podían utilizar terminales remotas gracias a los enlaces modulados por un acoplador telefónico.

El TSS/8 requería una PDP-8, 8/I u 8/E, pero potenciada con una interfaz paralela RP08 o DF32 asociada al menos a una unidad de cinta RS08 o de disco DS32 para tareas de intercambio y almacenamiento de masa. 

Si bien el panel de control de esta máquina podía tener un tamaño reducido al de una actual computadora de escritorio, lo cierto es que el avío completo dejaba en comparación chica y económica a una heladera Siam.

La distancia que pone el tiempo de evolución ha podido suplir estos aspectos con creces, y permite a todos los Descamisados el estudio del Arte. Nuestro sistema GNU con Linux puede ser adaptado - por genialidad maquinal - para emular todo tipo de máquinas, incluyendo la inefable DEC PDP-8/I. Para tal menester ha sido concebido el emulador SimH, capaz de dar rienda a todo este tipo de mainframes del ayer.

A esto me he aficionado, y os indicaré como hacerlo.

Instalación de TSS/8

En primer lugar habremos de preparar una estructura de directorios para mayor comodidad. Esta nos oficiará de banco de pruebas y laboratorio. En ella descargaremos una imagen ya realizada con el TSS/8, la cual antiguamente se comerecializaba por un par de docenas de miles de dólares, pero gracias al Justicialismo y a Miguel Miranda - que es un buen negociante - hoy la sacamos por cero chirolas. 

A tal fin abrimos una terminal con Ctrl+Alt+T e ingresamos el siguiente bloque de Comandos de Organización:

mkdir ~/.simh/ ;
mkdir ~/.simh/panelsim/ ;
mkdir ~/.simh/panelsim/pdp8i/ ;
cd ~/.simh/panelsim/pdp8i/ ;
wget https://raymii.org/s/inc/downloads/pdp/tss8_init.bin ;
wget https://raymii.org/s/inc/downloads/pdp/tss8_rf.dsk ;
touch tss8.simh_pdp8i ;
echo 'load tss8_init.bin' >> tss8.simh_pdp8i ;
echo 'set rf enabled' >> tss8.simh_pdp8i ;
echo 'set df disabled' >> tss8.simh_pdp8i ;
echo 'attach rf tss8_rf.dsk' >> tss8.simh_pdp8i ;
echo 'attach ttix 4000' >> tss8.simh_pdp8i ;
echo 'run 24200' >> tss8.simh_pdp8i ;
chmod +x ~/.simh/panelsim/pdp8i/tss8.simh_pdp8i

Ahora bien, todo Movimiento ha de tener opciones, ya que los caminos no suelen ser únicos para lograr la Felicidad que todos anhelamos. Por tal motivo podremos contar con dos opciones para emular TSS/8. La más simple que recomiendo sin dudar es utilizar el emulador directamente "a pelo" en Ubuntu, Y otra es emplear el simulador de panel de PDP8 Panelsim (el cual requiere instalarse aparte).

En el caso de apostar por la simplicidad, el accionar es veloz. Ingresamos el comando:

sudo apt install simh

...y tras introducir nuestra contraseña, se descargará el paquete de emulación genérico. Una vez instalado, podremos ejecutar TSS/8 en él mediante:

cd ~/.simh/panelsim/pdp8i/
pdp8 tss8.simh_pdp8i

Y ya está. 

Sin embargo, podríamos querer hacer alarde del panel de PDP-8/i con sus  lucecitas de status simuladas que nos dan un aspecto navideño. En tal caso realizamos el proceso de instalación siguiendo esto y luego adaptaríamos TSS/8 para funcionar en el mismo mediante este bloque de comandos de organización:

cd ~/.simh/panelsim/
touch ~/.simh/panelsim/pdp8i_tss8.sh
echo '# Inicia una PDP-8/I corriendo TSS8' >> ~/.simh/panelsim/pdp8i_tss8.sh
echo './_launch.sh "blinkenbone.panelsim.panelsimPDP8I.PanelsimPDP8I_app" "--width 1000 --power 1" pdp8i pdp8_realcons tss8.simh_pdp8i 248-blinkenbone-simulated-pdp8i-panel' >> ~/.simh/panelsim/pdp8i_tss8.sh
chmod +x ~/.simh/panelsim/pdp8i_tss8.sh

...tras lo cual lo ejecutaríamos con:

cd ~/.simh/panelsim/
./pdp8i_tss8.sh

Cualquiera de los dos casos que hubiésemos decidido utiliar, nuestra terminal teletipo comenzará a percutir, imprimiendo los mensajes de status del emulador.

Si todo va bien, al final del prompt de inicio se nos interrogará la opción de arranque:

LOAD, DUMP, START, ETC? 

Tipeamos START para darle arranque al sistema TSS/8. Este nos solicitará indicar fecha y hora para el oscilador de control emulado. 

Los valores son numéricos en formato MM-DD-AA y HH:MM (de 24 horas). Es importante conocer que TSS/8 no preveía año 2000, de modo que conviene restar cuarenta años a la fecha real. Por ejemplo:

MONTH-DAY-YEAR: 11-09-81
HR:MIN: 14:23

A continuación debemos presionar la tecla Intro dos veces y se nos presentará el prompt de inicio de sesión o login. Esta se representa por un muy poco expresivo punto.

.

Esto es lo deseado, y significa que el sistema cree que se haya corriendo en una PDP-8 y se encuentra esperando las conexiones desde las terminales teletipo:

Ahora bien, para ingresar remotamente como usuario de TSS/8 debemos utilizar el comando LOGIN un PPN (identificador de usuario) junto con su contraseña. La sintaxis es: LOGIN PPN CONTRASEÑA. El TSS/8 que hemos descargado ya contempla usuarios con sus PPN, de modo que podremos utilizarlos. 

La lista de usuarios y contraseña disponibles en este sistema emulado que os he provisto es la siguiente:

PPN     Contraseña
[0,1]   VH3M
[0,2]   LXHE
[0,3]   SHUG
[77,77]
[1,10]  WBCN
[20,1]  DT
[20,2]  PT
[20,3]  TSS8
[20,4]  EDIT
[20,5]  4TH
[1,50]  JERK

Suponiendo entonces que anhelamos loguearnos como el usuario PPN 1,10 tipeamos:

LOGIN 1,10 WBCN

(la terminal no hace eco de lo introducido en este punto para no dejar registro impreso de usuarios y contraseñas). 

Tras presionar la tecla Retorno de Carro (tecla Intro en el emulador) se nos presentará la impresión inicial de status:


TSS/8.24  JOB 01  [01,10]  K00    01:24:26

SYSTEM IS DOWN, INC.

.

El TSS/8 permitía conocer de manera somera el funcionamiento de un sistema de tiempo compartido en esta máquina, lo cual se estilaba ya que la posibilidad era más corriente que utilizar un entorno mucho más costoso como TOPS-10. Cada usuario podrá disponer de un espacio en la memoria de masa del sistema.

Ejecutar programas

Para ejecutar un programa de la librería de sistema o desde su directorio puede lograrse mediante el comando "RUN" ("correr"), con la letra R:

R CAT

...correrá el programa CATALOG, presentando los contenidos de su directorio.

 Con el comando SYSTAT obtendrá una impresión completa de lo que está haciendo el sistema, quién está conectado y mucha información adicional.

TSS/8 cuenta con el ambiente de programación BASIC-8. Para iniciarlo use el comando R BASIC. Se le preguntará si desea crear un nuevo fichero ("NEW"( o cargar uno antiguo ("OLD").

Por ejemplo, podríamos solicitar un fichero nuevo con el titulo 17OCT y tipear en la teletipo el siguiente fuente del siguiente instigador BASIC de 17 de Octubre digital:

10 PRINT "USTED HA PROVOCADO UN 17 DE OCTUBRE DIGITAL EN LA PDP-8!"
20 PRINT "YOU HAVE STARTED A DIGITAL OCTOBER 17TH ON THE PDP-8!"
30 PRINT ""
200 PRINT "             --------------------"
300 PRINT "             ! QUEREMOS A PERON !                  \O/  \O>"
400 PRINT "             !------------------!             -\OO/--\O----O/---"
500 PRINT " O       O/  !  O   O/  O    <O/! O    O    --![O] [O/ [] [] []!"
600 PRINT "[]( )    !   ! /H\ /H  /H>    H !/!>  <W>  [               ]]]]]"
700 PRINT " 1      /\      M   M   M     M   1    X   [--(O)----------(O)-"
701 PRINT ""
702 PRINT "USTED ES UN BUEN DESACAMISADO! FELICITACIONES!"
800 PRINT "YOU ARE A NICE DESCAMISADO! CONGRATULATIONS!"
1000 END

Una vez terminado de introducir el programa en memoria, bien podría listarlo con LIST o compilarlo y correrlo (ejecutarlo) con RUN. Podremos así replicar en el presente exactamente el pasado.

Otros comandos del subsistema BASIC son los siguientes:

Comando Acción

BYE Sale y vuelve al Monitor TSS/8

CAT Cataloga los ficheros del disco

DELETE n Borra la línea número n

DELETE n1,n2 Borra los números de línea n1 hasta n2

LIST Lista el programa actual

LIST n Lista una línea específica

NEW Preguntará por un nuevo nombre de programa BASIC.

OLD preguntará por un el nombre de un programa BASIC ya almacenado en el disco y lo cargará en memoria.

SAVE Almacena los contenidos de memoria a disco empleando el nombre actual

SAVE [nombre] Almacena los contenidos en memoria al disco usando el nombre dado.

UNSAVE Elimina el programa con el nombre actual del disco (requerido antes de guardar una versión nueva con el mismo nombre).

Ctrl+B,S Detiene un programa en ejecución (presione Ctrl+b y luego la tecla s).

Otros Comandos

Estos son algunos comandos extras (atajos de pocos caracterers
 
.ASSIGN x (presumo que asigna algún tipo de dispositivo)
.BREAK x .BRO-ADCAST string (sólo funciona desde la cuenta 0,1)
.CLOSE (Cierra un usuario)
.DEPOSIT x y (Deposita en memoria en la dirección x el valor y)
.DUPLEX (Modo duplex)
.EXAMINE x x (Examina desde dirección x a dirección y:límite-10)
.FORCE kb string (Fuerza al teclado # con la cadena con ^como controles)
.KJOB (elimina trabajo - Lo mismo que correr LOGOUT)
.LOAD x (Carga la memoria con el programa x)
.LOGIN (Permite ingresar al sistema)
.LOGOUT (Sale del sistema) 
.RELEASE (presumo que suelta el dispositivo asignado)
.RESTART x (Muestra o resetea la dirección de inicio)
.RUN ACCT PROG x (Corre el programa x desde la cuenta PPN en la dirección x)
.S (No parece hacer nada),
Ctrl+B,S detiene un programa)
.START x (Inicia un programa o reinicia un programa sin Offset de octal)
.SWITCH x (probablemente carga un registro de conmutación con un valor dado)
.SYSTAT (corre el programa SYSTAT)
.TALK kb string (Envía un mensaje al teclado K##)
.UNDUPLEX (Desactiva Duplex)
.USER x (Show the account and keyboard for Job x)
.VERSION (Presenta la versión de TSS/8)
.WHERE (Muestra todos los valores de registro de conmutación)

Abandonar la sesión

Como vemos, el comando LOGOUT o KJOB nos permitirá abandonar la sesión de TSS/8. También es posible utilizar K como un atajo a este comando. Es importante abandonar sesión antes de desconectar la terminal, ya que el sistema no lo quitará automáticamente de los usuarios conectados, y podría quedar la sesión activa en segundo plano.

Si por alguna razón parece estar detenido, intentaremos Ctrl+B,S. Se ofrecen más adelante mayores detalles sobre lo que hace ^B en la sección Detener un programa en Ejecución.

Documentación

Sin duda os será de suma utilidad la posibilidad remota de acceso a un sistema ya preparado y pueso a disposición pública. Podrán encontrar su ayuda y guía de uso en castellano aquí.

La Guía de Usuario de Edusystem-50 (edición 1975) ofrece una documentación bastante precisa para TSS/8 versión 24. Cubre las actividades relacionadas con el usuario en el sistema operativo y también incluye el uso del ensamblador PAL-D, BASIC, FOCAL y numerosas utilidades. Opcionalmente podrán consultar el Manual del Edusystem-50.

También podrán sacar valiosa información del Manual del Monitor TSS/8 del Sistema de Tiempo Compartido (ed. 1968) y de la Guía de Usuario del Sistema de Tiempo Compartido TSS/8 (Edición de 1970).

El uso detallada de BASIC para PDP8 se encuentra en el Manual de Programación de BASIC-8 para el Sistema de Tiempo Compartido TSS/8 (de 1969).

La documentación de ALGOL puede encontrarse en el Manual de ALGOL de DECUS en tanto que esta versión detalla las diferencias específicas de dicho lenguaje en TSS/8.

LISP está documentado en http://svn.so-much-stuff.com/svn/trunk/pdp8/src/decus/8-102a/decus-8-102A.pdf

No hay comentarios:

Publicar un comentario