Mit einem ESP32 kann man problemlos einen Altair8800 emulieren.
Alternative Software für VT100-Terminal, VIC-20 u.v.a.m. (s. http://www.fabglib.org)
Ein toller Retro-Schrifteffekt, VGA-Auflösung 640x200x70Hz!
Man muss nicht mal selbst eine Platine zusammenlöten; für 12 Euro bekommt man ein passendes Board: „LILYGO TTGO VGA32 V1.2 Controller PS/2 Mouse And Keyboard Controller“
Leider finde ich nur wenig Infos über das Board selbst, z.B. einen Stromlaufplan oder Dokumentation zum Anschluss eines Lithium-Akkus :(
Charging current 500mA, Battery 3.7V lithium battery
http://www.lilygo.cn/prod_view.aspx?TypeId=50033&Id=1083 (VGA32 Version 1.4)
→ https://github.com/LilyGO/FabGL/blob/master/Schematic/vga32_v1.4.pdf
als Tastatur nutze ich ein Mini-PS2-Keyboard PERIBOARD-409 P von perixx.
Autor: Fabrizio Di Vittorio
https://www.youtube.com/user/fdivitto/videos
Videos of Fabrizio Di Vittorio in action:
http://www.fabglib.org/_altair8800_2_altair8800_8ino-example.html
https://github.com/fdivitto/FabGL
https://www.forum64.de/index.php?thread/93291-vc20-emulator-auf-vga-esp32/
Änderung auf serielle Ein- und Ausgabe statt VGA+Keyboard:
https://hackaday.com/2020/08/20/esp32-altair-emulator-gets-split-personality/
Transfer von disketten/Programmen: (Richard Deane doppelklicken/expandieren):
https://groups.google.com/g/comp.os.cpm/c/RV9U9msAd68
und: https://macgui.com/usenet/?group=93&id=15220
ein weiteres Projekt:
https://github.com/GmEsoft/Z80-MBC2_VGA32
über die Arduino-IDE.
s. Video „FabGL Tutorial - Installation“ von Fabrizio Di Vittorio sowie https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/
Beim Starten sucht die Software, ob eine SD-Karte vorhanden ist, und kopiert die Disketten A..D auf diese, sofern noch keine Dateien diskA.dsk..diskD.dsk auf dieser vorhandsind. Ob SD-Karte oder der interne Flash-Speicher (SPIFFS) genutzt wird, erkenn man am einfachsten beim Start in der „file system-Zeile: ist der Speicher klein (eta 665 KiB used, 621 KiB free), wird der Flash-Speicher genutzt, bei Zahlen im MB..GB-Bereich die CD-Karte.
Die Software erkennt automatisch, ob die SD-Karte auf dem ESP32-VGA32-Board genutzt wird (Pins 2+12), man muss nichts im Code ändern.
Als SD-Karte kommt eine FAT/FAT32-formatierte Karte zum Einsatz. Eine alte 2GB-Karte wurde nicht erkannt, eine 8GB-SDHC-Karte funktioniert problemlos.
Nach dem erstmaligen Starten muss man die Arbeits-Disketten C und D formatieren. Das erfolgt mit
A>FORMAT *** DISKETTE INITIALIZER *** DISK DRIVE (A-P)? C SECTORS PER TRACK: 32 SECTORS PER BLOCK: 16 BLOCKS PER DISK: 149 RESERVED TRACKS: 2 TRACKS PER DISK: 77 COMMAND: FULL WARNING: THIS COMMAND DESTROYS ALL DATA ON THE DISK TYPE C TO CONTINUE, A TO ABORT WITHOUT LOSS. PROCESSING TRACK# 76 INIT DONE - NOW VERIFYING DISKETTE PROCESSING TRACK# 76 NO ERRORS FOUND ON THIS DISKETTE COMMAND: STOP A>
Achtung: Alle Eingaben müssen im Programm FORMAT in Großbuchstaben erfolgen!
Mit F12 oder PAUSE gelangt man in das Konfigurationsmenü. Für eine deutsche Tastaturbelegung muss man mehrfach Taste K drücken.
Zum Übertragen von Images und einzelnen Dateien siehe:
Anmerkungen zu FabGL – Altair 8080 CP/M (von Richard Deane)
Die ESP32 VGA FabGL Altair 8080 CP/M-Emulation ist ein funktionsfähiger CP/M-Computer mit dem Äquivalent von 4 Diskettenlaufwerken (unter Verwendung von Altair 338-KB-dsk-Images), kompatibel mit Images vom Altairclone.com- Site.
Die Konsole ist standardmäßig dem physischen VGA-Monitor und der Tastatur zugewiesen, die an den TTGO ESP32 VGA angeschlossen sind, kann aber über den cp/m-Befehl STAT CON:=UC1: auf den USB-Port (seriell) umgeleitet werden.
Standardmäßig ist das System mit zwei vorab gefüllten Disk-Images auf A: und B: konfiguriert, die schreibgeschützt sind (ich gehe davon aus, dass dies an Einschränkungen durch den für die Speicherung verwendeten Speicher liegt – ich werde dies weiter untersuchen).
Beim Durchsuchen des Codes der altair8800-Skizze dachte ich, dass die Laufwerke C und D standardmäßig bestückt wären, aber das ist mir noch nicht gelungen. Diese Laufwerke verfügen über Lese-/Schreibzugriff und sind im SPIFFS-Speicher innerhalb von ESP32 vorhanden.
Ich habe zwei Möglichkeiten zum Bestücken von C- und D-Laufwerken identifiziert:
1. Verwenden Sie die von FabGL bereitgestellten Tools – das Python-„Transdisk“-Tool und die Menüoption auf dem cp/m-Emulator unter ESP32-VGA (aufgerufen durch Pause-Taste, dann S oder). R) zum Übertragen von 338 KB Altair-Disk-Images. Ich hatte Probleme, Python Serial unter Mac OSX und Windows zum Laufen zu bringen, aber unter Raspberry Pi 4 funktionierte es einwandfrei. Damit können Festplatten in beide Richtungen übertragen werden.
2. Verwenden Sie das Plug-in-Tool ESP32FS ( https://github.com/me-no-dev/arduino-esp32fs-plugin/releases), die eine Tools-Option in die Arduino IDE einfügt (ESP32 Sketch Data Upload). Platzieren Sie die erforderlichen Festplatten-(dsk)-Images in einem „Data“-Ordner unter dem Altair880-Ordner von FabGL-master und stellen Sie sicher, dass die Namen mit denen in der Altair880-Skizze (diskC.dsk und diskD.dsk) übereinstimmen. Dadurch werden die Dateien in den Emulator übertragen, ein Export zurück zum Host-PC ist jedoch nicht möglich.
Das mitgelieferte cpm22-System (Laufwerk A) unterstützt kein generisches Kermit, daher gehe ich davon aus, dass IOBYTE nicht implementiert ist. Ich konnte dies ersetzen, indem ich ein gleichnamiges Image cpm22_dsk.h erstellte, das jedoch von kermit.dsk von Altairclone.com abgeleitet war (Konvertierung vom dsk- in das h-Format mithilfe des Linux- oder OS X-Befehls xxd mit der Option -I und anschließendes Bearbeiten des Datentyps). , siehe Details unten. Der Befehl xxd with -i kann nicht vom h- in das Festplattenformat zurückkonvertieren und ist nach der Bereitstellung als Laufwerk A schreibgeschützt. Um eine Festplatte zu erstellen, müssen Sie sie daher möglicherweise mit Lese-/Schreibzugriff auf C oder D erstellen vor dem Export als DSK, der Konvertierung nach H und dem Neuaufbau über Arduino IDE als Laufwerk A.
Bisher habe ich nur CP/M 2.2 verwendet und CP/M 3 noch nicht ausprobiert.
Das Folgende basiert auf Informationen des Autors Fabrizio Di Vittorio.
Die Implementierung von Altair 8080 ist lediglich eine Demo der FabGL-Nutzung und kein Endprodukt.
Übertragen von Dateien:
USB-Link ist an SIO2 angeschlossen. Sie können eine Datei mit dem Befehl PCGET.COM auf der CP/M-Seite übertragen. Führen Sie einfach Folgendes aus:
PCGET-Dateiname B
„B“ zeigt an, dass SIO2 verwendet werden soll. Ersetzen Sie „Dateiname“ durch den Namen der Datei, die Sie erhalten. PCGET verwendet das XMODEM-Protokoll, sodass Sie jedes Tool verwenden können, das dieses Protokoll auf der PC-Seite unterstützt. Stellen Sie einfach sicher, dass die Geschwindigkeit 115200 beträgt. Der Autor hat ein Python-Tool (im Ordner „tools“) mit dem Namen „TRANSFILE.py“ erstellt. Starten Sie einfach:
PCGET MBASIC.COM B ....auf der Altair-Seite und... python transfile.py MBASIC.COM nach /dev/cu.SLAB_USBtoUART ...auf der PC-Seite....
(Ersetzen Sie die Parameter „ MBASIC.COM “ und „/dev/cu.SLAB_USBtoUART“ durch die Ihrer Konfiguration). Stellen Sie sicher, dass Sie PCGET.COM auf einem beschreibbaren Datenträger (C oder D) ausführen .
Sie können auch Disk-Images übertragen, verwenden Sie dazu „transdisk.py“. Drücken Sie auf der Altair-Seite die „Pause“-Taste und aktivieren Sie die Option „Get Disk from Serial“.
Erstellen von Festplatten:
Sie können ein „.h“-Disk-Image aus dem „dsk“-Format erstellen. Das DSK-Format muss 77 Spuren mal 32 Sektoren (8-Zoll-Standard) oder eine Minidisk mit 35 Spuren mal 16 Sektoren sein. Dies ist das gebräuchlichste Format, das Sie im Internet finden können.
Um einen DSK in einen Header zu konvertieren, können Sie den Linux-Befehl „xxd“ (oder MacOS und jetzt sogar mit der letzten Version von Windows 10) verwenden:
xxd -i myimage.dsk >myimage.h
Es wird myimage.h erstellt. Öffnen Sie es nun und ändern Sie die erste Zeile von…
unsigned char myimage[] = { ...to... const uint8_t myimage[] = {
Diese Änderung ist erforderlich, um den Header in Flash (nicht in SPIFFS) statt im RAM zu speichern.
In Altair8800.ino müssen Sie die gerade erstellte Datei einfügen und Folgendes hinzufügen:
#include "disks/....whereyouplacedthedisk.../myimage.h"
..und schließlich können Sie sie A oder B zuweisen mit (Zeile 106):
#define DRIVE_A myimage // A: read only
Eigentlich kann man jedem Laufwerk jedes Image zuweisen. Von Zeile 342 bis 349 werden tatsächlich Treiber mit Disk-Images verknüpft. Mit…
diskDrive.attachReadOnlyBuffer(0, DRIVE_A);
…Sie geben eine Header-Datei an (einen im Code gespeicherten Konstantenpuffer). Natürlich können Sie DRIVE_A direkt durch „myimage“ ersetzen, das Sie gerade erstellt haben. Mit…
diskDrive.attachFile(2, DRIVE_C);
…wobei DRIVE_C nur ein Dateiname in SPIFFS ist, geben Sie ein Festplatten-Image mit Lese-/Schreibzugriff an. Es muss vor der Verwendung in CP/M formatiert werden.
2022: Die aktuelle Version der kleinen Platine bringt unter anderem gleich einen Mini-SD-Kartenslot mit. Die Software von fabgl unterstützt diese und speichert die Diskettenimages auf SD, wenn beim Start eine SD-Karte gefunden wird!
mit SD-Card und Audio
Update information: Add audio output interface 3.5mm interface, and speaker output JST 2.0 PH 2-Pin interface |
Hardware | Specifications |
Chipset | TTGO Micro32 |
FLASH | QSPI flash 4MB / PSRAM 8MB |
SRAM | 520 kB SRAM |
Button | Reset, IO36 |
Extended function | VGA, PS/2 |
USB to TTL | CH9102F |
Modular interface | UART, SPI, SDIO, I2C, LED PWM, TV PWM, I2S, IRGPIO, capacitor touch sensor, ADC, DACLNA pre-amplifier |
On-board clock | 40MHz crystal oscillator |
Working voltage | 2.7V-3.6V |
Working current | about 30mA |
Sleep current | 230uA |
Working temperature range | -40? ~ +85? |
Size & Weight | without VGA: 60.99mm*32.06mm*16.79mm, with VGA: 66.70mm*32.06mm*16.79mm21.25g |
Power Supply | Specifications |
Power Supply | USB 5V/1A |
Charging current | 500mA |
Battery | 3.7V lithium battery |
Wi-Fi | Description |
Standard | FCC/CE-RED/IC/TELEC/KCC/SRRC/NCC |
Protocol | 802.11 b/g/n(802.11n, speed up to150Mbps)A-MPDU and A-MSDU polymerization, support 0.4µS Protection interval |