# Int 13h

INT 13h es la forma abreviada para la llamada de interrupción del BIOS 13$_{hex}$, 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 = 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

| 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 inválido |
| AH = 0Dh | Número inválido 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 excedida (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

| 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 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:
| AH | 00h |
| DL | Unidad (ej: 80h - Primer disco duro) |
Ejemplo:

## INT 13h AH=02h - Leer sectores

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:

## INT 13h AH=04h - Verificar sectores

Parámetros:
| AH = 04h | Verificar 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:BX | Buffer de datos |
Retorna:
| CF | Activada en error, limpia si no hay error |
| AH = ?? | Estado |
| AL = ?? | Número de sectores verificados |
Ejemplo:

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

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: