Vistas de página en total

89910

martes, 13 de agosto de 2013

GETMOUSEXY

     Hoy toca la segunda parte necesaria para tomar la posición de ratón en una ventana de texto acotada.
     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.