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 / 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!

Codes Sources

A voir également

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.