INTERFACCIA PER TASTIERA PS/2
di Pino Giaquinto
(articolo tratto da www.z80cpu.eu)
La tastiera del computer Z80 pubblicata sul fascicolo nr.72 di Nuova Elettronica è stata progettata e realizzata basandosi su quelle che sono le funzionalità offerte dal chip KR-2376 prodotto da SMC Microsystems Corporation.
Esclusi i tasti SHIFT, CONTROL, BREAK e SHIFT-LOCK che vengono gestiti separatamente, tutti gli altri tasti (che da ora in poi chiameremo per comodità ‘alfanumerici’) sono disposti su una matrice di 6 righe ed 11 colonne, corrispondenti rispettivamente ai pin X2-X7 e Y0-Y10 del KR-2376 (vedi datasheet).
Nel momento in cui viene pigiato un alfanumerico il KR-2376 ne identifica la posizione nella matrice ed in funzione anche dello stato dei tasti SHIFT e CONTROL determina il codice da inviare in output verso la scheda video.
In pratica questo chip restituisce in modalità ‘parallela’ (quindi su 8 linee, corrispondenti ai pin B1-B8 come da datasheet) il codice ASCII (complementato) corrispondente al tasto o alla combinazione di tasti pigiati, attivando inoltre una linea Strobe dopo circa 1.5ms (il tempo ritenuto necessario a rendere ‘stabile’ lo stato logico delle 8 linee e determinato dai valori di R4 e C4 come visibile nello schema elettrico a pag.48 della rivista numero 72) e che rimane attiva fin quando il tasto che ha determinato l’evento non viene rilasciato. Ciò comunica quindi al sistema la disponibilità sull’output della tastiera di un codice ASCII ‘valido’ che il software in uso interpreterà secondo le sue particolari esigenze.
Utilizzando una piccola interfaccia, realizzata utilizzando un PIC-16F628A (economicissimo microcontrollore a 8 bit della Microchip Tecnology), sono riuscito a interfacciare il mio Z80NE con una comune tastiera PS/2 risolvendo l’eterno problema della mancanza di una tastiera ‘originale’. [Ma anche di una più comoda e "ricca". ndr]
In sostanza il mio firmware, realizzato utilizzando MPLAB IDE e HI-TECH C, ‘legge’ lo scan-code generato dalla tastiera secondo quello che è il protocollo PS/2, determina a quale tasto o combinazione di tasti corrisponde tenendo conto dello stato dei tasti Shift, Alt e Ctrl, infine tramite delle tabelle opportunamente implementate (che tengono conto anche del layout della tastiera… ma di questo parleremo più avanti) lo converte nel corrispondente codice ASCII (complementato), lo trasmette alla scheda video ed attiva dopo circa 1,5ms la linea Strobe simulando in output il comportamento del KR-2376.
Le tabelle utilizzate per la conversione scan-code PS/2 -> ASCII sono in tutto 3, anche se ognuna di esse può essere immaginata come suddivisa ulteriormente in 3 ‘sotto-tabelle’… una per ognuno dei 3 layout che ho previsto e che sono: IT per la tastiera italiana, US per quella americana e GB per quella inglese.
La scelta del layout viene eseguita pigiando la combinazione di tasti L-Alt + F1 (tasto Alt sinistro + tasto funzione F1): i tre led del ‘pannello’ della tastiera lampeggeranno una sola volta se il layout corrente è IT, due volte per quello US e tre volte per GB. Ad ogni successiva pressione dei suddetti tasti il layout cambierà passando in sequenza da IT a US, poi da US a GB, poi di nuovo IT… e così via.
Ovviamente se il sistema verrà spento e riacceso il layout tornerà ad essere quello di default, ma ho previsto anche la possibilità di cambiarlo pigiando la combinazione di tasti Ctrl + L-Alt + F10. I tre led del pannello lampeggeranno 5 volte per segnalarvi l’avvenuta modifica nel PIC ed alla successiva riaccensione del sistema il layout predefinito sarà sempre quello da voi ‘impostato’.
Siccome seguo da tempo e con grande entusiasmo il progetto del mio carissimo amico Piergiorgio Betti (fantastico: una scheda multifunzione che vi permetterà di fare tante cose interessanti con il vostro Z80NE… ma preferisco sia lui a spiegarvi per bene questa cosa) [grazie Pino. ndr], ci sono delle scelte che sono state determinate dal fatto che ormai io e lui utilizziamo lo Z80NE solo ed esclusivamente con il CP/M 3 (con BIOS da lui opportunamente modificato e ricompilato per adeguarlo al nuovo HW) ed i tanti software che si trovano in rete per questo OS.
Tra le cose che abbiamo deciso di comune accordo mi vengono in mente:
La sostituzione del tasto SHIFT-LOCK con il più utile CAPS-LOCK
L’eliminazione del tasto LINE FEED: ho riassegnato al tasto TAB la sua vecchia funzione di ‘Tabulatore’
L’assegnazione delle combinazioni di tasti più diffuse (prese dalla cosiddetta WordStar Diamond) ai tasti cursore, Home, End, Ins, Del, PgUp, PgDn, etc.
Chi dedicherà qualche minuto al sorgente noterà che sono stati implementati anche combinazioni di tasti tipo Ctrl + Alt + Del ed i tasti funzione F1-F12. Non sono stati ancora utilizzati da Piergiorgio (non tutti, almeno credo!) ma presto lo saranno.
In ogni caso chi vorrà utilizzare questa interfaccia con NE-DOS potrà farlo tranquillamente restando alla larga dai tasti sopra citati che in tale contesto potrebbero avere un comportamento ‘anomalo’.
Spero di essere riuscito a spiegarmi in modo semplice e chiaro, per ogni vostro dubbio sarò a vostra disposizione.
Tra gli ‘allegati’ alla presente descrizione troverete un ‘estratto’ semplificato della tabella di conversione del KR-2376 che ho voluto rifare in modo (a mio avviso, spero anche per voi) più comprensibile e che voglio spiegarvi con un semplice esempio. Supponiamo sia stato pigiato (mi riferisco alla tastiera ‘originale’ NE) il tasto numerico ‘1’. L’interruttore corrispondente a tale tasto è collegato tra le linee X7 e Y8 (vedi schema elettrico, vedi schema e tabella sul datasheet). Osservando la mia tabella del KR-2376, incrociando la colonna X7 con la riga Y8 (come nella battaglia navale!) vi ritroverete in corrispondenza di un riquadro
contenente nella prima riga (N) il codice ASCII in notazione binaria a 7 bit (0110001), poi quella in notazione esadecimale (31) infine il carattere ASCII corrispondente (‘1’) nel caso in cui il tasto sia stato premuto ‘da solo’, nella seconda riga (S) ci sono i codici (in binario ed esadecimale) e l’ASCII (‘!’) corrispondenti alla combinazione SHIFT + 1 e la terza riga (C) invece corrisponde alla combinazione CONTROL + 1 che restituisce NUL perché non gestita dal sistema. Ogni codice così ottenuto dalla tabella viene poi complementato ed inviato in output dal KR-2376.
Altra tabella allegata (in realtà sono tre) è quella dei layout. Osservando questa tabella si può dedurre, partendo dall’alfanumerico pigiato, gli scan-code del corrispondente tasto in ‘battuta’ (Down) ed in ‘rilascio’ (Up), ed i codici da complementare ed inviare in output a seconda dello ‘stato’ dei tasti Shift e Ctrl.
Procediamo con un esempio osservando la tabella corrispondente al layout italiano: se pigio il tasto ‘1’ sulla tastiera PS/2 verrà inviato all’interfaccia lo scan-code 16 (sempre da considerare in esadecimale!) ed al rilascio invece uno scan-code costituito da due byte: F0,16. Se non viene pigiato altro che il tasto ‘1’ il codice inviato in output sarà IL COMPLEMENTO di quello della colonna ‘Normal’ (ovvero 31) che corrisponde appunto al carattere ‘1’. Nel caso in cui sia stata utilizzata la combinazione Shift + 1 allora il codice in output sarà IL COMPLEMENTO di quello della colonna ‘Shift’ (ovvero 21) che corrisponde appunto al carattere ‘!’. Nel caso in cui la combinazione sia stata Ctrl + 1 allora il codice da complementare ed inviare in output sarà NUL ovvero 00.
Detto questo credo/spero non sarà difficile interpretare correttamente quanto indicato in tutte e tre le tabelle, per qualsiasi layout.
Ultima nota riguarda il tastierino numerico: ho deciso fin dalla prima versione del firmware che resta SEMPRE abilitato, ovvero il tasto NumLock è inibito ed il led corrispondente resta SEMPRE acceso. Una scelta per snellire la procedura e ridurre al minimo le dimensioni del codice ;-)
N.B.: pigiando Alt e AltGr si attiva /NMI fin quando non vengono rilasciati.
In pratica, se pigiati insieme, equivalgono ai due tasti BREAK della tastiera originale. Da utilizzare solo ed esclusivamente con NE-DOS ;-)
La mappatura della tastiera è stata notevolmente estesa, prima di tutto, e questo rende necessario utilizzare una 16F648 al posto della 16F628.
La prima novità di questa nuova versione è il controllo del NumLock ed il salvataggio del suo 'stato' nella EEPROM del PIC con le stesse modalità del layout. In tal modo ad ogni accensione si avrà il NumLock nello stato preferito e/o più comodo.Nella modalità DS/CPM-WS invece:
Schema interfaccia PS/2 |
Firmware | Documentazione |