Lire le clavier ?

Forum Amiga Coding Lire le clavier ?

  • Ce sujet contient 14 réponses, 4 participants et a été mis à jour pour la dernière fois par PZAWA, le il y a 7 années et 10 mois.
  • Créateur
    Sujet
  • #3675
    Ancien Membre
      • Level 7
      • Messages : 402

      Je cherche une routine très simple et rapide pour lire le clavier en attaquant directement le hardware :good:

    Affichage de 14 réponses de 1 à 14 (sur un total de 14)

    Partager sur vos réseaux sociaux préférés :
    Facebooktwitterredditpinterestlinkedintumblrmail

    • Auteur
      Réponses
    • #3741
      PZAWA
        • Level 6
        • Messages : 316

        Salut,

        oauu c’est plus compliqué que je ne pensais… pour la lecture d’une touche pas de problème mais apres ca se corse. La doc nous dit qu’il faut faire pulse kdat (le mettre en phase basse) pendant au moins 1us.

        Mais comment le faire pulser ??? après pas mal de prise de tête j’ai trouvé qu’apparemment en mettant le CIA en mode output et après input ça semble fonctionner. (et pas oublier de lire le registre d’interruption).

        Voila le programme de test qui affiche dans le cli la valeur de $bfec01 lorsque une touche est presse (sans conversion « keystrobe ») en gras la partie qui nous intéresse.

        start:
        move.l 4,a6
        lea dosname(PC),a1
        move.l #33,d0
        jsr -552(A6) ; Open library
        tst d0
        beq error
        move.l d0,dosptr
        showmsg:
        move.l d0,a5
        jsr -60(a5) ; dos_output
        tst d0
        beq.w end
        move.l d0,dosoutptr
        move.l d0,d1 ; dos_output
        move.l #msg,d2 ; msgptr
        move.l msglen,d3 ; len msg
        jsr -48(a5) ; write ouput
        initMain:
        move.w $dff01c,saveintena
        move.w #$7fff,$dff09a ; disable int
        keytest:
        move.b $bfec01,d0 ;read keyboard
        move.l d0,d4 ;save on d4
        btst #0,d4 ;key pressed ?
        beq.s .suitemouse ;no so skip
        move.l #STRBUFFER,A0 ;
        bsr.w ConvVal2StrHexFunct ; convert value from keyboard
        move.l dosoutptr,d1 ; dos_output
        move.l #STRBUFFER,d2 ; str hex value
        move.l #$4,d3 ; len msg
        jsr -48(a5) ; write ouput
        bset #6,$bfee01 ; CIA Output: ack with KDAT LOW ???
        nop ; wait in case ofhave to write something ??
        bclr #6,$bfee01 ; CIA Input : end of ack with KDAT HIGH ???
        nop ;wait in case of
        .suitekey:
        move.b $bfed01,d0 ; by reading int reg of cia we ack int ???
        .suitemouse
        btst #6,$bfe001
        bne keytest
        end:
        ;– Restaure INT
        move.w saveintena,d5
        or.w #$c000,d5
        move.w d5,$dff09a
        move.l dosptr,a1
        jsr -414(A6) ;close dos
        rts
        error:
        move.l #-1,D0
        rts

        dosptr dc.l $0
        dosname dc.b « dos.library »,0
        msg dc.b « Keyboard Test (press mouse to quit) »,0,0
        msglen dc.l msglen-msg
        STRBUFFER dc.l 0,0,0,0,0,0,0,0,0,0,0
        dosoutptr dc.l 0
        saveintena dc.w 0

        mais j’avoue que c’est un peu fait au pif d’après la doc. Donc absolument pas certain si il n’y a pas de connerie dans la façon de faire…



        #3750
        Ancien Membre
          • Level 7
          • Messages : 402

          Merci PZAWA! :good:

          Je me souvenais qu’il y avait une histoire de tempo…

          J’ai une erreur d’exécution quand j’assemble avec VASM, je ne sais pas encore pourquoi, je regarde dès j’ai un peu de temps B-)

          #3752
          donamiga
            • Level 5
            • Messages : 249

            avec une interruption clavier, ça marchait sur un a1200 :
            lea keybinterruption(pc),a0
            move.l a0,$68.w ; ou (a1) avec a1=vbr
            move.w #$c008,$9a

            keybinterruption:
            movem.l d0-d7/a0-a6,-(sp)
            andi.w #8,$dff01e
            beq noint

            btst #3,$bfed01 ; CIA-A ICR controle interruption. bit 3 = Serial Port int.
            beq nokey

            lea $bfec01,a0 ; CIA-A SP données series clavier
            moveq #0,d0
            move.b (a0),d0
            clr.b (a0)
            not d0
            ror.b #1,d0
            move.b d0,bufkey

            bset #6,$bfee01 ; CIA-A CRA controle. bit 6=SPMODE =1 (sortie)
            moveq #50,d0 ; peut etre remplacé par un delay CIA-Timer
            dbf d0,*
            bclr #6,$bfee01 ; CIA-A CRA bit 6=SPMODE = 0 (entrée)

            nokey: move.w #8,$dff09c
            noint: movem.l (sp)+,d0-d7/a0-a6
            rte

            #3753
            PZAWA
              • Level 6
              • Messages : 316

              Merci donAmiga :good:

              Donc il me manquais un delai pour la pulsation de KDAT.

              Désolé Majikeyric: j’avais oublié d’inclure la fonction conv2hex et puis j’avais laissé quelques taches. :-p

              Donc le programme de test de lecture hardware de clavier dans le cli (et sans utiliser d »interruption) complet et compilé sous devpac2 devient:
              start:
              move.l 4,a6
              lea dosname(PC),a1
              move.l #33,d0
              jsr -552(A6) ; Open library
              tst d0
              beq error
              move.l d0,dosptr
              showmsg:
              move.l d0,a5
              jsr -60(a5) ; dos_output
              tst d0
              beq.w end
              move.l d0,dosoutptr
              move.l d0,d1 ; dos_output
              move.l #msg,d2 ; msgptr
              move.l msglen,d3 ; len msg
              jsr -48(a5) ; write ouput
              initMain:
              move.w $dff01c,saveintena
              move.w #$7fff,$dff09a ; disable int
              main:
              keytest:
              move.b $bfec01,d0 ; read keyboard
              btst #0,d0 ; key pressed
              beq.s .suitemouse ; no skip
              ;rawkey conversion
              ror.b #1,d0
              not.b d0
              ; show rawkey on dos output
              move.l #STRBUFFER,A0 ; where convert
              bsr.w ConvByte2StrHexFunct ; convert value from keyboard
              move.l dosoutptr,d1 ; dos_output
              move.l #STRBUFFER,d2 ; str hex value
              move.l #$2,d3 ; len msg
              jsr -48(a5) ; write ouput
              ; Acknowledge keyboard
              bset #6,$bfee01 ; CIA Output: ack with KDAT LOW ???
              moveq #50,d0 ; delai
              dbf d0,*
              bclr #6,$bfee01 ; CIA Input : end of ack with KDAT HIGH ???
              .suitekey:
              move.b $bfed01,d0 ; by reading int reg of cia we ack int ???
              .suitemouse:
              btst #6,$bfe001
              bne.w main
              end:
              ;– Restaure INT
              move.w saveintena,d5
              or.w #$c000,d5
              move.w d5,$dff09a
              move.l dosptr,a1
              jsr -414(A6) ;close dos
              rts
              error:
              move.l #-1,D0
              rts

              dosptr dc.l $0
              dosname dc.b « dos.library »,0
              msg dc.b « Keyboard Test (left mouse to quit) »,$0A,0
              msglen dc.l msglen-msg
              STRBUFFER dc.l 0,0,0,0,0,0,0,0,0,0,0
              dosoutptr dc.l 0
              saveintena dc.w 0
              ; CONVERSION HEXADECIMALE
              ;Notre fonction qui convertie le premier octet de D0 en valeur Hexa text dans un buffer pointer par A0
              ConvByte2StrHexFunct: ;IN: D0 Value to Convert, A0=>String to fill Dec. OUT=>A0=Ao(in) FILL
              movem.l D1/A0/A1,-(SP)
              lea HEXACHAR(PC),A1 ; LOAD HexChar table
              .Conv:
              move.w D0,D1 ; val on d1
              ror.w #4,D1 ; upper 4
              and.w #$0F,D1 ; 4bits onlyt
              move.b (A1,D1),(A0)+ ; get hex and write
              and.w #$0F,D0 ; lower 4
              move.b (A1,D0),(A0)+ ; get hex and write
              .End:
              move.b #0,(A0) ; END STRING
              movem.l (SP)+,D1/A0/A1
              rts
              HEXACHAR DC.B « 0123456789ABCDEF »

              Maintenant il faut que je teste sur un Vrai Amiga.

               

              #3818
              PZAWA
                • Level 6
                • Messages : 316

                Bon bein testée sur mon A600 et pas vraiment concluant. Cela marche lorsque on presse tranquillement quelques touches, mais il suffit de jouer un peu plus agressivement avec les touches du claviers pour qu’il se bloque :-(   Et le délaie entre le out/in du CIA ne change rien du tout …

                Je vais devoir regarder plus en détail en testant sur mon A500 (j’ai des doutes sur l’état de mon A600)…

                J’espère seulement ne pas trop polluer ce post ?

                #3820
                donamiga
                  • Level 5
                  • Messages : 249

                  la plupart des progs utilisant le clavier en hardware (jeux) utilisent l’interruption clavier. meme les trainers (atx skol).

                  voir le fichier keyboard.s du kit de dev de WHDload
                  le delay est fait avec le vhpos (dans une interruption)

                  .int movem.l d0-d1/a0-a1,-(a7)
                  lea (_custom),a0
                  lea (_ciaa),a1
                  ;check if keyboard has caused interrupt
                  btst #INTB_PORTS,(intreqr+1,a0)
                  beq .end
                  btst #CIAICRB_SP,(ciaicr,a1)
                  beq .end
                  ;read keycode
                  move.b (ciasdr,a1),d0
                  ;set output mode (handshake)
                  or.b #CIACRAF_SPMODE,(ciacra,a1)
                  ;calculate rawkeycode
                  not.b d0
                  ror.b #1,d0

                  move.l a0,-(a7)
                  lea (_keycode),a0 ;no ‘,pc’ because used absolut sometimes
                  move.b d0,(a0)
                  move.l (a7)+,a0

                  ;better would be to use the cia-timer to wait, but we arn’t know if
                  ;they are otherwise used, so using the rasterbeam
                  ;required minimum waiting is 75 µs, one rasterline is 63.5 µs
                  ;a loop of 3 results in min=127µs max=190.5µs
                  moveq #3-1,d1
                  .wait1 move.b (vhposr,a0),d0
                  .wait2 cmp.b (vhposr,a0),d0
                  beq .wait2
                  dbf d1,.wait1

                  ;set input mode
                  and.b #~(CIACRAF_SPMODE),(ciacra,a1)
                  .end move.w #INTF_PORTS,(intreq,a0)
                  ;to avoid timing problems on very fast machines we do another
                  ;custom access
                  tst.w (intreqr,a0)
                  movem.l (a7)+,d0-d1/a0-a1
                  rte

                  #3843
                  PZAWA
                    • Level 6
                    • Messages : 316

                    Salut DonAmiga :) et merci pour l’exemple  :good:

                    Je n’ai pas encore tester avec une interruption mais je voulais d’abord le faire sans. Même si c’est Majikeyric (J’espère que la routine de DonAmiga te suffit ? ) qui a ouvert la discussion, j’avoue en avoir  fait maintenant une affaire personnel : comment lire le clavier par le hardware et sans passer par une interruption ? :lol:

                    J’avais déjà fait la modif avec une attente de raster pour être à peu prés certain du délai mais cela ne change rien: En fait dans mon code il suffit de supprimer le test si une touche est pressée (btst #0,d0 ; key pressed
                    beq.s .suitemouse ; no skip) pour que tout fonctionne sans bloquer  :wacko: Comme si il fallait mettre le délaie entre la lecture et le in/out du CIA. Autre chose que j’ai remarqué: lorsque le délaie entre le in/out est trop long, la dernière touche pressée se bloque (c’est a dire la lecture de $bfec01 renvoi toujours la valeur de cette dernière pressée). Il faut presser une autre touche pour « débloquer ».   :unsure:

                    Quand j’aurai un peu de temps j’approfondirai le sujet je dégagerai les dosouput et à la place je mettrai des sons: cela allégera le listing et ce sera le meilleur des tests.

                    Enfin moralité de l’histoire: toujours tester sur un Vrai Amiga B-)

                    #4636
                    Ancien Membre
                      • Level 7
                      • Messages : 402

                      Merci PZAWA et DonAmiga, ça marche super bien !!! :yahoo:

                      Perso je préfère passer par une interruption clavier vu qu’elle est immédiatement générée dès que le CIA à reçu le keycode de la touche appuyée\relachée. J’imagine que c’est ce qu’il y a de plus efficace. Plutôt que de scruter le clavier à chaque VBL et peut être perdre des appuis touches.

                      #4988
                      PZAWA
                        • Level 6
                        • Messages : 316

                        Cool merci surtout donAmiga B-)

                        Mieux vaut passer par interruption pour une raison qui tue: impossible d’identifié (en tout cas je n’y suis pas arrivé) l’état de plusieurs touches en même temps en pooling.

                        Et je confirme mes dernières constatation: sans interruption, en mettant le délai avant (au moins 3 raster d’attente) l' »acknowledgement ». Dans ce dernier, entre le in/out du cia, aucun délai et j’obtiens un clavier musical suffisamment réactif mais à une condition: staccato obligatoire (en legato ça bloque  :-p:whistle:

                        #10487
                        donamiga
                          • Level 5
                          • Messages : 249

                          deterrage

                          juste pour dire que l’ancien membre, Majikeyric, est un des codeurs du jeu Lumberjack. Voir les 2 remakes Lumberjack et Lumberjack Reloaded sorti en juin

                          http://eab.abime.net/showthread.php?t=87505

                          http://eab.abime.net/showthread.php?t=86205

                          voir la video de Pixel Nation « Lumberjack in real forest » :



                          #11195
                          Staff
                          Jim Neray
                            • Level 22
                            • Messages : 7236

                            Le jeu a été codé par Cobe. Codé en blitz d’ailleurs si je ne m’abuse.

                            Majikeyric ( @Speccy ) avait lui codé l’original sur C64 dont la version Amiga est inspirée.  ;-)

                            A500 - A500 Plus - A600 HD - A1200 - A2000 - A3000 - A4000T - CD32 - C=64 - 1040STE - ...
                            Mon Amiga 500 Plus : A590, 2MB Chip, 2MB Fast, HD 1,2GB, Floppy ext.
                            Mon Amiga 1200 : Blizzard 1260, 2MB Chip, 256MB Fast, HD 80GB, Overdrive CD

                            #11637
                            PZAWA
                              • Level 6
                              • Messages : 316

                              Pourquoi Majikeyric ne fait plus partie des membres

                              Il s’est désinscrit ?

                              #11687
                              Staff
                              Jim Neray
                                • Level 22
                                • Messages : 7236

                                @Pzawa : En résumant très vite; Un membre a fait un commentaire qui ne lui était pas forcément destiné et qu’il a mal pris. Du coup je lui ai dit sur le ton de la plaisanterie qu’il avait du passer une mauvaise journée. Et … bah a priori il n’avait pas envie de plaisanter et il a demandé de supprimer son compte. Bref au final rien de très conséquent juste un mal entendu qui a glissé trop vite. :unsure:

                                A500 - A500 Plus - A600 HD - A1200 - A2000 - A3000 - A4000T - CD32 - C=64 - 1040STE - ...
                                Mon Amiga 500 Plus : A590, 2MB Chip, 2MB Fast, HD 1,2GB, Floppy ext.
                                Mon Amiga 1200 : Blizzard 1260, 2MB Chip, 256MB Fast, HD 80GB, Overdrive CD

                                #11692
                                PZAWA
                                  • Level 6
                                  • Messages : 316

                                  Merci pour ta réponse. Je me rappel effectivement de cet épisode … c’est quand même dommage :-(

                                Partager sur vos réseaux sociaux préférés :
                                Facebooktwitterredditpinterestlinkedintumblrmail
                                Affichage de 14 réponses de 1 à 14 (sur un total de 14)
                                • Vous devez être connecté pour répondre à ce sujet.