domingo, 8 de abril de 2012

Ensamblador 8086 Modo 13h Paleta de Colores

En post anterior explicamos que para desplegar pixeles en la pantalla usando el modo 13h tenemos que escribir a memoria y configurar la paleta de colores. Sin embargo, el ejemplo sólo mostró como escribir a la memoria de gráficos y usamos la paleta default de colores. En este post realizaremos un pequeño experimento para mostrar cómo configurar la paleta de colores.

El siguiente programa pinta 10 franjas horizontales de 20 pixeles de ancho cada una. Recordemos que hay 64,000 pixeles en la pantalla (320x200), por lo que cada franja de 20 pixeles de ancho ocupa un 10% de la pantalla es decir 6,400 pixeles. La primera parte del programa llena el área de memoria de gráficos (que inicia en A000:0000) con 6,400 ceros, seguidos de 6,400 unos, seguidos de 6,400 dos, y así sucesivamente hasta nueve.

Los colores que vemos en la pantalla son los colores de las primeras diez entradas de la paleta default de colores.

Después de presionar una tecla, el programa configura en tonos de azules las primeras diez entradas de la paleta de colores. Podemos observar los resultados en la siguiente imagen. Es importante recalcar que NO modificamos el área de memoria de gráficos, la cual sigue teniendo diez conjuntos de 6,400 pixeles numerados del cero al nueve.

Por último, volvemos a modificar las primeras diez entradas de la paleta de colores pero esta vez con tonos de verde.

.model small
.stack 128
.data

.code
.startup
main proc
  ; INT 10h / AH = 0 - configurar modo de video.
  ; AL = modo de video deseado.
  ;     00h - modo texto. 40x25. 16 colores. 8 paginas.
  ;     03h - modo texto. 80x25. 16 colores. 8 paginas.
  ;     13h - modo grafico. 40x25. 256 colores. 
  ;           320x200 pixeles. 1 pagina. 
  mov ax,0013h
  int 10h
  mov ax, 0A000h
  mov ds, ax  ; DS = A000h (memoria de graficos).

  ; ============== Franjas horizontales ===================
  ; Pintar 10 franjas horizontales de 20 pixeles de ancho
  ; cada una. La primer franja usara el indice 0 de la 
  ; paleta de colores, y asi sucesivamente. 
  ; Es decir, tenemos que pintar toda la pantalla 64,000
  ; pixeles, pero cada 6,400 pixeles cambiamos el color.
  mov cx,0FA00h ; todos los pixeles de la pantalla
  xor dx,dx ; color para cada franja
  xor bx,bx ; contador de pixeles por franja
  xor di,di

  ciclo_1:
  mov [di], dx ; poner color en A000:DI
  inc di
  inc bx
  cmp bx,6400
  jne sig_pix1
            ; nueva franja
  xor bx,bx ; resetear contador de pixeles por franja
  inc dx    ; cambiar color
  sig_pix1:
  loop ciclo_1

  ; esperar por tecla
  mov ah,10h
  int 16h
  
  ; ======= Cambiar paleta de colores a tonos de azul =====
  mov dx,3c8h ; Empezamos a modificar la paleta de colores
  mov al,0    ; desde la entrada 0
  out dx,al
  inc dx      ; DX = 3C9h.
  mov cx,10

  ciclo_2:   ; Modificar 10 entradas de la paleta
  mov al,0   ; Rojo.
  out dx,al
  mov al,0   ; Verde
  out dx,al
  mov al,6   ; Azul
  mul cl
  out dx,al
  loop ciclo_2

  ; esperar por tecla
  mov ah,10h
  int 16h

  ; ======= Cambiar paleta de colores a tonos de verde =====
  mov dx,3c8h ; Empezamos a modificar la paleta de colores
  mov al,0    ; desde la entrada 0
  out dx,al
  inc dx      ; DX = 3C9h.
  mov cx,10

  ciclo_3:   ; Modificar 10 entradas de la paleta
  mov al,0   ; Rojo.
  out dx,al
  mov al,6   ; Verde
  mul cl
  out dx,al
  mov al,0   ; Azul
  out dx,al
  loop ciclo_3

  ; esperar por tecla
  mov ah,10h
  int 16h

  ; regresar a modo texto
  mov ax,0003h
  int 10h
  
  ; finalizar el programa
  mov ax,4c00h
  int 21h
  ret
main endp
end

17 comentarios:

  1. como puedo probar tu código que instalo?
    Estoy aprendiendo Ensamblador y uso radasm lo puedo probar aca?

    ResponderEliminar
  2. Hola Gara,

    Muchas gracias por tu interés en el blog. Estoy usando masm y el emulador DOSBox para ensamblar y ejecutar los programas. El siguiente post describe los pasos.

    Saludos.

    ResponderEliminar
  3. hola otra vz lo provbe pero me sale esto "this system does not support fullscreen mode. choose 'chose' to terminate the application"
    uhmmm xq?? tiene algo q ver con la pantalla por eso entendi con fullscreen gracias

    ResponderEliminar
    Respuestas
    1. Hola Gelfre, intentaste correr el ejecutable directamente en Windows (es decir dando doble clic en el ejecutable) o desde la terminal de DOSBox. Pareciera que lo intentaste de la primer forma. Saludos.

      Eliminar
    2. sip ... lo hice directamente... dosbox?? como eso ... ??
      io solo conosco turbo assembler el codigo fuente lo ensamble con TASM y TLINK y = me salio ese error ... tamb tengo proyectos de mi compañeros de otros semestres y algunos me sale ese error.. y otros corre normal.. ha que sedeve eso... me podrias dejar tu correo ...@hotmail o gmail?? porfavor... :)

      Eliminar
    3. Hola Gelfre, el programa de DOSBox al que nos referimos se encuentra mencionado en este post (donde dejaste otro comentario): http://tipsparaisc.blogspot.mx/2012/03/ensamblador-8086-en-ubuntu.html

      En esta otra liga lo puedes descargar y aquí también hay instrucciones detalladas para instalarlo y usarlo:
      http://www.prashanthpai.com/blog/run-masm-8086-assembler-in-ubuntu-or-windows-7x64-using-dosbox/

      Todos los códigos que hemos presentado los hemos corrido con esta herramienta. Además, estamos usando MASM y LINK, por lo que la sintaxis del código es distinta y es por eso que te están saliendo errores al ensamblarlo con TASM y linkearlo con TLINK. Saludos.

      Eliminar
    4. aia gracias... me es de gran ayuda ... XD... a estududiar... ggg se dice k escribir el codigo no es tan dificil como pensar... como hacerlo ggg xd gracias.. :P

      Eliminar
    5. Hola Gelfre, según entiendo si lo pudiste ensamblar y ligar con TASM y TLINK, el problema fue en la ejecución, correcto? El problema es que ciertas operaciones de ensamblador no son compatibles con versiones nuevas de sistemas operativos como Windows Vista o Windows 7. Para ello sirve DOSBox, DOSBox emula un ambiente MS-DOS.

      Si adaptas las instrucciones de las ligas que te puso Mariana, yo creo que puedes también ensamblar tus programas con TASM y TLINK dentro de DOSBox y ejecutarlos.

      Saludos.

      Eliminar
    6. uhmm hay alguno color transparente se que suena ... ggg
      pero como podria hacer para que un cuadradito de ese mapa de bits digamoslo me muestre el color del fondo.....

      Eliminar
    7. Hola Gelfre, la función LoadBMP del post "Ensamblador 8086 Desplegar una imagen BMP" se encarga de poner los pixeles en la pantalla. Actualmente copia una linea del archivo BMP y la envía a la pantalla; primero habría que modificar este código para que despliegue pixel por pixel, en lugar de línea por línea.

      Después podemos definir un valor como transparente, tal que al ir desplegando pixel por pixel, si un pixel es del color que definimos como transparente simplemente lo ignoramos. De esa forma si ese pixel ya tenía un color previo, no lo sobrescribimos y damos el efecto de color transparente.

      Saludos.

      Eliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Hola buenos días, muy interesante tu información. Tengo una pregunta, actualmente con las tarjetas de video cuál es la direccióninicial para, digamos, una resolución de 1200x800 a 32 bits. ¿Sigue siendo la misma dirección de A000:0000?

    ResponderEliminar
    Respuestas
    1. Hola Rodrigo, muchas gracias, si buscas en google por "VESA programming information" encontrarás información relacionada a mayores resoluciones. El siguiente capítulo de un libro contiene buena información. Saludos.

      Eliminar
  6. hola use el programa y me dio resultados solo tengo una duda sera que se le puede poner unas letras en medio indicando q color es el que se muestraes que asi me lo pidio el profesor pero no se como hacerlo gracias

    ResponderEliminar
    Respuestas
    1. Hola Cristian, creo que los mismos servicios que se usan para desplegar texto en modo no-grafico, tambien se pueden usar en este caso. Si mal no recuerdo, las letras se desplegeran algo grandes. El texto lo debes poner despues de crear las franjas horizontales y antes de cambiar la paleta de colores. Nos avisas si si se pueden desplegar las letras asi. Saludos.

      Eliminar
  7. como puedo modificarlo y que solo aparezca una sola linea en diagonal?

    ResponderEliminar