Vistas de página en total

Mostrando entradas con la etiqueta GRAPHICS. Mostrar todas las entradas
Mostrando entradas con la etiqueta GRAPHICS. Mostrar todas las entradas

domingo, 6 de abril de 2014

EJEMPLO CON RECTANGULOS Y RECTANGULOS LLENOS

     Este es un ejemplo del estilo de los anteriores, para probar y mostrar el uso de la función rectangle y fillrectangle.

      Para poder usar las dos en un solo porgrama ejemplo he utilizado el teclado para distinguir uno de otro al dibujar. Si se pulsa el teclado se dibujará un fill rectangle. Si no se dibujará un rectangle.

    La selección de los vertices se hace igual en en los caso anteriores, eligiendo dos puntos con el ratón.
    Igualmente incremeto el color con cada recuadro, para que quede más vistoso.


 El ejemplo compilado lo podeis descargar aquí

EJ_REC.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/>.
 
include main.mac
include stdio.mac
include mouse.mac
include graphics.mac

.model compact,pascal
.stack 200

.data
x0 dw 0
y0 dw 0
x1 dw 0
y1 dw 0

color dw 1

.code

principal proc far
        main
        modovideo 12h   ;inicia graficos
        resmouse         ;reinicia ratón
        mouse on         ; activa rarón
     
punto1:
        getmouse        ;espera  ESTÉ SIN PULSAR
        cmp ax,0
        jne punto1
pulsar1:       
        getmouse         ;verifica espera pulsación raton
        cmp ax,2      ;salir?
        jne sig1
        jmp fuera
sig1:       
        cmp ax,1      ;boton izquierdo?
        jne pulsar1
        getmousex
        mov x0,ax
        getmousey
        mov y0,ax
punto2:
        getmouse        ;espera soltar
        cmp ax,0
        jne punto2
pulsar2:      
        getmouse         ;verifica espera pulsación raton
        cmp ax,2      ;salir?
        je fuera
        cmp ax,1      ;boton izquierdo?
        jne pulsar2
        getmousex
        mov x1,ax
        getmousey
        mov y1,ax
       
       
        mov ax,color
        inc ax
        and ax,0fh
        mov color,ax      
   
       
        mouse off
     
        kbhit    ;comprueba si se ha pulsado el teclado
        jz rectangulo
        mov ah,0ch      ; vacio el bufer de teclado
        int 21h
     
        ;si es así dibuja rectangulos llenos
        fillrectangle  x0,y0,x1,y1,color
         mouse on
        jmp punto1
rectangulo:  
              
        rectangle x0,y0,x1,y1,color
        mouse on
        jmp punto1
fuera:
        modovideo t80col
        resmouse
        mouse off 
        exit  0
principal endp

end




viernes, 4 de abril de 2014

FILL RECTANGLE

Función para realizar RECTANGULOS RELLENOS apoyandolnos en la función LINEA.

Macro DE LLAMADA para ampliar en GRAPHICS.MAC

GRAPHICS.MAC
;Dibuja un rectangulo lleno
fillrectangle macro x0,y0,x1,y1,color
ifndef _fillrectangle
        extrn _fillrectangle:near
endif
        mov ax,x0
        push ax
        mov ax,y0
        push ax
        mov ax,x1
        push ax
        mov ax,y1
        push ax
        mov ax,color
        push ax
        call _fillrectangle
        

 endm  


FRECTAN.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/>.
.model compact,pascal

        public _fillrectangle
.data

.code
       ;algoritmo Bresenham
_fillrectangle proc uses ax cx bx ,x0,y0,x1,y1,color
        mov cx,y0
        mov bx,y1
        mov ax,y0       ;COMPRUEBA EL MAYOR PARA ORDENAR EL BUCLE
        cmp ax,y1
        jbe correcto
        ;invertir  las y
        mov cx,y1       
        mov bx,y0
correcto:                        ;BUCLE DE LÍNEAS
        line x0,cx,x1,cx,color
        inc cx
        cmp cx,bx
        jne correcto
        ret
_fillrectangle endp

end

viernes, 28 de marzo de 2014

DISTANCIA ENTRE DOS PIXEL

    Para poder realizar el ejemplo con circulos, necesito poder pasar a la función circle el radio, tomandolo de la posición dadapor el ratón. Es decir el primer punto que elija con el ratón será el origen del circulo y el  segundo punto será un extremo que definirá el radio.
   Por lo tanto necxesitamos una funcion que nos permita calcular la distancia desde el primer punto al segundo, dado que esa distancia será el radio.
  
   Como esta acción es muy interesante para otras aplicaciones, nos conviene generar una rutina y no aplicar el algoritmo directamente al programa de ejemplo. Aunque lleve un poco más de trabajo valdrá la pena.





A añadir a GRAPHICS.MAC

;definición de la llamada a Dist_pixel
;se le pasan las coordenadas de dos puntos y devuelve en ax la distancia
Dist_pixel macro x0,y0,x1,y1
ifndef _dist_pixel
     extern _dist_pixel
endif
        mov ax,x0
        push ax
        mov ax,y0
        push ax
        mov ax,x1
        push ax
        mov ax,y1
        push ax       call _dist_pixel
endm



DPIXEL.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/>.
include math.mac

;mide la distancia entre dos pixel
;se le pasa las coordenadas de los dos puntos y nos devuenve en ax la distancia en pixel
    public _dist_pixel
model compact,pascal
.data
radio dw 0,0
ix dw 0,0    ;valor absoluto incremento x
iy dw 0,0     ; valort absoluto incremento de y
ix2  dw 0,0  ; cuadrado del incremento x
iy2  dw 0,0  ;cuadrado del incremento y
.code
_dist_pixel proc uses ,x0,y0,x1,y1

        mov ax,y1
        sub ax,y0        ;(y1-y0)
        abs ax         
        mov iy,ax        ;dy=abs(y1-y0)
        pot iy,2,iy2     ;dy2=dy^2
        mov ax,x1
        sub  ax,x0      ;(x1-x0)2
        abs ax         
        mov ix,ax        ;dx=abs(x1-x0)
        pot ix,2,ix2     ;dx2=dx^2
      
        suma ix2,iy2,radio     ;(y1-y0)^2+(x1-x0)^2  
      
        sqr radio
        ret
_dist_pixel endp

end

miércoles, 26 de marzo de 2014

CIRCLE

   Siguiendo las funciones gráficas, la siguinete depues de la línea en impritancia es el circulo.
Al igual que he hecho con la línea utilizaré el algoritmo de Bresenham.

 
  El pseudocódigo del algoritmo es:
 
*Se capturan el radio r y el centro de la circunferencia (xc, yc).
 *Se obtiene el primer punto de la circunferencia centrada en origen (xc, yc) como (0, r).
 *Se cacula el valor inicial del parametro de decisión como p0=5/4 - r.
 Para k=0 hasta x>=y incrementa k
    Si pk < 0 
       *Siguiente punto de la circunferencia con centro (0,0) es (xk+1, yk).
       *pk+1=pk+2xk+1+1.
    Sino
        *Siguiente punto de la circunferencia con centro (0,0) es (xk+1, yk-1).
       *pk+1=pk+2xk+1+1-2yk+1.
    //Donde 2xk+1=2xk+2  y  2yk+1=2yk-2
 
 *Se determinan los puntos de simetría para los otros siete octantes.
 *Se mueve cada posición del pixel calculada (x,y) a la trayectoria circular centrada en (xc, yc) 
   y trazamos los valores de las coordenadas: x=x+xc y y=y+yc.
 Fin Para

   Fuente wikipedia.

     Aquí teneis la implementación del algoritmo en ensamblador, comentado en C, para que sirva de entreanmiento a la hora de codificar en lenguaje ensamblador otros algoritmos.




CIRCLE.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/>.


include graphics.mac


.model compact,pascal

        public _circle
.data

e dw 0     ;variable p procedimiento breshenham


.code
       ;algoritmo Bresenham
_circle proc uses ax bx dx si di,x0,y0,radio,color
        mov bx,0     ;x=0
        mov dx,radio      ;y=radio
        mov cx,dx   ;e=radio
        neg cx       ;e=-radio
        add cx,1    ; e=1-radio

      
while:        ;while (x<y)
        cmp bx,dx
        jb sig
        jmp fin
sig:
        call _dibuja8   ;dibuja en los 8 octantes
        inc bx       ;x=x+1
        cmp cx,0    ;if (e>0)
        jl else_if
        dec dx       ;y=y+1
        mov ax,bx
        sub ax,dx   ;x-y
        shl ax,1    ;(x-y)*2
        add ax,1  ;1*(x-y)+1
        add cx,ax    ;e=e+ 2*(x-y)+1
        jmp fin_if
else_if:
        mov ax,bx
        shl ax,1
        add ax,1         
        add cx,ax   ;e=e+2*x+1
fin_if:
     
        jmp while      
fin:
        ret
_circle endp 

;dibuja el punto en cada octante, referido a la coordenada origen del circulo
_dibuja8 proc
        mov si,bx          
        add si,x0           ;xc=x+x0
        mov di,dx          
        add di,y0           ;yc=y+y0
        putpixel si,di,color    ;pixel(x+x0,y+y0)
        mov si,dx          
        add si,x0           ;xc=y+x0
        mov di,bx          
        add di,y0           ;yc=x+y0
        putpixel si,di,color    ;pixel(y+x0,x+y0)
        mov si,bx             
        neg si
        add si,x0            ;xc=-x+x0
        mov di,dx          
        add di,y0           ;yc=y+y0
        putpixel si,di,color          ;pixel(-x+x0,y+y0)
        mov si,dx          
        add si,x0           ;xc=y+x0
        mov di,bx             
        neg di
        add di,y0               ;yc=-x+y0
        putpixel si,di,color           ;pixel(y+x0,-x+y0)
        mov si,bx             
        neg si
        add si,x0               ;xc=-x+x0
        mov di,dx 
        neg di              
        add di,y0               ;yc=-y+y0
        putpixel si,di,color          ;pixel(-x+x0,-y+y0)
        mov si,dx 
        neg si              
        add si,x0               ;yc=-y+x0
        mov di,bx             
        neg di
        add di,y0               ;xc=-x+y0
        putpixel si,di,color           ;pixel(-y+x0,-x+y0)
        mov si,bx          
        add si,x0           ;xc=x+x0
        mov di,dx 
        neg di              
        add di,y0               ;yc=-y+y0
        putpixel si,di,color          ;pixel(x+x0,-y+y0)
        mov si,dx 
        neg si              
        add si,x0               ;yc=-y+x0
        mov di,bx          
        add di,y0           ;yc=x+y0
        putpixel si,di,color           ;pixel(-y+x0,x+y0)
        ret
_dibuja8 endp       

end

martes, 18 de marzo de 2014

PAINT BASICO

     Este programa es el comienzo de una serie de programas asociados a librerías más avanzadas de gráficos. Como ya teníamos la función putpixel hay que darle salida. por lo tanto usando la estrucutrac del pograma anterior, este programa coloca pixel en la posiciñon del ratón cuando el botón izquierdo de este está pulsado. esto lo que permite es realizar un Paint muy simple.

      Para mejorarlo deberemos crear la funicón line, ya que de esta manera no se verán los trazos discontinuos. Ese será el siguiente módulo de la librería graphics.
     En la siguiente entrada presentaré las funciones line, circle, y rectangle, fillrectangle, y fillcircle, con las que podremos dibujar las entidades más básicas de dibujo.
 
 
    Programa ejecutable  Ej_Pixel.exe


EJ_PAINT1.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/>.


include main.mac
include stdio.mac
include mouse.mac
include graphics.mac

.model compact,pascal
.stack 200

.data
letra db 0

color dw 1

.code

principal proc far
        main
        modovideo 12h   ;inicia graficos
        resmouse         ;reinicia ratón
        mouse on         ; activa rarón
        mov cx,0
ciclo: 
      
        getmouse         ;verifica espera pulsación raton
        cmp ax,2      ;salir?
        je fuera
        cmp ax,1      ;boton izquierdo?
        jne ciclo
        getmousex
        mov cx,ax
        getmousey
        mov dx,ax
        mouse off
        putpixel cx,dx,color
        mouse on
        jmp ciclo
fuera:
        modovideo t80col
        resmouse
        mouse off 
        exit  0
principal endp

end





domingo, 16 de marzo de 2014

EJEMPLO IMPRESIÓN. PAINT CON CARACTERES GRÁFICOS

  Como primer ejemplo del modo gráfico, voy a presentar un pequeño programa que tomando la posición del ratón como posición de impresion imprimirá la letra que estemos pusando en el teclado en pantalla. Esto solo lo hará si pulsamos el botón izquierdo del ratón.
   Se saldrá del programa pulsando el botón drecho del rarón.
   El resultado del programa es un paint que dibuja en la pantalla los trazos del ratón, pero con el caracter que tengamos pulsado en ese momento.



   Podeis descargar el programa ya compilado en  EJ_GRAF1.EXE 



EJ_GRAPH1.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/>.



include main.mac
include stdio.mac
include mouse.mac
include graphics.mac

.model compact,pascal
.stack 200      ;define el tamaño de pila

.data
letra db 0            ; almacenamiento de la letra actual a imprimir

color dw 1       ; color del texto

.code

principal proc far
        main                      ;inicializa programa
        modovideo 12h    ;inicia graficos
        resmouse            ;reinicia ratón
        mouse on             ; activa rarón
                   
ciclo: 
        kbhit                           ;comprueba si si pulsa el teclado
        jz sigue                                              
        getch letra                ; si se pulsó lee el bufer de teclado y lo guarda en letra
sigue:             
        getmouse         ;verifica espera pulsaci¾n raton

        cmp ax,2      ;salir?
        je fuera
        cmp ax,1      ;boton izquierdo?
        jne ciclo
        getmousex
        shr ax,3   ;convierte a posición caracter
        mov cl,al
        getmousey
        shr ax,4    ;convierte a posición caracter
        mov ch,al
        gotoxy  cl,ch
        mouse off
        putcharG letra  
        mouse on
        jmp ciclo
fuera:
        modovideo t80col          ;repone la pantalla texto
        resmouse                       ;resetea el rarón
        mouse off                     ;desactiva el ratón
        exit  0                          ;sale al sistema con código 0
principal endp

end









viernes, 14 de marzo de 2014

FUNCIONES GRÁFICAS BASICAS

   Algunas de las funciones introducidas en la macro GRAPHICS.MAC serán funciones implementadas mediante rutinas en la librería, bien porque son muy utilizadas y queremos ahorrar algunos bytes frente a las llamadas inline, o bién porque pensamos poder mejorarlas posterioremente sin tener que retocar la llamada.
    Como siempre mi filosofía es crear funciones con el mismo nombre que las macros, pero usando el caracter "_" delante.
    Como ya se ha visto, a mi no me gusta la función "invoke" del ensamblador, ya que impide una visión clara de la secuencia del programa  al llenar de palabras "invoke" el programa. Para entender un programa actual, hay que ir saltandose esta palabra, para llegar a leer el comando.
    Por ello, aunque lleve un poco más de trabajo, yo soy partidario de crear una definición de función, al igual que se haría en "C" en las cabeceres ".h". Esta definición hará la llamada a la función equivalente y nos permitirá trabajar directamente con el nombre de la función y sus parámetros, eliminando el molesto "invoke", que no es mas que un "call".

    Aquí, hoy solo crearé las funciones putpixel y gotoxyG. Como desde hace tiempo, me estoy apoyando en la directiva "use "y "argum". Así no tengo que salvaguardar con push y pop de los registros usados y no tengo que acceder a los parámetros mediante la indexación a través del puntero de pila. Esto desvirtua el verdadero ensamblador, pues hay líneas generadas por el compilador que no están aquí, pero mejora la lectrua del programa.Debemos tener en cuenta, por lo tanto que los programas no contienen todo el código ensamblador.
     Quien quiera conocer como ensambla estas directivas el compilador puede ir a las primeras entradas del blog, donde programo sin usarlas.
    
    Como la pantalla es gráfica, aquí aparece una diferencia, entre las coordenadas de las dos operaciones.
    En putpixel, las coordenadas son las de pantalla 640x480, pero en la función de texto (servicio 2, Int 10), las coordenadas debe de ser las del cursor, que se reducen por 8 en x y por 4 en y. Para no tener que hacer reconversiones en cada caso, las dos funciones trabajan con coordenadas gráficas. La función gotoxyG hace por lo tanto la tansformación de coordenadas gráficas a coordenadas de texto.

     A partir de ahora y progresivamente iré ampliando esta libería con el resto de las funciones gráficas, colocando un ejemplo ejecuable por cada nueva función, hasta poder realizar un pequeño juego gráfico, integramente hecho en ensamblador, al igual que he ido haciendo con los programas en pantallas de texto.

GRAPHICS.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/>.



    public _gotoxyG
    public _putpixel
.286   
.model compact,pascal
.code
proc _putpixel uses ax cx dx bx,x,y,color:byte
        mov cx, x
        mov dx, y                      ; (CX,DX) = (x,y)
        xor bh, bh                       ; p gina 0
        mov al, color                  ; AL = Color del pixel      
        mov ah, 0Ch                    ; AH = 0x0C (WritePixel)
        int  10h 
        ret
_putpixel endp

end
;coloca el cursor en la posición indicada  en una pnatalla gráfica
proc _gotoxyG uses ax dx cx bx,x,y
        mov bh,0
        mov ax,x
        shr ax,3
        mov dl,al
        mov ax,y
        shr ax,4
        mov dh,al
        mov ah,02h
        int 10h
        ret
_gotoxyG endp  

miércoles, 12 de marzo de 2014

GRAFICOS

    Con las funciones que ya he implementado en el blog, se puede hacer prácticamente de todo en modo texto, llegando sin problema, como he mostrado en los ejemplos a mover todo tipo de datos. ¿ Pero qué falta.?
     Claramente faltan los gráficos. A partir de ahora iré añadiendo funciones para resolver los gráficos.
  Hay muchos modos de pantalla, y deberíamos de resolver de forma inicial la detección de la tarjeta gráfica y del modo más alto posible. pero como eso hará que no se vean resultados de forma inmediata, y como yo se que la mejor manera de picar a alguien en este mundo es hacer que funcione, comenzaré como siempre con cosas sencillas que funcionen.
   No es el fin de este blog crear un entorno de programación profesional, para eso ya están las librerías del MASM 32. El fin es mostrar recursos para hacer nosotros mismos las cosas. Para aprender desde cero. Si sabemos hacerlo nosotros mismos todo, será muy fácil entender lo que nos muestren los demás y adaptarlo a nuestro modo de programación.
   Aunque sea de forma muy sencilla se pueden hacer, para enseñanza, grandes programas y elegantes.
   En este caso vamos a usar siempre el modo 12H de video. Es un modo de 640x480 pixel y 16 colores. no son muchos colores para hacer un juego, ni mucha resolución, pero es un modo compatible con todos las tarjetas, pues es uno de los modos EGA primeros que se produjeron. Antes incluso de que existiese las VGA. Por lo tanto es compatible totalmente. Luego Si alguien quiere, que implemente en la rutina de selección de modo gráfico que yo pongo una versión que rastree la memoria de tarjeta y seleccione el modo más adecuada entre los que soporte.
    Para ello disponéis de esta página donde se explica muy bién como obtener esta información.
Modos gráficos
      
    Como siempre comienzo con una cabecera de macros para llamar a las funciones principales.
   En ella faltan macros para las funciones más complejas. Estas las iré colocando según vaya colocando las funciones. Para empezar colocaré las funciones más básicas.
    Lo más básico es:
·         Elegir el modo gráfico.
·         Pintar un pixel.
·         Imprimir una letra
·         Situar el cursor en la pantalla gráfica
  Con estas funciones podremos realizar dos pequeños programas.
      Uno presentará en pantalla la letra que indiquemos por teclado situándola donde pulsemos el ratón.
      El otro será el inicio de un Paint. Dibujará lo que hagamos con el ratón cuando pulsemos el botón izquierdo.
     Por lo tanto en la siguiente entrada pondré las funciones a añadir a la librería, asociada a las macros.
    Y en las dos entradas siguientes los dos programas dichos anteriormente.
    Hay que tener en cuenta que estamos trabajando en DOS. Y por lo tanto no usamos las API’s de Windows. Somos autónomos. Solo usamos las interrupciones de la BIOS, en este caso. Por ello para correr estos programas en Windows7 hace falta un emulador de DOS como el DOSBOX.








GRAPHICS.MAC
; 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/>.


;MODOS DE PANTALLA
t40mon equ 0
t40col equ 1
t80mon equ 2
t80col equ 3
cga320x200 equ 4
cga640x200 equ 6
ega320x200 equ 13h
ega640x350 equ 10h
ega640x480 equ 12h      ;16 colores
VGA640x480 equ 2AH      ;256 colores



; Presenta un pixel en pantalla Gráfica en el color establecido
putpixel macro x,y,color
ifndef _putpixel
        extrn _putpixel:near
endif
        mov ax,x
        push ax      
        mov ax,y
        push ax
        mov ax,color
        push ax
        call _putpixel
 endm

;Presenta un caracter en modo gráfico en la posición actual del cursor
putcharG macro dato
         push cx

        push bx
        mov ah,0Ah
        mov al,dato
        mov bh,0
        mov cx,1
        int 10h
        pop bx
        pop cx
endm 



;selecciona el modo de video
 modovideo macro modo
        mov ax,modo
        int 10h
        endm



;posicionador de cursor en coordenadas gráficas

gotoxyG macro x,y
ifndef _putpixel
        extrn _gotoxyG:near
endif
        mov ax,x
        push ax
        mov ax,y
        push ax
        call _setcursorG
       
 endm