oggi ho fatto portare da Claude CollapseOS su CPC, sia in versione DSK che per M4 Board…
è al 100% testuale e include compilatori e editor integrati per assembly e Forth…
la versione usa ancora il firmware del CPC
COLLAPS.ZIP (66.2 KB)
COLLAPS.DSK (190.3 KB)
Amstrad CPC
Collapse OS (release 2021-04-21, Forth) su Amstrad CPC 464 (con DDI-1),
664 e 6128. Si avvia da floppy (AMSDOS) o dalla scheda SD di una scheda M4,
e mantiene i propri blocchi in normali file AMSDOS, quindi lo stesso codice funziona su entrambi.
File
Tutti i nomi visualizzati dal CPC sono in formato 8.3 o più corti (AMSDOS e la scheda M4
gestiscono solo nomi 8.3, cartelle incluse). Il programma si chiama COLLAPS.
make genera:
os.bin: il kernel raw, compilato per essere eseguito a 0x0400.COLLAPS.BIN: lo stesso file con intestazione AMSDOS.COLLAPS.BAS: loader BASIC (ASCII). Esegue il POKE di uno stub di avvio di 41 byte
(boot.fs) a 0x9000 e lo chiama con CALL. Lo stub caricaCOLLAPS.BINa
0x0400 tramite CAS IN OPEN/DIRECT e vi salta sopra.blkgroups/Bnnn.BLK: il blkfs suddiviso in file AMSDOS da 8K.B208.BLK
contiene i blocchi 208-215. I gruppi vuoti non vengono scritti.COLLAPS.DSK: disco AMSDOS DATA da 40 tracce, formato Extended DSK. Contiene
il loader, il kernel e i gruppi utili su CPC: 0-23 (assemblatori),
96-119 (editor di blocchi, VE), 200-239 (xcomp, core), 280-303 (sorgente
kernel Z80) e 368-375 (driver CPC). Rimangono circa 35K liberi.COLLAPS.ZIP: tutto il necessario per una scheda SD per M4, nella root del file zip:
loader, kernel e tutti i gruppi non vuoti.
Esecuzione
Floppy (oppure Gotek/HxC con COLLAPS.DSK):
RUN"COLLAPS
M4: estrai COLLAPS.ZIP in una cartella con un nome di massimo 8 caratteri
(ad es. COLLAPS) sulla scheda SD, poi digita
|CD,"COLLAPS"
RUN"COLLAPS
Non usare RUN"COLLAPS.BIN": l’avvio di un binario da BASIC resetta il
firmware. Le ROM in background (AMSDOS, M4) vengono disconnesse e l’I/O a blocchi
ricade sul registratore a cassette (verificato: «Press PLAY then any key:»). Il loader
utilizza chiamate in stile LOAD che le mantengono attive.
Il loader si rifiuta di avviarsi se HIMEM si trova al di sotto di &9FFF. Ciò si verifica quando
altre ROM hanno allocato troppa memoria, andando a sovrapporsi agli stack di Collapse OS.
Primi passi
Le parole di Collapse OS prendono i loro argomenti dallo stack, prima della parola stessa:
0 LIST elenca il blocco 0 (l'indice master)
LIST -> "stack underflow": LIST ha bisogno del numero di blocco
100 LIST sorgente dell'editor di blocchi
110 LOAD VE carica e avvia il Visual Editor (q per uscire)
5 LOAD carica l'assemblatore Z80
2 3 + . stampa 5
Design: il firmware resta residente
Come per la configurazione TRS-80, questo port utilizza il firmware integrato della macchina per l’I/O.
Non tocca mai la modalità o il vettore di interrupt.
(emit)→ TXT OUTPUT (0xbb5a), modalità schermo 2 (80x25).(key?)→ KM READ CHAR (0xbb09). I caratteri >= 0x80 (tasti cursore,
COPY, …) vengono ignorati. Il meccanismo di break di ESC viene disabilitato.AT-XY→ TXT SET CURSOR (0xbb75).COLSLINESCELL!XYMODEpermettono
il corretto funzionamento del Visual Editor (110 LOADpoiVE).BYEresetta la macchina.
Parole aggiuntive:
FW ( af bc de hl addr -- af bc de hl )chiama qualsiasi routine del firmware. A
è il MSB diaf, il carry è il bit 0 del registroafrestituito. Esempio:0x0700 0 0 0 0xbb5a FW 2DROP 2DROPemette un segnale acustico.FW0 ( addr -- )chiama una routine senza argomenti.MODE ( n -- )imposta la modalità schermo (COLS rimane a 80; VE richiede la modalità 2).CMOVE ( src dst u -- )copia memoria tramite LDIR.
La regola dei registri ombra
L’interrupt handler del firmware CPC (0x0038: jp 0xb941) inizia con
di / ex af,af' / jr c,... / exx / ... out (c),c. Mantiene il suo flag
di rientranza in AF’ e la porta del Gate Array in BC’. Il codice che esegue EXX o
EX AF,AF' con gli interrupt abilitati manda in crash la macchina al successivo
interrupt.
Il kernel Z80 usa EXX, (FIND, *, /MOD, []=, CRC16) e EXAFAF',
(CARRY? e + - *). Il blocco 370, caricato tra l’assemblatore e
B280, ridefinisce queste due parole di assemblaggio. EXX, scambia DE con un’area di RAM,
e EXAFAF', scambia AF con un’area di RAM. Il kernel usa EXX solo per
proteggere DE (IP) ed EX AF,AF’ per conservare il riporto (carry), quindi il comportamento è
identico. I blocchi a monte rimangono invariati.
Se assembli il tuo codice direttamente sul CPC (5 LOAD), non utilizzare EXX, o
EXAFAF', a meno che tu non abbia caricato prima le relative ridefinizioni:
0x9ba0 CONSTANT DRVMEM 370 LOAD.
Blocchi: file di gruppo AMSDOS
AMSDOS non supporta l’accesso casuale, quindi i blocchi sono raggruppati a gruppi di 8 in file da 8K,
letti e scritti per intero con CAS IN/OUT DIRECT. Due gruppi vengono memorizzati nella cache RAM
tramite LRU, così i LOAD annidati che saltano tra un blocco genitore e i relativi
figli non costringono a rileggere il disco. La scrittura di un blocco riscrive l’intero file di gruppo
(write-through). AMSDOS rinomina quindi il vecchio file in .BAK, e il driver
provvede subito a cancellare tale file .BAK tramite |ERA (KL FIND COMMAND + KL FAR PCHL).
In caso contrario, ogni gruppo modificato lascerebbe indietro 9K e il disco finirebbe per riempirsi.
Un blocco appartenente a un gruppo privo di file viene letto come vuoto. In questo caso
AMSDOS visualizza il messaggio Bnnn.BLK not found: viene mostrato sempre,
senza alcun flag per disabilitarlo (verificato nella ROM di AMSDOS: CEC4 jp nc,D50C -> ld a,6 -> print). La prima scrittura crea il file.
I file di gruppo contengono un’intestazione AMSDOS. I file senza intestazione non possono essere letti con
CAS IN DIRECT (testato), pertanto ogni gruppo da 8K occupa 9K su disco.
Mappa della memoria
0x0000-0x03ff restart del firmware, BASIC (inutilizzati una volta in esecuzione)
0x0400 kernel (~7K), poi buffer BLK( e il dizionario
0x5300-0x5aff CASBUF, buffer AMSDOS da 2K
0x5b00-0x9aff GRPBUF, due slot di gruppo da 8K
0x9b00-0x9bff SYSVARS, DRVMEM
0x9c00 RS (cresce verso l'alto)
0x9ffe PS (cresce verso il basso)
0xa000- firmware, AMSDOS, workspace M4
Il dizionario ha a disposizione circa 12K: l’assemblatore Z80 occupa ~2.9K, gli editor
~2.5K. I buffer passati al firmware e gli stack devono trovarsi nell’intervallo
0x4000-0xbfff. Mentre il firmware è in esecuzione (inclusi i suoi interrupt), esegue il paging
della ROM sul resto della memoria.
Velocità
Il caricamento del sorgente è limitato dalla CPU (CPU bound): Collapse OS cerca ogni parola eseguendo una
ricerca lineare nel dizionario. Su un CPC l’elaborazione di un blocco richiede 1-2 secondi, quindi 110 LOAD (VE)
impiega circa 70 secondi e 5 LOAD (assembler) circa un minuto (misurato in
MAME). La lettura o la scrittura di un gruppo richiede qualche secondo su floppy. Durante
il trasferimento dei settori da parte di AMSDOS, gli interrupt sono disattivati e il firmware non scansiona
la tastiera, quindi i tasti premuti durante l’attività del disco potrebbero non essere rilevati.
Verificato in MAME 0.264 (cpc6128 e cpc464 + DDI-1)
- Avvio da DSK con
RUN"COLLAPS, schermata iniziale (banner), interprete. LISTdai file di gruppo; un gruppo mancante viene letto come vuoto.COPYscrive i blocchi: vengono creati nuovi file di gruppo e riscritti quelli
esistenti. La rilettura a seguito dell’evizione dalla cache è corretta e non rimangono
file.BAKorfani (verificato con CAT).110 LOAD+VE: il Visual Editor esegue il rendering e consente la modifica,qper uscire.5 LOAD,LIVETGT, una parola CODE assemblata ed eseguita su CPC
(3 X7 .→ 10), eFWche chiama TXT OUTPUT.- Ciclo di modifica con VE: scrittura all’interno di un blocco vuoto,
q,FLUSH, svuotamento della cache,
LISTmostra il testo riletto correttamente da disco. - Su 464 + DDI-1: avvio,
LIST,COPY.
La scheda M4 non può essere emulata in questo contesto. Applica le patch agli stessi
vettori AMSDOS/CAS utilizzati da questo porting, ma tale componente non è stato testato su hardware M4 reale.
