El emulador ESP32 Altair adquiere personalidad dividida

Si quisieras que mostrara un CP / M ejecutándose en un Altair 8800 copiado, sacaría una pequeña tabla de mi bolsillo. Quizás se pregunte cómo terminé con un Altair 8800 que ejecuta CP / M (incluso WordStar) que viene en su bolsillo y cuesta menos de $ 10. Resulta que es una historia que se remonta a 1975.

Cuando llegó el Altair 8800 en 1975, quería uno. Malo. Leí sobre computadoras pero no tenía experiencia práctica. Pero entonces, en lo que a mí respecta, el precio de $ 400 también podría ser de un millón de dólares. Trabajé sin un salario real en la tienda de mi familia, aunque bastante justamente, ajustado al dinero de hoy, que era alrededor de $ 2,000.

Me gustaría comprar uno ahora, pero un Altair real cuesta incluso más hoy que entonces. También ocupan mucho espacio en el escritorio. Claro, hay copias y yo tenía algunas. Incluso ayudé a trabajar con los clones del clon de Vince Briel que disfruté. Sin embargo la computadora Briel tiene dos problemas. Primero se necesita algo de trabajo para operar un puerto serie (usa un teclado VGA y PS / 2). En segundo lugar, aunque es más pequeño que un Altair real, sigue siendo bastante grande, un subproducto de su hermoso panel frontal.

Entonces, para mostrar rápidamente CP / M a alguien, debe sacar una caja grande y encontrar un monitor VGA y un teclado PS / 2, los cuales se están convirtiendo en productos que están desapareciendo. He realizado algunas modificaciones para operar el puerto serie, pero aún queda mucho por comprar. Podrías seguir la ruta de la programación con un simulador como SIMH o Z80pack, pero ahora, en lugar de encontrar un monitor VGA y un teclado PS / 2, necesitas encontrar una computadora donde puedas instalar el programa. Lo que realmente quería era un dispositivo simple y portátil que pudiera ejecutar CP / M.

La solución ESP32

La biblioteca FABGL permite que el EPS32 controle un monitor VGA y también proporciona capacidades de terminal con un teclado PS / 2. También cubre algunas otras características, como trabajar con un sistema de archivos flash o una tarjeta de memoria externa. Un ejemplo es una copia de Altair 8800 adaptada de otro proyecto de código abierto. La placa VGA32 funciona con la biblioteca y es muy barata. Necesitaba algo de trabajo, pero la emulación de Altaira funcionó bien en la placa, así que terminé con un reemplazo de $ 10 para la computadora Briel que cabe en mi bolsillo. El único problema era que todavía necesitaba un monitor VGA y un teclado PS / 2.

Quería cambiar un poco el código para poder usar el puerto serie y, debido al hermoso diseño del emulador, resultó ser no solo relativamente fácil sino también lo suficientemente simple como para permitir ambos modos: puede conducir VGA o usar con el cable USB con un programa de terminal serie normal.

La emulacion

Antes de entrar en los cambios, veamos la copia tal como existía antes de comenzar a trabajar en ella. Fabrizio, el FAB en FABGL, sin duda se le ocurrió un hermoso diseño. El archivo principal de Arduino Sketch organizó la configuración de Altair e incluía imágenes de disco que puede montar solo para leer o leer.

El único problema que encontré fue que la copia usó algunas características que no parecen estar en la biblioteca que el IDE de Arduino instala con el administrador de la biblioteca. El administrador afirma tener la versión 1.8, que es compatible con GitHub, pero todavía había símbolos sin resolver durante la compilación del ejemplo.

La solución fue eliminar la biblioteca existente, descargar todo el repositorio de GitHub como un archivo ZIP y luego pedirle al administrador de la biblioteca que lo instale desde el archivo. Después de eso todo estuvo bien. Si desea realizar la instalación, puede comenzar con mi bifurcación, para que pueda obtener el código de muestra actualizado de Altair.

La siguiente capa de abstracción está en el archivo machine.cpp del directorio / src. Este archivo tiene una capa abstracta de dispositivo para las copias reales de la CPU en un archivo diferente. El archivo machine.cpp contiene el código para administrar la memoria, las unidades de disco, los dispositivos de E / S y ejecutar programas.

El código de la CPU se divide en dos partes. Hay una copia 8080 originalmente de Viacheslav Slavinsky y una copia Z-80 de Lin Ke-Fong. Ha habido modificaciones, pero en general estos archivos son solo la lógica de emulación.

Cuando lanza el código, intenta encontrar una tarjeta SD, pero si no la encuentra, usará flash interno para copiar el disco. Tiene todo el código del cargador y casi funciona como un Altair real, aunque sin panel frontal, claro. Hay un menú de emulación que puede mostrar con la tecla de pausa en el teclado. Aunque obviamente eso no nos servirá de mucho sin un teclado PS / 2 conectado.

Desde el menú de emulación, puede descartar y leer datos del dispositivo lector punk. Sin embargo, los discos CP / M también tienen beneficios que puede utilizar para los archivos XModem de ida y vuelta a su computadora. También puede hacer cosas como elegir la CPU 8080 frente a la Z80 y establecer la velocidad de emulación.

La investigación

Comencé a investigar el código para ver qué tan difícil sería agregar la puerta de serie. Resulta que la configuración tiene el diseño del puerto serie, pero lo usa como puntero / lector CP / M. En el código, hay tres líneas que conectan diferentes flujos a los dispositivos SIO0, SIO1 y SIO2. Los dispositivos de la consola (SIO0 y SIO1) están sintonizados con el flujo final que proporciona FABGL. SIO2 usa el flujo serial estándar.

Esa fue una buena señal y, efectivamente, el flujo final coincide con el de la serie. Como un simple experimento, recientemente cambié las referencias de la terminal a serial. El sistema se puso en marcha y me dio una solicitud CP / M a través del terminal serie.

Eso dejó algunos problemas menores. Sin un teclado PS / 2, no hay forma de acceder al menú del emulador. Además, el menú de emulación estaba conectado al terminal. Fue bastante fácil solucionar ambos problemas.

Arreglar el menú Emular

Solo hay un botón de usuario en la placa VGA32, por lo que tenía sentido usarlo para invocar el menú de emulación en el puerto serie. No fue difícil cambiar el código que lo llama (en machine.cpp):

IRAM_ATTR int Machine::nextStep(CPU cpu)
{
    auto keyboard = fabgl::PS2Controller::instance()->keyboard();
    static int  inmenu=0;
    if (m_menuCallback && keyboard->isVKDown(VirtualKey::VK_PAUSE))
        m_menuCallback(0);
  
    // check for menu
    if (!digitalRead(USER_BUTTON))
    {
        if (inmenu==0)
        {
            inmenu=1;
            m_menuCallback(1);
            inmenu=0;
        }
    }

Con este cambio, el menú de recuperación de copia obtiene un argumento adicional y ese argumento se establece según el método de entrada. El problema es que tienes que cambiar en el archivo principal. Descubrí el código que usa el menú para leer el teclado para obtener la función getChar. Aparecen los bloques de terminales hasta que se presiona una tecla, pero la puerta serial no, por lo que tomó algún cambio para que esto funcione correctamente.

Para minimizar los cambios de código, cambié todas las referencias a Terminal a CONSOLE y agregué esta línea al comienzo de la función emulator_emu:

Stream &CONSOLE=stream?(Stream &)Serial:(Stream &)Terminal;

Usar una referencia significa que no tengo que cambiar todos los puntos por flechas, que sería el caso si tuviera que usar un puntero.

Doble personalidad

El último cambio que quería hacer era permitir que el código original funcionara para que aún pueda usar el VGA y el teclado. Pensé en crear un nuevo elemento en el menú de emulación, pero decidí volver a utilizar el botón de usuario. Al inicio, el código observa el estado del botón. Con el botón hacia arriba, la placa se inicia en modo serie. Si el botón está desactivado, la placa configura el terminal VGA y espera a que se suelte el botón:

if (!digitalRead(USER_BUTTON))
{
    streamsel=0;
   // TTY
   SIO0.attachStream(&Terminal);

   // CRT/Keyboard
   SIO1.attachStream(&Terminal);</pre>

   // Serial
   SIO2.attachStream(&Serial);
}
else
{
    streamsel=1;
    // TTY
    SIO0.attachStream(&Serial);

    // CRT/Keyboard
    SIO1.attachStream(&Serial);

    // Serial
    SIO2.attachStream(&Serial);
}
// wait for button release
while (!digitalRead(USER_BUTTON));

Diversión de código abierto

Este es un gran ejemplo de cómo se puede construir sobre otro trabajo. Los emuladores provienen de una variedad de fuentes, y Fabrizio proporcionó excelentes elementos reutilizables. Fue muy simple modificar el código para hacer lo que quería hacer.

¿Estoy escribiendo esta publicación usando WordStar? Quizás. Recuerde que necesitará la emulación de terminal correcta o querrá instalar los discos de WordStar en un disco de lectura y escritura para poder ejecutar WSChange y elegir el tipo de terminal que tiene.

Por unos pocos dólares, esta era una excelente manera de tener una computadora CP / M de arranque con muchas opciones. La idea tampoco se limita al ESP32, ya que ciertamente podría armar algo con el Arduino. Puede que no sea lo mismo construir un dispositivo real desde cero, pero ciertamente es mucho más barato.

  • Jose rodriguez dice:

    ¿Para qué se utiliza el hardware del proveedor?

    • rwoodsmall dice:

      Parece LILYGO TTGO VGA32. Disponible a través de Aliexpress, Amazon, Banggood, etc.

  • ajlitt dice:

    Comparto la diferencia en mi proyecto Blinkencard parpadeando y cortando los interruptores: https://la-tecnologia.io/project/169140-blinkencard

    También usa ESP32, pero como interfaz para la emulación FPGA de Altair.

    Podría hacer algo similar con la emulación ESP32 alojada con un conmutador SPI.

  • Perry Harrington dice:

    Creo que se olvidó de hacer ^ QY sobre esto:

    Aunque eso no nos servirá de mucho sin un teclado conectado. Aunque obviamente eso no nos servirá de mucho sin un teclado PS / 2 conectado.

    • Braza roja dice:

      ¡PERO DÓNDE ESTÁ EL PALMER! son muy importantes.

    • Braza roja dice:

      Ay, lo siento. Supongo que leí tu comentario.

  • pmhupman dice:

    Como alguien que ha aprendido el lenguaje de máquina en Altair, puedo decirte que no es lo mismo sin los interruptores y los LED ...

  • tambalearse dice:

    Milenios sangrientos

  • Byron Jones dice:

    ¡Esto es muy genial! ¿Ha considerado utilizar un terminal en línea? Eliminaría la necesidad de conectarse a un monitor y un teclado.

    • uno dice:

      https://s2js.com/altair/sim.html

  • bootrino dice:

    Este sitio simplemente roba este contenido: https://nationalcybersecuritynews.today/computerhacking-computer-hacking-esp32-altair-emulator-gets-split-personality/

    • mxb dice:

      es curioso cómo ese sitio enumera el enlace de origen como la-tecnologia ...

    • Oxido dice:

      Sí ... haga clic en la fuente a continuación ...

    • Elliot Williams dice:

      ¡Gracias por avisarme! Los perseguiremos.

      Se sorprenderá de la cantidad de sitios que existen. Tenemos algunos al año y estoy seguro de que no los vemos todos.

  • loxmyth dice:

    Es un uso legal del lenguaje hablado de muy, muy larga duración. Creo que en realidad nadie se ofende. Si es así, que cometan su propia falta,

  • John dice:

    ¿Ofenderse por algo que no es válido para usted cuenta como apropiación cultural?

  • eriklscott dice:

    Está bien, el término se ha considerado arcaico durante bastante tiempo.

  • Fabrizio Di Vittorio dice:

    ¡Gracias por tu trabajo! También puede ver CP / M con multitarea, multisesión, subcarpetas, FAT32, etc ... todavía como un programa de demostración de FabGL.
    https://github.com/fdivitto/FabGL

    • Al Williams dice:

      ¡Muy genial! Aquí está el enlace completo para los interesados: https://github.com/fdivitto/FabGL/tree/master/examples/VGA/MultitaskingCPM

    • Joshua dice:

      ¡Hola! ¿Cómo se relaciona esto con MP / M? 🙂
      ¿Tiene soporte para transferencia bancaria o múltiples usuarios, etc.?

      • Fabrizio Di Vittorio dice:

        No está relacionado con MP / M. De hecho, tanto BIOS como BDOS se han reescrito desde cero, recreando un entorno compatible con CP / M 3. Cada programa tiene un entorno de ejecución exclusivo con 64K RAM. No es compatible con múltiples usuarios, ¡quizás en el futuro!

  • RetepV dice:

    No te preocupes Steven13, ya te ves como un idiota loco con solo publicar esto. Al final todo es igual. A menos que continúe negando que es tan insensible con un tonto como cualquier otra persona.

    Para todos los demás: es solo una fase. Las personas que lo acompañan inevitablemente se identificarán. Y sucederá si aceptan que, después de todo, no son divinos.

    Asegurémonos de que su crisis de identidad no provoque otra guerra, como ha sucedido a menudo en el pasado.

  • Andrés dice:

    GtkTerm FTW!

  • Adán dice:

    ¿Qué hay de usar el wifi y transmitir el terminal telnet copiado en html5 y conectar el serial a eso? Entonces podrías tener Altair en cualquier sistema con Wifi.

    • Steve L dice:

      He hecho esas cosas con mis proyectos (por ejemplo, el emulador Alta8 basado en esp8266 en la-tecnologia.io), aunque los emuladores usan telnet "raw" o serial / USB serial. Funcionan bien con la versión gratuita de Attachmate para iOS en un teléfono. Mi código es bastante difícil y tosco, pero funciona.

  • steven13 dice:

    Es sorprendente la cantidad de personas que parecen sentirse ofendidas por la idea de que ciertas palabras y frases son problemáticas.

  • Kees dice:

    Buen proyecto y buena actualización también, eso lo hace aún más versátil, ¡gracias!

    Logré formatear los discos C y D. Y si cambio el .ino, puedo adjuntar una de las otras imágenes de disco incluidas como archivo de encabezado después de refractar el dispositivo. P.ej

    // # define DRIVE_B BDSC_dsk // B: solo lectura
    #define DRIVE_B games_dsk // B: solo lectura

    Luego puedo usar PIP para copiar archivos al disco C y D que parecen persistir.

    Pero no puedo entender cómo "montar" uno de los, como un archivo de encabezado, con imágenes de disco bajo CP / M, ¿hay alguna indicación?

    • Fabrizio Di Vittorio dice:

      Consulte la sección "Configuración de disco" en "Altair8800.ino". Tiene DRIVE_A, DRIVE_B, etc ... configurado.
      Simplemente configúrelo a la derecha de la definición que desea montar. Por ejemplo, si desea turbo pascal 3 en DISK_B, configure:
      #define DRIVE_B turbopascal3_dsk

      El valor "turbopascal3_dsk" proviene del archivo "turbopascal3_dsk.h". Al inspeccionar ese archivo, encontrará que hay una matriz llamada “turbopascal3_dsk” que es la imagen de ese disco.

      • Miguel dice:

        No puedo ejecutar esto. Turbospascal3_3_dsk probado para el disco c, pero dir c: informa un sector defectuoso. Además, si una tarjeta SD funciona, tampoco puedo arrancar. Malos errores sectoriales.

        • Fabrizio Di Vittorio dice:

          ¿La siguiente configuración funciona para usted?
          #define DRIVE_A cpm22_dsk
          #define DRIVE_B turbopascal3_dsk

          • Mike Jones dice:

            Si, esto funciona. Dejé C&D como se definió anteriormente ("drive_c.sk", etc.) pero obtengo los errores del sector defectuoso. El formato funciona escribiendo los 77 ciclos, pero luego falla la verificación.

            Gracias por la ayuda

  • Steven Clark dice:

    ¿Cómo se implementa VGA? Sé que hay chips de salida HDMI que contienen sincronización y reloj de 24 bits, por lo que si no participa en DAC en serie, es posible que pueda piratear una interfaz HDMI si la resolución es lo suficientemente alta para cualquier cosa reconocible. Eso podría solucionar uno de los problemas.

    • Fabrizio Di Vittorio dice:

      Las señales VGA son generadas por un dispositivo DMA (integrado en el ESP32). Hay un búfer de tramas en la RAM que el DMA lee continuamente y se envía a la salida. Por supuesto, hay un DAC para generar VGA analógico.
      La ESP32 (biblioteca fabgl) tiene un conjunto de primitivas para dibujar gráficos (líneas, círculos, texto, elfos, etc ... etc ... etc)

  • Hans Otten dice:

    Es una bonita emulación. Funciona de maravilla. Pero no puedo ejecutar Drive C o D, por lo que nadie escribe. Formateo probado, cree driveC.DSK en la SD, utilizo tanto Termianla-s-Development. Siempre los sectores defectuosos se equivocan en C y D. Enviar un archivo de disco (desde un emu en funcionamiento, disco de 330K) con Python transdisk.py, éxito en la transferencia, aún error de sector defectuoso. Entonces, ¿no hay instalación de escritura?

    • Hans Otten dice:

      De acuerdo, necesito formatear el disco C: y D: en CP / M. ¡Funciona ahora!

Alana Herrero
Alana Herrero

Deja una respuesta

Tu dirección de correo electrónico no será publicada.