CP/M su Commodore 128: terminali e sequenze di escape

di Francesco Sblendorio

Se avete già letto la prima puntata allora avete già fatto qualche esperimento con il vostro Commodore 128 in modalità CP/M. Questa volta ci occuperemo della gestione dello schermo e del modo in cui il sistema operativo gestisce l’output verso l’utente.

CP/M nasce negli anni ’70, progettato per funzionare per macchine diverse tra loro ma che condividano la CPU Intel 8080 (alternativamente il compatibile Zilog Z80). Erano macchine di solito vendute anche senza tastiera e monitor ma con connettori seriali attraverso cui era possibile collegare dei terminali. Da questo punto di vista era simile a UNIX: l’input/output è uno stream sequenziale di caratteri da e verso il terminale. Ciò significa che per avere la possibilità di controllare l’esatta posizione dei messaggi sullo schermo il terminale deve prevedere determinate “sequenze di controllo” (rispetto a cui il sistema operativo è agnostico) per posizionare il cursore, cancellare lo schermo, dare un certo stile o colore ai caratteri, ecc.

Queste sequenze di controllo variano ovviamente in base al terminale utilizzato (quindi non dal sistema operativo) e i vari software devono conoscere come rendere determinati comandi di gestione schermo su uno specifico terminale. A meno che si tratti di software relativamente “semplici” dal punto di vista dell’interfaccia utente tali da non necessitare di altro che visualizzare caratteri e “mandare a capo”. Uno di questi casi è il Microsoft BASIC (detto anche MBASIC, dal nome del comando da lanciare), che non prevede nessun tipo particolare di terminale ma proprio per questo ci permetterà di fare un po’ di esperimenti specifici per il nostro Commodore 128.

Per iniziare, potete scaricare una versione patchata di MBASIC da questo link, che corregge un bug che impedisce di usare correttamente il tasto “backspace”. Una volta scaricato e lanciato, ne avrete il prompt come da immagine di copertina di questo articolo. Iniziate lanciando questo comando (rispettando correttamente le maiuscole e le minuscole):

PRINT CHR$(27)"G4Hello world!"CHR$(27)"G0"

Apparirà la scritta “Hello world!” in campo inverso. Cosa è successo? Abbiamo stampato, prima e dopo “Hello world!”, due sequenze di controllo terminale, una per impostare il campo inverso, e l’altra per tornare a una visualizzazione “normale”.

Ma… quale terminale, se il Commodore 128 non ha un terminale? La risposta è semplice: i progettisti del BIOS (la parte di sistema operativo dipendente dalla macchina) del CP/M per Commodore 128 hanno scelto un modello di terminale di riferimento, che è il modello “Lear Siegler ADM-31“, e ne hanno implementato i comandi emulando il comportamento di questo modello attraverso i chip video del C128.

Di seguito le principali sequenze di escape disponibili sul nostro Commodore 128. Tenete presente che sono da inviare senza spazi intermedi e che CHR$(27) è il comando BASIC per indicare il carattere di “ESC/ESCAPE” (codice ASCII 27).

SequenzaSignificatoStandard di riferimento
ESC ESC ESC CHR$(32+x)Imposta colore carattere=xSpecifico del Commodore 128
ESC = CHR$(32+x) CHR$(32+y)Muove cursore a coord. (x,y)ADM-3A
CHR$(30)Cursore a “HOME” (0,0)ADM-3A
CHR$(26)Cancella schermo + HOMEADM-3A
CHR$(7)Suono “ring”ADM-3A
ESC G 4Reverse ONADM-31
ESC G 3Sottolineato ONADM-31
ESC G 2Lampeggio ONADM-31
ESC G 1Alternate charset ONADM-31 (charset specifico del C128)
ESC G 0Azzera tutte le precedentiADM-31
ESC )Half intensity ONADM-31
ESC (Half intensity OFFADM-31
ESC EInsert lineADM-31
ESC QInsert characterADM-31
ESC RDelete lineADM-31
ESC WDelete characterADM-31
ESC TClear to end of lineADM-31
ESC YClear to end of screenADM-31

Link esterni:


Commenti

Post popolari in questo blog

Commodore 16: CPU 7501/8501 FPGA Replacement

Zork, CP/M, le adventure Infocom e la personalizzazione del terminale

Turbo Pascal porting: dal 7.0 (DOS) al 3.01 (CP/M) – parte 1

YAZE: un ottimo emulatore Z80 + CP/M

APPENDere in Turbo Pascal per CP/M

Un MIST-ico Amiga

CP/M su Commodore 128: non solo “DIR”

Modi di andare a capo

MIST how-to: Amiga con Kickstart 1.3 e supporto Hard Disk IDE