Capítulo – 8
Funções do Disk-BIOS e tratamento de interrupções usando C
Introdução
Neste capítulo, discutiremos os recursos importantes do Disk-BIOS e outros recursos importantes que nos dão a liberdade de usar e manipular interrupções em nosso programa C de um método simples e curto. Essas funções são a base da programação de recuperação de dados e solução de problemas de disco. Essas são as características que fazem da linguagem C uma "linguagem assembly de alto nível " .
Funções do biosdisk e _bios_disk
Essas duas funções são as mais importantes para nosso propósito de recuperação de dados e programação de solução de problemas de disco. Usaremos essas funções na maior parte do tempo.
Essas duas funções são serviços de unidade de disco do BIOS e são definidas em bios.h, onde biosdisk opera abaixo do nível de arquivo em setores brutos. Se essas funções forem usadas mesmo com o menor descuido, elas podem destruir o conteúdo de arquivos e diretórios no seu disco rígido. As funções biosdisk e _bios_disk usam a interrupção 0x13 para passar operações de disco diretamente para o BIOS. A função _bios_disk é declarada no programa da seguinte forma:
unsigned _bios_disk(comando não assinado, struct diskinfo_t *dinfo);
E a declaração para a função de disco do BIOS se parece com isso:
int biosdisk(int cmd, int unidade, int cabeça, int trilha,
int setor, int nsects, void *buffer);
O significado desses parâmetros é descrito na tabela a seguir:
Parâmetro |
Função |
O que é ou o que faz |
comando |
Ambos |
Especifica a operação a ser executada, como leitura, escrita, verificação, etc. (Veja a descrição de cmd abaixo) |
informação |
_disco_bios |
Aponta para uma estrutura diskinfo_t contendo os parâmetros restantes necessários para a operação. (veja a descrição da estrutura diskinfo_t abaixo) |
dirigir um carro |
disco bios |
Especifica qual disco será usado (0 para a:, 1 para b: e 0x80 para o primeiro disco rígido físico, 0x81 para o segundo, etc.) |
setor de trajetória
da cabeça
|
disco bios |
Eles definem a localização do setor inicial a partir do qual a operação deve começar. |
insetos |
disco bios |
Número de setores para ler, escrever, verificar, etc. |
amortecedor |
disco bios |
O endereço de memória do qual os dados devem ser lidos ou gravados. |
Em ambas as funções, os dados são lidos e gravados em um buffer de 512 bytes por setor, que é o tamanho lógico do setor do disco rígido, e o valor de retorno de ambas as funções é o valor do registro AX definido pela chamada INT 0x13H do BIOS.
Se a função for bem-sucedida, o byte alto = 0, significando conclusão bem-sucedida, e o byte baixo contém o número de setores lidos, gravados ou verificados, etc.
Mas se ocorrer algum erro e a função não for executada com sucesso, o valor do byte alto corresponderá a um dos seguintes códigos de erro, que são descritos na tabela a seguir:
Valor |
Descrição |
0x00 |
Conclusão bem-sucedida (não é um erro!!) |
0x01 |
Time ruim |
0x02 |
Etiqueta de endereço não encontrada |
0x03 |
Tentando gravar em um disco protegido contra gravação |
0x04 |
Setor não encontrado |
0x05 |
Falha na reinicialização (disco rígido) |
0x06 |
O disco foi modificado desde a última operação. |
0x07 |
Falha ao executar a ação do parâmetro de unidade |
0x08 |
Estouro de acesso direto à memória (DMA) |
0x09 |
Tentativa de executar DMA em um limite de 64K (erro de limite de dados ou setores >80H) |
0x0A |
Setor defeituoso detectado |
0x0B |
Trilha ruim detectada |
0x0C |
Trilha não suportada |
0x0D |
Número incorreto de setores ao formatar (disco rígido PS/2) |
0x0E |
Marca de endereço de dados de controle detectada (disco rígido) |
0x0F |
Nível de arbitragem DMA fora do intervalo (disco rígido) |
0x10 |
CRC/ECC incorreto ao ler o disco |
0x11 |
Erro de correção de dados CRC/ECC (não é realmente um erro) |
0x20 |
O controlador está com defeito |
0x31 |
Não há mídia na unidade (extensões IBM/MS INT 13) |
0x32 |
Tipo de disco incorreto armazenado no CMOS (Compaq) |
0x40 |
A operação de busca falhou. |
0x80 |
O anexo não respondeu |
0xAA |
Disco não pronto (somente disco rígido) |
0xB0 |
O volume não está bloqueado no disco (extensões INT 13) |
0xB1 |
Volume bloqueado no disco (extensões INT 13) |
0xB2 |
Volume não removível (extensões INT 13) |
0xB3 |
Volume de uso (INT 13 extensões) |
0xB4 |
Número excedido de bloqueios (extensões INT 13) |
0xB5 |
Falha ao executar uma solicitação de lançamento válida (extensões INT 13) |
0xBB |
Ocorreu um erro não especificado (somente disco rígido) |
0xCC |
Ocorreu um erro de gravação |
0xE0 |
Erro de registro de status |
0xFF |
A Operação Sense falhou |
A tabela abaixo apresenta os comandos de operação a serem executados pelo parâmetro cmd. Primeiro, veremos as operações gerais de ambas as funções.
disco bios |
_disco_bios |
O que ele está fazendo? |
0 |
_REINICIALIZAÇÃO_DE_DISCO |
Reinicia o sistema de disco, forçando o controlador da unidade a fazer uma reinicialização forçada. Ignore todos os outros parâmetros |
1 |
_STATUS_DO_DISCO |
Retorna o status da última operação do disco. Ignora todos os outros parâmetros |
2 |
_DISCO_LEITURA |
Lê um ou mais setores do disco na memória |
3 |
_GRAVAÇÃO_DE_DISCO |
Grava um ou mais setores do disco da memória |
4 |
_VERIFICAÇÃO_DE_DISCO |
Verifica um ou mais setores |
5 |
_FORMATO_DE_DISCO |
Formata uma faixa |
Embora você esteja 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 tenham o mesmo efeito, é recomendável que você tenha o hábito de usar opções de palavras como cmd = _DISK_FORMAT em vez de cmd = 5, pois isso pode ajudar 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 cmd = _DISK_RESET, a função reinicializa 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:
Parâmetro |
O que ele faz |
setor
de trilha principal
|
Esses três especificam a localização do setor inicial para a operação especificada. (os valores mínimos possíveis podem ser head = 0, track = 0 e sector = 1) |
nsetores |
Isso especifica o número de setores para ler ou escrever |
amortecedor |
Ele aponta para o buffer onde os dados devem ser lidos e gravados |
Se o valor de cmd for = 5 (_DISK_FORMAT), biosdisk e _bios_disk usam 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. Falta de conhecimento ou até mesmo um pequeno erro pode fazer com que você enfrente uma grande perda de dados.
Parâmetro |
O que ele faz |
trilha da cabeça |
Eles especificam a localização da trilha a ser formatada |
amortecedor |
Ele aponta para uma tabela de cabeçalhos de setor a serem escritos na trilha nomeada |
Existem alguns valores adicionais de cmd que são usados somente por funções do biosdisk. Esses valores de cmd são permitidos somente para XT, AT, PS/2 e compatíveis. Os valores foram descritos na tabela dada a seguir:
comando |
O que ele faz |
6 |
Formata uma trilha e define sinalizadores de setores defeituosos |
7 |
Formata a unidade começando em uma trilha específica |
8 |
Retorna os parâmetros atuais da unidade nos primeiros 4 bytes do buffer |
9 |
Inicializa as características do par de acionamento |
10 |
Faz uma leitura longa (512 mais 4 bytes extras por setor) |
11 |
Faz uma gravação longa (512 mais 4 bytes extras por setor) |
12 |
Um disco busca |
13 |
Alterna a reinicialização do disco |
14 |
Lê buffer de setor |
15 |
Escreve buffer de setor |
16 |
Testa se a unidade nomeada está pronta |
17 |
Recalibra a unidade |
18 |
Diagnóstico de RAM do controlador |
19 |
Diagnóstico de acionamento |
20 |
Diagnóstico interno do controlador |
Estrutura diskinfo_t
A estrutura diskinfo_t é usada pela função _bios_disk. A descrição da estrutura é a seguinte:
estrutura diskinfo_t {
unidade não assinada, cabeça, trilha, setor, nsetores;
vazio longe *buffer;
};
Onde drive especifica a unidade de disco que será usada. Lembre-se sempre de que, para os discos rígidos, a unidade física é especificada, não a partição do disco. Se você quiser operar partições, o programa aplicativo também deve interpretar as informações da tabela de partição desse disco em si.
O valor de head, track e sector especificam a localização do setor inicial para a operação. nsectors especifica o número de setores a serem lidos ou gravados e 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 da unidade de disco a ser usada nas funções biosdisk e _bios_disk foi fornecido na tabela a seguir:
Valor de condução |
Unidade de disco a ser usada |
0 |
Primeira unidade de disquete |
1 |
Segunda unidade de disquete |
2 |
Terceira unidade de disquete |
.... |
(e assim por diante) |
0x80 |
Primeiro disco rígido |
0x81 |
Segundo disco rígido |
0x82 |
Terceiro disco rígido |
.... |
(e assim por diante) |
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ê apagou os arquivos do seu disco porque o programa está lendo diretamente a superfície do disco.
Para ver os dados deletados, é um ideal melhor que você pegue um disquete totalmente formatado e copie alguns arquivos de texto, como a codificação dos seus programas .c ou outros arquivos de texto (para que você possa entender o conteúdo dos arquivos) ocupando aproximadamente 73 KB (dados armazenados em quatro trilhas, dois lados e 18 setores em cada trilha. Cada setor tem 512 bytes). O programa foi desenvolvido para demonstrar o exemplo. No entanto, você pode alterá-lo e desenvolvê-lo para ficar pronto para recuperar dados.
/* Programa para ler 4 trilhas (0, 1, 2 e 3) de um disquete e gravar o conteúdo no arquivo especificado */
#incluir <bios.h>
#incluir <stdio.h>
#incluir<conio.h>
vazio principal(vazio)
{
int cabeça,trilha;
int resultado,i,setor;
char nomedoarquivo[80];
char *buffer;
estrutura diskinfo_t dinfo;
char estático dbuf[512];
ARQUIVO *tt;
clrscr();
/// Verifique se a unidade está pronta ou não \\\
se(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf("Unidade A: Não pronta:\n Insira o disco na unidade A:
e pressione qualquer tecla\n");
obter();
}
/* Obter o nome do arquivo para armazenar os dados dos Setores do disco */
printf("\nDigite o nome do arquivo de destino com o caminho completo
para armazenar os dados \n\n >");
obtém(nome do arquivo);
if((tt= fopen(nome do arquivo, "wb"))==NULL)
{
printf("Não foi possível abrir o arquivo!!!");
obter();
}
para(trilha=0;trilha<4;trilha++)
{
para(cabeça=0; cabeça<=1;cabeça++)
{
para(setor=1;setor<=18;setor++)
{
dinfo.drive = 0; /* número da unidade para A: */
dinfo.head = head; /* número da cabeça do disco */
dinfo.track = track; /* número da faixa */
dinfo.sector = setor; /* número do setor */
dinfo.nsectors = 1; /* contagem de setores */
dinfo.buffer = dbuf; /* buffer de dados */
/// Mostrar o status \\\
gotoxy(10,10); printf("Lendo dados de: Head=%d
Trilha=%d Setor=%d",
cabeça, trilha, setor);
fprintf(tt,"\n Dados lidos de: Cabeçalho=%d Trilha=%d Setor=%d\n",
cabeça, trilha, setor);
/// Leia os setores especificados \\\
resultado = _bios_disk(_DISK_READ, &dinfo);
/// Armazena o conteúdo no arquivo especificado \\\
se ((resultado & 0xff00) == 0)
{
para(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 */
outro
{
printf("\n Não é possível ler em Head= %d Track= %d
Setor= %d\n",cabeçalho,trilha,setor);
fprintf(tt,"\n Não é possível ler em Head= %d Track= %d
Setor =%d\n",cabeçalho,trilha,setor);
}
}
}
}
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 se a marca de endereço foi 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
Essas funções foram definidas em Dos.h . A função absread lê setores absolutos do disco e a função abswrite grava setores absolutos do disco. A função absread usa a interrupção DOS 0x25 para ler setores específicos do disco e a função abswrite usa a interrupção DOS 0x26 para gravar setores específicos do disco.
As operações de leitura ou gravação absolutas ocorrem de maneira sequencial, incrementando setores passo a passo e são completamente livres de números de cabeça e trilha, etc. É função do BIOS do computador traduzir os setores absolutos para os respectivos números de trilha, cabeça e setor.
Operações absolutas de leitura e gravação são recomendadas em programas nos quais vamos executar operações de leitura/gravação em todo o disco e queremos evitar codificação e loops extras em nosso programa para aumentar a velocidade do programa ao máximo.
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 realizam diretamente operações de leitura e gravação absolutas na superfície do disco. Essa é a razão pela qual, se usado incorretamente, abswrite pode sobrescrever arquivos, diretórios e FATs.
A declaração da função absread é a seguinte:
int absread(int unidade, int nsects, long lsect,
vazio *buffer);
e a função abswrite é declarada da seguinte forma:
int abswrite(int unidade, int nsects, long lsect,
vazio *buffer);
Onde o significado dos parâmetros é o seguinte:
Parâmetro. |
O que é/faz |
dirigir |
Número da unidade a ser lida (ou gravada): 0 = A, 1 = B, etc. |
insetos |
Número de setores para ler (ou escrever) |
lseção |
Número do setor lógico inicial |
amortecedor |
Endereço de memória onde os dados devem ser lidos (ou gravados) |
Em caso de sucesso, ambas as funções retornam 0. Quando há algum erro, ambas retornam -1 e definem o número do erro como o valor do registrador AX retornado pela chamada do sistema.
O número de setores para operação de leitura ou gravação é limitado a 64K ou ao tamanho do buffer, o que for menor. No entanto, aprenderemos o uso de memória enorme nos próximos capítulos para exceder o limite de memória de 64K, para desenvolver um programa muito rápido.
|
Tratamento de interrupções com C
C é algumas vezes chamada 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: invoca interrupção do MS-DOS com valores de registro de segmento.
- intdos: invoca o serviço MS-DOS usando registradores diferentes de DX e AL
- intdosx: invoca o serviço MS-DOS com valores de registro de segmento.
- segread: Lê registradores de segmento
Discutiremos essas funções em detalhes. Primeiro, discutiremos 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:
estrutura SREGS {
inteiros não assinados;
int cs não assinado;
int ss sem sinal;
int ds não assinado;
};
Sindicato REGS
REGS é a união de duas estruturas. A união REGS foi definida como 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:
união REGS {
estrutura WORDREGS x;
estrutura BYTEREGS h;
};
Estruturas BYTEREGS e WORDREGS
As estruturas BYTEREGES e WORDREGS foram definidas em dos.h e são usadas para armazenar registradores de byte e word. A estrutura WORGREGS permite que o usuário acesse 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:
estrutura BYTEREGS {
char sem sinal al, ah, bl, bh;
char não assinado cl, ch, dl, dh;
};
E a estrutura WORDREGS é declarada da seguinte forma:
estrutura WORDREGS {
int sem sinal ax, bx, cx, dx;
unsigned int sim, de, cflag, sinalizadores;
};
funções int86 e int86x
Essas funções são as interfaces gerais de interrupção de software 8086 definidas em dos.h. Os registradores 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, união REGS *inregs,
união REGS *outregs);
int86x é a variação da função int86. Ela é declarada como segue:
int int86x(int intno, união REGS *inregs,
união 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 a ES e DS e não a CS e SS, portanto, você pode invocar uma interrupção de software 8086 que aceita um valor de DS diferente do segmento de dados padrão e/ou aceita um argumento em ES.
Essas funções copiam valores de registradores de inregs para os registradores antes da execução da interrupção de software. A função int86x também copia os valores segregs->ds e segregs->es para os registradores correspondentes antes de executar a interrupção de 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 de registro atuais para outregs, o status do sinalizador de transporte para o campo x.cflag em outregs e o valor do registrador de sinalizadores 8086 para o campo x.flags em outregs, após o retorno da interrupção de software. A função int86x também restaura DS e define 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 carry estiver definido, geralmente indica que ocorreu um erro.
Os elementos da união REGS usados em C, equivalentes à linguagem Assembly, estão na tabela abaixo:
16 bits |
8 bits |
Linguagem C |
Linguagem de montagem |
Linguagem C |
Linguagem de montagem |
inregs.x.ax |
MACHADO |
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 |
E |
|
|
inregs.x.de |
DE |
|
|
inregs.x.cflag |
FC |
|
|
Vamos ver os exemplos das funções int86 e int86x. O programa a seguir escaneia cada setor do disquete e imprime o status de cada setor na tela.
/* Programa para escanear cada setor do disquete e imprimir o status */
#include<dos.h>
#incluir<conio.h>
vazio principal()
{
int cabeça,trilha,setor,i;
char *buf;
união REGS inregs, outregs;
estrutura SREGS sregs;
clrscr();
/// Inicializando o disco reiniciando o sistema de disco \\\
gotoxy(10,2); printf("Inicializando o disco...");
para(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Número da função
inregs.h.dl=0x00; // Disquete
int86(0x13,®s de entrada,®s de saída);
}
gotoxy(10,2); printf("O status do disco é como....\n");
/* Verifica o disquete de 0 a 79 faixas (total de faixas 80) */
para(trilha=0;trilha<=79;trilha++)
para(cabeça=0;cabeça<=1;cabeça++)
para(setor=1;setor<=18;setor++)
{
inregs.h.ah = 0x04; /// função Número
inregs.h.al = 1; /// Número de setores
inregs.h.dl = 0x00; /// Disquete
inregs.h.ch = trilha;
inregs.h.dh = cabeça;
inregs.h.cl = setor;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,®s de entrada,®s de saída,&sregs);
//// Imprima o status do setor escaneado \\\\
alternar(outregs.h.ah)
{
caso 0x00:
cprintf("STATUS: Nenhum erro !!");
quebrar;
caso 0x01:
cprintf("STATUS: Comando incorreto ");
quebrar;
caso 0x02:
cprintf("STATUS: Marca de endereço não encontrada ");
quebrar;
caso 0x03:
cprintf("STATUS: Tentativa de escrever para
disco protegido contra gravação ");
quebrar;
caso 0x04:
cprintf("STATUS: Setor não encontrado ");
quebrar;
caso 0x05:
cprintf("STATUS: Falha na reinicialização (disco rígido) ");
quebrar;
caso 0x06:
cprintf("STATUS: Disco alterado desde a última
operação ");
quebrar;
caso 0x07:
cprintf("STATUS: Atividade do parâmetro da unidade
fracassado") ;
quebrar;
caso 0x08:
cprintf("STATUS: Acesso direto à memória (DMA)
superação ");
quebrar;
caso 0x09:
cprintf("STATUS: Tentativa de executar DMA em
Limite de 64K ");
quebrar;
caso 0x0A:
cprintf("STATUS: Setor defeituoso detectado ");
quebrar;
caso 0x0B:
cprintf("STATUS: Trilha incorreta detectada ");
quebrar;
caso 0x0C:
cprintf("STATUS: Tipo de mídia não encontrado ");
quebrar;
caso 0x0D:
cprintf("STATUS: Número inválido de setores em
formato (disco rígido) ");
quebrar;
caso 0x0E:
cprintf("STATUS: Marca de endereço de dados de controle
detectado (disco rígido) ");
quebrar;
caso 0x0F:
cprintf("STATUS: Nível de arbitragem DMA fora de
intervalo (disco rígido) ");
quebrar;
caso 0x10:
cprintf("STATUS: CRC/ECC inválido na leitura do disco ");
quebrar;
caso 0x11:
cprintf("STATUS: CRC/ECC corrigiu erro de dados ");
quebrar;
caso 0x20:
cprintf("STATUS: O controlador falhou ");
quebrar;
caso 0x31:
cprintf("STATUS: Nenhuma mídia na unidade (IBM/MS INT 13H
extensões) ");
quebrar;
caso 0x32:
cprintf("STATUS: Tipo de unidade incorreto armazenado em
CMOS (Compaq) ");
quebrar;
caso 0x40:
cprintf("STATUS: Falha na operação de busca ");
quebrar;
caso 0x80:
cprintf("STATUS: O anexo falhou ao responder
(Tempo limite do disco esgotado) ");
quebrar;
caso 0xAA:
cprintf("STATUS: Unidade não pronta (disco rígido
apenas) ");
quebrar;
caso 0xB0:
cprintf("STATUS: Volume não bloqueado na unidade (INT
Extensões 13H) ");
quebrar;
caso 0xB1:
cprintf("STATUS: Volume bloqueado na unidade (INT 13H extensions) ");
quebrar;
caso 0xB2:
cprintf("STATUS: Volume não removível (INT 13H
extensões) ");
quebrar;
caso 0xB3:
cprintf("STATUS: Volume em uso (INT 13H
extensões) ");
quebrar;
caso 0xB4:
cprintf("STATUS: Contagem de bloqueios excedida (INT 13H
extensões) ");
quebrar;
caso 0xB5:
cprintf("STATUS: Falha na solicitação de ejeção válida (INT
Extensões 13H) ");
quebrar;
caso 0xBB:
cprintf("STATUS: Ocorreu um erro indefinido (dificuldade
somente disco) ");
quebrar;
caso 0xCC:
cprintf("STATUS: Ocorreu uma falha de gravação ");
quebrar;
caso 0xE0:
cprintf("STATUS: Erro de registro de status ");
quebrar;
caso 0xFF:
cprintf("STATUS: Falha na operação de detecção ");
quebrar;
padrão: cprintf("STATUS: CÓDIGO de status DESCONHECIDO ");
}
printf("\nPosição atual= Trilha:%d Cabeçalho:%d Setor:%d \n",
trilha,cabeça,setor);
}
gotoxy(10,24);printf("Digitalização concluída!! Pressione qualquer tecla PARA
Saída..");
obter();
}
O programa mostra o exemplo de uso das funções int86 e int86x. Neste programa, a função int86 está inicializando o disco reiniciando o sistema de disco, usando a função 00H do INT 13H. A função int86x está verificando cada setor do disquete (1,44 Mb, 3½ disquete) de ambos os lados, até 0 a 79 trilhas (total de 80 trilhas) usando a função 04H do INT 13H.
Função segregada
Esta função foi definida em dos.h. Esta função lê os registradores de segmento. A declaração da função é a seguinte:
vazio segread(struct SREGS *segp);
onde segread coloca os valores atuais dos registradores de segmento na estrutura *segp. Nada é retornado pela função e a chamada é destinada ao uso com intdosx e int86x. vamos ver um exemplo
#incluir <stdio.h>
#include <dos.h>
vazio principal()
{
estrutura SREGS segmentos;
segmentar(&segs);
printf("Configurações do registro do segmento atual\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
obter();
}
E a saída do programa será algo como isto:
Configurações atuais do registro de segmento
CS: EED DS: 10BA
ES: 10BA SS: 10BA
Funções intdos e intdosx
Essas funções foram definidas em dos.h. Essas são as interfaces gerais de interrupção DOS. A função intdos invoca os registradores de serviço MS-DOS, então DX e AL, onde a função intdosx invoca o serviço MS-DOS com valores de registradores de segmento.
A declaração da função intdos é a seguinte:
int intdos(união REGS *inregs, união REGS *outregs);
e a declaração da função intdosx é como:
int intdosx(união REGS *regs de entrada, união REGS *regs de saída,
estrutura 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 para os registradores correspondentes antes de invocar a função DOS e então restaura DS.
Esse recurso das funções permite que os programas que usam ponteiros distantes 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 retornar, as funções copiam os valores de registro atuais para outregs, o status do sinalizador de transporte para o campo x.cflag em outregs e o valor do registro de sinalizadores 8086 para o campo x.flags em outregs. Tanto inregs quanto outregs podem apontar para a mesma estrutura. Vamos ver os exemplos dessas funções.
O exemplo do uso da função intdos foi dado abaixo. Este programa obtém as informações selecionadas sobre a unidade de disquete (1,44 Mb, disquete de 3½ polegadas). Este programa fornece as informações de alocação de um disquete.
/* Obter informações de alocação de unidade para uso do disco */
#include <dos.h> /* para intdos() e união REGS */
#include <stdio.h> /* para printf() */
união REGS inregs, outregs;
vazio principal()
{
inregs.h.ah = 0x36; /* obter espaço livre em disco
número da função */
inregs.h.dl = 0x01; /* unidade A: */
intdos(®s de entrada, ®s de saída);
printf("%d setores/cluster,\n%d clusters,\n%d bytes/setor,
\n%d grupos totais",
outregs.x.ax,outregs.x.bx,
outregs.x.cx, outregs.x.dx);
obter();
}
E a saída do programa será assim:
1 setores/cluster,
Aglomerados de 1933,
512 bytes/setor,
2843 aglomerados totais
Agora, vejamos um exemplo da função intdosx . 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 emitir 'string' para a saída padrão. */
#include <dos.h>
união REGS inregs, outregs;
struct SREGS segrega;
char far *string = "esta string não está no
segmento de dados padrão$";
vazio principal()
{
inregs.h.ah = 0x09; /* número da função */
inregs.x.dx = FP_OFF(string);/*DS:DX está longe
endereço de 'string */
segregs.ds = FP_SEG(string);
intdosx(®s de entrada, ®s de saída, &segregs);
obter();
}
E a saída do programa será a seguinte:
esta string não está no segmento de dados padrão |
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 deve sempre terminar com o caractere “$”.
Como saber o número do disco rígido físico
O número do disco rígido físico é algo muito importante e deve ser escrito de forma exata. A especificação ilegal do disco pode causar uma grande perda de dados. Devemos estar confiantes sobre o número do disco durante a recuperação de dados ou a programação de solução de problemas de disco. Como saber o número do disco de qualquer disco com diferentes arranjos de discos pode ser estimado pelos exemplos fornecidos a seguir.
De acordo com o mito mais generalizado, os números das unidades físicas são fornecidos de acordo com o status de conexão do disco, porém, em alguns casos especiais, isso pode depender do procedimento de inicialização ou das configurações de inicialização do seu sistema operacional.
A ideia mais generalizada para o número de unidade física fornecido 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 executar tais programas que podem corromper ou danificar os dados, se usados ilegalmente ou por falta de conhecimento.
Geralmente, se 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 ao 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 o máximo de quatro discos rígidos por vez. Todos os quatro discos rígidos podem ser conectados conforme fornecido a seguir:
Mestre Primário |
Escravo Primário |
Mestre Secundário |
Escravo Secundário |
Agora, vamos considerar alguns casos para número de drives de drives físicos. Aqui, presumo 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:
Primário/Secundário (Mestre/Escravo) |
Status |
Número e descrição da unidade física |
Mestre Primário |
O disco está presente |
O número da unidade física será 80H. Neste caso, o disco rígido é chamado de Primeiro Disco Rígido . |
Escravo Primário |
O disco está presente |
O número da unidade física será 81H. Neste caso, o disco rígido é chamado de Segundo Disco Rígido . |
Mestre Secundário |
O disco está presente |
O número da unidade física será 82H. Neste caso, o disco rígido é chamado de Terceiro Disco Rígido . |
Escravo Secundário |
O disco está presente |
O número da unidade física será 83H. Neste caso, o disco rígido é chamado de Quarto Disco Rígido . |
- Se três Discos Rígidos estiverem conectados ao sistema: se três Discos Rígidos estiverem conectados ao sistema, os números de unidades físicas serão de acordo com suas preferências de conexão. Os exemplos a seguir representam alguns dos arranjos:
Primário/Secundário (Mestre/Escravo) |
Status |
Número e descrição da unidade física |
Mestre Primário |
O disco está presente |
O número da unidade física será 80H. Neste caso, o disco rígido é chamado de Primeiro Disco Rígido . |
Escravo Primário |
O disco está presente |
O número da unidade física será 81H. Neste caso, o disco rígido é chamado de Segundo Disco Rígido . |
Mestre Secundário |
O disco está presente |
O número da unidade física será 82H. Neste caso, o disco rígido é chamado de Terceiro Disco Rígido . |
Escravo Secundário |
Disco não presente |
------------------- |
Primário/Secundário (Mestre/Escravo) |
Status |
Número e descrição da unidade física |
Mestre Primário |
Disco não presente |
------------------- |
Escravo Primário |
O disco está presente |
O número da unidade física será 80H. Neste caso, o disco rígido é chamado de Primeiro Disco Rígido . |
Mestre Secundário |
O disco está presente |
O número da unidade física será 81H. Neste caso, o disco rígido é chamado de Segundo Disco Rígido . |
Escravo Secundário |
O disco está presente |
O número da unidade física será 82H. Neste caso, o disco rígido é chamado de Terceiro Disco Rígido . |
Primário/Secundário (Mestre/Escravo) |
Status |
Número e descrição da unidade física |
Mestre Primário |
O disco está presente |
O número da unidade física será 80H. Neste caso, o disco rígido é chamado de Primeiro Disco Rígido . |
Escravo Primário |
Disco não presente |
------------------- |
Mestre Secundário |
O disco está presente |
O número da unidade física será 81H. Neste caso, o disco rígido é chamado de Segundo Disco Rígido . |
Escravo Secundário |
O disco está presente |
O número da unidade física será 82H. Neste caso, o disco rígido é chamado de Terceiro Disco Rígido . |
Primário/Secundário (Mestre/Escravo) |
Status |
Número e descrição da unidade física |
Mestre Primário |
O disco está presente |
O número da unidade física será 80H. Neste caso, o disco rígido é chamado de Primeiro Disco Rígido . |
Escravo Primário |
O disco está presente |
O número da unidade física será 81H. Neste caso, o disco rígido é chamado de Segundo Disco Rígido . |
Mestre Secundário |
Disco não presente |
------------------- |
Escravo Secundário |
O disco está presente |
O número da unidade física será 82H. Neste caso, o disco rígido é chamado de Terceiro Disco Rígido . |
- Se dois Discos Rígidos estiverem conectados ao sistema: Similarmente, se dois Discos Rígidos estiverem conectados ao sistema, os números de unidades físicas serão de acordo com suas preferências de conexão. O exemplo a seguir ilustra isso:
Primário/Secundário (Mestre/Escravo) |
Status |
Número e descrição da unidade física |
Mestre Primário |
O disco está presente |
O número da unidade física será 80H. Neste caso, o disco rígido é chamado de Primeiro Disco Rígido . |
Escravo Primário |
Disco não presente |
------------------- |
Mestre Secundário |
Disco não presente |
------------------- |
Escravo Secundário |
O disco está presente |
O número da unidade física será 81H. Neste caso, o disco rígido é chamado de Segundo Disco Rígido . |
- Se um único disco rígido estiver conectado ao sistema: Não precisa pensar, se houver apenas um disco disponível, o número da unidade física será 80H.
Interrupção 13H (INT 13H), funções do 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 uso indevido dessas funções ou uso sem cuidado ou sem conhecimento pode causar grande perda de dados ou muitos outros problemas. No entanto, se usadas de forma 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, bem como.
INT 13H (0x13)
Função 00H (0x00) Reinicializar sistema de disco
Chamada com AH = 00H
DL = dirigir
Disquete 00H-7FH
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
Comentários:
Reinicia o controlador de disco, recalibra suas unidades anexadas. 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 falha na solicitação de Leitura, gravação, Verificação ou Formatação de disquete antes de tentar a operação novamente. Se a função for chamada com uma unidade de disco fixa (por exemplo, selecionando DL>=80H), o controlador de disquete e, em seguida, o controlador de disco fixo serão reiniciados.
INT 13H (0x13)
Função 01H (0x01) Obter status do sistema de disco
Chamada com: AH = 01H
DL = dirigir
Disquete 00H-7FH
Disco fixo 80H-FFH
Retorna: AH = 00H
AL = status da operação anterior do disco
(Veja a tabela fornecida anteriormente para erro
e descrição dos códigos de status).
Comentários:
Retorna o status da operação de disco mais recente
INT 13H (0x13)
Função 02H (0x02) Ler setor
Chamada com: AH = 02H
AL = número de setores
CH = cilindro
CL = setor
DH = cabeça
DL = dirigir
Disquete 00H-7FH
Disco fixo 80H-FFH
ES:BX = segmento: deslocamento do buffer
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
AL = número de setores transferidos
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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 registrador CL.
INT 13H (0x13)
Função 03H (0x03) Escrever setor
Chamada com: AH = 03H
AL = número de setores
CH = cilindro
CL = setor
DH = cabeça
DL = dirigir
Disquete 00H-7FH
Disco fixo 80H-FFH
ES: BX = segmento: deslocamento do buffer
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
AL = número de setores transferidos
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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
Chamada com: AH = 04H
AL = número de setores
CH = cilindro
CL = setor
DH = dirigir
Disquete 00H-7FH
Acionamento fixo 80H-FFH
ES: BX = segmento: deslocamento do buffer
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
AL = número de setores verificados
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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 substituídos nos 2 bits superiores do registrador 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 disquete (INT 13H Função 00H) e tentar 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 de disquete.
INT 13H (0x13)
Função 05H (0x05) >> Formatar trilha
Chamada com: AH = 05H
AL = intercalar (discos fixos PC/XT)
CH = cilindro
DH = cabeça
DL = dirigir
Disquete 00H-7FH
Disco fixo 80H-FFH
ES: BX = segmento: deslocamento da lista de campos de endereço
(Exceto disco fixo PC/XT)
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = status (veja a tabela de status fornecida
mais cedo)
Comentários:
Inicializa o setor do disco e rastreia campos de endereço 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 registrador CL.
Byte |
Conteúdo |
0 |
Cilindro |
1 |
Cabeça |
2 |
Setor |
3
|
Código de tamanho de setor
Valor |
Descrição |
00H |
128 Byte por setor |
01H |
256 Bytes por setor |
02H |
512 Bytes por setor |
03H |
1024 Byte por setor |
|
INT 13H (0x13)
Função 06H (0x06) >> Formatar trilha ruim
Chamada com: AH = 06H
AL = intercalar
CH = cilindro
DH = cabeça
DL = dirigir
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função é definida somente para drives de disco fixo PC/XT. Ela inicializa uma trilha, gravando campos de endereço de disco e setores de dados e configurando flags de setores ruins.
INT 13H (0x13)
Função 07H (0x07) >> Formatar unidade
Chamada com: AH = 07H
AL = intercalar
CH = cilindro
DL = dirigir
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = status (veja a tabela de status fornecida
mais cedo)
Comentários:
Esta função é definida somente para drives de disco fixo PC/XT. Ela formata o drive inteiro, 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 de acionamento
Chamada com: AH = 08H
DL = dirigir
Disquete 00H-7FH
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
BL = tipo de unidade (disquete PC/AT e PS/2
disco)
Valor |
Descrição |
01H |
360 KB, 40 trilhas, 5,25” |
02H |
1,2 MB, 80 trilhas, 5,25” |
03H |
720 KB, 80 trilhas, 3,5” |
04H |
1,44 MB, 80 trilhas, 3,5” |
CH = 8 bits baixos do cilindro máximo
número
CL = bits 6-7 de ordem superior 2 bits de máximo
bits de número de cilindros 0-5 máximo
número do setor
DH = número máximo de cabeças
DL = número de unidades
ES: DI = segmento: deslocamento da unidade de disco
tabela de parâmetros
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função retorna vários parâmetros para a unidade especificada. 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 características do disco fixo
Chamada com: AH = 09H
DL = dirigir
Disco fixo 80H-FFH
No PC/XT Vector para INT 41H
deve apontar para o bloco de parâmetros do disco ou, no PC/AT e PS/2
O vetor para INT 41H deve apontar para o disco
bloco de parâmetros para unidade 0
Vetor para INT 46H deve apontar para o disco
bloco de parâmetros para unidade 1
Retorna : Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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âmetros de disco do ROM BIOS. A função é suportada somente em disco fixo. O formato do bloco de parâmetros para discos fixos PC e PC/XT é o seguinte:
Mudanças) |
Conteúdo |
00H-01H |
Número máximo de cilindros |
02H |
Número máximo de cabeças |
03H-04H |
Cilindro de corrente de gravação reduzida inicial |
05H-06H |
Iniciando a gravação do cilindro de pré-compensação |
07H |
Comprimento máximo de burst ECC |
08H
|
Opção de condução
Bit(s) |
Significância (se definida) |
0 – 2 |
opção de dirigir |
3 – 5 |
reservado (0) |
6 |
desabilitar entradas ECC |
7 |
desabilitar novas tentativas de acesso ao disco |
|
09H |
Valor de tempo limite padrão |
0AH |
Valor de tempo limite para unidade de formatação |
0BH |
Valor de tempo limite para verificação de unidade |
0CH-0FH |
Reservado |
O formato do bloco de parâmetros para discos fixos PC/AT e PS/2 é o seguinte:
Mudanças) |
Conteúdo |
00H_01H |
número máximo de cilindros |
02H |
número máximo de cabeças |
03H-04H |
Reservado |
05H-06H |
iniciando a escrita do cilindro de pré-compensação |
07H |
comprimento máximo de burst ECC |
08H |
Opções de direção
Bit(s) |
Significância (se definida) |
0 – 2 |
não usado |
3 |
mais de 8 cabeças |
4 |
não usado |
5 |
mapa de defeitos do fabricante presente no
cilindro máximo +1 |
6 – 8 |
diferente de zero (10, 01 ou 11) se as tentativas estiverem desabilitadas |
|
09H-0BH |
Reservado |
0CH-0DH |
cilindro de zona de aterrissagem |
0EH |
setor por faixa |
0FH |
Reservado |
INT 13H (0x13)
Função 0A H (0x0A ou 10) >> Ler setor longo
Chamada com: AH = 0AH
AL = número de setores
CH = cilindro
CL = setor
DH = cabeça
DL = dirigir
Disco fixo 80H-FFH
ES: BX = segmento: deslocamento do buffer
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
AL = número de setores transferidos
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função lê um setor ou setores do disco para a memória junto com um código Error Correcting Code (ECC) de 4 bytes para cada setor. Diferentemente da função Read sector normal (INT 13H (0x13) Function 02H), os erros ECC não são corrigidos automaticamente. Transferências multissetoriais são encerradas após qualquer setor com um erro de leitura.
Esta função é suportada somente 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 0BH (0x0B ou 11) >> Escrever setor longo
Chamada com: AH = 0BH
AL = número de setores
CH = cilindro
CL = setor
DH = cabeça
DL = dirigir
Disco fixo 80H-FFH
ES: BX = segmento: deslocamento do buffer
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
AL = número de setores transferidos
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função grava um ou mais setores 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 somente em discos fixos.
INT 13H (0x13)
Função 0CH (0x0C ou 12) >> Procurar
Chamada com: AH = 0CH
CH = 8 bits inferiores do cilindro
CL = 2 bits superiores do cilindro nos bits 6-7
DH = cabeça
DL = dirigir
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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 somente em discos fixos.
INT 13H (0x13)
Função 0DH (0x0D ou 13) >> Redefinir sistema de disco fixo
Chamada com: AH = 0DH
DL = dirigir
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = status (ver INT 13H Função 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 de setor
Chamada com: AH = 0EH
ES: BX = segmento: deslocamento do buffer
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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ísico.
INT 13H (0x13)
Função 0FH (0x0F ou 15) >> Escrever buffer de setor
Chamada com: AH = 0FH
ES: BX = segmento: deslocamento do buffer
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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ísico. Esta função deve ser chamada para inicializar o conteúdo do buffer de 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
Chamada com: AH = 10H
DL = dirigir
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função testa se a unidade de disco fixa especificada está operacional e retorna o status da unidade. Esta função é suportada somente em discos fixos.
INT 13H (0x13)
Função 11H (0x11 ou 17) >> Recalibrar drive
Ligue com: AH =11H
DL = dirigir
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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 retorna o status da unidade. Esta função é suportada somente em discos fixos.
INT 13H (0x13)
Função 12H (0x12 ou 18) >> Diagnóstico da RAM do controlador
Chamada com: AH = 12H
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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 do controlador de acionamento
Chamada com: AH = 13H
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função faz com que o adaptador fixo execute testes de diagnóstico interno da unidade conectada, indicando se o teste foi aprovado pelo status retornado.
INT 13H (0x13)
Função 14H (0x14 ou 20) >> Diagnóstico interno do controlador
Chamada com: AH = 14H
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00H
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
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
Chamada com: AH = 15H
DL = dirigir
Disquete 00H-7FH
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = código do tipo de unidade
00H se nenhuma unidade estiver presente
01H se a unidade de disquete não tiver suporte para linha de troca
02H se a unidade de disquete tiver suporte para linha de troca
03H se for disco fixo
|
E, se disco fixo (AH =03H)
CX: DX = número de setores de 512 bytes
Se a função não for bem-sucedida
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função retorna um código que indica o tipo de disquete ou disco fixo referenciado pelo código de unidade especificado.
INT 13H (0x13)
Função 16H (0x16 ou 22) >> Obter status de alteração de disco
Chamada com: AH = 16H
DL = dirigir
Disquete 00H-7FH
Retorna: Se a linha de alteração estiver inativa e o disco não tiver sido alterado
Bandeira de transporte = limpar
AH = 00H
Se a linha de mudança estiver ativa e o disco puder ter sido alterado
Bandeira de transporte = definida
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 carry definido, o disco não foi necessariamente alterado e a linha de alteração pode ser ativada simplesmente destravando e travando a porta da unidade de disco sem remover o disquete.
INT 13H (0x13)
Função 17H (0x17 ou 23) >> Definir tipo de disco
Chamada com: AH = 17H
AL = código do tipo de disquete
Valor |
Descrição |
00H |
Não usado |
01H |
Disquete de 320/360 KB em unidade de 360 KB |
02H |
Disquete de 320/360 KB em unidade de 1,2 MB |
03H |
Disquete de 1,2 MB em unidade de 1,2 MB |
04H |
Disquete de 720 KB em unidade de 720 KB |
SL = dirigir
Disquete 00H-7FH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00X
Se a função falhar
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função seleciona o tipo de disquete para a unidade especificada.
INTERNO 13H (0x13)
Função 18H (0x18 ou 24) >> Definir tipo de mídia para formato
Chamada de: AH = 18H
CH = número de cilindros
CL = setor por trilha
DL = dirigir
Disquete 00H-7FH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00X
ES : DI = segmento : deslocamento do disco
tabela de parâmetros para o tipo de mídia
Se a função falhar
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função seleciona as características de mídia para a unidade especificada, portanto, a unidade deve ter um disquete.
INTERNO 13H (0x13)
Função 19H (0x19 ou 25) >> Cabeças de estacionamento
Chamada de: AH = 19H
DL = dirigir
Disco fixo 80H-FFH
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00X
Se a função falhar
Bandeira de transporte = definida
AH = estado
Comentários:
Esta função move a alavanca de leitura/gravação para uma trilha que não é usada para armazenamento de dados, para que os dados não sejam corrompidos quando a unidade for desligada.
INTERNO 13H (0x13)
Função 1AH (0x1A ou 26) >> Formatar disco ESDI
Chamada com: AH = 1AH
AL = Endereço de Bloco Relativo (RBA)
número de defeitos na tabela
0 se não houver tabela RBA
>0 se a tabela RBA for usada
CL = bits modificadores de formato
Página(s) |
Significância (se definida) |
0 |
Ignore o mapa de defeitos primários |
1 |
Ignorar mapa de defeitos secundários |
2 |
Atualizar mapa de defeitos secundários |
3 |
Realizar análise avançada de superfície |
4 |
Gerar uma interrupção periódica |
5-7 |
Reservado (deve ser 0) |
DL = dirigir
Disco fixo 80H-FFH
ES:BX = segmento:deslocamento da tabela RBA
Retorna: Se a função for bem-sucedida
Bandeira de transporte = limpar
AH = 00X
Se a função falhar
Bandeira de transporte = definida
AH = status (ver INT 13H Função 01H)
Comentários:
Esta função inicializa os campos de setor do disco e endereço de rastreamento em um disco conectado a um adaptador de disco rígido ESDI.
A operação desta função é chamada de formatação de baixo nível e prepara o disco para operações físicas de leitura/gravação no nível do setor. O disco deve ser posteriormente particionado usando o comando FDISK e então formatado em alto nível usando o comando FORMAT para instalar o sistema de arquivos.