Elenco blog personale

venerdì 11 maggio 2018

Configurare la tastiera con SETKEYS (Amstrad CPC 6128 - CP/M Plus)


In questo articolo descriverò il comando SETKEYS.COM, presente nel primo disco di sistema del CP/M Plus fornito con il CPC 6128.

Il comando serve a riconfigurare la tastiera in base alle informazioni contenute nel file di testo specificato come primo ed unico parametro:

SETKEYS CONF.TXT

SETKEYS è necessario perché il CP/M, ed in particolare il BIOS scritto per il CPC, non assegna una funzione specifica ad alcuni tasti, come le frecce, i tasti funzione, etc, per cui occorre assegnare a questi un codice di controllo (per esempio come CTRL-A che sposta a sinistra il cursore).
SETKEYS legge il file di configurazione ed installa un RSX (estensione residente al BDOS) che intercetta le chiamate di sistema dedicate all'input dalla console.


La sintassi del file di configurazione

Il file di configurazione è diviso in righe ed ogni riga definisce una diversa combinazione di tasti ed il codice che questa genera quando viene eseguita.
Una riga è composta da due parti, la chiave ed il valore associato. La chiave rappresenta il codice (decimale) del tasto premuto e se questo è stato premuto in combinazione con lo SHIFT o il CTRL. Il valore associato viene specificato tra doppi apici e può indicare un singolo carattere, un codice di controllo o un token. Alla fine può essere aggiunto un commento.

Le successive due figure mostrano il layout della tastiera e i codici decimali dei relativi tasti:




Lo SHIFT è specificato con la lettera S, il CTRL con la C, mente la N oppure la mancanza di S o C indica nessuno SHIFT o CTRL premuto.
Per esempio 69 oppure 69 N S C indica il solo tasto A, mentre 69 S, indica SHIFT+A.
Da notare che la N disabilita sia S che C, per cui queste sequenze sono equivalenti: 69, 69 N, 69 N S, 69 N S C.
La presenza di più di uno shift, per esempio SHIFT e CTRL (S C), non indica la necessità di premere entrambi i tasti, ma solamente che la definizione vale sia che venga premuto solo SHIFT sia che venga premuto solo CTRL.

Il valore da generare può essere specificato direttamente (cioè tutti i caratteri ASCII da 0x20 a 0xFF), ad eccezione del ↑ (il tasto del &) che ha un significato speciale e dei doppi apici che vanno preceduti da un ↑ (esempio: ↑").
Per specificare ↑ ne occorrono due (↑↑).
La combinazione di ↑ con un carattere produce CTRL-carattere. Per esempio ↑H produce CTRL-H.
La sequenza ↑'#xx', dove xx è un codice esadecimale, produce il carattere con il codice ASCII specificato. Per esempio ↑'#A' produce un ritorno a capo. Se il # non è presente allora il codice è decimale anziché esadecimale, così ↑'10' equivale a ↑'#A'.
Infine la sequenza ↑'codice', produce il codice ASCII di controllo relativo. Per esempio ↑'ESC' produce ESC. I codici di controllo sono i seguenti:
NUL, SOH, STX, EXT, EOT, ENQ, ACK, BEL, BS, HT, LF, VT, FF, CR, SO, SI, DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM, SUB, ESC, FS, GS, RS, US, SP, DEL, XON e XOFF.
Così ↑'10' equivale a ↑'#A' che equivale a ↑'LF'.

Per esempio si può utilizzare la seguente riga per spostare il cursore a sinistra premendo il tasto freccia relativo:

8 "↑A"

La definizione specifica che premendo il tasto 8 (freccia a sinistra, senza SHIFT e senza CTRL) venga generato un CTRL-A, che nella console del CP/M serve proprio a spostare il cursore a sinistra di una posizione.

E' possibile anche "espandere" i "token" in sequenze di caratteri. La combinazione da specificare nella riga è: E #xx "stringa"
xx è il codice esadecimale del token. Ci sono alcuni token che sono già stati assegnati ai tasti funzione, all'ENTER, al punto e al CTRL+ENTER del tastierino numerico:
0x80 = tasto funzione F0
0x81 = tasto funzione F1
0x82 = tasto funzione F2
0x83 = tasto funzione F3
0x84 = tasto funzione F4
0x85 = tasto funzione F5
0x86 = tasto funzione F6
0x87 = tasto funzione F7
0x88 = tasto funzione F8
0x89 = tasto funzione F9
0x8A = punto nel tastierino numerico
0x8B = ENTER a destra dello spazio
0x8C = CTRL + ENTER a destra dello spazio

I token non assegnati invece vanno da 0x8D a 0x9F.

Per esempio se si vuol visualizzare (espandere) "Ciao Mondo!" ogni volta che si preme il tasto funzione F0 occorre aggiungere questa riga:

E #80 "Ciao Mondo!"

Un token può essere generato da una definizione precedente. Per esempio le seguenti due definizioni visualizzano "Ciao Mondo!" quando si preme CTRL-A. La prima genera il token 0x8D alla pressione di CTRL-A e la seconda genera "Ciao Mondo!" alla presenza del token 0x8D:

69 C "↑'#8D'"         genera 0x8D quando si preme CTRL-A
E #8D "Ciao Mondo!"   espande 0x8D in "Ciao Mondo!"

All'interno della stringa da espandere ci possono essere dei caratteri di controllo che saranno preceduti sempre da ↑. Per esempio la riga seguente espande il tasto funzione F0 con il comando dir ed invio (CTRL-M):

E #80 "dir↑M"


File di configurazione predefinito keys.cpp

Nel primo disco di sistema del CPC 6128 sono presenti due file di configurazione predefiniti. Il primo ha il nome keys.ccp ed è anche quello caricato di default dal profile.sub (profile.eng) perché configura la tastiera nel modo ottimale per la linea di comando (CCP). Questo è il suo contenuto originale:

 0 N S C "↑'#1F'" CCP cursor up
 1 N S   "↑F"     cursor right
 1 C     "↑'#9F'"
 2 N S C "'#1E'" cursor down
 8 N S   "↑A"     cursor left
 8 C     "'#9E'"
 9 N S C "W"     copy
16 N S   "↑G"     clr
16 C     "↑K"
18 C     "↑E"     enter 
66 N S   "↑'27'"  esc
66 C     "↑C"
79 C     "↑X"     del
E #8C    "↑R"     ctrl enter
E #9E    "↑F↑B"
E #9F    "↑F↑B↑B"

Date le definizioni del file la tastiera viene configurata in questo modo:

Freccia Su (0 N S C)
Genera il carattere di controllo 0x1F (US - ASCII Unit Separator). Forse è utilizzato da qualche applicazione o estensione ma in realtà non ha alcun utilizzo nella linea di comando.

Freccia Destra (1 N S )
Genera CTRL-F che muove il cursore di un carattere a destra.

CTRL + Freccia Destra (1 C)
Genera il token 0x9F, che a sua volta genera la sequenza CTRL-F CTRL-B CTRL-B, cioè muovi il cursore a destra, muovi il cursore all'inizio della riga, muovi il cursore alla fine della riga. Come risultato finale muove il cursore alla fine della riga.

Freccia Giu (2 N S C)
Genera il carattere di controllo 0x1E (RS - ASCII Record Separator). Come per Freccia SU, non sembra avere utilità per la linea di comando.

Freccia Sinistra (8 N S)
Genera CTRL-A che muove il cursore di un carattere a sinistra.

CTRL + Freccia Sinistra (8 C)
Genera il token 0x9E, che a sua volta genera la sequenza CTRL-F CTRL-B, cioè muovi il cursore a destra e muovi il cursore all'inizio della riga. Come risultato finale muove il cursore all'inizio della riga.

COPY (9 N S C)
Genera CTRL-W che richiama l'ultimo comando inserito.

CLR (16 N S)
Genera CTRL-G  che elimina il carattere dov'è posizionato il cursore.

CTRL + CLR (16 C)
Genera CTRL-K che elimina tutti i caratteri compresi tra la posizione del cursore e la fine della riga.

CTRL + RETURN (18 C)
Genera CTRL-E che manda a capo il cursore ma non invia il comando al CP/M.

ESC (66 N S)
Genera il codice di controllo 0x1B (ESC - escape).

CTRL + ESC (66 C)
Genera CTRL-C, cioè un warm start.

CTRL + DEL (79 C)
Genera CTRL-X che elimina tutti i caratteri alla sinistra del cursore, mantenendo tutti quelli compresi tra la posizione del cursore e la fine della riga.

CTRL + ENTER (E #8C)
Genera CTRL-R che va a capo e riscrive la riga corrente fino a dov'era il cursore.


File di configurazione predefinito keys.wp

L'altro file di configurazione presente nel primo disco ha il nome keys.wp ed ha una configurazione ottimizzato per programmi di word processing, come WordStar o Tasword. Questo è il suo contenuto originale:

 0 N     "E"     cursor up
 0 S     "R"
 0 C     "'#9E'"
 1 N     "D"     cursor right
 1 S     "F"
 1 C     "'#9C'"
 2 N     "X"     cursor down
 2 S     "C"
 2 C     "'#9F'"
 8 N S   "S"     cursor left
 8 S     "A"
 8 C     "'#9D'"
16 N     "G"     clr
16 S     "T"
16 C     "'#9A'"
66 N S C "'27'"  esc
68 C     "V"     tab
79 C     "'#9B'"
E #9A    "QY"
E #9B    "Q'127'"
E #9C    "QD"
E #9D    "QS"
E #9E    "QE"
E #9F    "QX"

Date le definizioni del file la tastiera viene configurata in questo modo:

Freccia SU (0 N)
Genera CTRL-E che in Wordstar muove il cursore di una riga in alto.

SHIFT + Freccia Su (0 S)
Genera CTRL-R che in Wordstar muove di una pagina verso l'alto.

CTRL + Freccia Su (0 C)
Genera il token 0x9E che a sua volta genera la sequenza CTRL-Q E, che in Wordsar muove il cursore nella posizione più in alto dello schermo.

Freccia Destra (1 N)
Genera CTRL-D che in Wordstar muove il cursore di un carattere a destra.

SHIFT + Freccia Destra (1 S)
Genera CTRL-F che in Wordwar muove il cursore di una parola a destra.

CTRL + Freccia Destra (1 C)
Genera il token 0x9C che a sua volta genera la sequenza CTRL-Q D, che in Wordstar muove il cursore alla fine della riga.

Freccia Giu (2 N)
Genera CTRL-X che in Wordstar muove il cursore di una riga in basso.

SHIFT + Freccia Giu (2 S)
Genera CTRL-C che in Wordstar muove di una pagina verso il basso.

CTRL + Freccia Giu (2 C)
Genera il token 0x9F che a sua volta genera la sequenza CTRL-Q X, che in Wordstar muove il cursore nella posizione più in basso dello schermo.

Freccia Sinistra (8 N S)
Genera CTRL-S che in Wordstar muove il cursore di un carattere a sinistra.

SHIFT + Freccia Sinistra (8 S)
Genera CTRL-A che in Wordstar muove il cursore di una parola a sinistra.

CTRL + Freccia Sinistra (8 C)
Genera il token 0x9D che a sua volta genera la sequenza CTRL-Q S, che in Wordstar muove il cursore all'inizio della riga.

CLR (16 N)
Genera CTRL-G che in Wordstar (ma anche in CCP) elimina il carattere dov'è posizionato il cursore.

SHIFT + CLR (16 S)
Genera CTRL-T che in Wordstar elimina la parola a destra del cursore.

CTRL + CLR (16 C)
Genera il token 0x9A che a sua volta genera la sequenza CTRL-Q Y, che in Wordstar elimina tutti i caratteri alla destra del cursore.

ESC (66 N S C)
Genera il codice di controllo 0x1B (ESC - escape).

CTRL + TAB (68 C)
Genera CTRL-V che in Wordstar abilita o disabilita la modalità "inserimento".

CTRL + DEL (79 C)
Genera il token 0x9B che a sua volta genera la sequenza CTRL-Q DEL, che in Wordstar elimina tutti i caratteri alla sinistra del cursore.


File di configurazione predefinito keys.drl

L'ultimo file delle definizioni presente nei dischi di sistema si trova nel terzo disco ed è denominato keys.drl, proprio perché specifico per l'editor del linguaggio di programmazione DR Logo. Questo è il contenuto originale del file:

 0 N S   "↑P" DR LOGO cursor up
 0 C     "↑U" 
 1 N S   "↑F" cursor right 
 1 C     "↑E" 
 2 N S   "↑N" cursor down
 2 C     "↑V"
 8 N S   "↑B" cursor left
 8 C     "↑A"
 9 N S C "↑C" copy
16 N S C "↑D" clr
66 N S C "↑G" escape
79 N S C "↑H" del

La tastiera viene configurata in questo modo:

Freccia Su (0 N S)
Genera CTRL-P che in DR Logo muove il cursore verso l'alto.

CTRL + Freccia Su (0 C)
Genera CTRL-U che in Dr Logo non ha alcun effetto!

Freccia Destra (1 N S)
Genera CTRL-F che in Dr Logo muove il cursore a destra.

CTRL + Freccia Destra (1 C)
Genera CTRL-E che in Dr Logo muove il cursore alla fine della riga.

Freccia Giu (2 N S)
Genera CTRL-N che in Dr Logo muove il cursore verso il basso.

CTRL + Freccia Giu (2 C)
Genera CTRL-V che in Dr Logo visualizza la pagina successiva.

Freccia Sinistra (8 N S)
Genera CTRL-B che in Dr Logo muove il cursore a sinistra.

CTRL + Freccia Sinistra (8 C)
Genera CTRL-A che in Dr Logo muove il cursore all'inizio della riga.

COPY (9 N S C)
Genera CTRL-C che in Dr Logo esce dall'editor ed applica il suo contenuto.

CLR (16 N S C)
Genera CTRL-D che in Dr Logo cancella il carattere dov'è posizionato il cursore.

ESC (66 N S C)
Genera CTRL-G che in Dr Logo esce dall'editor ma annulla il suo contenuto.

DEL (79 N S C)
Genera CTRL-H che in Dr Logo elimina il carattere alla sinistra del cursore.



4 commenti:

  1. I pay a visit daily a few web pages and blogs
    to read articles or reviews, except this web site
    gives feature based posts.

    RispondiElimina
  2. I have been browsing online more than 2 hours today, yet I never found any interesting article like yours.
    It's pretty worth enough for me. Personally, if all webmasters and bloggers made good content as you did, the net will be
    a lot more useful than ever before.

    RispondiElimina
  3. This site definitely has all of the information and facts I wanted concerning this
    subject and didn't know who to ask.

    RispondiElimina
  4. I could not refrain from commenting. Exceptionally well written!

    RispondiElimina