PROGRAMA 9: COLORES (CON LIBRERIA PERSONALIZADA)

El día de hoy veremos como crear nuestra propia librería y utilizarla en nuestros programas:
Primero escribimos nuestro código:

CR EQU 13    ;Declaro retorno de carro
LF EQU 10    ;Declaro salto de linea
BIOS EQU 10H ;Declaro interrupcion 10h
DOS EQU 21H  ;Declaro interrupcion 21h
TEXTO EQU 3  ;Declaro el servicio 03 para la impresion de texto desde BIOS
FIN EQU 4C00H ;Declaro interrupcion de exit

VARIABLES SEGMENT          ;Declaro las variables  
    include "emu8086.inc"
    TITULO DB "JUENITO_XD" ;Un texto
    COLORES DB 01001110B   ;Una agrupacion de colores
    DB 11101111B           ;0= cursos parpadeante 000=color de fondo 0000=color del texto
    DB 10110001B
    DB 01011100B
    DB 00110001B
    DB 01011111B
    DB 01101011B
    DB 01011100B
    DB 01101111B
    DB 01001110B
    DB 00110001B
VARIABLES ENDS

VPILA SEGMENT;STACK       ;Declaro la pila
    DB 64 DUP("PILA")
VPILA ENDS

CODIGO SEGMENT
    COLO PROC FAR    ;Declaro un procedimiento
    ASSUME CS:CODIGO, DS:VARIABLES, SS:VPILA
    MOV AX,VARIABLES
    MOV DS,AX
    MOV AX,TEXTO     ;Invoco el servicio de impresion de texto 
    INT BIOS         ;Ejecuto el servicio con 10h
    MOV CX,11        ;Declaro el iterador en 11
    XOR SI,SI        ;Borro SI
    BUCLE:           ;Llamo al bucle
    PUSH CX
    MOV DX,SI        ;Indico la posicion de la letra a imprimir con SI
    ADD DX,35        ;Indico la coordenada en x, la coordenada inicial es x=35
    MOV DH,12        ;Indico la coordenada en y  
    CALL COLOCA      ;Llamo al sistema para que coloque el cursor donde yo quiero
    MOV AL,[SI+OFFSET TITULO] ;Le indico la letra a imprimir pasandole SI y el texto como parametros
    MOV BL,[SI+OFFSET COLORES]   ;Le indico los colores a imprimir pasandole SI y el conjunto de colores como parametros
    CALL COLOR                ;Llamo a la impresion del texto
    POP CX
    INC SI                     ;Incremento a SI para modificar la letra a imprimir y la coordenada en x
    
    LOOPNZ BUCLE
    MOV AH,8    ;08:Lee un caracter sin imprimir nada en pantalla
    INT DOS     ;Ejecuto el servicio
    XOR DX,DX   ;Limpio DX
    CALL COLOCA ;Coloco el cursor en las coordenadas x=0 y=0     
    PUT_CURSOR 10,10
    print "Hola mundo" 
    PUT_CURSOR 20,20
    print "Estas son las coordenadas( x=20, y=20)"
    TERMINA        ;MACRO TERMINA
    COLO ENDP
       
    include "C:\Users\Isaías\Desktop\Librerias.inc"
    
CODIGO ENDS
END COLO

Ahora, en el código anterior he subrayado con verde una linea importante, como se puede apreciar, para importar una libreria personal, debemos colocar la sentencia:

include "ruta completa del archivo"

Una nota importante que he de mencionar es:
  • Cuando se importa una librería preinstalada estas generalmente se definen en la sección de datos de tu programa.
  • Una librería personal, como es mi caso, se debe importar al final del archivo, previo al fin de tu programa o procedimiento principal.
Pasando a otros contextos, el código de mi archivo personalizado es el siguiente:

    COLOR PROC  
    MOV AH,9         ;Invoco al servicio 09 para imprimir texto con formato
    XOR BH,BH        ;Limpio bh para indicarle que imprima en la misma pagina
    INT BIOS         ;Hago la impresion pidiendo la interrupcion 10h
    RET    ;retorno al programa principal
    COLOR ENDP
    
    COLOCA PROC
    MOV AH,2   ;Invoco al servicio 02 de 10h para posicionar el cursor
    XOR BX,BX  ;Limpio bx para decirle que debe ser en la misma pagina
    INT BIOS   ;Coloco el cursor con 10h en funcion del servicio 02
    RET   ;retorno al programa principal
    COLOCA ENDP
 
 PUT_CURSOR MACRO X,Y
 MOV AH,02H   ;Para posicionar el cursor
    MOV BH,00H   ;Coloco en la pagina 0
    MOV DH,X  ;Establesco las coordenadas, x=dh=renglon
 MOV DL,Y     ; Establesco las coordenadas y=dl=columna
    INT 10H      ;ejecuto la interrupción
 endm
 
 TERMINA MACRO
 MOV AX,4C00H  ;Termino el programa
    INT 21H     ;llamando a la interrupcion 21h
 ENDM

De esta manera obtenemos el mismo resultado pero hemos dividido nuestro código en módulos, de esta manera podemos tener nuestros códigos separados y podemos modificar cómodamente sin afectar nuestros otros archivos.


Comentarios