Vistas de página en total

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

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









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