Int 13h

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

INT 13h es la forma abreviada de la interrupción 0x13. Esta interrupción se encarga de las operaciones típicas de acceso a los discos duros y a los disquetes.

Características[editar]

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 por que 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 ó 48-bits que soportan 2 TiB ó 128 PiB respectivamente).

Lista de servicios de la INT 13h[editar]

Tabla de unidades[editar]

DL = 00h Primera disquetera (Unidad "A:")
DL = 01h Segunda disquetera (Unidad "B:")
DL = 80h Primer disco duro
DL = 81h Segundo disco duro
DL = FFh Último disco duro soportado por la BIOS

Tabla de estado[editar]

AH = 00h La operación finalizó sin problemas
AH = 01h Función invalida en AH o parámetro no válido
AH = 02h Marca de dirección no encontrada
AH = 03h El disco está protegido contra la escritura
AH = 04h Sector no encontrado o error de lectura
AH = 05h Los datos no se verificaron correctamente
AH = 06h Disco cambiado (Disquetera)
AH = 07h Actividad de parámetros de disco fallada (disco duro)
AH = 08h Desborde de DMA
AH = 09h Error de límite de datos (Se intentó DMA sobrepasando los 64 KB)
AH = 0Ah Detectado sector dañado
AH = 0Bh Detectado cilindro dañado
AH = 0Ch Cilindro insoportado o medio invalido
AH = 0Dh Número invalido de sectores en formateo (disco duro PS/2)
AH = 0Eh Control de marca de datos detectado
AH = 0Fh Nivel de arbitración de DMA fuera de rango
AH = 10h Error incorregible de CRC o ECC
AH = 11h Datos ECC coregidos
AH = 20h Error de controlador
AH = 31h No hay medio en unidad
AH = 32h Tipo de unidad incorrecta guardada en CMOS (Compaq)
AH = 40h Fallo seek
AH = 80h Fuera de tiempo (no está listo)
AH = AAh Unidad no preparada
AH = B0h Volumen no bloqueado en unidad (INT 13h EXT)
AH = B1h Volumen bloqueado en unidad (INT 13h EXT)
AH = B2h Volumen no eliminable (INT 13h EXT)
AH = B3h Volumen en uso (INT 13h EXT)
AH = B4h Cuenta de bloqueo exedida (INT 13h EXT)
AH = B5h Petición de expulsión valida fallida (INT 13h EXT)
AH = B6h Volumen presente pero protegido contra escritura (INT 13h EXT)
AH = BBh Error indefinido
AH = CCh Escritura fallida
AH = E0h Error de estado de registro
AH = FFh Operación sense fallida

Servicios[editar]

AH = 00h TODOS Reiniciar controlador de disco
AH = 01h TODOS Comprobar estado de la unidad
AH = 02h TODOS Leer sectores
AH = 03h TODOS Escribir sectores
AH = 04h TODOS Verificar sectores
AH = 05h TODOS Formatear cilindro (formateo a bajo nivel)
AH = 08h TODOS Leer parámetros de unidad
AH = 09h HD Iniciar controlador de disco
AH = 0Ah HD Leer sectores largos
AH = 0Bh HD Escribir sectores largos
AH = 0Ch HD Mover cabeza a cilindro
AH = 0Dh HD Reiniciar unidades
AH = 0Eh PS/2 Test de lectura del controlador
AH = 0Fh PS/2 Test de escritura del controlador
AH = 10h HD Probar si la unidad está lista
AH = 11h HD Recalibrar unidad
AH = 12h PS/2 Test de la RAM del controlador
AH = 13h PS/2 Test de la unidad
AH = 14h HD Diagnóstico del controlador
AH = 15h TODOS Leer tipo de unidad
AH = 16h FD Detectar cambio de medios
AH = 17h FD Selecionar tipo de medio a formatear ( Usado por la versión de DOS <= 3.1 )
AH = 18h FD Selecionar tipo de medio a formatear ( Usado por la versión de DOS >= 3.2 )
AH = 41h, BX = 55AAh EXT Comprobar si la extensiones están instaladas
AH = 42h EXT Leer sectores
AH = 43h EXT Escribir sectores
AH = 44h EXT Verificar sectores
AH = 45h EXT Bloquear/Desbloquear unidad
AH = 46h EXT Expulsar unidad
AH = 47h EXT Mover cabeza a sector
AH = 48h EXT Leer parámetros de la unidad
AH = 49h EXT Detectar cambio de tipo de unidad
AH = 4Ah CD-ROM arrancable Iniciar emulación de disco
AX = 4B00h CD-ROM arrancable Terminar emulación de disco
AX = 4B01h CD-ROM arrancable Ver estado
AH = 4Eh CD-ROM arrancable Iniciar emulación de disco y bootear
AX = 4D00h CD-ROM arrancable Retornar catalogo 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[editar]

Parámetros:

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[editar]

Parámetros:

AH = 02h Leer 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:BX Buffer de datos

Retorna:

CF Activada 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[editar]

Parámetros:

AH = 41h Verificar sectores
AL = ?? Numero 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:BX Buffer de datos

Retorna:

CF Activada 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[editar]

Parámetros:

AH = 41h Comprobar extensiones
BX = 55AAh Comprobar extensiones
DL = ?? Número de unidad

Retorna:

CF Activada 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 = 55AAh Devuelve 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[editar]

Enlaces externos[editar]