CODING ★ LE SYSTEME DE DECODAGE AMSDOS ★

Keyboard - le System de Decodage Amsdos (SOS Programmeurs)

Après avoir vu comment lire et décoder le clavier , nous allons étudier comment procède l'AMSDOS et où sont stockées les entrées clavier. Attention! Les adresses RAM sont différentes du 464 au 6128 . On notera avec intérêt que la zone clavier (de #B4E8 à #B547 sur 464 ou #B632 à #B691 sur 6128) présente la même disposition avec un décalage de 330 octets . Pour obtenir l'équivalence d'un ordinateur à l'autre : ADRESSE 6128 = ADRESSE 464+330 , ADRESSE 464=ADRESSE 6128-330 .

1 - Le clavier sous AMSDOS :

Ce qui suit n'est pas exhaustif . C'est un simple résumé de ce que j'ai cru comprendre en traçant les ROMS .

1 - Un cycle d'interruption lit le clavier tout les 50ème de seconde . Si au cours de cette lecture une ou plusieurs touches sont pressées , elle sont partiellement décodées et stockées en RAM dans un buffer de 10 octets . (Ce que fait la 1ère partie du programme présenté dans le chapitre précédent) . Le système de décodage est différent de celui présenté dans notre programme .

Ces 10 octets qui commencent en #B4EB (464) #B635 (6128) contiennent chacun le code prélevé sur une ligne clavier XOR #FF . Pour ceux qui auraient oublié la signification de XOR , rappelons que :

#FF - 11111111 11101111 10110011
XOR 11111111 11111111 11111111
= 00000000 00010000 01001100


En conséquence : Une case à 0 signifie qu'aucune touche n'est pressée . Une case <> de 0 signale le numéro de colonne . Le décalage entre le début du buffer et la case <> de 0 nous donne le numéro de ligne .

Ce petit programme basic dicté au téléphone par R.CABANE permet de lire et décoder une touche dans ce buffer . (Si plusieurs touches sont pressées simultanément seule la première rencontrée est prise en compte) .

10 BUF=&BE4B (ou &B635 sur 6128)
20 colonne=0:line=0:WHILE colonne=0:(line=line+1) MOD 10
30 line=peek(BUF+line):WEND
40 numérotouche=8*line+LEN(bin$(colonne))-1
50 END

Explication : ;line=(line+1) MOD 10 est l'équivalent de : line=line+1:IF line>10 THEN line=0


Tant que la case lue est vide , on incrémente line pour 'PEEKer' à l'adresse suivante . Lorsque cette case est garnie , on sait que l'on est sur la ligne clavier 'line' . Le groupe de touches sera donc 'line*8' .Si le contenu de la case est 00001000 (3ème touche) , la fonction BIN$ nous renvoie : 1000 soit 4 caractères . Donc LEN(BIN$(colonne-1))= la position de
la touche sur la ligne .

L'option 1 du programme -KEYBUF.BAS (Accessible par l'option démo) vous permet de visualiser ces 10 octets en hexadécimal . La ligne en bas d'écran donne le code de la 1ère touche trouvée dans le buffer . Appuyer sur CTRL+SHIFT+ESC pour quitter .

LE SECOND BUFFER CLAVIER

A la recherche de l'adresse perdue ...

De nombreux ouvrages nous signalent l'existence de ce buffer qui peut mémoriser 20 touches . Seul inconvénient , ils omettent d'en préciser l'adresse , ou pire , ils en indiquent une qui est fausse !

L'adresse de ce buffer de 40 octets est de #B514 (464) #B65E (6128)

40 Octets , c'est beaucoup pour 20 touches ! L'AMSDOS réutilise le buffer #B4EB (464) #B635 (6128) pour effectuer un second décodage qui ne donne pas encore vraiment le numéro de touche ! Il donne 2 octets par touche : Le 1er contient le numéro de ligne clavier avec l'état de CTRL+SHIFT , le second renferme le numéro de colonne sous la forme XOR #FF (00010000) pour colonne4.

Le bit 5 du numéro de ligne signale la présence de SHIFT . (OR #20)
- 7 - ; - ; - CTRL . (OR #80)
Les bits 5 & 7 signalent ; CTRL+SHIFT . (OR #A0)


Le dernier décodage se fait comme suit : Les bits 7 & 5 sont testés pour CTRL et SHIFT . Un AND #A0 restaure le numéro de ligne originel , le calcul du numéro de ligne se fait comme précédement .

Sur le 464 , l'absence de l'instruction CLEAR INPUT , a des effets néfastes ! Pour s'en convaincre , écrivez :

10 FOR tp=1 to 5000:NEXT

Faites RUN et tapotez sur le clavier pendant l'exécution de la boucle et observez le carnage avant le READY .... D'autant plus génant qu'en mode programme la vidange du buffer peut activer accidentellement un test du genre : A$=INKEY$ !

Pour y remédier :

10 FOR tp=1 to 5000:NEXT:WHILE INKEY$<>"":WEND

En assembleur :

LD HL,#B514 (ou #B65E)
LD B,40
vidange: LD (HL),#FF ;#FF et rien d'autre !!
INC HL
DJNZ vidange
RET

On notera au passage les adresses RAM suivante :

464 6128
#B4ED #B637 : Feed back buffer <>#FF si un caractère à été lu par le
; clavier . L'opération est si rapide que dans 99% des
; cas , cette case est remise à #FF avant que l'on puisse la
; lire en basic. Réservée à l'assembleur.
#B4F1 #B63B : Etat joystick 1
#B4F4 #B63E : Etat joystick 0 ; Ces 2 adresses vous permettent
; d'accélérer vos tests de joystick .

L'option 2 du programme "-KEY-BUF" vous montrera l'état de ces 40 octets . On notera que les touches sont stockées les unes à la suite des autres . Lorsque le buffer est plein , le pointeur renvoie au début du buffer et les nouvelles entrées commencent à écraser les anciennes . Pour gérer ce pointeur , il doit y-avoir une case RAM 8 bits prenant une valeur de 0 à 20 ou de 0 à
40 . Nous n'avons pu la localiser ...

Notez que si plusieurs touches sont enfoncées simultanément , une seule sera prise en compte (exception faite de CTRL ou SHIFT) .
Il arrive de rencontrer dans ce buffer un numéro de ligne = &EF , on ne voit pas bien d'ou il sort ...
La touche permettant d'afficher le buffer est la touche "O" , vous trouverez donc systématiquement le numéro de touche 34 lors de la lecture .

On dispose donc maintenant de 2 manières de lire le clavier . Soit utiliser la routine présentée dans le chapitre précédent , soit lire directement le buffer clavier . Dans ce dernier cas , il faudra tenir compte du décalage d'adresse pour conserver la compatibilité entre les CPCs . Les adresses 664 sont les mêmes que pour le 6128 . Le chapitre suivant abordera enfin le sujet des interruptions .

★ ANNÉE: ???
★ AUTEUR: MICHEL MAIGROT

★ AMSTRAD CPC ★ DOWNLOAD ★

Other platform tool:
» SOS3KEYBOARDDATE: 2011-06-05
DL: 387
TYPE: ZIP
SiZE: 6Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Turbo - Clavier (CPC Revue)
» Applications » Edito a la découverte du Clavier
» Coding » Menu - Keyboard
» Applications » Problèmes de compatibilité CPC/CPC Plus (Tom et Jerry/GPA)
» Coding » De port en port : Programmation directe du clavier (Micro-Mag)
» Coding Src's » Keyboard II (Schneider Magazin)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop
Page créée en 648 millisecondes et consultée 1892 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.