ASM POR AEsoft. (lección 10). -------------------------------------------------------------------- - funciones DOS: - INT 21H (DOS-API) - funciones BIOS: - INT 10H (FUNCIONES DEL DRIVER DE VIDEO) - INT 16H (FUNCIONES DEL DRIVER DE TECLADO) -------------------------------------------------------------------- Hola de nuevo a todos los seguidores del CURSO DE ASM. En las lecciones 7 y 8 hemos visto las más importantes instrucciones con que contamos en Ensamblador del 8086. En próximas lecciones iremos viendo el resto de instrucciones, según las vayamos necesitando. En esta lección vamos a ver algo tan importante como ese conjunto de instrucciones. vamos a ver las principales interrupciones software (funciones) que tenemos disponibles para usar en nuestros programas. Mediante la llamada a una de estas funciones podemos leer un fichero, cambiar de modo de vídeo, aceptar un carácter desde teclado, etc, etc. Estas interrupciones software nos permiten trabajar con los distintos subsistemas (teclado, vídeo, discos duros y disqueteras, etc..) de una forma relativamente cómoda. Nos ofrecen las rutinas básicas para trabajar con ellos. Para cada uno de los tres servicios más importantes de cara al programador (funciones DOS, funciones de pantalla y funciones de teclado), vamos a enumerar las funciones fundamentales para empezar a trabajar. Repito, la lista de funciones que se expone a lo largo de la lección, no es completa. Para eso existen libros y manuales especiales. Al final de la lección se ofrece bibliografía suficiente. Conforme vaya avanzando el nivel del curso iremos viendo nuevos servicios como la INT 33H (controlador del ratón), la INT 13H (Controlador de disco), etc... - funciones DOS --------------- Las funciones DOS son todas aquellas interrupciones software de las que está provisto el Sistema Operativo. Estas funciones, entre las que se encuentra la INT 21H (la más importante de todas), son utilizadas por el programador, y por el propio sistema operativo para acceder a los distintos subsistemas del procesador como son discos, teclado, etc... Usaremos estas funciones cuando queramos: crear ficheros, borrar ficheros, leer ficheros, solicitar memoria libre para trabajar con los datos de nuestros programas, dejar programas residentes, etc, etc... En definitiva, las funciones del DOS nos proporcionan un vínculo de comunicación cómodo y seguro entre nuestro programa y los diferentes subsistemas con los que podemos trabajar. Veremos que esto también nos lo proporcionan las funciones BIOS, pero a otro nivel más bajo. Por ejemplo, mientras que las funciones DOS nos permiten trabajar con ficheros, las funciones BIOS sólo nos permiten trabajar con discos en función a pistas, sectores, etc. Es decir, más a bajo nivel. En una próxima lección veremos la estructura interna de los discos: Tanto la estructura física: cabezas (caras), cilindros (pistas), sectores.... Como la estructura lógica que usa el MS-DOS: BOOT RECORD, FAT, DIRECTORIO, CONTENIDO DE FICHEROS. ¦ +---------------+ (sector de arranque) (tabla de localización de ficheros) Y volviendo a lo que nos ocupa: las funciones BIOS nos facilitan el trabajo con la parte física: pistas, sectores, etc... Mientras que las funciones DOS, nos permiten trabajar con la parte lógica: ficheros. Por supuesto, al trabajar con la parte lógica (ficheros), el DOS debe hacer uso de la parte física ó sectores (que es donde están almacenados los ficheros). Para este trabajo, las mismas funciones DOS usan las funciones BIOS. Hemos dicho que la más importante de las funciones DOS es la INT 21H. Pues bien, aparte de ésta, hay algunas más como son: - INT 20H (Terminación de proceso). - INT 22H (Dirección del gestor de terminación del programa en curso). - INT 23H (Dirección del gestor de CTRL+C). - INT 24H (Dirección del gestor de errores críticos). - INT 25H (Lectura de sectores de disco). - INT 26H (Escritura de sectores a disco). - INT 27H (Dejar programa residente y salir). - INT 28H a INT 2EH (Reservadas. No está permitido su uso al programador). - INT 2FH (Interrupción múltiple ó Interrupción del Multiplexor). La INT 20H es una de las muchas maneras de finalizar un programa. Las interrupciones 22H, 23H y 24H las estudiaremos en la próxima lección, cuando estudiemos la construcción de programas en ASM, y la gestión de los mismos por parte del DOS. Las interrupciones 25H y 26H se utilizan para leer y escribir sectores de disco. Hemos visto antes que era la BIOS la que tenía este cometido. La razón de ser de estas dos funciones es que utilizan un diferente formato de referencia a los sectores. La BIOS trata a los sectores del disco de forma física: Sector X del Cilindro Y de la Cabeza Z... Mientras que el DOS enumera secuencialmente todos los sectores del disco, desde (el sector 1 del cilindro 0 de la cabeza 0), hasta el último sector del disco. Referenciando así a cada sector mediante un sólo número de sector lógico. La INT 27H es un método antiguo de dejar programas residentes en memoria. No se suele utilizar. En su lugar, disponemos de la función 31h de la INT 21H, que veremos a continuación. Las funciones reservadas han sido pensadas por los programadores del DOS, para uso exclusivo del mismo DOS, o son funciones vacías (sin contenido) en previsión para un aumento de funciones en una próxima versión del DOS. La interrupción 2FH ó interrupción del Multiplexor, proporciona información acerca del estado de ciertos programas residentes del DOS, como son DOSKEY, PRINT, APPEND, SHARE, etc. Podremos saber si están instalados o no, y en caso de que estén instalados, la INT 2FH nos sirve como un interfaz ó vínculo de comunicación con estos programas residentes. - INT 21H (DOS-API) ------------------- La mayoría de servicios ó funciones del sistema operativo MS-DOS se obtienen a través de la interrupción software 21H. Es por esto que se le denomina DOS-API: DOS-APPLICATION-PROGRAM-INTERFACE, ó Interfaz entre programas de aplicaciones y el MS-DOS. La INT 21H está compuesta por un grupo de funciones. Cuando se accede a la INT 21H, hay que indicar el número de función que queremos ejecutar. En determinadas casos, una función es tan compleja que necesita de varias subfunciones para poder desempeñar todo su trabajo. En este caso, deberemos indicar el número de esa función, y también el número de la subfunción a la que queremos acceder dentro de esa función. La llamada a la INT 21H se realizará como sigue: + Introducimos en (AH) el número de función a la que deseamos acceder. + En caso de que deseemos acceder a una subfunción dentro de una función, debemos indicarlo introduciendo en (AL) el número de esa subfunción. + Llamar a la INT 21H. Aparte de los registros mencionados (AH y AL), la mayoría de funciones requieren de otros registros para realizar su trabajo. En estos registros se puede almacenar el comienzo de un buffer de disco al trabajar con ficheros; el comienzo de una cadena de texto para sacar por pantalla; etc.. Un ejemplo: Queremos usar la función 9h de la INT 21H para sacar por pantalla una cadena de texto. Dicha cadena de texto se encuentra almacenada a continuación de la etiqueta Cadena_De_Texto. Procederemos como sigue: Mov AH,9 ;indicamos número de función a ejecutar. Mov DX,offset cadena_de_texto ;introducimos en DX la dirección donde ;se encuentra la cadena en cuestión. INT 21H ;llamamos a la INT 21H, la cual ejecutará la función 9h. A continuación vamos a ver las funciones básicas dentro de cada grupo para empezar a programar en ensamblador. No las vamos a ver todas, porque muchas de ellas ya no se usan, como son las funciones de acceso a ficheros por el método FCB (que veremos cuando hablemos de la estructura de los discos). Tampoco veremos en un principio aquellas funciones que no vamos a utilizar hasta pasado un buen tiempo, como son funciones relacionadas con la información sobre el país, página de códigos, y unas pocas más que sólo rara vez se utilizan. De cualquier modo, siempre es interesante poder conocerlas todas, así que si teneis oportunidad, hay por ahí manuales, libros, etc, en los que vienen todas las funciones detalladas. --------------- Funciones de la INT 21H ------------------- * Funciones de Entrada/Salida de caracteres * +---------------------------------------------------------------------+ ¦ INT 21H Función 01H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Entrada de Carácter con Eco (ó salida) ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 01H ¦ ¦ ¦ + DEVUELVE: ¦ ¦ AL = Código ASCII del Carácter leído. ¦ ¦ ¦ + EFECTO: ¦ ¦ ¦ ¦ Se lee un carácter del dispositivo de entrada estándar, y se ¦ ¦ envía al dispositivo estándar de salida. Si al llamar a la ¦ ¦ función no había ningún carácter disponible, se esperará a que ¦ ¦ lo haya. ¦ ¦ ¦ ¦ Normalmente el dispositivo estándar de entrada es el teclado, ¦ ¦ y el dispositivo estándar de salida es la pantalla. Es lo que ¦ ¦ se conoce en MS-DOS como CON (de consola: teclado y pantalla). ¦ ¦ ¦ ¦ Tanto la Entrada como la Salida pueden ser redireccionadas. ¦ ¦ Ya veremos lo que eso significa con más detalle. Sirva ahora que ¦ ¦ es posible que los caracteres se puedan tomar de un dispositivo ¦ ¦ diferente al teclado, y se puedan enviar a un dispositivo ¦ ¦ diferente de la pantalla. ¦ ¦ ¦ ¦ Es decir, que como entrada podemos tener los caracteres de un ¦ ¦ fichero, y como salida podríamos tener la impresora. ¦ ¦ ¦ + VERSION DE MS-DOS: 1.0 ó superior. ¦ ¦ ¦ + NOTAS: En la versión 1.0, se toma el carácter desde teclado, y se ¦ ¦ envía hacia la pantalla. En la versión 1.0 del DOS, esta ¦ ¦ función no admitía ninguna redirección de Entrada/Salida. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 02H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Salida de Carácter ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 02H ¦ ¦ DL = Código ASCII a enviar al dispositivo de salida. ¦ + DEVUELVE: ¦ ¦ NADA. ¦ ¦ ¦ + EFECTO: ¦ ¦ ¦ ¦ Se envía el carácter depositado en el registro DL al dispositivo ¦ ¦ estándar de salida. ¦ ¦ ¦ ¦ La salida puede ser redireccionada hacia un fichero, impresora, etc ¦ ¦ ¦ + VERSION DE MS-DOS: 1.0 ó superior. ¦ ¦ ¦ + NOTAS: En la versión 1.0, se envía el carácter hacia la pantalla. ¦ ¦ En la versión 1.0 del DOS, esta función no admitía ¦ ¦ redirección de Salida. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 05H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Envío de Carácter a la Impresora ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 05H ¦ ¦ DL = Código ASCII a enviar al dispositivo de salida. ¦ + DEVUELVE: ¦ ¦ NADA. ¦ ¦ ¦ + EFECTO: ¦ ¦ Se envía el carácter depositado en DL al puerto paralelo. ¦ ¦ Si no se ha redireccionado la salida, el dispositivo por defecto ¦ ¦ en el puerto paralelo de salida (LPT1 ó PRN) es la impresora. ¦ ¦ ¦ + VERSION DE MS-DOS: 1.0 ó superior. ¦ ¦ ¦ + NOTAS: En la versión 1.0, se envía el carácter hacia el primer ¦ ¦ dispositivo de listado (PRN ó LPT1). ¦ ¦ En versiones posteriores de MS-DOS, se puede redireccionar ¦ ¦ la salida. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 09H ¦ ¦ +-------------------------------------------¦ ¦ ¦ Visualización de una cadena de caracteres ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 09H ¦ ¦ DS:DX = Segemento:Desplazamiento de la cadena a visualizar. ¦ ¦ DS debe apuntar al segmento donde se encuentra la cadena. ¦ ¦ DX debe contener el desplazamiento de la cadena dentro de ¦ ¦ ese segmento. ¦ + DEVUELVE: ¦ ¦ NADA. ¦ ¦ ¦ + EFECTO: ¦ ¦ Se envía una cadena de caracteres al dispositivo estándar de salida.¦ ¦ Si no se ha redireccionado la salida, la cadena se enviará a la ¦ ¦ pantalla. ¦ ¦ ¦ + VERSION DE MS-DOS: 1.0 ó superior. ¦ ¦ ¦ + NOTAS: La cadena debe finalizar con un carácter $ (24H), para que ¦ ¦ el DOS pueda reconocer el fin de la cadena. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 0BH ¦ ¦ +-------------------------------------------¦ ¦ ¦ Comprobación del estado de la entrada ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 0BH ¦ + DEVUELVE: ¦ ¦ AL = 00H si no hay carácter disponible. ¦ ¦ AL = FFH si hay algún carácter disponible. ¦ ¦ ¦ + EFECTO: ¦ ¦ Se comprueba si hay algún carácter procedente del dispositivo ¦ ¦ estándar de entrada. La entrada puede ser redireccionada. ¦ ¦ Si no hay tal redirección, se comprueba el buffer de teclado. ¦ ¦ ¦ + VERSION DE MS-DOS: 1.0 ó superior. ¦ ¦ ¦ + NOTAS: En caso de que haya un carácter disponible, sucesivas ¦ ¦ llamadas a esta función seguirán dando un valor verdadero ¦ ¦ hasta que se recoja el carácter con alguna de las funciones ¦ ¦ de entrada de carácter, como la función 01h. ¦ ¦ ¦ +---------------------------------------------------------------------+ * Funciones de manejo de disco * +---------------------------------------------------------------------+ ¦ INT 21H Función 0EH ¦ ¦ +-------------------------------------------¦ ¦ ¦ Selección de disco ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 0EH ¦ ¦ DL = Código de la unidad (0=A , 1=B , etc...) ¦ + DEVUELVE: ¦ ¦ AL = Número de unidades lógicas del sistema. ¦ ¦ ¦ + EFECTO: ¦ ¦ Selecciona una unidad de disco para que se convierta en la unidad ¦ ¦ por defecto o actual. Ofrece además información acerca del número ¦ ¦ total de unidades lógicas del sistema. ¦ ¦ ¦ + VERSION DE MS-DOS: 1.0 ó superior. ¦ ¦ ¦ + NOTAS: Una unidad física como un disco duro puede estar particionada¦ ¦ en varias unidades lógicas designadas por C , D, E ,etc. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 19H ¦ ¦ +-------------------------------------------¦ ¦ ¦ Obtener disco actual ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 19H ¦ + DEVUELVE: ¦ ¦ AL = Código de la unidad actual (0=A , 1=B , etc...) ¦ ¦ ¦ + EFECTO: ¦ ¦ Devuelve el código de la unidad de disco activa o por defecto. ¦ ¦ ¦ + VERSION DE MS-DOS: 1.0 ó superior. ¦ ¦ ¦ + NOTAS: Las mismas que para la función 0EH ¦ ¦ ¦ +---------------------------------------------------------------------+ * Funciones de gestión de directorios * +---------------------------------------------------------------------+ ¦ INT 21H Función 39H ¦ ¦ +-------------------------------------------¦ ¦ ¦ Crear directorio ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 39H ¦ ¦ DS:DX = Segemento:Desplazamiento de una cadena ASCIIZ ¦ ¦ con el nombre del directorio. ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Se crea un nuevo directorio usando la unidad de disco y la vía de ¦ ¦ acceso especificada en la cadena ASCIIZ. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: En la versión 1.0 del MS-DOS no existían subdirectorios. ¦ ¦ ASCIIZ es una cadena de códigos ASCII que termina con el ¦ ¦ código ASCII 0h. ¦ ¦ Así, si queremos crear un subdirectorio llamado PROGS dentro ¦ ¦ del directorio DOS, la cadena ASCIIZ se definiría así: ¦ ¦ Nombre_del_directorio db 'C:\DOS\PROGS',0 ¦ ¦ Si en el momento de llamar a la función, la unidad activa es ¦ ¦ la unidad C, no es necesario indicarlo. De igual forma, si ¦ ¦ nos encontramos en el directorio DOS, tampoco necesitamos ¦ ¦ indicarlo. ¦ ¦ ¦ ¦ Esta función se abortará (indicándolo mediante Cf y AX) si: ¦ ¦ -la vía de acceso es incorrecta. ¦ ¦ -el directorio a crear ya existe. ¦ ¦ -el directorio a crear es un subdirectorio del Raiz, ¦ ¦ y éste ya está lleno. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 3AH ¦ ¦ +-------------------------------------------¦ ¦ ¦ Borrar directorio ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 3AH ¦ ¦ DS:DX = Segemento:Desplazamiento de una cadena ASCIIZ ¦ ¦ con el nombre del directorio a borrar. ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Se elimina el directorio indicado de la unidad de disco y la vía ¦ ¦ de acceso especificada en la cadena ASCIIZ. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: En la versión 1.0 del MS-DOS no existían subdirectorios. ¦ ¦ ¦ ¦ Esta función se abortará (indicándolo mediante Cf y AX) si: ¦ ¦ -la vía de acceso es incorrecta. ¦ ¦ -el directorio especificado es el directorio activo. ¦ ¦ -el directorio especificado no está vacío, es decir, ¦ ¦ contiene algún fichero. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 3BH ¦ ¦ +-------------------------------------------¦ ¦ ¦ Establecer directorio actual ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 3BH ¦ ¦ DS:DX = Segemento:Desplazamiento de una cadena ASCIIZ ¦ ¦ con el nombre del directorio. ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Establece como directorio actual el indicado mediante la cadena ¦ ¦ ASCIIZ. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: En la versión 1.0 del MS-DOS no existían subdirectorios. ¦ ¦ ¦ ¦ Esta función se abortará (indicándolo mediante Cf y AX) si ¦ ¦ la vía de acceso especificada en la cadena ASCIIZ es ¦ ¦ incorrecta. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 47H ¦ ¦ +-------------------------------------------¦ ¦ ¦ Obtener directorio actual ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 47H ¦ ¦ DL = Código de la unidad (0 = unidad por defecto, actual; ¦ ¦ 1 = A ; 2 = B ; etc...) ¦ ¦ DS:SI = Segmento:Desplazamiento de un buffer de 64 bytes. ¦ ¦ Este buffer contendrá el nombre del directorio, con ¦ ¦ toda la vía de acceso al mismo, en forma de cadena ¦ ¦ ASCIIZ. ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Establece como directorio actual el indicado mediante la cadena ¦ ¦ ASCIIZ. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: En la versión 1.0 del MS-DOS no existían subdirectorios. ¦ ¦ ¦ ¦ Esta función se abortará (indicándolo mediante Cf y AX) si ¦ ¦ el código de unidad no es válido. Es decir, no se especifica ¦ ¦ una unidad válida. ¦ ¦ ¦ ¦ La vía de acceso que antecede al nombre del directorio no ¦ ¦ incluye el código '\' (directorio raiz), ni el identificador ¦ ¦ de la unidad. ¦ ¦ El nombre de directorio acaba con el carácter 00h que cierra ¦ ¦ la cadena ASCIIZ. ¦ ¦ ¦ +---------------------------------------------------------------------+ * Funciones de manejo de Ficheros * +---------------------------------------------------------------------+ ¦ INT 21H Función 3CH ¦ ¦ +-------------------------------------------¦ ¦ ¦ Crear Fichero ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 3CH ¦ ¦ CX = Atributos del fichero: ¦ ¦ 00H Fichero Normal. ¦ ¦ 01H Fichero de Sólo Lectura. ¦ ¦ 02H Fichero Oculto. ¦ ¦ 03H Fichero de Sistema. ¦ ¦ DS:DX = Segmento:Desplazamiento de una cadena ASCIIZ con ¦ ¦ el nombre de fichero. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ AX = Handle o manejador de fichero. ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Si el fichero indicado mediante la cadena ASCIIZ ya existía, ¦ ¦ entonces se vacía su contenido, quedando con longitud 0. ¦ ¦ Si el fichero no existía, entonces se crea. ¦ ¦ En ambos casos, el fichero se abre, y se devuelve un Handle ó ¦ ¦ manejador de fichero para los restantes accesos a dicho fichero. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ Esta función se abortará (indicándolo mediante Cf y AX) si: ¦ ¦ -La vía de acceso indicada en la cadena ASCIIZ es errónea. ¦ ¦ -Se va a crear el fichero en el directorio raiz y éste ya ¦ ¦ está lleno. ¦ ¦ ¦ ¦ El Handle es un número mediante el cual se referencia a un ¦ ¦ fichero dado. De esta forma es más cómodo trabajar con ¦ ¦ ficheros. Para cada uno de los ficheros con que trabajemos, ¦ ¦ tendremos un número (Handle) que lo representará. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 3DH ¦ ¦ +-------------------------------------------¦ ¦ ¦ Abrir Fichero ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 3DH ¦ ¦ AL = Modo de acceso. ¦ ¦ ¦ ¦ Bits 0-2: Permiso de lectura/escritura. ¦ ¦ 000b Acceso de sólo lectura. ¦ ¦ 001b Acceso de sólo escritura. ¦ ¦ 010b Acceso de lectura/escritura. ¦ ¦ ¦ ¦ Bit 3: 0b (Reservado). ¦ ¦ ¦ ¦ Bits 4-6: Modo de compartición de Fichero. ¦ ¦ 000b Sólo el programa actual puede acceder ¦ ¦ al archivo. ¦ ¦ 001b Sólo el programa actual puede acceder ¦ ¦ al archivo. ¦ ¦ 010b Otro programa puede leer el archivo, ¦ ¦ pero no escribir en él. ¦ ¦ 011b Otro programa puede escribir en el ¦ ¦ archivo, pero no leerlo. ¦ ¦ 100b Otro programa puede leer y escribir en¦ ¦ el archivo. ¦ ¦ ¦ ¦ Bit 7: Bit de 'herencia' ó Handle-flag. ¦ ¦ 0b Si el handle se hereda por un programa ¦ ¦ hijo. ¦ ¦ 1b Si el handle no se hereda. ¦ ¦ ¦ ¦ DS:DX = Segmento:Desplazamiento de una cadena ASCIIZ con ¦ ¦ el nombre de fichero. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ AX = Handle o manejador de fichero. ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Mediante esta función se habre un fichero ya existente, y se ¦ ¦ devuelve un Handle para acceder al fichero en lo sucesivo. ¦ ¦ ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ El puntero de fichero se coloca sobre el primer byte del ¦ ¦ fichero. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 3EH ¦ ¦ +-------------------------------------------¦ ¦ ¦ Cerrar Fichero ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 3EH ¦ ¦ BX = Handle. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Mediante esta función se cierra un fichero que estuviera abierto. ¦ ¦ Se utiliza el Handle para indicar el fichero a cerrar. ¦ ¦ Tras cerrar el fichero, dicho Handle se libera para nuevos ficheros.¦ ¦ Se vuelvan al disco todos los buffers internos asociados al fichero.¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ Si por error se llamara a esta función con el valor 0, se ¦ ¦ cerraría el dispositivo de entrada estándar (teclado), que ¦ ¦ tiene asociado ese handle 0. En cuyo caso no se aceptarían ¦ ¦ datos del teclado. ¦ ¦ Si el valor del handle fuera 1, se cerraría la pantalla, y ¦ ¦ no se enviarían caracteres a la pantalla. ¦ ¦ Hay en total 5 handles reservados para referenciar a ¦ ¦ diferentes dispositivos: ¦ ¦ ¦ ¦ Handle 0 ---> Dispositivo estándar de entrada. (CON). ¦ ¦ Handle 1 ---> Dispositivo estándar de salida. (CON). ¦ ¦ Handle 2 ---> Dispositivo estándar de error. (CON). ¦ ¦ Handle 3 ---> Dispositivo auxiliar estándar. (AUX). ¦ ¦ Handle 4 ---> Dispositivo estándar de listado. (PRN). ¦ ¦ ¦ ¦ Normalmente, el handle 0 referencia al teclado. ¦ ¦ El handle 1, a la pantalla. ¦ ¦ El handle 2, a la pantalla. Se utiliza a la hora de mostrar ¦ ¦ errores. Por eso lo de dispositivo de error. ¦ ¦ El handle 4, a la impresora. ¦ ¦ El handle 3 referencia a un dispositivo auxiliar. ¦ ¦ ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 3FH ¦ ¦ +-------------------------------------------¦ ¦ ¦ Lectura de Fichero o dispositivo. ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 3FH ¦ ¦ BX = Handle. ¦ ¦ CX = Número de bytes a leer. ¦ ¦ DS:DX = Segmento:Desplazamiento del buffer donde se ¦ ¦ depositarán los carateres leidos. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ AX = Bytes transferidos. ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Dado un handle válido, se realiza una transferencia desde el ¦ ¦ fichero referenciado por ese handle hacia el buffer de memoria ¦ ¦ especificado mediante DS:DX. Se transferirán tantos caracteres ¦ ¦ como se especifique en CX. Acto seguido, se actualiza el puntero ¦ ¦ de fichero hasta el carácter que sigue al bloque leido. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ Si se devuelve el flag Cf con valor (0), pero AX=0, esto ¦ ¦ quiere decir que el puntero de fichero estaba apuntando ¦ ¦ al final de fichero, y por eso no se ha podido leer ningún ¦ ¦ carácter. ¦ ¦ Si se devuelve el flag Cf con valor (0), pero el contenido ¦ ¦ del registro AX es menor que la cantidad de bytes a leer, ¦ ¦ (indicado mediante CX antes de llamar a la función), esto ¦ ¦ significa que se produjo algún error, o que no se pudo leer ¦ ¦ todos los caracteres solicitados, porque se llegó al final ¦ ¦ de fichero. ¦ ¦ ¦ ¦ Mediante esta función es posible leer caracteres del teclado,¦ ¦ usando el handle 0. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 40H ¦ ¦ +-------------------------------------------¦ ¦ ¦ Escritura en Fichero o dispositivo. ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 40H ¦ ¦ BX = Handle. ¦ ¦ CX = Número de bytes a escribir. ¦ ¦ DS:DX = Segmento:Desplazamiento del buffer desde donde se ¦ ¦ van a tomar los caracteres a escribir. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ AX = Bytes transferidos. ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Dado un handle válido, se realiza una transferencia desde el ¦ ¦ buffer de memoria indicado mediante DS:DX hacia el fichero o ¦ ¦ dispositivo referenciado por el Handle. ¦ ¦ Se transferirán tantos caracteres como se especifique en CX. ¦ ¦ Acto seguido, se actualiza el puntero de fichero una posición por ¦ ¦ delante del bloque escrito, para que futuras escrituras no ¦ ¦ 'machaquen' los datos que ya hubiera. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ Si se devuelve el flag Cf con valor (0), pero AX=0, esto ¦ ¦ quiere decir que el dispositivo en el que se encuentra ¦ ¦ el fichero ya estaba lleno antes de la llamada a esta ¦ ¦ función. ¦ ¦ Si se devuelve el flag Cf con valor (0), pero el contenido ¦ ¦ del registro AX es menor que la cantidad de bytes a escribir,¦ ¦ (indicado mediante CX antes de llamar a la función), esto ¦ ¦ significa que se produjo algún error, o que no se pudo ¦ ¦ escribir todos los caracteres solicitados, porque se ha dado ¦ ¦ una condición de disco lleno. ¦ ¦ ¦ ¦ Mediante esta función es posible escribir caracteres en la ¦ ¦ pantalla, usando el handle 1. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 41H ¦ ¦ +-------------------------------------------¦ ¦ ¦ Borrar Fichero. ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 41H ¦ ¦ DS:DX = Segmento:Desplazamiento de la cadena ASCIIZ ¦ ¦ con el nombre del fichero a borrar. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Se borra el fichero indicado mediante la cadena ASCIIZ. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ La función se abortará si: ¦ ¦ - La vía de acceso contenida en la cadena ASCIIZ es errónea. ¦ ¦ - Si el fichero a borrar es de sólo lectura. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 42H ¦ ¦ +-------------------------------------------¦ ¦ ¦ Establecer puntero de fichero. ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 42H ¦ ¦ AL = Código de desplazamiento: ¦ ¦ 00h Desplazamiento desde el inicio del fichero. ¦ ¦ 01h Desplazamiento desde la posición actual del ¦ ¦ puntero. ¦ ¦ 02h Desplazamiento desde el final del fichero. ¦ ¦ ¦ ¦ BX = Handle del fichero. ¦ ¦ CX = Mitad más significativa del desplazamiento. ¦ ¦ DX = Mitad menos significativa del desplazamiento. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ DX = Mitad más significativa del puntero actualizado. ¦ ¦ AX = Mitad menos significativa del puntero actualizado.¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Cambia el valor del puntero de fichero, permitiendo así un acceso ¦ ¦ aleatorio al fichero. Podremos, mediante esta función, escribir y ¦ ¦ leer caracteres en cualquier posición del fichero, sin pasar por ¦ ¦ las anteriores. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ Independientemente del tipo de llamada, el valor del puntero ¦ ¦ de fichero devuelto por la función en DX,AX se corresponde ¦ ¦ con un desplazamiento desde el inicio del fichero. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 43H Subfunción 00h ¦ ¦ +-------------------------------------------¦ ¦ ¦ Obtener atributos de fichero ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 43H ¦ ¦ AL = 00h ¦ ¦ DS:DX = Segmento:Desplazamiento de la cadena ASCIIZ con el ¦ ¦ nombre del fichero. ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ CX = Atributos del fichero. ¦ ¦ Si Bit 0 = 1, Fichero de sólo lectura. ¦ ¦ Si Bit 1 = 1, Fichero oculto. ¦ ¦ Si Bit 2 = 1, Fichero de sistema. ¦ ¦ Si Bit 5 = 1, El archivo ha sido modificado desde ¦ ¦ el último bakcup. ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Mediante esta función se obtiene información acerca de los ¦ ¦ atributos de un determinado fichero, indicado mediante la cadena ¦ ¦ ASCIIZ. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ Se producirá un error si la cadena ASCIIZ indicada es errónea.¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 43H Subfunción 01h ¦ ¦ +-------------------------------------------¦ ¦ ¦ Establecer atributos de fichero ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 43H ¦ ¦ AL = 01h ¦ ¦ CX = Nuevos atributos para fichero. ¦ ¦ Si ponemos Bit 0 = 1, atributo de sólo lectura. ¦ ¦ Si ponemos Bit 1 = 1, atributo de oculto. ¦ ¦ Si ponemos Bit 2 = 1, atributo de sistmea. ¦ ¦ Debemos establecer Bit 3 = 0. ¦ ¦ Debemos establecer Bit 4 = 0. ¦ ¦ Si ponemos Bit 5 = 1, indicará que el fichero ha ¦ ¦ sido modificado desde el último backup. ¦ ¦ ¦ ¦ DS:DX = Segmento:Desplazamiento de la cadena ASCIIZ con el ¦ ¦ nombre del fichero. ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Mediante esta función se establecen nuevos atributos a un fichero ¦ ¦ dado. Este fichero se indica mediante la cadena ASCIIZ. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ Se producirá un error si la cadena ASCIIZ indicada es errónea.¦ ¦ ¦ ¦ No puede usarse esta función para establecer atributo de ¦ ¦ etiqueta de volumen (bit 3), ni atributo de directorio(bit 4).¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 56H ¦ ¦ +-------------------------------------------¦ ¦ ¦ Renombrar Fichero ó Mover Fichero ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 56H ¦ ¦ DS:DX = Segmento:Desplazamiento de la cadena ASCIIZ con el ¦ ¦ nombre actual del fichero. ¦ ¦ ES:DI = Segmento:Desplazamiento de la cadena ASCIIZ con el ¦ ¦ nuevo nombre para el fichero. ¦ + DEVUELVE: ¦ ¦ Si se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 0 ¦ ¦ ¦ ¦ Si NO se ejecutó correctamente: ¦ ¦ Flag de acarreo (Cf) = 1 ¦ ¦ AX = Código de error. ¦ ¦ ¦ + EFECTO: ¦ ¦ Esta función permite cambiar el nombre a un fichero dado. ¦ ¦ También permite mover el fichero a otro directorio dentro del mismo ¦ ¦ dispositivo. ¦ ¦ En el segundo caso, lo que debemos hacer es cambiar el camino que ¦ ¦ nos lleva al fichero, en vez del nombre de fichero en sí. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ Se producirá un error si: ¦ ¦ - la cadena ASCIIZ indicada es errónea. ¦ ¦ - Ya existe un fichero con el mismo nombre que el indicado. ¦ ¦ - Se intenta mover el fichero a otro dispositivo o unidad. ¦ ¦ - El fichero se mueve al directorio raíz, y éste está lleno. ¦ ¦ ¦ +---------------------------------------------------------------------+ * Funciones de terminación de procesos * +---------------------------------------------------------------------+ ¦ INT 21H Función 00H ¦ ¦ +-------------------------------------------¦ ¦ ¦ Terminar ejecución del Programa ¦ ¦ +-------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 00H ¦ ¦ CS = Dirección del segmento del PSP. ¦ + DEVUELVE: ¦ ¦ NADA. ¦ + EFECTO: ¦ ¦ Se finaliza la ejecución del programa en curso. Esto conlleva: ¦ ¦ - Liberación de toda la memoria asignada al programa. ¦ ¦ - Todos los buffers de fichero son vaciados. ¦ ¦ - Se cierra cualquier fichero abierto por el programa. ¦ ¦ - Se restauran los tres vectores de interrupción (INT 22H, INT 23H, ¦ ¦ INT 24H) cuyo contenido original fue almacenado en la pila. ¦ ¦ ¦ + VERSION DE MS-DOS: 1.0 ó superior. ¦ ¦ ¦ + NOTAS: ¦ ¦ Esta función está pensada para programas COM, en los cuales, ¦ ¦ el PSP está en el mismo segmento que el código del programa. ¦ ¦ En los programas EXE esto no sucede así, estando el PSP en ¦ ¦ diferente segmento al código del programa, por tanto, no se ¦ ¦ debe llamar a esta función desde un programa .EXE. ¦ ¦ ¦ ¦ En ambos casos (COM y EXE), es preferible utilizar la función ¦ ¦ 4CH, ya que devuelve un código de retorno la programa padre. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 4CH ¦ ¦ +------------------------------------------------¦ ¦ ¦ Terminación de Programa con Código de Retorno ¦ ¦ +------------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 4CH ¦ ¦ AL = Código de retorno para el programa padre. ¦ + DEVUELVE: ¦ ¦ NADA. ¦ + EFECTO: ¦ ¦ Se finaliza la ejecución del programa en curso, y se devuelve un ¦ ¦ código de retorno al programa padre. Mediante este código de ¦ ¦ retorno, se puede ofrecer información al programa padre acerca de ¦ ¦ la ejecución del programa (si se ha producido error, etc...) ¦ ¦ ¦ ¦ La terminación del programa conlleva: ¦ ¦ - Liberación de toda la memoria asignada al programa. ¦ ¦ - Todos los buffers de fichero son vaciados. ¦ ¦ - Se cierra cualquier fichero abierto por el programa. ¦ ¦ - Se restauran los tres vectores de interrupción (INT 22H, INT 23H, ¦ ¦ INT 24H) cuyo contenido original fue almacenado en la pila. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: Este es el método idóneo de terminación de programas, ya que ¦ ¦ no necesita que el registro CS tenga ningún contenido ¦ ¦ especial. Y aparte, devuelve información al programa padre. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 21H Función 31H ¦ ¦ +------------------------------------------------¦ ¦ ¦ Finalizar el Programa y Dejar Residente ¦ ¦ +------------------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 31H ¦ ¦ AL = Código de retorno para el programa padre. ¦ ¦ DX = Cantidad de memoria a dejar residente (en párrafos). ¦ + DEVUELVE: ¦ ¦ NADA. ¦ + EFECTO: ¦ ¦ Se finaliza la ejecución del programa en curso, y se devuelve un ¦ ¦ código de retorno al programa padre. Mediante este código de ¦ ¦ retorno, se puede ofrecer información al programa padre acerca de ¦ ¦ la ejecución del programa (si se ha producido error, etc...) ¦ ¦ Además de esto, y lo más importante: Se deja residente el programa ¦ ¦ o parte del mismo, de forma que las siguientes ejecuciones de ¦ ¦ programas no lo 'machaquen'. ¦ ¦ ¦ ¦ La terminación del programa conlleva: ¦ ¦ - Liberación de toda la memoria asignada al programa. ¦ ¦ - Todos los buffers de fichero son vaciados. ¦ ¦ - Se cierra cualquier fichero abierto por el programa. ¦ ¦ - Se restauran los tres vectores de interrupción (INT 22H, INT 23H, ¦ ¦ INT 24H) cuyo contenido original fue almacenado en la pila. ¦ ¦ ¦ + VERSION DE MS-DOS: 2.0 ó superior. ¦ ¦ ¦ + NOTAS: Un párrafo equivale a 16 bytes. Por tanto, en DX habrá que ¦ ¦ indicar el número_total_de_bytes_a_dejar_residentes dividido ¦ ¦ por 16. ¦ ¦ ¦ ¦ Esta función se utiliza en programación de utilidades ¦ ¦ residentes (como SideKick o SanBit). ¦ ¦ Una vez que el programa queda residente en memoria, la ¦ ¦ activación del mismo se realiza de acuerdo a algún criterio ¦ ¦ del propio programa (como la pulsación de una combinación de ¦ ¦ teclas). En este caso, el programa residente toma el control,¦ ¦ y al acabar su tarea le devuelve el control al programa ¦ ¦ que se estuviera ejecutando antes de la activación del ¦ ¦ residente. ¦ ¦ ¦ +---------------------------------------------------------------------+ - funciones BIOS ---------------- Antes de meternos de lleno con las funciones BIOS, y más concretamente con los 2 Servicios que más nos interesan en un principio: INT 10H (Driver ó controlador de vídeo) e INT 16H (Driver ó controlador de teclado)... Vamos a ver qué se entiende por BIOS. En primer lugar, decir que BIOS son las siglas de Basic Input/Output System. O lo que es lo mismo: Sistema básico de Entrada/Salida. Es decir, permite una comunicación (Entrada/Salida de información) entre el ordenador en sí (circuitos, dispositivos, componentes) y los programas que lo utilizan. La BIOS es un conjunto de funciones contenidas en memoria ROM, mediante el cual, los programas se comunican con el hardware y los dispositivos conectados. Las funciones de la BIOS permiten al programador acceder a los diferentes subsistemas del ordenador sin necesidad de saber el modelo ni marca de tal subsistema o periférico. Es decir, estas funciones facilitan la compatibilidad entre los PC's. Si queremos acceder al disco duro, simplemente usamos la función de la BIOS que nos permite acceder al disco duro. No necesitamos conocer los cientos de modelos de discos duros que existen, y atendiendo a que se trate de un modelo o de otro distinto, actuar de diferente manera. Esto nos permite la portabilidad de nuestros programas a cualquier PC. Aparte de los dos servicios principales que vamos a tratar en esta lección (INT 10H e INT 16H) existen varios más que permiten controlar el resto de subsistemas del PC: - INT 11H (Buscar la configuración del equipo). - INT 12H (Determinar el tamaño de memoria RAM). - INT 13H (Driver o Controlador de disco). La INT 13H la estudiaremos en profundidad al tratar el tema de los discos en el PC. - INT 14H (Driver del Puerto Serie ó Puerto de Comunicaciones). - INT 15H (Driver del Puerto Paralelo [Impresora]). - INT 17H (Escritura de sectores a disco). - INT 18H (ROM del BASIC). - INT 19H (Reinicialización del Sistema ó Reset ó Reboot). - INT 1AH (Driver del reloj de Tiempo Real). Todos estos servicios los estudiaremos a su debido tiempo. En esta lección vamos a tratar los más usuales para empezar a programar, como son los encargados del teclado y la pantalla, que en definitiva es con lo que primero se empieza a probar. - INT 10H (Driver de Vídeo) --------------------------- Dedicaremos varias lecciones a estudiar la programación gráfica, y por consiguiente el Driver de Vídeo. Si os encontrais con algo nuevo en las siguientes funciones (página de vídeo, tarjetas gráficas, etc..) no os preocupeis que lo veremos más adelante. Vamos por partes, que en programación en ensamblador todo está relacionado de alguna manera, y no podemos verlo todo el mismo día. Se utiliza el mismo formato de llamada que para la INT 21h. ----------- Funciones Fundamentales de la INT 10H ----------------- +---------------------------------------------------------------------+ ¦ INT 10H Función 00H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Establecer modo de Vídeo ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 00H ¦ ¦ AL = Modo de vídeo (Ver notas). ¦ ¦ ¦ + DEVUELVE: ¦ ¦ NADA. ¦ ¦ ¦ + EFECTO: ¦ ¦ ¦ ¦ Selecciona y activa el modo de vídeo especificado. ¦ ¦ A no ser que se utilice el truco que se indica a continuación, ¦ ¦ al llamar a esta función, se borra la pantalla. ¦ ¦ Por una parte, esto nos quita el trabajo de borrar la pantalla por ¦ ¦ nosotros mismos. Pero por otra parte, cuando deseamos que el ¦ ¦ contenido de la pantalla en el modo seleccionado no se pierda, ¦ ¦ como puede ser el caso de programación de utilidades residentes, ¦ ¦ esa función de borrado automático nos puede acarrear demasiadas ¦ ¦ molestias. ¦ ¦ Por suerte hay una especie de 'truco' para evitar este borrado ¦ ¦ automático de la pantalla. Consiste en poner con valor 1 el bit 7 ¦ ¦ del registro AL (que contiene el modo de vídeo) en la llamada a la ¦ ¦ función. ¦ ¦ Así por ejemplo, si queremos cambiar a modo 13h, y queremos que no ¦ ¦ se pierda el contenido que hubiera en la pantalla en este modo, ¦ ¦ en vez de introducir en AL el número 13h (00010011b), ¦ ¦ introduciríamos el número 93h (10010011b). ¦ ¦ ¦ + TARJETA GRAFICA: TODAS (MDA, CGA, EGA, MCGA, VGA...) ¦ ¦ ¦ + NOTAS: ¦ ¦ Modos de vídeo y características principales: ¦ ¦ ¦ ¦ +------Ð-------------Ð---------Ð--------------Ð-------------------+ ¦ ¦ ¦ ¦ ¦ ¦ Modo Texto ¦ Tarjetas que ¦ ¦ ¦ ¦ Modo ¦ Resolución ¦ Colores ¦ ó ¦ Soportan este ¦ ¦ ¦ ¦ ¦ ¦ ¦ Modo Gráfico ¦ Modo ¦ ¦ ¦ ¦------Ï-------------Ï---------Ï--------------Ï-------------------¦ ¦ ¦ ¦ 00H ¦ 40 por 25 ¦ 16 ¦ Texto ¦ (2) (3) (4) (5)¦ ¦ ¦ ¦ 01h ¦ 40 por 25 ¦ 16 ¦ Texto ¦ (2) (3) (4) (5)¦ ¦ ¦ ¦ 02h ¦ 80 por 25 ¦ 16 ¦ Texto ¦ (2) (3) (4) (5)¦ ¦ ¦ ¦ 03h ¦ 80 por 25 ¦ 16 ¦ Texto ¦ (2) (3) (4) (5)¦ ¦ ¦ ¦ 04h ¦ 320 por 200 ¦ 4 ¦ Gráfico ¦ (2) (3) (4) (5)¦ ¦ ¦ ¦ 05h ¦ 320 por 200 ¦ 4 ¦ Gráfico ¦ (2) (3) (4) (5)¦ ¦ ¦ ¦ 06h ¦ 640 por 200 ¦ 2 ¦ Gráfico ¦ (2) (3) (4) (5)¦ ¦ ¦ ¦ 07h ¦ 80 por 25 ¦ 2 ¦ Texto ¦(1) (3) (5)¦ ¦ ¦ ¦ 0Dh ¦ 320 por 200 ¦ 16 ¦ Gráfico ¦ (3) (5)¦ ¦ ¦ ¦ 0Eh ¦ 640 por 200 ¦ 16 ¦ Gráfico ¦ (3) (5)¦ ¦ ¦ ¦ 0Fh ¦ 640 por 350 ¦ 2 ¦ Gráfico ¦ (3) (5)¦ ¦ ¦ ¦ 10h ¦ 640 por 350 ¦ 4 ¦ Gráfico ¦EGA de 64 Ks de RAM¦ ¦ ¦ ¦ 10h ¦ 640 por 350 ¦ 16 ¦ Gráfico ¦EGA>=64 Ks y VGA ¦ ¦ ¦ ¦ 11h ¦ 640 por 480 ¦ 2 ¦ Gráfico ¦ (4) (5)¦ ¦ ¦ ¦ 12h ¦ 640 por 480 ¦ 16 ¦ Gráfico ¦ (5)¦ ¦ ¦ ¦ 13h ¦ 320 por 200 ¦ 256 ¦ Gráfico ¦ (4) (5)¦ ¦ ¦ +------¤-------------¤---------¤--------------¤-------------------+ ¦ ¦ ¦ ¦ Modos superiores al 13h pertenecen a tarjetas Super-Vga ó superior. ¦ ¦ ¦ ¦ Código de las tarjetas gráficas: MDA = (1) ¦ ¦ CGA = (2) ¦ ¦ EGA = (3) ¦ ¦ MCGA = (4) ¦ ¦ VGA = (5) ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 01H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Establecer tamaño del Cursor ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 01H ¦ ¦ Bits 0-4 de CH = Línea inicial del Cursor. ¦ ¦ Bits 0-4 de CL = Línea final del Cursor. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ NADA. ¦ ¦ ¦ + EFECTO: ¦ ¦ ¦ ¦ Se selecciona un nuevo tamaño de Cursor en modo texto. ¦ ¦ ¦ + TARJETA GRAFICA: MDA, CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Ver función 02h en caso de querer hacer desaparecer el ¦ ¦ cursor de la pantalla. ¦ ¦ Dependiendo del tipo de tarjeta y modo de vídeo de que se ¦ ¦ trate, el cursor dispondrá de más o menos líneas de pixels ¦ ¦ para dibujarlo. Así por ejemplo, en varios modos de vídeo ¦ ¦ de la VGA, se disponen de 14 líneas para crear el cursor, ¦ ¦ mientras que en la CGA se disponen sólo de 8 líneas. ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 02H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Posicionar el Cursor ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 02H ¦ ¦ BH = Página de vídeo. ¦ ¦ DH = Línea donde situar el cursor. ¦ ¦ DL = Columna donde situar el cursor. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ NADA. ¦ ¦ ¦ + EFECTO: ¦ ¦ ¦ ¦ Posiciona el cursor en pantalla, de acuerdo a las coordenadas ¦ ¦ indicadas en los registros DH y DL. ¦ ¦ ¦ + TARJETA GRAFICA: MDA, CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Sólo se desplazará el cursor si la página de vídeo indicada ¦ ¦ mediante BH es la página de vídeo activa. Esto es así ya ¦ ¦ que existe un cursor independiente para cada una de las ¦ ¦ páginas de vídeo con las que contamos en el modo actual. ¦ ¦ ¦ ¦ Las coordenadas para la columna empiezan a partir de 0. ¦ ¦ Las coordenadas para la fila empiezan a partir de 0. ¦ ¦ Esto quiere decir que la esquina superior izquierda de la ¦ ¦ pantalla tendrá las coordenadas (línea=0,columna=0). ¦ ¦ ¦ ¦ La columna máxima es la 39 (si estamos en un modo de vídeo ¦ ¦ de 40 columnas) ó la 79 (si estamos en un modo de vídeo de ¦ ¦ 80 columnas). ¦ ¦ La línea máxima es la 24 (si estamos en un modo de vídeo de ¦ ¦ 25 líneas) ó la 49 (si estamos en un modo de vídeo de 50 ¦ ¦ líneas). ¦ ¦ ¦ ¦ Un 'truco' para hacer desaparecer el cursor de la pantalla ¦ ¦ consiste en dar valores no válidos para la columna o la ¦ ¦ fila. Por ejemplo, si damos a la columna el valor 100, el ¦ ¦ cursor desaparecerá de la pantalla. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 03H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Buscar posición del Cursor y Tamaño ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 03H ¦ ¦ BH = Página de vídeo. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ CH = Línea inicial del cursor ¦ ¦ CL = Línea final del cursor ¦ ¦ DH = Fila donde se encuentra el cursor ¦ ¦ CH = Columna donde se encuentra el cursor ¦ ¦ ¦ + EFECTO: ¦ ¦ ¦ ¦ Obtiene las coordenadas del cursor en una página de vídeo dada. ¦ ¦ También se obtiene el tamaño del cursor. ¦ ¦ ¦ + TARJETA GRAFICA: MDA, CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Cada página de vídeo tiene su propio cursor. ¦ ¦ Se puede acceder al cursor de cada página independientemente¦ ¦ de cuál sea la página activa. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 05H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Establecer nueva página de vídeo ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 05H ¦ ¦ AL = Página de vídeo (Ver Notas). ¦ ¦ ¦ + DEVUELVE: ¦ ¦ NADA. ¦ + EFECTO: ¦ ¦ ¦ ¦ Establece como activa la nueva página de vídeo indicada mediante ¦ ¦ el registro AL, mostrándose por pantalla el contenido de esa ¦ ¦ página de vídeo, y situando el cursor en la posición que le ¦ ¦ corresponda para esa página de vídeo. ¦ ¦ ¦ + TARJETA GRAFICA: CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Las páginas posibles para cada modo de vídeo son: ¦ ¦ ¦ ¦ +-------------------Ð-----------------Ð--------------------------+ ¦ ¦ ¦ Número de Páginas ¦ Modos de Vídeo ¦ Tarjetas que lo soportan ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ 8 (0 - 7) ¦ 00h y 01h ¦ CGA, EGA, MCGA, VGA. ¦ ¦ ¦ ¦ 4 (0 - 3) ¦ 02h y 03h ¦ CGA. ¦ ¦ ¦ ¦ 8 (0 - 7) ¦ 02h y 03h ¦ ECGA, MCGA, VGA. ¦ ¦ ¦ ¦ 8 (0 - 7) ¦ 07h ¦ EGA, VGA. ¦ ¦ ¦ ¦ 8 (0 - 7) ¦ 0Dh ¦ EGA, VGA. ¦ ¦ ¦ ¦ 4 (0 - 3) ¦ 0Eh ¦ EGA, VGA. ¦ ¦ ¦ ¦ 2 (0 - 1) ¦ 0Fh ¦ EGA, VGA. ¦ ¦ ¦ ¦ 2 (0 - 1) ¦ 10h ¦ EGA, VGA. ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ +-------------------¤-----------------¤--------------------------+ ¦ ¦ Los modos de vídeo 11h en adelante cuentan sólo con una página ¦ ¦ de vídeo. ¦ ¦ ¦ ¦ El cambio de una página a otra dentro del mismo modo de vídeo, no ¦ ¦ afecta a su contenido, es decir, no se borra la pantalla, como sí ¦ ¦ ocurre al cambiar de modo de vídeo. Siempre que no utilicemos el ¦ ¦ 'truco', claro. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 06H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Desplazar líneas de texto hacia arriba ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 06H ¦ ¦ AL = Número de líneas a desplazar. Si AL=0, se borra ¦ ¦ toda la ventana seleccionada mediante los registros¦ ¦ CX y DX. ¦ ¦ BH = Atributo a usar en las líneas borradas. ¦ ¦ CH = Línea donde comienza la ventana de texto. ¦ ¦ CL = Columna donde comienza la ventana de texto. ¦ ¦ DH = Línea donde acaba la ventana de texto. ¦ ¦ DL = Columna donde acaba la ventana de texto. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ NADA. ¦ + EFECTO: ¦ ¦ ¦ ¦ Desplaza hacia arriba un número determinado de líneas en la ventana ¦ ¦ especificada mediante los registros CX y DX. ¦ ¦ Las líneas desplazadas, quedan vacías, rellenándose con blancos. ¦ ¦ El color utilizado en estas líneas vacías se indica mediante el ¦ ¦ registro BH. ¦ ¦ ¦ + TARJETA GRAFICA: MDA, CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Mediante la llamada a esta función obtenemos un método ¦ ¦ cómodo, aunque lento de borrar la pantalla. ¦ ¦ ¦ ¦ El Atributo indicado mediante BH es el color que se va a ¦ ¦ utilizar en el área borrada ó desplazada. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 07H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Desplazar líneas de texto hacia abajo ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 07H ¦ ¦ AL = Número de líneas a desplazar. Si AL=0, se borra ¦ ¦ toda la ventana seleccionada mediante los registros¦ ¦ CX y DX. ¦ ¦ BH = Atributo a usar en las líneas borradas. ¦ ¦ CH = Línea donde comienza la ventana de texto. ¦ ¦ CL = Columna donde comienza la ventana de texto. ¦ ¦ DH = Línea donde acaba la ventana de texto. ¦ ¦ DL = Columna donde acaba la ventana de texto. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ NADA. ¦ + EFECTO: ¦ ¦ ¦ ¦ Desplaza hacia abajo un número determinado de líneas en la ventana ¦ ¦ especificada mediante los registros CX y DX. ¦ ¦ Las líneas desplazadas, quedan vacías, rellenándose con blancos. ¦ ¦ El color utilizado en estas líneas vacías se indica mediante el ¦ ¦ registro BH. ¦ ¦ ¦ + TARJETA GRAFICA: MDA, CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Mediante la llamada a esta función obtenemos un método ¦ ¦ cómodo, aunque lento de borrar la pantalla. ¦ ¦ ¦ ¦ El Atributo indicado mediante BH es el color que se va a ¦ ¦ utilizar en el área borrada ó desplazada. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 08H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Leer carácter y atributo ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 08H ¦ ¦ BH = Página de vídeo. ¦ + DEVUELVE: ¦ ¦ AH = Atributo (color del carácter). ¦ ¦ AL = Código ASCII del carácter leido. ¦ ¦ ¦ + EFECTO: ¦ ¦ ¦ ¦ Mediante la llamada a esta función, se devuelve en AL el código ¦ ¦ del carácter situado en la posición del cursor. ¦ ¦ Asímismo, obtenemos en AH el color de este carácter. ¦ ¦ ¦ + TARJETA GRAFICA: MDA, CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Esta función es usada por la utilidad SB-ASCII del programa ¦ ¦ SanBit para obtener el código de los caracteres que hay en ¦ ¦ pantalla. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 09H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Escribir carácter y atributo ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 09H ¦ ¦ AL = Código del carácter a escribir. ¦ ¦ BH = Página de vídeo donde escribir el carácter. ¦ ¦ BL = Atributo ó color que va a tener el carácter. ¦ ¦ CX = Cantidad de veces que se debe escribir el carácter,¦ ¦ uno a continuación de otro. ¦ + DEVUELVE: ¦ ¦ NADA. ¦ + EFECTO: ¦ ¦ ¦ ¦ Se escribe un carácter en la posición actual del cursor, en la ¦ ¦ página de vídeo deseada. ¦ ¦ El carácter tendrá el color indicado mediante BL. ¦ ¦ ¦ + TARJETA GRAFICA: MDA, CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: En caso de querer escribir un carácter sin modificar el ¦ ¦ color que afectara a esa posición, debe usarse la función ¦ ¦ 0AH. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 0AH ¦ ¦ +-----------------------------------------¦ ¦ ¦ Escribir carácter ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 0AH ¦ ¦ AL = Código del carácter a escribir. ¦ ¦ BH = Página de vídeo donde escribir el carácter. ¦ ¦ CX = Cantidad de veces que se debe escribir el carácter,¦ ¦ uno a continuación de otro. ¦ + DEVUELVE: ¦ ¦ NADA. ¦ + EFECTO: ¦ ¦ ¦ ¦ Se escribe un carácter en la posición actual del cursor, en la ¦ ¦ página de vídeo deseada. ¦ ¦ El carácter tendrá el mismo color que tuviera el carácter antiguo ¦ ¦ en esa posición. Es decir, se modifica el carácter, pero no el ¦ ¦ color. ¦ ¦ ¦ + TARJETA GRAFICA: MDA, CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: En caso de querer modificar el color del carácter, usar ¦ ¦ la función 09h. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 0CH ¦ ¦ +-----------------------------------------¦ ¦ ¦ Escribir un punto ó pixel gráfico ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 0CH ¦ ¦ AL = Valor del color a usar. ¦ ¦ BH = Página de vídeo donde escribir el carácter. ¦ ¦ CX = Columna donde escribir el pixel (coordenada ¦ ¦ gráfica x). ¦ ¦ CX = Fila donde escribir el pixel (coordenada ¦ ¦ gráfica y). ¦ + DEVUELVE: ¦ ¦ NADA. ¦ + EFECTO: ¦ ¦ ¦ ¦ Da un nuevo color a un pixel gráfico. ¦ ¦ ¦ + TARJETA GRAFICA: CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Función válida sólo para modos gráficos. ¦ ¦ ¦ ¦ Ver función 00h para obtener información acerca del valor ¦ ¦ máximo de fila, columna y color en cada modo de vídeo. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 0DH ¦ ¦ +-----------------------------------------¦ ¦ ¦ Obtener el color de un pixel gráfico ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 0DH ¦ ¦ BH = Página de vídeo. ¦ ¦ CX = Columna del pixel que nos interesa (coordenada ¦ ¦ gráfica x). ¦ ¦ DX = Fila del pixel que nos interesa (coordenada ¦ ¦ gráfica y). ¦ + DEVUELVE: ¦ ¦ AL = Valor del color del pixel. ¦ + EFECTO: ¦ ¦ ¦ ¦ Obtiene el color de un punto gráfico de la pantalla. ¦ ¦ Este punto se referenciará mediante las coordenadas gráficas (x,y): ¦ ¦ (CX,DX). ¦ ¦ ¦ + TARJETA GRAFICA: CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Función válida sólo para modos gráficos. ¦ ¦ ¦ ¦ Ver función 00h para obtener información acerca del valor ¦ ¦ máximo de fila, columna y color en cada modo de vídeo. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 10H Función 0FH ¦ ¦ +-----------------------------------------¦ ¦ ¦ Obtener el Modo de vídeo actual ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 0FH ¦ + DEVUELVE: ¦ ¦ AL = Modo de vídeo actual. ¦ ¦ AH = Cantidad de caracteres que caben en una línea en ¦ ¦ el modo de vídeo actual. ¦ ¦ BH = Número de la página activa. ¦ + EFECTO: ¦ ¦ ¦ ¦ Mediante esta función podemos saber en todo momento, en qué modo ¦ ¦ de vídeo estamos trabajando. ¦ ¦ En un principio esta función puede no tener mucho sentido, ya que ¦ ¦ en nuestro programa, en todo momento sabemos con qué modo de vídeo ¦ ¦ estamos trabajando, ya que lo establecemos nosotros. ¦ ¦ ¦ ¦ La utilidad de esta función reside sobre todo en la construcción de ¦ ¦ programas residentes. El programa residente, antes de activarse ¦ ¦ definitivamente y mostrar sus datos y rótulos por pantalla, debe ¦ ¦ saber el modo de vídeo anterior, en el que estaba trabajando el ¦ ¦ usuario, para que al salir del programa residente, se pueda ¦ ¦ restituir, y así no se pierda la información que había anteriormente¦ ¦ en pantalla. ¦ ¦ ¦ + TARJETA GRAFICA: CGA, EGA, MCGA, VGA. ¦ ¦ ¦ + NOTAS: Esta función se puede emplear también para conocer el ¦ ¦ número máximo de caracteres que caben en una línea del ¦ ¦ modo actual de vídeo. ¦ ¦ ¦ +---------------------------------------------------------------------+ - INT 16H (Driver de Teclado) --------------------------- Los servicios o funciones de la INT 16H o driver de teclado, nos permiten de una manera cómoda, gestionar todo el trabajo relativo a la entrada de caracteres por medio del teclado. Con la ayuda de estas funciones, no necesitamos trabajar directamente sobre los registros y estructuras de datos necesarios para el buen funcionamiento de la entrada de teclado. De cualquier modo, en una próxima lección estudiaremos a fondo el teclado y todo lo relacionado con él, como buffer de teclado (que es donde se almacenan las pulsaciones de teclas hasta que se procesan por el programa) y demás... Se utiliza la misma convención de llamada que para la INT 21H y la INT 10H. ----------- Funciones Fundamentales de la INT 16H ----------------- +---------------------------------------------------------------------+ ¦ INT 16H Función 00H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Leer carácter del teclado ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 00H ¦ ¦ ¦ + DEVUELVE: ¦ ¦ AH = Código extendido de la tecla, ó Scan-Code. ¦ ¦ AL = Código ASCII de la tecla. ¦ ¦ ¦ + EFECTO: ¦ ¦ Acepta un carácter del teclado y devuelve el código ASCII de dicho ¦ ¦ carácter, así como el código de rastreo ó el código extendido de ¦ ¦ la tecla. ¦ ¦ Si no había ningún carácter disponible en el buffer de teclado, la ¦ ¦ función esperará a que se introduzca algún carácter desde el ¦ ¦ teclado. ¦ ¦ Una vez se ha leido el carácter mediante esta función, se elimina ¦ ¦ del buffer, para que siguientes llamadas a esta función no lo ¦ ¦ vuelvan a coger. ¦ ¦ ¦ + MODELO DE ORDENADOR: Todos (PC, XT, AT...) ¦ ¦ ¦ + NOTAS: ¦ ¦ El código de rastreo (Scan Code) es el número que identifica ¦ ¦ a una tecla en particular. ¦ ¦ Los códigos extendidos se asignan a teclas o combinaciones ¦ ¦ de teclas que no disponen de un símbolo ASCII para ¦ ¦ representarlas. Como ejemplo tendríamos las teclas de ¦ ¦ función, las teclas Home, End, etc... ¦ ¦ ¦ ¦ Cuando a la salida de la función AL = 0, esto quiere decir ¦ ¦ que nos encontramos ante un código de tecla extendido, como ¦ ¦ Home, Insert, F1, (Alt + F2), etc... En este caso, lo que ¦ ¦ tenemos en AH es el código extendido de esa tecla o ¦ ¦ combinación de teclas. ¦ ¦ ¦ ¦ Cuando nos encontramos ante la pulsación de una tecla ¦ ¦ 'normal' como 'a', '1', etc, en este caso, el registro AL ¦ ¦ contiene el código ASCII de la tecla, y el registro AH ¦ ¦ contiene el código de rastreo de la tecla. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 16H Función 01H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Obtener estado del buffer de teclado ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 01H ¦ ¦ ¦ + DEVUELVE: ¦ ¦ Si había alguna tecla disponible en el buffer: ¦ ¦ Flag de cero (Zf) = 0 ¦ ¦ AH = Código de rastreo ó Código extendido ¦ ¦ AL = Código ASCII de la tecla. ¦ ¦ ¦ ¦ Si no había ninguna tecla disponible en el buffer: ¦ ¦ Flag de cero (Zf) = 1 ¦ ¦ ¦ + EFECTO: ¦ ¦ Mediante esta función se puede saber cuando hay algún carácter ¦ ¦ esperando en el buffer de teclado. En caso de haber algún carácter ¦ ¦ en el buffer, se muestra su código ASCII y su (código de rastreo ¦ ¦ ó código extendido, según proceda). Esta función no elimina ningún ¦ ¦ carácter del buffer de teclado. Por tanto, sucesivas llamadas a esta¦ ¦ función, mostrarán siempre el mismo resultado. ¦ ¦ ¦ + MODELO DE ORDENADOR: Todos (PC, XT, AT...) ¦ ¦ ¦ + NOTAS: ¦ ¦ Para borrar el carácter del buffer, utilizar la función 00H. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 16H Función 02H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Obtener estado del teclado ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 02H ¦ ¦ ¦ + DEVUELVE: ¦ ¦ AL = Valor del Byte de estado del teclado. ¦ ¦ ¦ ¦ ¦ ¦ Byte de Estado de teclado: ¦ ¦ ¦ ¦ bit bit bit bit bit bit bit bit ¦ ¦ 7 6 5 4 3 2 1 0 ¦ ¦ +-------------------------------+ Estado de teclas cuando el bit ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ correspondiente tiene valor (1) ¦ ¦ +-------------------------------+ ------------------------------- ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ +----> Tecla Mays. derecha pulsada. ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ +--------> Tecla Mays. izquierda pulsada.¦ ¦ ¦ ¦ ¦ ¦ ¦ +------------> Tecla Control pulsada. ¦ ¦ ¦ ¦ ¦ ¦ +----------------> Tecla Alt pulsada. ¦ ¦ ¦ ¦ ¦ +--------------------> Scroll Lock activado. ¦ ¦ ¦ ¦ +------------------------> Num Lock activado. ¦ ¦ ¦ +----------------------------> Caps Lock (Bloq Mays) activado¦ ¦ +--------------------------------> Insert activado. ¦ ¦ ¦ ¦ ¦ ¦ ¦ + EFECTO: ¦ ¦ Mediante la llamada a esta función, obtenemos información acerca ¦ ¦ del estado de ciertas teclas especiales (CTRL, ALT, MAYS, etc). ¦ ¦ Asímismo, nos muestra el estado de Num Lock (Bloque numérico), etc. ¦ ¦ ¦ + MODELO DE ORDENADOR: Todos (PC, XT, AT...) ¦ ¦ ¦ + NOTAS: ¦ ¦ El byte de estado del teclado se encuentra en la dirección ¦ ¦ 0000:0417h, dentro de la zona de datos de la BIOS. ¦ ¦ ¦ +---------------------------------------------------------------------+ +---------------------------------------------------------------------+ ¦ INT 16H Función 03H ¦ ¦ +-----------------------------------------¦ ¦ ¦ Establecer factor de Repetición ¦ ¦ +-----------------------------------------+ ¦ ¦ ¦ + LLAMADA: ¦ ¦ AH = 03H ¦ ¦ AL = 05H ¦ ¦ BH = Retardo antes de la primera repetición de tecla. ¦ ¦ BL = Velocidad de Repetición. ¦ ¦ ¦ + DEVUELVE: ¦ ¦ NADA. ¦ ¦ ¦ + EFECTO: ¦ ¦ Esta función nos permite modificar la velocidad de repetición de ¦ ¦ teclado, así como el tiempo que se necesita tener pulsada una tecla ¦ ¦ para que se genere la primera repetición. ¦ ¦ Ambas cosas son totalmente diferentes. ¦ ¦ ¦ + MODELO DE ORDENADOR: Todos (PC, XT, AT...) ¦ ¦