Las variables de la BIOS comienzan en el segmento
de memoria 40h, justo después de la tabla de vectores de interrupción.
Son empleadas por los programas de control ubicados en las memorias ROM del
ordenador. En general, siempre es preferible utilizar una función de la BIOS
que modificar directamente sus variables, aunque a veces ello no es posible o
puede no resultar conveniente. Los campos colocados entre llaves ('{' y '}') no
están documentados por IBM y podrían cambiar en el futuro. Los códigos entre
corchetes indican a qué máquinas o configuraciones, en exclusiva, se aplica la
información.
Offset Tamaño Descripción
00h WORD Dirección E/S base del primer puerto serie (0 si no instalado)
02h WORD Dirección E/S base del segundo puerto serie (0 si no instalado)
04h WORD Dirección E/S base del tercer puerto serie (0 si no instalado)
06h WORD Dirección E/S base del cuarto puerto serie (0 si no instalado)
Nota: Los campos de arriba son rellenados en estricto orden por
el programa POST de la BIOS que inicializa el sistema, sin
dejar huecos. Los puertos serie del DOS y de la BIOS pueden
redefinirse modificando estos campos.
08h WORD Dirección E/S base del primer puerto paralelo (0 si no instalado)
0Ah WORD Dirección E/S base del segundo puerto paralelo (0 si no instalado)
0Ch WORD Dirección E/S base del tercer puerto paralelo (0 si no instalado)
0Eh WORD [Máquinas no PS]:
Dirección E/S base del cuarto puerto paralelo (0 si no instalado)
[Máquinas PS]:
Segmento del área de datos extendida de la BIOS
Nota: Los campos de arriba son rellenados en estricto orden por
el programa POST de la BIOS que inicializa el sistema, sin
dejar huecos. Los puertos paralelo del DOS y de la BIOS
pueden redefinirse modificando estos campos.
10h WORD Hardware instalado:
bits 15-14: número de puertos paralelos
bit 13: [PC Convertible] = 1 si hay modem interno
bit 12: reservado
bits 11- 9: número de puertos serie
bit 8: reservado
bits 7- 6: número de disqueteras - 1
bits 5- 4: modo de vídeo inicial
00b = EGA,VGA,PGA
01b = 40 x 25 color
10b = 80 x 25 color
11b = 80 x 25 mono
bit 3: reservado
bit 2: [máquinas PS] = 1 si hay dispositivo apuntador
[máquinas no PS] reservado
bit 1: = 1 si hay coprocesador
bit 0: = 1 si hay disquete disponible para arrancar
12h BYTE [PC Convertible] estado del POST
[AT] {Banderines de inicialización de los test de fabricación}
13h WORD Tamaño de memoria convencional en kbytes (0-640)
15h BYTE [AT] {Usado en los test de fabricación}
16h BYTE [AT] {Usado en los test de fabricación}
[PS/2 Mod 30] Banderines de control de la BIOS
17h BYTE Banderines de estado del teclado 1:
bit 7 =1 INSert activo
bit 6 =1 Caps Lock activo
bit 5 =1 Num Lock activo
bit 4 =1 Scroll Lock activo
bit 3 =1 cualquier Alt pulsado
bit 2 =1 cualquier Ctrl pulsado
bit 1 =1 Shift izquierdo pulsado
bit 0 =1 Shift derecho pulsado
18h BYTE Banderines de estado del teclado 2:
bit 7 = 1 INSert pulsado
bit 6 = 1 Caps Lock pulsado
bit 5 = 1 Num Lock pulsado
bit 4 = 1 Scroll Lock pulsado
bit 3 = 1 Estado de pausa activo
bit 2 = 1 Sys Req pulsada
bit 1 = 1 Alt izquierdo pulsado
bit 0 = 1 Ctrl izquierdo pulsado
19h BYTE Teclado: Area de trabajo para Alt-nnn (nnn=teclado numérico)
1Ah WORD Teclado: puntero al próximo carácter en el buffer
1Ch WORD Teclado: puntero a la primera entrada vacía en el buffer
1Eh 16 WORDs Buffer del teclado (cola circular, ver offsets 80h y 82h para moverlo)
3Eh BYTE Estado de recalibración del disquete:
bit 7 = 1 Se ha producido interrupción hardware del disquete
bits 6-4 reservados
bit 3 = 1 Recalibrada disquetera 3
bit 2 = 1 Recalibrada disquetera 2
bit 1 = 1 Recalibrada disquetera 1
bit 0 = 1 Recalibrada disquetera 0
3Fh BYTE Estado del motor del disquete:
bit 7 = 1 la operación en curso es escritura o formateo
= 0 la operación en curso es lectura o verificación
bit 6 reservado
bits 5-4 número de disquetera seleccionada (0-3)
bit 3 = 1 motor de la disquetera 3 en marcha
bit 2 = 1 motor de la disquetera 2 en marcha
bit 1 = 1 motor de la disquetera 1 en marcha
bit 0 = 1 motor de la disquetera 0 en marcha
40h BYTE Contador de tics de reloj que faltan para parar motor de la disquetera
41h BYTE Estado de la última operación de disco (0 = correcta)
bit 7 = 1 unidad no preparada
bit 6 = 1 error de posicionamiento del cabezal
bit 5 = 1 fallo general del controlador
bits 4-0:
00h no hay error
01h solicitud incorrecta
02h no encontrada la marca de direcciones
03h error de protección contra escritura
04h sector no encontrado
06h línea de disco cambiado activa
08h el DMA se ha desbordado
09h el DMA ha cruzado una frontera de 64k
0Ch medio físico desconocido
10h fallo de CRC al leer
42h 7 BYTEs Bytes de estado/comandos de la Disquetera/Disco fijo
49h BYTE Modo de vídeo activo
4Ah WORD Número de columnas en pantalla
4Ch WORD Tamaño del buffer de vídeo de la página activa en bytes
4Eh WORD Desplazamiento sobre la memoria de pantalla de la página activa
50h 16 BYTEs Posición del cursor (columna, fila) para las 8 páginas
60h WORD Tipo de cursor, compatible 6845, byte alto=línea inicial, bajo=final
62h BYTE Página activa
63h WORD Dirección E/S base del controlador de vídeo: color=03D4h, mono=03B4h
65h BYTE Valor actual del registro de selección de modo 03D8h/03B8h
66h BYTE Valor actual almacenado en el registro de paleta de la CGA 03D9h
67h DWORD Punto de retorno al modo real tras ciertos resets del POST
6Bh BYTE Ultima interrupción no esperada por el POST
6Ch DWORD Tics de reloj (1/18,2 segundos) ocurridos desde medianoche
70h BYTE Flag de medianoche, <> 0 si el contador pasa de las 23:59:59.99
71h BYTE Banderín de Ctrl-Break: bit 7=1
72h WORD Banderín de reset del POST:
= 1234h si no realizar chequeo de memoria (arranque caliente)
= 4321h [solo PS/2 MCA] si preservar la memoria al arrancar
= 5678h [PC Convertible] sistema detenido
= 9ABCh [PC Convertible] test de fabricación
= ABCDh [PC Convertible] bucle del POST
= 64h modo «Burn-in»
74h BYTE Estado de la última operación del disco fijo: {salvo unidades ESDI}
00h no hubo error
01h función solicitada incorrecta
02h no encontrada marca de direcciones
03h error de protección contra escritura
04h sector no encontrado
05h fallo en el reset
07h fallo en la actividad de los parámetros del disco
08h el DMA se ha desbordado
09h alineamiento de datos incorrecto para el DMA
0Ah detectado banderín de sector erróneo
0Bh detectada pista errónea
0Dh número incorrecto de sectores para el formateo
0Eh detectada marca de direcciones de control
0Fh nivel de arbitrio del DMA fuera de rango
10h error ECC o CRC incorregible
11h error de datos ECC corregido
20h fallo general del controlador
40h fallo en el posicionamiento del cabezal
80h fuera de tiempo, no responde
AAh disco no preparado
BBh error indefinido
CCh fallo de escritura en el disco seleccionado
E0h el registro de errores es cero
FFh fallo de sentido
75h BYTE Disco fijo: número de discos fijos
76h BYTE Disco fijo: byte de control {IBM lo documenta sólo en el XT}
77h BYTE Disco fijo: offset del puerto E/S {IBM lo documenta sólo en el XT}
78h 3 BYTEs Contadores de «time-out» para los puertos paralelos 1-3
7Bh BYTE Contador «time-out» para puerto paralelo 4 [máquinas no PS]
bit 5 = 1 si especificación de DMA virtual soportada [PS] (ver INT 4B)
7Ch 4 BYTEs Contadores de «time-out» para los puertos serie 1-4
80h WORD Offset de inicio del buffer del teclado respecto al segmento 40h
(normalmente 1Eh)
82h WORD Offset del fin del buffer del teclado+1 respecto al segmento 40h
(normalmente 3Eh)
[La BIOS del XT con fecha 8/11/82 acaba aquí]
84h BYTE Vídeo: líneas en pantalla menos 1 en EGA/MCGA/VGA
85h WORD Video: altura del carácter, en pixels, en EGA/MCGA/VGA
87h BYTE Vídeo: control de EGA/VGA.
bit 7: = 1 si no limpiar RAM (ver INT 10h, AH=0)
88h BYTE Vídeo: switches EGA/VGA [MCGA: reservado]
89h BYTE Vídeo: MCGA/VGA opción de control del modo
8Ah BYTE Vídeo [MCGA/VGA]: índice en tabla Códigos de Combinaciones de Pantalla
8Bh BYTE Control del medio físico del disco [no XT]:
bits 7-6: Ultima tasa de transferencia fijada por el controlador:
00=500kbps, 01=300kbps, 10=250kbps, 11=1Mbps
bits 5-4: Ultimo «step rate» seleccionado en el disquete:
00-0Ch, 01=0Dh, 10=0Eh, 11=0Ah
bits 3-2: {Tasa de transferencia al inicio de la operación}
bits 1-0: reservado
8Ch BYTE Estado del controlador del disco fijo [no XT]
8Dh BYTE Estado de error del controlador de disco fijo [no XT]
8Eh BYTE Control de interrupciones del disco fijo [no XT]
8Fh BYTE Información del controlador de disquete [no XT]:
bit 7: reservado
bit 6: = 1 si disco 1 determinado
bit 5: = 1 si disco 1 es multi-ratio, válido si disco determinado
bit 4: = 1 si disco 1 soporta 80 pistas, siempre válido
bit 3: reservado
bit 2: = 1 si disco 0 determinado
bit 1: = 1 si disco 0 es multi-ratio, válido si disco determinado
bit 0: = 1 si disco 0 soporta 80 pistas, siempre válido
90h BYTE Estado físico de la disquetera 0
91h BYTE Estado físico de la disquetera 1
bits 7-6: tasa de transferencia a disquete: 00=500kbps, 01=300kbps,
10=250kbps, 11=1Mbps
bit 5: = 1 si doble salto de pista requerido (e.g. 360Kb en 1.2Mb)
bit 4: = 1 si superficie ya determinada
bit 3: reservado
bits 2-0: a la salida de la BIOS, contiene:
000 intentando 360Kb en 360Kb
001 intentado 360Kb en 1.2Mb
010 intentando 1.2MB en 1.2Mb
011 determinado 360Kb en 360Kb
100 determinado 360Kb en 1.2Mb
101 determinado 1.2Mb en 1.2Mb (continúa en pág siguiente)
110 reservado
111 todos los demás formatos
92h BYTE Estado físico de la disquetera 0 al inicio de la operación
93h BYTE Estado físico de la disquetera 1 al inicio de la operación
94h BYTE Número de pista en curso de la disquetera 0
95h BYTE Número de pista en curso de la disquetera 1
96h BYTE Estado del teclado, byte 1
bit 7 = 1 proceso de lectura de ID en marcha
bit 6 = 1 el último código leído fue el primero de dos códigos ID
bit 5 = 1 forzar Num Lock si se lee el ID y es un teclado expandido
bit 4 = 1 teclado expandido instalado
bit 3 = 1 Alt derecho pulsado
bit 2 = 1 Ctrl derecho pulsado
bit 1 = 1 último código leído fue E0h
bit 0 = 1 último código leído fue E1h
97h BYTE Estado del teclado, byte 2
bit 7 = 1 error de transmisión del teclado
bit 6 = 1 actualización de LEDs en curso
bit 5 = 1 código RESEND recibido del teclado
bit 4 = 1 código ACK recibido del teclado
bit 3 reservado, debe ser cero
bit 2 LED de Caps Lock
bit 1 LED de Num Lock
bit 0 LED de Scroll Lock
98h DWORD Timer2: [AT, PS excepto Mod 30] puntero al banderín de espera de
usuario completada (ver INT 15, AX=8300h)
9Ch DWORD Timer2: [AT, PS exc Mod 30] contador de espera del usuario (microseg.)
A0h BYTE Timer2: [AT, PS exc Mod 30] banderín de espera activa:
bit 7 = 1 tiempo de espera transcurrido
bits 6-1 reservados
bit 0 = 1 INT 15h, AH=86h ha sucedido
A1h 7 BYTEs Reservado para adaptadores de red local (¿será verdad?)
A4h DWORD [PS/2 Mod 30] Vector de la interrupción del disco duro preservada
A8h DWORD Video: En EGA/MCGA/VGA, puntero al «Video Save Pointer Table»
ACh-AFh Reservados
B0h BYTE (Phoenix 386 BIOS 1.10 10a) contador para retardo LOOP cuando se pita
ante un buffer de teclado lleno
B0h DWORD Puntero al controlador de disco óptico 3363.
B4h WORD Reservado
B6h 3 BYTEs ¿Reservado para el POST?
B9h 7 BYTEs ???
C0h 14 BYTEs Reservado
CEh WORD ¿¿¿Cuenta de días desde el último arranque???
D0h-EFh Reservado
D0h-DCh Usado por Digiboard MV/4
F0h-FFh Reservado para el usuario
100h BYTE Byte de estado de Print Screen
10Eh BYTE Estado de BREAK al inicio de la ejecución de BASICA.COM
10Fh BYTE Banderín: 02h si BASICA v2.10 está ejecutándose
116h DWORD INT 1Bh al inicio de la ejecución de BASICA.COM
11Ah DWORD INT 24h al inicio de la ejecución de BASICA.COM
El 8086 es un microprocesador de 16 bits y, por tanto, no puede trabajar directamente con números mayores de 16 bits. Teóricamente, esto significaría que el 8086 podría acceder sólo a un máximo de 64 KB de memoria. Sin embargo, el esquema de direccionamiento de 20 bits que utiliza, expande el intervalo de direccionamiento de las posiciones de memoria con las que puede trabajar desde 216 (65 536) a 220 (1 048 576). Pero el 8086 sigue estando limitado a su capacidad de procesamiento de 16 bits. Para acceder a las direcciones de 20 bits debe utilizar un método de direccionameinto que encaje en el formato de 16 bits.
Direccionamiento segmentado
El 8086 divide el espacio de memoria direccionable en segmentos, cada uno de los cuales contiene 64 KB de memoria. Cada segmento comienza en una dirección de párrafo -esto es, la posición deun byte que es divisible por 16-. Para acceder a bytes o palabras individuales se utiliza un desplazamiento (offset) que apunta al byte exacto de un segmento determinado. Como el desplazamiento se mide siempre en relación al comienzo del segmento, se le llama dirección relativa o desplazamiento relativo.
Juntos, un segmento y un desplazamiento forman una dirección segmentada que puede designar un byte en el espacio de memoria de 1 MB del 8086. Éste convierte una dirección segmentada de 32 bits utilizando el valor del segmento como un valor de párrafo y añadiéndole el valor del desplazamiento. En efecto, el 8086 mueve el valor del segmento 4 bits a la izquierda y le suma el valor del desplazamiento para crear una dirección de 20 bits.
La siguiente figura muestra cómo se lleva a cabo esto para un valor de segmento de 1234h y para un valor de desplazamiento de 4321h. La dirección segmentada se escribe 1234:4321, con valores hexadecimales de 4 dígitos y con dos puntos separando al segmento del desplazamiento.

En este ejemplo, la decodificación de la dirección segmentada se realiza desplazando el valor del segmento (1234h) a la izquierda 4 bits (un dígito hexadecimal) y añadiéndolo al desplazamiento 4321h para obtener la dirección física de 20 bits 16661h.
En el 8086 hay, obviamente, un gran número de posibilidades de solapamiento en el intervalo que puede ser expresado mediante direcciones segmentadas. Cualquier dirección física puede ser representada por hasta 1012 direcciones segmentadas. Por ejemplo, la dirección física 16661h puede representarse no sólo como 1234:4321, sino también como 1666:0001, 1665:0011, 1664:0021, y así sucesivamente.