# ¿Cómo puedo emular RSTS/E en Ubuntu?

Señores oficiales,

Uno de los principios nodales que ha de comprender todo aquel que en el campo de batalla ha de conducir una unidad, es la de no dormirse en laureles victoriosos. Es natural que el soldado busque prolongar la paz que tanto anheló, pero debe comprender que el esfuerzo del pasado no sirve nunca de ejemplo. Ha de continuarse la preparación y la previsión para nuevas luchas que habrán de venir indefectiblemente.

Esto es así porque el hombre vencido - si ha valido la pena como enemigo - jamás quedará vencido si no obtiene justicia, y esta es la base de la paz.

Desde los antiguos griegos se sabe que el soldado dispone de una preparación: el deporte. Las arte del cultismo físico, junto con las marciales fueron - y son - la justa vara con la que puede medirse al soldado. El Oficial ha de contar - además - con la preparación que da el gabinete: el estudio de la historia y de la pericia logística obrarán de maravillas en la formación de un Conductor.

La esgrima es, por antonomasia, la percepción del arte marcial del caballero. Algunos piensan que en el cruce de aceros, los únicos metales son los del florín o del florete. Sin duda se equivocan, ya que el verdadero temple está en el Espíritu del duelista. No importa tanto el músculo de su mano, sino la decisión y empeño que impone a su arte de lucha.

Como tal me he formado y especializado en la Institución a la que nos toca pertencer. Un dato no menor es que entre 1918 y 1928 obtuve en varias oportunidades el título de Campeón Militar de Esgrima. En 1927 conquisté la Copa de Honor de Esgrima en el Círculo Militar. La pedana no tuvo secretos para mí. Pero esto no salió de un repollo, mi tío segundo Conrado Perón, fue maestro de armas y una de las primeras espadas del ejército. Fue él quien me inculcó los pormenores del choque de aceros.

En la informática sucede más o menos lo que en la esgrima. Hay varios filos de distinto peso que elegir - los sistemas operativos - pero lo importante es conocer su técnica a fondo.

Esto lo comprendí cuando empleé RSTS/E, veterano "Sistema de Tiempo Compartido para Compartir Recursos" de la Digital Equipment Corporation. Lo necesario para instalar tan enjundio no podía más que significar la necesidad de templar un alma en la hombría de bien que es necesaria para entregarlo todo en pos de la Felicidad de nuestro Pueblo.

Sin embargo, por aquél entonces, sólo podía correrse en una máquina que contara con la arquitectura de 16 bits que ostentaban las máquinas tipo PDP-11. Eran minicomputadoras portentosas y sólo al alcance del oligarca.

Providencialmente gracias al Justicialismo podremos contar con válidos émulos de ellas para utilizarlas en nuestro sistema GNU con Linux, todo gracias a las bondades del emulador SIMH, del cual profeso como uno de los grandes logros para privilegiar a todos en el arte de la Conducción de los Sistemas Operativos del Ayer.

Vean señores, RSTS/E es un sistema operativo multiusuario a tiempo compartido privativo, desarrollado por terceros en 1970 para la minicomputadora PDP-11 de Digital Equipment Corporation. Podemos trazar su origen al TSS/8 de la DEC PDP-8, aunque actualizado para las mayores posibilidades y potencias que ofrecían los 16 bits de la PDP-11. Su larga vida operativa lo pueden calificar como un verdadero Matusalén, ya que su desarrollo cesó recién en 1992, con la versión 10.2.

La manera más simple es contar con un paquete de RSTS/E ya compilado. En este caso simplemente habremos de descargar el paquete y correrlo en nuestro sisxtema GNU con Linux. 

Instalar RSTS/E v9.3

Se trata de la versión de enero de 1987. Para dar con una versión mínima pero precompilada, abrimos una terminal en nuestro sistema con Ctrl+Alt+t e ingresamos los siguientes Comandos de Organización:

mkdir ~/.simh/ ~/.simh/rsts/ ~/.simh/rsts/v9
cd ~/.simh/rsts/v9/
wget http://www.rsts.org/distros/RSTS_kits/RSTS_V9.3_Kit.zip
unzip RSTS_V9.3_Kit.zip
Ahora podremos ejecutar el RSTS/E v9.3 precompilado. Para ello lo haremos con:

cd ~/.simh/rsts/v9/
./pdp11

El sistema nos solicitará la fecha y hora. Tras ingresarlas cuidando de evitar el bug Y2K (podríamos indicar un año de la década de 1990), nos solicitará si deseamos activar el sistema de tiempo compartido ("Start Timesharing?"), a lo cual debemos responder yes.

Acto seguido se nos solicitará ingresar un usuario ya elaborado. Podremos dar con los accesos de usuario. Los usuarios de este sistema virtualizado serán:

Usuario de sistema
Usuario: [1,5]
Contraseña: SYSUSR

Usuario administrador
Usuario: [1,2]
Contraseña: SYSLIB

Usuario "Invitado"
Usuario: [100,100]
Contraseña: DEMODEMO
Utilizar RSTS/E 9.3

Podremos utilizarlo siguiendo la Guía de Usuario de RSTS/E, o bien la Guía del Administrador de sistema RSTS/E.

Podremos correr la ayuda del intérprete de comandos DCL incorporada al RSTS/E, ingresando el comando HELP.

Para salir de RSTS/E ingresamos el comando LOGOUT. Una vez vueltos a la instancia de login, presionamos Ctrl+e para retornar al emulador SIMH, y salimos del mismo mediante el comando bye.
Instalar RSTS/E v7 en Ubuntu

La versión prototípica de RSTS sin embargo fue la v7 de agosto de 1978. Es indudable que versiones posteriores incorporaron ya elementos más avanzados, pero fue "la siete" la que podríamos considerar su pico operativo y por cierto la versión más duradera. Es que por entonces la arquitectura PDP-11 ya habían sido reformuladas desde el punto de vista del hardware gracias a las nuevas tecnologías de integrados de muy alta escala, y sus LSI-11 se encontraban - comparativamente - "por moneditas".

RSTS/E v7 fue entonces el ámbito con el cual se contó con software de 16 bits de oficina, en un intento por elaborar entornos de cómputo en el lugar de trabajo.

Primero descargamos la distribución de RTST/E v7. No es la última, pero ha sido una versión importante publicada en 1987. A tal fin abrimos una terminal con Ctrl+Alt+t e ingresamos los siguientes comandos de organización:

mkdir ~/.simh/ ~/.simh/rsts/ ~/.simh/rsts/v7
cd ~/.simh/rsts/v7/
wget http://www.rsts.org/distros/RSTS_disks/V70/rsts7.0-07.tar
tar xvf rsts7.0-07.tar
Preparar RSTS/E v7 desde cero

He aquí las indicaciones sobre cómo instalar RSTS desde cero y agregarle paquetes a este sistema pre-compilado.

En primer instancia procedemos a instalamos el paquete del emulador SIMH en nuestro sistema GNU con Linux, y le damos ejecución en el modo DEC PDP-11. Todo lo podremos hacer desde nuestra temrinal presionando Ctrl+Alt+t e ingresando los siguientes Comandos de Organización:

sudo apt update
sudo apt install simh

cd ~/.simh/rsts/v7/Disks
echo ';Inicializador de instalador de RSTSv7' > ~/.simh/rsts/v7/Disks/rsts.ini
echo 'att rl0 disk0' > ~/.simh/rsts/v7/Disks/rsts.ini
echo 'att rl1 rsts_sysgng.dsk' > ~/.simh/rsts/v7/Disks/rsts.ini
echo 'set rl1 lock' > ~/.simh/rsts/v7/Disks/rsts.ini
echo 'set cpu 1m' > ~/.simh/rsts/v7/Disks/rsts.ini
echo 'b11' > ~/.simh/rsts/v7/Disks/rsts.ini

Podremos iniciar ahora el procedimiento de preparación de RSTS/E según el frondoso manual naranja de instalación. Para dar inicio al instalador ingresamos:

cd ~/.simh/rsts/v7/Disks/
pdp11 rsts.ini

Se presentará la siguiente devolución. Al crear el fichero disk0 para la unidad virtual RL02, se nos indicará si queremos sobreescribir la última pista del mismo. Indicamos que introduciendo "y".

PDP-11 simulator V3.8-1
RL: creating new file
Overwrite last track? [N] y
Ahora arrancará el sistema disco de preparación de RSTS v7-0: Deberíamos recibir el prompt "Option:"

Disabling CR
Disabling RK
Disabling HK
Disabling TM

Enabling only console, disks, and tapes.

RSTS v7-0 (DL1)
Option:

3) Formateamos el disco de cero. Habremos de responder la pregunta "por defecto" presionando Ctrl+J (en caso de contar con una videoterminal, presionaremos la tecla LineFeed).

Option: DSK
 <Ingresar fecha>
 <Ingresar hora>

Disk? RL0
Pack ID? DISK0
Pack cluster size? 2
SATT.SYS base?               <Ctrl+J>
MFD password? SYSTEM
MFD cluster size? 16
Pre-extend directories <no>? <Ctrl+J>
PUB, PRI, or SYS? SYS
Library password? SYSTEM
Library UFD cluster size? 16
Date last modified <yes>?    <Ctrl+J>
New files first <no>?         <Ctrl+J>
Patterns? 1
Proceed (Y or N)? Y
 <se muestra ciertos errores>
Continue with DSKINT? Y
Patterns? 1
Proceed (Y or N)? Y

4) Copiamos el sistema al disco de cero solicitando la rutina COP:

Option: COP
    <fecha y hora nuevamente, podemos oprimir Ctrl+J para aceptarlas>
To which disk? RL0

SIMH reiniciará desde el DL0.

Agregamos un fichero de intercambio / volcado de núcleo al disco de cero (esto tenia funcionalidad de salvataje de memoria RAM ante un cuelgue de la PDP-11), solicitando la rutina REF.

Option: REF
    <fecha y hora, de nuevo podemos usar Ctrl+j>
Disk? RL0
Clean? N
 REFRESH suboption? CHA
 SWAP.SYS changes? Y
  Size? 256
  Base?             <Ctrl+J>
 SWAP0.SYS changes? <Ctrl+J>
 SWAP1.SYS changes? <Ctrl+J>
 SWAP3.SYS changes? <Ctrl+J>
 OVR.SYS changes?   <Ctrl+J>
 ERR.SYS changes?   <Ctrl+J>
 BUFF.SYS changes?  <Ctrl+J>
 CRASH.SYS changes? Y
  Size? 35
  Base?             <Ctrl+J>
Other files?         <Ctrl+J>
REFRESH suboption?  <Ctrl+J>

Instalaremos ahora SYSGEN SIL, solicitando la rutina INS.

    Option: INS
    Sil? SYSGEN

El sistema reiniciará indicando "Rebooting...". y reiniciarça, ahora desde ña unidad DL1:

RSTS v7-0 (DL1)
Option:

Configuramos las opciones por defecto del SYSGEN SIL, solicitando la rutina DEF.   

    Option: DEF
    JOB MAX or SWAP MAX changes? Y
     New JOB MAX?                 <Ctrl+J>
     JOB MAX or SWAP MAX changes? 28
    JOB MAX or SWAP MAX changes? <Ctrl+J>
    Run Time System? RT11
    Error message file? ERR
    Installation name?  <Elegir un nombre de sistema>
     Table suboption?            <Ctrl+J>
    Crash dump? y
    Magtape labelling default <none>? ANSI
    Preferred clock <L>?         <Ctrl+J>
    Date format <ALPHABETIC>?    <Ctrl+J>
    Time format <AM/PM>?         <Ctrl+J>
    Power fail delay <1>?        <Ctrl+J>


Ahora iniciamos ya el generador de sistema SYSGEN en nuestro emulador.

Option: <Ctrl+J>
    <ingresamos fecha, hora>   

El sistema devolverá "?Can't find file or account" y ofrecerá un prompt con un "." (el prompt del sistema operativo DEC RT-11 que se usaba como base de configuración para RSTS/E).

Debemos hacernos peritos en montar el disco de distribución (SYSGNG) como solo-lectura, y utilizarlo para copiar los archivos desde el mismo.

. MOUNT DL1:SYSGNG/RO
. R DL1:CREATE.SAV

Luego de copiar los ficheros, el programa CREATE correrá automáticamente el programa SYSGEN.

Habremos de responder todas las interrogantes que nos solicite SYSGEN, la primera sección principal es importante porque le informa a SYSGEN desde dónde obtener los ficheros y parches:

    Form ?                 #S #    L
    Same system ?          #Y #                   <Ctrl+J>
    Distribution medium ?  #DL#                   <Ctrl+J>
    Output medium ?        #DL#    SY
    Delete files ?          #Y #                   <Ctrl+J>
    LP for SYSGEN ?        *Y *    N
    Generate monitor ?     #Y #                   <Ctrl+J>
    Monitor name ?         #RSTS#                 <Ctrl+J>
    Monitor patching ?     #??#    YES
    Patch file medium ?     #DL#                   <Ctrl+J>
    Pack ID ?              #??#    PATCHG
    Patch file name ?       #$MONITR.CMD#          <Ctrl+j>
    Generate BASIC-PLUS ?  #Y #                   <Ctrl+J>
    BASIC-PLUS RTS name ?  #BASIC#                <Ctrl+J>
    BASIC-PLUS patching ?  #??#    YES
    Patch file medium ?     #Identical to monitor# <Ctrl+J>
    Patch file name ?       #$BASIC.CMD#           <Ctrl+J>
    RSX as default RTS ?   #NO#                   <Ctrl+J>


...el resto de las preguntas simplemente podremos responder ingresando Ctrl+j para aceptar la opción por defecto. Eventualmente, se nos devolverá al prompt de RT-11: un simple ".".

Desde este RT11 muleto, compilamos el sistema corriendo el programa SYSBAT con:

.R SYSBAT

...y se nos presentará salida y luego nos solicitará la unidad para almacenar, inidicamos DL1:

MOUNT AX-D527G-BC ON A DISK DRIVE

READY AND WRITE PROTECT THE DRIVE

Mount DL:"SYSGNG"-write locked
Unit ? DL1

...con esta orden se compilará PIP, LINK, MACRO, LIBR, y SILUS, indicando en el terminal:

MOUNT THE MONITOR PATCH FILE DISK "PATCHG" ON A DISK DRIVE

READY AND WRITE PROTECT THE DRIVE

Mount DL:"PATCHG"-write locked
Unit ?   

Nuevamente interrumpiremos el emulador presionando Ctrl+e y cargaremos el disco con los parches del sistema operativo RSTS/E (solucionaban ciertos bugs), Para ello ingresamos los siguientes comandos al prompt SIM> de SIMH:

 sim> att rl1 rsts_patchg.dsk
 sim> c
 DL1

Con este accionar, se emparchará el intérprete de comandos Monitor y el intérprete de BASIC-Plus, presentando todo lo relativo a dicho procedimiento. Finalmente, deberá indicar "Batch job completed."

Sin duda podremos ya apagar el sistema emulado de generación SYSGEN, y correr el programa UTILTY.SAV

. R UTILTY.SAV
*NO LOGINS
*SHUTUP

 

Esto cargará ya el RSTS/E v7 que hemos creado desde el disco DL0. Solicitaremos nuevamente la rutina INS con el instalador creado, y pediremos entonces instalar nuestro propio RSTS/E peronista.

Options: INS
Sil <SYSGEN>? RSTS

Configuraremos las opciones por defecto del RSTS SIL peronista emparchado:

Options: DEF
JOB MAX or SWAP MAX changes? Y
 New JOB MAX?                 <Ctrl+J>
 New SWAP MAX? 31
JOB MAX or SWAP MAX changes? <Ctrl+J>
Run Time System? BASIC
Error message file? ERR
Installation name?  <elegir un nombre>
Table suboption?             <Ctrl+J>
Crash dump? y
Magtape labelling default <none>? ANSI
Preferred clock <L>?         <Ctrl+J>
Date format <ALPHABETIC>?    <Ctrl+J>
Time format <AM/PM>?         <Ctrl+J>
Power fail delay <1>?        <Ctrl+J>

Acto seguido montamos SYSL1G a la unidad RL2 (PATCHG aún permanecerá en DL1), y luego reiniciamos. Para ello ingresamos lo indicado en negrita:

    <presionamos Ctrl+e para detener SIMH>
Simulation stopped, PC: 034534 (WAIT)
 sim> att rl2 rsts_sysl1g.dsk
 sim> set rl2 lock
 sim> b rl0

Tras un instante arrancará nuevamente el sistema desde DL0. Ahora arrancamos el sistema de tiempo compartido.

Options: <Ctrl+J>
    <fecha,hora>

El sistema aparecerá en BASIC con el prompt "Ready":

    ?Can't find file or account
    ?Program lost-Sorry
    
    Ready

Ahora Montaremos los discos SYSL1G y PATCHG en la unidad RL02:

MOUNT DL1:PATCHG/RO
MOUNT DL2:SYSL1G/RO

De ahora en adelante instalamos el sistema BASIC corriendo la aplicación BUILD.BAS desde el disco DL2:

RUN DL2:$BUILD
BUILD   V7.0-07 RSTS V7.0-07 Peron
System Build <No> ? YES
Source Input Device <DL2:>    <Ctrl+J>
Library Output Device <SY:>   <Ctrl+J>
Target System Device <SY0:>   <Ctrl+J>
Library Account <[1,2]> ?     <Ctrl+J>

 *** Copying file DL2:[1,2]BUILD.CTL to BLD01.TMP ***

Locate logical 'LB:' on <SY:[1,1]>   <Ctrl+J>
Function (Build/Patch, Patch, Build) <Build/Patch> <Ctrl+J>
Patch file input location <SY:[200,200]> ? DL1:[1,2]
Save patched sources <No>     <Ctrl+J>
Run-Time System <BASIC >      <Ctrl+J>
Locate ERROR Package on <SY:[1,2]>   <Ctrl+J>
Additional Control File is <None>    <Ctrl+J>

En este instante, BUILD comenzará a cargar, emparchar e instalar DEC BASIC-PLUS CUSPS. Luego de un tiempo terminará con el mensaje:

!*** BUILD Complete ***"

Finalizada todo este burocrático accionar, podremos apagar el sistema. Lo haremos corriendo la aplicación SHUTUP.

RUN $SHUTUP
Minutes until system shutdown (0-99) <5>?  0

¡Enhorabuena! Encomio lo actuado pues a partir de ahora podrán contar con un un RSTS V7.0 mínimo instalado (ej. como rl0.minsys).


  [20] Para ejecutar más de dos trabajos necesitaremos agregar algo de espacio de intercambio al sistema. Para hacerlo debemos escoger dónde queremos poner el almacén de intercambios (ya sea en el disco de sistema que acabamos de crear, o en otra unidad).
 
Para poner un intercambio extra al disco de sistema:

    Option: REF
    <fecha, hora>
    Disk? DL0
    No usamos clean, elegimos la subopción "CHA"
    Seguimos las preguntas con Ctrl+j y cambiamos el tamaño de "SWAP0.SYS" a un valor (ej. 1024 bloques)
    arrancamos el sistema
    editamos "$RTS.CMD" usando el editor TECO
    agregamos la línea "FORCE KB0: ADD SWAPFILE 0 DL0:SWAP0" a la línea posterior a "RUN $UTILTY"

Para colocar una unidad de intercambio extra en otra unidad virtual, primero debemos contar con un fichero de archivo válido (use la opción "DSK" para formatear una). Luego hemos de seguir el procedimiento indicado (con el nombre de disco correcto, para agregar un fichero SWAP0.SYS a la unidad y configurarla en el sistema. Además, habremos de editar $START.CTL para montar el disco nuevo antes que corra RTS.CMD. Por ejemplo, si agregamos un disco DL1 con la etiqueta "PRIVAD" podríamos ingresar la siguiente línea en la parte superior de $START.CTL:


MOUNT DL1:PRIVAT

------------------------------------------------------------------------------

En la medida que tengamos el sistema mínimo, podremos compilar e instalar otros paquetes que anhelemos. Para compilar un paquete habremos de correr el programa $BUILD.

Por ejemplo, si SYSL1G está montado en DL2: y PATCHG se haya montado en DL3:, por lo tanto instalar el paquete HELP , tras el prompt Ready podríamos ingresar SY/D para listar y luego RUN $BUILD para iniciar el programa de compilación, de esta manera:

Ready

SY/D

Disk Structure:
Disk    Open    Free    Cluster Errors  Name    Comments
DL0       2     3480       2      0     SYSTEM  Pub, DLW
DL1       1     4332       2      0     PRIVAT  Pri, DLW
DL2       0     1422       1      0     SYSL1G  Pri, R-O
DL3       0     3800       1      0     PATCHG  Pri, R-O, DLW

Ready

RUN $BUILD
BUILD   V7.0-07B        RSTS V7.0-07 Peron
System Build <No> ?
Source Input Device <SY:> ? DL2:
Library Output Device <SY:> ?
Target System Device <SY0:> ?
Library Account <[1,2]> ?
Control File is ? HELP

*** Copying file DL2:[1,2]HELP.CTL to BLD02.TMP ***

Function (Build/Patch, Patch, Build) <Build/Patch> ?
Patch file input location <SY:[200,200]> ? DL3:[1,2]
Run-Time System <BASIC > ?
Locate HELP Package on <SY:[1,2]> ? SY:[1,8]

%Can't find file or account - SY:[1,8]
Attempt to create account SY:[1,8] <No>? YES
Account SY:[1,8] created with your password
Additional Control File is <None> ?

El programa de compilación correrá y compilará el paquete HELP. Podremos repetir lo mismo con los siguientes programas:

Los siguientes paquetes están disponibles en aras de la justicia social:

En la imagen SYSGNG:
MAINT.CTL = usado para recompilar RSX (no tan útil)
RSX.CTL = el sistema ejecutable de RSX
SORT.CTL = SORT (patches fail since we don't have RMS distribution)
TECO.CTL = el editor TECO (SQU, TYPE, TECKBM...)

En la imagen SYSL1G:
BUILD.CTL = el sistema básico de compilación (debería ya estar instalado)
SPLER.CTL = programas de spooling (QUE, OPSER, BATCH, etc.)
UNSUPP.CTL = programas no soportados (DSKDMP, STATUS, DEMO55)
BIGPRG.CTL = programas "grandes"(RUNOFF, FIT, FLINT, PMDUMP, BPCREF, MAKSIL).
BACKUP.CTL = Paquete de respaldo
DEVTST.CTL = Prueba de dispositivos
HELP.CTL = los ficheros de ayuda

Recordemos corriendolos con RUN. Podremos salir del sistema con RUN $SHUTUP y finalmente Ctrl+e para volver al emulador. Saldremos del emulador SIMH con el comando introduciendo en el prompt sim> el comando BYE.