# API del MS DOS

El API del MS DOS o MS-DOS API es un API usado originalmente en MS-DOS/PC-DOS, y más adelante por otros sistemas DOS. La mayoría de las llamadas al DOS API invocan la interrupción de software 21h (INT 21h). Llamando la INT 21h con un número de subfunción en el registro de procesador AH y otros parámetros en otros registros, se pueden invocar varios servicios del DOS. Los servicios del DOS incluyen la entrada por teclado, salida por pantalla, acceso a archivos de disco, ejecutar programas, la asignación de memoria, y otras cosas. Las subfunciones proporcionadas en el primer lanzamiento del MS-DOS en 1981 fueron fuertemente orientadas a la compatibilidad con el CP/M. Un importante mejora del DOS API (influenciada parcialmente por ciertos conceptos de Unix) fue realizada para el lanzamiento del MS-DOS 2.0 de 1983, agregando numerosas nuevas subfunciones para manejar la entrada/salida de archivos usando las "handles" (manejadores) abstractos y soporte para sub-directorios. En estas nuevas subfunciones, los strings son generalmente terminados por un byte NUL (ASCIIZ). En la versión MS-DOS 3.1 (lanzada en 1985), varias subfunciones fueron añadidas para manejar redes. En la versión MS-DOS 4, fueron introducidas llamadas para manejar la memoria expandida de acuerdo a la especificación de Lotus-Intel-Microsoft.
Hay varias implementaciones del DOS API, incluyendo PC-DOS, MS-DOS, DR-DOS, FreeDOS, PTS-DOS, y otros. El DOS API está basado en el BIOS, y las rutinas del DOS con frecuencia internamente accesan a llamadas de interrupción del BIOS
DOS extenders junto con DOS Protected Mode Interface (DPMI) extienden el DOS API al modo protegido de 16 bits o de 32 bits. El API del MS DOS es parcialmente dependiente en el código x86, por lo tanto el DOS no puede ser portado a otras arquitecturas de procesador.

## El API del MS DOS y Windows

Las versiones 1.0 a 3.1 de Microsoft Windows eran los shells gráficos que corrían en MS-DOS y confiaban en el API del MS DOS (aunque usando su propio API para los programas de Windows). Windows 9x también estaba basado en el DOS, pero utilizó una versión personalizada del MS-DOS, principalmente como cargador de arranque. No usaba mucho el API del MS DOS después de cargarse. Sin embargo, Windows 9x proporcionó el DOS API a los programas que corrían dentro de una ventana shell de comandos. Versiones anteriores de Windows 9x (al menos a través de la primera edición de Windows 98) también podían cargarse en una simple interfaz de línea de comandos "Modo DOS" sin el GUI y sin servicios de sistema de Windows, para correr programas puros de DOS. Las versiones del DOS de Windows 9x (numeradas 7.0 en adelante) incluyen varias nuevas subfunciones de servicio para manejar el nombres de archivo largos (LFNs). Estas subfunciones LFN del DOS no fueron incluidos en Windows NT, pero estaban en versiones posteriores como Windows XP.
Windows NT y los sistemas basados en él (ej. Windows XP y Windows Vista) no están basados en MS-DOS, pero usan una máquina virtual, NTVDM, para manejar el DOS API. NTVDM trabaja haciendo correr un programa del DOS en el Modo 8086 virtual (una emulación del Modo real dentro del modo protegido disponible en 80386 y procesadores más recientes). DOSEMU para Linux usa un acercamiento similar.

## Servicios comunes del DOS

Algunas llamadas de funciones INT 21h. El número de la llamada se pasa a través de AH:
| AH (hex) | Descripción | Versión DOS | Parámetros | Retorno |
| 00 | Termina programa | 1.0+ | | Nunca |
| 01 | Lee caracteres desde STDIN | 1.0+ | | AL=Carácter leído |
| 02 | Escribe carácter a STDOUT | 1.0+ | DL=Carácter | |
| 03 | Lee caracteres desde el puerto serial | 1.0+ | | |
| 04 | Escribe caracteres al puerto serial | 1.0+ | | |
| 05 | Escribe caracteres en la impresora | 1.0+ | | |
| 06 | Entrada/salida directa por consola | 1.0+ | | |
| 07 | Entrada directa por consola sin eco | 1.0+ | | AL |
| 08 | Entrada por consola sin eco | 1.0+ | | |
| 09 | Escribe string a STDOUT | 1.0+ | DS:DX=Puntero a un string terminado en '$' | |
| 0A | Entrada con buffer por teclado | 1.0+ | | |
| 0B | Lee estado de la entrada | 1.0+ | | |
| 0C | Limpia buffer de entrada | 1.0+ | | |
| 0D | Resetea disco | 1.0+ | | |
| 0E | Asigna unidad de disco por defecto | 1.0+ | | |
| 0F | Abre archivo | 1.0+ | | |
| 10 | Cierra archivo | 1.0+ | | |
| 11 | Encuentra primer archivo | 1.0+ | | |
| 12 | Encuentra siguiente archivo | 1.0+ | | |
| 13 | Borra archivo | 1.0+ | | |
| 14 | Lectura secuencial | 1.0+ | | |
| 15 | Escritura secuencial | 1.0+ | | |
| 16 | Crea o trunca un archivo | 1.0+ | | |
| 17 | Cambia nombre de un archivo | 1.0+ | | |
| 18 | Reservado | 1.0+ | | |
| 19 | Obtiene unidad de disco por defecto | 1.0+ | | |
| 1A | Asigna dirección de transferencia de disco | 1.0+ | | |
| 1B | Obtiene la información de asignación (allocation) para la unidad por defecto | 1.0+ | | |
| 1C | Obtiene la información de asignación (allocation) para la unidad especificada | 1.0+ | | |
| 1D | Reservado | 1.0+ | | |
| 1E | Reservado | 1.0+ | | |
| 1F | Obtiene el bloque de parámetros de disco (DPB) para la unidad por defecto | 1.0+ | | |
| 20 | Reservado | 1.0+ | | |
| 21 | Lectura aleatoria | 1.0+ | | |
| 22 | Escritura aleatoria | 1.0+ | | |
| 23 | Obtiene el tamaño del archivo en número de registros | 1.0+ | | |
| 24 | Asigna número de registro aleatorio | 1.0+ | | |
| 25 | Asigna vector de interrupción | 1.0+ | | |
| 26 | Crea PSP | 1.0+ | | |
| 27 | Lee bloque aleatorio | 1.0+ | | |
| 28 | Escribe bloque aleatorio | 1.0+ | | |
| 29 | Parsea nombre de archivo | 1.0+ | | |
| 2A | Obtiene la fecha | 1.0+ | | |
| 2B | Ajusta la fecha | 1.0+ | | |
| 2C | Obtiene la hora | 1.0+ | | |
| 2D | Asigna la hora | 1.0+ | | |
| 2E | Asigna la bandera de verificación | 1.0+ | | |
| 3C | Crea o trunca un archivo | 2+ | CX=Atributos del archivo ; DS:DX->nombre de archivo ASCIZ | CF=1 si hubo error ; AX=código de error ; {{{1}}} |
| 3D | Abre archivo existente | 2+ | AL=Modos de acceso e intercambio ; DS:DX->Archivo ASCIZ ; {{{1}}} | CF=1 si hubo error ; AX=código de error ; AX=handle de archivo |
| 3F | Lee desde un archivo o dispositivo | 2+ | BX=handle de archivo ; {{{1}}} ; DS:DX->datos | CF=1 si hubo error ; AX=código de error o bytes leídos |
| 40 | Escribe a archivo o dispositivo | 2+ | BX=handle de archivo ; CX=bytes a escribir ; DS:DX->datos | CF=1 si hubo error ; AX=código de error o bytes escritos |
| 3E | Cierra archivo | 2+ | BX=handle de archivo | CF=1 si hubo error ; AX=código de error |
| 42 | Ajusta la posición en el archivo | 2+ | AL=origen de la movida, 0-inicio, 1-actual, 2-final ; BX=handle de archivo ; CX:DX=(con signo) desplazamiento | CF=1 si hubo error ; AX=código de error ; DX:AX=posición desde el principio |
| 4C | Sale del programa con un código de error indicado | 2.0+ | AL=código del error (0: salida normal) |

## Sistemas operativos que soportan el API del MS DOS

* MS-DOS - la más extensa encarnación
* PC-DOS - Versión de IBM
* DR-DOS - Clon de Digital Research
* ROM-DOS - Versión en ROM
* FreeDOS - De fuente abierta libre
* Microsoft Windows - 1.x, 2.x, 3.x, y 9x fueron basados en el DOS

## Programas con soporte para el API del MS DOS

* NTVDM.EXE para Windows NT
* DOSEMU para Linux
* DOSBox