Capitolo – 8
Gestione delle funzioni e degli interrupt del BIOS del disco con C
introduzione
In questo capitolo discuteremo le importanti funzioni del BIOS del disco e altre importanti funzioni che ci danno la libertà di utilizzare e gestire gli interrupt nel nostro programma con C, con il metodo semplice e breve. Queste funzioni sono il retro – osso della programmazione del recupero dati e della risoluzione dei problemi del disco. Queste sono le funzioni che rendono Il linguaggio C un “Alto – livello Assembly Language”.
Funzioni biosdisk e _bios_disk
Queste due funzioni sono la funzione più importante ai fini del ripristino dei dati e della programmazione della risoluzione dei problemi del disco. Utilizzeremo queste funzioni per la maggior parte del tempo.
Questi due sono i servizi dell'unità disco del BIOS e sono stati definiti in bios.h in cui biosdisk opera al di sotto del livello dei file nei settori non elaborati. Se queste funzioni vengono utilizzate anche con poca attenzione, possono distruggere il contenuto del file e le directory su un disco rigido. Entrambe le funzioni biosdisk e _bios_disk, utilizzano l'interrupt 0x13 per inviare le operazioni del disco direttamente al BIOS. La funzione _bios_disk è dichiarata nel programma nel modo seguente:
_bios_disk non firmato(cmd non firmato, struct diskinfo_t *dinfo);
E la dichiarazione per la funzione del disco del BIOS è la seguente:
int biosdisk(int cmd, int drive, int head, int track,
int settore, int nsects, void *buffer);
Il significato di questi parametri è stato descritto nella tabella seguente:
Parameter |
Function |
What It Is or what it does |
cmd |
Both |
Indicates the operation to perform such as read, write, verify etc.(See the description of cmd, given next) |
dinfo |
_bios_disk |
Points to a diskinfo_t structure that contains the remaining Parameters required by the operation.(see the description of diskinfo_t structure, given next) |
drive |
biosdisk |
Specifies which disk drive is to be used(0 for a:, 1for b: and 0x80 for first physical hard disk, 0x81 for second and so on.) |
head
track
sector |
biosdisk |
These specify the starting sector location from which the Operation is to be started. |
nsects |
biosdisk |
Number of sectors to read, write, verify etc. |
buffer |
biosdisk |
Memory address where data is to be read or written |
In entrambe queste funzioni, i dati vengono letti e scritti dal buffer a 512 byte per settore che è la dimensione logica del settore di un disco rigido e il valore restituito da entrambe le funzioni è il valore del registro AX impostato da la chiamata del BIOS INT 0x13H.
Se la funzione ha esito positivo, High byte = 0, significa che il completamento riuscito e low byte contiene il numero di settori letti, scritti o verificati e così via.
Ma se si verifica un errore e la funzione non va a buon fine, il valore di High byte sarà uno dei seguenti codici di errore descritti nella tabella seguente:
Value |
Description |
0x00 |
Successful completion (Not an Error!!) |
0x01 |
Bad command |
0x02 |
Address mark not found |
0x03 |
Attempt to write to write-protected disk |
0x04 |
Sector not found |
0x05 |
Reset failed (hard disk) |
0x06 |
Disk changed since last operation |
0x07 |
Drive parameter activity failed |
0x08 |
Direct memory access (DMA) overrun |
0x09 |
Attempt to perform DMA across 64K boundary
(data Boundary error or >80H sectors) |
0x0A |
Bad sector detected |
0x0B |
Bad track detected |
0x0C |
Unsupported track |
0x0D |
Invalid number of sectors on format (PS/2 hard disk) |
0x0E |
Control data address mark detected (hard disk) |
0x0F |
DMA arbitration level out of range (hard disk) |
0x10 |
Bad CRC/ECC on disk read |
0x11 |
CRC/ECC corrected data error (Not an error actually) |
0x20 |
Controller has failed |
0x31 |
No media in drive (IBM/MS INT 13 extensions) |
0x32 |
Incorrect drive type stored in CMOS (Compaq) |
0x40 |
Seek operation failed |
0x80 |
Attachment failed to respond |
0xAA |
Drive not ready (hard disk only) |
0xB0 |
Volume not locked in drive (INT 13 extensions) |
0xB1 |
Volume locked in drive (INT 13 extensions) |
0xB2 |
Volume not removable (INT 13 extensions) |
0xB3 |
Volume in use (INT 13 extensions) |
0xB4 |
Lock count exceeded (INT 13 extensions) |
0xB5 |
Valid eject request failed (INT 13 extensions) |
0xBB |
Undefined error occurred (hard disk only) |
0xCC |
Write fault occurred |
0xE0 |
Status register error |
0xFF |
Sense operation failed |
La tabella riportata di seguito rappresenta i comandi operativi che devono essere eseguiti dal parametro cmd. Prima di tutto vedremo le operazioni comuni di entrambe le funzioni.
biosdisk |
_bios_disk |
What it does |
0 |
_DISK_RESET |
Resets disk system, forcing the drive controller to do a hard reset. Ignore all other parameters |
1 |
_DISK_STATUS |
Returns the status of the last disk operation. Ignores all other parameters |
2 |
_DISK_READ |
Reads one or more disk sectors into memory |
3 |
_DISK_WRITE |
Writes one or more disk sectors from memory |
4 |
_DISK_VERIFY |
Verifies one or more sectors |
5 |
_DISK_FORMAT |
Formats a track |
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 hanno lo stesso effetto, ma si consiglia di avere l'abitudine di usare l'opzione delle parole 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 il cmd = _DISK_RESET la funzione ripristina 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 le funzioni 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:
Parameter |
What It Does |
head
track
sector |
These three specify the location of starting sector for the specified operation. (minimum possible values may be head = 0, track = 0 and sector =1) |
nsectors |
This specifies the number of sectors to read or write |
buffer |
It points to the buffer where data is to be read and written |
Se il valore di cmd è = 5 (_DISK_FORMAT), biosdisk e _bios_disk utilizzano i seguenti parametri come in base alla descrizione nella tabella. Si consiglia sempre di prestare attenzione mentre si utilizza _DISK_FORMAT e di sapere cosa si intende fare. La mancanza di conoscenza o anche un piccolo errore possono farti affrontare una grande perdita di dati.
Parameter |
What It Does |
head
track |
These specify the location of the track to format |
buffer |
It points to a table of sector headers to be written on the named track |
Ci sono alcuni valori aggiuntivi di cmd che vengono utilizzati solo dalle funzioni del biosdisk. Questi valori di cmd sono consentiti solo per XT, AT, PS/2 e compatibili. I valori sono stati descritti nella tabella riportata di seguito:
cmd |
What it does |
6 |
Formats a track and sets bad sector flags |
7 |
Formats the drive beginning at a specific track |
8 |
Returns the current drive parameters in first 4 bytes of buffer |
9 |
Initializes drive-pair characteristics |
10 |
Does a long read (512 plus 4 extra bytes per sector) |
11 |
Does a long write (512 plus 4 extra bytes per sector) |
12 |
Does a disk seek |
13 |
Alternates disk reset |
14 |
Reads sector buffer |
15 |
Writes sector buffer |
16 |
Tests whether the named drive is ready |
17 |
Recalibrates the drive |
18 |
Controller RAM diagnostic |
19 |
Drive diagnostic |
20 |
Controller internal diagnostic |
Struttura diskinfo_t
La struttura diskinfo_t è utilizzata dalla funzione _bios_disk. La descrizione della struttura è la seguente:
struct diskinfo_t {
unità senza segno, testa, pista, settore, nsettori;
vuoto lontano *buffer;
};
Dove unità specifica l'unità disco che deve essere utilizzata. Ricorda sempre che per i dischi rigidi viene specificata l'unità fisica, non la partizione del disco. Se desideri utilizzare le partizioni, il programma applicativo deve anche interpretare le informazioni sulla tabella delle partizioni di quel disco stesso.
Il valore di testa, traccia e settore specifica la posizione del settore iniziale per l'operazione. nsectors specifica il numero di settori da leggere o scrivere e il 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.
Il valore per la specifica dell'unità disco da utilizzare nelle funzioni biosdisk e _bios_disk è stato fornito nella tabella seguente:
drive Value |
Disk drive to use |
0 |
First floppy-disk drive |
1 |
Second floppy-disk drive |
2 |
Third floppy-disk drive |
.... |
(and so on) |
0x80 |
First hard-disk drive |
0x81 |
Second hard-disk drive |
0x82 |
Third hard-disk drive |
.... |
(and so on) |
Basta teoria! Vediamo ora alcune cose pratiche e qualche esempio di queste funzioni. L'esempio seguente legge i settori di entrambi i lati di quattro tracce del floppy e memorizza il contenuto nel file, specificato dall'utente. Non importa se hai cancellato 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 la codifica dei programmi .c o altri file di testo (in modo da poter comprendere il contenuto dei file) occupando circa 73 KB (dati memorizzati in quattro tracce, due lati e 18 settori in ciascuna traccia. Ogni settore è di 512 byte). Il programma è stato sviluppato per dimostrare l'esempio. Tuttavia puoi modificarlo e svilupparlo per recuperare i dati.
/* Programma per leggere 4 tracce (0, 1, 2 e 3) di un floppy e scriverne il contenuto nel file specificato */
#include <bios.h>
#include <stdio.h>
#include<conio.h>
void main(void)
{
int head,track;
int result,i,sector;
char filename[80];
char *buffer;
struct diskinfo_t dinfo;
static char dbuf[512];
FILE *tt;
clrscr();
/// Verifica se l'unità è pronta o meno \\\
if(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf(" Drive A: Not Ready:\n Insert disk into Drive A:
and press any key\n");
getch();
}
/* Ottieni il nome del file per memorizzare i dati dei Settori di
il disco */
printf("\nEnter the Destination File name with full Path
to store the data \n\n >");
gets(filename);
if((tt= fopen(filename, "wb"))==NULL)
{
printf("Could not open the File!!!");
getch();
}
for(track=0;track<4;track++)
{
for(head=0; head<=1;head++)
{
for(sector=1;sector<=18;sector++)
{
dinfo.drive = 0; /* drive number for A: */
dinfo.head = head; /* disk head number */
dinfo.track = track; /* track number */
dinfo.sector = sector; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
/// Mostra lo stato \\\
gotoxy(10,10); printf("Reading Data from: Head=%d
Track=%d Sector=%d",
head, track, sector);
fprintf(tt,"\n Data read from: Head=%d Track=%d Sector=%d\n",
head, track, sector);
/// Leggi i settori specificati \\\
result = _bios_disk(_DISK_READ, &dinfo);
/// Archivia i contenuti nel file specificato \\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Stampa messaggio di errore sullo schermo e nel file per Errore durante la lettura di un settore */
else
{
printf("\n Can not read at Head= %d Track= %d
Sector= %d\n",head,track,sector);
fprintf(tt,"\n Can not read at Head= %d Track= %d
Sector =%d\n",head,track,sector);
}
}
}
}
fclose(tt);
}
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 dell'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 del disco assoluti e la funzione abswrite scrive i settori del disco assoluti. La funzione absread utilizza DOS interrupt 0x25 per leggere specifici settori del disco e la funzione abswrite utilizza DOS interrupt 0x26 per scrivere specifici settori del disco.
Le operazioni di lettura o scrittura assoluta procedono in modo sequenziale incrementando il settore(i) passo dopo passo e sono completamente prive di numeri di testine e tracce ecc. è compito del BIOS del computer tradurre i settori assoluti nei rispettivi numero di pista, testa e settore.
Le operazioni di lettura e scrittura assolute sono consigliate in tali programmi in cui eseguiremo operazioni di lettura/scrittura sull'intero disco e vogliamo evitare codifiche aggiuntive e loop nel nostro 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 utilizzato in modo improprio, abswrite può sovrascrivere file, directory e FAT.
La dichiarazione della funzione absread è la seguente:
int absread(int drive, int nsects, long lsect,
void *buffer);
e la funzione abswrite è dichiarata come segue:
int abswrite(int drive, int nsects, long lsect,
void *buffer);
Dove il significato dei parametri è il seguente:
Param. |
What It Is/Does |
drive |
Drive number to read (or write): 0 = A, 1 = B, etc. |
nsects |
Number of sectors to read (or write) |
lsect |
Beginning logical sector number |
buffer |
Memory address where the data is to be read (or written) |
In caso di successo, entrambe le funzioni restituiscono 0. Quando si verifica un errore, entrambe restituiscono -1 e impostano l'errore n. al valore del registro AX restituito dalla chiamata di sistema.
Il numero di settori per l'operazione di lettura o scrittura è limitato a 64 KB o alla dimensione del buffer, a seconda di quale sia la minore. Tuttavia impareremo l'uso della memoria enorme nei prossimi capitoli per superare il limite di memoria 64K, per sviluppare un programma molto veloce.
|
Interrompere la gestione con C
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'interrupt MS-DOS con valori di registro di segmento.
- intdos: richiama il servizio MS-DOS utilizzando registri diversi da DX e AL
- intdosx: richiama il servizio MS-DOS con valori di registro del segmento.
- segredi: legge i registri dei segmenti
Discuteremo queste funzioni in dettaglio. Prima di tutto discutiamo alcune strutture e unioni predefinite che vengono utilizzate frequentemente o necessariamente con queste funzioni.
Struttura SREG
Questa struttura è stata definita in dos.h ed è una struttura dei registri di segmento passati e riempiti dalle funzioni, int86x, intdosx e segread. La dichiarazione della struttura è la seguente:
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
Unione REGS
REGS è l'unione di due strutture. L'unione REGS è stata definita dos.h ed è usata per passare informazioni da e verso le funzioni, int86, int86x, intdos e intdosx. La dichiarazione del sindacato è la seguente:
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Strutture BYTEREGS e WORDREGS
Le strutture BYTEREGES e WORDREGS sono state definite in dos.h e sono usate per memorizzare registri di byte e word. La struttura WORGREGS consente all'utente di accedere ai registri della CPU come quantità a 16 bit dove la struttura BYTEREGES dà l'accesso ai singoli registri a 8 bit.
La struttura BITEREG è dichiarata come segue:
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
E la struttura WORDREGS è dichiarata come segue:
struct WORDREGS {
unsigned int 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 vengono impostati sui valori desiderati e queste funzioni vengono chiamate per richiamare gli interrupt di MS-DOS. La dichiarazione della funzione int86 è la seguente:
int int86(int intno, union REGS *inregs,
union REGS *outregs);
int86x è la variazione della funzione int86. Si dichiara come segue:
int int86x(int intno, union REGS *inregs,
union 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 puoi invocare un interrupt software 8086 che assume un valore di DS diverso dal segmento di dati predefinito e/o accetta un argomento in ES.
Queste funzioni copiano i valori dei registri dagli inreg nei registri prima dell'esecuzione dell'interrupt software. La funzione int86x copia anche i valori segregs->ds e segregs->es nei registri corrispondenti prima di eseguire l'interrupt software. Questa funzione 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'interrupt software.
Le funzioni copiano i valori del registro corrente in outregs, lo stato del carry flag nel campo x.cflag in outregs e il valore del registro 8086 flag 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'interrupt 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 stati nella tabella riportata di seguito:
16-bit |
8-bit |
C language |
Assembly language |
C language |
Assembly language |
inregs.x.ax |
AX |
inregs.h.al |
AL |
|
|
inregs.h.ah |
AH |
inregs.x.bx |
BX |
inregs.h.bl |
BL |
|
|
inregs.h.bh |
BH |
inregs.x.cx |
CX |
inregs.h.cl |
CL |
|
|
inregs.h.ch |
CH |
inregs.x.dx |
DX |
inregs.h.dl |
DL |
|
|
inregs.h.dh |
DH |
inregs.x.si |
SI |
|
|
inregs.x.di |
DI |
|
|
inregs.x.cflag |
CF |
|
|
Vediamo gli esempi delle funzioni int86 e int86x. Il seguente programma Scansiona ogni settore del floppy disk e stampa lo stato di ogni settore sullo schermo.
/* Programma per scansionare ogni settore del floppy disk e stamparne lo stato */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
/// Inizializzazione del disco ripristinando il sistema del disco \\\
gotoxy(10,2); printf("Initializing The Disk...");
for(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Function Number
inregs.h.dl=0x00; // Floppy Disk
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("The Status of the Disk is as....\n");
/* Scansiona il Floppy Disk da 0 a 79 Tracce (Totale Tracce 80) */
for(track=0;track<=79;track++)
for(head=0;head<=1;head++)
for(sector=1;sector<=18;sector++)
{
inregs.h.ah = 0x04; /// function Number
inregs.h.al = 1; /// Number of sectors
inregs.h.dl = 0x00; /// Floppy Disk
inregs.h.ch = track;
inregs.h.dh = head;
inregs.h.cl = sector;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// Stampa lo stato del settore scansionato \\\\
switch(outregs.h.ah)
{
case 0x00:
cprintf("STATUS: No Error!!");
break;
case 0x01:
cprintf("STATUS: Bad command");
break;
case 0x02:
cprintf("STATUS: Address mark not found");
break;
case 0x03:
cprintf("STATUS: Attempt to write to
write-protected disk");
break;
case 0x04:
cprintf("STATUS: Sector not found");
break;
case 0x05:
cprintf("STATUS: Reset failed (hard disk)");
break;
case 0x06:
cprintf("STATUS: Disk changed since last
operation");
break;
case 0x07:
cprintf("STATUS: Drive parameter activity
failed");
break;
case 0x08:
cprintf("STATUS: Direct memory access (DMA)
overrun");
break;
case 0x09:
cprintf("STATUS: Attempt to perform DMA across
64K boundary");
break;
case 0x0A:
cprintf("STATUS: Bad sector detected");
break;
case 0x0B:
cprintf("STATUS: Bad track detected");
break;
case 0x0C:
cprintf("STATUS: Media type not found");
break;
case 0x0D:
cprintf("STATUS: Invalid number of sectors on
format (hard disk)");
break;
case 0x0E:
cprintf("STATUS: Control data address mark
detected (hard disk)");
break;
case 0x0F:
cprintf("STATUS: DMA arbitration level out of
range (hard disk)");
break;
case 0x10:
cprintf("STATUS: Bad CRC/ECC on disk read");
break;
case 0x11:
cprintf("STATUS: CRC/ECC corrected data error");
break;
case 0x20:
cprintf("STATUS: Controller has failed");
break;
case 0x31:
cprintf("STATUS: No media in drive (IBM/MS INT 13H
extensions)");
break;
case 0x32:
cprintf("STATUS: Incorrect drive type stored in
CMOS (Compaq)");
break;
case 0x40:
cprintf("STATUS: Seek operation failed");
break;
case 0x80:
cprintf("STATUS: Attachment failed to respond
(Disk Timed-out)");
break;
case 0xAA:
cprintf("STATUS: Drive not ready (hard disk
only)");
break;
case 0xB0:
cprintf("STATUS: Volume not locked in drive (INT
13H extensions)");
break;
case 0xB1:
cprintf("STATUS: Volume locked in drive (INT 13H extensions)");
break;
case 0xB2:
cprintf("STATUS: Volume not removable (INT 13H
extensions)");
break;
case 0xB3:
cprintf("STATUS: Volume in use (INT 13H
extensions)");
break;
case 0xB4:
cprintf("STATUS: Lock count exceeded (INT 13H
extensions)");
break;
case 0xB5:
cprintf("STATUS: Valid eject request failed (INT
13H extensions)");
break;
case 0xBB:
cprintf("STATUS: Undefined error occurred (hard
disk only)");
break;
case 0xCC:
cprintf("STATUS: Write fault occurred");
break;
case 0xE0:
cprintf("STATUS: Status register error");
break;
case 0xFF:
cprintf("STATUS: Sense operation failed");
break;
default: cprintf("STATUS: UNKNOWN Status CODE");
}
printf("\nCurrent position= Track:%d Head:%d Sector:%d \n",
track,head,sector);
}
gotoxy(10,24);printf("Scanning Completed!! Press Any Key TO
Exit..");
getch();
}
Il programma mostra l'esempio di utilizzo delle funzioni int86 e int86x. In questo programma la funzione int86 inizializza il disco ripristinando il sistema del disco, utilizzando la funzione 00H di INT 13H. La funzione int86x verifica ogni settore del floppy (1.44Mb, 3½ floppy disk) da entrambi i lati, da 0 a 79 tracce (totale 80 tracce) utilizzando la funzione 04H di INT 13H.
Funzione di separazione
Questa funzione è stata definita in dos.h. Questa funzione legge i registri dei segmenti. La dichiarazione della funzione è la seguente:
void segread(struct SREGS *segp);
dove segread inserisce i valori correnti dei registri di segmento nella struttura *segp. Nulla viene restituito dalla funzione e la chiamata è destinata all'uso con intdosx e int86x. vediamo un esempio
#include <stdio.h>
#include <dos.h>
void main()
{
struct SREGS segs;
segread(&segs);
printf("Current segment register settings\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
getch();
}
E l'output del programma sarà qualcosa del genere:
Current segment register settings
CS: EED DS: 10BA
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 di segmento.
La dichiarazione della funzione intdos è la seguente:
int intdos(union REGS *inregs, union REGS *outregs);
e la dichiarazione della funzione intdosx è la seguente:
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
Le funzioni intdos e intdosx eseguono l'interrupt DOS 0x21 per richiamare una funzione DOS specificata. Il valore di inregs->h.ah specifica la funzione DOS da invocare. La funzione intdosx copia anche i valori segregs ->ds e segregs ->es nei registri corrispondenti prima di richiamare la funzione DOS e quindi ripristinare 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 puoi invocare una funzione DOS che prende un valore di DS diverso dal segmento dati predefinito e/o accetta un argomento in ES.
Entrambe le funzioni restituiscono il valore di 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 restituisce, 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 8086 flags nel campo x.flags in outregs. Sia gli inreg che gli outreg possono puntare alla stessa struttura. Vediamo gli esempi di queste funzioni.
Di seguito è riportato l'esempio dell'uso della funzione intdos. Questo programma ottiene le informazioni selezionate sull'unità disco floppy (disco floppy da 1,44 Mb, 3½ pollici). Questo programma fornisce le informazioni sull'allocazione di un floppy disk.
/* Le informazioni sull'allocazione dell'unità per l'utilizzo del disco */
#include <dos.h> /* for intdos() and union REGS */
#include <stdio.h> /* for printf() */
union REGS inregs, outregs;
void main()
{
inregs.h.ah = 0x36; /* get disk free space
function number */
inregs.h.dl = 0x01; /* drive A: */
intdos(&inregs, &outregs);
printf("%d sectors/cluster,\n%d clusters,\n%d bytes/sector,
\n%d total clusters",
outregs.x.ax,outregs.x.bx,
outregs.x.cx, outregs.x.dx);
getch();
}
E l'output del programma sarà così:
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
Ora vediamo un esempio della funzione intdosx. L'esempio seguente mostra l'uso della funzione intdosx. Il programma emette una stringa sullo standard output.
/* Il programma per l'output di 'string' allo standard
produzione. */
#include <dos.h>
union REGS inregs, outregs;
struct SREGS segregs;
char far *string = "this string is not in the
default data segment$";
void main()
{
inregs.h.ah = 0x09; /* function number */
inregs.x.dx = FP_OFF(string);/*DS:DX is far
address of 'string */
segregs.ds = FP_SEG(string);
intdosx(&inregs, &outregs, &segregs);
getch();
}
E l'output del programma sarà il seguente:
questa stringa non è nel segmento di dati predefinito |
Qui stiamo stampando la stringa data con la funzione intdosx, dalla funzione 09H di INT 21H. Va sempre tenuto presente che la stringa data deve sempre terminare con il carattere “$”.
Come conoscere il numero del disco rigido fisico
Il numero del disco rigido fisico è una cosa molto importante e dovrebbe essere scritto esattamente. La specifica dell'unità illegale può causare una grave perdita di dati. Dobbiamo essere sicuri del numero di unità durante il ripristino 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 più generale, i numeri dell'unità fisica sono forniti in base allo stato dell'allegato del disco, tuttavia in alcuni casi o casi speciali potrebbe dipendere dalla procedura di avvio del sistema operativo o impostazioni di avvio.
L'idea più generalizzata per il Numero di unità fisica fornita 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 prossimi capitoli, sulla configurazione del disco. Dopo esserti accertato, dovresti 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 i due dischi sono collegati al sistema, uno è master primario e un altro è master secondario, la prima preferenza sarà data al master primario (e poi allo slave primario se disponibile) e poi al master secondario ( e poi allo slave secondario se disponibile e così via) e il numero fisico verrà fornito in base alle loro preferenze.
Supponiamo che il tuo sistema supporti un massimo di quattro dischi rigidi alla volta. Tutti e quattro i dischi rigidi possono essere collegati come indicato di seguito:
Primary Master |
Primary Slave |
Secondary Master |
Secondary Slave |
Ora consideriamo alcuni casi per il numero di unità di unità fisiche. Qui presumo che tu abbia collegato i dischi con le corrette impostazioni del ponticello come menzionato dal produttore del disco e nelle corrette impostazioni Master–Slave:
- 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:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 83H. In this case the Hard Disk is called the Fourth Hard Disk. |
- Se al sistema sono collegati tre dischi rigidi: se al sistema sono collegati tre dischi rigidi, i numeri delle unità fisiche saranno quelli in base alle loro preferenze di collegamento. I seguenti esempi rappresentano alcune delle disposizioni:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk Not Present |
------------------- |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk Not Present |
------------------- |
Primary Slave |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
- Se due dischi rigidi sono collegati al sistema: Allo stesso modo, se due dischi rigidi sono collegati al sistema, i numeri delle unità fisiche saranno quelli in base alle loro preferenze di collegamento. Il seguente esempio lo illustra:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
- Se al sistema è collegato un disco rigido singolo: Non pensare, se è disponibile un solo disco, il numero dell'unità fisica sarà 80H.
Interruzione 13H (INT 13H), funzioni del driver del disco del BIOS ROM
Qui è stata fornita la descrizione delle funzioni INT 13H. Queste funzioni dovrebbero essere apprese con attenzione, poiché l'uso improprio di queste funzioni o l'uso incauto o mancanza 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 tuo programma e a rendere la tua programmazione semplice e facile.
INT 13H (0x13)
Funzione 00H (0x00) Ripristina il sistema del disco
Call with AH = 00H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function is successful
Carry flag = clear
AH = 00H
If function is unsuccessful
Carry flag = set
AH = status
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 un errore di lettura, scrittura, verifica o formattazione del disco floppy prima di riprovare l'operazione. Se la funzione viene richiamata con un'unità disco fissa (cioè selezionando DL>=80H), il controller del floppy disk e quindi il controller del disco fisso vengono ripristinati.
INT 13H (0x13)
Funzione 01H (0x01) Ottieni lo stato del sistema del disco
Call with: AH = 01H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: AH = 00H
AL = status of previous disk operation
(See the table given before for error
and status codes description).
Commenti:
Restituisce lo stato dell'operazione più recente sul disco
INT 13H (0x13)
Funzione 02H (0x02) Leggi settore
Call with: AH = 02H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES:BX = segmento: offset del buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione legge uno o più settori dal disco alla memoria. Sui dischi fissi, i 2 bit superiori del numero del cilindro a 10 bit vengono inseriti nei 2 bit superiori del registro CL.
INT 13H (0x13)
Funzione 03H (0x03) Scrivi settore
Call with: AH = 03H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sector transferred
If function unsuccessful
Carry flag = set
AH = status
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 inseriti nei 2 bit superiori del registro CL.
INT 13H (0x13)
Funzione 04H (0x04) >> Verifica settore
Call with: AH = 04H
AL = number of sectors
CH = cylinder
CL = sector
DH = drive
00H-7FH floppy disk
80H-FFH fixed drive
ES: BX = segment: offset of buffer
Returns: If function is successful
Carry flag = clear
AH = 00H
AL = number of sectors verified
If function is unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione verifica i campi indirizzo di uno o più settori. Nessun dato viene trasferito alla o dalla memoria mediante questa operazione. Sui dischi fissi, i 2 bit superiori del numero del cilindro a 10 bit vengono riposizionati nei 2 bit superiori del registro CL.
Questa funzione può essere utilizzata per verificare se un supporto leggibile è in un'unità floppy. Il programma richiedente dovrebbe ripristinare il sistema del floppy disk (INT 13H Function 00H) e ripetere l'operazione tre volte prima di presumere che non sia presente un floppy disk leggibile. È consigliato nella maggior parte delle operazioni di inizializzazione del floppy.
INT 13H (0x13)
Funzione 05H (0x05) >> Formatta traccia
Call with: AH = 05H
AL = interleave (PC/XT fixed disks)
CH = cylinder
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of address field list
(Except PC/XT fixed disk)
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
Commenti:
Inizializza i campi dell'indirizzo del settore del disco e delle tracce sulla traccia specificata. Sui floppy disk, l'elenco dei campi degli indirizzi è costituito da una serie di voci di 4 byte, una voce per settore. Il formato è stato indicato nella tabella seguente.
Sui dischi fissi, i 2 bit superiori del numero del cilindro da 10 bit vengono inseriti nei 2 bit superiori del registro CL.
Byte |
Contents |
0 |
Cylinder |
1 |
Head |
2 |
Sector |
3
|
Sector-size code
Value |
Description |
00H |
128 Byte per sector |
01H |
256 Byte per sector |
02H |
512 Byte per sector |
03H |
1024 Byte per sector |
|
INT 13H (0x13)
Funzione 06H (0x06) >> Formatta cattiva traccia
Call with: AH = 06H
AL = interleave
CH = cylinder
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione è definita solo per unità disco fisso PC/XT. Inizializza una traccia, scrivendo campi indirizzo disco e settori dati e impostando flag di settore danneggiato.
INT 13H (0x13)
Funzione 07H (0x07) >> Formatta unità
Call with: AH = 07H
AL = interleave
CH = cylinder
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
Commenti:
Questa funzione è definita solo per unità disco fisso PC/XT. Formatta l'intera unità, scrivendo i campi dell'indirizzo del disco e i settori dei dati, a partire dal cilindro specificato.
INT 13H (0x13)
Funzione 08H (0x08) >> Ottieni parametri azionamento
Call with: AH = 08H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
BL = drive type (PC/AT and PS/2 floppy
disk)
Value |
Description |
01H |
360KB, 40 track, 5.25” |
02H |
1.2MB, 80 track, 5.25” |
03H |
720KB, 80 track, 3.5” |
04H |
1.44MB, 80 track, 3.5” |
CH = low 8 bits of maximum cylinder
number
CL = bits 6-7 high order 2 bits of maximum
cylinder number bits 0-5 maximum
sector number
DH = maximum head number
DL = number of drives
ES: DI = segment: offset of disk drive
parameter table
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione restituisce vari parametri per l'unità specificata. Il valore restituito nel registro DL riflette il numero reale di unità fisiche collegate all'adattatore per l'unità richiesta.
INT 13H (0x13)
Funzione 09H (0x09) >> Inizializza le caratteristiche fisse del disco
Call with: AH = 09H
DL = drive
80H-FFH fixed disk
On the PC/XT Vector for INT 41H
must point to disk parameter block or, on the PC/AT and PS/2
Vector for INT 41H must point to disk
parameter block for drive 0
Vector for INT 46H must point to disk
parameter block for drive 1
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
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 del BIOS della ROM. La funzione è supportata solo su disco fisso. Il formato del blocco parametri per PC e dischi fissi PC/XT è il seguente:
Byte(s) |
Contents |
00H-01H |
Maximum number of cylinders |
02H |
Maximum number of heads |
03H-04H |
Starting reduced write current cylinder |
05H-06H |
Starting write pre compensation cylinder |
07H |
Maximum ECC burst length |
08H
|
Drive option
Bit(s) |
Significance (if set) |
0 – 2 |
drive option |
3 – 5 |
reserved (0) |
6 |
disable ECC entries |
7 |
disable disk-access retries |
|
09H |
Standard time-out value |
0AH |
Time-out value for format drive |
0BH |
Time-out value for check drive |
0CH-0FH |
Reserved |
Il formato del blocco dei parametri per i dischi fissi PC/AT e PS/2 è il seguente:
Byte(s) |
Contents |
00H_01H |
maximum number of cylinders |
02H |
maximum number of heads |
03H-04H |
Reserved |
05H-06H |
starting write pre compensation cylinder |
07H |
maximum ECC burst length |
08H |
Drive options
Bit(s) |
Significance (if set) |
0 – 2 |
not used |
3 |
more than 8 heads |
4 |
not used |
5 |
manufacturer’s defect map present at
maximum cylinder +1 |
6 – 8 |
nonzero (10, 01,or 11) if retries disabled |
|
09H-0BH |
Reserved |
0CH-0DH |
landing zone cylinder |
0EH |
sector per track |
0FH |
Reserved |
INT 13H (0x13)
Funzione 0A H (0x0A o 10) >> Leggi il settore lungo
Call with: AH = 0AH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione legge uno o più settori dal disco alla memoria insieme a un codice ECC (Error Correcting Code) da 4 byte per ciascun settore. A differenza della normale funzione di lettura del settore (INT 13H (0x13) Funzione 02H), gli errori ECC non vengono corretti automaticamente. I trasferimenti a più settori vengono terminati dopo qualsiasi settore con un errore di lettura.
Questa funzione è supportata solo su dischi fissi. I 2 bit superiori del numero del cilindro a 10 bit vengono inseriti nei 2 bit superiori del registro CL.
INT 13H (0x13)
Funzione 0BH (0x0B o 11) >> Scrivi il settore lungo
Call with:AH = 0BH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione scrive uno o più settori dalla memoria al disco. I dati di ciascun settore devono essere seguiti dal codice ECC a 4 byte. I 2 bit superiori del numero del cilindro a 10 bit vengono inseriti nei 2 bit superiori del registro CL. Questa funzione è supportata solo su dischi fissi.
INT 13H (0x13)
Funzione 0CH (0x0C o 12) >> Cerca
Call with:AH = 0CH
CH = lower 8 bits of cylinder
CL = upper 2 bits of cylinder in bits 6-7
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
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 sono posti nei 2 bit superiori del registro CL. Questa funzione è supportata solo su dischi fissi.
INT 13H (0x13)
Funzione 0DH (0x0D o 13) >> Ripristina sistema disco fisso
Call with:AH = 0DH
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
Commenti:
Questa funzione ripristina il controller del disco fisso, ricalibra le unità collegate, sposta il braccio di lettura/scrittura sul cilindro 0 e si prepara per l'I/O del disco successivo.
INT 13H (0x13)
Funzione 0EH (0x0E o 14) >> Leggi buffer di settore
Call with:AH = 0EH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione trasferisce il contenuto del buffer di settore interno dell'adattatore per disco fisso alla memoria di sistema. Nessun dato viene letto dall'unità disco fisico.
INT 13H (0x13)
Funzione 0FH (0x0F o 15) >> Scrivi buffer di settore
Call with:AH = 0FH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
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 deve essere chiamata per inizializzare il contenuto del buffer di settore prima di formattare l'unità con INT 13H Funzione 05H.
INT 13H (0x13)
Funzione 10H (0x10 o 16) >> Ottieni lo stato dell'unità
Call with:AH = 10H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione verifica se l'unità disco fisso specificata è operativa e restituisce lo stato dell'unità. Questa funzione è supportata solo su dischi fissi.
INT 13H (0x13)
Funzione 11H (0x11 o 17) >> Ricalibra unità
Call with:AH =11H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
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.
INT 13H (0x13)
Funzione 12H (0x12 o 18) >> RAM controller
diagnostico
Chiama con:AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione fa sì che l'adattatore del disco fisso esegua un test diagnostico integrato sul buffer di settore interno, indicando se il test è stato superato dallo stato restituito.
INT 13H (0x13)
Funzione 13H (0x13 o 19) >> Diagnostica unità controller
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione fa sì che l'adattatore fisso esegua test diagnostici interni dell'unità collegata, indicando se il test è stato superato dallo stato restituito.
INT 13H (0x13)
Funzione 14H (0x14 o 20) >> Controller interno
diagnostico
Chiama con:AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione fa sì che l'adattatore del disco fisso esegua un autotest diagnostico integrato, indicando se il test è stato superato dallo stato restituito.
INT 13H (0x13)
Funzione 15H (0x15 o 21) >> Ottieni tipo di disco
Call with:AH = 15H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = drive type code
00H se nessuna unità è presente
01H se l'unità floppy disk non supporta il cambio riga
02H se unità floppy disk con supporto per cambio riga
03H se disco fisso
|
And, if fixed disk (AH =03H)
CX: DX = number of 512-byte sectors
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione restituisce un codice che indica il tipo di floppy o disco fisso a cui fa riferimento il codice del drive specificato.
INT 13H (0x13)
Funzione 16H (0x16 o 22) >> Ottieni la modifica del disco
stato
Call with: AH = 16H
DL = drive
00H-7FH floppy disk
Returns:If change line inactive and disk has not been changed
Carry flag = clear
AH = 00H
If change line active and disk may have been changed
Carry flag = set
AH = 06H
Commenti:
Questa funzione restituisce lo stato della riga di modifica, indicando se il disco nell'unità potrebbe essere stato sostituito dall'ultimo accesso al disco. Se questa funzione ritorna con il flag di riporto impostato, il disco non è stato necessariamente cambiato e la linea di cambio può essere attivata semplicemente sbloccando e bloccando lo sportello del drive del disco senza rimuovere il floppy disk.
INT 13H (0x13)
Funzione 17H (0x17 o 23) >> Imposta il tipo di disco
Call with: AH = 17H
AL = floppy disk type code
Value |
Description |
00H |
Not used |
01H |
320/360 KB floppy disk in 360 KB drive |
02H |
320/360 KB floppy disk in 1.2 MB drive |
03H |
1.2 MB floppy disk in 1.2 MB drive |
04H |
720 KB floppy disk in 720 KB drive |
SL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione seleziona un tipo di floppy disk per l'unità specificata.
INT 13H (0x13)
Funzione 18H (0x18 o 24) >> Imposta il tipo di supporto per il formato
Call with: AH = 18H
CH = number of cylinders
CL = sector per track
DL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
ES: DI = segment: offset of disk
parameter table for media type
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione seleziona le caratteristiche del supporto per l'unità specificata, pertanto nell'unità deve essere presente un floppy disk.
INT 13H (0x13)
Funzione 19H (0x19 o 25) >> Parcheggia teste
Call with: AH = 19H
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Commenti:
Questa funzione sposta il braccio di lettura/scrittura su una traccia non utilizzata per la memorizzazione dei dati, in modo che i dati non vengano danneggiati allo spegnimento dell'unità.
INT 13H (0x13)
Funzione 1AH (0x1A o 26) >> Formatta unità ESDI
Call with: AH = 1AH
AL = Relative Block Address (RBA)
defect table count
0, if no RBA table
>0, if RBA table used
CL = format modifier bits
Bit(s) |
Significance (if set) |
0 |
Ignore primary defect map |
1 |
Ignore secondary defect map |
2 |
Update secondary defect map |
3 |
Perform extended surface analysis |
4 |
Generate periodic interrupt |
5-7 |
Reserved (must be 0) |
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of RBA table
Returns: If function successfu
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
Commenti:
Questa funzione inizializza il settore del disco e tiene traccia dei campi dell'indirizzo su un'unità collegata all'adattatore per unità disco fisso ESDI.
L'operazione di questa funzione è chiamata formattazione di basso livello e prepara il disco per operazioni di lettura/scrittura fisica a livello di settore. L'unità deve essere successivamente partizionata con il comando FDISK e quindi formattata ad alto livello con il comando FORMAT per installare un file system.
Pagina modificata il: 10/03/2022