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