Int 13h

INT 13h es la forma abreviada para la llamada de interrupción del BIOS 13hex, el cual es el vector de interrupción 20º en un sistema de arquitecturas de computadoras basada en x86. Esta interrupción se encarga de las operaciones típicas de acceso a las unidades de almacenamiento tales como discos duros y disquetes.

Características

Los sistemas operativos de modo real como MS-DOS llaman a esta interrupción para operaciones de disco y de disquete. Las aplicaciones de MS-DOS llaman a la interrupción int 21h para acceso al disco en vez de la interrupción INT 13h.

Los nuevos sistemas operativos como Microsoft Windows NT y sus derivados (ej. NT 4.0, XP y server 2003) o linux interceptan la llamada a esta interrupción y se la pasan a sus mecanismos nativos de acceso al disco o disquete. Windows 9x y Windows 3.x también hacen esto cuando utilizan el modo de acceso a archivos de 32 bits.

La rutina original de la interrupción soporta discos de 504 MB o más grandes hasta un límite de 8 GiB porque utiliza el modo de acceso CHS, para romper esta barrera, se crearon las extensiones de la INT 13h que utilizan el modo LBA (direcciones de 64-bits) para acceder al disco, soportando así hasta 8 ZiB de espacio (También se puede usar modos LBA de 32-bits o 48-bits que soportan 2 TiB o 128 PiB respectivamente).

Lista de servicios de la INT 13h

Tabla de unidades

DL = 00hPrimera disquetera (Unidad "A:")
DL = 01hSegunda disquetera (Unidad "B:")
DL = 80hPrimer disco duro
DL = 81hSegundo disco duro
DL = FFhÚltimo disco duro soportado por la BIOS

Tabla de estado

AH = 00hLa operación finalizó sin problemas
AH = 01hFunción invalida en AH o parámetro no válido
AH = 02hMarca de dirección no encontrada
AH = 03hEl disco está protegido contra la escritura
AH = 04hSector no encontrado o error de lectura
AH = 05hLos datos no se verificaron correctamente
AH = 06hDisco cambiado (Disquetera)
AH = 07hActividad de parámetros de disco fallada (disco duro)
AH = 08hDesborde de DMA
AH = 09hError de límite de datos (Se intentó DMA sobrepasando los 64 KB)
AH = 0AhDetectado sector dañado
AH = 0BhDetectado cilindro dañado
AH = 0ChCilindro insoportado o medio inválido
AH = 0DhNúmero inválido de sectores en formateo (disco duro PS/2)
AH = 0EhControl de marca de datos detectado
AH = 0FhNivel de arbitración de DMA fuera de rango
AH = 10hError incorregible de CRC o ECC
AH = 11hDatos ECC coregidos
AH = 20hError de controlador
AH = 31hNo hay medio en unidad
AH = 32hTipo de unidad incorrecta guardada en CMOS (Compaq)
AH = 40hFallo seek
AH = 80hFuera de tiempo (no está listo)
AH = AAhUnidad no preparada
AH = B0hVolumen no bloqueado en unidad (INT 13h EXT)
AH = B1hVolumen bloqueado en unidad (INT 13h EXT)
AH = B2hVolumen no eliminable (INT 13h EXT)
AH = B3hVolumen en uso (INT 13h EXT)
AH = B4hCuenta de bloqueo excedida (INT 13h EXT)
AH = B5hPetición de expulsión valida fallida (INT 13h EXT)
AH = B6hVolumen presente pero protegido contra escritura (INT 13h EXT)
AH = BBhError indefinido
AH = CChEscritura fallida
AH = E0hError de estado de registro
AH = FFhOperación sense fallida

Servicios

AH = 00hTODOSReiniciar controlador de disco
AH = 01hTODOSComprobar estado de la unidad
AH = 02hTODOSLeer sectores
AH = 03hTODOSEscribir sectores
AH = 04hTODOSVerificar sectores
AH = 05hTODOSFormatear cilindro (formateo a bajo nivel)
AH = 08hTODOSLeer parámetros de unidad
AH = 09hHDIniciar controlador de disco
AH = 0AhHDLeer sectores largos
AH = 0BhHDEscribir sectores largos
AH = 0ChHDMover cabeza a cilindro
AH = 0DhHDReiniciar unidades
AH = 0EhPS/2Test de lectura del controlador
AH = 0FhPS/2Test de escritura del controlador
AH = 10hHDProbar si la unidad está lista
AH = 11hHDRecalibrar unidad
AH = 12hPS/2Test de la RAM del controlador
AH = 13hPS/2Test de la unidad
AH = 14hHDDiagnóstico del controlador
AH = 15hTODOSLeer tipo de unidad
AH = 16hFDDetectar cambio de medios
AH = 17hFDSelecionar tipo de medio a formatear (Usado por la versión de DOS <= 3.1)
AH = 18hFDSelecionar tipo de medio a formatear (Usado por la versión de DOS >= 3.2)
AH = 41h, BX = 55AAhEXTComprobar si la extensiones están instaladas
AH = 42hEXTLeer sectores
AH = 43hEXTEscribir sectores
AH = 44hEXTVerificar sectores
AH = 45hEXTBloquear/Desbloquear unidad
AH = 46hEXTExpulsar unidad
AH = 47hEXTMover cabeza a sector
AH = 48hEXTLeer parámetros de la unidad
AH = 49hEXTDetectar cambio de tipo de unidad
AH = 4AhCD-ROM arrancableIniciar emulación de disco
AX = 4B00hCD-ROM arrancableTerminar emulación de disco
AX = 4B01hCD-ROM arrancableVer estado
AH = 4EhCD-ROM arrancableIniciar emulación de disco y bootear
AX = 4D00hCD-ROM arrancableRetornar catálogo de booteo
TODOS: Puede ser utilizado para disco duro y disquete
HD: Solo puede ser utilizado por el disco duro
FD: Solo puede ser utilizado por el disquete
PS/2: Solo para discos duros de equipos PS/2
EXT: Extensiones de la INT 13h

INT 13h AH=00h - Reiniciar controlador de disco

Parámetros:[1]

AH 00h
DL Unidad (ej: 80h - Primer disco duro)

Ejemplo:

MOV AH,00h
MOV DL,00h ;Primera disquetera
INT 13h

INT 13h AH=02h - Leer sectores

Parámetros:[1]

AH = 02hLeer sectores
AL = ??Número de sectores a leer (tiene que ser mayor que 0)
CH = ??8 bit bajos del número de cilindro
CL = ??Número de sector (bits 0-5), 2 bits altos de número de cilindro (bits 6-7, solo disco duro)
DH = ??Número de cabeza
DL = ??Número de unidad
ES:BXBuffer de datos

Retorna:

CFActivada en error, limpia si no hay error
AH = ??Estado
AL = ??Número de sectores transferidos

Ejemplo:

MOV AH,02h
MOV AL,10 ;10 sectores a leer
MOV CH,02 ;Cilindro 2
MOV CL,01 ;Empezamos desde el primer sector
MOV DH,01 ;Cabeza 1
MOV DL,00h ;Primera disquetera
MOV BX,0800h ;ES:BX - 0000:0800
INT 13h
JMP 0000h:0800h ;Saltamos a la direccion que acaba de leer

INT 13h AH=04h - Verificar sectores

Parámetros:[1]

AH = 04hVerificar sectores
AL = ??Número de sectores a verificar (tiene que ser mayor de 0)
CH = ??8 bits bajos del número del cilindro
CL = ??Número de sector (Bits 0-5), 2 bits altos del número del cilindro (Sólo disco duro)
DH = ??Número de cabeza
DL = ??Número de unidad
ES:BXBuffer de datos

Retorna:

CFActivada en error, limpia si no hay error
AH = ??Estado
AL = ??Número de sectores verificados

Ejemplo:

MOV AH,04h
MOV AL,18 ;18 sectores ha comprobar
MOV CH,3 ;Cilindro 3
MOV CL,1 ;Sector 1
MOV DH,00 ;Cabeza 0
MOV DL,00 ;Primera disquetera
MOV BX,00 ;Ponemos el buffer en 0000:0800
MOV ES,BX
MOV BX,0800h
INT 13h
JC sector_malo_o_error
;Si viene aquí los sectores están bien
sector_malo_o_error:
;Si viene aquí hay un sector dañado o ha habido otro tipo de error

INT 13h AH=41h - Comprobar si las extensiones están instaladas

Parámetros:

AH = 41hComprobar extensiones
BX = 55AAhComprobar extensiones
DL = ??Número de unidad

Retorna:

CFActivada en error (no hay extensiones), limpia si no hay error
AH = ??Número de la versión mayor de las extensiones (01h = 1.x, 20h = 2.0 / EDD-1.0, 21h = 2.1 / EDD-1.1, 30h = EDD-3.0)
AL = ??Uso Interno
BX = 55AAhDevuelve 55AAh si están instaladas
CX = ??Lista de bits de las extensiones instaladas (Bit 0-15)
DH = ??Versión de las extensiones (v2.0+ ??? -- no presente en 1.x)

Ejemplo:

MOV AH,41h
MOV BX,55AAh
MOV DL,80h ;Primer disco duro
INT 13h
JC no_hay_extensiones
;Si viene aquí las extensiones están instaladas
no_hay_extensiones:
;Si viene aquí las extensiones no están instaladas

Véase también

Referencias

  1. Bose, Sanjay K. (1996). Hardware and Software of Personal Computers (en inglés). New Age International. p. 84.

Enlaces externos

Este artículo ha sido escrito por Wikipedia. El texto está disponible bajo la licencia Creative Commons - Atribución - CompartirIgual. Pueden aplicarse cláusulas adicionales a los archivos multimedia.