Vistas de página en total

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   

2 comentarios:

  1. como ingreso todo esto en el dosbox?
    es una libreria esto?
    como la creo?
    gracias de antemano

    ResponderEliminar
  2. Buenas noches Iván:

    Esto no se ingresa en dosbox, esto es una función para compilar en MASM. Por lo que esta función se compone de dos ficheros. Por lo tanto es una librería de primer nivel, para formar otras librerías de mayor nivel. La creas compilando. aquí te voy dejando el resto de ejemplos y pasos.
    El .mac con las definiciones de pre-procesador para pasar los parámetros de forma más fácil a la función. Es el fichero equivalente al .h de "C"
    Falta la declaración de las funciones que no son directas o simples. las cuales están en http://myassembler.blogspot.com.es/2014/03/funciones-graficas-basicas.html
    Este otro fichero es el .asm, equivalente al .c de "C".
    Por lo tanto para usar estas funciones en un programa de ensamblador se debe indicar al compilador que las compile y al linkador que las una. O compilar las funciones y almacenar el .obj en una librería para indicar al linkador posteriormente que las busque allí.
    Un programa ejemplo para usar estas funciones es http://myassembler.blogspot.com.es/2014/03/ejemplo-impresion-paint-con-caracteres.html o http://myassembler.blogspot.com.es/2014/03/paint-basico.html
    De estas funciones se sacan funciones derivadas, como circle (http://myassembler.blogspot.com.es/2014/03/circle.html), linea (http://myassembler.blogspot.com.es/2014/03/funcion-linea.html), fill etc, que serán a su vez librerias como estas.
    Con estas a su vez creamos programas más complejos http://myassembler.blogspot.com.es/2014/03/ejemplo-trazado-de-circulos.html o http://myassembler.blogspot.com.es/2014/04/ejemplo-con-rectangulos-y-rectangulos.html
    Cuando compiles y linkes los programas finales, obtendrán los ejecutables, que luego podrás ejecutar en dosbox. Los ejecutables los puedes tambien descargar aquí. http://myassembler.blogspot.com.es/p/programas-ya-compilados.html

    Aquí tienes también las librerías ya creadas. Los .lib, con todos laos .obj de las funciones de este blog ya almacenadas en una librería. La general es MSAM.LIB
    El procedimiento de compilación para crear el ejecutable está aquí. http://myassembler.blogspot.com.es/p/compilacion.html
    Como ves uso el TASM y he creado unos bat, para que sea más fácil las llamadas a los compiladores.
    Para entender la forma de estructurar el programa en ensamblador deberías leer el blog desde el principio, ya que yo no uso un compilador moderno, sino uno de los primeros. Por lo tanto, muchas de las opciones que llevan implementados los ensambladores actuales, en este blog están creadas como macros. Es más complicado, pero mucho mejor si quieres entender lo que realmente hace el compilador para crear el programa. Los códigos aquí son prácticamente un ensamblador de alto nivel a partir de "código máquina".
    Espero que te haya servido. El ensamblador es difícil de por sí, pero en la actualidad, en que se tiende a usar librerías predefinidas, resulta todavía más difícil de entender.
    Un saludo

    ResponderEliminar

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.