Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
LECTURE DU SCANCODE [TASM, PORT 60H, DÉTOURNEMENT D'INT]
Description
En fichier EXE du MS-DOS pour compiler : TASM nomdufichier pour linker : TLINK nomdufichier Le scancode est le code qu'envoie le clavier lors d'un changement d'état d'une de ses touches.
Source
- .386
- code segment use16
- assume cs:code,ds:code
- prog:
- mov ax,cs
- mov ds,ax
- mov ax,0B800h ;Pointe sur la mémoire vidéo du mode texte pour affichage de caractère
- mov es,ax
- xor ax,ax
- mov gs,ax
- mov eax, gs:[09h*4]
- mov oldirq1, eax ;sauvegarde de l'IRQ1 lié à l'INT 09h (sinon PANIC)
- mov ax, cs
- shl eax, 16
- mov ax, offset irq1
- mov gs:[09h*4], eax ;place celle du code présent
- boucle:
- xor di,di
- mov si,offset map
- mov cx,256
- actualiser:
- movsb
- inc di
- loop actualiser
- cmp codefin,81h ;Dès que la touche ESC est relâcher on quitte
- jnz boucle
- fin:
- mov eax, oldirq1 ;restauration de l'Int 09h (sinon PANIC)
- mov gs:[09h*4], eax
- mov ah,4Ch
- int 21h ;Code de fin
- irq1:
- pushad
- xor ax,ax
- in al,60h ;Lecture du Scancode
- mov bx,ax
- cmp ax,81h ;Test de la touche Esc relâchée
- jz _esc
- jge break
- mov ds:[map+bx],'1'
- mov ds:[map+0E0h],'.'
- mov ds:[map+0E1h],'.'
- jmp irqfin
- _esc:
- mov codefin,al
- jmp irqfin
- break:
- cmp al,0E0h ;Teste si le code E0h est présent pour les touches étendues
- jz .e0
- cmp al,0E1h ;Teste si le code E1h est présent (seul la touche Pause l'utilise)
- jz .e0
- and bx,7Fh
- mov ds:[map+bx],'.'
- jmp irqfin
- .e0:
- mov ds:[map+bx],'X'
- irqfin:
- mov al,20h
- out 20h,al ;End Of Interrupt
- popad
- iret ;Comme ret sauf pour interruption
- oldirq1 dd ? ;sauvegarde de l'ancienne adresse de l'IRQ1 (irq du clavier)
- map db 256 dup('.') ;Carte du scancode
- codefin db 0 ;test du code 81h c'est le BreakCode de la touche Echap qui permettra de quitter le programme
- code ends
- end prog
.386
code segment use16
assume cs:code,ds:code
prog:
mov ax,cs
mov ds,ax
mov ax,0B800h ;Pointe sur la mémoire vidéo du mode texte pour affichage de caractère
mov es,ax
xor ax,ax
mov gs,ax
mov eax, gs:[09h*4]
mov oldirq1, eax ;sauvegarde de l'IRQ1 lié à l'INT 09h (sinon PANIC)
mov ax, cs
shl eax, 16
mov ax, offset irq1
mov gs:[09h*4], eax ;place celle du code présent
boucle:
xor di,di
mov si,offset map
mov cx,256
actualiser:
movsb
inc di
loop actualiser
cmp codefin,81h ;Dès que la touche ESC est relâcher on quitte
jnz boucle
fin:
mov eax, oldirq1 ;restauration de l'Int 09h (sinon PANIC)
mov gs:[09h*4], eax
mov ah,4Ch
int 21h ;Code de fin
irq1:
pushad
xor ax,ax
in al,60h ;Lecture du Scancode
mov bx,ax
cmp ax,81h ;Test de la touche Esc relâchée
jz _esc
jge break
mov ds:[map+bx],'1'
mov ds:[map+0E0h],'.'
mov ds:[map+0E1h],'.'
jmp irqfin
_esc:
mov codefin,al
jmp irqfin
break:
cmp al,0E0h ;Teste si le code E0h est présent pour les touches étendues
jz .e0
cmp al,0E1h ;Teste si le code E1h est présent (seul la touche Pause l'utilise)
jz .e0
and bx,7Fh
mov ds:[map+bx],'.'
jmp irqfin
.e0:
mov ds:[map+bx],'X'
irqfin:
mov al,20h
out 20h,al ;End Of Interrupt
popad
iret ;Comme ret sauf pour interruption
oldirq1 dd ? ;sauvegarde de l'ancienne adresse de l'IRQ1 (irq du clavier)
map db 256 dup('.') ;Carte du scancode
codefin db 0 ;test du code 81h c'est le BreakCode de la touche Echap qui permettra de quitter le programme
code ends
end prog
Conclusion
Ce code peut être optimisé en utilisant un bit par touche sur la carte du scancode au lieu d'un octet, on peut ainsi réduire la taille. On peut ne pas utiliser l'interruption du clavier mais c'est moins bien et un test est nécessaire avant la lecture du scancode c'est le bit 0 sur le port 64h. Il est peut-être plus facile d'utiliser les fonctions de l'INT 16h mais seulement en 16bits!
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Sources de la même categorie
Commentaires
|
CalendriCode
| | | L | M | M | J | V | S | D |
| 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 | | | | | |
|
|