Capítulo – 8
Funciones de Disk-BIOS y manejo de interrupciones con C
Introducción
En este capítulo discutiremos las funciones importantes de Disk-BIOS y otras funciones importantes que nos dan la libertad de usar y manejar interrupciones en nuestro programa con C, con el método fácil y corto. Estas funciones son la parte trasera – hueso de la programación de recuperación de datos y solución de problemas de disco. Estas son las funciones que hacen que el lenguaje C sea un “alto – Nivel lenguaje ensamblador”.
biosdisk and _bios_disk Funciones
Estas dos funciones son las más importantes para nuestro propósito de programación de recuperación de datos y solución de problemas de disco. Usaremos estas funciones la mayor parte del tiempo.
Estos dos son los servicios de unidad de disco BIOS y se han definido en bios.h, donde biosdisk opera por debajo del nivel de archivos en sectores sin formato. Si estas funciones se utilizan incluso con un poco de descuido, pueden destruir el contenido del archivo y los directorios en un disco duro. Las funciones biosdisk y _bios_disk utilizan la interrupción 0x13 para enviar operaciones de disco directamente al BIOS. La función _bios_disk se declara en el programa de la siguiente manera:
unsigned _bios_disk(unsigned cmd, struct diskinfo_t *dinfo);
And the declaration for the bios disk function is as follows:
int biosdisk(int cmd, int drive, int head, int track,
int sector, int nsects, void *buffer);
The meaning of these parameters has been described in the following table:
Parámetro |
Función |
Qué es o qué hace |
cmd |
Both |
Indica la operación a realizar, como leer, escribir, verificar, etc. (Consulte la descripción de cmd, a continuación) |
dinfo |
_bios_disk |
Apunta a una estructura diskinfo_t que contiene los Parámetros restantes requeridos por la operación (vea la descripción de la estructura diskinfo_t, a continuación) |
drive |
biosdisk |
Especifica qué unidad de disco se utilizará (0 para a:, 1 para b: y 0x80 para el primer disco duro físico, 0x81 para el segundo y así sucesivamente). |
head
track
sector |
biosdisk |
Estos especifican la ubicación del sector de inicio desde el cual se iniciará la Operación. |
nsects |
biosdisk |
Número de sectores para leer, escribir, verificar, etc. |
buffer |
biosdisk |
Dirección de memoria donde se leerán o escribirán los datos |
En ambas funciones, los datos se leen y escriben desde el búfer a 512 bytes por sector, que es el tamaño lógico del sector de un disco duro, y el valor devuelto por ambas funciones es el valor del registro AX establecido por la llamada INT 0x13H BIOS.
Si la función es exitosa, High byte = 0, eso significa que la finalización exitosa y el byte bajo contienen la cantidad de sectores leídos, escritos o verificados, etc.
Pero si hay algún error y la función no se realiza correctamente, el valor del byte alto será uno de los siguientes códigos de error que se describen en la siguiente tabla:
Valor |
Descripción |
0x00 |
Successful completion (Not an Error!!) |
0x01 |
Bad command |
0x02 |
Address mark not found |
0x03 |
Attempt to write to write-protected disk |
0x04 |
Sector not found |
0x05 |
Reset failed (hard disk) |
0x06 |
Disk changed since last operation |
0x07 |
Drive parameter activity failed |
0x08 |
Direct memory access (DMA) overrun |
0x09 |
Attempt to perform DMA across 64K boundary
(data Boundary error or >80H sectors) |
0x0A |
Bad sector detected |
0x0B |
Bad track detected |
0x0C |
Unsupported track |
0x0D |
Invalid number of sectors on format (PS/2 hard disk) |
0x0E |
Control data address mark detected (hard disk) |
0x0F |
DMA arbitration level out of range (hard disk) |
0x10 |
Bad CRC/ECC on disk read |
0x11 |
CRC/ECC corrected data error (Not an error actually) |
0x20 |
Controller has failed |
0x31 |
No media in drive (IBM/MS INT 13 extensions) |
0x32 |
Incorrect drive type stored in CMOS (Compaq) |
0x40 |
Seek operation failed |
0x80 |
Attachment failed to respond |
0xAA |
Drive not ready (hard disk only) |
0xB0 |
Volume not locked in drive (INT 13 extensions) |
0xB1 |
Volume locked in drive (INT 13 extensions) |
0xB2 |
Volume not removable (INT 13 extensions) |
0xB3 |
Volume in use (INT 13 extensions) |
0xB4 |
Lock count exceeded (INT 13 extensions) |
0xB5 |
Valid eject request failed (INT 13 extensions) |
0xBB |
Undefined error occurred (hard disk only) |
0xCC |
Write fault occurred |
0xE0 |
Status register error |
0xFF |
Sense operation failed |
La siguiente tabla representa los comandos de operación que se ejecutarán con el parámetro cmd. En primer lugar veremos las operaciones comunes de ambas funciones.
biosdisk |
_bios_disk |
Que hace |
0 |
_DISK_RESET |
Restablece el sistema del disco, obligando al controlador de la unidad a realizar un restablecimiento completo. Ignorar todos los demás parámetros |
1 |
_DISK_STATUS |
Devuelve el estado de la última operación de disco. Ignora todos los demás parámetros |
2 |
_DISK_READ |
Lee uno o más sectores de disco en la memoria |
3 |
_DISK_WRITE |
Escribe uno o más sectores de disco de la memoria |
4 |
_DISK_VERIFY |
Verifica uno o más sectores |
5 |
_DISK_FORMAT |
Formatea una pista |
Aunque puede usar cmd = 0, 1, 2, 3, 4,5 o cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT y ambas opciones tienen el mismo efecto, pero se recomienda que tenga la costumbre de usar la opción de palabras como cmd = _DISK_FORMAT en lugar de cmd = 5 porque puede ayudarlo a evitar errores que pueden ocurrir si ha escrito un número de comando incorrecto para cmd.
En la declaración de biosdisk o función _bios_disk, si le damos a cmd = _DISK_RESET, la función reinicia el sistema de disco ignorando todos los demás parámetros y _DISK_STATUS devuelve el estado de la última operación de disco, ignorando los demás parámetros
Para cmd =_DISK_READ, _DISK_WRITE o _DISK_VERIFY (2, 3 o 4), las funciones biosdisk y _bios_disk también usan otros parámetros que se muestran a continuación:
Parámetro |
Qué hace |
head
track
sector |
Estos tres especifican la ubicación del sector de inicio para la operación especificada. (los valores mínimos posibles pueden ser head = 0, track = 0 y sector = 1) |
sectores |
Esto especifica el número de sectores para leer o escribir |
búfer |
Apunta al búfer donde se leerán y escribirán los datos |
Si el valor de cmd es = 5 (_DISK_FORMAT), biosdisk y _bios_disk usan los siguientes parámetros según la descripción en la tabla. Siempre se recomienda que tenga cuidado mientras usa _DISK_FORMAT y que sepa lo que va a hacer. La falta de conocimiento o incluso un pequeño error puede hacer que te enfrentes a una gran pérdida de datos.
Parámetro |
Qué hace |
head
track |
Estos especifican la ubicación de la pista para formatear |
buffer |
Apunta a una tabla de encabezados de sector que se escribirán en la pista nombrada |
Hay algunos valores adicionales de cmd que solo usan las funciones de biosdisk. Estos valores de cmd solo se permiten para XT, AT, PS/2 y compatibles. Los valores se describen en la tabla siguiente:
cmd |
Qué hace |
6 |
Dar formato a una pista y establecer banderas de sectores defectuosos |
7 |
Formatea el disco a partir de una pista específica |
8 |
Devuelve los parámetros de la unidad actual en los primeros 4 bytes del búfer |
9 |
Inicializa las características del par de unidades |
10 |
Hace una lectura larga (512 más 4 bytes adicionales por sector) |
11 |
Hace una escritura larga (512 más 4 bytes adicionales por sector) |
12 |
¿Busca un disco |
13 |
Restablecimiento de disco alternativo |
14 |
Lee el búfer del sector |
15 |
Escribe el búfer del sector |
16 |
Prueba si la unidad nombrada está lista |
17 |
Recalibra la unidad |
18 |
Diagnóstico de RAM del controlador |
19 |
Diagnóstico de la unidad |
20 |
Diagnóstico interno del controlador |
diskinfo_t Structure
diskinfo_t structure is used by _bios_disk function. The description of the structure is as follows:
struct diskinfo_t {
unsigned drive, head, track, sector, nsectors;
void far *buffer;
};
Donde unidad especifica la unidad de disco que se utilizará. Recuerde siempre que para los discos duros se especifica la unidad física, no la partición del disco. Si desea operar particiones, el programa de aplicación también debe interpretar la información de la tabla de particiones de ese disco.
El valor de cabeza, pista y sector especifica la ubicación del sector inicial para la operación. nsectors especifica el número de sectores que se leerán o escribirán y el búfer apunta al búfer donde se leen y escriben los datos. Dependiendo del valor de cmd, los otros parámetros en la estructura diskinfo_t pueden o no ser necesarios.
El valor para la especificación de la unidad de disco que se usará en las funciones biosdisk y _bios_disk se proporciona en la siguiente tabla:
impulsar valor |
Unidad de disco a usar |
0 |
Primera unidad de disquete |
1 |
Segunda unidad de disquete |
2 |
Tercera unidad de disquete |
.... |
(y así sucesivamente) |
0x80 |
Primera unidad de disco duro |
0x81 |
Segunda unidad de disco duro |
0x82 |
Tercera unidad de disco duro |
.... |
(y así sucesivamente) |
¡Basta de teoría! Ahora veamos algunas cosas prácticas y algún ejemplo de estas funciones. El siguiente ejemplo lee los sectores de ambos lados de cuatro pistas del disquete y almacena el contenido en el archivo especificado por el usuario. No importa si ha eliminado los archivos de su disco porque el programa está leyendo directamente la superficie del disco.
Para ver los datos eliminados, es mejor que tome un disquete completamente formateado y copie algunos archivos de texto, como la codificación de sus programas .c u otros archivos de texto (para que pueda comprender el contenido de los archivos) ocupando aproximadamente 73KB (datos almacenados en cuatro pistas, dos lados y 18 sectores en cada pista. Cada sector es de 512 bytes). El programa ha sido desarrollado para demostrar el ejemplo. Sin embargo, puede modificarlo y desarrollarlo para que esté listo para recuperar datos.
/* Programa para leer 4 pistas (0, 1, 2 y 3) de un disquete y escribir el contenido en el archivo especificado */
#include <bios.h>
#include <stdio.h>
#include<conio.h>
void main(void)
{
int head,track;
int result,i,sector;
char filename[80];
char *buffer;
struct diskinfo_t dinfo;
static char dbuf[512];
FILE *tt;
clrscr();
/// Compruebe si la unidad está lista o no \\\
if(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf(" Drive A: Not Ready:\n Insert disk into Drive A:
and press any key\n");
getch();
}
/* Obtener el nombre del archivo para almacenar los datos de los Sectores de
el disco */
printf("\nEnter the Destination File name with full Path
to store the data \n\n >");
gets(filename);
if((tt= fopen(filename, "wb"))==NULL)
{
printf("Could not open the File!!!");
getch();
}
for(track=0;track<4;track++)
{
for(head=0; head<=1;head++)
{
for(sector=1;sector<=18;sector++)
{
dinfo.drive = 0; /* drive number for A: */
dinfo.head = head; /* disk head number */
dinfo.track = track; /* track number */
dinfo.sector = sector; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
/// Mostrar el estado \\\
gotoxy(10,10); printf("Reading Data from: Head=%d
Track=%d Sector=%d",
head, track, sector);
fprintf(tt,"\n Data read from: Head=%d Track=%d Sector=%d\n",
head, track, sector);
/// Leer los Sectores Especificados \\\
result = _bios_disk(_DISK_READ, &dinfo);
/// Store the contents in the Specified file \\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Imprimir mensaje de error en pantalla y en archivo de error al leer un sector */
else
{
printf("\n Can not read at Head= %d Track= %d
Sector= %d\n",head,track,sector);
fprintf(tt,"\n Can not read at Head= %d Track= %d
Sector =%d\n",head,track,sector);
}
}
}
}
fclose(tt);
}
El ejemplo muestra el uso de las funciones biosdisk y _bios_disk. La función biosdisk comprueba si el disco está listo o no y encuentra la marca de dirección. La función _bios_disk lee los sectores de ambos lados hasta cuatro pistas.
La secuencia de lectura (o escritura) en la superficie del disco debe ser la siguiente:
Funciones absread y abswrite
Estas Funciones han sido definidas en Dos.h. La función absread lee sectores de disco absolutos y la función abswrite escribe sectores de disco absolutos. La función absread usa la interrupción 0x25 de DOS para leer sectores de disco específicos y la función abswrite usa la interrupción 0x26 de DOS para escribir sectores de disco específicos.
Las operaciones de lectura o escritura absolutas se realizan de manera secuencial incrementando el(los) sector(es) paso a paso y están completamente libres de los números de encabezado y de pista, etc. Es el trabajo del BIOS de la computadora traducir los sectores absolutos a los respectivos Números de pista, cabecera y sector.
Se recomiendan operaciones de lectura y escritura absolutas en aquellos programas en los que vamos a realizar operaciones de lectura/escritura en todo el disco y queremos evitar la codificación adicional y los bucles en nuestro programa para aumentar la velocidad del programa al máximo.
Las funciones absread y abswrite ignoran la estructura lógica de un disco y no prestan atención a los archivos, FAT o directorios. Estas funciones realizan directamente operaciones de lectura absoluta y escritura absoluta en la superficie del disco. Esta es la razón por la que, si se usa incorrectamente, abswrite puede sobrescribir archivos, directorios y FAT.
La declaración de la función absread es la siguiente:
int absread(int drive, int nsects, long lsect,
void *buffer);
and the abswrite function is declared as follows:
int abswrite(int drive, int nsects, long lsect,
void *buffer);
Donde el significado de los parámetros es el siguiente:
Param. |
Qué es/hace |
drive |
Drive number to read (or write): 0 = A, 1 = B, etc. |
nsects |
Number of sectors to read (or write) |
lsect |
Beginning logical sector number |
buffer |
Dirección de memoria donde se leerán (o escribirán) los datos |
En caso de éxito, ambas funciones devuelven 0. Cuando hay algún error, ambas devuelven -1 y establecen el número de error. al valor del registro AX devuelto por la llamada al sistema.
La cantidad de sectores para la operación de lectura o escritura está limitada a 64 K o al tamaño del búfer, el que sea menor. Sin embargo, aprenderemos el uso de la memoria enorme en los próximos capítulos para superar el límite de memoria de 64 K, para desarrollar un programa muy rápido.
|
Manejo de interrupciones con C
C a veces se denomina lenguaje ensamblador de alto nivel porque puede llamar a las diferentes interrupciones usando algunas de sus funciones definidas. Algunas funciones importantes son las siguientes:
- int86: Invokes MS-DOS interrupts.
- int86x: Invokes MS-DOS interrupt with segment register values.
- intdos: invokes MS-DOS service using registers other than DX and AL
- intdosx: invokes MS-DOS service with segment register values.
- segread: Reads Segment registers
Discutiremos estas funciones en detalle. En primer lugar, discutimos algunas estructuras y uniones predefinidas que se usan con frecuencia o necesariamente con estas funciones.
SREGS Estructura
Esta estructura ha sido definida en dos.h y es una estructura de los registros de segmento pasados y llenados por las funciones, int86x, intdosx y segread. La declaración de la estructura es la siguiente:
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
REGS unión
REGS es la unión de dos estructuras. La unión REGS se ha definido dos.h y se utiliza para pasar información hacia y desde las funciones, int86, int86x, intdos e intdosx. La declaración de la unión es la siguiente:
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
BYTEREGS and WORDREGS estructuras
The BYTEREGES and WORDREGS Las estructuras se han definido en dos.h y se utilizan para almacenar registros de bytes y palabras. La estructura WORGREGS permite al usuario acceder a los registros de la CPU como cantidades de 16 bits donde la estructura BYTEREGES brinda acceso a los registros individuales de 8 bits.
The BITEREGS estructura se declara de la siguiente manera:
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
And the WORDREGS structure is declared as follows:
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
int86 and int86x funciones
Estas funciones son las interfaces de interrupción de software 8086 generales definidas en dos.h. Los registros se establecen en los valores deseados y estas funciones se llaman para invocar las interrupciones de MS-DOS. La declaración de la función int86 es la siguiente:
int int86(int intno, union REGS *inregs,
union REGS *outregs);
int86x es la variación de la función int86. Se declara de la siguiente manera:
int int86x(int intno, union REGS *inregs,
union REGS *outregs, struct SREGS *segregs);
Tanto las funciones int86 como int86x ejecutan una interrupción de software 8086 especificada por el argumento intno. O podemos decir que la interrupción a generar está especificada por intno.
Con la función int86x, el acceso solo es posible a ES y DS y no a CS y SS, por lo que puede invocar una interrupción de software 8086 que toma un valor de DS diferente del segmento de datos predeterminado y/o toma un argumento en ES.
Estas funciones copian valores de registro de inregs a los registros antes de la ejecución de la interrupción del software. La función int86x también copia los valores segregs->ds y segregs->es en los registros correspondientes antes de ejecutar la interrupción del software. Esta función permite que los programas que usan punteros lejanos o un modelo de memoria de datos grande especifiquen qué segmento se usará para la interrupción del software.
Las funciones copian los valores de registro actuales en outregs, el estado de la bandera de acarreo en el campo x.cflag en outregs y el valor del registro de banderas 8086 en el campo x.flags en outregs, después de que regresa la interrupción del software. La función int86x también restaura DS y establece los campos segregs->es y segregs->ds a los valores de los registros de segmento correspondientes.
En ambas funciones, inregs y outregs pueden apuntar a la misma estructura y ambas funciones devuelven el valor de AX después de completar la interrupción del software. Si se establece la bandera de acarreo, generalmente indica que se ha producido un error.
Los elementos de unión REGS utilizados en C, equivalentes al lenguaje ensamblador, se han mostrado en la siguiente tabla:
16-bit |
8-bit |
C language |
Assembly language |
C language |
Assembly language |
inregs.x.ax |
AX |
inregs.h.al |
AL |
|
|
inregs.h.ah |
AH |
inregs.x.bx |
BX |
inregs.h.bl |
BL |
|
|
inregs.h.bh |
BH |
inregs.x.cx |
CX |
inregs.h.cl |
CL |
|
|
inregs.h.ch |
CH |
inregs.x.dx |
DX |
inregs.h.dl |
DL |
|
|
inregs.h.dh |
DH |
inregs.x.si |
SI |
|
|
inregs.x.di |
DI |
|
|
inregs.x.cflag |
CF |
|
|
Veamos los ejemplos de las funciones int86 e int86x. El siguiente programa escanea cada sector del disquete e imprime el estado de cada sector en la pantalla.
/* Programa para escanear cada sector del disquete e imprimir el estado */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
/// Inicializar disco reiniciando el sistema de disco \\\
gotoxy(10,2); printf("Initializing The Disk...");
for(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Function Number
inregs.h.dl=0x00; // Floppy Disk
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("The Status of the Disk is as....\n");
/* Escanee el disquete de 0 a 79 pistas (total de pistas 80) */
for(track=0;track<=79;track++)
for(head=0;head<=1;head++)
for(sector=1;sector<=18;sector++)
{
inregs.h.ah = 0x04; /// function Number
inregs.h.al = 1; /// Number of sectors
inregs.h.dl = 0x00; /// Floppy Disk
inregs.h.ch = track;
inregs.h.dh = head;
inregs.h.cl = sector;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// Imprimir el estado del sector escaneado\\\\
switch(outregs.h.ah)
{
case 0x00:
cprintf("STATUS: No Error!!");
break;
case 0x01:
cprintf("STATUS: Bad command");
break;
case 0x02:
cprintf("STATUS: Address mark not found");
break;
case 0x03:
cprintf("STATUS: Attempt to write to
write-protected disk");
break;
case 0x04:
cprintf("STATUS: Sector not found");
break;
case 0x05:
cprintf("STATUS: Reset failed (hard disk)");
break;
case 0x06:
cprintf("STATUS: Disk changed since last
operation");
break;
case 0x07:
cprintf("STATUS: Drive parameter activity
failed");
break;
case 0x08:
cprintf("STATUS: Direct memory access (DMA)
overrun");
break;
case 0x09:
cprintf("STATUS: Attempt to perform DMA across
64K boundary");
break;
case 0x0A:
cprintf("STATUS: Bad sector detected");
break;
case 0x0B:
cprintf("STATUS: Bad track detected");
break;
case 0x0C:
cprintf("STATUS: Media type not found");
break;
case 0x0D:
cprintf("STATUS: Invalid number of sectors on
format (hard disk)");
break;
case 0x0E:
cprintf("STATUS: Control data address mark
detected (hard disk)");
break;
case 0x0F:
cprintf("STATUS: DMA arbitration level out of
range (hard disk)");
break;
case 0x10:
cprintf("STATUS: Bad CRC/ECC on disk read");
break;
case 0x11:
cprintf("STATUS: CRC/ECC corrected data error");
break;
case 0x20:
cprintf("STATUS: Controller has failed");
break;
case 0x31:
cprintf("STATUS: No media in drive (IBM/MS INT 13H
extensions)");
break;
case 0x32:
cprintf("STATUS: Incorrect drive type stored in
CMOS (Compaq)");
break;
case 0x40:
cprintf("STATUS: Seek operation failed");
break;
case 0x80:
cprintf("STATUS: Attachment failed to respond
(Disk Timed-out)");
break;
case 0xAA:
cprintf("STATUS: Drive not ready (hard disk
only)");
break;
case 0xB0:
cprintf("STATUS: Volume not locked in drive (INT
13H extensions)");
break;
case 0xB1:
cprintf("STATUS: Volume locked in drive (INT 13H extensions)");
break;
case 0xB2:
cprintf("STATUS: Volume not removable (INT 13H
extensions)");
break;
case 0xB3:
cprintf("STATUS: Volume in use (INT 13H
extensions)");
break;
case 0xB4:
cprintf("STATUS: Lock count exceeded (INT 13H
extensions)");
break;
case 0xB5:
cprintf("STATUS: Valid eject request failed (INT
13H extensions)");
break;
case 0xBB:
cprintf("STATUS: Undefined error occurred (hard
disk only)");
break;
case 0xCC:
cprintf("STATUS: Write fault occurred");
break;
case 0xE0:
cprintf("STATUS: Status register error");
break;
case 0xFF:
cprintf("STATUS: Sense operation failed");
break;
default: cprintf("STATUS: UNKNOWN Status CODE");
}
printf("\nCurrent position= Track:%d Head:%d Sector:%d \n",
track,head,sector);
}
gotoxy(10,24);printf("Scanning Completed!! Press Any Key TO
Exit..");
getch();
}
El programa muestra el ejemplo de uso de las funciones int86 e int86x. En este programa, la función int86 está inicializando el disco reiniciando el sistema del disco, usando la función 00H de INT 13H. La función int86x está verificando cada sector del disquete (disquete de 1.44Mb, 3½) desde ambos lados, hasta 0 a 79 pistas (total 80 pistas) usando la función 04H de INT 13H.
segread Función
Esta función ha sido definida en dos.h. Esta función lee los registros del segmento. La declaración de la función es la siguiente:
void segread(struct SREGS *segp);
donde segread pone los valores actuales de los registros del segmento en la estructura *segp. La función no devuelve nada y la llamada está diseñada para usarse con intdosx e int86x. Veamos un ejemplo
#include <stdio.h>
#include <dos.h>
void main()
{
struct SREGS segs;
segread(&segs);
printf("Current segment register settings\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
getch();
}
Y la salida del programa será algo como esto:
Current segment register settings
CS: EED DS: 10BA
ES: 10BA SS: 10BA
intdos and intdosx Funciones
Estas funciones han sido definidas en dos.h. Estas son las interfaces generales de interrupción de DOS. La función intdos invoca los registros de servicio de MS-DOS, luego DX y AL, donde la función intdosx invoca el servicio de MS-DOS con valores de registro de segmento.
La declaración de la función intdos es la siguiente:
int intdos(union REGS *inregs, union REGS *outregs);
and the declaration of intdosx function is as:
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
Las funciones intdos y intdosx ejecutan la interrupción de DOS 0x21 para invocar una función de DOS específica. El valor de inregs->h.ah especifica la función de DOS que se invocará. La función intdosx también copia los valores segregs ->ds y segregs ->es en los registros correspondientes antes de invocar la función DOS y luego restaura DS.
Esta característica de las funciones permite que los programas que usan punteros lejanos o un modelo de memoria de datos grande especifiquen qué segmento se usará para la ejecución de la función. Con la función intdosx puede invocar una función de DOS que toma un valor de DS diferente del segmento de datos predeterminado y/o toma un argumento en ES.
Ambas funciones devuelven el valor de AX después de completar la llamada de función de DOS y si se establece el indicador de acarreo (outregs -> x.cflag != 0), indica que ocurrió un error.
Después de la interrupción, 0x21 devuelve las funciones para copiar los valores de registro actuales en outregs, el estado de la bandera de acarreo en el campo x.cflag en outregs y el valor del registro de banderas 8086 en el campo x.flags en outregs. Tanto inregs como outregs pueden apuntar a la misma estructura. Veamos los ejemplos de estas funciones.
El ejemplo del uso de la función indos se muestra a continuación. Este programa obtiene la información seleccionada sobre la disquetera (disquete de 1.44Mb, 3½ pulgadas). Este programa proporciona la información de asignación de un disquete.
/* Obtener información de asignación de unidades para el uso del disco */
#include <dos.h> /* for intdos() and union REGS */
#include <stdio.h> /* for printf() */
union REGS inregs, outregs;
void main()
{
inregs.h.ah = 0x36; /* get disk free space
function number */
inregs.h.dl = 0x01; /* drive A: */
intdos(&inregs, &outregs);
printf("%d sectors/cluster,\n%d clusters,\n%d bytes/sector,
\n%d total clusters",
outregs.x.ax,outregs.x.bx,
outregs.x.cx, outregs.x.dx);
getch();
}
And output of the program will be like this:
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
Ahora veamos un ejemplo de la función intdosx. El siguiente ejemplo muestra el uso de la función intdosx. El programa genera una cadena a la salida estándar.
/* El programa para generar 'cadena' al estándar
producción. */
#include <dos.h>
union REGS inregs, outregs;
struct SREGS segregs;
char far *string = "this string is not in the
default data segment$";
void main()
{
inregs.h.ah = 0x09; /* function number */
inregs.x.dx = FP_OFF(string);/*DS:DX is far
address of 'string */
segregs.ds = FP_SEG(string);
intdosx(&inregs, &outregs, &segregs);
getch();
}
Y la salida del programa será la siguiente:
esta cadena no está en el segmento de datos predeterminado |
Aquí estamos imprimiendo la cadena dada con la función intdosx, por la función 09H de INT 21H. Siempre se debe tener en cuenta que la cadena dada siempre debe terminar con el carácter “$”.
Cómo saber el número de disco duro físico
El número de disco duro físico es muy importante y debe escribirse exactamente. La especificación de disco ilegal puede causar una gran pérdida de datos. Debemos estar seguros del número de unidad durante la programación de recuperación de datos o solución de problemas del disco. La forma de saber el número de unidad de cualquier disco con diferentes arreglos de discos se puede estimar con los ejemplos que se dan a continuación.
Según el mito más generalizado, los números de unidades físicas se proporcionan de acuerdo con el estado de conexión del disco; sin embargo, en algunos casos o en casos especiales, puede depender del procedimiento de arranque o del sistema operativo. configuración de arranque.
La idea más generalizada para el número de unidad física proporcionado por BIOS se ha dado aquí, pero aún así debe confirmarlo con la ayuda de cualquier herramienta de edición de disco o con los programas que se proporcionan en los siguientes capítulos. sobre la configuración del disco. Después de estar seguro, debe tomar cualquier decisión sobre la ejecución de dichos programas que pueden corromper o dañar los datos, si se usan ilegalmente o sin conocimiento.
Por lo general, si los dos discos están conectados al sistema, uno es el maestro principal y el otro es el maestro secundario, la primera preferencia se le dará al maestro principal (y luego al esclavo principal si está disponible) y luego al maestro secundario ( y luego al esclavo secundario si está disponible y así sucesivamente) y el número físico se le dará de acuerdo a sus preferencias.
Supongamos que su sistema admite un máximo de cuatro discos duros a la vez. Los cuatro discos duros se pueden conectar como se indica a continuación:
Maestro principal |
Esclavo principal |
Maestría Secundaria |
Esclavo secundario |
Ahora consideremos algunos casos para el número de unidades físicas. Aquí asumo que ha conectado los discos con la configuración adecuada de los puentes como lo menciona el fabricante del disco, y en la configuración correcta de Maestro y Esclavo:
- Si los cuatro discos duros están conectados al sistema: si los cuatro discos están conectados al sistema, los números de unidades físicas serán los siguientes:
Primario/Secundario (Maestro/Esclavo) |
Estado |
Número de unidad física y descripción |
Maestro principal |
El disco está presente |
El número de unidad física será 80H. En este caso, el Disco Duro se denomina Primer Disco Duro. |
Esclavo principal |
El disco está presente |
El número de unidad física será 81H. En este caso el Disco Duro se denomina Segundo Disco Duro. |
Maestría Secundaria |
El disco está presente |
El número de unidad física será 82H. En este caso el Disco Duro se denomina Tercer Disco Duro. |
Esclavo secundario |
El disco está presente |
El número de unidad física será 83H. En este caso el Disco Duro se denomina Cuarto Disco Duro. |
- Si hay tres discos duros conectados al sistema: si hay tres discos duros conectados al sistema, los números de unidades físicas serán los que correspondan a sus preferencias de conexión. Los siguientes ejemplos representan algunos de los arreglos:
Primario/Secundario (Maestro/Esclavo) |
Estado |
Número de unidad física y descripción |
Maestro principal |
El disco está presente |
El número de unidad física será 80H. En este caso, el Disco Duro se denomina Primer Disco Duro. |
Esclavo principal |
El disco está presente |
El número de unidad física será 81H. En este caso el Disco Duro se denomina Segundo Disco Duro. |
Maestría Secundaria |
El disco está presente |
El número de unidad física será 82H. En este caso el Disco Duro se denomina Tercer Disco Duro. |
Esclavo secundario |
Disco no presente |
------------------- |
Primario/Secundario (Maestro/Esclavo) |
Estado |
Número de unidad física y descripción |
Maestro principal |
Disco no presente |
------------------- |
Esclavo principal |
El disco está presente |
El número de unidad física será 80H. En este caso, el disco duro se denomina primer disco duro. |
Maestría Secundaria |
El disco está presente |
El número de unidad física será 81H. En este caso el Disco Duro se denomina Segundo Disco Duro. |
Esclavo secundario |
El disco está presente |
El número de unidad física será 82H. En este caso el Disco Duro se denomina Tercer Disco Duro. |
Primario/Secundario (Maestro/Esclavo) |
Estado |
Número de unidad física y descripción |
Maestro principal |
El disco está presente |
El número de unidad física será 80H. En este caso, el Disco Duro se denomina Primer Disco Duro. |
Esclavo principal |
Disco no presente |
------------------- |
Maestría Secundaria |
El disco está presente |
El número de unidad física será 81H. En este caso el Disco Duro se denomina Segundo Disco Duro. |
Esclavo secundario |
El disco está presente |
El número de unidad física será 82H. En este caso el Disco Duro se denomina Tercer Disco Duro. |
Primario/Secundario (Maestro/Esclavo) |
Estado |
Número de unidad física y descripción |
Maestro principal |
El disco está presente |
El número de unidad física será 80H. En este caso, el Disco Duro se denomina Primer Disco Duro. |
Esclavo principal |
El disco está presente |
El número de unidad física será 81H. En este caso el Disco Duro se denomina Segundo Disco Duro. |
Maestría Secundaria |
Disco no presente |
------------------- |
Esclavo secundario |
El disco está presente |
El número de unidad física será 82H. En este caso el Disco Duro se denomina Tercer Disco Duro. |
- Si se conectan dos discos duros al sistema: De manera similar, si se conectan dos discos duros al sistema, los números de unidades físicas serán según sus preferencias de conexión. El siguiente ejemplo lo ilustra:
Primario/Secundario (Maestro/Esclavo) |
Estado |
Número de unidad física y descripción |
Maestro principal |
El disco está presente |
El número de unidad física será 80H. En este caso, el Disco Duro se denomina Primer Disco Duro. |
Esclavo principal |
Disco no presente |
------------------- |
Maestría Secundaria |
Disco no presente |
------------------- |
Esclavo secundario |
El disco está presente |
El número de unidad física será 81H. En este caso el Disco Duro se denomina Segundo Disco Duro. |
- Si el disco duro único está conectado al sistema: no es necesario pensar, si solo hay un disco disponible, el número de unidad física será 80H.
Interrupción 13H (INT 13H), funciones del controlador de disco ROM BIOS
La descripción de las funciones INT 13H se ha dado aquí. Estas funciones deben aprenderse con cuidado, ya que el mal uso de estas funciones o el uso sin cuidado o sin conocimiento puede causar una gran pérdida de datos o muchos otros problemas. Sin embargo, si se usan de manera adecuada y adecuada, estas funciones ayudan a minimizar la codificación de su programa y también hacen que su programación sea simple y fácil.
INT 13H (0x13)
Function 00H (0x00) Reset disk system
Call with AH = 00H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function is successful
Carry flag = clear
AH = 00H
If function is unsuccessful
Carry flag = set
AH = status
Comentarios:
Restablece el controlador de disco, recalibra sus unidades conectadas. El brazo de lectura/escritura se mueve al cilindro 0 y se prepara para la E/S del disco.
Esta función debe llamarse después de una solicitud fallida de lectura, escritura, verificación o formato del disquete antes de volver a intentar la operación. Si la función se llama con una unidad de disco fija (es decir, seleccionando DL>=80H), el controlador de disquete y luego el controlador de disco fijo se restablecen.
INT 13H (0x13)
Function 01H (0x01) Get disk system status
Call with: AH = 01H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: AH = 00H
AL = status of previous disk operation
(See the table given before for error
and status codes description).
Comentarios:
Devuelve el estado de la operación de disco más reciente
INT 13H (0x13)
Function 02H (0x02) Read sector
Call with: AH = 02H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES:BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función lee uno o más sectores del disco a la memoria. En discos fijos, los 2 bits superiores del número de cilindro de 10 bits se colocan en los 2 bits superiores del registro CL.
INT 13H (0x13)
Function 03H (0x03) Write sector
Call with: AH = 03H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sector transferred
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función escribe uno o más sectores de la memoria al disco. En discos fijos, los 2 bits superiores del número de cilindro de 10 bits se colocan en los 2 bits superiores del registro CL.
INT 13H (0x13)
Function 04H (0x04) >> Verify sector
Call with: AH = 04H
AL = number of sectors
CH = cylinder
CL = sector
DH = drive
00H-7FH floppy disk
80H-FFH fixed drive
ES: BX = segment: offset of buffer
Returns: If function is successful
Carry flag = clear
AH = 00H
AL = number of sectors verified
If function is unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función verifica los campos de dirección de uno o más sectores. Esta operación no transfiere datos hacia o desde la memoria. En discos fijos, los 2 bits superiores del número de cilindro de 10 bits se reemplazan en los 2 bits superiores del registro CL.
Esta función se puede utilizar para comprobar si hay un medio legible en una unidad de disquete. El programa solicitante debe restablecer el sistema de disquete (INT 13H Función 00H) y volver a intentar la operación tres veces antes de suponer que no hay un disquete legible. Se recomienda en la mayoría de las operaciones de inicialización de disquetes.
INT 13H (0x13)
Function 05H (0x05) >> Format track
Call with: AH = 05H
AL = interleave (PC/XT fixed disks)
CH = cylinder
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of address field list
(Except PC/XT fixed disk)
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
Comentarios:
Inicializa el sector del disco y rastrea los campos de dirección en la pista especificada. En los disquetes, la lista de campos de direcciones consta de una serie de entradas de 4 bytes, una entrada por sector. El formato se ha dado en la siguiente tabla.
En discos fijos, los 2 bits superiores del número de cilindro de 10 bits se colocan en los 2 bits superiores del registro CL.
Byte |
Contenido |
0 |
Cylinder |
1 |
Head |
2 |
Sector |
3
|
Sector-size code
Value |
Description |
00H |
128 Byte per sector |
01H |
256 Byte per sector |
02H |
512 Byte per sector |
03H |
1024 Byte per sector |
|
INT 13H (0x13)
Function 06H (0x06) >> Format bad track
Call with: AH = 06H
AL = interleave
CH = cylinder
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función está definida solo para unidades de disco fijas PC/XT. Inicializa una pista, escribe campos de dirección de disco y sectores de datos y configura indicadores de sectores defectuosos.
INT 13H (0x13)
Function 07H (0x07) >> Format drive
Call with: AH = 07H
AL = interleave
CH = cylinder
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
Comentarios:
Esta función está definida solo para unidades de disco fijas PC/XT. Formatea todo el disco, escribiendo campos de dirección de disco y sectores de datos, comenzando en el cilindro especificado.
INT 13H (0x13)
Function 08H (0x08) >> Get drive parameters
Call with: AH = 08H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
BL = drive type (PC/AT and PS/2 floppy
disk)
Valor |
Descripción |
01H |
360KB, 40 track, 5.25” |
02H |
1.2MB, 80 track, 5.25” |
03H |
720KB, 80 track, 3.5” |
04H |
1.44MB, 80 track, 3.5” |
CH = low 8 bits of maximum cylinder
number
CL = bits 6-7 high order 2 bits of maximum
cylinder number bits 0-5 maximum
sector number
DH = maximum head number
DL = number of drives
ES: DI = segment: offset of disk drive
parameter table
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función devuelve varios parámetros para la unidad especificada. El valor devuelto en el registro DL refleja el número real de unidades físicas conectadas al adaptador para la unidad solicitada.
INT 13H (0x13)
Function 09H (0x09) >> Initialize fixed disk characteristics
Call with: AH = 09H
DL = drive
80H-FFH fixed disk
On the PC/XT Vector for INT 41H
must point to disk parameter block or, on the PC/AT and PS/2
Vector for INT 41H must point to disk
parameter block for drive 0
Vector for INT 46H must point to disk
parameter block for drive 1
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función inicializa el controlador de disco fijo para las operaciones de E/S subsiguientes, utilizando los valores que se encuentran en los bloques de parámetros del disco ROM BIOS. La función solo se admite en discos fijos. El formato de bloque de parámetros para PC y discos fijos PC/XT es el siguiente:
Byte(s) |
Contenido |
00H-01H |
Maximum number of cylinders |
02H |
Maximum number of heads |
03H-04H |
Starting reduced write current cylinder |
05H-06H |
Starting write pre compensation cylinder |
07H |
Maximum ECC burst length |
08H
|
Drive option
Bit(s) |
Significance (if set) |
0 – 2 |
drive option |
3 – 5 |
reserved (0) |
6 |
disable ECC entries |
7 |
disable disk-access retries |
|
09H |
Standard time-out value |
0AH |
Time-out value for format drive |
0BH |
Time-out value for check drive |
0CH-0FH |
Reserved |
El formato de bloque de parámetros para discos fijos PC/AT y PS/2 es el siguiente:
Byte(s) |
Contenido |
00H_01H |
maximum number of cylinders |
02H |
maximum number of heads |
03H-04H |
Reserved |
05H-06H |
starting write pre compensation cylinder |
07H |
maximum ECC burst length |
08H |
Drive options
Bit(s) |
Significance (if set) |
0 – 2 |
not used |
3 |
more than 8 heads |
4 |
not used |
5 |
manufacturer’s defect map present at
maximum cylinder +1 |
6 – 8 |
nonzero (10, 01,or 11) if retries disabled |
|
09H-0BH |
Reserved |
0CH-0DH |
landing zone cylinder |
0EH |
sector per track |
0FH |
Reserved |
INT 13H (0x13)
Function 0A H (0x0A or 10) >> Read sector long
Call with: AH = 0AH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función lee un sector o sectores del disco a la memoria junto con un código de corrección de errores (ECC) de 4 bytes para cada sector. A diferencia de la función de sector de lectura normal (INT 13H (0x13) Función 02H), los errores de ECC no se corrigen automáticamente. Las transferencias multisectoriales finalizan después de cualquier sector con un error de lectura.
Esta función solo se admite en discos fijos. Los 2 bits superiores del número de cilindro de 10 bits se colocan en los 2 bits superiores del registro CL.
INT 13H (0x13)
Function 0BH (0x0B or 11) >> Write sector long
Call with:AH = 0BH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función escribe un sector(es) de la memoria al disco. El valor de los datos de cada sector debe ir seguido de su código ECC de 4 bytes. Los 2 bits superiores del número de cilindro de 10 bits se colocan en los 2 bits superiores del registro CL. Esta función solo se admite en discos fijos.
INT 13H (0x13)
Function 0CH (0x0C or 12) >> Seek
Call with:AH = 0CH
CH = lower 8 bits of cylinder
CL = upper 2 bits of cylinder in bits 6-7
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función coloca los cabezales de lectura/escritura del disco en el cilindro especificado sin transferir ningún dato. Los 2 bits superiores del número de cilindro se colocan en los 2 bits superiores del registro CL. Esta función solo se admite en discos fijos.
INT 13H (0x13)
Function 0DH (0x0D or 13) >> Reset fixed disk system
Call with:AH = 0DH
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
Comentarios:
Esta función restablece el controlador de disco fijo, recalibra las unidades conectadas, mueve el brazo de lectura/escritura al cilindro 0 y se prepara para la E/S de disco subsiguiente.
INT 13H (0x13)
Function 0EH (0x0E or 14) >> Read sector buffer
Call with:AH = 0EH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función transfiere el contenido del búfer de sector interno del adaptador de disco fijo a la memoria del sistema. No se leen datos de la unidad de disco físico.
INT 13H (0x13)
Function 0FH (0x0F or 15) >> Write sector buffer
Call with:AH = 0FH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función transfiere datos desde la memoria del sistema al búfer de sector interno del adaptador fijo. No se escriben datos en la unidad de disco físico. Se debe llamar a esta función para inicializar el contenido del búfer de sector antes de formatear la unidad con INT 13H Función 05H.
INT 13H (0x13)
Function 10H (0x10 or 16) >> Get drive status
Call with:AH = 10H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función comprueba si la unidad de disco fija especificada está operativa y devuelve el estado de la unidad. Esta función solo se admite en discos fijos.
INT 13H (0x13)
Function 11H (0x11 or 17) >> Recalibrate drive
Call with:AH =11H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función hace que el adaptador de disco fijo se vuelva a calibrar para la unidad especificada, colocando el brazo de lectura/escritura en el cilindro 0 y devuelve el estado de la unidad. Esta función solo se admite en discos fijos.
INT 13H (0x13)
Function 12H (0x12 or 18) >> Controller RAM
diagnostic
Call with:AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función hace que el adaptador de disco fijo lleve a cabo una prueba de diagnóstico integrada en su búfer de sector interno, lo que indica si el estado devuelto pasó la prueba.
INT 13H (0x13)
Function 13H (0x13 or 19) >> Controller drive diagnostic
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función hace que el adaptador fijo ejecute pruebas de diagnóstico internas de la unidad adjunta, lo que indica si el estado devuelto pasó la prueba.
INT 13H (0x13)
Function 14H (0x14 or 20) >> Controller internal
diagnostic
Call with:AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función hace que el adaptador de disco fijo lleve a cabo una autocomprobación de diagnóstico integrada, que indica si el estado devuelto pasó la prueba.
INT 13H (0x13)
Function 15H (0x15 or 21) >> Get disk type
Call with:AH = 15H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = drive type code
00H if no drive present
01H if floppy disk drive without change-line support
02H if floppy disk drive with change-line support
03H if fixed disk
|
And, if fixed disk (AH =03H)
CX: DX = number of 512-byte sectors
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función devuelve un código que indica el tipo de disquete o disco fijo al que hace referencia el código de unidad especificado.
INT 13H (0x13)
Function 16H (0x16 or 22) >> Get disk change
status
Call with: AH = 16H
DL = drive
00H-7FH floppy disk
Returns:If change line inactive and disk has not been changed
Carry flag = clear
AH = 00H
If change line active and disk may have been changed
Carry flag = set
AH = 06H
Comentarios:
Esta función devuelve el estado de la línea de cambio, indicando si el disco en la unidad puede haber sido reemplazado desde el último acceso al disco. Si esta función regresa con el indicador de acarreo establecido, el disco no necesariamente se ha cambiado y la línea de cambio se puede activar simplemente desbloqueando y bloqueando la puerta de la unidad de disco sin quitar el disquete.
INT 13H (0x13)
Function 17H (0x17 or 23) >> Set disk type
Call with: AH = 17H
AL = floppy disk type code
Valor |
Descripción |
00H |
Not used |
01H |
320/360 KB floppy disk in 360 KB drive |
02H |
320/360 KB floppy disk in 1.2 MB drive |
03H |
1.2 MB floppy disk in 1.2 MB drive |
04H |
720 KB floppy disk in 720 KB drive |
SL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función selecciona un tipo de disquete para la unidad especificada.
INT 13H (0x13)
Function 18H (0x18 or 24) >> Set media type for format
Call with: AH = 18H
CH = number of cylinders
CL = sector per track
DL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
ES: DI = segment: offset of disk
parameter table for media type
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función selecciona las características de los medios para la unidad especificada, por lo que debe haber un disquete en la unidad.
INT 13H (0x13)
Function 19H (0x19 or 25) >> Park heads
Call with: AH = 19H
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comentarios:
Esta función mueve el brazo de lectura/escritura a una pista que no se utiliza para el almacenamiento de datos, de modo que los datos no se dañen cuando se apaga la unidad.
INT 13H (0x13)
Function 1AH (0x1A or 26) >> Format ESDI drive
Call with: AH = 1AH
AL = Relative Block Address (RBA)
defect table count
0, if no RBA table
>0, if RBA table used
CL = format modifier bits
Bit(s) |
Importancia (si se establece) |
0 |
Ignore primary defect map |
1 |
Ignore secondary defect map |
2 |
Update secondary defect map |
3 |
Perform extended surface analysis |
4 |
Generate periodic interrupt |
5-7 |
Reserved (must be 0) |
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of RBA table
Returns: If function successfu
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
Comentarios:
Esta función inicializa el sector del disco y realiza un seguimiento de los campos de dirección en una unidad conectada al adaptador de unidad de disco fijo ESDI.
La operación de esta función se denomina formato de bajo nivel y prepara el disco para operaciones físicas de lectura/escritura a nivel de sector. La unidad debe particionarse posteriormente con el comando FDISK y luego darle un formato de alto nivel con el comando FORMAT para instalar un sistema de archivos.
Página modificada el: 12/01/2022