martes, 3 de abril de 2012

Ensamblador 8086 Modo Gráfico 13h

El modo gráfico 13h nos permite manejar la pantalla como una matriz de 320 píxeles de ancho por 200 píxeles de alto. Cada píxel puede tomar uno de 256 colores, estos colores están definidos en una paleta de colores la cual podemos configurar.

El siguiente programa despliega primero líneas verticales, espera por una tecla, despliega líneas horizontales y espera por otra tecla. Los colores mostrados son los de la paleta default de colores. Usamos la interrupción 10h, servicio 0Ch para modificar los píxeles; el parámetro AL más que especificar directamente el color, indica la entrada de la paleta de colores que se debe usar para el píxel ubicado en la fila DX y la columna CX.

En el siguiente post veremos con más detalle la paleta de colores y cómo podemos pintar en pantalla mediante escrituras a memoria en lugar de usar la interrupción 10h.

La siguiente entrada en Wikipedia muestra la paleta default de colores que corresponde a los colores mostrados por el programa.

.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

  ; ============== Lineas verticales ======================
  ; INT 10h / AH = 0Ch - cambiar color de un pixel.
  ;   AL = color
  ;   CX = columna
  ;   DX = fila

  ; for CX=0 to 256
  ;   for DX=0 to 200
  ;     Poner pixel (DX,CX) con color CX
  mov cx,0000h
  mov dx,0000h

  ciclo_1:
  mov ah,0ch
  mov al,cl
  int 10h
  inc dx
  cmp dx,200
  jne ciclo_1

  mov dx,0000h
  inc cx
  cmp cx,256
  jne ciclo_1

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

  ; ============== Lineas horizontales ======================
  ; INT 10h / AH = 0Ch - cambiar color de un pixel.
  ;   AL = color
  ;   CX = columna
  ;   DX = fila

  ; for DX=0 to 200
  ;   for CX=0 to 320
  ;     Poner pixel (DX,CX) con color DX
  mov cx,0000h
  mov dx,0000h

  ciclo_2:
  mov ah,0ch
  mov al,dl
  int 10h
  inc cx
  cmp cx,320
  jne ciclo_2
  
  mov cx,0000h
  inc dx
  cmp dx,200
  jne ciclo_2

  ; 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

2 comentarios: