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.