Vistas de página en total

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  

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.