13 december 2021
¿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: