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: 98 fois
TYPE: ZIP
SIZE: 6Ko
NOTE: 40 Cyls
.HFE: NON

Je participe au site:
» Newfile(s) upload/Envoye de fichier(s)
★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Menu - Keyboard
» Coding » Clefs1 15 Logiciel Interne Table Clavier
» Applications » Vocaclavier
» Applications » Problèmes de compatibilité CPC/CPC Plus (Tom et Jerry/GPA)
» Coding » System - Les Routines System - Exemple d'usage des Routines Clavier et Texte (SOS Programmeurs)
» Applications » Emulateur Clavier Minitel (CPC Revue)

QUE DIT LA LOI FRANÇAISE:

L'alinéa 8 de l'article L122-5 du Code de la propriété intellectuelle explique que « Lorsque l'œuvre a été divulguée, l'auteur ne peut interdire la reproduction d'une œuvre et sa représentation effectuées à des fins de conservation ou destinées à préserver les conditions de sa consultation à des fins de recherche ou détudes privées par des particuliers, dans les locaux de l'établissement et sur des terminaux dédiés par des bibliothèques accessibles au public, par des musées ou par des services d'archives, sous réserve que ceux-ci ne recherchent aucun avantage économique ou commercial ». Pas de problème donc pour nous!

CPCrulez[Content Management System] v8.7-desktop/cache
Page créée en 072 millisecondes et consultée 838 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.