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 :

Détournement de l'IRQ12


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut Détournement de l'IRQ12
    Bonjour,
    lorsque je détourne l'adresse du gestionnaire de l'IRQ12 (int 74h=événement souris),ma routine ne s'exécute que lors du premier événement souris détecté
    mais pas pour les suivant.

    ex: un code où j'affiche simplement une lettre à chaque IRQ12 déclenchée.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    org 100h
     
    mov ax,cs
    mov ds,ax
     
    ;sauvegarde du pointeur originale sur IRQ 12=int 74h (souris)
     
    push 0
    pop es
    mov si,74h
    shl si,2
     
    cli
    mov ax,[es:si]
    mov [offset_IRQ12_original],ax
    mov ax,[es:si+2]
    mov [segment_IRQ12_original],ax 
     
    ;mis en place de notre IRQ12 perso
     
    mov ax,souris
    mov [es:si],ax		;offset
    mov ax,cs
    mov [es:si+2],ax	              ;segment
    sti
     
    ;mode texte 80*25 16 couleurs
     
    mov ah,0	
    mov al,3h
    int 10h
     
    ;boucle infinie
     
    jmp $
     
    ;restauration de IRQ12 original (qu'on n'atteint jamais ici)
     
    cli
    push 0
    pop es
    mov si,74h
    shl si,2
    mov ax,[offset_IRQ12_original]
    mov [es:si],ax
    mov ax,[segment_IRQ12_original]
    mov [es:si+2],ax
    sti
     
    ret
     
    ;-----------------------
    souris:
     
    push ax
    push bx
    push cx
     
    mov ah,9
    mov al,'A'
    mov bh,0
    mov bl,2
    mov cx,1
    int 10h                 ;affiche 'A'
     
    mov cx,65535	;tempo
    A: loop A
     
    mov ah,9		
    mov al,' '
    mov bh,0
    mov bl,2
    mov cx,1
    int 10h                 ;efface 'A'
     
    pop cx
    pop bx
    pop ax
     
    iret
    ;-----------------------
    offset_IRQ12_original	resw	1
    segment_IRQ12_original	resw	1
    la lettre ne s'affiche que lors du premier mouvement de la souris,pas pour les suivants.
    Qu'est ce qui ne va pas ?

  2. #2
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    il suffit de dire a la puce qui gère les IRQ que celle ci a bien été traité sinon la puce en question ne génèrera pas l'irq12 la fois suivant croyant que la précédente n'aurait pas été traité, la puce en question s'appelle PIC(programmable interrupt controller)

    c'est assez simple a faire il suffit d'envoyer une commande a la puce, un simple octet a envoyer sur un port d' E/S, mais je ne me souviens plus lequel exactement

    par contre il y a deux PIC qui gère chaqun 8 irq, il faut bien faire attention a envoyer l'aquitement de l'irq a la bonne puce

  3. #3
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    Meci pour ta réponse Bifur,je vais chercher dans cette direction.
    Bonne prog.

  4. #4
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    j'ai trouvé l'info;

    acquittement d'une irq;
    toutes irq (sauf 8 à 15)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mov al,20h
    out 20h,al
    irq de 8 à 15; (pic escalve)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov al,20h
    out 0A0h,al
    out 20h,al
    Mais ça ne marche toujours pas.Que je mette ces "out" en début ou en fin de ma routine,ça m'affiche la lettre 'A' sans l'effacer et puis ça bloque ???

  5. #5
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    je dirait que c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov cx,65535	;tempo
    A: loop A
    qui se met en boucle infinie, mais je ne connait pas suffisament l'instruction loop pour être affirmatif sur ce point

    a la place j'essayerais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mov cx,65535
    tempo:
    dec cx
    jnz tempo
    par contre je pense que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mov ah,9		
    mov al,' '
    mov bh,0
    mov bl,2
    mov cx,1
    int 10h                 ;efface 'A'
    n'efface pas A mais ajoute un espace juste après A, je dit ça de mémoire j'en suis pas sur

  6. #6
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Bonjour,

    Ce n'est peut-être pas la cause du problème, mais à ta placé j'éviterais
    d'utiliser une int dans une int.

    essayes d'écrire ton caractère directement en accès mémoire.
    pas dur en mode texte, segment = B800h
    1er octet = code ASCII
    2eme octet = couleur (ne pas laisser à 00h sinon on voit rien ! )

    j'attends de tes news

    à plus François

  7. #7
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    Bonjour Forthman,

    Merci pour ta réponse.
    J'ai suivi tes conseils,mais ça ne marche toujours pas.

    (je suis sous dosbox avec Windows 8)

    voici le code;

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
     
    org 100h
     
    %macro affiche 4
    	;%1=x,%2=y,%3=LPtext,%4=couleur
    	mov si,%3
    	mov bx,%1
    	mov di,%2
    	mov ah,%4
    	call VGA3
    %endmacro
     
    mov ax,cs
    mov ds,ax
     
    ;sauvegarde du pointeur originale sur IRQ 12=int 74h (souris)
     
    push 0
    pop es
    mov si,74h
    shl si,2
     
    cli
    mov ax,[es:si]
    mov [offset_IRQ12_original],ax
    mov ax,[es:si+2]
    mov [segment_IRQ12_original],ax 
     
    ;mis en place de notre IRQ12 perso
     
    mov ax,souris
    mov [es:si],ax		;offset
    mov ax,cs
    mov [es:si+2],ax	;segment
    sti
     
    ;passage en mode texte 80*25 16 couleurs
     
    mov ah,0	
    mov al,3h
    int 10h
     
    ;tester souris
     
    jmp $		;boucle infinie
     
    ;restauration de IRQ12 original (qu'on atteint jamais ici)
     
    cli
    push 0
    pop es
    mov si,74h
    shl si,2
    mov ax,[offset_IRQ12_original]
    mov [es:si],ax
    mov ax,[segment_IRQ12_original]
    mov [es:si+2],ax
    sti
     
    ret
     
    ;-----------------------
    souris:
     
    push ax
    push bx
    push cx
     
    push es
     
    mov ax,0B800h
    push ax
    pop es
    affiche 0,0,mess,1110b
     
    mov ax,0B800h
    push ax
    pop es
    affiche 0,0,mess1,1110b
     
    pop es
     
    ;acquittement
     
    mov al,20h
    out 0A0h,al	;pic escalve (irq 12 gérée par irq2 du maitre)
    out 20h,al	;pic maitre
     
    pop cx
    pop bx
    pop ax
     
    iret
    ;---------------------------
    VGA3:	;si=LPtext,bx=x,di=y,ah=couleur,es=B800h
    	pushad	
    	shl bx,1
    VGA3_debut:
    	lodsb		
    	cmp al,0	
    	jz VGA3_fin
    	mov [es:di+bx],ax
    	inc bx
    	inc bx
    	jmp VGA3_debut
    VGA3_fin:
    	popad
    	ret
    ;---------------------------
    offset_IRQ12_original	resw	1
    segment_IRQ12_original	resw	1
    mess	db	'ça marche pas...',0
    mess1	db	'                ',0
    en fait une fois que l'on a cliqué sur la souris,le message s'affiche et s'efface indéfiniment.C'est comme si l'irq n'était jamis finie.Pourtant j'envoie bien le code d'acquittement.

  8. #8
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    on est sous émulateur....j'aime pas les émulateurs c'est un peu ma kryptonite comme diraient certains

    théoriquement l'irq souris est appelé chaque fois que l'ordinateur a reçu un octet de la souris, peut être faut t'il simplement lire l'octet reçu par le port souris? (port 60h)



    en bonus la routine que j'ai écrit pour intercepter l'irq souris dans mon mini os (c'est pas fini mais ça peut servir)
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    irqsouris:
    push ax
    push bx
    push si
    push ds
     
    mov bx,seldat
    mov ds,bx
     
    mov bl,[nbzt1]       ;charge le nombre d'octet déja reçu
    xor bh,bh
    mov si,bx
    inc bl
    mov [nbzt1],bl       ; et l'incrémente
    in al,60h
    mov [zts1+si],al    ;met le caractère reçu dans la zt souris
    cmp [nbts1],bl
    jne finirqs         ;si la trame n'as pas été totalement reçu -> fin
     
     
    xor al,al            ;on décode, d'abord mettre le compteur de la trame a zéros
    mov [nbzt1],al
     
    mov al,[zts1]       ;extrait le déplacement en x
    xor bh,bh
    mov bl,[zts1+1]
    test al,10h
    jz noadjx1
    not bh
    noadjx1:
    add [xs1],bx      ;et l'additionne (c'est un nombre signé)
     
    xor bh,bh         ;extrait le déplacement en y
    mov bl,[zts1+2]
    test al,20h
    jz noadjy1
    not bh
    noadjy1:
    sub [ys1],bx     ;et l'additionne (c'est un nombre signé)
     
    mov ax,[xs1]                     ;ajuste la position x de la souris par
    cmp ax,[resx]                    ;rapport a la résolution de l'écran
    jng passupxs1
    mov ax,[resx]
    passupxs1:
    cmp ax,0
    jnl pasinfxs1
    mov ax,0
    pasinfxs1:
    mov [xs1],ax
     
    mov ax,[ys1]                   ;ajuste la position y de la souris par
    cmp ax,[resy]                  ;rapport a la résolution de l'écran
    jng passupys1
    mov ax,[resy]
    passupys1:
    cmp ax,0
    jnl pasinfys1
    mov ax,0
    pasinfys1:
    mov [ys1],ax
     
    ;**************************************
    ;que faire du "clic"
    mov al,[zts1]    
    test al,1
    jz stopbip
    mov al,3
    out 61h,al        ;allume le bipper
    jmp finirqs
     
    stopbip:
    mov al,0
    out 61h,al        ;‚teint le bip
    ;**************************************
     
    finirqs:
    mov al,20h
    out 0A0h,al
    mov al,20h
    out 20h,al
    pop ds
    pop si
    pop bx
    pop ax
    sti
    iret

  9. #9
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    Merci bifur pour ta routine sur la gestion souris.
    Je vais essayé de trouver un Windows xp pour voir ce que ça donne en mode V86.

  10. #10
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    j'ai essayé sur un xp,le prog plante dès que je déclenche un événement souris
    J'ai ensuite simplement lu le premier octet des données normalement envoyés par la souris sur le port 60h lors du déclenchement de l'irq 12 mais ça ne correspond pas . (cad que lorsque je click sur le bouton droit on doit normalement avoir le bit 0 du premier octet armé,mais à priori ce n'est pas le cas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    in al,60h	;lecture du premier octet de la trame
    test al,1	;click droit ?
    jz suite   ;si non va à suite
    le branchement ne se fait pas à la ligne suivant le jz suite quand je click sur le bouton droit de la souris.

    voici le code;

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
     
    org 100h
     
    %macro affiche 4
    	;%1=x,%2=y,%3=LPtext,%4=couleur
    	mov si,%3
    	mov bx,%1
    	mov di,%2
    	mov ah,%4
    	call VGA3
    %endmacro
     
    mov ax,cs
    mov ds,ax
     
    ;sauvegarde du pointeur originale sur IRQ 12=int 74h (souris)
     
    push 0
    pop es
    mov si,74h
    shl si,2
     
    cli
    mov ax,[es:si]
    mov [offset_IRQ12_original],ax
    mov ax,[es:si+2]
    mov [segment_IRQ12_original],ax 
     
    ;mis en place de notre IRQ12 perso
     
    mov ax,souris
    mov [es:si],ax		;offset
    mov ax,cs
    mov [es:si+2],ax	;segment
    sti
     
    ;passage en mode texte 80*25 16 couleurs
     
    mov ah,0	
    mov al,3h
    int 10h
     
    ;tester souris
     
    mov ax,65535            ;boucle pour patienter 65535*65535
    B:
    mov cx,65535
    A: loop A
    dec ax
    jnz B
     
    ;restauration de IRQ12 original
     
    cli
    push 0
    pop es
    mov si,74h
    shl si,2
    mov ax,[offset_IRQ12_original]
    mov [es:si],ax
    mov ax,[segment_IRQ12_original]
    mov [es:si+2],ax
    sti
     
    ret
     
    ;-----------------------
    souris:
     
    cli
    push ax
    push bx
    push cx
    push si
    push di
     
    in al,60h	               ;lecture du premier octet de la trame
    test al,1                 ;click droit
    jz suite
     
    push es
    mov ax,0B800h
    push ax
    pop es
    affiche 0,0,droit,1110b    ;affichage du message "click droit"
     
    mov cx,65535                ;tempo
    C: loop C
     
    mov ax,0B800h
    push ax
    pop es
    affiche 0,0,blanc,1110b    ;effacement du message "click droit"
     
    pop es
     
    suite:
     
    mov al,20h           ;acquitement
    out 0A0h,al	;pic escalve (irq 12 gérée par irq2 du maitre)
    out 20h,al	;pic maitre
     
    pop di
    pop si
    pop cx
    pop bx
    pop ax
     
    fin:
    sti
    iret
     
    ;------ routine d'affichage en ram vga directe
     
    VGA3:	;si=LPtext,bx=x,di=y,ah=couleur,es=B800h
    	pushad	
    	shl bx,1
    VGA3_debut:
    	lodsb		
    	cmp al,0	
    	jz VGA3_fin
    	mov [es:di+bx],ax
    	inc bx
    	inc bx
    	jmp VGA3_debut
    VGA3_fin:
    	popad
    	ret
    ;---------------------------
    offset_IRQ12_original	resw	1
    segment_IRQ12_original	resw	1
    droit	db	'click droit',0
    blanc	db	'             ',0

  11. #11
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    faut faire gaffe avec ce que tu lit depuis la souris c'est pas toujours forcément l'octet qui concerne les bouton de la souris qui est envoyé a chaque fois, l'irq12 est déclenché chaque fois que l'ordinateur reçois un octet de la souris

    ici tu trouveras des infos sur les différentes trame envoyé par les souris
    http://www.computer-engineering.org/ps2mouse/
    c'est a partir de ce document (et d'autres aussi mais celui la est a mon avis le plus complet) que j'ai écrit ma petite routine.

    a la fin du document il y a toute une description des commandes a envoyer a la souris pour la démarrer, tant que tu rest sous émulateur ça ne devrait pas t'interreser mais si tu veux faire un os sur une machine réel tu risque de te retrouver avec une souris muette si tu ne l'initialise pas correctement

  12. #12
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    Merci bifur, je vais étudier tout ça.

  13. #13
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    j'ai donc potassé le doc sur le protocole de transmission de données avec une souris ps2.
    j'arrive maintenant à envoyer une commande à la souris.

    j'envoie D4h (demande de communication avec la souris),j'ai bien l'accusé de réception (ACK) en retour,puis j'envoie E9h pour obtenir les 3 octets
    de status,j'ai bien l'ACK en retour mais lorsque je fait "in al,60h" pour lire le premier octet de la trame renvoyé par la souris,j'ai toujours l'ACK comme valeur ??
    D'après ce que j'ai compris sur le protocole,quand on envoie E9h à la souris on doit avoir sur 60h l'ACK puis les 3 octets de statut de la souris ?

    Qu'est ce qui ne va pas ?

  14. #14
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    voici le code;

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    org 100h
     
    %macro affiche 4
    	;%1=x,%2=y,%3=LPtext,%4=couleur
    	mov si,%3
    	mov bx,%1
    	mov di,%2
    	mov ah,%4
    	call VGA3
    %endmacro
     
    mov ax,cs
    mov ds,ax
     
    ;passage en mode texte 80*25 16 couleurs
     
    mov ah,0	
    mov al,3h
    int 10h
     
    ;tester souris
     
    boucle:
    cli
    call souris
    sti
     
    ;fin
     
    ret
     
    ;-----------------------
    souris:
    	cli
    	mov ah,0D4h	;communication avec la souris demandée
    	call CMDsourisPS2
     
    	mov ah,0E9h	;demande 3 octets de status
    	call CMDsourisPS2
     
    	;réponse dans le buffer de sortie ?
     
    	mov cx,50	;50 tentatives
    souris1:
    	in al,64h
    	test al,1	;y a qqchose pour nous en buffer sortie ?
    	loope souris1	
     
    	mov cx,100
    tempo:	
    	loop tempo
     
    	in al,60h    ;ici al vaut toujours ACK (FAh)
    	sti
    ret
     
     
    CMDsourisPS2:
     
    ;le buffer d'entrée est il libre ?
    PS2_1:
    	in 	al,64h	;lecture du registre d'état	
    	test 	al,10b	;bit 1 armé ?
    	jnz 	PS2_1 	;non on attend
     
    ;on envoie notre commande:
    	mov 	al,ah
    	out	60h,al
     
    ;a t'on une réponse dans le buffer de sortie ?
    PS2_2:	
    	in 	al,64h	;lecture du registre d'état
    	test 	al,1	;bit 1 armé ?
    	jz 	PS2_2 	;non on attend
     
    ;on attend l'accuse de réception sur 60h
    PS2_3:
    	in	al,60h
    	cmp	al,0FAh
    	jne	PS2_3	;on boucle tant que pas ack produit par controleur
    			;(dès qu'on a lu,le buffer de sortie est vide)
    ret

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 397
    Points : 424
    Points
    424
    Par défaut
    Ca a l'air passionnant tout ça.
    Je n'ai pas encore étudié les irq, mais ça me donne envie.

  16. #16
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    OUAIS..... ça doit être bien quand ça marche...

  17. #17
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Un truc m'échappe, dans ton dernier programme tu ne revectorises pas l'IRQ12h
    comment tu fait pour lier les deux ? ( le détournement de l'INT et la gestion )

  18. #18
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    Effectivement, comme je patauge dans la semoule, j'essaie une autre approche. (cf message du 05/02/2014, 14h37.l'acquittement n'est pas pris en compte, je n'arrive pas à finir l'irq12,d'où j'essaie
    de me passer de l'irq12 pour voir ce que ça donne).
    Je crois que je vais essayer d'initialiser entièrement la souris comme au démarrage d'un os pour voir ce que cela donne.

  19. #19
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    ok, mais comme la souris (PS/2 ici) utilise les mêmes ports que le clavier, ça a peu de chance de fonctionner sans IRQ

    Je viens de faire un test avec DosBox, et ce dernier utilise son propre gestionnaire de souris, ça peut peut-être court-circuiter ton programme...
    pourtant j'ai déjà utilisé des programmes qui récupèrent l'IRQ1 du clavier, et ça fonctionne

  20. #20
    Membre du Club

    Homme Profil pro
    passionné
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : passionné
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Points : 65
    Points
    65
    Par défaut
    Effectivement , ça pourrait expliquer le problème.Il faudrait donc que je crée un prog bootable qui gère la souris et voir ce que ça donne.Je vais essayer avec virtualbox

Discussions similaires

  1. [TASM] Détournement d'interruption
    Par adrien_najaque dans le forum x86 16-bits
    Réponses: 12
    Dernier message: 24/05/2008, 13h23
  2. Méthodes de détournement de trafic
    Par Diody dans le forum Développement
    Réponses: 5
    Dernier message: 10/11/2006, 14h48
  3. Détournement des touches
    Par mappy dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 07/08/2006, 21h05
  4. Détournement d'une interruption
    Par Invité dans le forum Assembleur
    Réponses: 18
    Dernier message: 16/02/2005, 13h49
  5. Proxy, tunneling, détournement de firewall
    Par Davide dans le forum Développement
    Réponses: 19
    Dernier message: 08/10/2003, 13h16

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