| Sebbene il dettaglio delle istruzioni utilizzate sia
comprensibile solo dopo aver studiato con pazienza le più volte citate 5
pagine di
KEYwait
posso farti notare alcune particolarità:
| la discriminazione tra i tasti
Funzione
e i tasti
Funzionali avviene con riferimento ad
AH,
CMP AH,....;
la cosa è chiara se si ricorda che il loro codice Ascii
è nullo (cioè per essi AL
è uguale a
00H) per cui non rimane che affidarci al
codice di scansione (comunque disponibile in
AH) |
| per il riconoscimento dei tasti
di servizio ho fatto ricorso a etichette,
piccole parole onomatopeiche,
definite all'inizio del programma con l'aiuto della
pseudooperazione
EQU, chiamate a
sostituire i
numeri dei rispettivi
codici (ascii o
di scansione), difficili da ricordare (l'elenco completo è scaricabile qui) |
| quando un tasto viene riconosciuto si provvede al suo
servizio saltando ad una
zona di codice ad esso dedicata (per esempio
JMP
Serv_F1 o JMP
Serv_Up...); è assolutamente
importante ricordare che questi codici di
Servizio (documentati tra qualche pagina) non sono procedure, cioè non devono
terminare con RET
ma, a loro volta, devono rientrare
con un salto
all'inizio del loop d'attesa, cioè JMP
Rientra |
| una cosa altrettanto importante
(pena errori del tipo error A2053: Jump out of range by nnn byte(s))
è quella di imparare a rovesciare la logica;
si tratta di un concetto semplice ed efficace per gestire i
salti condizionati (come
JE): se il punto da raggiungere è troppo lontano il
compilatore si infastidisce e segnala Jump out of range
(salto fuori range...
non ce la faccio), aggiungendo di quanti bytes siamo oltre il possibile (..by
27 bytes). Se per esempio
JE
Serv_F1 non ce la fa, basta
rovesciare la logica, cioè saltare
subito sotto se
NE (JNE
KeyFun0) saltando a Serv_F1
in modo incondizionato, JMP
Serv_F1 (poichè i servizi di tutti i tasti sono molto
distanti dal punto che ne rileva la necessità, questa tecnica è applicata
per ciascun di essi) |
|