; LIBKBD1.TXT
;
;   Bibliotheque de sous-programmes de gestion d'un clavier PC/AT (AZERTY)
;   ----------------------------------------------------------------------
;
;                          (C) E+E CHAMOUARD 1998
;

; A definir dans le programme principal :
;   bit     KbdClk              Bit connecte au signal Clk du clavier
;                               (P3.2 ou P3.3 sur un MCS51 "de base")
;   bit     KbdDat              Bit connecte au signal Data du clavier
;   bit     KbdIT               Interuption utilisee (IT0 ou IT1)
;   bit     KbdEX               Interuption utilisee (EX0 ou EX1)
;                               (IT0 et EX0 si P3.2 et IT1 et EX1 si P3.3)
;   byte    KbdDel              Delai du time out du clavier 
;                               A ajuster en fonction de la vitesse
;                               du clavier et du processeur
;                               (10 mesure sur un 8051 a 12 MHz par ex.)

;   word    KbdBufferStart      Adresse de debut du buffer clavier (memoire externe)
;   word    KbdBufferEnd        Adresse de fin du buffer clavier (debut + ffh)

;   direct  KbdIndexRead        Index de lecture du buffer clavier
;   direct  KbdIndexWrite       Index d'ecriture du buffer clavier
;   direct  KbdReadState        Etat de la machine d'etat de reception
;   direct  KbdReadFlags        Flags de reception
;   direct  KbdReadModif        Modificateur de reception

; Pour faire fonctionner le clavier, le programme principal doit :
;   1) initialiser les interuptions clavier, par exemple :
;       lcall   KbdInit         ; Init clavier
;       setb    KbdIT           ; It sur front descendant
;       setb    KbdEX           ; It externe 0 autorisee
;       setb    EA              ; It autorisees
;   2) avoir une routine d'interuption de la forme :
;       ORG 0003h               ; Exemple avec EX0
;       clr     KbdIT           ; Arret ITx
;       push    PSW
;       push    ACC
;       push    B
;       push    DPL
;       push    DPH
;       lcall   KbdInput        ; Entree du clavier
;       lcall   KbdInputTrt     ; Conversion en ASCII
;       pop     DPH
;       pop     DPL
;       pop     B
;       pop     ACC
;       pop     PSW
;       setb    KbdIT           ; Mise en route IT
;       reti
;   3) tester la presence d'un caractere dans le buffer de reception
;       lcall   KbdKbit
;       jz      qsdfqsdf
;   4) recuperer les caracteres dans le buffer de reception
;       lcall   KbdGetch


; Programmes utilisateur
; ----------------------

KbdInit:
    Fonction  :   Initialisation de l'interface clavier
    Entree(s) :   Rien
    Sortie(s) :   RAZ du tampon de caracteres
                  RAZ de la machine d'etat
                  RAZ des LEDs du clavier
    Utilise   :   Registres A et B non sauvegardes
    Pile      :   4 avec l'appel
    Cycles    :   ?

KbdSetNumlock:
    Fonction  :   Mise en fonction du num lock du clavier
    Entree(s) :   Rien
    Sortie(s) :   Led du clavier et flag correspondant
    Utilise   :   Registres A et B non sauvegardes
    Pile      :   4 avec l'appel
    Cycles    :   ?

KbdKbhit:
    Fonction  :   Determine si un char attend dans le buffer clavier
    Entree(s) :   Rien
    Sortie(s) :   Nombre de caracteres dans la FIFO dans le registre A
    Utilise   :   Rien
    Pile      :   2 avec l'appel
    Cycles    :   ?

KbdGetch:
    Fonction  :   Lecture d'un caractere dans le buffer
    Entree(s) :   Rien
                  Ne verifie pas si un caractere est dans le buffer
    Sortie(s) :   Caractere dans le registre A
    Utilise   :   Registres DPH et DPL non sauvegardes
    Pile      :   2 avec l'appel
    Cycles    :   ?

KbdAttAndGetch:
    Fonction  :   Lecture d'un caractere au clavier avec attente
    Entree(s) :   Rien
    Sortie(s) :   Caractere dans le registre A (attente infinie)
    Utilise   :   Registres DPH et DPL non sauvegardes
    Pile      :   4 avec l'appel
    Cycles    :   ?

KbdAttAndDrop:
    Fonction  :   Attente frappe au clavier
    Entree(s) :   Rien
    Sortie(s) :   Rien (carac perdu et attente infinie)
                  Si caractere etendu, attend le second caractere
    Utilise   :   Registres A, DPH et DPL non sauvegardes
    Pile      :   6 avec l'appel
    Cycles    :   ?


; Programmes utiliss dans la routine d'interruption
; --------------------------------------------------

KbdInput:
    Fonction  :   Entree en provenance du clavier
    Entree(s) :   Sous prog appele avec KbdDat a 0 (par ex sous it)
                  Ou attente indefinie du caractere (pour l'instant)
    Sortie(s) :   Code clavier dans le registre A
                      00h si erreur de parite
                  A faire : time out ?
    Utilise   :   Registres B et DPH non sauvegardes
    Pile      :   2 avec l'appel
    Cycles    :   ?

KbdInputTrt:
    Fonction  :   Traitement de l'entree brute du clavier
    Entree(s) :   Entree brute du clavier dans le registre A
    Sortie(s) :   Rien
                  Mise a jour de l'index du buffer (KbdIndexWrite)
                  et/ou mise a jour de la machine d'etat et des flags
                  Pour l'instant pas de traitement du ^,~,` et du 
    Utilise   :   Registres DPL, DPH, B et A non sauvegardes
    Pile      :   7 avec l'appel
    Cycles    :   ?


; Programmes internes
; -------------------

KbdPutch:
    Fonction  :   Ecriture d'un caractere dans le buffer de reception
    Entree(s) :   Caractere dans le registre A
    Sortie(s) :   Rien
                  Met a jour l'index d'ecriture
                  Ne verifie pas si le buffer deborde
    Utilise   :   Registres DPH et DPL non sauvegardes
    Pile      :   3 avec l'appel
    Cycles    :   ?

KbdOutput:
    Fonction  :   Sortie d'un octet vers le clavier
    Entree(s) :   Donnee a transmettre dans le registre A
    Sortie(s) :   Rien
                  A faire : time out ?
    Utilise   :   Registre B non sauvegarde, registre A restaure
    Pile      :   2 avec l'appel
    Cycles    :   ?


; Recapitulatif des codes de sortie
; ---------------------------------

; Code : 00h -> Alt q
; Code : 01h -> Ctl a
; Code : 02h -> Ctl b
; Code : 03h -> Ctl c
; Code : 04h -> Ctl d
; Code : 05h -> Ctl e
; Code : 06h -> Ctl f
; Code : 07h -> Ctl g
; Code : 08h -> Back space ou Ctl h
; Code : 09h -> Tab ou Ctl i
; Code : 0ah -> Ctl Enter ou Ctl j
; Code : 0bh -> Ctl k
; Code : 0ch -> Ctl l
; Code : 0dh -> Enter ou Ctl m
; Code : 0eh -> Ctl n   ; Si 00h devant -> Alt Back space
; Code : 0fh -> Ctl o   ; Si 00h devant -> Shift Tab
; Code : 10h -> Ctl p
; Code : 11h -> Ctl q   ; Si 00h devant -> Alt w
; Code : 12h -> Ctl r   ; Si 00h devant -> Alt e
; Code : 13h -> Ctl s
; Code : 14h -> Ctl t   ; Si 00h devant -> Alt t
; Code : 15h -> Ctl u   ; Si 00h devant -> Alt y
; Code : 16h -> Ctl v   ; Si 00h devant -> Alt u
; Code : 17h -> Ctl w   ; Si 00h devant -> Alt i
; Code : 18h -> Ctl x   ; Si 00h devant -> Alt o
; Code : 19h -> Ctl y   ; Si 00h devant -> Alt p
; Code : 1ah -> Ctl z   ; Si 00h devant -> Alt ^/
; Code : 1bh -> Escape ou Ctl ^/
; Code : 1ch -> Ctl */ ; Si 00h devant -> Alt Enter
; Code : 1dh -> Ctl $//
; Code : 1eh -> Ctl -/6/|; Si 00h devant -> Alt a
; Code : 1fh -> Alt s   ; Si 00h devant -> Alt )//]
; Code : 20h -> Space   ; Si 00h devant -> Alt d
; Code : 21h -> !       ; Si 00h devant -> Alt f
; Code : 22h -> "       ; Si 00h devant -> Alt g
; Code : 23h -> #       ; Si 00h devant -> Alt h
; Code : 24h -> $       ; Si 00h devant -> Alt j
; Code : 25h -> %       ; Si 00h devant -> Alt k
; Code : 26h -> &       ; Si 00h devant -> Alt l
; Code : 27h -> '
; Code : 28h -> (       ; Si 00h devant -> Alt /%
; Code : 29h -> )       ; Si 00h devant -> Shift ou Alt petit 2
; Code : 2ah -> *
; Code : 2bh -> +       ; Si 00h devant -> Alt */
; Code : 2ch -> ,       ; Si 00h devant -> Alt z
; Code : 2dh -> -       ; Si 00h devant -> Alt x
; Code : 2eh -> .       ; Si 00h devant -> Alt c
; Code : 2fh -> /       ; Si 00h devant -> Alt v
; Code : 30h -> 0       ; Si 00h devant -> Alt b
; Code : 31h -> 1       ; Si 00h devant -> Alt n
; Code : 32h -> 2       ; Si 00h devant -> Alt m
; Code : 33h -> 3       ; Si 00h devant -> Alt ;/.
; Code : 34h -> 4       ; Si 00h devant -> Alt ://
; Code : 35h -> 5       ; Si 00h devant -> Alt !/
; Code : 36h -> 6
; Code : 37h -> 7       ; Si 00h devant -> Alt Num *
; Code : 38h -> 8
; Code : 39h -> 9
; Code : 3ah -> :
; Code : 3bh -> ;       ; Si 00h devant -> F1
; Code : 3ch -> <       ; Si 00h devant -> F2
; Code : 3dh -> =       ; Si 00h devant -> F3
; Code : 3eh -> >       ; Si 00h devant -> F4
; Code : 3fh -> ?       ; Si 00h devant -> F5
; Code : 40h -> @       ; Si 00h devant -> F6
; Code : 41h -> A       ; Si 00h devant -> F7
; Code : 42h -> B       ; Si 00h devant -> F8
; Code : 43h -> C       ; Si 00h devant -> F9
; Code : 44h -> D       ; Si 00h devant -> F10
; Code : 45h -> E
; Code : 46h -> F
; Code : 47h -> G       ; Si 00h devant -> Home
; Code : 48h -> H       ; Si 00h devant -> Up
; Code : 49h -> I       ; Si 00h devant -> Page up
; Code : 4ah -> J       ; Si 00h devant -> Alt Num -
; Code : 4bh -> K       ; Si 00h devant -> Left
; Code : 4ch -> L       ; Si 00h devant -> Num 5
; Code : 4dh -> M       ; Si 00h devant -> Right
; Code : 4eh -> N       ; Si 00h devant -> Alt Num +
; Code : 4fh -> O       ; Si 00h devant -> End
; Code : 50h -> P       ; Si 00h devant -> Down
; Code : 51h -> Q       ; Si 00h devant -> Page down
; Code : 52h -> R       ; Si 00h devant -> Insert
; Code : 53h -> S       ; Si 00h devant -> Delete
; Code : 54h -> T       ; Si 00h devant -> Shift F1
; Code : 55h -> U       ; Si 00h devant -> Shift F2
; Code : 56h -> V       ; Si 00h devant -> Shift F3
; Code : 57h -> W       ; Si 00h devant -> Shift F4
; Code : 58h -> X       ; Si 00h devant -> Shift F5
; Code : 59h -> Y       ; Si 00h devant -> Shift F6
; Code : 5ah -> Z       ; Si 00h devant -> Shift F7
; Code : 5bh -> [       ; Si 00h devant -> Shift F8
; Code : 5ch -> \       ; Si 00h devant -> Shift F9
; Code : 5dh -> ]       ; Si 00h devant -> Shift F10
; Code : 5eh -> ^       ; Si 00h devant -> Ctl F1
; Code : 5fh -> _       ; Si 00h devant -> Ctl F2
; Code : 60h -> `       ; Si 00h devant -> Ctl F3
; Code : 61h -> a       ; Si 00h devant -> Ctl F4
; Code : 62h -> b       ; Si 00h devant -> Ctl F5
; Code : 63h -> c       ; Si 00h devant -> Ctl F6
; Code : 64h -> d       ; Si 00h devant -> Ctl F7
; Code : 65h -> e       ; Si 00h devant -> Ctl F8
; Code : 66h -> f       ; Si 00h devant -> Ctl F9
; Code : 67h -> g       ; Si 00h devant -> Ctl F10
; Code : 68h -> h       ; Si 00h devant -> Alt F1
; Code : 69h -> i       ; Si 00h devant -> Alt F2
; Code : 6ah -> j       ; Si 00h devant -> Alt F3
; Code : 6bh -> k       ; Si 00h devant -> Alt F4
; Code : 6ch -> l       ; Si 00h devant -> Alt F5
; Code : 6dh -> m       ; Si 00h devant -> Alt F6
; Code : 6eh -> n       ; Si 00h devant -> Alt F7
; Code : 6fh -> o       ; Si 00h devant -> Alt F8
; Code : 70h -> p       ; Si 00h devant -> Alt F9
; Code : 71h -> q       ; Si 00h devant -> Alt F10
; Code : 72h -> r
; Code : 73h -> s       ; Si 00h devant -> Ctl Num 4
; Code : 74h -> t       ; Si 00h devant -> Ctl Num 6
; Code : 75h -> u       ; Si 00h devant -> Ctl Num 1
; Code : 76h -> v       ; Si 00h devant -> Ctl Num 3
; Code : 77h -> w       ; Si 00h devant -> Ctl Num 7
; Code : 78h -> x       ; Si 00h devant -> Alt &/1
; Code : 79h -> y
; Code : 7ah -> z
; Code : 7bh -> {
; Code : 7ch -> |
; Code : 7dh -> }
; Code : 7eh -> ~
; Code : 7fh -> Ctl Back space
; Code : 80h ->
; Code : 81h ->
; Code : 82h -> 
; Code : 83h ->
; Code : 84h ->         ; Si 00h devant -> Ctl Num 9
; Code : 85h ->        ; Si 00h devant -> F11
; Code : 86h ->         ; Si 00h devant -> F12
; Code : 87h ->        ; Si 00h devant -> Shift F11
; Code : 88h ->         ; Si 00h devant -> Shift F12
; Code : 89h ->         ; Si 00h devant -> Ctl F11
; Code : 8ah ->        ; Si 00h devant -> Ctl F12
; Code : 8bh ->         ; Si 00h devant -> Alt F11
; Code : 8ch ->         ; Si 00h devant -> Alt F12
; Code : 8dh ->         ; Si 00h devant -> Ctl Num 8
; Code : 8eh ->         ; Si 00h devant -> Ctl Num -
; Code : 8fh ->         ; Si 00h devant -> Ctl Num 5
; Code : 90h ->         ; Si 00h devant -> Ctl Num +
; Code : 91h ->         ; Si 00h devant -> Ctl Num 2
; Code : 92h ->         ; Si 00h devant -> Ctl Num 0
; Code : 93h ->         ; Si 00h devant -> Ctl Num .
; Code : 94h ->         ; Si 00h devant -> Ctl Tab
; Code : 95h ->
; Code : 96h ->         ; Si 00h devant -> Ctl Num *
; Code : 97h -> 
; Code : 98h ->
; Code : 99h ->
; Code : 9ah ->
; Code : 9bh ->
; Code : 9ch -> 
; Code : 9dh ->
; Code : 9eh ->
; Code : 9fh ->
; Code : a0h ->
; Code : a1h ->
; Code : a2h ->
; Code : a3h ->
; Code : a4h ->
; Code : a5h ->
; Code : a6h ->
; Code : a7h ->
; Code : a8h ->
; Code : a9h ->
; Code : aah ->
; Code : abh ->
; Code : ach ->
; Code : adh ->
; Code : aeh ->
; Code : afh ->
; Code : b0h ->
; Code : b1h ->
; Code : b2h ->
; Code : b3h ->
; Code : b4h ->
; Code : b5h ->
; Code : b6h ->
; Code : b7h ->
; Code : b8h ->
; Code : b9h ->
; Code : bah ->
; Code : bbh ->
; Code : bch ->
; Code : bdh ->
; Code : beh ->
; Code : bfh ->
; Code : c0h ->
; Code : c1h ->
; Code : c2h ->
; Code : c3h ->
; Code : c4h ->
; Code : c5h ->
; Code : c6h ->
; Code : c7h ->
; Code : c8h ->
; Code : c9h ->
; Code : cah ->
; Code : cbh ->
; Code : cch ->
; Code : cdh ->
; Code : ceh ->
; Code : cfh -> 
; Code : d0h ->
; Code : d1h ->
; Code : d2h ->
; Code : d3h ->
; Code : d4h ->
; Code : d5h ->
; Code : d6h ->
; Code : d7h ->
; Code : d8h ->
; Code : d9h ->
; Code : dah ->
; Code : dbh ->
; Code : dch ->
; Code : ddh ->
; Code : deh ->
; Code : dfh ->
; Code : e0h ->
; Code : e1h ->
; Code : e2h ->
; Code : e3h ->
; Code : e4h ->
; Code : e5h ->
; Code : e6h -> 
; Code : e7h ->
; Code : e8h ->
; Code : e9h ->
; Code : eah ->
; Code : ebh ->
; Code : ech ->
; Code : edh ->
; Code : eeh ->
; Code : efh ->
; Code : f0h ->
; Code : f1h ->
; Code : f2h ->
; Code : f3h ->
; Code : f4h ->
; Code : f5h -> 
; Code : f6h ->
; Code : f7h ->
; Code : f8h -> 
; Code : f9h ->
; Code : fah ->
; Code : fbh ->
; Code : fch ->
; Code : fdh -> Petit 2
; Code : feh ->
; Code : ffh ->
