Κεφάλαιο – 8
Λειτουργίες Disk-BIOS και χειρισμός διακοπών με το C
Εισαγωγή
Σε αυτό το κεφάλαιο θα συζητήσουμε τις σημαντικές λειτουργίες του Disk-BIOS και άλλες σημαντικές λειτουργίες που μας δίνουν την ελευθερία να χρησιμοποιούμε και να χειριζόμαστε διακοπές στο πρόγραμμά μας με το C, με την εύκολη και σύντομη μέθοδο. Αυτές οι λειτουργίες είναι το πίσω μέρος – τον προγραμματισμό ανάκτησης δεδομένων και αντιμετώπισης προβλημάτων δίσκου. Αυτές είναι οι συναρτήσεις που κάνουν Η γλώσσα C σε “Υψηλή – Γλώσσα συναρμολόγησης επιπέδου”.
biosdisk και _bios_disk Functions
Αυτές οι δύο λειτουργίες είναι η πιο σημαντική λειτουργία για τον σκοπό μας για την ανάκτηση δεδομένων και τον προγραμματισμό αντιμετώπισης προβλημάτων δίσκου. Θα χρησιμοποιούμε αυτές τις λειτουργίες τις περισσότερες φορές.
Αυτές οι δύο είναι οι υπηρεσίες μονάδας δίσκου BIOS και έχουν οριστεί στο bios.h όπου το biosdisk λειτουργεί κάτω από το επίπεδο των αρχείων σε ακατέργαστους τομείς. Εάν αυτές οι λειτουργίες χρησιμοποιούνται ακόμη και με λίγη έλλειψη προσοχής, μπορεί να καταστρέψει τα περιεχόμενα του αρχείου και τους καταλόγους σε έναν σκληρό δίσκο. Τόσο οι λειτουργίες biosdisk όσο και _bios_disk, χρησιμοποιήστε διακοπή 0x13 για να εκδώσετε λειτουργίες δίσκου απευθείας στο BIOS. Η συνάρτηση _bios_disk δηλώνεται στο πρόγραμμα με τον ακόλουθο τρόπο:
unsigned _bios_disk(unsigned cmd, struct diskinfo_t *dinfo);
And the declaration for the bios disk function is as follows:
int biosdisk(int cmd, int drive, int head, int track,
int sector, int nsects, void *buffer);
Η σημασία αυτών των παραμέτρων έχει περιγραφεί στον ακόλουθο πίνακα:
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 |
Και στις δύο αυτές συναρτήσεις, τα δεδομένα διαβάζονται και εγγράφονται από την προσωρινή μνήμη στα 512 byte ανά τομέα που είναι το λογικό μέγεθος του τομέα ενός σκληρού δίσκου και η τιμή που επιστρέφεται και από τις δύο συναρτήσεις είναι η τιμή του καταχωρητή AX που ορίζεται από το INT 0x13H Κλήση BIOS.
Εάν η συνάρτηση είναι επιτυχής, High byte = 0, αυτό σημαίνει ότι η επιτυχής ολοκλήρωση και το χαμηλό byte περιέχει τον αριθμό των τομέων που διαβάστηκαν, εγγράφηκαν ή επαληθεύτηκαν και ούτω καθεξής.
Αλλά εάν υπάρχει κάποιο σφάλμα και η λειτουργία δεν είναι επιτυχής, η τιμή του High byte θα είναι ένας από τους ακόλουθους κωδικούς σφάλματος που περιγράφονται στον παρακάτω πίνακα:
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 |
Ο πίνακας που δίνεται στη συνέχεια αντιπροσωπεύει τις εντολές λειτουργίας που πρέπει να εκτελεστούν από την παράμετρο cmd. Πρώτα από όλα θα δούμε τις κοινές πράξεις και των δύο συναρτήσεων.
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 |
Αν και είστε ελεύθεροι να χρησιμοποιήσετε είτε cmd = 0, 1, 2, 3, 4,5 ή cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT και οι δύο επιλογές έχουν το ίδιο αποτέλεσμα, αλλά συνιστάται να έχετε τη συνήθεια να χρησιμοποιείτε την επιλογή λέξεων όπως cmd = _DISK_FORMAT αντί για cmd = 5 γιατί μπορεί να σας βοηθήσει να αποφύγετε σφάλματα που ενδέχεται να προκύψουν εάν έχετε πληκτρολογήσει λάθος αριθμό εντολής για cmd.
Στη δήλωση του biosdisk ή της συνάρτησης _bios_disk αν δώσουμε το cmd = _DISK_RESET η συνάρτηση επαναφέρει το σύστημα του δίσκου αγνοώντας όλες τις άλλες παραμέτρους και το _DISK_STATUS επιστρέφει την κατάσταση της τελευταίας λειτουργίας του δίσκου, αγνοώντας όλες τις άλλες παραμέτρους
Για συναρτήσεις cmd =_DISK_READ, _DISK_WRITE ή _DISK_VERIFY (2, 3 ή 4), οι συναρτήσεις biosdisk και _bios_disk χρησιμοποιήστε επίσης άλλες παραμέτρους που φαίνονται παρακάτω:
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 |
Εάν η τιμή του cmd είναι = 5 (_DISK_FORMAT), το biosdisk και το _bios_disk χρησιμοποιούν τις ακόλουθες παραμέτρους σύμφωνα με την περιγραφή στον πίνακα. Συνιστάται πάντα να προσέχετε όσο χρησιμοποιείτε το _DISK_FORMAT και θα πρέπει να γνωρίζετε τι θα κάνετε. Η έλλειψη γνώσης ή ακόμα και ένα μικρό λάθος μπορεί να σας κάνει να αντιμετωπίσετε μεγάλη απώλεια δεδομένων.
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 |
Υπάρχουν κάποιες πρόσθετες τιμές του cmd που χρησιμοποιούνται μόνο από τις λειτουργίες του biosdisk. Αυτές οι τιμές cmd επιτρέπονται μόνο για τα XT, AT, PS/2 και συμβατά. Οι τιμές έχουν περιγραφεί στον παρακάτω πίνακα:
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 |
diskinfo_t Structure
diskinfo_t structure is used by _bios_disk function. The description of the structure is as follows:
struct diskinfo_t {
unsigned drive, head, track, sector, nsectors;
void far *buffer;
};
Where drive καθορίζει τη μονάδα δίσκου που πρόκειται να χρησιμοποιηθεί. Να θυμάστε πάντα ότι για τους σκληρούς δίσκους καθορίζεται η φυσική μονάδα δίσκου και όχι το διαμέρισμα του δίσκου. Εάν θέλετε να χειριστείτε κατατμήσεις, το πρόγραμμα εφαρμογής πρέπει επίσης να ερμηνεύσει τις πληροφορίες του πίνακα κατατμήσεων αυτού του ίδιου του δίσκου.
Η τιμή της κεφαλής, της διαδρομής και του τομέα καθορίζει τη θέση του αρχικού τομέα για τη λειτουργία. Το nsectors καθορίζει τον αριθμό των τομέων που πρέπει να διαβαστούν ή να γραφτούν και το buffer σημεία στην προσωρινή μνήμη όπου γίνεται ανάγνωση και εγγραφή δεδομένων. Ανάλογα με την τιμή του cmd, οι άλλες παράμετροι στη δομή diskinfo_t ενδέχεται να χρειάζονται ή να μην χρειάζονται.
Η τιμή για τις προδιαγραφές της μονάδας δίσκου που θα χρησιμοποιηθεί στις συναρτήσεις biosdisk και _bios_disk έχει δοθεί στον ακόλουθο πίνακα:
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) |
Φτάνει η θεωρία! Τώρα ας δούμε μερικά πρακτικά πράγματα και μερικά παραδείγματα αυτών των λειτουργιών. Το ακόλουθο παράδειγμα διαβάζει τους τομείς και στις δύο πλευρές των τεσσάρων κομματιών της δισκέτας και αποθηκεύει τα περιεχόμενα στο αρχείο, που έχει καθορίσει ο χρήστης. Δεν πειράζει, αν έχετε διαγράψει τα αρχεία από το δίσκο σας επειδή το πρόγραμμα διαβάζει απευθείας την επιφάνεια του δίσκου.
Για να δείτε τα διαγραμμένα δεδομένα, είναι καλύτερο να πάρετε μια πλήρως διαμορφωμένη δισκέτα και να αντιγράψετε ορισμένα αρχεία κειμένου, όπως η κωδικοποίηση των προγραμμάτων σας .c ή άλλα αρχεία κειμένου (ώστε να μπορείτε να κατανοήσετε τα περιεχόμενα των αρχείων) καταλαμβάνει περίπου 73 KB (δεδομένα αποθηκευμένα σε τέσσερα κομμάτια, δύο πλευρές και 18 τομείς σε κάθε κομμάτι. Κάθε τομέας είναι 512 byte). Το πρόγραμμα έχει αναπτυχθεί για να επιδείξει το παράδειγμα. Ωστόσο, μπορείτε να το τροποποιήσετε και να το αναπτύξετε σε δεδομένα έτοιμα για ανάκτηση.
/* Πρόγραμμα ανάγνωσης 4 κομματιών (0, 1, 2 και 3) μιας δισκέτας και εγγραφή των περιεχομένων σε καθορισμένο αρχείο */
#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();
/// Ελέγξτε εάν η μονάδα είναι έτοιμη ή όχι \\\
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();
}
/* Λάβετε το όνομα αρχείου για να αποθηκεύσετε τα δεδομένα των Τομέων του
ο δίσκος */
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 */
/// Εμφάνιση της κατάστασης \\\
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);
/// Διαβάστε τους Καθορισμένους Τομείς \\\
result = _bios_disk(_DISK_READ, &dinfo);
/// Αποθηκεύστε τα περιεχόμενα στο Καθορισμένο αρχείο \\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Εκτύπωση μηνύματος σφάλματος στην οθόνη και στο αρχείο για Σφάλμα κατά την ανάγνωση ενός τομέα */
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);
}
Το παράδειγμα δείχνει τη χρήση των συναρτήσεων, biosdisk και _bios_disk. Η λειτουργία biosdisk ελέγχει εάν ο δίσκος είναι έτοιμος ή όχι και βρέθηκε το σημάδι διεύθυνσης. Η συνάρτηση _bios_disk διαβάζει τους τομείς και των δύο πλευρών έως και τέσσερα κομμάτια.
Η σειρά ανάγνωσης (ή εγγραφής) στην επιφάνεια του δίσκου θα πρέπει να είναι η εξής:
absread και abswrite Λειτουργίες
Αυτές οι λειτουργίες έχουν οριστεί στο Dos.h. Η συνάρτηση absread διαβάζει απόλυτους τομείς δίσκου και η συνάρτηση abswrite γράφει απόλυτους τομείς δίσκου. Η συνάρτηση absread χρησιμοποιεί διακοπή DOS 0x25 για την ανάγνωση συγκεκριμένων τομέων δίσκου και η συνάρτηση abswrite χρησιμοποιεί διακοπή DOS 0x26 για την εγγραφή συγκεκριμένων τομέων δίσκου.
Οι απόλυτες λειτουργίες ανάγνωσης ή εγγραφής προχωρούν με διαδοχικό τρόπο αυξάνοντας τους τομείς βήμα προς βήμα και είναι εντελώς απαλλαγμένοι από αριθμούς κεφαλής και κομματιού κ.λπ. Είναι δουλειά του BIOS του υπολογιστή να μεταφράσει τους απόλυτους τομείς στους αντίστοιχους Αριθμοί κομματιού, Επικεφαλής και Τομέα.
Οι απόλυτες λειτουργίες ανάγνωσης και εγγραφής συνιστώνται σε τέτοια προγράμματα όπου πρόκειται να εκτελέσουμε λειτουργία ανάγνωσης/εγγραφής σε ολόκληρο το δίσκο και θέλουμε να αποφύγουμε επιπλέον κωδικοποίηση και βρόχο στο πρόγραμμά μας για να αυξήσουμε την ταχύτητα του προγράμματος στο ταχύτερο.
Και οι δύο συναρτήσεις absread και abswrite, αγνοούν τη λογική δομή ενός δίσκου και δεν δίνουν σημασία σε αρχεία, FAT ή καταλόγους. Αυτές οι συναρτήσεις εκτελούν απευθείας λειτουργία απόλυτης ανάγνωσης και απόλυτης εγγραφής στην επιφάνεια του δίσκου. Αυτός είναι ο λόγος που εάν χρησιμοποιηθούν ακατάλληλα, το abswrite μπορεί να αντικαταστήσει αρχεία, καταλόγους και FAT.
Η δήλωση της συνάρτησης absread είναι η εξής:
int absread(int drive, int nsects, long lsect,
void *buffer);
and the abswrite function is declared as follows:
int abswrite(int drive, int nsects, long lsect,
void *buffer);
Όπου η σημασία των παραμέτρων είναι η εξής:
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) |
Σε περίπτωση επιτυχίας, και οι δύο συναρτήσεις επιστρέφουν 0. Όταν υπάρχει κάποιο σφάλμα, επιστρέφουν και οι δύο -1 και ορίζουν το σφάλμα αρ. στην τιμή του καταχωρητή AX που επιστρέφεται από την κλήση συστήματος.
Ο αριθμός των τομέων για λειτουργία ανάγνωσης ή εγγραφής περιορίζεται στα 64K ή στο μέγεθος του buffer, όποιο από τα δύο είναι μικρότερο. Ωστόσο, θα μάθουμε τη χρήση της τεράστιας μνήμης στα επόμενα κεφάλαια για να ξεπεράσουμε το όριο μνήμης τα 64K, για να αναπτύξουμε ένα πολύ γρήγορο πρόγραμμα.
|
Διακοπή χειρισμού με C
Η C ονομάζεται μερικές φορές γλώσσα συγκρότησης υψηλού επιπέδου επειδή μπορεί να καλέσει τις διάφορες διακοπές χρησιμοποιώντας ορισμένες από τις ορισμένες καθορισμένες συναρτήσεις της. Μερικές σημαντικές λειτουργίες είναι οι εξής:
- int86: Καλεί διακοπές MS-DOS.
- int86x: Καλεί τη διακοπή MS-DOS με τιμές μητρώου τμημάτων.
- intdos: καλεί την υπηρεσία MS-DOS χρησιμοποιώντας καταχωρητές εκτός των DX και AL
- intdosx: καλεί την υπηρεσία MS-DOS με τιμές μητρώου τμημάτων.
- διαχωρισμός: Διαβάζει καταχωρητές τμημάτων
Θα συζητήσουμε αυτές τις λειτουργίες λεπτομερώς. Πρώτα απ 'όλα συζητάμε ορισμένες προκαθορισμένες δομές και ενώσεις που χρησιμοποιούνται συχνά ή απαραίτητα με αυτές τις συναρτήσεις.
Δομή SREGS
Αυτή η δομή έχει οριστεί στο dos.h και είναι μια δομή των καταχωρητών τμημάτων που μεταβιβάζονται και συμπληρώνονται από τις συναρτήσεις, int86x, intdosx και segread. Η δήλωση της δομής έχει ως εξής:
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
ένωση REGS
Το REGS είναι η ένωση δύο δομών. Η ένωση REGS έχει οριστεί dos.h και χρησιμοποιείται για τη μετάδοση πληροφοριών προς και από τις συναρτήσεις, int86, int86x, intdos και intdosx. Η δήλωση του σωματείου έχει ως εξής:
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Δομές BYTEREGS και WORDREGS
Οι δομές BYTEREGES και WORDREGS έχουν οριστεί σε dos.h και χρησιμοποιούνται για την αποθήκευση καταχωρητών byte και λέξεων. Η δομή WORGREGS επιτρέπει στο χρήστη να έχει πρόσβαση στους καταχωρητές της CPU ως ποσότητες 16-bit όπου η δομή BYTEREGES δίνει την πρόσβαση στους μεμονωμένους καταχωρητές 8-bit.
Η δομή BITEREGS δηλώνεται ως εξής:
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
Και η δομή WORDREGS δηλώνεται ως εξής:
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
συναρτήσεις int86 και int86x
Αυτές οι λειτουργίες είναι οι γενικές διεπαφές διακοπών λογισμικού 8086 που ορίζονται στο dos.h. Οι καταχωρητές ρυθμίζονται στις επιθυμητές τιμές και αυτές οι συναρτήσεις καλούνται για να καλέσουν τις διακοπές MS-DOS. Η δήλωση της συνάρτησης int86 είναι η εξής:
int int86(int intno, ένωση REGS *inregs,
ένωση REGS *outregs);
int86x είναι η παραλλαγή της συνάρτησης int86. Δηλώνεται ως εξής:
int int86x(int intno, union REGS *inregs,
union REGS *outregs, struct SREGS *segregs);
Και οι δύο συναρτήσεις int86 και int86x εκτελούν μια διακοπή λογισμικού 8086 που καθορίζεται από το όρισμα intno Ή μπορούμε να πούμε ότι η διακοπή για δημιουργία καθορίζεται από την intno.
Με τη συνάρτηση int86x είναι δυνατή η πρόσβαση μόνο σε ES και DS και όχι σε CS και SS, ώστε να μπορείτε να καλέσετε μια διακοπή λογισμικού 8086 που παίρνει μια τιμή DS διαφορετική από το προεπιλεγμένο τμήμα δεδομένων και/ή λαμβάνει ένα όρισμα στο ES.
Αυτές οι συναρτήσεις αντιγράφουν τις τιμές καταχωρητή από τα inreg στους καταχωρητές πριν από την εκτέλεση της διακοπής του λογισμικού. Η συνάρτηση int86x αντιγράφει επίσης τις τιμές segregs->ds και segregs->es στους αντίστοιχους καταχωρητές πριν από την εκτέλεση της διακοπής λογισμικού. Αυτή η δυνατότητα επιτρέπει σε προγράμματα που χρησιμοποιούν δείκτες μακριά ή ένα μοντέλο μεγάλης μνήμης δεδομένων να καθορίσουν ποιο τμήμα θα χρησιμοποιηθεί για τη διακοπή λογισμικού.
Οι συναρτήσεις αντιγράφουν τις τρέχουσες τιμές καταχωρητή σε outregs, την κατάσταση της σημαίας μεταφοράς στο πεδίο x.cflag σε outregs και την τιμή των 8086 flags καταχωρούνται στο πεδίο x.flags σε outregs, μετά την επιστροφή της διακοπής λογισμικού. Η συνάρτηση int86x επαναφέρει επίσης το DS και ορίζει τα πεδία segregs->es και segregs->ds στις τιμές των αντίστοιχων καταχωρητών τμημάτων.
Και στις δύο συναρτήσεις τα inreg και τα outregs μπορούν να δείχνουν την ίδια δομή και και οι δύο συναρτήσεις επιστρέφουν την τιμή του AX μετά την ολοκλήρωση της διακοπής λογισμικού. Εάν έχει οριστεί η σημαία μεταφοράς, συνήθως υποδεικνύει ότι έχει προκύψει σφάλμα.
Τα στοιχεία ένωσης REGS που χρησιμοποιούνται στο C, ισοδύναμα με τη γλώσσα Assembly, βρίσκονται στον παρακάτω πίνακα:
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 |
|
|
Ας δούμε τα παραδείγματα των συναρτήσεων int86 και int86x. Το ακόλουθο πρόγραμμα Σαρώνει κάθε τομέα της δισκέτας και εκτυπώνει την κατάσταση κάθε τομέα στην οθόνη.
/* Πρόγραμμα για σάρωση κάθε τομέα της δισκέτας και εκτύπωση της κατάστασης */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
/// Αρχικοποίηση δίσκου με επαναφορά συστήματος δίσκου \\\
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");
/* Σάρωση της δισκέτας από 0 έως 79 κομμάτια (Σύνολο κομματιών 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);
//// Εκτυπώστε την κατάσταση του σαρωμένου τομέα \\\\
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();
}
Το πρόγραμμα δείχνει το παράδειγμα χρήσης των συναρτήσεων int86 και int86x. Σε αυτό το Πρόγραμμα η συνάρτηση int86 προετοιμάζει το δίσκο επαναφέροντας το σύστημα του δίσκου, χρησιμοποιώντας τη συνάρτηση 00H του INT 13H. Η συνάρτηση int86x επαληθεύει κάθε τομέα της δισκέτας (1,44 Mb, 3½ δισκέτα) και από τις δύο πλευρές, έως και 0 έως 79 κομμάτια (συνολικά 80 κομμάτια) χρησιμοποιώντας τη συνάρτηση 04H του INT 13H.
Segread Συνάρτηση
Αυτή η συνάρτηση έχει οριστεί στο dos.h. Αυτή η συνάρτηση διαβάζει τους καταχωρητές τμημάτων. Η δήλωση της συνάρτησης είναι η εξής:
void segread(struct SREGS *segp);
όπου το segread βάζει τις τρέχουσες τιμές των καταχωρητών τμημάτων στη δομή *segp. Δεν επιστρέφεται τίποτα από τη συνάρτηση και η κλήση προορίζεται για χρήση με intdosx και int86x. ας δούμε ένα παράδειγμα
#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();
}
Και η έξοδος του προγράμματος θα είναι κάπως έτσι:
Current segment register settings
CS: EED DS: 10BA
ES: 10BA SS: 10BA
intdos και intdosx Λειτουργίες
Αυτές οι λειτουργίες έχουν οριστεί στο dos.h. Αυτές είναι οι γενικές διεπαφές διακοπής DOS. Η συνάρτηση intdos καλεί καταχωρητές υπηρεσίας MS-DOS και, στη συνέχεια, τα DX και AL, όπου η συνάρτηση intdosx καλεί την υπηρεσία MS-DOS με τιμές καταχωρητή τμημάτων.
Η δήλωση της συνάρτησης intdos είναι η εξής:
int intdos(union REGS *inregs, union REGS *outregs);
and the declaration of intdosx function is as:
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
Οι συναρτήσεις intdos και intdosx εκτελούν διακοπή DOS 0x21 για να καλέσουν μια καθορισμένη συνάρτηση DOS. Η τιμή του inregs->h.ah καθορίζει τη συνάρτηση DOS που θα κληθεί. Η συνάρτηση intdosx αντιγράφει επίσης τις τιμές segregs ->ds και segregs ->s στους αντίστοιχους καταχωρητές πριν από την κλήση της συνάρτησης DOS και στη συνέχεια επαναφέρει το DS.
Αυτή η δυνατότητα των συναρτήσεων επιτρέπει στα προγράμματα που χρησιμοποιούν μακρινούς δείκτες ή ένα μοντέλο μεγάλης μνήμης δεδομένων να προσδιορίζουν ποιο τμήμα θα χρησιμοποιηθεί για την εκτέλεση της συνάρτησης. Με τη συνάρτηση intdosx μπορείτε να καλέσετε μια συνάρτηση DOS που παίρνει μια τιμή DS διαφορετική από το προεπιλεγμένο τμήμα δεδομένων και/ή λαμβάνει ένα όρισμα στο ES.
Και οι δύο συναρτήσεις επιστρέφουν την τιμή του AX μετά την ολοκλήρωση της κλήσης της συνάρτησης DOS και εάν έχει οριστεί η σημαία μεταφοράς (υπερβαίνει -> x.cflag != 0), υποδηλώνει ότι παρουσιάστηκε σφάλμα.
Αφού η διακοπή 0x21 επιστρέφει οι συναρτήσεις αντιγράφουν τις τρέχουσες τιμές καταχωρητή στα άκρα, την κατάσταση της σημαίας μεταφοράς στο πεδίο x.cflag στα άκρα και την τιμή του καταχωρητή σημαιών 8086 στο πεδίο x.flags στα άκρα. Τόσο τα inreg όσο και τα outregs μπορούν να δείχνουν την ίδια δομή. Ας δούμε τα παραδείγματα αυτών των συναρτήσεων.
Το παράδειγμα χρήσης της συνάρτησης intdos έχει δοθεί παρακάτω. Αυτό το πρόγραμμα λαμβάνει τις επιλεγμένες πληροφορίες σχετικά με τη μονάδα δισκέτας (1,44Mb, δισκέτα 3½ ιντσών). Αυτό το πρόγραμμα παρέχει τις πληροφορίες εκχώρησης μιας δισκέτας.
/* Οι πληροφορίες εκχώρησης μονάδας λήψης για χρήση δίσκου */
#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();
}
Και η έξοδος του προγράμματος θα είναι η εξής:
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
Ας δούμε τώρα ένα παράδειγμα της συνάρτησης intdosx. Το παρακάτω παράδειγμα δείχνει τη χρήση της συνάρτησης intdosx. Το πρόγραμμα εξάγει μια συμβολοσειρά στην τυπική έξοδο.
/* Το πρόγραμμα για την έξοδο "string" στο πρότυπο
παραγωγή. */
#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();
}
Και η έξοδος του προγράμματος θα είναι η εξής:
this string is not in the default data segment |
Εδώ εκτυπώνουμε τη δεδομένη συμβολοσειρά με τη συνάρτηση intdosx, από τη συνάρτηση 09H του INT 21H. Θα πρέπει πάντα να λαμβάνεται υπόψη ότι η δεδομένη συμβολοσειρά πρέπει πάντα να τελειώνει με τον χαρακτήρα “$”.
Πώς να γνωρίζετε τον αριθμό του φυσικού σκληρού δίσκου
Ο αριθμός φυσικού σκληρού δίσκου είναι πολύ σημαντικό πράγμα και πρέπει να γράφεται με ακρίβεια. Η παράνομη προδιαγραφή μονάδας δίσκου μπορεί να προκαλέσει μεγάλη απώλεια δεδομένων. Πρέπει να είμαστε σίγουροι για τον αριθμό της μονάδας δίσκου κατά την ανάκτηση δεδομένων ή τον προγραμματισμό αντιμετώπισης προβλημάτων δίσκου. Πώς να γνωρίζετε τον αριθμό μονάδας δίσκου οποιουδήποτε δίσκου με διαφορετικές διατάξεις δίσκων μπορεί να εκτιμηθεί από τα παραδείγματα που δίνονται στη συνέχεια.
Σύμφωνα με έναν πιο γενικευμένο μύθο, οι φυσικοί αριθμοί μονάδας δίσκου παρέχονται σύμφωνα με την κατάσταση προσάρτησης του δίσκου, ωστόσο σε ορισμένες ή ειδικές περιπτώσεις μπορεί να εξαρτάται από τη διαδικασία εκκίνησης του λειτουργικού σας συστήματος ή ρυθμίσεις εκκίνησης.
Η πιο γενικευμένη ιδέα για τον Αριθμό φυσικής μονάδας δίσκου που παρέχεται από το BIOS έχει δοθεί εδώ, αλλά ακόμα και τότε πρέπει να επιβεβαιώσετε με τη βοήθεια οποιουδήποτε εργαλείου επεξεργασίας δίσκου ή με τα προγράμματα που δίνονται στα επόμενα κεφάλαια, σχετικά με τη διαμόρφωση του δίσκου. Αφού βεβαιωθείτε, θα πρέπει να λάβετε οποιαδήποτε απόφαση σχετικά με την εκτέλεση τέτοιων προγραμμάτων που ενδέχεται να καταστρέψουν ή να βλάψουν τα δεδομένα, εάν χρησιμοποιηθούν παράνομα ή ελλείψει γνώσης.
Γενικά, εάν οι δύο δίσκοι είναι συνδεδεμένοι στο σύστημα, ο ένας είναι κύριος κύριος και ο άλλος δευτερεύων κύριος, η πρώτη προτίμηση θα δοθεί στον κύριο κύριο (και, στη συνέχεια, στον κύριο υποτελή, εάν είναι διαθέσιμος) και στη συνέχεια στον δευτερεύοντα κύριο ( και στη συνέχεια σε δευτερεύοντα slave εάν είναι διαθέσιμο και ούτω καθεξής) και ο φυσικός αριθμός θα δοθεί σύμφωνα με τις προτιμήσεις τους.
Ας υποθέσουμε ότι το σύστημά σας υποστηρίζει το μέγιστο τέσσερις σκληρούς δίσκους κάθε φορά. Και οι τέσσερις σκληροί δίσκοι μπορούν να συνδεθούν όπως δίνεται στη συνέχεια:
Primary Master |
Primary Slave |
Secondary Master |
Secondary Slave |
Ας εξετάσουμε τώρα ορισμένες περιπτώσεις για τον αριθμό των φυσικών μονάδων δίσκου. Εδώ υποθέτω ότι έχετε συνδέσει τους δίσκους με τις κατάλληλες ρυθμίσεις βραχυκυκλωτήρα, όπως αναφέρεται από τον κατασκευαστή του δίσκου, και στις κατάλληλες ρυθμίσεις Master–Slave:
- Εάν και οι τέσσερις σκληροί δίσκοι είναι συνδεδεμένοι στο σύστημα: εάν και οι τέσσερις δίσκοι είναι συνδεδεμένοι στο σύστημα, οι αριθμοί της φυσικής μονάδας θα είναι οι εξής:
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. |
- Εάν είναι συνδεδεμένοι τρεις Σκληροί Δίσκοι στο σύστημα: εάν τρεις Σκληροί Δίσκοι είναι συνδεδεμένοι στο σύστημα, οι αριθμοί της φυσικής μονάδας θα είναι σύμφωνα με τις προτιμήσεις συνημμένων. Τα ακόλουθα παραδείγματα αντιπροσωπεύουν ορισμένες από τις ρυθμίσεις:
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. |
- Εάν δύο σκληροί δίσκοι είναι συνδεδεμένοι στο σύστημα: Ομοίως, εάν δύο σκληροί δίσκοι είναι συνδεδεμένοι στο σύστημα, οι αριθμοί της φυσικής μονάδας θα είναι σύμφωνα με τις προτιμήσεις συνημμένων. Το παρακάτω παράδειγμα το δείχνει:
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. |
- If Single Hard Disk is connected to the system: Need not to think, if there is only one disk available, the physical drive number will be 80H.
Διακοπή 13H (INT 13H), Λειτουργίες προγράμματος οδήγησης δίσκου ROM BIOS
Η περιγραφή των συναρτήσεων INT 13H έχει δοθεί εδώ. Αυτές οι λειτουργίες πρέπει να μαθαίνονται με προσοχή, καθώς η κακή χρήση αυτών των λειτουργιών ή η χρήση με έλλειψη προσοχής ή έλλειψη γνώσης, μπορεί να προκαλέσει μεγάλη απώλεια δεδομένων ή πολλά άλλα προβλήματα. Ωστόσο, εάν χρησιμοποιηθούν με κατάλληλο και σωστό τρόπο, αυτές οι λειτουργίες βοηθούν στην ελαχιστοποίηση της κωδικοποίησης του προγράμματός σας και στον προγραμματισμό σας απλό και εύκολο.
INT 13H (0x13)
Function 00H (0x00) Reset disk system
Call with AH = 00H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function is successful
Carry flag = clear
AH = 00H
If function is unsuccessful
Carry flag = set
AH = status
Σχόλια:
Επαναφέρετε τον ελεγκτή δίσκου, βαθμονομεί εκ νέου τις συνδεδεμένες μονάδες δίσκου. Ο βραχίονας ανάγνωσης/εγγραφής μετακινείται στον κύλινδρο 0 και προετοιμάζεται για την είσοδο/έξοδο του δίσκου.
Αυτή η συνάρτηση θα πρέπει να κληθεί μετά από μια αποτυχημένη αίτηση δισκέτας Ανάγνωση, εγγραφή, Επαλήθευση ή Μορφοποίηση πριν δοκιμάσετε ξανά τη λειτουργία. Εάν η συνάρτηση καλείται με μια μονάδα σταθερού δίσκου (δηλαδή επιλέγοντας DL>=80H), ο ελεγκτής δισκέτας και, στη συνέχεια, ο ελεγκτής σταθερής δισκέτας επαναφέρονται.
INT 13H (0x13)
Function 01H (0x01) Get disk system status
Call with: AH = 01H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: AH = 00H
AL = status of previous disk operation
(See the table given before for error
and status codes description).
Comments:
Returns the status of the most recent disk operation
INT 13H (0x13)
Function 02H (0x02) Read sector
Call with: AH = 02H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES:BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Comments:
This function reads one or more sectors from disk into memory. On fixed disks, the upper 2 bits of the 10-bit cylinder number are placed in the upper 2 bits of register CL.
INT 13H (0x13)
Function 03H (0x03) Write sector
Call with: AH = 03H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sector transferred
If function unsuccessful
Carry flag = set
AH = status
Comments:
This function writes one or more sectors from memory to disk. On fixed disks, the upper 2 bits of the 10-bit cylinder number are placed in the upper 2 bits of register CL.
INT 13H (0x13)
Function 04H (0x04) >> Verify sector
Call with: AH = 04H
AL = number of sectors
CH = cylinder
CL = sector
DH = drive
00H-7FH floppy disk
80H-FFH fixed drive
ES: BX = segment: offset of buffer
Returns: If function is successful
Carry flag = clear
AH = 00H
AL = number of sectors verified
If function is unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η συνάρτηση επαληθεύει τα πεδία διεύθυνσης ενός ή περισσότερων τομέων. Δεν μεταφέρονται δεδομένα από ή προς τη μνήμη με αυτήν τη λειτουργία. Σε σταθερούς δίσκους, τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή CL.
Αυτή η λειτουργία μπορεί να χρησιμοποιηθεί για να ελέγξει εάν ένα αναγνώσιμο μέσο βρίσκεται σε μονάδα δισκέτας. Το πρόγραμμα που ζητά θα πρέπει να επαναφέρει το σύστημα δισκέτας (INT 13H Function 00H) και να δοκιμάσει ξανά τη λειτουργία τρεις φορές πριν υποθέσει ότι δεν υπάρχει αναγνώσιμη δισκέτα. Συνιστάται στις περισσότερες από τις λειτουργίες προετοιμασίας δισκέτας.
INT 13H (0x13)
Function 05H (0x05) >> Format track
Call with: AH = 05H
AL = interleave (PC/XT fixed disks)
CH = cylinder
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of address field list
(Except PC/XT fixed disk)
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
Σχόλια:
Αρχικοποιήστε τον τομέα δίσκου και τα πεδία διεύθυνσης κομματιών στο καθορισμένο κομμάτι. Στις δισκέτες, η λίστα του πεδίου διευθύνσεων αποτελείται από μια σειρά από καταχωρήσεις 4 byte, μία καταχώρηση ανά τομέα. Η Μορφή έχει δοθεί στον παρακάτω πίνακα.
Σε σταθερούς δίσκους, τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή 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)
Function 06H (0x06) >> Format bad track
Call with: AH = 06H
AL = interleave
CH = cylinder
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η λειτουργία ορίζεται μόνο για μονάδες σταθερού δίσκου PC/XT. Αρχικοποιεί ένα κομμάτι, γράφοντας πεδία διεύθυνσης δίσκου και τομείς δεδομένων και ορίζοντας σημαίες κακού τομέα.
INT 13H (0x13)
Function 07H (0x07) >> Format drive
Call with: AH = 07H
AL = interleave
CH = cylinder
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
Σχόλια:
Αυτή η λειτουργία ορίζεται μόνο για μονάδες σταθερού δίσκου PC/XT. Μορφοποιεί ολόκληρη τη μονάδα δίσκου, γράφοντας πεδία διεύθυνσης δίσκου και τομείς δεδομένων, ξεκινώντας από τον καθορισμένο κύλινδρο.
INT 13H (0x13)
Function 08H (0x08) >> Get drive parameters
Call with: AH = 08H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
BL = drive type (PC/AT and PS/2 floppy
disk)
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
Σχόλια:
Αυτή η συνάρτηση επιστρέφει διάφορες παραμέτρους για την καθορισμένη μονάδα δίσκου. Η τιμή που επιστρέφεται στον καταχωρητή DL αντικατοπτρίζει τον πραγματικό αριθμό των φυσικών μονάδων δίσκου που είναι συνδεδεμένες στον προσαρμογέα για την απαιτούμενη μονάδα δίσκου.
INT 13H (0x13)
Function 09H (0x09) >> Initialize fixed disk characteristics
Call with: AH = 09H
DL = drive
80H-FFH fixed disk
On the PC/XT Vector for INT 41H
must point to disk parameter block or, on the PC/AT and PS/2
Vector for INT 41H must point to disk
parameter block for drive 0
Vector for INT 46H must point to disk
parameter block for drive 1
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η συνάρτηση προετοιμάζει τον ελεγκτή σταθερού δίσκου για επόμενες λειτουργίες I/O, χρησιμοποιώντας τις τιμές που βρίσκονται στο μπλοκ παραμέτρων του δίσκου ROM BIOS. Η λειτουργία υποστηρίζεται μόνο σε σταθερό δίσκο. Η μορφή μπλοκ παραμέτρων για σταθερούς δίσκους PC και PC/XT είναι η εξής:
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 |
Η μορφή μπλοκ παραμέτρων για σταθερούς δίσκους PC/AT και PS/2 είναι η εξής:
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)
Function 0A H (0x0A or 10) >> Read sector long
Call with: AH = 0AH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η συνάρτηση διαβάζει έναν τομέα ή τομείς από το δίσκο στη μνήμη μαζί με έναν κωδικό 4 byte Error Correcting Code (ECC) για κάθε τομέα. Σε αντίθεση με την κανονική λειτουργία του τομέα ανάγνωσης (Λειτουργία INT 13H (0x13) 02H), τα σφάλματα ECC δεν διορθώνονται αυτόματα. Οι μεταφορές πολλαπλών τομέων τερματίζονται μετά από οποιονδήποτε τομέα με σφάλμα ανάγνωσης.
Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους. Τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή CL.
INT 13H (0x13)
Function 0BH (0x0B or 11) >> Write sector long
Call with:AH = 0BH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η συνάρτηση γράφει έναν τομέα(ούς) από τη μνήμη στο δίσκο. Τα δεδομένα αξίας κάθε τομέα πρέπει να ακολουθούνται από τον κωδικό ECC των 4 byte. Τα επάνω 2 bit του αριθμού κυλίνδρου των 10 bit τοποθετούνται στα επάνω 2 bit του καταχωρητή CL. Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους.
INT 13H (0x13)
Function 0CH (0x0C or 12) >> Seek
Call with:AH = 0CH
CH = lower 8 bits of cylinder
CL = upper 2 bits of cylinder in bits 6-7
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η λειτουργία τοποθετεί τις κεφαλές ανάγνωσης/εγγραφής δίσκου στον καθορισμένο κύλινδρο χωρίς να μεταφέρει δεδομένα. Τα επάνω 2 bit του αριθμού κυλίνδρου τοποθετούνται στα επάνω 2 bit του καταχωρητή CL. Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους.
INT 13H (0x13)
Function 0DH (0x0D or 13) >> Reset fixed disk system
Call with:AH = 0DH
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
Σχόλια:
Αυτή η λειτουργία επαναφέρει τον ελεγκτή σταθερού δίσκου, βαθμονομεί εκ νέου τις συνδεδεμένες μονάδες δίσκου, μετακινεί τον βραχίονα ανάγνωσης/εγγραφής στον κύλινδρο 0 και προετοιμάζεται για την επόμενη είσοδο/έξοδο του δίσκου.
INT 13H (0x13)
Function 0EH (0x0E or 14) >> Read sector buffer
Call with:AH = 0EH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η συνάρτηση μεταφέρει τα περιεχόμενα της προσωρινής μνήμης εσωτερικού τομέα του προσαρμογέα σταθερού δίσκου στη μνήμη του συστήματος. Δεν διαβάζονται δεδομένα από τη φυσική μονάδα δίσκου.
INT 13H (0x13)
Function 0FH (0x0F or 15) >> Write sector buffer
Call with:AH = 0FH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η λειτουργία μεταφέρει δεδομένα από τη μνήμη συστήματος στην προσωρινή μνήμη εσωτερικού τομέα του σταθερού προσαρμογέα. Δεν εγγράφονται δεδομένα στη φυσική μονάδα δίσκου. Αυτή η συνάρτηση θα πρέπει να κληθεί για να προετοιμάσει τα περιεχόμενα της προσωρινής μνήμης τομέα πριν μορφοποιήσετε τη μονάδα δίσκου με τη λειτουργία INT 13H 05H.
INT 13H (0x13)
Function 10H (0x10 or 16) >> Get drive status
Call with:AH = 10H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η συνάρτηση ελέγχει εάν η καθορισμένη μονάδα σταθερού δίσκου είναι λειτουργική και επιστρέφει την κατάσταση της μονάδας δίσκου. Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους.
INT 13H (0x13)
Function 11H (0x11 or 17) >> Recalibrate drive
Call with:AH =11H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η λειτουργία αναγκάζει τον προσαρμογέα σταθερού δίσκου να επαναβαθμονομηθεί για την καθορισμένη μονάδα δίσκου, τοποθετώντας τον βραχίονα ανάγνωσης/εγγραφής στον κύλινδρο 0 και επιστρέφει την κατάσταση της μονάδας. Αυτή η λειτουργία υποστηρίζεται μόνο σε σταθερούς δίσκους.
INT 13H (0x13)
Function 12H (0x12 or 18) >> Controller RAM
diagnostic
Call with:AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η λειτουργία αναγκάζει τον προσαρμογέα σταθερού δίσκου να πραγματοποιήσει έναν ενσωματωμένο διαγνωστικό έλεγχο στην προσωρινή μνήμη εσωτερικού τομέα του, υποδεικνύοντας εάν η δοκιμή πέρασε από την κατάσταση επιστροφής.
INT 13H (0x13)
Function 13H (0x13 or 19) >> Controller drive diagnostic
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η λειτουργία αναγκάζει τον σταθερό προσαρμογέα να εκτελέσει εσωτερικές διαγνωστικές δοκιμές της συνδεδεμένης μονάδας δίσκου, υποδεικνύοντας εάν η δοκιμή πέρασε από την κατάσταση επιστροφής.
INT 13H (0x13)
Function 14H (0x14 or 20) >> Controller internal
diagnostic
Call with:AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η λειτουργία αναγκάζει τον προσαρμογέα σταθερού δίσκου να πραγματοποιήσει έναν ενσωματωμένο διαγνωστικό αυτοέλεγχο, υποδεικνύοντας εάν το τεστ πέρασε από την κατάσταση επιστροφής.
INT 13H (0x13)
Function 15H (0x15 or 21) >> Get disk type
Call with:AH = 15H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = drive type code
00H if no drive present
01H if floppy disk drive without change-line support
02H if floppy disk drive with change-line support
03H if fixed disk
|
And, if fixed disk (AH =03H)
CX: DX = number of 512-byte sectors
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η συνάρτηση επιστρέφει έναν κωδικό που υποδεικνύει τον τύπο δισκέτας ή σταθερής δισκέτας που αναφέρεται από τον καθορισμένο κωδικό μονάδας δίσκου.
INT 13H (0x13)
Function 16H (0x16 or 22) >> Get disk change
status
Call with: AH = 16H
DL = drive
00H-7FH floppy disk
Returns:If change line inactive and disk has not been changed
Carry flag = clear
AH = 00H
If change line active and disk may have been changed
Carry flag = set
AH = 06H
Σχόλια:
Αυτή η συνάρτηση επιστρέφει την κατάσταση της γραμμής αλλαγής, υποδεικνύοντας εάν ο δίσκος στη μονάδα δίσκου μπορεί να έχει αντικατασταθεί από την τελευταία πρόσβαση στο δίσκο. Εάν αυτή η λειτουργία επιστρέψει με τη σημαία μεταφοράς, ο δίσκος δεν έχει απαραίτητα αλλάξει και η γραμμή αλλαγής μπορεί να ενεργοποιηθεί απλά ξεκλειδώνοντας και κλειδώνοντας τη θύρα της μονάδας δίσκου χωρίς να αφαιρέσετε τη δισκέτα.
INT 13H (0x13)
Function 17H (0x17 or 23) >> Set disk type
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
Σχόλια:
Αυτή η συνάρτηση επιλέγει έναν τύπο δισκέτας για την καθορισμένη μονάδα δίσκου.
INT 13H (0x13)
Function 18H (0x18 or 24) >> Set media type for format
Call with: AH = 18H
CH = number of cylinders
CL = sector per track
DL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
ES: DI = segment: offset of disk
parameter table for media type
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η λειτουργία επιλέγει χαρακτηριστικά μέσων για την καθορισμένη μονάδα δίσκου, επομένως πρέπει να υπάρχει μια δισκέτα στη μονάδα.
INT 13H (0x13)
Function 19H (0x19 or 25) >> Park heads
Call with: AH = 19H
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Σχόλια:
Αυτή η λειτουργία μετακινεί τον βραχίονα ανάγνωσης/εγγραφής σε ένα κομμάτι που δεν χρησιμοποιείται για αποθήκευση δεδομένων, έτσι ώστε τα δεδομένα να μην καταστραφούν όταν απενεργοποιηθεί η μονάδα.
INT 13H (0x13)
Function 1AH (0x1A or 26) >> Format ESDI drive
Call with: AH = 1AH
AL = Relative Block Address (RBA)
defect table count
0, if no RBA table
>0, if RBA table used
CL = format modifier bits
Bit(s) |
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)
Σχόλια:
Αυτή η συνάρτηση προετοιμάζει τον τομέα του δίσκου και τα πεδία διεύθυνσης παρακολούθησης σε μια μονάδα δίσκου που είναι συνδεδεμένη στον προσαρμογέα σταθερής μονάδας δίσκου ESDI.
Η λειτουργία αυτής της συνάρτησης ονομάζεται μορφή χαμηλού επιπέδου και προετοιμάζει το δίσκο για φυσικές λειτουργίες ανάγνωσης/εγγραφής σε επίπεδο τομέα. Στη συνέχεια, η μονάδα δίσκου πρέπει να διαμεριστεί με την εντολή FDISK και στη συνέχεια να της δοθεί μια μορφή υψηλού επιπέδου με την εντολή FORMAT για να εγκαταστήσετε ένα σύστημα αρχείων.
Σελίδα Τροποποιήθηκε στις: 12/01/2022