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 :

Utiliser l'interruption clavier


Sujet :

x86 16-bits Assembleur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Utiliser l'interruption clavier
    bon j'écris un mini os... j'avance un peu... je suis en pmode, l'idt, la gdt sont chargées, ainsi que 2 routines d'interruptions, dont la 09h...
    Donc si je me trompe pas lorsque l'on appuie sur une touche du clavier l'int 09h doit etre lancée non ? ben fo croire que non parce que je suis censé voir s'afficher un caractère si l'on appuie sur une touche (tjs le même quelque soit la touche pour le moment....mais peu importe)....
    Donc ce serait pê lié au fait qu'il faut faire quelquechose pour lancer le PIC, non ? enfin je patoge un peu lol donc si vous pouviez me dire ce que j'ai oublié je vous serait reconnaissant
    merci.

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 65
    Points : 105
    Points
    105
    Par défaut
    Bonsoir,

    Bon effectivement ceci n'est pas spécialement évident. Mais il existe une tripotée de doc existantes sur le net (google...).

    Les PIC maitre et esclave doivent être préalablement configuré selon les int. que tu souhaites utiliser. Voila un bout de code que j'utilise dans mon os pour cette tache:
    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
     
    ;----------------------------------------
    ; master and slave PICs initialization
     
     
    pic_init:
    	mov	al,0x11		; master PIC ICW1: 
    	out	0x20,al		; bit 0: will be sending ICW4
    				; bit 4: always set
    	jmp	$+2		; wait a bit for hardware reaction
    	out	0xA0,al		; slave PIC ICW1
    	jmp	$+2
    	mov	al,0x08		; master PIC ICW2:
    	out	0x21,al		; 2nd INTA pulse behavior
    	jmp	$+2
    	mov	al,0x70		; slave PIC ICW2
    	out	0xA1,al
    	jmp	$+2
    	mov	al,0x04		; master PIC ICW3:
    	out	0x21,al		; IR2 is connected to slave PIC
    	jmp	$+2
    	mov	al,0x02		; slave PIC ICW3, ID is 2
    	out	0xA1,al
    	jmp	$+2
    	mov	al,0x01		; master PIC ICW4:
    	out	0x21,al		; 8086 mode
    	jmp	$+2
    	out	0xA1,al		; same for slave
    	jmp	$+2
    	mov	al,0xB8		; master OCW1:
    	out	0x21,al		; allowed hardware IRQs are: IRQ0 (system timer), IRQ1 (keyboard)
    	jmp	$+2		; IRQ 6 (floppy) , IRQ 2 (slave IRQs 8-15 redirection)
    	mov	al,0xFF		; all slave PIC IRQs masked
    	out	0xA1,al
    	ret

    En l'occurence ici, timer keyboard & floppy interrupts seront activés.
    Les jump relatifs sont simplement là pour attendre une réaction du matériel après chaque out. Je te conseille http://www.nondot.org/~sabre/os/arti...aneousDevices/ pour plus d'infos sur les PIC.

    Il faut ensuite etre sur de son idt. et des interrupt descriptors. Vérifie si l'adresse contenue dans tes int. descriptors pointent bien sur ta routine.

    Ta deuxième int. (j'imagine timer) déclenche t-elle correctement ? En général au lancement de ton système tu devrais être CPL0. Une interrupt de niveau 0 déclenchée lorsque le niveau de niveau de privilège est numériquement supérieur provoquera une exception (typiquement general protection). Si cette exception n'est pas gérée par ton système tu aboutis a un beau crash voire une belle triple fault.

    Vérifie de plus qu'IDTR soit correctement chargé avec l'adresse de ta table.

    Il ne va pas sans dire que toutes ces opérations préalables doivent être effectuées int. disablées (cli). Là encore, avoir IDTR invalide avec les interruptions activées conduit irrémédiblement à un crash. Une fois que ton setup est bon tu peux lancer naturellement un sti.

    Autre point: tant que tu ne commutes pas des taches, il est important de disabler les interrupts au début de ton ISR. Une ISR se termine par un EOI (end of interrupt) envoyé au PIC, un éventuel sti et un iret. Typiquement, une ISR peut ressembler a ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	cli
    	inc	byte [0x000B8000]
    	mov	byte [0x000B8001],0x07
    	mov	al,0x20
    	out	0x20,al
    	sti
    	iret
    l'inc et le mov sont simplement là pour afficher quelque chose en haut à gauche de l'écran pour montrer qu'il y a de l'activité. Si tu utilises ce morceau de code pour ton int. keyboard, tu devrais voir quelque chose bouger dans ce coin de l'écran à chaque frappe de touche.

    Autre chose: ton int. descriptor doit être à la 33ème position dans ta table (si ta table est composée d'élément de 4 octets, longueur de l'int. descriptor). soit à l'offset 36 depuis le début de ta table.

    Un dernier conseil de vieux routard: utilise un emu genre bochs ou un vieux pc pour faire tes essais si tu veux pas cramer ton alim avec des redémarrages fréquents.

    Voilà c'est tout ce qui me vient à l'esprit.

    golem
    +++

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonsoir j'ai bien pris note de tout ce que tu m'as dit, j'espère que ça ne ta pas pris trop de temps mais je te remercie en tous k

    Cependant ca ne marche toujours pas
    Bon... mon idt est correcte, et mon idtr pointe bien sur celle ci....
    En fait ce que j'ai fait c'est que je fait pointer toutes les int sur un code contenant iret uniquement (parce que c vrai que j'ai eu des probs sans ça , sans doute l'int timer dont tu me parlais qui se lancait), excepté la 20h qui contient des routines d'affichage et la 09h ou j'ai mis un truc dans le genre que tu m'a filé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    INT09H:
    	PUSH	AX DS
    		MOV	AX, 0030H ;segment video B8000
    		MOV	DS, AX
    		INC 	BYTE PTR DS:[0]
    		MOV	BYTE PTR DS:[1], 07h
    	POP	DS AX
     
    	MOV   	AL,20h
      	OUT   	20h,AL
     
    	IRET
    rq: j'ai pas mis de cli/sti je pense quand même pas que pour si peut d'instructions il soit indispensable
    Donc mon boot charge tout le bordel de la disquette en mémoire et passe la main a un main qui utilise l'int 20h pour faire quelques affichages test (ca fonctionne, ce qui prouve que l'interruption que je lance se produit et se termine bien), après, ca se termine par une boucle infinie...et juste avant celle ci j'ai mis le code pour initialiser le pic que tu m'a filé et apparement il attribu l'irq1 au clavier cad l'int 09h....
    Donc pendant le boucle infini j'ai beau m'acharner sur le clavier il ne se passe rien, ni plantage ni rien


    Un dernier conseil de vieux routard: utilise un emu genre bochs ou un vieux pc pour faire tes essais si tu veux pas cramer ton alim avec des redémarrages fréquents.
    je fais bien sûr mes tests sous bochs 8)

    le seul truc que je comprend pas c'est ça :
    Autre chose: ton int. descriptor doit être à la 33ème position dans ta table (si ta table est composée d'élément de 4 octets, longueur de l'int. descriptor). soit à l'offset 36 depuis le début de ta table.
    je suis en mode protégé donc les vecteurs d'int. font 8 octets pas 4 (mode réel)....et tu dis 33ème position tu veux dire qu'il ne doit pas se trouver dans les 32 1ers et pour être plus précis en 9ème position ? Ton offset 36 (9*4) me laisse présupposer que si....
    En tous k une chose est sûre mon vecteur int20h marche nikel et pointe bien sur ma routine d'affichage donc je présume que la 09h est correcte....

    Donc je vois pas....vraiment pas ce qui manque...
    Si toi ta une idée, je suis tout ouie

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    bon j'ai des nouvelles fraiches pour mon problèmes
    j'ai rajouté l'interruption de l'irq0 cad le timer....et je suis ravi de voir que toutes les 18.2 fois par secondes il se passe quelquechose :o
    de plus depuis que j'ai mis cette routine en plus, lorsque j'appuie une fois sur une touche, il y a bien une réaction qui se produit cad incrémentation du caractère en haut a gauche de l'écran, seulement cela ne se produit qu'une seule et une seule fois.....j'ai beau réappuyé, l'incrément ne se fait plus....
    si quelqu'un a des idées... 8)

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 65
    Points : 105
    Points
    105
    Par défaut
    Bonsoir,

    je suis en mode protégé donc les vecteurs d'int. font 8 octets pas 4 (mode réel)....et tu dis 33ème position tu veux dire qu'il ne doit pas se trouver dans les 32 1ers et pour être plus précis en 9ème position ? Ton offset 36 (9*4) me laisse présupposer que si....
    tu as parfaitement raison, j'ai dit une grosse connerie.


    j'ai pas mis de cli/sti je pense quand même pas que pour si peut d'instructions il soit indispensable
    je suis sûr du contraire (i.e. tu peux parfaitement avoir une int. en plein milieu de tes quelques instructions. Je l'ai doulouresement expérimenté de maintes fois).

    seulement cela ne se produit qu'une seule et une seule fois.....j'ai beau réappuyé, l'incrément ne se fait plus....
    vérifie bien que tu as tes EOI (mov al,20h; out 20h,al) dans chacune de tes ISR. Si tu en oublies un, tu auras un premier déclenchement pour une int. puis tu ne recevras plus du tout d'interruptions ultérieurement car le PIC attend son EOI. Ca ressemble beaucoup à ce que tu me décris là.

    Allez bon vent.

    golem
    +++

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    merci pour ton aide golem....
    j'aimerai te dire que ca marche mais ce n'est point le cas
    l'eoi est bien envoyée au pic a la fin de chacune des deux isr.... j'ai tracé le programme pour en être sûr, puis en plus, l'int timer fonctionne toujours même après avoir appuyé une première fois sur une touche...car mon timer fait le même système d'incrément mais sur le deuxième caractère de l'écran...qui ne cesse donc de changer....c'est comme si après l'appuie sur une touche le pic ignorait l'int09h seule car la 08h il la déssert toujours....enfin c'est imcompréhensible...

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 65
    Points : 105
    Points
    105
    Par défaut
    Bonsoir,

    La dernière idée qui me vient est que j'ai le sentiment que le controleur clavier ne déclenchera pas d'autre interruption tant que tu n'as pas lu (... acquité) le dernier caractère pour lequel il a envoyé une int.

    Essaye un truc du genre dans ton ISR clavier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    .wait_buf 
    	in	al,0x64     ; lire status
    	test	byte al,1   ; bus de sortie pret ?
    	jz	.wait_buf  ; non => boucler
    	in	al,0x60    ; chopper scancode

    Dans al tu as le scancode (make puis break code) de la touche. Essaye de l'afficher, ca te permettra de vérifier si c'est bien ce que tu viens de tapper. Attention, on ne parle pas de code ascii ici mais bien de scancode.


    Bon courage

    golem
    +++

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    merci golem !!!
    mille fois merci !!!
    ton diagnostic a été vraiment époustouflant, même mon proc n'en reviens pas
    ca venait donc bien du controlleur clavier qui souhaitait que l'on parle un peu avec lui

    Je te remerci beaucoup golem, tu m'as été d'une aide précieuse
    A la prochaine 8)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Forum] Utiliser les Raccourcis claviers ASCII sur ce forum ?
    Par ®om dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 6
    Dernier message: 25/05/2006, 21h41
  2. Réponses: 2
    Dernier message: 21/04/2005, 12h18
  3. [MFC] interruption clavier (KEYBOARD) [MFC]
    Par pi05 dans le forum MFC
    Réponses: 3
    Dernier message: 06/04/2005, 14h44
  4. Interruptions clavier - Ports 60h et 61h
    Par Paradam dans le forum x86 16-bits
    Réponses: 32
    Dernier message: 10/07/2003, 11h09
  5. interruption clavier
    Par pyrostan dans le forum C
    Réponses: 4
    Dernier message: 13/01/2003, 17h33

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