Capítulo – 8
Funções de BIOS de disco e manipulação de interrupções com C
Introdução
Neste capítulo, discutiremos as funções importantes do Disk-BIOS e outras funções importantes que nos dão a liberdade de usar e lidar com interrupções em nosso programa com C, com o método fácil e curto. Essas funções são a parte de trás – osso da recuperação de dados e programação de solução de problemas de disco. Estas são as funções que fazem da linguagem C uma linguagem “alta – Linguagem Assembly de nível”.
Funções biosdisk e _bios_disk
Essas duas funções são as mais importantes para nossa finalidade de recuperação de dados e programação de solução de problemas de disco. Usaremos essas funções na maioria das vezes.
Esses dois são os serviços da unidade de disco do BIOS e foram definidos em bios.h, onde o biosdisk opera abaixo do nível de arquivos em setores brutos. Se essas funções forem usadas mesmo com um pouco de falta de cuidado, isso pode destruir o conteúdo dos arquivos e diretórios em um disco rígido. Ambas as funções biosdisk e _bios_disk, usam interrupção 0x13 para emitir operações de disco diretamente para o BIOS. A função _bios_disk é declarada no programa da seguinte maneira:
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);
O significado desses parâmetros foi descrito na tabela a seguir:
Parameter |
Function |
What It Is or what it does |
cmd |
Both |
Indicates the operation to perform such as read, write, verify etc.(See the description of cmd, given next) |
dinfo |
_bios_disk |
Points to a diskinfo_t structure that contains the remaining Parameters required by the operation.(see the description of diskinfo_t structure, given next) |
drive |
biosdisk |
Specifies which disk drive is to be used(0 for a:, 1for b: and 0x80 for first physical hard disk, 0x81 for second and so on.) |
head
track
sector |
biosdisk |
These specify the starting sector location from which the Operation is to be started. |
nsects |
biosdisk |
Number of sectors to read, write, verify etc. |
buffer |
biosdisk |
Memory address where data is to be read or written |
Em ambas as funções, os dados são lidos e escritos do buffer a 512 bytes por setor que é o tamanho lógico do setor de um disco rígido e o valor retornado por ambas as funções é o valor do registro AX definido pelo INT 0x13H Chamada de BIOS.
Se a função for bem-sucedida, High byte = 0, significa que a conclusão bem-sucedida e o byte baixo contém o número de setores lidos, gravados ou verificados e assim por diante.
Mas se houver algum erro e a função não for bem-sucedida, o valor de High byte será um dos seguintes códigos de erro descritos na tabela a seguir:
Value |
Description |
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 |
Value |
Description |
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 |
A tabela a seguir representa os comandos de operação a serem executados pelo parâmetro cmd. Em primeiro lugar, veremos as operações comuns de ambas as funções.
biosdisk |
_bios_disk |
What it does |
0 |
_DISK_RESET |
Resets disk system, forcing the drive controller to do a hard reset. Ignore all other parameters |
1 |
_DISK_STATUS |
Returns the status of the last disk operation. Ignores all other parameters |
2 |
_DISK_READ |
Reads one or more disk sectors into memory |
biosdisk |
_bios_disk |
What it does |
3 |
_DISK_WRITE |
Writes one or more disk sectors from memory |
4 |
_DISK_VERIFY |
Verifies one or more sectors |
5 |
_DISK_FORMAT |
Formats a track |
Embora você seja livre para usar cmd = 0, 1, 2, 3, 4,5 ou cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT e ambas as opções têm o mesmo efeito, mas é recomendado que você tem o hábito de usar a opção de palavras como cmd = _DISK_FORMAT em vez de cmd = 5 porque isso pode ajudá-lo a evitar erros que podem ocorrer se você digitar um número de comando errado para cmd.
Na declaração da função biosdisk ou _bios_disk se dermos o cmd = _DISK_RESET a função reseta o sistema de disco ignorando todos os outros parâmetros e _DISK_STATUS retorna o status da última operação do disco, ignorando todos os outros parâmetros
Para cmd =_DISK_READ, _DISK_WRITE ou _DISK_VERIFY (2, 3 ou 4), as funções biosdisk e _bios_disk também usam outros parâmetros mostrados abaixo:
Parameter |
What It Does |
head
track
sector |
These three specify the location of starting sector for the specified operation. (minimum possible values may be head = 0, track = 0 and sector =1) |
nsectors |
This specifies the number of sectors to read or write |
buffer |
It points to the buffer where data is to be read and written |
Se o valor de cmd for = 5 (_DISK_FORMAT), biosdisk e _bios_disk utilizam os seguintes parâmetros conforme a descrição na tabela. É sempre recomendado que você tome cuidado enquanto estiver usando _DISK_FORMAT e saiba o que está fazendo. A falta de conhecimento ou mesmo um pequeno erro pode fazer com que você enfrente uma grande perda de dados.
Parameter |
What It Does |
head
track |
These specify the location of the track to format |
buffer |
It points to a table of sector headers to be written on the named track |
Existem alguns valores adicionais de cmd que são usados apenas pelas funções do biosdisk. Esses valores de cmd são permitidos apenas para XT, AT, PS/2 e compatíveis. Os valores foram descritos na tabela a seguir:
cmd |
What it does |
6 |
Formats a track and sets bad sector flags |
7 |
Formats the drive beginning at a specific track |
8 |
Returns the current drive parameters in first 4 bytes of buffer |
9 |
Initializes drive-pair characteristics |
10 |
Does a long read (512 plus 4 extra bytes per sector) |
11 |
Does a long write (512 plus 4 extra bytes per sector) |
12 |
Does a disk seek |
13 |
Alternates disk reset |
14 |
Reads sector buffer |
15 |
Writes sector buffer |
16 |
Tests whether the named drive is ready |
17 |
Recalibrates the drive |
18 |
Controller RAM diagnostic |
19 |
Drive diagnostic |
20 |
Controller internal diagnostic |
Estrutura diskinfo_t
estrutura diskinfo_t é usada pela função _bios_disk. A descrição da estrutura é a seguinte:
struct diskinfo_t {
unsigned drive, head, track, sector, nsectors;
void far *buffer;
};
Onde drive especifica a unidade de disco que deve ser usada. Lembre-se sempre que para os discos rígidos, a unidade física é especificada, não a partição do disco. Se você deseja operar partições, o programa aplicativo também deve interpretar as informações da tabela de partições desse próprio disco.
O valor de head, track e sector especifica a localização do setor inicial para a operação. nsectors especifica o número de setores a serem lidos ou gravados e o buffer aponta para o buffer onde os dados são lidos e gravados. Dependendo do valor de cmd, os outros parâmetros na estrutura diskinfo_t podem ou não ser necessários.
O valor para a especificação do drive de disco a ser usado nas funções biosdisk e _bios_disk foi dado na tabela a seguir:
drive Value |
Disk drive to use |
0 |
First floppy-disk drive |
1 |
Second floppy-disk drive |
2 |
Third floppy-disk drive |
.... |
(and so on) |
0x80 |
First hard-disk drive |
0x81 |
Second hard-disk drive |
0x82 |
Third hard-disk drive |
.... |
(and so on) |
Chega de teoria! Agora vamos ver algumas coisas práticas e alguns exemplos dessas funções. O exemplo a seguir lê os setores de ambos os lados de quatro trilhas do disquete e armazena o conteúdo no arquivo, especificado pelo usuário. Não importa se você excluiu os arquivos do seu disco porque o programa está lendo diretamente a superfície do disco.
Para ver os dados excluídos, é melhor que você pegue um disquete totalmente formatado e copie alguns arquivos de texto, como a codificação de programas .c ou outros arquivos de texto (para que você possa entender o conteúdo dos arquivos) ocupando aproximadamente 73KB(dados armazenados em quatro trilhas, dois lados e 18 setores em cada trilha. Cada setor é de 512bytes). O programa foi desenvolvido para demonstrar o exemplo. No entanto, você pode alterá-lo e desenvolvê-lo para ficar pronto para recuperar os dados.
/* Programa para ler 4 faixas (0, 1, 2 e 3) de um disquete e gravar o conteúdo no arquivo 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();
/// Verifica se a unidade está pronta ou não \\\
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();
}
/*Obtenha o nome do arquivo para armazenar os dados dos Setores de
O 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 */
/// Mostra o Status \\\
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);
/// Ler os setores especificados \\\
result = _bios_disk(_DISK_READ, &dinfo);
/// Armazena o conteúdo no arquivo especificado \\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Imprimir mensagem de erro na tela e no arquivo para erro ao ler um setor */
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);
}
O exemplo mostra o uso das funções biosdisk e _bios_disk. A função biosdisk verifica se o disco está pronto ou não e a marca de endereço é encontrada. A função _bios_disk lê os setores de ambos os lados até quatro trilhas.
A sequência de leitura (ou escrita) na superfície do disco deve ser a seguinte:
Funções absread e abswrite
Estas funções foram definidas em Dos.h. A função absread lê os setores absolutos do disco e a função abswrite grava os setores absolutos do disco. A função absread usa a interrupção 0x25 do DOS para ler setores de disco específicos e a função abswrite usa a interrupção 0x26 do DOS para gravar setores de disco específicos.
As operações absolutas de leitura ou gravação prosseguem de maneira seqüencial, incrementando o(s) setor(es) passo a passo e são completamente livres dos números de cabeça e trilha etc. números de pista, chefe e setor.
As operações absolutas de leitura e gravação são recomendadas em programas em que vamos realizar operações de leitura/gravação em todo o disco e queremos evitar codificação extra e looping em nosso programa para aumentar a velocidade do programa mais rapidamente.
Ambas as funções absread e abswrite, ignoram a estrutura lógica de um disco e não prestam atenção a arquivos, FATs ou diretórios. Essas funções executam diretamente a operação de leitura absoluta e gravação absoluta na superfície do disco. Essa é a razão pela qual, se usada incorretamente, abswrite pode substituir arquivos, diretórios e FATs.
A declaração da função absread é a seguinte:
int absread(int drive, int nsects, long lsect,
void *buffer);
e a função abswrite é declarada da seguinte forma:
int abswrite(int drive, int nsects, long lsect,
void *buffer);
Onde o significado dos parâmetros é o seguinte:
Param. |
What It Is/Does |
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 |
Memory address where the data is to be read (or written) |
Em caso de sucesso, ambas as funções retornam 0. Quando há algum erro, ambas retornam -1 e definem o erro no. ao valor do registrador AX retornado pela chamada do sistema.
The number of sectors for read or write operation is limited to 64K or the size of the buffer, whichever is smaller. However we will learn the use of Huge memory in next chapters to exceed out of the memory limit 64K, to develop a very fast program.
|
Manipulação de interrupção com C
C às vezes é chamado de linguagem assembly de alto nível porque pode chamar as diferentes interrupções usando algumas de suas funções definidas. Algumas funções importantes são as seguintes:
- int86: Invoca interrupções do MS-DOS.
- int86x: chama a interrupção do MS-DOS com valores de registro de segmento.
- intdos: invoca o serviço MS-DOS usando registros diferentes de DX e AL
- intdosx: invoca o serviço MS-DOS com valores de registro de segmento.
- segread: lê registros de segmentos
Vamos discutir essas funções em detalhes. Em primeiro lugar, discutimos algumas estruturas e uniões predefinidas que são frequentemente ou necessariamente usadas com essas funções.
Estrutura SREGS
Esta estrutura foi definida em dos.h e é uma estrutura dos registradores de segmento passados e preenchidos pelas funções, int86x, intdosx e segread. A declaração da estrutura é a seguinte:
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
União REGS
REGS é a união de duas estruturas. A união REGS foi definida dos.h e é usada para passar informações de e para as funções, int86, int86x, intdos e intdosx. A declaração da união é a seguinte:
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Estruturas BYTEREGS e WORDREGS
As estruturas BYTEREGES e WORDREGS foram definidas em dos.h e são usadas para armazenar registradores de bytes e palavras. A estrutura WORREGS permite ao usuário acessar os registradores da CPU como quantidades de 16 bits onde a estrutura BYTEREGES dá acesso aos registradores individuais de 8 bits.
A estrutura BITEREGS é declarada da seguinte forma:
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
E a estrutura WORREGS é declarada da seguinte forma:
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
funções int86 e int86x
Estas funções são as interfaces gerais de interrupção de software 8086 definidas em dos.h. Os registros são definidos para os valores desejados e essas funções são chamadas para invocar as interrupções do MS-DOS. A declaração da função int86 é a seguinte:
int int86(int intno, union REGS *inregs,
union REGS *outregs);
int86x é a variação da função int86. É declarado da seguinte forma:
int int86x(int intno, union REGS *inregs,
union REGS *outregs, struct SREGS *segregs);
Ambas as funções int86 e int86x executam uma interrupção de software 8086 especificada pelo argumento intno Ou podemos dizer que a interrupção a ser gerada é especificada por intno.
Com a função int86x o acesso é possível apenas para ES e DS e não para CS e SS, então você pode invocar uma interrupção de software 8086 que recebe um valor de DS diferente do segmento de dados padrão e/ou recebe um argumento em ES.
Estas funções copiam os valores dos registradores de inregs para os registradores antes da execução da interrupção do software. A função int86x também copia os valores de segregs->ds e segregs->es nos registradores correspondentes antes de executar a interrupção do software. Esse recurso permite que programas que usam ponteiros far ou um modelo de memória de dados grande especifiquem qual segmento deve ser usado para a interrupção de software.
As funções copiam os valores do registrador atual para outregs, o status do carry flag para o campo x.cflag em outregs e o valor do registrador 8086 flags para o campo x.flags em outregs, após o retorno da interrupção do software. A função int86x também restaura o DS e configura os campos segregs->es e segregs->ds para os valores dos registradores de segmento correspondentes.
Em ambas as funções, inregs e outregs podem apontar para a mesma estrutura e ambas as funções retornam o valor de AX após a conclusão da interrupção do software. Se o sinalizador de transporte estiver definido, geralmente indica que ocorreu um erro.
Os elementos de união REGS usados em C, equivalentes à linguagem Assembly, estão na tabela a seguir:
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 |
|
|
Vejamos os exemplos das funções int86 e int86x. O programa a seguir verifica cada setor do disquete e imprime o status de cada setor na tela.
/* Programa para verificar todos os setores do disquete e imprimir o status */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
/// Inicializando o Disco Reiniciando o 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");
/* Digitalize o disquete de 0 a 79 faixas (total de 80 faixas) */
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);
//// Imprime o status do setor digitalizado \\\\
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();
}
O programa mostra o exemplo de uso das funções int86 e funções int86x. Neste Programa a função int86 é inicializar o disco resetando o sistema de disco, usando a função 00H de INT 13H. A função int86x está verificando cada setor do disquete (disquete de 1.44Mb, 3½) de ambos os lados, até 0 a 79 trilhas (total de 80 trilhas) usando a função 04H de INT 13H.
Função segregad
Esta função foi definida em dos.h. Esta função lê os registradores de segmento. A declaração da função é a seguinte:
void segread(struct SREGS *segp);
onde segred coloca os valores atuais dos registradores de segmento na estrutura *segp. Nada é retornado pela função e a chamada destina-se ao uso com intdosx e int86x. Vejamos um exemplo
#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();
}
E a saída do programa será algo assim:
Current segment register settings
CS: EED DS: 10BA
ES: 10BA SS: 10BA
Funções intdos e intdosx
Estas funções foram definidas em dos.h. Estas são as interfaces gerais de interrupção do DOS. A função intdos invoca os registros de serviço do MS-DOS e, em seguida, DX e AL, onde a função intdosx invoca o serviço do MS-DOS com valores de registro de segmento.
A declaração da função intdos é a seguinte:
int intdos(union REGS *inregs, union REGS *outregs);
e a declaração da função intdosx é como:
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
As funções intdos e intdosx executam a interrupção DOS 0x21 para invocar uma função DOS especificada. O valor de inregs->h.ah especifica a função DOS a ser invocada. A função intdosx também copia os valores segregs ->ds e segregs ->es nos registradores correspondentes antes de invocar a função DOS e então restaura o DS.
Este recurso das funções permite que os programas que usam ponteiros far ou um modelo de memória de dados grande especifiquem qual segmento deve ser usado para a execução da função. Com a função intdosx você pode invocar uma função DOS que recebe um valor de DS diferente do segmento de dados padrão e/ou recebe um argumento em ES.
Ambas as funções retornam o valor de AX após a conclusão da chamada da função DOS e se o sinalizador de transporte estiver definido (outregs -> x.cflag != 0), isso indica que ocorreu um erro.
Após a interrupção 0x21 retorna as funções copiam os valores do registrador atual para outregs, status do carry flag para o campo x.cflag em outregs e valor do registrador 8086 flags para o campo x.flags em outregs. Tanto os inregs quanto os outregs podem apontar para a mesma estrutura. Vejamos os exemplos dessas funções.
O exemplo do uso da função indos foi dado abaixo. Este programa obtém as informações selecionadas sobre a unidade de disquete (disquete de 1.44Mb, 3½ polegada). Este programa fornece as informações de alocação de um disquete.
/* Obter informações de alocação de unidade para uso de 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();
}
E a saída do programa será assim:
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
Agora vamos ver um exemplo da função indosx. O exemplo a seguir mostra o uso da função intdosx. O programa emite uma string para a saída padrão.
/* O programa para produzir 'string' para o padrão
saída. */
#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();
}
E a saída do programa será a seguinte:
this string is not in the default data segment |
Aqui estamos imprimindo a string dada com a função intdosx, pela função 09H de INT 21H. Deve-se sempre ter em mente que a string dada sempre deve terminar com o caractere “$”.
Como saber o número do disco rígido físico
O número do disco rígido físico é uma coisa muito importante e deve ser escrito exatamente. A especificação de unidade ilegal pode causar uma grande perda de dados. Devemos ter certeza sobre o número da unidade durante a recuperação de dados ou programação de solução de problemas de disco. Como saber o número da unidade de qualquer disco com diferentes arranjos de discos pode ser estimado pelos exemplos dados a seguir.
De acordo com um mito generalizado, os números de unidade física são fornecidos de acordo com o status de anexo do disco, no entanto, em alguns casos especiais, pode depender do procedimento de inicialização do seu sistema operacional ou configurações de inicialização.
A ideia mais generalizada para o Número da unidade física fornecida pelo BIOS foi dada aqui, mas mesmo assim você deve confirmar com a ajuda de qualquer ferramenta de edição de disco ou com os programas fornecidos nos próximos capítulos, sobre a configuração do disco. Depois de ter certeza, você deve tomar qualquer decisão sobre a execução de tais programas que possam corromper ou danificar os dados, se usados ilegalmente ou por falta de conhecimento.
Geralmente, se os dois discos estiverem conectados ao sistema, um é o mestre primário e o outro é o mestre secundário, a primeira preferência será dada ao mestre primário (e depois ao escravo primário se disponível) e depois ao mestre secundário ( e depois para escravo secundário se disponível e assim por diante) e o número físico será dado de acordo com suas preferências.
Vamos supor que seu sistema suporte no máximo quatro discos rígidos por vez. Os quatro discos rígidos podem ser conectados conforme indicado Próximo:
Primary Master |
Primary Slave |
Secondary Master |
Secondary Slave |
Agora vamos considerar alguns casos para o número de unidades físicas. Aqui, suponho que você conectou os discos com as configurações de jumper adequadas, conforme mencionado pelo fabricante do disco, e nas configurações Master–Slave adequadas:
- Se todos os quatro discos rígidos estiverem conectados ao sistema: se todos os quatro discos estiverem conectados ao sistema, os números das unidades físicas serão os seguintes:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 83H. In this case the Hard Disk is called the Fourth Hard Disk. |
- Se três Discos Rígidos estiverem conectados ao sistema: se três Discos Rígidos estiverem conectados ao sistema, os números das unidades físicas serão de acordo com suas preferências de conexão. Os exemplos a seguir representam alguns dos arranjos:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk Not Present |
------------------- |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk Not Present |
------------------- |
Primary Slave |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
- Se dois Discos Rígidos estiverem conectados ao sistema: Da mesma forma, se dois Discos Rígidos estiverem conectados ao sistema, os números das unidades físicas estarão de acordo com suas preferências de conexão. O exemplo a seguir ilustra isso:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
- Se o Disco Rígido Único estiver conectado ao sistema: Não precisa pensar, se houver apenas um disco disponível, o número da unidade física será 80H.
Interromper 13H (INT 13H), funções de driver de disco ROM BIOS
A descrição das funções INT 13H foi dada aqui. Essas funções devem ser aprendidas com cuidado, pois o mau uso dessas funções ou uso com falta de cuidado ou falta de conhecimento, pode causar grande perda de dados ou muitos outros problemas. No entanto, se usadas de maneira apropriada e adequada, essas funções ajudam a minimizar a codificação do seu programa e a tornar sua programação simples e fácil.
INT 13H (0x13)
Função 00H (0x00) Redefinir sistema de disco
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
Comentários:
Redefina o controlador de disco, recalibra suas unidades conectadas. O braço de leitura/gravação é movido para o cilindro 0 e se prepara para a E/S do disco.
Esta função deve ser chamada após uma solicitação de leitura, gravação, verificação ou formatação de disquete com falha antes de tentar novamente a operação. Se a função for chamada com uma unidade de disco fixo (ou seja, selecionando DL>=80H), o controlador de disquete e, em seguida, o controlador de disco fixo são redefinidos.
INT 13H (0x13)
Função 01H (0x01) Obtenha o status do sistema de disco
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).
Comentários:
Retorna o status da operação de disco mais recente
INT 13H (0x13)
Função 02H (0x02) Ler setor
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 = segmento: deslocamento do buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Comentários:
Esta função lê um ou mais setores do disco para a memória. Em discos fixos, os 2 bits superiores do número do cilindro de 10 bits são colocados nos 2 bits superiores do registro CL.
INT 13H (0x13)
Função 03H (0x03) Setor de gravação
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
Comentários:
Esta função grava um ou mais setores da memória para o disco. Em discos fixos, os 2 bits superiores do número do cilindro de 10 bits são colocados nos 2 bits superiores do registrador CL.
INT 13H (0x13)
Função 04H (0x04) >> Verificar setor
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
Comentários:
Esta função verifica os campos de endereço de um ou mais setores. Nenhum dado é transferido para ou da memória por esta operação. Em discos fixos, os 2 bits superiores do número do cilindro de 10 bits são colocados nos 2 bits superiores do registro CL.
Esta função pode ser usada para testar se uma mídia legível está em uma unidade de disquete. O programa solicitante deve reinicializar o sistema de disquetes (INT 13H Função 00H) e repetir a operação três vezes antes de assumir que um disquete legível não está presente. É recomendado na maioria das operações de inicialização do disquete.
INT 13H (0x13)
Função 05H (0x05) >> Formatar faixa
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)
Comentários:
Inicialize o setor de disco e os campos de endereço das trilhas na trilha especificada. Em disquetes, a lista de campos de endereço consiste em uma série de entradas de 4 bytes, uma entrada por setor. O formato foi dado na tabela a seguir.
Em discos fixos, os 2 bits superiores do número do cilindro de 10 bits são colocados nos 2 bits superiores do registro CL.
Byte |
Contents |
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)
Função 06H (0x06) >> Formatar trilha inválida
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
Comentários:
Esta função é definida apenas para unidades de disco fixo PC/XT. Ele inicializa uma faixa, gravando campos de endereço de disco e setores de dados e configurando sinalizadores de setor defeituoso.
INT 13H (0x13)
Função 07H (0x07) >> Formatar unidade
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)
Comentários:
Esta função é definida apenas para unidades de disco fixo PC/XT. Ele formata a unidade inteira, gravando campos de endereço de disco e setores de dados, começando no cilindro especificado.
INT 13H (0x13)
Função 08H (0x08) >> Obter parâmetros do inversor
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)
Value |
Description |
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
Comentários:
Esta função retorna vários parâmetros para o drive especificado. O valor retornado no registro DL reflete o número real de unidades físicas conectadas ao adaptador para a unidade solicitada.
INT 13H (0x13)
Função 09H (0x09) >> Inicializar as características do disco fixo
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
Comentários:
Esta função inicializa o controlador de disco fixo para operações de E/S subsequentes, usando os valores encontrados no(s) bloco(s) de parâmetro(s) do disco ROM BIOS. A função é suportada apenas em disco fixo. O formato do bloco de parâmetros para discos fixos PC e PC/XT é o seguinte:
Byte(s) |
Contents |
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 |
O formato do bloco de parâmetros para discos fixos PC/AT e PS/2 é o seguinte:
Byte(s) |
Contents |
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)
Função 0A H (0x0A ou 10) >> Leia o setor longo
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
Comentários:
Esta função lê um setor ou setores do disco para a memória junto com um código ECC (Error Correcting Code) de 4 bytes para cada setor. Ao contrário da função normal de leitura do setor (INT 13H (0x13) Função 02H), os erros de ECC não são corrigidos automaticamente. As transferências de vários setores são encerradas após qualquer setor com um erro de leitura.
Esta função é suportada apenas em discos fixos. Os 2 bits superiores do número do cilindro de 10 bits são colocados nos 2 bits superiores do registro CL.
INT 13H (0x13)
Função 0BH (0x0B ou 11) >> Escrever setor longo
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
Comentários:
Esta função grava um setor(es) da memória para o disco. O valor de dados de cada setor deve ser seguido por seu código ECC de 4 bytes. Os 2 bits superiores do número do cilindro de 10 bits são colocados nos 2 bits superiores do registrador CL. Esta função é suportada apenas em discos fixos.
INT 13H (0x13)
Função 0CH (0x0C ou 12) >> Procurar
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
Comentários:
Esta função posiciona as cabeças de leitura/gravação do disco no cilindro especificado sem transferir nenhum dado. Os 2 bits superiores do número do cilindro são colocados nos 2 bits superiores do registrador CL. Esta função é suportada apenas em discos fixos.
INT 13H (0x13)
Função 0DH (0x0D ou 13) >> Redefinir sistema de disco fixo
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)
Comentários:
Esta função redefine o controlador de disco fixo, recalibra as unidades conectadas, move o braço de leitura/gravação para o cilindro 0 e prepara a E/S de disco subsequente.
INT 13H (0x13)
Função 0EH (0x0E ou 14) >> Ler buffer do setor
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
Comentários:
Esta função transfere o conteúdo do buffer de setor interno do adaptador de disco fixo para a memória do sistema. Nenhum dado é lido da unidade de disco física.
INT 13H (0x13)
Função 0FH (0x0F ou 15) >> Gravar buffer de setor
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
Comentários:
Esta função transfere dados da memória do sistema para o buffer de setor interno do adaptador fixo. Nenhum dado é gravado na unidade de disco física. Esta função deve ser chamada para inicializar o conteúdo do buffer do setor antes de formatar a unidade com INT 13H Função 05H.
INT 13H (0x13)
Função 10H (0x10 ou 16) >> Obter status da unidade
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
Comentários:
Esta função testa se a unidade de disco fixo especificada está operacional e retorna o status da unidade. Esta função é suportada apenas em discos fixos.
INT 13H (0x13)
Função 11H (0x11 ou 17) >> Recalibrar a unidade
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
Comentários:
Esta função faz com que o adaptador de disco fixo se recalibre para a unidade especificada, posicionando o braço de leitura/gravação no cilindro 0 e retornando o status da unidade. Esta função é suportada apenas em discos fixos.
INT 13H (0x13)
Função 12H (0x12 ou 18) >> RAM do controlador
diagnóstico
Ligue com:AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Comentários:
Esta função faz com que o adaptador de disco fixo execute um teste de diagnóstico integrado em seu buffer de setor interno, indicando se o teste foi aprovado pelo status retornado.
INT 13H (0x13)
Função 13H (0x13 ou 19) >> Diagnóstico da unidade do controlador
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Comentários:
Esta função faz com que o adaptador fixo execute testes de diagnóstico internos da unidade conectada, indicando se o teste foi aprovado pelo status retornado.
INT 13H (0x13)
Função 14H (0x14 ou 20) >> Controlador interno
diagnóstico
Ligue com:AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comentários:
Esta função faz com que o adaptador de disco fixo execute um autoteste de diagnóstico integrado, indicando se o teste foi aprovado pelo status retornado.
INT 13H (0x13)
Função 15H (0x15 ou 21) >> Obter tipo de disco
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
Comentários:
Esta função retorna um código indicando o tipo de disquete ou disco fixo referenciado pelo código de unidade especificado.
INT 13H (0x13)
Função 16H (0x16 ou 22) >> Obter alteração de disco
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
Comentários:
Esta função retorna o status da linha de alteração, indicando se o disco na unidade pode ter sido substituído desde o último acesso ao disco. Se esta função retornar com o sinalizador de transporte definido, o disco não foi necessariamente alterado e a linha de alteração pode ser ativada simplesmente destravando e travando a porta do drive de disco sem remover o disquete.
INT 13H (0x13)
Função 17H (0x17 ou 23) >> Definir tipo de disco
Call with: AH = 17H
AL = floppy disk type code
Value |
Description |
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
Comentários:
Esta função seleciona um tipo de disquete para a unidade especificada.
INT 13H (0x13)
Função 18H (0x18 ou 24) >> Defina o tipo de mídia para o formato
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
Comentários:
Esta função seleciona as características de mídia para a unidade especificada, portanto, um disquete deve estar presente na unidade.
INT 13H (0x13)
Função 19H (0x19 ou 25) >> Estacionar cabeças
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
Comentários:
Esta função move o braço de leitura/gravação para uma trilha que não é usada para armazenamento de dados, para que os dados não sejam danificados quando a unidade for desligada.
INT 13H (0x13)
Função 1AH (0x1A ou 26) >> Formatar unidade ESDI
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) |
Significance (if set) |
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)
Comentários:
Esta função inicializa o setor de disco e rastreia os campos de endereço em uma unidade conectada ao adaptador de unidade de disco fixo ESDI.
A operação desta função é chamada de formato de baixo nível e prepara o disco para operações físicas de leitura/gravação no nível do setor. A unidade deve ser posteriormente particionada com o comando FDISK e, em seguida, receber um formato de alto nível com o comando FORMAT para instalar um sistema de arquivos.
Página modificada em: 12/01/2022