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 / Exemple :
.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!
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.