<-Informática\ensamblador 80x86...
|
Ejemplo 3 Quizás pensabas que todas las rutinas de interrupción que creemos funcionan del mismo modo, pero no es así de hecho en este programa que se muestra a continuación se implementa un juego de captura de asteríscos de forma que se crea una subrutina que se ejecuta automáticamente cada vez que el ratón se mueve y esta no sigue el método anteriormente definido. En este caso, el manejador de la interrupción del ratón permite incluir en su código un salto a nuestra subrutina cuando se cumpla una determinada condición, de forma que no hará falta desinstalar uno para instalar el otro. extrn prxy:far
extrn clrscr:far
extrn randomize:far
extrn random:far
extrn prnumxy:far
teclafin equ 4fh
datos segment
cont dw 0
posx dw 0
posy dw 0
datos ends
pila segment stack
db 100 dup(0)
pila ends
codigo segment
assume cs:codigo, ss:pila, ds:datos
;**************************************************
;* Nombre: ppal *
;* Descripción: Escribe en una posición aleatoria *
;* de la pantalla un asterisco,espera un instante *
;* de tiempo, borra el asterisco de la pantalla y *
;* finalmente comprueba si se ha pulsado una tecla*
;* Si esta es FIN, termina la ejecución del *
;* programa.Si no vuelve a ejecutar el bucle. *
;**************************************************
ppal proc far
push ds
xor ax, ax
push ax
mov ax, datos
mov ds, ax
call clrscr
;** Saber si rat¢n conectado **
mov ax, 0
int 33h
cmp ax, 0
je fin
;** Mostrar cursor **
mov ax, 1
int 33h
call instalar
;** Inicializar n£meros aleatorios **
call randomize
bucle: ;** obtener posici¢n aleatoria en la pantalla **
mov ax, 80
push ax
call random
mov cx, ax ;cx contiene la columna
mov ax, 25
push ax
call random
mov dx, ax ;dx contiene la fila
push cx
push dx
xor ax, ax
mov al, '*'
push ax
call prxy ;muestra por pantalla *
;** actualiza posx y posy **
mov posx, cx
mov posy, dx
call retardo
;** pintamos caracter ' ' en posx y posy **
mov ax, posx
push ax
mov ax, posy
push ax
xor ax,ax
mov al,' '
push ax
call prxy
;** vemos si se ha pulsado 1 tecla **
mov ah,1
int 16h
jz bucle
;** vemos que tecla se ha pulsado **
mov ah, 0
int 16h
cmp ah, teclafin
jne bucle
fin: call desinst
;** esconder cursor del raton **
mov ax, 2
int 33h
ppal endp
;************************************************************
;* Nombre:Retardo *
;* Descripción: Implementa una subrutina para la perdida de *
;* tiempo. Este intervalo es de poco mas de un segundo. *
;************************************************************
retardo proc far
push ax dx
mov ax, 0ffffh
loop1: mov cx, 300h
loop2: sub cx,1
jnz loop2
sub ax,1
jnz loop1
pop dx ax
ret
retardo endp
;***************************************************************
;* Nombre: instalar *
;* Descripción: No es una instalación de una subrutina de inte-*
;* -rrupción como tal. En este caso se le pasa al manejador de *
;* interrupción del ratón la dirección de nuestra función para *
;* que se ejecute cuando se mueva el ratón. *
;***************************************************************
instalar proc far
push es dx ax cx
mov ax,cs
mov es,ax ;ES contiene el segmento del manejador.
mov dx, offset manejador ;DS contiene el desplazamiento.
mov ax, 0ch ;Se instala una subrutina para el manejador.
mov cx, 1 ;Se ejecutará cuando se mueva el ratón.
int 33h ;Interrupción del ratón.
pop cx ax dx es
ret
Instalar endp
;***************************************************************
;* Nombre: Desinstalar *
;* Descripción: deshabilita la posibilidad de ejecutar nuestra *
;* subrutina cuando se mueve el ratón. *
;***************************************************************
desinst proc far
push es dx ax cx
mov ax,cs
mov es,ax
mov dx, offset manejador
mov ax, 0ch
mov cx, 0 ;Desinstalamos la subrutina del manejador del ratón.
int 33h
pop cx ax dx es
ret
desinst endp
;***************************************************************
;* Nombre: Manejador *
;* Descripción: Al entrar en la subrutina CX y DX contienen la *
;* posición en pixels del ratón en la pantalla, es por ello que*
;* en primer lugar se realizara una conversión a una pantalla *
;* de 80x25.Esto se consigue dividiendo por 8 esas cantidades. *
;* A continuación compara esta posición con la del asterisco, *
;* si coinciden se incrementa el contador. Finalmente muestra *
;* el número de aciertos que se llevan. *
;***************************************************************
manejador proc far
push ds ax
mov ax, datos ;Datos contiene la posición del asterisco
mov ds, ax
shr cx, 3 ;Convierte posición X
shr dx, 3 ;Convierte posición Y
cmp cx, posx ;Comparamos posición X del ratón con la del asterísco
jne diferent
cmp dx, posy ;Comparamos posición Y del ratón con la del asterísco
jne diferent
equal: add cont,1 ;Incrementa contador
diferent: ;Escribimos el contador en la pantalla
mov ax, 70
push ax
mov ax, 24
push ax
mov ax, cont
push ax
mov ax, 10
push ax
call prnumxy
pop ax ds
ret
manejador endp
codigo ends
end ppal
|