La llamaremos getmousexy.
La parte correspondiente en el programa TIC_TAC_TOE es:
;toma la coordenada
getmousex
shr ax,4 ;divide por 16 para obtener coordenada letra
sub ax,5 ;referencia desde cero de la posicion en la matriz
cmp al,2 ;no valido si pulsamos fuera
ja espera
mov posx,al
getmousey
shr ax,4 ;divide por 16 para obtener coordenada letra
sub ax,2 ;referencia desde cero de la posicion en la matriz
cmp al,2 ;no valido si pulsamos fuera
ja espera
mov posy,al
Ahora queremos convertirla en una rutina estándar que nos valga para siempre. Para ello en vez de dividir por 16 lo haremos por 8 para que nos de posiciones en carácter de pantalla.
Para implementarla crearemos una macro a la que le pasaremos hasta 4 parámetros.
inx e iniy serán las coordenadas de inicio de la ventana
rangx y rangy será la longitud x e y de la ventana.
Se podrá no indicar, por parejas, estos parámetros. Si no se indican rangos, se tomará 0,0, 80,24 como ventana.
Como hemos dicho esto está pensado para ser usado junto con waitmouse y analizar una pulsación del ratón. A veces nos interesará hacer waitmouse en un punto del programa y llamar a esta rutina varias veces para analizar varias posibilidades (varias ventanas activas). Otras veces, simplemente tengo activa una ventana válida y solo quiero ver la coordenada pulsada, como es el caso del juego TIC_TAC_TOE.
Como resulta que para ver si se no pulsó dentro de la ventana debemos verificar si nos ha devuelto 0ffh, en el caso de que solo haya una ventana activa, resulta en este caso un sobrecoste de análisis. Por ello, resulta cómodo tener una función que ya lo implemente y se quede esperando dentro, hasta que la posición sea válida.
Es por eso que además de la macro getmousexy vamos a crear waitmousexy, que combinará la espera y la toma de posición, para hacer en una sola instrucción las dos cosas.
IMPLEMENTACIÓN GETMOUSEXY
MOUSE.MAC ( a añadir a lo que ya existe)
; Copyright (C) 2013 José Ángel Moneo Fernández ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/>.
;toma la posicion xy del raton en coordenadas texto referidas a inix,iniy
;devuelve la posición en ah=x al=y. Si está fuera de la ventana devueve al=0ffh
;inix e iniy son las coordenadas cero
;rangx,rangy son el rango válido
;ej mousexy 10,10,20,20 devuelve las coordenada pulsada
;si está dentro de la ventana 10,10,20,20 con la coordenada referida al origen 10,10
getmousexy macro inix,iniy,rangx,rangy
ifndef _getmousexy
extrn _getmousexy:near
endif
ifnb <rangy>
mov ax,inix
push ax
mov ax,iniy
push ax
mov ax,rangx
push ax
mov ax,rangy
push ax
else
mov ax,0
push ax
push ax
mov ax,80
push ax
mov ax,4
push ax
endif
call _getmousexy
endm
;espera pulsación de ratón y toma la posicion xy del raton en coordenadas texto referidas a inix,iniy
;devuelve la posición en ah=x al=y.
waitmousexy macro inix,iniy,rangx,rangy
waitmouse
getmousexy inix,iniy,rangx,rangy
endm
GETMOUSEXY.ASM
; Copyright (C) 2013 José Ángel Moneo Fernández ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/>.
title librería getmousexy
.model compact,pascal
public _getmousexy
.286
.data
.code
proc _getmousexy uses bx,inix,iniy,rangx,rangy
;toma la coordenada
getmousex
shr ax,3 ;divide por 8 para obtener coordenada texto
sub ax,inix ;referencia cero de la posicion en la matriz
cmp ax,rangx ;no valido si pulsamos fuera
ja fuera
mov bh,al
getmousey
shr ax,3 ;divide por 8 para obtener coordenada texto
sub ax,iniy ;referencia cero de la posicion en la matriz
cmp ax,rangy ;no valido si pulsamos fuera
ja fuera
mov ah,bh
ret
fuera:
mov ax,0ffh
ret
_getmousexy endp
end
No hay comentarios:
Publicar un comentario
Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.