CollapseOS

Heute habe ich Claude dazu gebracht, CollapseOS auf den CPC zu portieren, und zwar sowohl als DSK- als auch als M4-Board-Version…

Es ist zu 100 % textbasiert und verfügt über integrierte Assembler- und Forth-Compiler sowie Editoren…

Die Version nutzt weiterhin die CPC-Firmware

COLLAPS.ZIP (66.2 KB)

COLLAPS.DSK (190.3 KB)


Amstrad CPC

Collapse OS (Release 2021-04-21, Forth) auf dem Amstrad CPC 464 (mit DDI-1),
664 und 6128. Es bootet von Diskette (AMSDOS) oder von der SD-Karte eines M4-Boards
und speichert seine Blöcke in gewöhnlichen AMSDOS-Dateien, sodass derselbe Code auf beiden Systemen funktioniert.

Dateien

Alle Namen, die der CPC sieht, sind im 8.3-Format oder kürzer (AMSDOS und das M4-Board
unterstützen nur 8.3-Namen, einschließlich Ordner). Das Programm heißt COLLAPS.

make erzeugt:

  • os.bin: der reine Kernel, dafür gebaut, bei 0x0400 ausgeführt zu werden.
  • COLLAPS.BIN: dasselbe mit einem AMSDOS-Header.
  • COLLAPS.BAS: BASIC-Loader (ASCII). Er schreibt per POKE einen 41 Byte großen Boot-Stub
    (boot.fs) nach 0x9000 und ruft ihn per CALL auf. Der Stub lädt COLLAPS.BIN mit
    CAS IN OPEN/DIRECT nach 0x0400 und springt dorthin.
  • blkgroups/Bnnn.BLK: das blkfs, aufgeteilt in 8K große AMSDOS-Dateien. B208.BLK
    enthält die Blöcke 208–215. Leere Gruppen werden nicht geschrieben.
  • COLLAPS.DSK: 40-Spur AMSDOS DATA-Diskette, Extended-DSK-Container. Enthält
    den Loader, den Kernel und die auf einem CPC nützlichen Gruppen: 0–23 (Assembler),
    96–119 (Block-Editor, VE), 200–239 (xcomp, Core), 280–303 (Z80-Kernel-Quellcode)
    und 368–375 (CPC-Treiber). Etwa 35K bleiben frei.
  • COLLAPS.ZIP: alles für eine M4-SD-Karte im Root-Verzeichnis der ZIP-Datei:
    Loader, Kernel und alle nicht leeren Gruppen.

Ausführung

Diskette (oder Gotek/HxC mit COLLAPS.DSK):

RUN"COLLAPS

M4: Entpacke COLLAPS.ZIP in einen Ordner mit einem Namen von maximal 8 Zeichen
(z. B. COLLAPS) auf der SD-Karte, dann

|CD,"COLLAPS"
RUN"COLLAPS

Verwende nicht RUN"COLLAPS.BIN": Das Ausführen einer Binärdatei aus dem BASIC heraus setzt die
Firmware zurück. Die Hintergrund-ROMs (AMSDOS, M4) werden getrennt und Block-I/O
fällt auf Kassette zurück (verifiziert: „Press PLAY then any key:“). Der Loader
nutzt LOAD-artige Aufrufe, die sie aktiv halten.

Der Loader verweigert den Start, wenn HIMEM unter &9FFF liegt. Das passiert, wenn
andere ROMs zu viel Speicher reserviert haben, was die Stacks von Collapse OS überlappen würde.

Erste Schritte

Collapse-OS-Wörter holen ihre Argumente vom Stack, also vor dem Wort:

0 LIST          Block 0 auflisten (der Master-Index)
LIST            -> „stack underflow“: LIST benötigt eine Blocknummer
100 LIST        Quellcode des Block-Editors
110 LOAD  VE    lädt und startet den Visual Editor (q beendet ihn)
5 LOAD          lädt den Z80-Assembler
2 3 + .         gibt 5 aus

Design: Firmware bleibt resident

Wie das TRS-80-Rezept nutzt dieser Port die maschineneigene Firmware für I/O.
Er fasst den Interrupt-Modus oder -Vektor niemals an.

  • (emit) → TXT OUTPUT (0xbb5a), Bildschirmmodus 2 (80x25).
  • (key?) → KM READ CHAR (0xbb09). Zeichen >= 0x80 (Cursortasten,
    COPY, …) werden ignoriert. Der Break-Mechanismus von ESC ist deaktiviert.
  • AT-XY → TXT SET CURSOR (0xbb75). COLS LINES CELL! XYMODE sorgen dafür,
    dass der Visual Editor funktioniert (110 LOAD, dann VE).
  • BYE setzt die Maschine zurück.

Zusätzliche Wörter:

  • FW ( af bc de hl addr -- af bc de hl ) ruft jede beliebige Firmware-Routine auf. A
    ist das MSB von af, Carry ist Bit 0 des zurückgegebenen af. Beispiel: 0x0700 0 0 0 0xbb5a FW 2DROP 2DROP erzeugt einen Signalton.
  • FW0 ( addr -- ) ruft eine Routine ohne Argumente auf.
  • MODE ( n -- ) setzt den Bildschirmmodus (COLS bleibt 80; VE verlangt Modus 2).
  • CMOVE ( src dst u -- ) kopiert Speicher mittels LDIR.

Die Schattenregister-Regel

Der Interrupt-Handler der CPC-Firmware (0x0038: jp 0xb941) beginnt mit
di / ex af,af' / jr c,... / exx / ... out (c),c. Er hält sein Reentranz-Flag
in AF’ und den Gate-Array-Port in BC’. Code, der EXX oder
EX AF,AF' ausführt, während Interrupts aktiviert sind, lässt die Maschine beim nächsten
Interrupt abstürzen.

Der Z80-Kernel verwendet EXX, (FIND, *, /MOD, []=, CRC16) und EXAFAF',
(CARRY? und + - *). Block 370, der zwischen dem Assembler und
B280 geladen wird, definiert diese beiden Assembler-Wörter neu. EXX, tauscht DE mit einem RAM-Slot,
und EXAFAF', tauscht AF mit einem RAM-Slot. Der Kernel nutzt EXX ausschließlich,
um DE (IP) zu schützen, und EX AF,AF’, um das Carry zu sichern – das Verhalten ist also
identisch. Die Upstream-Blöcke bleiben unverändert.

Wenn du deinen eigenen Code auf dem CPC assemblierst (5 LOAD), verwende EXX, oder
EXAFAF', nicht, es sei denn, du lädst vorher dieselben Neudefinitionen:
0x9ba0 CONSTANT DRVMEM 370 LOAD.

Blöcke: AMSDOS-Gruppendateien

AMSDOS bietet keinen wahlfreien Zugriff (Random Access), daher werden Blöcke zu acht in 8K-Dateien zusammengefasst
und als Ganzes mit CAS IN/OUT DIRECT gelesen und geschrieben. Zwei Gruppen werden im RAM
per LRU zwischengespeichert, sodass verschachtelte LOADs, die zwischen einem übergeordneten Block und seinen
Kindblöcken springen, die Diskette nicht erneut lesen müssen. Das Schreiben eines Blocks schreibt seine Gruppendatei
neu (Write-Through). AMSDOS benennt die alte Datei dann in .BAK um, weshalb der Treiber
diese .BAK-Datei sofort mittels |ERA löscht (KL FIND COMMAND + KL FAR PCHL).
Andernfalls würde jede bearbeitete Gruppe 9K hinterlassen und die Diskette würde volllaufen.

Ein Block in einer Gruppe ohne Datei wird als leer gelesen. AMSDOS gibt dabei
Bnnn.BLK not found aus: Diese Meldung wird immer ausgegeben, da es kein Flag gibt,
um sie zu unterdrücken (im AMSDOS-ROM verifiziert: CEC4 jp nc,D50C -> ld a,6 -> print). Der erste Schreibvorgang erstellt die Datei.

Gruppendateien tragen einen AMSDOS-Header. Dateien ohne Header können nicht mit
CAS IN DIRECT gelesen werden (getestet), sodass jede 8K-Gruppe 9K auf der Diskette belegt.

Speicherbelegung

0x0000-0x03ff  Firmware-Restarts, BASIC (unbenutzt, sobald wir laufen)
0x0400         Kernel (~7K), dann BLK(-Puffer und das Wörterbuch
0x5300-0x5aff  CASBUF, 2K-Puffer von AMSDOS
0x5b00-0x9aff  GRPBUF, zwei 8K-Gruppen-Slots
0x9b00-0x9bff  SYSVARS, DRVMEM
0x9c00         RS (wächst nach oben)
0x9ffe         PS (wächst nach unten)
0xa000-        Firmware, AMSDOS, M4-Workspace

Das Wörterbuch umfasst etwa 12K: Der Z80-Assembler belegt ~2,9K, die Editoren
~2,5K. Puffer, die an die Firmware übergeben werden, sowie die Stacks müssen innerhalb
von 0x4000-0xbfff liegen. Während die Firmware läuft (einschließlich ihrer Interrupts), blendet
sie ROM über den restlichen Bereich ein.

Geschwindigkeit

Das Laden von Quellcode ist CPU-gebunden: Collapse OS schlägt jedes Wort mittels linearer
Suche im Wörterbuch nach. Auf einem CPC dauert ein Block 1–2 Sekunden, daher dauert 110 LOAD (VE)
etwa 70 Sekunden und 5 LOAD (Assembler) etwa eine Minute (in MAME gemessen).
Das Lesen oder Schreiben einer Gruppe dauert auf einer Diskette wenige Sekunden. Während
AMSDOS Sektoren überträgt, sind Interrupts deaktiviert und die Firmware fragt die Tastatur nicht
ab, sodass Tastendrücke während Diskettenaktivität verloren gehen können.

Verifiziert in MAME 0.264 (cpc6128 und cpc464 + DDI-1)

  • Booten von der DSK mit RUN"COLLAPS, Banner, Interpreter.
  • LIST aus Gruppendateien; eine fehlende Gruppe wird als leer gelesen.
  • COPY schreibt Blöcke: Neue Gruppendateien werden erstellt, bestehende
    überschrieben. Das Zurücklesen nach Cache-Verdrängung ist korrekt, und es wird
    keine .BAK hinterlassen (mit CAT überprüft).
  • 110 LOAD + VE: Visual Editor zeichnet und editiert, q beendet ihn.
  • 5 LOAD, LIVETGT, ein CODE-Wort auf dem CPC assembliert und ausgeführt
    (3 X7 . → 10) sowie FW ruft TXT OUTPUT auf.
  • VE-Editierzyklus: In einen leeren Block schreiben, q, FLUSH, Cache leeren,
    LIST zeigt den von der Diskette zurückgelesenen Text an.
  • Auf dem 464 + DDI-1: Booten, LIST, COPY.

Das M4-Board kann hier nicht emuliert werden. Es patcht dieselben AMSDOS/CAS-Vektoren,
die auch dieser Port verwendet, aber dieser Teil wurde bisher nicht auf echter M4-Hardware getestet.

5 „Gefällt mir“

Wahrscheinlich eine ziemlich blöde Frage, aber wozu ist das gut?

es ist eine komplette Cross-Development-Umgebung…

„Der Winter naht und Collapse OS soll den Schlag abfedern. Es ist ein Forth-Betriebssystem (warum Forth?) sowie eine Sammlung von Werkzeugen und Dokumentation mit einem einzigen Ziel: die Fähigkeit zu erhalten, Mikrocontroller auch während eines zivilisatorischen Zusammenbruchs zu programmieren. Es ist ausgelegt für:

  1. Den Betrieb auf minimalen und improvisierten Maschinen.
  2. Die Anbindung über improvisierte Schnittstellen (seriell, Tastatur, Display).
  3. Das Bearbeiten von Texten und binären Inhalten.
  4. Das Kompilieren von Assembler-Quellcode für eine breite Palette an MCUs und CPUs.
  5. Das Lesen von und Schreiben auf verschiedenste Speichergeräte.
  6. Das Assemblieren seiner selbst und das Bereitstellen auf einer anderen Maschine.“

ist hauptsächlich dafür gedacht, nach einem Zusammenbruch der Zivilisation ein System aus Schrottteilen aufzubauen… kann aber auch heute noch verwendet werden; es verfügt über Compiler, Treiber und Tools für Z80-, 6809- und 8086-CPUs sowie AVR-basierte MCUs

1 „Gefällt mir“

alles klar, danke für die Antwort