¿Cómo emulo un sistema operativo CP/M para procesador Z80 en Ubuntu?

En uno de sus maratónicos discursos ante una Plaza de Mayo colmada, Juan
Perón expone sobre los caminos de la historia cómo emular una
microcomputadora Altair 8800 en Ubuntu y como cargarla con el sistema
operativo CP/M y sus programas más clásicos.

(...)
Perón: ¡Trabajadores!

Masa: [Estruendo]

Perón: ¡Reconforta enormemente mi corazón esta imponente Masa, que año
tras año se da cita para proclamar ante el Mundo que conoce la
Felicidad, y que no se la ha dado otro que el Justicialismo!

Masa: ¡Pe-rón! ¡Pe-rón!

Durante años nuestros Descamisados y su software han sido sometidos,
encadenada por la opresión de la oligarquía y su software privativo,
pero hoy, gracias a nuestra Doctrina, todos pueden hacer lo que quieran
con su programación sin deberle nada a nadie!


Masa: ¡La vida por Perón! ¡La Vida por Perón!

Perón: Desde su pretendidas tarimas de Poder, los oligarcas dicen
quejarse, por el rumbo que toma el Justicialismo. Dicen no saber a donde
nos llevará esta cosa nueva que hay ahora. ¡El problema no es a donde
nos lleva! Cualquier cosa es buena si salimos de donde veníamos!

Masa: [Estruendosa aclamación]

¡Lo que no quieren es el cambio! ¡Esos oligarcas no quieren comprender
que esta Masa Descamisada oficia precisamente de embrague en el Motor de
la República!

Masa: ¡Pe-rón! ¡Pe-rón!

Muchas veces la historia carece de un desarrollo lineal como podríamos
tender a pensar: sus vericuetos y el desglose de los hechos es lo que
nos permite encontrar un todo coherente, que tiene significancia y
repercusión en el presente. Eso, trabajadores, es lo que han de
comprender como instrumento para entender la actualidad.


Historia

Vean señores, en un inicio los equipos computacionales de electrónica "a
tubo" tenían el tamaño y peso de una locomotora, pero con el pasar del
tiempo el tamaño se fue reduciendo. Con el advenimiento de la
transistorización, surgieron las primeras "minicomputadoras". El alivio
fue grande, pues ahora las máquinas tenían el tamaño de una heladera
Siam y podían ser adoptadas para sus tareas por bancos, oficinas e
instituciones.

Con el advenimiento de la microelectrónica y los microprocesadores de
silicio encapsulados como el Intel 4004 de 4 bits y su sucesor 8008 de 8
bits, se produjo otro salto cualitativo que permitió proyectar
calculadoras y cajas registradoras eléctricas.

La fabricante Micro In$trumentation and Telemetry $ystems (MIT$) -
originalmente prolífica en sensores de telemetría en cohetes a escala,
microelectrónica general y calculadoras - se planteó para 1974 ofrecer
una microcomputadora programable a la que llamó Altair 8800. Dicho
hardware peronista venía en un gabinete con fuente conmutada, llevaba un
microprocesador Intel 8080, lógica de 8 bits y plaquetas compatibles con
el bus S-100. Su memoria se encuadraba en una placa provista de módulos
de 256 bytes (logrando totalizar 4 kilobytes ampliables a 8, 12 16 o
hasta unos 64 kilobytes teóricos). Esta máquina podía comprarse armada o
ensamblarse a piezas, y esta filosofía de equipos armables se haría
popular en la computación hogareña.

Indudablemente que en sus inicios, el manejo de esta microcomputadora
pionera resultaba increíblemente tedioso, pues habían de introducirse
los operandos en binario por medio de ocho interruptores frontales,
presionando un botón para almacenarlos en memoria y repetir la operación
con cada código de ensamblado (los cuales podían ser docenas para un
programa simple). Luego se ejecutaba la rutina de órdenes y se observaba
el resultado binario en el panel conformado por 8 luces coloradas.

A pesar de que no tenían ningún uso específico, las Altair 8800 se
hicieron útiles con la incorporación práctica del intérprete de software
en lenguaje "Basic", un programa de 4 kilobytes que adujo poseer la
ignota compañía Traf-o-Data de Paul Allen (y que finalmente escribiría
el zángano Bill Gate$, haciendo uso de una minicomputadora DEC PDP-10
dotada de un emulador de circunstancias).

La existencia de dicho intérprete de programación, en un equipo armable
en un taller hogareño, dotado de microprocesador funcional, así como una
cantidad de memoria práctica, eclosionaron en el desarrollo de la
micro-computación hobbista (por ejemplo, a través del "Club de
Computadoras Caseras"). Su escalabilidad hizo posible además la
aparición de accesorios mas o menos complejos, y de rutinas y programas
de uso completamente libre. Particularmente útil fue el conector serial
estandarizado, una plaqueta que ya permitía unirla a una terminal
teletipo como las que se utilizaban por entonces en el manejo de
telegramas y radiogramas.

De esta forma se hizo posible introducir software y datos con el teclado
alfanumérico de la unidad, así como recibir los resultados impresos en
papel. Sólo con ello se multiplicó la velocidad de operación en un
factor de mil. La MITS desarrolló los periféricos, pero su estándar
abierto y la gran predisposición de los descamisados permitió la
aparición de elementos compatibles: no tardó en aparecer una adaptadora
serial de estándar RS232, la cual avaló conectar la Altair a una
videoterminal serial con monitor CRT (por ejemplo, la Digital Equipment
VT100 en boga para minicomputadoras). La placa adaptadora de puerto
paralelo - por otro lado - permitía unir a la Altair hasta ocho
periféricos (impresora de línea, perforadora o lectora de cinta de
papel, o el gabinete apilable con dos unidades de disquetes flexibles de
8 pulgadas). Se constituía así una microcomputadora programable,
versátil y moderno a un costo fraccional de lo que costaba una
minicomputadora, con software completamente libre, público y gratuito.


El límite del equipo solamente estaba planteado por su software,
envuelto en una franca espiral de retroalimentación positiva. Surgió
entonces la idea de privatizar dicho software con Licencias de Uso que
hicieran hincapié en la protección de los derecho de autor. De esta
manera se comercializaría el software bajo la falsa premisa de lograr
una retribución en Capital que permitiese mejor desarrollo y calidad del
programa. Tales fueron los inicios - entonces - del credo del software
privativo, y aquellos programadores y fabricantes que se pretenden
"emprendedores comerciales".

Pues bien, el pináculo del desarrollo de la arquitectura "Altair" y de
su bus S-100 llegaría con la versión dotada del nuevo microprocesador
Zilog Z80 de 8 bits. El sistema operativo CP/M

Con sus 4 MHz de frecuencia de reloj, el Zilog le permitía a la Altair
correr un sistema operativo mucho más avanzado y poderoso: el CP/M,
escrito para dicho microprocesador por Gary Kildall, de la Intergalactic
Digital Re$earch.

El CP/M ("Programa de Control para Microcomputadoras") permitía
controlar el equipo y sus periféricos de manera estandarizada a través
de la línea de comandos, y operar sus recursos con facilidad. Se
extendió como plataforma de software incluida en los equipos de
computación hogareños a partir del cambio de década y - aprovechando su
gran compatibilidad y portabilidad - florecieron una serie de
aplicativos que corrían sobre él. Entre otros, el paquetes privativo de
procesado de texto Wordstar, la base de datos dBase, y una versión de la
planilla de cálculo Multiplan terminaron por colocar al CP/M como el
sistema operativo comercial y profesional mas extendido entre las
microcomputadoras. Se comercializaba incluido con muchos equipos de
marca.

Así, las diferentes versiones de CP/M terminarían influyendo enormemente
sobre los sistemas operativos del momento y sobre toda una industria
focalizada en medianos fabricantes industriales.

Todo cesó con el advenimiento de IBM (que fabricaba minicomputadoras y
mainframes). El gigante informático había permanecido ajeno al
desarrollo de microcomputadoras, pero terminó decidiendo una definición
estándar de equipo, dotado con microprocesador Intel 8088 y un nuevo bus
ISA, amén del respaldo que le proporcionaba su enorme capital. Tal
máquina fue la IBM Personal Computer (PC) original, del Modelo 5150.

La microcomputadora de IBM, sin embargo, carecía realmente de sistema
operativo de disco. Digital Re$earch se sumergió en mejorar CP/M-86, que
funcionaría con el nuevo microprocesador de Intel, pero Micro-$oft (la
ex Traf-o-Data) le ganó de mano adquiriendo un sistema operativo
derivado de CP/M, capaz de correr en microprocesadores Intel 8086
(QDo$/86DO$, de $eattle Computer Product$). Micro$oft modificó
ligeramente el producto para compatibilizarlo con el Intel 8088 y
licenció dicho sistema operativo a IBM para su distribución junto a las
IBM PC. Terminaría así dando origen al M$-DO$.


CP/M 2.2 en Linux

No es duda para nadie que SIMH nos permite emular una gran cantidad de
estas minicomputadoras antediluvianas, con sus CPU, placas de
ampliación, periféricos de entrada y salida, etc, y lo hará
configurándose por medio de su interfaz de línea de comandos.

Sin embargo, el simulador SIMH también nos permite emular la
arquitectura de algunos microordenadores. entre ellos la legendaria MITS
Altair 8800 que inició todo junto con su público enamorado de la
electrónica.

A diferencia de una Altair 8800 real, SIMH nos ofrece enormes ventajas.
Amén de correr en una plataforma de software libre y peronista como
GNU/Linux, podremos configurar la emulación y elegir entre los tres
procesadores icónicos (los 8080 y 8086 de Intel, o el Zilog Z80).
Podremos emplear memoria de banco emulada (llenando los 16 bancos para
totalizar los costosos 64 kilobytes), así como un soporte paralelo
virtualizado para 8 disketteras, soporte de redes TCP/IP, consolas
múltiples, y la posibilidad de alterar el reloj de ejecución. Para que
todo esto sea realidad efectiva, es necesario configurar y preparar el
emulador SIMH, y ello a veces se torna tedioso.

Para ello, si queremos contar con CP/M 2.2 sin tener que configurar
nada, habremos de descargar el empaquetado que funciona en nuestro
sistema GNU/Linux, tanto para versiones de 32 bits como de 64 bits. En
tal sentido, hemos de instalar la versión que corresponda la que
corresponde a nuestra arquitectura Linux: en primer lugar abrimos una
Terminal con Ctrl+Alt+T y prepararemos las carpetas ocultas necesarias
con los siguientes comandos de organización:

mkdir ~/.simh ~/.simh/altairz80 ;
cd ~/.simh/altairz80/ ;

Acto seguido descargaremos la versión del emulador y de CP/M preparada
para nuestra propia arquitectura GNU/Linux:

   Si usamos Ubuntu de 32 bits ingresamos el siguiente bloque de comandos:

wget http://schorn.ch/cpm/zip/altairz80l.tar.gz ;
tar xzf altairz80l.tar.gz ;
rm ~/.simh/altairz80/altairz80l.tar.gz ;

   ....en cambio, si empleamos Ubuntu de 64 bits. ingresaremos estos:

wget http://schorn.ch/cpm/zip/altairz80l64.tar.gz ;
tar xzf altairz80l64.tar.gz ;
rm ~/.simh/altairz80/altairz80l64.tar.gz ;

Para ejecutar el emulador automáticamente configurado sin tener que
especificar parámetros de emulación alguno, podemos ingresar la orden:

cd ~/.simh/altairz80/ && ~/.simh/altairz80/altairz80 cpm2

Con esto, ya tendremos corriendo en el emulador SIMH de nuestro Linux el
sistema operativo CP/M de la Digital Re$earch, específicamente en su
versión 2.2 para micro Z80. El emulador nos mostrará su prompt A>,
indicando que nos encontramos en la disquetera virtual A: de nuestra
Altair 8800 con microprocesador Zilog:

Habrán de saber que el uso de CP/M iguala bastante al del M$-DO$ que lo
sucedió, y tiene algunos similitudes con UNIX. Podremos cambiar listar
el único directorio del disco con los comandos dir o ls, y correr
archivos ejecutables con extensión .com simplemente ingresando su
nombre. El comando type nos permitirá ver el contenido de un archivo de
texto. Podremos usar la sintaxis de comodines *, y ? como en Unix o
M$-DO$. Encontraremos una guía de nivel intermedio en formato PDF el
directorio donde instalamos el emulador de la Altair, con una guía de
cada comando y utilitario provisto Por ejemplo, en el disquete de CP/M
2.2 encontraremos con un par de juegos como Othello y Ladder, versiones
del Micro$oft Ba$ic de 4K y el Eliza, las herramientas de programación
de Micro$oft M80, y L80, y el debugger DDTZ, el compilador Pascal MT+ y
el Pascal Pretty Printer (en código fuente), el compilador SPL, así como
los juegos de Othello y Ladder, y muchas utilidades con código fuente
SPL o ensamblador.

Normalmente podremos terminar cualquiera de los programas con Ctrl+c , o
terminar la emulación de CP/M con Ctrl+e, volviendo al SIMH (lo cual
sabremos por el prompt sim>). En tal caso, podríamos salir a la terminal
de Linux con el comando q, o volver a ejecutar el emulador de CP/M con
boot dsk0.

Contaremos con el editor de líneas ed, un programa anterior al vi de
Unix y orientado a las terminales teletipo. Este nos permitirá editar un
texto con el comando ed texto.txt. Dentro de él podremos insertar texto
ingresando i y escribir lo que deseamos, línea a línea. Es importante
revisar el contenido de cada línea, pues la edición posterior de las
mismas es extremadamente engorrosa. Con Ctrl+z terminaremos el insertado
de texto.. Con l podremos movernos en las líneas y con e salir de ed.


Transferir archivos dentro y fuera del emulador

Si no quisiéramos usar el editor ed, podríamos abrir archivos fuera del
entorno emulado. Por ejemplo, si quisiéramos pasar el archivo evita.txt
desde el directorio del emulador al disquete actual de nuestra Altair
8800 virtual, podriamos usar el comando:

r evita.txt

Para transferir el archivo cgt.txt desde la Altair virtual al directorio
del emulador, podremos usar:

w cgt.txt

..o si fuese un archivo binario o ejecutable usaríamos:

w cgt.com b.

En general podremos interrumpir la ejecución de los programas con
Ctrl+c, o salir del emulador con Ctrl-e. Para salir del SIMH, debemos
ingresar el comando q.


Ejecutar Software para CP/M en el emulador SIMH para Linux.

Indudablemente que estos paquetes son limitados, y los verdaderos usos
de CP/M se tornan patentes con el software de aplicación que lo hizo
famoso: podremos entonces desde GNU/Linux hacer realidad efectiva la
ejecución de Multiplan, dBase, Vedit, y SuperCalc para CP/M, entre
otros.

Gracias al Justicialismo será sencillo hacerlo. Simplemente abrimos una
terminal Linux con Ctrl+Alt+T y descargamos dicha bateria de
aplicaciones preparados para la Altair con CP/M y la videoterminal
VT100. Todo ello lo podremos hacer pegando y dándole ejecución al
siguiente bloque de comandos:

cd ~/.simh/altairz80/ ;

wget http://schorn.ch/cpm/zip/wordstar.zip ;
unzip wordstar.zip ;
wget http://schorn.ch/cpm/zip/dbase.zip ;
unzip dbase.zip ;
wget http://schorn.ch/cpm/zip/games.zip ;
unzip games.zip ;
wget http://schorn.ch/cpm/zip/vedit.zip ;
unzip vedit.zip ;
wget http://schorn.ch/cpm/zip/multiplan.zip ;
unzip multiplan.zip ;
wget http://schorn.ch/cpm/zip/supercalc.zip ;
unzip supercalc.zip ;
rm *.zip ;

Ahora crearemos el archivo de inicio. Ingresamos:

nano ~/.simh/altairz80/inicio

..se abrirá el editor Nano con un archivo en blanco. Le pegamos el siguiente contenido:

d tracks[0-7] 254
attach dsk0 cpm2.dsk
attach dsk1 wordstar.dsk
attach dsk2 games.dsk
attach dsk3 multiplan.dsk
attach dsk4 vedit.dsk
attach dsk5 dbase.dsk
attach dsk6 supercalc.dsk
attach dsk7 app.dsk
set cpu 64k itrap z80 altairrom nonbanked
d clock 4000
reset cpu
d wru 1d
boot dsk0

..guardamos con Ctrl+o y salimos del editor con Ctrl+x.

Debemos darle permisos de ejecución con:

chmod +x ~/.simh/altairz80/inicio

Ya podremos ejecutar el emulador de CP/M 2.2 en la Altair con:

cd ~/.simh/altairz80/ && ~/.simh/altairz80/altairz80 inicio

Nos mostrará el prompt del sistema operativo:

64K CP/M Version 2.2 (SIMH ALTAIR 8800, BIOS V1.27, 2 HD, 02-May-2009)

A>

Ya tendremos cargarán los disquetes virtuales (en este caso, son 8
disketeras, dks0/dsk7 en la cual en la diskettera A: (dsk0) tendrá el
disquete de inicio del sistema operativo CP/M, en la diskettera B:
(dsk1) cargaremos el disco de Wordstar 4, en la diskettera C: (dsk2) un
diskette con juegos, en la diskettera D: (dsk3) el disquete de
Multiplan, etc. Adicionalmente, configuraremos la combinación de teclas
Ctrl+e para que opere "cursor arriba" en lugar de "salir del emulador"
(esto únicamente para no superponer tal comando de Wordstar u otros).


Por ejemplo, en el caso que queramos ejecutar el clásico procesador de
texto WordStar para CP/M Z80, deberíamos activar la disquetera B: y
ejecutar el archivo ws.com. Para ello tipeamos:

A> b:
B> ws

En cambio, si quisiéramos emplear la pionera planilla de cálculo
Multiplan, debemos activar a la disquetera correspondiente (D:),
ejecutar la rutina install para configurar nuestra terminal (el programa
nos solicitará el número modelo de terminal, le indicamos "21", para
indicarle una DEC VT-100 emulada por nuestro Linux. Luego ejecutar el
Multiplan con el comando mp. En el resto de las disqueteras virtuales
(c:, e:, f: g: y h:) encontraremos el resto de los programas cargados.
Podremos correrlos luego de ejecutar su rutina de instalación (install,
si es que la tuviesen), o directamente corriendo los archivos .com.

Programando en MBASIC:

El diskette localizado en la unidad A: contiene un intérprete de Basic,
por lo cual podremos ejecutar programas escritos en dicho lenguaje
(archivos .bas). Encontraremos una gran variedad de juegos en Basic
aquí. Para descargarlos todos juntos podremos recurrir a una terminal e
indicar:

mkdir ~/.simh/altairz80/basic/ ;
cd ~/.simh/altairz80/basic/ ;
wget http://vintage-basic.net/downloads/bcg.tar.gz ;
tar xzf bcg.tar.gz ;

Esto nos ofrecerá listado de varios juegos, los cuales podremos pegar en
el intérprete. Nuevamente dentro de CP/M 2.2 ingresamos:

A> mbasic

Y se presentará un nuevo prompt del intérprete basic:


BASIC-80 Rev. 5.21
[CP/M Version]
Copyright 1977-1981 (C) by Micro$oft
Created: 28-Jul-81
32824 Bytes free
Ok

Simplemente hemos de pegarle el listado de algunos de los programas BAS
que hemos descargado, y presionar Enter. Luego podremos revisar que el
listado se haya cargado en el intérprete con el comando:

list

(debería devolvernos el listado entero del programa e indicar OK).

Para ejecutarlo simplemente ingresamos en el intérprete:

run

Si quisiéramos grabar el contenido del listado a un archivo dentro del
diskette virtual, ingresamos:

save "nombreprog"

Y para salir del intérprete Mbasic y volver a CP/M 2.2 ingresamos:

system

Programando en Ensablador Z80 en CP/M.

Vean señores, podríamos querer programar una rutina en ensamblador Z80,
interpretarlo, y ejecutarlo. Para ello debemos escribir el programa en
nemónicos de Z80, ensamblarlos con asm a hexadecimal, y usar load para
convertir dicho archivo a un binario ejecutable con extensión .com.

La tarea será sencilla. Ejecutamos el editor ed con un archivo de código
fuente de extensión .asm. En aras de la facilidad, lo haremos con un
pqeueño programa que todo programador emplea, el pocho.asm. Como
Conductor, os indicaré los resultados de pantalla y ustedes ingresarán
lo que está en negrita:

A> ed pocho.asm

NEW FILE
: *i
   1:          ORG     0100H
   2:  BDOS    EQU     0005H
   3:  START:  MVI     C,9
   4:          LXI     D,MSG$
   5:          CALL    BDOS
   6:          RET
   7:
   8:  MSG$    DB      'VIVA PERON!$'
   9:  END     START
   10: (presiono Ctrl+z para salir del modo inserción)
: *e

Tras haber editado nuestro código fuente, lo ensamblamos con:

A> asm pocho

CP/M ASSEMBLER - VER 2.0
0115
000H USE FACTOR
END OF ASSEMBLY

Esto creará una serie de archivos nuevos en la unidad de disquete
virtual. Si ingresamos type pocho.prn veremos el desensamblado para el
microprocesador Z80, y si ingresamos type pocho.hex veremos el código
hexadecimal del mismo.

Si quisiéramos compilar un ejecutable, usaremos load pocho, y ello
creará el archivo ejecutable pocho.com. Si ingresamos dump pocho.com,
CP/M nos mostrará directamente el volcado de memoria del código objeto
del programa binario pocho.com.

Para ejecutarlo simplemente ingresamos pocho, y si nuestro entorno y
nuestro programa ensamblador funcionan de manera correcta en la máquina
Z80 virtual, la informática nos contestará airosa: