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