IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Interruptions clavier - Ports 60h et 61h


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Points : 10
    Points
    10
    Par défaut Interruptions clavier - Ports 60h et 61h
    Bonjour à tous!

    Voilà une question bien interessante pour moi :
    Sachant bien évidemment qu'il existe une interruption pour l'attente
    d'une touche clavier, mon interrogation se pose ici: pourtant cette
    interruption attend un appui... hors que moi je veux une interruption qui
    teste si un caractère a été entré au clavier à tout moment, sans
    attendre une touche clavier...

    En fait, la raison de cette question est déduite d'un dévellopement d'un jeu...Tron, faisant appel à un affichage successif de pixel dont le sens change selon la touche entrée, mais cette succession de pixel est continue et ne peut être hachée par l'attentte d'une touche.

    Un grand merci à vous tous!

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    salut,
    Je pense qu'il suffit d'utliser la fonction 1 de l'int 16h au lieu de la fonction 0.
    En effet, la fonction 1 (AH=1) vérifie si une touche se trouve dans la mémoire tampon. Si une touche est disponible, indicateur zéro=0 sinon =1.
    Attention toutefois, le code de balayage et la valeur ASCII sont renvoyés dans AX , mais ne sont pas supprimés de la mémoire tampon.

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 413
    Points
    59 413
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Je pense que, pour ton jeu, tu dois absolument passer par une redirection de l'interruption matérielle 09h, qui te permet de détecter lorsqu'une touche est enfoncée ou relâchée (par lecture du port 60h).
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Effectivement je viens de regarder dans helppc et j'ai vu l'int 16h, 01h et je pense que je vais utiliser la solution de alcatîz parce qu'il me semble que celle de aznood est beaucoup plus compliquée.
    Merci à vous pour vos réponses.

  5. #5
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Tu t'es pas un peu trompé ? parcequ'a mon aivs, c'est la solution qui demande de detournet l'int09h qui est plus compliqué (proposé par Alcatîz)
    D'ailleurs, je veins de poster qq chose la dessu(si ca t'intéresse...)
    L'autre solution est plutot facile....
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    C'est exact, le détournement de l'interruption est aussi à mon avis moins simple ...
    Ceci étant dit, pourquoi vouloir faire compliqué lorsque l'on peut faire simple ? La demande initiale portant sur l'existence d'une interruption autre que celle qui attend une touche, et l'émetteur de la question n'ayant pas à priori connaissance de cette autre fonction, je me demandais si ca n'étais pas "vouloir etaler sa science" que de lui proposer ce fameux détournement ?
    N'est il pas judiscieux d'adapter les réponses en fonction de la complexité de la demande ?
    En toute amitié ... AznOod

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Pour répondre à Albest, je suis intéresser par vos solutions et voici la mienne.

    C'est un jeux multijoueurs, les touches de directions sont : z,q,s,d et o,k,l,m. Ma procédures fonctionne mais donner moi vos solutions pour voir ce que ca donne et connaître un système en plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    test1 proc
      @@deb:
        MOV   AH,01h
        INT   16h
        JZ    @@deb
        CMP   AL,'z'
        JE    @@z
        CMP   AL,'q'
        JE    @@q
        CMP   AL,'s'
        JE    @@s
        CMP   AL,'d'
        JE    @@d
        CMP   AL,'o'
        JE    @@o
        CMP   AL,'k'
        JE    @@k
        CMP   AL,'l'
        JE    @@l
        CMP   AL,'m'
        JE    @@m
        JMP   @@deb
        @@z:
        @@q:
        @@s:
        @@d:
        @@o:
        @@k:
        @@l:
        @@m:
      RET
    test1 endp
    Il subsite toute fois un problème dans ma fonction, lorsque que je l'exécute et que j'appuie sur une autre touche (que celle qui m'intéresse), le programme se plante mais si je le lance via td pour le tester, il fonctionne nickel.
    Est-ce que ce bug est du à la rapidité de l'éxécution de l'assembleur?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    Comme je l'ai préciser dans mon précédent message, l'utilisation de la fonction 1 de l'interruption 16h ne supprime pas les codes de la touche de la mémoire tampon... et donc une disponibilité redondante de ces codes ...
    Dites moi si je me trompe personne n'est à l'abris d'une erreur

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    non effectivement après les testes de la fonction, il reste quelque chose dans le buffer. J'ai vu qu'il existait une int qui permet de vider le buffer mais apparement qui demande l'appui d'une touche et donc pas ce que je désire faire.
    Quelqu'un aurait une solution?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    ok, dans ce cas, si une touche est disponible dans le buffer, il n'y aura pas d'attente de touche non ?
    Tiens moi au courant

  11. #11
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Il y a bien la solution de simuler l'appui sur une touche mais c un peu BOURRIN donc je te propose la fonction 0Ch de l'int 21h qui permet de vider le buffer d'entrée...

    Entrée :

    AH = 0Ch
    AL = Numéro de la fonction d'appel
    Pour l'appel de la fonction 10 :
    DS = Adresse de segment du buffer d'entrée
    DX = Adresse d'offset du buffer d'entrée

    Sortie :

    Pour les fonctions 01h, 06h, 07h et 08h :
    AL = le caractère entré
    Pour la fonction 0Ah : aucune
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Merci les gars ca fonctionne j'ai rajouté 3 lignes qui vide le buffer (thx Albest) et maintenant ca fonctionne du nickel.
    Grand merci.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    Juste une petite question qui me tourmente avant de clôturer définitivement ce problème, pourrais tu me dire comment tu as appeler la fonction 0ch ? avec quels paramètres ?

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Bien sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MOV   AH,0Ch
    MOV   AL,0Ah
    INT    21h
    Voilà +.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    il y avait un autre moyen très simple, sans aller jusqu'a détourner une interruption. Par définition le port 60h retourne le dernier scancode. Ce qui veux dire, qu'on peut remplacer l'interruption par un "in al, 60h" qui a l'avantage de ne pas dépendre du clavier, (interessant pour un jeux) et qui permet d'utiliser les touches telles que les flèches directionelles (interessant aussi).

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    oui mais dans ce cas, il faut intercepter le code avant que le handler de l'int 9h ne le fasse ce qui me parait irréalisable a moins de désactiver l'interruption au niveau du PIC non ? ...
    Et il faudrait dans ce cas vérifier l'état de la mémoire tampon du contrôleur (port 64h) afin de s'assurer qu'un octet est bien dispo ...
    En ce qui concerne la méthode de l'appel de l'interruption 0ch, cela me parait réellement douteux et inadapté ...

  17. #17
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Heu les gars c'est bbon là, ca fonctionne et pour l'instant je ne vois pas l'intéret d'utiliser le port 60h (en plus que je ne sait comment l'utiliser).
    Merci en tout cas pour les réponses.

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Bon, je recommence encore une fois, surtout pour AznOod. Le port 60 ah, retourne le dernier scancode généré par le clavier. Que l'int 09h lise le port 60h ou non, cela ne modifie en rien la prochaine valeur lue. L'utilisation en revanche est encore plus simpel que ce qui est imaginable. Pour avoir le dernier scancoded dans al il faut faire : (attentiopn la suite d'instruction qui suit n'est pas d'une incomprehensibilité insurmontable)

    pas une de plus pas une de moins. Et vous pouvez integrer ca a la place de l'appel de l'int 16h.

  19. #19
    Membre à l'essai
    Inscrit en
    Juin 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Apparement ca na rien de sorcier d'utiliser le port 60h donc je pense que je vais me rabattre sur cette solution.
    J'ai juste une question, le scancode est sous qu'elle forme?

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    Pour ce qui du dernier code de balayage généré par le clavier, je te fais confiance Blustuff, je n'ai pas été vérifié ...
    En revanche , là ou je ne suis pas d'accord, c'est sur le fait qu'il faille utiliser une seule et unique instruction!
    En effet, vu que tu n'utilises pas les interruptions, il n'est pas évident qu'une touche soit dispo, surtout lors de la première lecture !
    Il est donc nécessaire d'aller vérifier au moins une fois le bit 0 du port 64h soit poistionné à 1 ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2005, 12h18
  2. [MFC] interruption clavier (KEYBOARD) [MFC]
    Par pi05 dans le forum MFC
    Réponses: 3
    Dernier message: 06/04/2005, 14h44
  3. Utiliser l'interruption clavier
    Par Ninkosen dans le forum x86 16-bits
    Réponses: 7
    Dernier message: 28/03/2003, 01h01
  4. interruption clavier
    Par pyrostan dans le forum C
    Réponses: 4
    Dernier message: 13/01/2003, 17h33
  5. interruption materiel port parrallele
    Par pyrostan dans le forum C
    Réponses: 2
    Dernier message: 13/01/2003, 08h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo