CollapseOS

Aujourd’hui, j’ai demandé à Claude de porter CollapseOS sur CPC, avec à la fois les versions DSK et carte M4…

C’est 100 % en mode texte et ça intègre des compilateurs et des éditeurs Forth et assembleur…

Cette version utilise toujours le firmware du CPC

COLLAPS.ZIP (66.2 KB)

COLLAPS.DSK (190.3 KB)


Amstrad CPC

Collapse OS (version du 21/04/2021, Forth) sur Amstrad CPC 464 (avec DDI-1),
664 et 6128. Il démarre depuis une disquette (AMSDOS) ou depuis la carte SD d’une carte M4,
et conserve ses blocs dans des fichiers AMSDOS ordinaires, de sorte que le même code fonctionne sur les deux.

Fichiers

Tous les noms vus par le CPC sont au format 8.3 ou plus court (l’AMSDOS et la carte M4 ne gèrent
que les noms 8.3, dossiers compris). Le programme s’appelle COLLAPS.

make génère :

  • os.bin : le noyau brut, compilé pour tourner à 0x0400.
  • COLLAPS.BIN : le même, avec un en-tête AMSDOS.
  • COLLAPS.BAS : le chargeur BASIC (ASCII). Il applique un POKE d’un boot stub de 41 octets
    (boot.fs) à 0x9000 et l’appelle via CALL. Ce stub charge COLLAPS.BIN à
    0x0400 avec CAS IN OPEN/DIRECT puis saute dessus.
  • blkgroups/Bnnn.BLK : le blkfs découpé en fichiers AMSDOS de 8 Ko. B208.BLK
    contient les blocs 208 à 215. Les groupes vides ne sont pas écrits.
  • COLLAPS.DSK : disquette DATA AMSDOS 40 pistes, conteneur Extended DSK. Contient
    le chargeur, le noyau et les groupes utiles sur un CPC : 0-23 (assembleurs),
    96-119 (éditeur de blocs, VE), 200-239 (xcomp, core), 280-303 (sources du noyau
    Z80) et 368-375 (pilotes CPC). Il reste environ 35 Ko de libre.
  • COLLAPS.ZIP : l’ensemble pour carte SD M4, à la racine du zip :
    chargeur, noyau et tous les groupes non vides.

Exécution

Disquette (ou Gotek/HxC avec COLLAPS.DSK) :

RUN"COLLAPS

M4 : décompressez COLLAPS.ZIP dans un dossier au nom de 8 caractères ou moins
(ex. COLLAPS) sur la carte SD, puis

|CD,"COLLAPS"
RUN"COLLAPS

N’utilisez pas RUN"COLLAPS.BIN" : lancer un binaire depuis le BASIC réinitialise le
firmware. Les ROMs d’arrière-plan (AMSDOS, M4) sont déconnectées et les E/S de blocs
basculent sur la cassette (vérifié : « Press PLAY then any key: »). Le chargeur
utilise des appels de type LOAD qui les maintiennent actives.

Le chargeur refuse de démarrer si HIMEM est en dessous de &9FFF. Cela se produit lorsque
d’autres ROMs ont réservé trop de mémoire, ce qui empiéterait sur les piles de Collapse OS.

Premiers pas

Les mots Collapse OS prennent leurs arguments sur la pile, avant le mot :

0 LIST          affiche le bloc 0 (l'index maître)
LIST            -> "stack underflow": LIST a besoin d'un numéro de bloc
100 LIST        code source de l'éditeur de blocs
110 LOAD  VE    charge et lance le Visual Editor (q pour quitter)
5 LOAD          charge l'assembleur Z80
2 3 + .         affiche 5

Conception : le firmware reste résident

À l’instar de la méthode TRS-80, ce portage utilise le firmware de la machine pour les E/S.
Il ne touche jamais au mode d’interruption ni à son vecteur.

  • (emit) → TXT OUTPUT (0xbb5a), mode écran 2 (80x25).
  • (key?) → KM READ CHAR (0xbb09). Les caractères >= 0x80 (flèches de direction,
    COPY, …) sont ignorés. Le mécanisme d’interruption de la touche ESC est désactivé.
  • AT-XY → TXT SET CURSOR (0xbb75). COLS LINES CELL! XYMODE permettent
    de faire fonctionner le Visual Editor (110 LOAD puis VE).
  • BYE réinitialise la machine.

Mots supplémentaires :

  • FW ( af bc de hl addr -- af bc de hl ) appelle n’importe quelle routine du firmware. A
    est le poids fort (MSB) de af, la retenue (carry) est le bit 0 du af retourné. Exemple : 0x0700 0 0 0 0xbb5a FW 2DROP 2DROP émet un bip.
  • FW0 ( addr -- ) appelle une routine sans arguments.
  • MODE ( n -- ) définit le mode écran (COLS reste à 80 ; VE nécessite le mode 2).
  • CMOVE ( src dst u -- ) copie la mémoire à l’aide de LDIR.

La règle des registres miroirs (shadow registers)

Le gestionnaire d’interruptions du firmware du CPC (0x0038: jp 0xb941) commence par
di / ex af,af' / jr c,... / exx / ... out (c),c. Il conserve son drapeau
de réentrance dans AF’ et le port du Gate Array dans BC’. Tout code qui exécute EXX ou
EX AF,AF' pendant que les interruptions sont activées fait planter la machine à l’interruption
suivante.

Le noyau Z80 utilise EXX, (FIND, *, /MOD, []=, CRC16) et EXAFAF',
(CARRY? et + - *). Le bloc 370, chargé entre l’assembleur et
B280, redéfinit ces deux mots de l’assembleur. EXX, échange DE avec un emplacement en RAM,
et EXAFAF', échange AF avec un emplacement en RAM. Le noyau n’utilise EXX que pour
protéger DE (IP) et EX AF,AF’ pour sauvegarder la retenue, le comportement est donc
strictement identique. Les blocs amont restent inchangés.

Si vous assemblez votre propre code sur le CPC (5 LOAD), n’utilisez pas EXX, ni
EXAFAF', à moins de charger d’abord ces mêmes redéfinitions :
0x9ba0 CONSTANT DRVMEM 370 LOAD.

Blocs : fichiers de groupes AMSDOS

L’AMSDOS ne proposant pas d’accès direct (aléatoire), les blocs sont regroupés par 8 dans des fichiers de 8 Ko,
lus et écrits d’un seul bloc via CAS IN/OUT DIRECT. Deux groupes sont mis en cache dans la RAM
avec un algorithme LRU, de sorte que les LOAD imbriqués qui sautent entre un bloc parent et ses
enfants ne relisent pas la disquette. L’écriture d’un bloc réécrit son fichier de groupe
(write-through). L’AMSDOS renomme ensuite l’ancien fichier en .BAK, le pilote supprime donc
immédiatement ce .BAK avec |ERA (KL FIND COMMAND + KL FAR PCHL).
Sinon, chaque groupe édité laisserait 9 Ko derrière lui et la disquette finirait par se remplir.

Un bloc situé dans un groupe sans fichier est lu comme vide. L’AMSDOS affiche
Bnnn.BLK not found lorsque cela arrive : il affiche systématiquement ce message, sans
aucun paramètre pour le désactiver (vérifié dans la ROM de l’AMSDOS : CEC4 jp nc,D50C -> ld a,6 -> print). La première écriture crée le fichier.

Les fichiers de groupes comportent un en-tête AMSDOS. Les fichiers sans en-tête ne pouvant pas être lus avec
CAS IN DIRECT (testé), chaque groupe de 8 Ko occupe donc 9 Ko sur le disque.

Carte de la mémoire

0x0000-0x03ff  redémarrages du firmware, BASIC (inutilisé une fois le système lancé)
0x0400         noyau (~7 Ko), puis tampon BLK( et dictionnaire
0x5300-0x5aff  CASBUF, tampon AMSDOS de 2 Ko
0x5b00-0x9aff  GRPBUF, deux emplacements de groupes de 8 Ko
0x9b00-0x9bff  SYSVARS, DRVMEM
0x9c00         RS (croissance vers le haut)
0x9ffe         PS (croissance vers le bas)
0xa000-        espace de travail firmware, AMSDOS, M4

Le dictionnaire occupe environ 12 Ko : l’assembleur Z80 utilise ~2,9 Ko, les éditeurs
~2,5 Ko. Les tampons passés au firmware et les piles doivent se trouver entre
0x4000 et 0xbfff. Pendant que le firmware s’exécute (ses interruptions comprises), il commute la
ROM par pagination sur le reste de la mémoire.

Vitesse

Le chargement des sources dépend principalement du processeur (CPU-bound) : Collapse OS recherche chaque mot de manière linéaire
dans le dictionnaire. Sur CPC, un bloc prend 1 à 2 secondes, si bien que 110 LOAD (VE)
prend environ 70 secondes et 5 LOAD (assembleur) environ une minute (mesuré sous
MAME). La lecture ou l’écriture d’un groupe prend quelques secondes sur disquette. Pendant qu’AMSDOS
transfère les secteurs, les interruptions sont désactivées et le firmware ne scrute pas
le clavier ; les touches pressées pendant l’accès au disque peuvent donc être ignorées.

Vérifié sous MAME 0.264 (cpc6128 et cpc464 + DDI-1)

  • Démarrage depuis le DSK avec RUN"COLLAPS, écran d’accueil (banner), interpréteur.
  • LIST depuis les fichiers de groupes, un groupe manquant est lu comme vide.
  • COPY écrit les blocs : les nouveaux fichiers de groupes sont créés, les fichiers existants
    sont réécrits. La relecture après éviction du cache est correcte, et aucun .BAK
    n’est laissé (vérifié avec CAT).
  • 110 LOAD + VE : le Visual Editor s’affiche et permet l’édition, q permet de quitter.
  • 5 LOAD, LIVETGT, mot CODE assemblé et exécuté sur le CPC
    (3 X7 . → 10), et FW appelant TXT OUTPUT.
  • Cycle d’édition dans VE : saisie dans un bloc vide, q, FLUSH, éviction du cache,
    LIST affiche le texte relu depuis le disque.
  • Sur le 464 + DDI-1 : démarrage, LIST, COPY.

La carte M4 ne peut pas être émulée ici. Elle patche les mêmes vecteurs
AMSDOS/CAS que ceux utilisés par ce portage, mais cette partie n’a pas été testée sur le matériel M4 réel.

5 « J'aime »

Question très bête je suppose, mais ça sert à quoi ?

c’est un environnement de développement croisé complet…

« L’hiver approche et Collapse OS a pour but d’adoucir le choc. Il s’agit d’un système d’exploitation Forth (pourquoi Forth ?) et d’une collection d’outils et de documentations avec un objectif unique : préserver la capacité de programmer des microcontrôleurs en cas d’effondrement de la civilisation. Il est conçu pour :

  1. Tourner sur des machines minimales et improvisées.
  2. S’interfacer par des moyens de fortune (série, clavier, écran).
  3. Éditer du contenu texte et binaire.
  4. Compiler du code source assembleur pour un large éventail de MCU et de CPU.
  5. Lire et écrire sur un large éventail de périphériques de stockage.
  6. S’assembler lui-même et se déployer sur une autre machine. »

c’est principalement conçu pour fabriquer un système à partir de pièces de récupération après l’effondrement de la civilisation… mais on peut toujours l’utiliser aujourd’hui, il a des compilateurs, des pilotes et des outils pour les processeurs z80, 6809 et 8086, ainsi que pour les microcontrôleurs basés sur AVR

1 « J'aime »

ok merci pour la réponse