Int 10h
INT 10h es la forma abreviada de la interrupción 0x10. Esta interrupción controla los servicios de pantalla del PC.
Características
Esta interrupción se utiliza básicamente para mostrar texto en la pantalla (sin llamar a la INT 21h de MS-DOS o INT 80h de linux), para cambiar a modo gráfico, para establecer la paleta de colores, etc...
Lista de funciones soportadas
Función | Código de función | Parámetros | Retorno |
---|---|---|---|
Activa Modo de video | AH=00h | AL = Modo de video | AL = Bandera del Modo de video / byte del modo del controlador de CRT |
Asigna forma del cursor de modo de texto | AH=01h | CH = Fila inicial de scan, CL = Fila final de scan
Normalmente una celda de carácter tiene 8 líneas de scan, 0-7. Así, CX=0607h es el cursor normal de subrayado, CX=0007h es un cursor de bloque completo. Si el bit 7 de CH es activado, esto usualmente significa "Oculta el cursor"". Así CX=2607h es un cursor invisible. Algunas tarjetas de video tienen 16 líneas de scan, 00h-0Fh. Algunas tarjetas de video no usan el bit 5 de CH. Con estas, haga Inicio > Fin (ej. CX=0706h) |
|
Asigna posición del cursor | AH = 02h | BH = Página, DH = Fila, DL = Columna | |
Lee la posición del cursor y su tamaño | AH = 03h | BH = Página | AX = 0, CH = Inicio de la línea de scan, CL = Fin de la línea de scan, DH = Fila, DL = Columna |
Lee la posición del light pen (No funciona en sistemas VGA) | AH = 04h | AH = Status (0=no disparado, 1=disparado), BX = Pixel X, CH = Pixel Y, CX = número de línea del pixel para los modos 0Fh-10h, DH = Carácter Y, DL = Carácter X | |
Selecciona Página activa de la pantalla | AH = 05h | AL = Número de Página | |
Scroll up window | AH = 06h | AL = Líneas de scroll (0 = Borra), BH = Atributo de las líneas en blanco | |
Scroll down window | AH = 07h | AL = Líneas de scroll (0 = Borra), BH = Atributo de las líneas en blanco | |
Lee carácter y atributo en la posición del cursor | AH = 08h | BH = Número de Página | AH = Color, AL = Carácter |
Escribe carácter y atributo en la posición del cursor | AH = 09h | AL = Carácter, BH = Número de Página, BL = Color, CX = Número de veces para escribir el carácter | |
Escribe carácter solo en la posición del cursor | AH = 0Ah | AL = Carácter, BH = Número de Página, CX = Número de veces para escribir el carácter | |
Asigna color de fondo/borde | AH = 0Bh, BH = 00h | BL = Color del fondo/borde (el borde solo en modos de texto) | |
Asigna paleta | AH = 0Bh, BH = 01h | BL = ID de Paleta (solo fue válido en el CGA, pero las nuevas tarjetas lo soportan en muchos o todos los modos gráficos) | |
Escribe pixel gráfico | AH = 0Ch | AL = Color, BH = Página, CX = X, DX = Y | |
Lee pixel gráfico | AH = 0Dh | BH = Página, CX = X, DX = Y | AL = Color |
Salida de teletipo | AH = 0Eh | AL = Carácter, BL = Color (solo en modo gráfico) | |
Lee modo de video actual | AH = 0Fh | AL = Modo de video | |
Escribe string (EGA+, lo que significa como mínimo un PC AT) | AH = 13h | AL = Modo de escritura, BH = Página, BL = Color, CX = Longitud del string, DH = Fila, DL = Columna, ES:BP = Posición del string | |
Tabla de modos de vídeo
Modo | Resolución | Colores | Tipo |
AL = 00h | 40x25 | 16 | Texto |
AL = 01h | 40x25 | 16 | Texto |
AL = 02h | 80x25 | 16 | Texto |
AL = 03h | 80x25 | 16 | Texto |
AL = 04h | 320x200 | 4 | Gráfico |
AL = 05h | 320x200 | 4 | Gráfico |
AL = 06h | 640x200 | 2 | Gráfico |
AL = 07h | 80x25 | 2 | Texto |
AL = 0Dh | 320x200 | 16 | Gráfico |
AL = 0Eh | 640x200 | 16 | Gráfico |
AL = 0Fh | 640x350 | 2 | Gráfico |
AL = 10h | 640x350 | 4 | Gráfico EGA 64 KB |
AL = 10h | 640x350 | 16 | Gráfico EGA menor de 64 KB y VGA |
AL = 11h | 640x480 | 2 | Gráfico |
AL = 12h | 640x480 | 16 | Gráfico |
AL = 13h | 320x200 | 256 | Gráfico |
BX = 100h | 640x400 | 256 | Gráfico (SVGA) |
BX = 101h | 640x480 | 256 | Gráfico (SVGA) |
BX = 102h | 800x600 | 16 | Gráfico (SVGA) |
BX = 103h | 800x600 | 256 | Gráfico (SVGA) |
BX = 104h | 1024x768 | 16 | Gráfico (SVGA) |
BX = 105h | 1024x768 | 256 | Gráfico (SVGA) |
BX = 106h | 1028x1024 | 16 | Gráfico (SVGA) |
BX = 107h | 1028x1024 | 256 | Gráfico (SVGA) |
BX = 113h | 800x600 | 32K | Gráfico (SVGA) |
BX = 114h | 800x600 | 64K | Gráfico (SVGA) |
BX = 115h | 800x600 | 16M | Gráfico (SVGA) |
Lista de servicios de la INT 10h
AH = 00h | Vídeo | Establecer modo de vídeo |
AH = 01h | Vídeo | Establecer el tamaño del cursor |
AH = 02h | Vídeo | Posicionar el cursor |
AH = 03h | Vídeo | Obtener posición y tamaño del cursor |
AH = 04h | Vídeo | Obtener posición del lápiz óptico (excepto VGA) |
AH = 06h | Vídeo | Subir línea |
AH = 07h | Vídeo | Bajar línea |
AH = 0Bh BH=00h | Vídeo | Establecer color de fondo o borde |
AH = 0Bh BH=01h | Vídeo | Establecer paleta gráfica |
AH = 0Ch | Vídeo | Escribir pixel gráfico |
AH = 0Dh | Vídeo | Leer pixel gráfico |
AH = 0Eh | Vídeo | Función TeleType (escribir caracteres en la pantalla) |
AH = 0Fh | Vídeo | Obtener el modo de vídeo |
AX = 1100h | Vídeo | Cambiar fuente de vídeo (Modo Texto) |
AX = 4F02h | SVGA | Establecer modo de vídeo SVGA |
AX = 4F03h | SVGA | Obtener modo de vídeo SVGA |
INT 10h AX=1100h - Cambiar fuente de vídeo (Modo Texto)
Parámetros:
AX=1100h | Cambiar fuente de vídeo (Modo Texto) |
ES:BP | Dirección de la tabla de caracteres nuevos |
CX = ?? | Número de caracteres a cambiar |
DX = ?? | Número del carácter ASCII desde donde se empieza a cambiar las fuentes |
BH = ?? | Bloque a leer en el mapa 2 |
BL = ?? | Número de bytes por carácter |
Retorna: Nada
Ejemplo:
ORG 100h
;Este ejemplo carga una letra A personalizada
;Para probarlo ejecutar el programa en MS-DOS
push ds ;Asegurar que DS=ES
pop es
mov ax,1100h ;Funcion de cargar caracteres
mov bp,caract ;Tabla de caracteres
mov cx,1 ;Cargar 1 carácter
mov dx,61 ;Cambiar el carácter 61
mov bh,14 ;14 bytes por carácter
xor bl,bl ;Bloque 0
int 10h ;Llamamos a la INT 10h
mov ah,0Eh ;Funcion teletype
mov al,61 ;Mostrar el carácter cambiado
int 10h ;Llamamos a la INT 10h
int 20h ;Volvemos a MS-DOS
caract: ;Tabla de caracteres
db 11111111b ;Dibujo en binaro de nuestra "A" personalizada
db 11111111b
db 11000011b
db 11000011b
db 11000011b
db 11111111b
db 11111111b
db 11000011b
db 11000011b
db 11000011b
db 11000011b
db 11000011b
db 11000011b
db 11000011b
INT 10h AH=0Eh - Función TeleType
Parámetros:
AH = 0Eh | Función TeleType |
AL = ?? | Carácter a escribir |
BH = ?? | Número de página |
BL = ?? | Color de fondo (solo en modo gráfico) |
Retorna: Nada
Ejemplo:
inicio:
XOR AX,AX ; AX=0
MOV AL,03h ; Modo de texto 80x25x16
INT 10h ; Llamamos a la INT 10h
LEA SI,holamundo ; Cargamos en SI la dirección de memoria efectiva de la constante
CALL escribir_cadena ; Llamamos a la función de escribir la variable en pantalla
INT 16h ; Pedimos una tecla (AH=0)
HLT ; Paramos la ejecución
escribir_cadena:
PUSH AX ; Guardamos los registros AX y SI en la pila
PUSH SI ;
siguiente_caracter:
MOV AL,[SI] ; Movemos la siguiente o primera letra de la variable de SI a AL
CMP AL,0 ; ¿Hemos terminado de escribir en pantalla?
JZ terminado ; Saltamos si es 0, entonces hemos terminado de escribir
INC SI ; Incrementamos el valor de SI (Siguiente carácter)
MOV AH,0Eh ; Función TeleType
INT 10h ; Llamamos a la interrupción 10h
JMP siguiente_caracter ; Hacemos un bucle para escribir el siguiente carácter
terminado:
POP SI ; Liberamos los registros SI y AX de la pila
POP AX ;
RET ; Salimos de la función
holamundo db "¡Hola Mundo!",0Dh,0Ah,0 ; Variable con la cadena de texto
; 0Dh y 0Ah se usan para un salto de linea
; y 0 para indicar que es el final de la linea