title: Int 13h
text: # 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:
  
  