Capitolo – 8
Funzioni del BIOS del disco e gestione degli interrupt tramite C
Introduzione
In questo capitolo parleremo delle caratteristiche importanti del Disk-BIOS e di altre importanti funzionalità che ci danno la libertà di utilizzare e gestire gli interrupt nel nostro programma C in un metodo semplice e breve. Queste funzioni costituiscono la base della programmazione per il recupero dei dati e la risoluzione dei problemi del disco. Queste sono le caratteristiche che rendono il linguaggio C un "linguaggio assembly di alto livello " .
Funzioni di biosdisk e _bios_disk
Queste due funzioni sono le più importanti ai fini della nostra programmazione per il recupero dati e la risoluzione dei problemi del disco. Utilizzeremo queste funzioni nella maggior parte dei casi.
Queste due funzioni sono servizi dell'unità disco del BIOS e sono definite in bios.h, dove biosdisk opera al di sotto del livello dei file sui settori raw. Se utilizzate con la minima disattenzione, queste funzioni possono distruggere il contenuto dei file e delle directory sul disco rigido. Entrambe le funzioni biosdisk e _bios_disk utilizzano l'interrupt 0x13 per passare le operazioni del disco direttamente al BIOS. La funzione _bios_disk è dichiarata nel programma come segue:
unsigned _bios_disk(comando non firmato, struct diskinfo_t *dinfo);
E la dichiarazione per la funzione disco del BIOS appare così:
int biosdisk(int cmd, int unità, int testa, int traccia,
int settore, int insetti, void *buffer);
Il significato di questi parametri è descritto nella seguente tabella:
Parametro |
Funzione |
Che cosa è o cosa fa |
comando |
Entrambi |
Specifica l'operazione da eseguire, come lettura, scrittura, controllo, ecc. (Vedere la descrizione di cmd di seguito) |
informazioni |
_bios_disco |
Punta a una struttura diskinfo_t contenente i parametri rimanenti necessari per l'operazione. (vedere la descrizione della struttura diskinfo_t di seguito) |
guidare una macchina |
disco bios |
Specifica quale disco verrà utilizzato (0 per a:, 1 per b: e 0x80 per il primo disco rigido fisico, 0x81 per il secondo, ecc.) |
settore della traiettoria
della testa
|
disco bios |
Definiscono la posizione del settore di partenza da cui deve iniziare l'operazione. |
insetti |
disco bios |
Numero di settori da leggere, scrivere, controllare, ecc. |
respingente |
disco bios |
Indirizzo di memoria da cui i dati devono essere letti o scritti. |
In entrambe le funzioni, i dati vengono letti e scritti in un buffer di 512 byte per settore, che è la dimensione del settore logico del disco rigido, e il valore restituito da entrambe le funzioni è il valore del registro AX impostato dalla chiamata BIOS INT 0x13H.
Se la funzione ha esito positivo, il byte più alto = 0, ovvero il completamento è avvenuto con successo, mentre il byte più basso contiene il numero di settori letti, scritti o verificati, ecc.
Ma se si verifica un errore e la funzione non viene eseguita correttamente, il valore del byte alto corrisponderà a uno dei seguenti codici di errore, descritti nella tabella seguente:
Valore |
Descrizione |
0x00 |
Completamento con successo (non un errore!!) |
0x01 |
Squadra pessima |
0x02 |
Etichetta indirizzo non trovata |
0x03 |
Tentativo di scrittura su un disco protetto da scrittura |
0x04 |
Settore non trovato |
0x05 |
Ripristino non riuscito (disco rigido) |
0x06 |
Il disco è stato modificato dall'ultima operazione. |
0x07 |
Impossibile eseguire l'azione del parametro di unità |
0x08 |
Overflow di accesso diretto alla memoria (DMA) |
0x09 |
Tentativo di eseguire DMA oltre il limite di 64K (errore del limite dati o settori >80H) |
0x0Un |
Rilevato settore danneggiato |
0x0B |
Rilevata traccia errata |
0x0C |
Traccia non supportata |
0x0D |
Numero di settori non corretto durante la formattazione (disco rigido PS/2) |
0x0E |
Contrassegno indirizzo dati di controllo rilevato (disco rigido) |
0x0F |
Livello di arbitrato DMA fuori intervallo (disco rigido) |
0x10 |
CRC/ECC non corretto durante la lettura del disco |
0x11 |
Errore di correzione dei dati CRC/ECC (non è propriamente un errore) |
0x20 |
Il controller è fuori servizio |
0x31 |
Non è presente alcun supporto nell'unità (estensioni IBM/MS INT 13) |
0x32 |
Tipo di disco non corretto memorizzato in CMOS (Compaq) |
0x40 |
L'operazione di ricerca non è riuscita. |
0x80 |
L'allegato non ha risposto |
0xAA |
Disco non pronto (solo disco rigido) |
0xB0 |
Il volume non è bloccato sul disco (estensioni INT 13) |
0xB1 |
Volume bloccato su disco (estensioni INT 13) |
0xB2 |
Volume non rimovibile (estensioni INT 13) |
0xB3 |
Volume di utilizzo (estensioni INT 13) |
0xB4 |
Numero di blocchi superato (estensioni INT 13) |
0xB5 |
Impossibile eseguire una richiesta di lancio valida (estensioni INT 13) |
0xBB |
Si è verificato un errore non specificato (solo disco rigido) |
0xCC |
Si è verificato un errore di registrazione |
0xE0 |
Errore registro stato |
0xFF |
Operazione Sense fallita |
Nella tabella seguente sono riportati i comandi operativi da eseguire tramite il parametro cmd. Per prima cosa esamineremo il funzionamento generale di entrambe le funzioni.
disco bios |
_bios_disco |
Cosa sta facendo? |
0 |
_RESET_DISCO |
Reimposta il sistema del disco, forzando il controller dell'unità a effettuare un hard reset. Ignora tutti gli altri parametri |
1 |
_STATO_DISCO |
Restituisce lo stato dell'ultima operazione sul disco. Ignora tutti gli altri parametri |
2 |
_DISK_READ |
Legge uno o più settori del disco nella memoria |
3 |
_SCRITTURA_DISCO |
Scrive uno o più settori del disco dalla memoria |
4 |
_VERIFICA_DISCO |
Verifica uno o più settori |
5 |
_FORMATO_DISCO |
Formatta una traccia |
Sebbene tu sia libero di usare cmd = 0, 1, 2, 3, 4, 5 o cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT ed entrambe le opzioni abbiano lo stesso effetto, si consiglia di prendere l'abitudine di usare opzioni come cmd = _DISK_FORMAT invece di cmd = 5 perché può aiutarti a evitare errori che potrebbero verificarsi se hai digitato un numero di comando errato per cmd.
Nella dichiarazione della funzione biosdisk o _bios_disk se diamo cmd = _DISK_RESET la funzione reimposta il sistema del disco ignorando tutti gli altri parametri e _DISK_STATUS restituisce lo stato dell'ultima operazione del disco, ignorando tutti gli altri parametri
Per cmd =_DISK_READ, _DISK_WRITE o _DISK_VERIFY (2, 3 o 4), le funzioni biosdisk e _bios_disk utilizzano anche altri parametri mostrati di seguito:
Parametro |
Cosa fa |
settore
pista di testa
|
Questi tre specificano la posizione del settore di partenza per l'operazione specificata. (i valori minimi possibili possono essere head = 0, track = 0 e sector = 1) |
nsettori |
Specifica il numero di settori da leggere o scrivere |
respingente |
Indica il buffer in cui i dati devono essere letti e scritti |
Se il valore di cmd è = 5 (_DISK_FORMAT), biosdisk e _bios_disk utilizzano i seguenti parametri in base alla descrizione nella tabella. Si raccomanda sempre di prestare attenzione quando si utilizza _DISK_FORMAT e di sapere cosa si sta per fare. La mancanza di conoscenza o anche un piccolo errore potrebbero causare una grande perdita di dati.
Parametro |
Cosa fa |
traccia della testa |
Specificano la posizione della traccia da formattare |
respingente |
Indica una tabella di intestazioni di settore da scrivere sulla traccia denominata |
Ci sono alcuni valori aggiuntivi di cmd che sono usati solo dalle funzioni biosdisk. Questi valori di cmd sono consentiti solo per XT, AT, PS/2 e compatibili. I valori sono stati descritti nella tabella seguente:
comando |
Cosa fa |
6 |
Formatta una traccia e imposta i flag dei settori danneggiati |
7 |
Formatta l'unità a partire da una traccia specifica |
8 |
Restituisce i parametri dell'unità corrente nei primi 4 byte del buffer |
9 |
Inizializza le caratteristiche della coppia di unità |
10 |
Esegue una lettura lunga (512 più 4 byte extra per settore) |
11 |
Esegue una scrittura lunga (512 più 4 byte extra per settore) |
12 |
Un disco cerca |
13 |
Ripristino disco alternativo |
14 |
Legge il buffer del settore |
15 |
Scrive il buffer del settore |
16 |
Verifica se l'unità denominata è pronta |
17 |
Ricalibra l'unità |
18 |
Diagnostica RAM del controller |
19 |
Diagnostica dell'unità |
20 |
Diagnostica interna del controller |
Struttura diskinfo_t
La struttura diskinfo_t è utilizzata dalla funzione _bios_disk. La descrizione della struttura è la seguente:
struttura diskinfo_t {
unità, testina, traccia, settore, nsettori non firmati;
vuoto lontano *buffer;
};
Dove drive specifica l'unità disco da utilizzare. Ricorda sempre che per i dischi rigidi viene specificata l'unità fisica, non la partizione del disco. Se vuoi gestire le partizioni, il programma applicativo deve anche interpretare le informazioni della tabella delle partizioni di quel disco stesso.
Il valore di head, track e sector specifica la posizione del settore di partenza per l'operazione. nsectors specifica il numero di settori da leggere o scrivere e buffer punta al buffer in cui i dati vengono letti e scritti. A seconda del valore di cmd, gli altri parametri nella struttura diskinfo_t potrebbero essere necessari o meno.
Nella seguente tabella è riportato il valore per la specifica dell'unità disco da utilizzare nelle funzioni biosdisk e _bios_disk:
guidare il valore |
Unità disco da utilizzare |
0 |
Prima unità floppy disk |
1 |
Seconda unità floppy disk |
2 |
Terzo lettore floppy disk |
.... |
(e così via) |
0x80 |
Primo disco rigido |
0x81 |
Secondo disco rigido |
0x82 |
Terzo disco rigido |
.... |
(e così via) |
Basta con la teoria! Ora vediamo un po' di cose pratiche e qualche esempio di queste funzioni. L'esempio seguente legge i settori di entrambi i lati di quattro tracce del floppy e ne memorizza il contenuto nel file specificato dall'utente. Non importa se hai eliminato i file dal tuo disco perché il programma sta leggendo direttamente la superficie del disco.
Per vedere i dati eliminati, è meglio prendere un floppy disk completamente formattato e copiare alcuni file di testo come i tuoi programmi .c o altri file di testo (in modo da poter comprendere il contenuto dei file) che occupano circa 73 KB (dati memorizzati in quattro tracce, due lati e 18 settori in ogni traccia. Ogni settore è di 512 byte). Il programma è stato sviluppato per dimostrare l'esempio. Tuttavia, è possibile modificarlo e svilupparlo per essere pronti a recuperare i dati.
/* Programma per leggere 4 tracce (0, 1, 2 e 3) di un floppy e scrivere il contenuto nel file specificato */
#include <bios.h>
#include <stdio.h>
#include<conio.h>
vuoto principale(vuoto)
{
int testa,traccia;
int risultato,i,settore;
char nomefile[80];
carattere *buffer;
struct diskinfo_t dinfo;
carattere statico dbuf[512];
FILE *tt;
clrscr();
/// Controlla se l'unità è pronta o meno \\\
se(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf(" Unità A: non pronta:\n Inserire il disco nell'unità A:
e premi un tasto qualsiasi\n");
ottenere();
}
/* Ottieni il nome del file in cui memorizzare i dati dei settori del disco */
printf("\nInserisci il nome del file di destinazione con il percorso completo
per memorizzare i dati \n\n >");
ottiene(nomefile);
if((tt= fopen(nomefile, "wb"))==NULL)
{
printf("Impossibile aprire il file!!!");
ottenere();
}
per(traccia=0;traccia<4;traccia++)
{
per(testa=0; testa<=1;testa++)
{
per(settore=1;settore<=18;settore++)
{
dinfo.drive = 0; /* numero unità per A: */
dinfo.head = testa; /* numero della testina del disco */
dinfo.track = traccia; /* numero traccia */
dinfo.sector = settore; /* numero settore */
dinfo.nsectors = 1; /* conteggio settori */
dinfo.buffer = dbuf; /* buffer dati */
/// Mostra lo stato \\\
gotoxy(10,10); printf("Lettura dati da: Head=%d
Traccia=%d Settore=%d",
testa, traccia, settore);
fprintf(tt,"\n Dati letti da: Head=%d Track=%d Sector=%d\n",
testa, traccia, settore);
/// Leggi i settori specificati \\\
risultato = _bios_disk(_DISK_READ, &dinfo);
/// Memorizza il contenuto nel file specificato \\\
se ((risultato & 0xff00) == 0)
{
per(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Stampa il messaggio di errore sullo schermo e nel file per errore durante la lettura di un settore */
altro
{
printf("\n Impossibile leggere in Head= %d Traccia= %d
Settore= %d\n",testa,traccia,settore);
fprintf(tt,"\n Impossibile leggere in Head= %d Track= %d
Settore =%d\n",testa,traccia,settore);
}
}
}
}
fclose(tt);
}
L'esempio mostra l'uso delle funzioni biosdisk e _bios_disk. La funzione biosdisk controlla se il disco è pronto o meno e viene trovato il contrassegno di indirizzo. La funzione _bios_disk legge i settori di entrambi i lati fino a quattro tracce.
La sequenza di lettura (o scrittura) sulla superficie del disco dovrebbe essere la seguente:
Funzioni absread e abswrite
Queste funzioni sono state definite in Dos.h. La funzione absread legge i settori assoluti del disco e la funzione abswrite scrive i settori assoluti del disco. La funzione absread usa l'interrupt DOS 0x25 per leggere settori specifici del disco e la funzione abswrite usa l'interrupt DOS 0x26 per scrivere settori specifici del disco.
Le operazioni di lettura o scrittura assolute procedono in modo sequenziale incrementando i settori passo dopo passo e sono completamente indipendenti dai numeri di testina, traccia ecc. È compito del BIOS del computer tradurre i settori assoluti nei rispettivi numeri di traccia, testina e settore.
Le operazioni di lettura e scrittura assolute sono consigliate in quei programmi in cui si intende eseguire operazioni di lettura/scrittura sull'intero disco e si desidera evitare codifica aggiuntiva e loop nel programma per aumentare la velocità del programma al massimo.
Entrambe le funzioni absread e abswrite ignorano la struttura logica di un disco e non prestano attenzione a file, FAT o directory. Queste funzioni eseguono direttamente operazioni di lettura assoluta e scrittura assoluta sulla superficie del disco. Questo è il motivo per cui, se usato in modo improprio, abswrite può sovrascrivere file, directory e FAT.
La dichiarazione della funzione absread è la seguente:
int absread(int unità, int insetti, long lsect,
*vuoto *buffer);
e la funzione abswrite è dichiarata come segue:
int abswrite(int unità, int insetti, long lsect,
*vuoto *buffer);
Dove il significato dei parametri è il seguente:
Parametro |
Che cosa è/fa |
guidare |
Numero dell'unità da leggere (o scrivere): 0 = A, 1 = B, ecc. |
insetti |
Numero di settori da leggere (o scrivere) |
setta |
Numero del settore logico iniziale |
respingente |
Indirizzo di memoria in cui i dati devono essere letti (o scritti) |
In caso di successo, entrambe le funzioni restituiscono 0. In caso di errore, entrambe restituiscono -1 e impostano il numero di errore sul valore del registro AX restituito dalla chiamata di sistema.
Il numero di settori per operazioni di lettura o scrittura è limitato a 64K o alla dimensione del buffer, a seconda di quale sia più piccolo. Tuttavia, nei prossimi capitoli impareremo l'uso della memoria Huge per superare il limite di memoria di 64K, per sviluppare un programma molto veloce.
|
Gestione degli interrupt con C
Il C è talvolta chiamato linguaggio assembly di alto livello perché può chiamare i diversi interrupt usando alcune delle sue funzioni definite. Alcune funzioni importanti sono le seguenti:
- int86: richiama gli interrupt MS-DOS.
- int86x: richiama l'interruzione MS-DOS con i valori del registro di segmento.
- intdos: richiama il servizio MS-DOS utilizzando registri diversi da DX e AL
- intdosx: richiama il servizio MS-DOS con i valori del registro di segmento.
- segread: legge i registri dei segmenti
Discuteremo queste funzioni in dettaglio. Innanzitutto, discuteremo alcune strutture e unioni predefinite che sono frequentemente o necessariamente utilizzate con queste funzioni.
Struttura SREGS
Questa struttura è stata definita in dos.h ed è una struttura dei registri di segmento passati e compilati dalle funzioni int86x, intdosx e segread. La dichiarazione della struttura è la seguente:
struttura SREGS {
int non firmati;
intero senza segno cs;
intero senza segno ss;
int senza segno ds;
};
Unione REGS
REGS è l'unione di due strutture. L'unione REGS è stata definita dos.h e viene utilizzata per passare informazioni da e verso le funzioni int86, int86x, intdos e intdosx. La dichiarazione dell'unione è la seguente:
unione REGS {
struct REGISTRI PAROLE x;
struct BYTEREGS h;
};
Strutture BYTEREGS e WORDREGS
Le strutture BYTEREGES e WORDREGS sono state definite in dos.h e sono utilizzate per memorizzare registri di byte e word. La struttura WORGREGS consente all'utente di accedere ai registri della CPU come quantità a 16 bit, mentre la struttura BYTEREGES fornisce l'accesso ai singoli registri a 8 bit.
La struttura BITEREGS è dichiarata come segue:
struttura BYTEREGS {
char non firmato al, ah, bl, bh;
carattere senza segno cl, ch, dl, dh;
};
E la struttura WORDREGS è dichiarata come segue:
struttura WORDREGS {
intero senza segno ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
funzioni int86 e int86x
Queste funzioni sono le interfacce di interrupt software 8086 generali definite in dos.h. I registri sono impostati sui valori desiderati e queste funzioni sono chiamate per invocare gli interrupt MS-DOS. La dichiarazione della funzione int86 è la seguente:
int int86(int intno, unione REGS *inregs,
sindacato REGS *outregs);
int86x è la variante della funzione int86. È dichiarata come segue:
int int86x(int intno, unione REGS *inregs,
(unione REGS *outregs, struct SREGS *segregs);
Entrambe le funzioni int86 e int86x eseguono un interrupt software 8086 specificato dall'argomento intno. Oppure possiamo dire che l'interrupt da generare è specificato da intno.
Con la funzione int86x l'accesso è possibile solo a ES e DS e non a CS e SS, quindi è possibile richiamare un interrupt software 8086 che accetta un valore di DS diverso dal segmento dati predefinito e/o accetta un argomento in ES.
Queste funzioni copiano i valori dei registri da inregs nei registri prima dell'esecuzione dell'interruzione software. La funzione int86x copia anche i valori segregs->ds e segregs->es nei registri corrispondenti prima di eseguire l'interruzione software. Questa funzionalità consente ai programmi che utilizzano puntatori lontani o un modello di memoria dati di grandi dimensioni di specificare quale segmento deve essere utilizzato per l'interruzione software.
Le funzioni copiano i valori correnti del registro in outregs, lo stato del flag di riporto nel campo x.cflag in outregs e il valore del registro flag 8086 nel campo x.flags in outregs, dopo il ritorno dell'interrupt software. La funzione int86x ripristina anche DS e imposta i campi segregs->es e segregs->ds sui valori dei registri di segmento corrispondenti.
In entrambe le funzioni inregs e outregs possono puntare alla stessa struttura ed entrambe le funzioni restituiscono il valore di AX dopo il completamento dell'interruzione software. Se il flag di riporto è impostato, di solito indica che si è verificato un errore.
Gli elementi dell'unione REGS utilizzati in C, equivalenti al linguaggio Assembly, sono riportati nella tabella seguente:
16 bit |
8 bit |
Linguaggio C |
Linguaggio assembly |
Linguaggio C |
Linguaggio assembly |
inreg.x.ax |
ASCIA |
inregs.h.al |
AL |
|
|
inregs.h.ah |
AH |
inreg.x.bx |
BxB |
inregs.h.bl |
BL |
|
|
inreg.h.bh |
BH |
inregs.x.cx |
C.C.E. |
inregs.h.cl |
CL |
|
|
inregs.h.ch |
CH |
inreg.x.dx |
DX |
inregs.h.dl |
DL |
|
|
inregs.h.dh |
D.E. |
inregs.x.si |
E |
|
|
inregs.x.di |
DI |
|
|
inregs.x.cflag |
CF |
|
|
Vediamo gli esempi delle funzioni int86 e int86x. Il seguente programma esegue la scansione di ogni settore del floppy disk e stampa lo stato di ogni settore sullo schermo.
/* Programma per la scansione di ogni settore del floppy disk e la stampa dello stato */
#include<dos.h>
#include<conio.h>
vuoto principale()
{
int testa,traccia,settore,i;
carattere *buf;
sindacato REGS inregs, outregs;
la struttura SREGS sregs;
clrscr();
/// Inizializzazione del disco mediante reimpostazione del sistema del disco \\\
gotoxy(10,2); printf("Inizializzazione del disco...");
per(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Numero funzione
inregs.h.dl=0x00; // Disco floppy
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("Lo stato del disco è come....\n");
/* Esegui la scansione del floppy disk da 0 a 79 tracce (totale tracce 80) */
per(traccia=0;traccia<=79;traccia++)
per(testa=0;testa<=1;testa++)
per(settore=1;settore<=18;settore++)
{
inregs.h.ah = 0x04; /// funzione Numero
inregs.h.al = 1; /// Numero di settori
inregs.h.dl = 0x00; /// Disco floppy
inregs.h.ch = traccia;
inregs.h.dh = testa;
inregs.h.cl = settore;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// Stampa lo stato del settore scansionato \\\\
interruttore(outregs.h.ah)
{
caso 0x00:
cprintf("STATO: Nessun errore !!");
rottura;
caso 0x01:
cprintf("STATO: Comando non valido ");
rottura;
caso 0x02:
cprintf("STATO: Contrassegno indirizzo non trovato ");
rottura;
caso 0x03:
cprintf("STATO: Tentativo di scrivere su
disco protetto da scrittura ");
rottura;
caso 0x04:
cprintf("STATO: Settore non trovato ");
rottura;
caso 0x05:
cprintf("STATO: Ripristino non riuscito (disco rigido) ");
rottura;
caso 0x06:
cprintf("STATO: Disco modificato dall'ultimo
operazione ");
rottura;
caso 0x07:
cprintf("STATO: Attività parametro unità
fallito") ;
rottura;
caso 0x08:
cprintf("STATO: Accesso diretto alla memoria (DMA)
invaso ");
rottura;
caso 0x09:
cprintf("STATO: Tentativo di eseguire DMA attraverso
Limite 64K ");
rottura;
caso 0x0A:
cprintf("STATO: rilevato settore danneggiato ");
rottura;
caso 0x0B:
cprintf("STATO: Rilevata traccia non valida ");
rottura;
caso 0x0C:
cprintf("STATO: Tipo di supporto non trovato ");
rottura;
caso 0x0D:
cprintf("STATO: Numero non valido di settori su
formato (disco rigido) ");
rottura;
caso 0x0E:
cprintf("STATO: Contrassegno indirizzo dati di controllo
rilevato (disco rigido) ");
rottura;
caso 0x0F:
cprintf("STATO: livello di arbitrato DMA fuori
intervallo (disco rigido) ");
rottura;
caso 0x10:
cprintf("STATO: CRC/ECC non valido durante la lettura del disco ");
rottura;
caso 0x11:
cprintf("STATO: errore nei dati corretti CRC/ECC ");
rottura;
caso 0x20:
cprintf("STATO: Il controller è fallito ");
rottura;
caso 0x31:
cprintf("STATO: Nessun supporto nell'unità (IBM/MS INT 13H
estensioni) ");
rottura;
caso 0x32:
cprintf("STATO: Tipo di unità non corretto memorizzato in")
;
rottura;
caso 0x40:
cprintf("STATO: operazione di ricerca non riuscita ");
rottura;
caso 0x80:
cprintf("STATO: l'allegato non è riuscito a rispondere
(Timeout del disco) ");
rottura;
caso 0xAA:
cprintf("STATO: Unità non pronta (disco rigido
soltanto) ");
rottura;
caso 0xB0:
cprintf("STATO: Volume non bloccato nell'unità (INT
13H estensioni) ");
rottura;
caso 0xB1:
cprintf("STATO: Volume bloccato nell'unità (estensioni INT 13H) ");
rottura;
caso 0xB2:
cprintf("STATO: Volume non rimovibile (INT 13H
estensioni) ");
rottura;
caso 0xB3:
cprintf("STATO: Volume in uso (INT 13H
estensioni) ");
rottura;
caso 0xB4:
cprintf("STATO: conteggio dei blocchi superato (INT 13H
estensioni) ");
rottura;
caso 0xB5:
cprintf("STATO: Richiesta di espulsione valida fallita (INT
13H estensioni) ");
rottura;
caso 0xBB:
cprintf("STATO: si è verificato un errore indefinito (difficile
solo disco) ");
rottura;
caso 0xCC:
cprintf("STATO: si è verificato un errore di scrittura ");
rottura;
caso 0xE0:
cprintf("STATO: errore nel registro di stato ");
rottura;
caso 0xFF:
cprintf("STATO: operazione di rilevamento non riuscita ");
rottura;
default: cprintf("STATO: CODICE di stato SCONOSCIUTO ");
}
printf("\nPosizione attuale= Traccia:%d Testa:%d Settore:%d \n",
traccia,testa,settore);
}
gotoxy(10,24);printf("Scansione completata!! Premi un tasto qualsiasi per
Uscita..");
ottenere();
}
Il programma mostra l'esempio di utilizzo delle funzioni int86 e int86x. In questo programma la funzione int86 inizializza il disco reimpostando il sistema del disco, utilizzando la funzione 00H di INT 13H. La funzione int86x verifica ogni settore del floppy (1,44 Mb, floppy disk da 3½) da entrambi i lati, fino a 0-79 tracce (totale 80 tracce) utilizzando la funzione 04H di INT 13H.
Funzione segregazione
Questa funzione è stata definita in dos.h. Questa funzione legge i registri di segmento. La dichiarazione della funzione è la seguente:
void segread(struct SREGS *segp);
dove segread inserisce i valori correnti dei registri di segmento nella struttura *segp. La funzione non restituisce nulla e la chiamata è pensata per essere utilizzata con intdosx e int86x. vediamo un esempio
#include <stdio.h>
#include <dos.h>
vuoto principale()
{
struct SREGS segmenti;
segread(&segs);
printf("Impostazioni del registro del segmento corrente\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
ottenere();
}
E l'output del programma sarà qualcosa del genere:
Impostazioni del registro del segmento corrente
CS: EED DS: 10BA
Italiano: ES: 10BA SS: 10BA
Funzioni intdos e intdosx
Queste funzioni sono state definite in dos.h. Queste sono le interfacce di interrupt DOS generali. La funzione intdos richiama i registri di servizio MS-DOS, quindi DX e AL, dove la funzione intdosx richiama il servizio MS-DOS con valori di registro segmento.
La dichiarazione della funzione intdos è la seguente:
int intdos(unione REGS *inregs, unione REGS *outregs);
e la dichiarazione della funzione intdosx è la seguente:
int intdosx(unione REGS *inregs, unione REGS *outregs,
(Struttura SREGS *segregs);
Le funzioni intdos e intdosx eseguono l'interruzione DOS 0x21 per richiamare una funzione DOS specificata. Il valore di inregs->h.ah specifica la funzione DOS da richiamare. La funzione intdosx copia anche i valori segregs ->ds e segregs ->es nei registri corrispondenti prima di richiamare la funzione DOS e quindi ripristina DS.
Questa caratteristica delle funzioni consente ai programmi che utilizzano puntatori lontani o un modello di memoria dati di grandi dimensioni di specificare quale segmento deve essere utilizzato per l'esecuzione della funzione. Con la funzione intdosx è possibile richiamare una funzione DOS che accetta un valore di DS diverso dal segmento dati predefinito e/o accetta un argomento in ES.
Entrambe le funzioni restituiscono il valore AX dopo il completamento della chiamata alla funzione DOS e se il flag di riporto è impostato (outregs -> x.cflag != 0), indica che si è verificato un errore.
Dopo che l'interrupt 0x21 ritorna, le funzioni copiano i valori del registro corrente in outregs, lo stato del flag di riporto nel campo x.cflag in outregs e il valore del registro dei flag 8086 nel campo x.flags in outregs. Sia inregs che outregs possono puntare alla stessa struttura. Vediamo gli esempi di queste funzioni.
Di seguito è riportato un esempio dell'uso della funzione intdos . Questo programma ottiene le informazioni selezionate sull'unità floppy (1,44 Mb, floppy disk da 3½ pollici). Questo programma fornisce le informazioni di allocazione di un floppy disk.
/* Ottieni le informazioni di allocazione dell'unità per l'utilizzo del disco */
#include <dos.h> /* per intdos() e unione REGS */
#include <stdio.h> /* per printf() */
sindacato REGS inregs, outregs;
vuoto principale()
{
inregs.h.ah = 0x36; /* ottieni spazio libero sul disco
numero funzione */
inregs.h.dl = 0x01; /* unità A: */
intdos(&inregs, &outregs);
printf("%d settori/cluster,\n%d cluster,\n%d byte/settore,
\n%d cluster totali",
regolazioni esterne x.ax, regolazioni esterne x.bx,
(i nomi dei file sono: outregs.x.cx, outregs.x.dx);
ottenere();
}
E l'output del programma sarà simile a questo:
1 settori/cluster,
1933 gruppi,
512 byte/settore,
2843 cluster totali
Ora vediamo un esempio della funzione intdosx . L'esempio seguente mostra l'uso della funzione intdosx . Il programma invia una stringa allo standard output.
/* Il programma per inviare 'string' all'output standard. */
#include <dos.h>
sindacato REGS inregs, outregs;
struct SREGS separa;
char far *string = "questa stringa non è nel
segmento dati predefinito$";
vuoto principale()
{
inregs.h.ah = 0x09; /* numero funzione */
inregs.x.dx = FP_OFF(string);/*DS:DX è lontano
indirizzo di 'stringa */
segregs.ds = FP_SEG(stringa);
intdosx(&inregs, &outregs, &segregs);
ottenere();
}
E l'output del programma sarà il seguente:
questa stringa non è nel segmento dati predefinito |
Qui stiamo stampando la stringa data con la funzione intdosx, tramite la funzione 09H di INT 21H. Bisogna sempre tenere a mente che la stringa data deve sempre terminare con il carattere "$".
Come conoscere il numero del disco rigido fisico
Il numero fisico del disco rigido è una cosa molto importante e dovrebbe essere scritto in modo esatto. La specifica illegale del disco può causare una perdita di dati importante. Dobbiamo essere sicuri del numero di unità durante il recupero dei dati o la programmazione della risoluzione dei problemi del disco. Come conoscere il numero di unità di qualsiasi disco con diverse disposizioni di dischi può essere stimato dagli esempi forniti di seguito.
Secondo un mito molto diffuso, i numeri delle unità fisiche vengono forniti in base allo stato di collegamento del disco, tuttavia in alcuni casi particolari potrebbero dipendere dalla procedura di avvio o dalle impostazioni di avvio del sistema operativo.
L'idea più generalizzata per il numero di unità fisica fornito dal BIOS è stata data qui, ma anche in questo caso è necessario confermare con l'aiuto di qualsiasi strumento di modifica del disco o con i programmi forniti nei capitoli successivi, circa la configurazione del disco. Dopo esserne certi, si dovrebbe prendere qualsiasi decisione sull'esecuzione di tali programmi che potrebbero corrompere o danneggiare i dati, se utilizzati illegalmente o in mancanza di conoscenza.
In genere, se al sistema sono collegati due dischi, uno è il master primario e l'altro è il master secondario, la prima preferenza sarà data al master primario (e poi allo slave primario, se disponibile), poi al master secondario (e poi allo slave secondario, se disponibile e così via) e il numero fisico sarà assegnato in base alle loro preferenze.
Supponiamo che il tuo sistema supporti il massimo di quattro dischi rigidi alla volta. Tutti e quattro i dischi rigidi possono essere collegati come indicato Avanti:
Maestro primario |
Schiavo primario |
Master secondario |
Schiavo secondario |
Ora consideriamo alcuni casi per il numero di unità di unità fisiche. Qui presumo che tu abbia collegato i dischi con le impostazioni dei jumper corrette come indicato dal produttore del disco e nelle impostazioni Master–Slave corrette:
- Se tutti e quattro i dischi rigidi sono collegati al sistema: se tutti e quattro i dischi sono collegati al sistema, i numeri delle unità fisiche saranno i seguenti:
Primario/Secondario (Master/Slave) |
Stato |
Numero e descrizione dell'unità fisica |
Maestro primario |
Il disco è presente |
Il numero dell'unità fisica sarà 80H. In questo caso il disco rigido è chiamato Primo disco rigido . |
Schiavo primario |
Il disco è presente |
Il numero dell'unità fisica sarà 81H. In questo caso il disco rigido è chiamato secondo disco rigido . |
Master secondario |
Il disco è presente |
Il numero dell'unità fisica sarà 82H. In questo caso il disco rigido è chiamato Terzo disco rigido . |
Schiavo secondario |
Il disco è presente |
Il numero dell'unità fisica sarà 83H. In questo caso il disco rigido è chiamato quarto disco rigido . |
- Se tre Hard Disk sono collegati al sistema: se tre Hard Disk sono collegati al sistema, i numeri delle unità fisiche saranno in base alle loro preferenze di collegamento. I seguenti esempi rappresentano alcune delle disposizioni:
Primario/Secondario (Master/Slave) |
Stato |
Numero e descrizione dell'unità fisica |
Maestro primario |
Il disco è presente |
Il numero dell'unità fisica sarà 80H. In questo caso il disco rigido è chiamato Primo disco rigido . |
Schiavo primario |
Il disco è presente |
Il numero dell'unità fisica sarà 81H. In questo caso il disco rigido è chiamato secondo disco rigido . |
Master secondario |
Il disco è presente |
Il numero dell'unità fisica sarà 82H. In questo caso il disco rigido è chiamato Terzo disco rigido . |
Schiavo secondario |
Disco non presente |
------------------- |
Primario/Secondario (Master/Slave) |
Stato |
Numero e descrizione dell'unità fisica |
Maestro primario |
Disco non presente |
------------------- |
Schiavo primario |
Il disco è presente |
Il numero dell'unità fisica sarà 80H. In questo caso il disco rigido è chiamato Primo disco rigido . |
Master secondario |
Il disco è presente |
Il numero dell'unità fisica sarà 81H. In questo caso il disco rigido è chiamato secondo disco rigido . |
Schiavo secondario |
Il disco è presente |
Il numero dell'unità fisica sarà 82H. In questo caso il disco rigido è chiamato Terzo disco rigido . |
Primario/Secondario (Master/Slave) |
Stato |
Numero e descrizione dell'unità fisica |
Maestro primario |
Il disco è presente |
Il numero dell'unità fisica sarà 80H. In questo caso il disco rigido è chiamato Primo disco rigido . |
Schiavo primario |
Disco non presente |
------------------- |
Master secondario |
Il disco è presente |
Il numero dell'unità fisica sarà 81H. In questo caso il disco rigido è chiamato secondo disco rigido . |
Schiavo secondario |
Il disco è presente |
Il numero dell'unità fisica sarà 82H. In questo caso il disco rigido è chiamato Terzo disco rigido . |
Primario/Secondario (Master/Slave) |
Stato |
Numero e descrizione dell'unità fisica |
Maestro primario |
Il disco è presente |
Il numero dell'unità fisica sarà 80H. In questo caso il disco rigido è chiamato Primo disco rigido . |
Schiavo primario |
Il disco è presente |
Il numero dell'unità fisica sarà 81H. In questo caso il disco rigido è chiamato secondo disco rigido . |
Master secondario |
Disco non presente |
------------------- |
Schiavo secondario |
Il disco è presente |
Il numero dell'unità fisica sarà 82H. In questo caso il disco rigido è chiamato Terzo disco rigido . |
- Se due Hard Disk sono collegati al sistema: Analogamente, se due Hard Disk sono collegati al sistema, i numeri delle unità fisiche saranno in base alle loro preferenze di collegamento. L'esempio seguente lo illustra:
Primario/Secondario (Master/Slave) |
Stato |
Numero e descrizione dell'unità fisica |
Maestro primario |
Il disco è presente |
Il numero dell'unità fisica sarà 80H. In questo caso il disco rigido è chiamato Primo disco rigido . |
Schiavo primario |
Disco non presente |
------------------- |
Master secondario |
Disco non presente |
------------------- |
Schiavo secondario |
Il disco è presente |
Il numero dell'unità fisica sarà 81H. In questo caso il disco rigido è chiamato secondo disco rigido . |
- Se al sistema è collegato un singolo disco rigido: non preoccuparti, se è disponibile un solo disco, il numero dell'unità fisica sarà 80H.
Interrupt 13H (INT 13H), funzioni del driver del disco BIOS ROM
La descrizione delle funzioni INT 13H è stata data qui. Queste funzioni dovrebbero essere apprese con cura, poiché l'uso improprio di queste funzioni o l'uso in mancanza di attenzione o di conoscenza, può causare una grande perdita di dati o molti altri problemi. Tuttavia, se utilizzate in modo appropriato e corretto, queste funzioni aiutano a ridurre al minimo la codifica del programma e a rendere la programmazione semplice e facile.
INTERNO 13H (0x13)
Funzione 00H (0x00) Reimposta il sistema del disco
Chiama con AH = 00H
DL = guidare
Disco floppy 00H-7FH
Disco fisso 80H-FFH
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Reimposta il controller del disco, ricalibra le unità collegate. Il braccio di lettura/scrittura viene spostato sul cilindro 0 e si prepara per l'I/O del disco.
Questa funzione dovrebbe essere chiamata dopo una richiesta di lettura, scrittura, verifica o formattazione del floppy disk non riuscita prima di ritentare l'operazione. Se la funzione viene chiamata con un'unità disco fisso (ad esempio selezionando DL>=80H), il controller del floppy disk e poi il controller del disco fisso vengono reimpostati.
INTERNO 13H (0x13)
Funzione 01H (0x01) Ottieni lo stato del sistema del disco
Chiama con: AH = 01H
DL = guidare
Disco floppy 00H-7FH
Disco fisso 80H-FFH
Restituisce: AH = 00H
AL = stato dell'operazione precedente del disco
(Vedere la tabella fornita prima per gli errori
e descrizione dei codici di stato).
Commenti:
Restituisce lo stato dell'operazione più recente sul disco
INTERNO 13H (0x13)
Funzione 02H (0x02) Leggi settore
Chiama con: AH = 02H
AL = numero di settori
CH = cilindro
CL = settore
DH = testa
DL = guidare
Disco floppy 00H-7FH
Disco fisso 80H-FFH
ES:BX = segmento: offset del buffer
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
AL = numero di settori trasferiti
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione legge uno o più settori dal disco alla memoria. Sui dischi fissi, i 2 bit superiori del numero di cilindro a 10 bit vengono posizionati nei 2 bit superiori del registro CL.
INTERNO 13H (0x13)
Funzione 03H (0x03) Scrivi settore
Chiama con: AH = 03H
AL = numero di settori
CH = cilindro
CL = settore
DH = testa
DL = guidare
Disco floppy 00H-7FH
Disco fisso 80H-FFH
ES: BX = segmento: offset del buffer
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
AL = numero di settori trasferiti
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione scrive uno o più settori dalla memoria al disco. Sui dischi fissi, i 2 bit superiori del numero del cilindro a 10 bit vengono posizionati nei 2 bit superiori del registro CL.
INTERNO 13H (0x13)
Funzione 04H (0x04) >> Verifica settore
Chiama con: AH = 04H
AL = numero di settori
CH = cilindro
CL = settore
DH = guidare
Disco floppy 00H-7FH
80H-FFH azionamento fisso
ES: BX = segmento: offset del buffer
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
AH = 00H
AL = numero di settori verificati
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione verifica i campi indirizzo di uno o più settori. Nessun dato viene trasferito da o verso la memoria tramite questa operazione. Sui dischi fissi, i 2 bit superiori del numero di cilindro a 10 bit vengono sostituiti nei 2 bit superiori del registro CL.
Questa funzione può essere utilizzata per verificare se un supporto leggibile è presente in un'unità floppy disk. Il programma richiedente dovrebbe reimpostare il sistema floppy disk (INT 13H Function 00H) e ritentare l'operazione tre volte prima di supporre che un floppy disk leggibile non sia presente. È consigliato nella maggior parte delle operazioni di inizializzazione floppy.
INTERNO 13H (0x13)
Funzione 05H (0x05) >> Formato traccia
Chiama con: AH = 05H
AL = interleave (dischi fissi PC/XT)
CH = cilindro
DH = testa
DL = guidare
Disco floppy 00H-7FH
Disco fisso 80H-FFH
ES: BX = segmento: offset dell'elenco dei campi indirizzo
(Ad eccezione del disco fisso PC/XT)
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato (vedere la tabella degli stati fornita)
prima)
Commenti:
Inizializza il settore del disco e traccia i campi indirizzo sulla traccia specificata. Sui floppy disk, l'elenco dei campi indirizzo è costituito da una serie di voci da 4 byte, una voce per settore. Il formato è stato fornito nella seguente tabella.
Nei dischi fissi, i 2 bit superiori del numero del cilindro a 10 bit vengono posizionati nei 2 bit superiori del registro CL.
Byte |
Contenuto |
0 |
Cilindro |
1 |
Testa |
2 |
Settore |
3
|
Codice dimensione settore
Valore |
Descrizione |
ore 00:00 |
128 byte per settore |
01H |
256 byte per settore |
ore 02:00 |
512 byte per settore |
ore 03:00 |
1024 byte per settore |
|
INTERNO 13H (0x13)
Funzione 06H (0x06) >> Formatta traccia non valida
Chiama con: AH = 06H
AL = interlacciamento
CH = cilindro
DH = testa
DL = guidare
Disco fisso 80H-FFH
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione è definita solo per le unità disco fisse PC/XT. Inizializza una traccia, scrivendo i campi indirizzo disco e i settori dati e impostando i flag settore danneggiato.
INTERNO 13H (0x13)
Funzione 07H (0x07) >> Formatta unità
Chiama con: AH = 07H
AL = interlacciamento
CH = cilindro
DL = guidare
Disco fisso 80H-FFH
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato (vedere la tabella degli stati fornita)
prima)
Commenti:
Questa funzione è definita solo per le unità disco fisse PC/XT. Formatta l'intera unità, scrivendo i campi indirizzo disco e i settori dati, a partire dal cilindro specificato.
INTERNO 13H (0x13)
Funzione 08H (0x08) >> Ottieni parametri di azionamento
Chiama con: AH = 08H
DL = guidare
Disco floppy 00H-7FH
Disco fisso 80H-FFH
Restituisce: se la funzione ha successo
Porta bandiera = libera
BL = tipo di unità (floppy PC/AT e PS/2)
disco)
Valore |
Descrizione |
01H |
360 KB, 40 tracce, 5,25" |
ore 02:00 |
1,2 MB, 80 tracce, 5,25" |
ore 03:00 |
720 KB, 80 tracce, 3,5" |
ore 04:00 |
1,44 MB, 80 tracce, 3,5" |
CH = 8 bit bassi del cilindro massimo
numero
CL = bit 6-7 ordine alto 2 bit di massimo
numero di cilindri bit 0-5 massimo
numero di settore
DH = numero massimo di capi
DL = numero di unità
ES: DI = segmento: offset dell'unità disco
tabella dei parametri
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione restituisce vari parametri per l'unità specificata. Il valore restituito nel registro DL riflette il numero effettivo di unità fisiche collegate all'adattatore per l'unità richiesta.
INTERNO 13H (0x13)
Funzione 09H (0x09) >> Inizializza le caratteristiche del disco fisso
Chiama con: AH = 09H
DL = guidare
Disco fisso 80H-FFH
Sul vettore PC/XT per INT 41H
deve puntare al blocco dei parametri del disco o, su PC/AT e PS/2
Il vettore per INT 41H deve puntare al disco
blocco parametri per azionamento 0
Il vettore per INT 46H deve puntare al disco
blocco parametri per azionamento 1
Restituisce : se la funzione ha successo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione inizializza il controller del disco fisso per le successive operazioni di I/O, utilizzando i valori trovati nei blocchi di parametri del disco BIOS ROM. La funzione è supportata solo su disco fisso. Il formato del blocco di parametri per dischi fissi PC e PC/XT è il seguente:
Cambiamento(i) |
Contenuto |
dalle 00:00 alle 01:00 |
Numero massimo di cilindri |
ore 02:00 |
Numero massimo di teste |
dalle 03:00 alle 04:00 |
Avvio del cilindro di scrittura a corrente ridotta |
dalle 05:00 alle 06:00 |
Avvio scrittura cilindro di precompensazione |
ore 07:00 |
Lunghezza massima del burst ECC |
ore 08:00
|
Opzione di guida
Pezzo(i) |
Significato (se impostato) |
0 – 2 |
opzione di guida |
3 – 5 |
riservato (0) |
6 |
disabilitare le voci ECC |
7 |
disabilitare i tentativi di accesso al disco |
|
ore 09:00 |
Valore di timeout standard |
0AH |
Valore di timeout per formattare l'unità |
0BH |
Valore di timeout per il controllo dell'unità |
da 0CH a 0FH |
Prenotato |
Il formato del blocco dei parametri per i dischi fissi PC/AT e PS/2 è il seguente:
Cambiamento(i) |
Contenuto |
00H_01H |
numero massimo di cilindri |
ore 02:00 |
numero massimo di teste |
dalle 03:00 alle 04:00 |
Prenotato |
dalle 05:00 alle 06:00 |
avvio scrittura cilindro di precompensazione |
ore 07:00 |
lunghezza massima del burst ECC |
ore 08:00 |
Opzioni di guida
Pezzo(i) |
Significato (se impostato) |
0 – 2 |
non utilizzato |
3 |
più di 8 teste |
4 |
non utilizzato |
5 |
mappa difetto del produttore presente al
cilindro massimo +1 |
6 – 8 |
diverso da zero (10, 01 o 11) se i tentativi sono disabilitati |
|
09H-0BH |
Prenotato |
da 0CH a 0DH |
cilindro zona atterraggio |
0EH |
settore per traccia |
0FH |
Prenotato |
INTERNO 13H (0x13)
Funzione 0A H (0x0A o 10) >> Leggi settore lungo
Chiama con: AH = 0AH
AL = numero di settori
CH = cilindro
CL = settore
DH = testa
DL = guidare
Disco fisso 80H-FFH
ES: BX = segmento: offset del buffer
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
AL = numero di settori trasferiti
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione legge un settore o settori dal disco alla memoria insieme a un codice Error Correcting Code (ECC) di 4 byte per ogni settore. A differenza della normale funzione Read sector (INT 13H (0x13) Function 02H), gli errori ECC non vengono corretti automaticamente. I trasferimenti multisettore vengono terminati dopo ogni settore con un errore di lettura.
Questa funzione è supportata solo su dischi fissi. I 2 bit superiori del numero di cilindro a 10 bit sono posizionati nei 2 bit superiori del registro CL.
INTERNO 13H (0x13)
Funzione 0BH (0x0B o 11) >> Scrivi settore lungo
Chiama con: AH = 0BH
AL = numero di settori
CH = cilindro
CL = settore
DH = testa
DL = guidare
Disco fisso 80H-FFH
ES: BX = segmento: offset del buffer
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
AL = numero di settori trasferiti
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione scrive uno o più settori dalla memoria al disco. Ogni settore di dati deve essere seguito dal suo codice ECC a 4 byte. I 2 bit superiori del numero di cilindro a 10 bit sono posizionati nei 2 bit superiori del registro CL. Questa funzione è supportata solo su dischi fissi.
INTERNO 13H (0x13)
Funzione 0CH (0x0C o 12) >> Cerca
Chiama con: AH = 0CH
CH = 8 bit inferiori del cilindro
CL = 2 bit superiori del cilindro nei bit 6-7
DH = testa
DL = guidare
Disco fisso 80H-FFH
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione posiziona le testine di lettura/scrittura del disco sul cilindro specificato senza trasferire alcun dato. I 2 bit superiori del numero del cilindro vengono posizionati nei 2 bit superiori del registro CL. Questa funzione è supportata solo su dischi fissi.
INTERNO 13H (0x13)
Funzione 0DH (0x0D o 13) >> Ripristina il sistema del disco fisso
Chiama con: AH = 0DH
DL = guidare
Disco fisso 80H-FFH
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato (vedi INT 13H Funzione 01H)
Commenti:
Questa funzione reimposta il controller del disco fisso, ricalibra le unità collegate, sposta il braccio di lettura/scrittura sul cilindro 0 e prepara il successivo I/O del disco.
INTERNO 13H (0x13)
Funzione 0EH (0x0E o 14) >> Leggi buffer di settore
Chiama con: AH = 0EH
ES: BX = segmento: offset del buffer
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione trasferisce il contenuto del buffer del settore interno dell'adattatore del disco fisso alla memoria di sistema. Nessun dato viene letto dall'unità disco fisica.
INTERNO 13H (0x13)
Funzione 0FH (0x0F o 15) >> Scrivi buffer di settore
Chiama con: AH = 0FH
ES: BX = segmento: offset del buffer
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione trasferisce i dati dalla memoria di sistema al buffer di settore interno dell'adattatore fisso. Nessun dato viene scritto sull'unità disco fisica. Questa funzione dovrebbe essere chiamata per inizializzare il contenuto del buffer di settore prima di formattare l'unità con INT 13H Funzione 05H.
INTERNO 13H (0x13)
Funzione 10H (0x10 o 16) >> Ottieni lo stato dell'unità
Chiama con: AH = 10H
DL = guidare
Disco fisso 80H-FFH
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione verifica se l'unità disco fisso specificata è operativa e ne restituisce lo stato. Questa funzione è supportata solo su dischi fissi.
INTERNO 13H (0x13)
Funzione 11H (0x11 o 17) >> Ricalibra unità
Chiama con: AH =11H
DL = guidare
Disco fisso 80H-FFH
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione fa sì che l'adattatore del disco fisso si ricalibri per l'unità specificata, posizionando il braccio di lettura/scrittura sul cilindro 0 e restituisce lo stato dell'unità. Questa funzione è supportata solo su dischi fissi.
INTERNO 13H (0x13)
Funzione 12H (0x12 o 18) >> Diagnostica RAM controller
Chiama con: AH = 12H
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione fa sì che l'adattatore del disco fisso esegua un test diagnostico integrato sul suo buffer di settore interno, indicando se il test è stato superato in base allo stato restituito.
INTERNO 13H (0x13)
Funzione 13H (0x13 o 19) >> Diagnostica dell'unità del controller
Chiamata con: AH = 13H
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione fa sì che l'adattatore fisso esegua test diagnostici interni dell'unità collegata, indicando se il test è stato superato in base allo stato restituito.
INTERNO 13H (0x13)
Funzione 14H (0x14 o 20) >> Diagnostica interna del controller
Chiama con: AH = 14H
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = 00H
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione fa sì che l'adattatore del disco fisso esegua un autotest diagnostico integrato, indicando se il test è stato superato in base allo stato restituito.
INTERNO 13H (0x13)
Funzione 15H (0x15 o 21) >> Ottieni il tipo di disco
Chiama con: AH = 15H
DL = guidare
Disco floppy 00H-7FH
Disco fisso 80H-FFH
Restituisce: se la funzione ha successo
Porta bandiera = libera
AH = codice tipo di unità
00H se non è presente alcuna unità
01H se l'unità floppy disk non supporta la modifica della linea
02H se l'unità floppy disk supporta la modifica della linea
03H se il disco è fisso
|
E, se il disco è fisso (AH =03H)
CX: DX = numero di settori da 512 byte
Se la funzione non riesce
Porta bandiera = impostato
AH = stato
Commenti:
questa funzione restituisce un codice che indica il tipo di floppy o disco fisso a cui fa riferimento il codice dell'unità specificato.
INTERNO 13H (0x13)
Funzione 16H (0x16 o 22) >> Ottieni lo stato di modifica del disco
Chiama con: AH = 16H
DL = guidare
Disco floppy 00H-7FH
Restituisce: se la linea di modifica è inattiva e il disco non è stato modificato
Porta bandiera = libera
AH = 00H
Se la linea di modifica è attiva e il disco potrebbe essere stato modificato
Porta bandiera = impostato
AH = 06H
Commenti:
Questa funzione restituisce lo stato della linea di modifica, indicando se il disco nell'unità potrebbe essere stato sostituito dall'ultimo accesso al disco. Se questa funzione restituisce con il flag di riporto impostato, il disco non è necessariamente stato modificato e la linea di modifica può essere attivata semplicemente sbloccando e bloccando lo sportello dell'unità disco senza rimuovere il floppy disk.
INTERNO 13H (0x13)
Funzione 17H (0x17 o 23) >> Imposta il tipo di disco
Chiama con: AH = 17H
AL = codice tipo floppy disk
Valore |
Descrizione |
ore 00:00 |
Non utilizzato |
01H |
Floppy disk da 320/360 KB in unità da 360 KB |
ore 02:00 |
Floppy disk da 320/360 KB in unità da 1,2 MB |
ore 03:00 |
Floppy disk da 1,2 MB in unità da 1,2 MB |
ore 04:00 |
Floppy disk da 720 KB in unità da 720 KB |
SL = guidare
Disco floppy 00H-7FH
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
AH = 00X
Se la funzione fallisce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione seleziona il tipo di floppy disk per l'unità specificata.
INTERNO 13H (0x13)
Funzione 18H (0x18 o 24) >> Imposta il tipo di supporto per il formato
Chiamata da: AH = 18H
CH = numero di cilindri
CL = settore per traccia
DL = guidare
Disco floppy 00H-7FH
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
AH = 00X
ES : DI = segmento : offset del disco
tabella dei parametri per il tipo di supporto
Se la funzione fallisce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione seleziona le caratteristiche del supporto per l'unità specificata, pertanto l'unità deve disporre di un disco floppy.
INTERNO 13H (0x13)
Funzione 19H (0x19 o 25) >> Teste di parcheggio
Chiamata da: AH = 19H
DL = guidare
Disco fisso 80H-FFH
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
AH = 00X
Se la funzione fallisce
Porta bandiera = impostato
AH = stato
Commenti:
Questa funzione sposta la leva di lettura/scrittura su una traccia non utilizzata per l'archiviazione dei dati, in modo che questi non vengano danneggiati quando l'unità viene spenta.
INTERNO 13H (0x13)
Funzione 1AH (0x1A o 26) >> Formatta disco ESDI
Chiama con: AH = 1AH
AL = Indirizzo di blocco relativo (RBA)
numero di difetti nella tabella
0 se non c'è una tabella RBA
>0 se viene utilizzata la tabella RBA
CL = bit del modificatore di formato
Pagina/e |
Significato (se impostato) |
0 |
Ignora la mappa dei difetti primari |
1 |
Ignora la mappa dei difetti secondari |
2 |
Aggiorna la mappa dei difetti secondari |
3 |
Eseguire analisi avanzate della superficie |
4 |
Genera un'interruzione periodica |
5-7 |
Riservato (deve essere 0) |
DL = guidare
Disco fisso 80H-FFH
ES:BX = offset tabella segmento:RBA
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
AH = 00X
Se la funzione fallisce
Porta bandiera = impostato
AH = stato (vedi INT 13H Funzione 01H)
Commenti:
Questa funzione inizializza il settore del disco e i campi degli indirizzi di tracciamento su un disco collegato a un adattatore per disco rigido ESDI.
Il funzionamento di questa funzione è denominato formattazione di basso livello e prepara il disco per le operazioni fisiche di lettura/scrittura a livello di settore. Successivamente, il disco deve essere partizionato utilizzando il comando FDISK e poi formattato ad alto livello utilizzando il comando FORMAT per installare il file system.