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. #21
    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
    Je viens de tester le port 60h pour voir ce que ca me donnais.

    J'ai juste mis cette ligne, et lorsque que je vais voir le contenu du registre al, il me dit qu'il y a le caractère A -> 65.
    J'ai fait une petite boucle pour que je puisse appuyer sur une touche que j'ai choisis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @@deb:
      IN    AL,60h
      CMP   AL,'z'
      JNE   @@deb
    Ca ne fait rien, j'ai toujours A dans AL. Pouvez-vous m'aider?

  2. #22
    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
    Les scancodes sont independants du clavier (azerty, qwerty) Ce sont les codes générs par le clavier, par exemple, ESC = 01h, & = 02h, é = 03h. En fait ils suivent le clavier. Voici un vieux code que j'ai un peu modifié :
    (c'était un code de test a l'epoque donc il est plutot mal ecrit)

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    .8086
    .model tiny
     
    .code      
            org     100h
     
    start:  mov ax, cs
            mov es, ax
            mov ds, ax
     
    Dbcl:   in al, 60h
     
            mov dl, al
            shr dl, 4
            cmp dl, 10
            jge Cf1
            add dl, '0'
            mov Buffer[0], dl
            jmp Cf2
    Cf1:    add dl, 'A'-10
            mov Buffer[0], dl
    Cf2:    and al, 0fh
            cmp al, 10
            jge Cf3
            add al, '0'
            mov Buffer[1], al
            jmp CfF
    Cf3:    add al, 'A'-10
            mov Buffer[1], al
     
    CfF:    mov ax, 1301h
            mov bl, 3fh
            mov cx, 0002h
            xor dx, dx
            xor bh, bh
            mov bp, offset Buffer
            int 10h
     
            jmp Dbcl
     
    Buffer  db '10'
     
        end     start
    Il est cecncé affiché le contenu du port 60h. A partirr de là tu regardes ce qui t'interesse. Si tu veux que quand on appuie sur 'z' il se passe quelque chose, appuie sur z, note le scancode, et modifie ton code pour qu'il réagisse à l'arrivé du scancode.

    P.S. reste appuyé sur la touche quand tu teste le scancode. Relacher une touche génère un autre scancode et efface donc celui qui t'interesse.

  3. #23
    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
    Ok merci je vais regarder ca à l'instant

  4. #24
    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
    Je vais encore "jetter de l'huile dans le feu", j'aime les choses bien faites (dans les limites de mes modestes compétences ...).
    Certes, l'unique instruction :
    est suceptible de fonctionner dans ce cas, car des codes sont probablement présents au moment de l'appel, cependant, dans d'autres cas certainement rares, je doute de son efficacité ...
    Et le jour ou elle posera problème (car cela me parait improblable que tu réecrives à chaque programme toutes tes procédures, à moins d'avoir du temps à perdre ), tu perdras surement une bonne partie de ton temps à chercher l'erreur , en pensant que en vue du nombre de fois ou tu l'auras utilisée sans problèmes, l'erreur ne viendra pas de là...
    C'est peut être un détail , qui peut un jour se transformer en casse_tête...
    Pour en revenir au cas ci dessus, je l'ai pas inventé, c'est écrit noir sur blanc dans toute bonne documentation relatant du contrôleur clavier.
    J'espère que vous me comprendrez ...

  5. #25
    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
    Moui c'est pas très clair mais bon je verrais par la suite quel moyen fonctionne le mieux mais pour l'instant les 2 systèmes fonctionnennt.

  6. #26
    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 être plus clair :

    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
     
    INPUT_FROM_KEYB:
            push    ax                      ; Sauvegarde le registre AX
     
            in      al,64h
            test    al,1                    ; Teste si la mémoire tampon du contrôleur
                                            ; contient un octet.
            jz      END_INPUT_FROM_KEYB     ; Si non, termine la procédure.
                                            ; Il y a aussi la possibilitée de boucler 
                                            ; sur INPUT_FROM_KEYB
                                            ; dans le but d'attendre qu'une touche 
                                            ; soit pressée.
    LECTURE_DU_PORT:
            in      al,60h                  ; Lecture à partir du port 60h
     
    ; ICI SERA INSERER LE CODE TRAITANT LES CODES GENEREES PAR LE CLAVIER
     
    END_INPUT_FROM_KEYB:
            pop     ax                      ; Restaure AX
            ret
    Je pense qu'il est nécessaire que tu te procures une doc récapitulant tous les codes générés par le contrôleur car dans certains cas, il y aura plusieurs lectures à effectuer sur le port 60h (voir l'autre message dans le forum sur l'int 9h).
    Je précise une fois de plus que la manip consistant à vérifier l'état du contrôleur par l'intermédiaire du port 64h n'est valable que dans le cas ou l'on passse outre l'interruption 9h.

  7. #27
    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
    quel problème peut bien entrainer une lecture éronée ? Si il en est une je ne crois pas que les consequences soient graves. En tout cas pas pour un jeu. Au pire tu peux toujours verifier via le port 61h. En fait l'utilisation de cette manière je l'ai vu dans quelques programmes que j'arrive a émuler.

  8. #28
    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
    quel problème peut bien entrainer une lecture éronée ?
    Tout dépend de ce qui repose sur cette lecture.C'est vrai que je dois paraître pointilleux, je voulais aussi mettre en évidence que ce principe de vouloir réduire le code à un strict minimum, en passant à la trappe les recommendations des différentes procédures préconnisées par les "datasheets" ,n'était pas très éducatif car on ne peut plus appeler cela de l'optimisation ...
    Je crois que le bit 7 du port 61h est généralement utiliser pour acquitter une lecture sur le port 60h et non pour vérifier la disponibilitée d'un code.

  9. #29
    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
    en parlant de ca, tu n'aurais pas une description détaillée du port 61h ?? celles que j'ai sont peu exhaustives

  10. #30
    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
    Voilà toutes les infos en ma possession :

    1> PORT 61h sur une plate-forme AT et +: Fonctions diverses et contrôle du haut parleur.
    Ce port contrôle le haut-parleur ainsi qu'un ensemble de fonctions systèmes internes.Sur l'AT, ce port se connecte au matériel discret. La pluspart des compatibles actuels considèrent l'interface matérielle comme un composant interne du chipset utilisé.L'utilisation première pour le programmeur consiste à générer des sons via le haut-parleur.
    Lorsque vous écrivez dans ce registre, assurez-vous que les bits 4 à 7 sont toujours positionnés sur zéro.Mieux encore, lisez la valeur et ne modifiez que les bits nécessaires à la fonction souhaitée.

    Sorties (bits 0-3), Entrées (bits 0-7)
    BIT:
    7(R) = 1 Erreur de parité RAM (uniquement lorsque activé par le bit 2)
    6(W) = 1 Vide le coupleur du timer IRQ0 (MCA uniquement)
    5(R) = x Sortie du timer 2 (8254 ou équivalent)
    4(R) = Horloge de demande d'actualisation divisée par 2
    3(R/W) = Active le contrôle de parité d'E/S, génère une NMI en cas d'erreur
    2(R/W) = 0 Active le contrôle de parité RAM, génère une NMI en cas d'erreur
    1(R/W) = 1 Données du haut-parleur activées
    0(R/W) = 1 Porte timer 2 ouverte

    2> PORT 61h sur une plate-forme PC/XT: Fonctions diverses et contrôle du haut parleur
    Ce port contrôle le haut-parleur ainsi qu'un ensemble de fonctions système internes sans rapport.Sur le PC et l'XT, ce port est le port de sortie B du circuit de l'interface du périphérique 8255.L'utilisation première pour le programmeur consiste à générer des sons via le haut-parleur.
    Si vous modifiez la valeur de ce port, commencez par lire ce qu'elle contient déjà, et ne modifiez que les bits nécessaires avant d'écrire la nouvelle valeur.

    E/S (bits 0-7)
    BIT:
    7(R/W) = 0 Désactive les connecteurs système sur le port 60h, active les données clavier, autorise l'IRQ clavier
    = 1 Active les connecteurs système sur le port 60h, désactive les données clavier, annule l'IRQ clavier
    6(R/W) = 0 Maintient l'horloge clavier en valeur basse
    5(R/W) = 0 Active le contrôle de parité d'E/S, génère une NMI en cas d'erreur
    4(R/W) = 0 Active le contrôle de parité RAM, génère une NMI en cas d'erreur
    3(R/W) = 0 Démarre le moteur de cassette (PC)
    2(R/W) = 0 Active la lecture des connecteurs pour obtenir la taille de la RAM (port 62h, bits 0-3)
    = 1 Active la lecture du connecteur de réserve (port 62h, bit 0)
    1(R/W) = 1 Données du haut-parleur activées
    0(R/W) = 1 Sortie de la porte du timer 2 vers le haut-parleur

    Texte tiré du livre PC Programmation Système.

  11. #31
    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
    Merci beacoup :))

  12. #32
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    8) Tous les bon programmeurs te le dirons...La meilleur façons de faire ton jeu et d'ailleur n'importe lequel est de passer par le port 60h...
    J'ai pu voir dans un de tes messages, il me semble que tu avais help-pc tu trouveras toutes les infos necessaire mais si tu as un problème, pas d'problème je peux t'aider.
    La porte la plus sûre est celle que l'on peut laisser ouverte.

  13. #33
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut
    Bonjour à tous

    Désolé pour cette intervention si tardive. L'utilisation de la fonction 01h de l'int 16h pour un jeu pose 2 problèmes :
    - problème de lenteur (faites ça sur un 386 et votre jeu sera injouable)
    - problème aussi si l'on appuie simultanément sur 2 touches (une flèche de direction et une touche de tir par exemple)
    - si on laisse une touche enfoncée, le BIOS laisse un délai avant répétition

    L'utilisation du port 60h règle le problème de la lenteur mais pas celui de l'appui simultané. Il faut noter aussi qu'il est bon de savoir lorsqu'une touche est relachée.. Enfin pour un jeu, je conseille de rediriger l'interruption 09h (IRQ 1 du clavier) et de mettre en mémoire un petit buffer de 256 octets comportant l'état enfoncé/relaché de chaque touche. Ce n'est pas si compliqué que ça et c'est bien pratique. J'ai fait un code source pour ceux que ça intéresse

    Woala woalaa a+

    Juju
    Avant de poster, merci de consulter les règles du forum

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

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

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