Partage
  • Partager sur Facebook
  • Partager sur Twitter

Assembleur 8086 MASM Lecture Clavier

Détection du mouvement (snake)

    30 mars 2020 à 19:06:57

    Bonjour, je suis actuellement en train d'essayer de programmer un snake en [/contents/15-introduction-a-l-assembleur assembleur] 8086 avec MASM mais je rencontre un problème que je n'arrive pas à résoudre (et cela fait plus d'une semaine que je cherche une solution)


    Dans le snake, il faut pouvoir détecter lorsqu'un changement de direction est demandé, pour cela pas de soucis on utilise la fonction 01  INT 16h qui renvoi un flag à 1 s'il détecte qu'une touche est dans le tampon clavier, sinon 0.


    Mon problème arrive lorsqu'il faut que je récupère le code de cette touche dans le tampon qui est censée être stockée dans le registre AX (AH pour le scan code et AL pour le code ASCII)


    Bien entendu je ne peux pas me servir de la fonction 00 INT 16h qui interrompt le proggrame dans l'attente d'un caractère.
    Cela fait une semaine que je cherche une solution mais malgré toutes mes tentatives le meilleur que j'obtiens est la détection (ça arrive qu'une fois) du changement de direction.

    Merci de votre aide

    InitialisationDeplacement:
        MOV AX,0                       ;Lecture clavier
        INT 16H 
        MOV BX, offset Direction
        MOV [BX], AH            
        JMP ChoixDeplacement

    EnregistrementNouvelleValeur:
        MOV BX, offset Direction
        MOV [BX], AH

        JMP ChoixDeplacement

    ComparaisonFleche:
        CMP AX,4800h
        JE EnregistrementNouvelleValeur
        CMP AX,4B00h
        JE EnregistrementNouvelleValeur
        CMP AX,4D00h
        JE EnregistrementNouvelleValeur
        CMP AX,5000h
        JE EnregistrementNouvelleValeur
        JMP ChoixDeplacement

    ChoixDeplacement:
        MOV BX, offset Direction
        CMP [BX],48h
        JE  DeplacementHaut
        CMP [BX],4Bh
        JE  DeplacementGauche
        CMP [BX],4Dh
        JE  DeplacementDroite
        CMP [BX],50h
        JE  DeplacementBas
        JMP InitialisationDeplacement                                               


    DeplacementHaut:
        MouvementSerpentHaut            ;Le serpent se déplace vers le haut de 1 pixel
        ;TestMur                       
        JMP Attente

    DeplacementGauche:
        MouvementSerpentGauche
        ;TestMur
        JMP Attente

    DeplacementDroite:
        MouvementSerpentDroite
        ;TestMur
        JMP Attente

    DeplacementBas:
        MouvementSerpentBas
        ;TestMur
        JMP Attente

    Attente:
        MOV  CX, 0          ;foncion qui permet d'attendre un certain laps de temps
        MOV  DX, 0ffffh
        MOV  AX, 0086h
        INT  15h
       
        MOV AX,0001H
        INT 16h 
        JNZ  ComparaisonFleche

        JMP ChoixDeplacement

    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2020 à 17:01:17

      Bonjour.

      En effet en assembleur il n'y a pas de solution simple pour résoudre ce problème de lecture à la volée d'une touche.

      Il faudrait que tu recherches sur les forums de programmation de jeux en assembleur pour ton système d'exploitation ou sur stackoverflow.

      Avec des assembleurs plus modernes, pour Windows, il faudrait voir du coté de l'API Microsoft.

      Et pour Linux, il y a une solution qui consiste à modifier l'état du terminal pour inhiber l'attente de la lecture de la touche puis de mettre en place dans une boucle un écouteur d'évenement sur l'entrée standard. Si l'utilisateur appuie sur une touche, il est possible de lire la valeur de la touche sans blocage et donc de continuer l'animation. Cette solution fonctionne bien mais je ne l'ai utilisée que sur le raspberry pi avec un processeur ARM.

      Bonne recherche.

      • Partager sur Facebook
      • Partager sur Twitter
        31 mars 2020 à 17:30:22

        Mon petit doigt me dit que son code est sur MS-DOS :D
        • Partager sur Facebook
        • Partager sur Twitter
          9 avril 2020 à 19:44:56

          a priori si il faut passer par ah=1 int 16 pour détecter si on a appuyé sur un touche puis par ah=0 int 16 pour la lire cf ce forum https://stackoverflow.com/questions/13143774/how-to-read-key-without-waiting-for-it-assembly-8086
          • Partager sur Facebook
          • Partager sur Twitter

          Assembleur 8086 MASM Lecture Clavier

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown