Routines de capture du clavier

Le clavier s’adresse au travers du registre 14 du PPI.

Il y a 10 lignes de clavier qui se partagent le clavier physique et les deux joysticks

Particularité, chaque joystick n’utilise qu’une seule ligne ce qui permet des optimisations agressives pour un programme 100% joystick

; routine minimale de lecture d'une ligne clavier
LD BC,#F782 : OUT (C),C             ; port A en sortie
DEC B : OUT (C),0                   ; validation
LD BC,#F40E : OUT (C),C             ; registre 14 sur le port A
LD BC,#F6C0 : OUT (C),C : OUT (C),0 ; selection du registre + validation
LD BC,#F792 : OUT (C),C             ; port A en entrée
LD A,ligne_clavier+#40              ; ligne clavier + fonction READ bit 6
DEC B                               ; B=#F6
OUT (C),A

LD B,#F4                            ; adresse du port A
IN A,(C)                            ; lecture du port A
RET

Cette routine minimale laisse le port A du PPI en entrée (puisqu’on termine la routine par la lecture de l’état de la ligne demandée), ce qui la rend incompatible avec des players de musique. Il devient judicieux de considérer que le port A du PPI est toujours en sortie par défaut vu que c’est ce que considèrent tous les programmes qui jouent de la musique. Ainsi on n’initialise pas le port en sortie en début de routine, mais à la fin!

; routine minimale de lecture d'une ligne clavier
; on considère que le port A est déjà en sortie!
LD BC,#F40E : OUT (C),C             ; registre 14 sur le port A
LD BC,#F6C0 : OUT (C),C : OUT (C),0 ; selection du registre + validation
LD BC,#F792 : OUT (C),C             ; port A en entrée
LD A,ligne_clavier+#40              ; ligne clavier + fonction READ bit 6
DEC B                               ; B=#F6
OUT (C),A

LD B,#F4                            ; adresse du port A
IN A,(C)                            ; lecture du port A
LD BC,#F782 : OUT (C),C             ; port A en sortie pour tout le monde!
RET

Pour lire plusieurs lignes (toutes les lignes?) il suffit de faire une boucle à partir de l’envoi du numéro de ligne. On utilisera l’instruction INI qui est un IN évolué destiné à être utilisé pour les lectures en rafale d’un port I/O. L’instruction INI pré-décrémente B, lit le port puis écrit la valeur à l’adresse pointée par HL et enfin incrémente HL.

; routine complète et à peu près optimisée de lecture du clavier
; on considère que le port A est déjà en sortie!
; on positionne le tampon clavier de 10 octets en #40

scankeyboard
LD BC,#F40E : OUT (C),C             ; registre 14 sur le port A
LD BC,#F6C0 : OUT (C),C : OUT (C),0 ; selection du registre + validation
LD BC,#F792 : OUT (C),C             ; port A en entrée

LD HL,#40
LD DE,#F6F4

repeat 10
LD B,D : OUT (C),L
LD B,E : INI
rend

LD BC,#F782 : OUT (C),C             ; port A en sortie pour tout le monde!
DEC B : OUT (C),0                   ; validation obligatoire pour CPC+
RET