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