Hoofdstuk – 8
Functies van het schijf-BIOS en interrupt-afhandeling met behulp van C
Invoering
In dit hoofdstuk bespreken we de belangrijkste functies van Disk-BIOS en andere belangrijke functies die ons de vrijheid geven om interrupts in ons C-programma op een eenvoudige en korte manier te gebruiken en af te handelen. Deze functies vormen de basis voor het programmeren van gegevensherstel en het oplossen van schijfproblemen. Dit zijn de kenmerken die de C-taal tot een "high-level assemblertaal " maken .
Functies van biosdisk en _bios_disk
Deze twee functies zijn het belangrijkst voor ons doel: gegevensherstel en het programmeren van schijfproblemen. Deze functies gebruiken we het vaakst.
Deze twee functies zijn BIOS-schijfstationservices en zijn gedefinieerd in bios.h, waarbij biosdisk onder het bestandsniveau op ruwe sectoren werkt. Zelfs als u deze functies onzorgvuldig gebruikt, kunnen ze de inhoud van bestanden en mappen op uw harde schijf vernietigen. Zowel de biosdisk- als de _bios_disk-functie gebruiken interrupt 0x13 om schijfbewerkingen rechtstreeks aan het BIOS door te geven. De functie _bios_disk wordt in het programma als volgt gedeclareerd:
unsigned _bios_disk(unsigned opdracht, struct diskinfo_t *dinfo);
En de declaratie voor de BIOS-schijffunctie ziet er als volgt uit:
int biosdisk(int cmd, int station, int kop, int spoor,
int sector, int nsects, void *buffer);
De betekenis van deze parameters wordt beschreven in de volgende tabel:
Parameter |
Functie |
Wat is het of wat doet het? |
cmd |
Beide |
Geeft de uit te voeren bewerking aan, zoals lezen, schrijven, controleren, enz. (Zie de beschrijving van cmd hieronder) |
informatie |
_bios_schijf |
Verwijst naar een diskinfo_t-structuur die de overige parameters bevat die nodig zijn voor de bewerking. (zie de beschrijving van de diskinfo_t structuur hieronder) |
een auto besturen |
biosschijf |
Geeft aan welke schijf wordt gebruikt (0 voor a:, 1 voor b:, en 0x80 voor de eerste fysieke harde schijf, 0x81 voor de tweede, enz.) |
hoofd
traject sector
|
biosschijf |
Ze definiëren de locatie van de startsector van waaruit de operatie moet beginnen. |
insecten |
biosschijf |
Aantal sectoren om te lezen, schrijven, controleren, etc. |
buffer |
biosschijf |
Het geheugenadres waarvandaan gegevens moeten worden gelezen of geschreven. |
Bij beide functies worden gegevens gelezen en geschreven in een buffer van 512 bytes per sector. Dit is de logische sectorgrootte van de harde schijf. De retourwaarde van beide functies is de waarde van het AX-register dat is ingesteld door de BIOS-aanroep INT 0x13H.
Als de functie succesvol is, is de hoge byte = 0, wat betekent dat de functie succesvol is voltooid. De lage byte bevat het aantal gelezen, geschreven of geverifieerde sectoren, enz.
Maar als er een fout optreedt en de functie niet succesvol wordt uitgevoerd, komt de waarde van de hoge byte overeen met een van de volgende foutcodes, die in de volgende tabel worden beschreven:
Waarde |
Beschrijving |
0x00 |
Succesvol afgerond (geen fout!!) |
0x01 |
Slecht team |
0x02 |
Adreslabel niet gevonden |
0x03 |
Poging om te schrijven naar een schrijfbeveiligde schijf |
0x04 |
Sector niet gevonden |
0x05 |
Reset mislukt (harde schijf) |
0x06 |
De schijf is gewijzigd sinds de laatste bewerking. |
0x07 |
Het uitvoeren van de schijfparameteractie is mislukt |
0x08 |
Directe geheugentoegang (DMA) overloop |
0x09 |
Probeer DMA uit te voeren over de 64K-grens (datagrensfout of sectoren >80H) |
0x0A |
Slechte sector gedetecteerd |
0x0B |
Slecht spoor gedetecteerd |
0x0C |
Niet-ondersteunde track |
0x0D |
Onjuist aantal sectoren bij formatteren (PS/2 harde schijf) |
0x0E |
Controlegegevens Adresmarkering gedetecteerd (harde schijf) |
0x0F |
DMA-arbitrageniveau buiten bereik (harde schijf) |
0x10 |
Onjuiste CRC/ECC bij het lezen van de schijf |
0x11 |
CRC/ECC-gegevenscorrectiefout (eigenlijk geen fout) |
0x20 |
De controller is defect |
0x31 |
Er zijn geen media in het station (IBM/MS INT 13-extensies) |
0x32 |
Onjuist schijftype opgeslagen in CMOS (Compaq) |
0x40 |
De zoekopdracht is mislukt. |
0x80 |
Bijlage reageerde niet |
0xAA |
Schijf niet gereed (alleen harde schijf) |
0xB0 |
Volume is niet vergrendeld op schijf (INT 13-extensies) |
0xB1 |
Volume vergrendeld op schijf (INT 13-extensies) |
0xB2 |
Niet-verwijderbaar volume (INT 13 extensies) |
0xB3 |
Gebruiksvolume (INT 13-extensies) |
0xB4 |
Aantal sloten overschreden (INT 13 extensies) |
0xB5 |
Het is niet gelukt om een geldige throw-aanvraag uit te voeren (INT-extensies 13) |
0xBB |
Er is een onbekende fout opgetreden (alleen harde schijf) |
0xCC |
Er is een opnamefout opgetreden |
0xE0 |
Statusregisterfout |
0xFF |
Operatie Sense mislukt |
In de onderstaande tabel staan de bedieningsopdrachten die met de parameter cmd kunnen worden uitgevoerd. Allereerst zullen we de algemene werking van beide functies bekijken.
biosschijf |
_bios_schijf |
Wat doet hij? |
0 |
_SCHIJF_RESET |
Reset het disksysteem, waardoor de drive controller gedwongen wordt een harde reset uit te voeren. Negeer alle andere parameters |
1 |
_SCHIJF_STATUS |
Retourneert de status van de laatste schijfbewerking. Negeert alle andere parameters. |
2 |
_SCHIJF_LEZEN |
Leest een of meer schijfsectoren in het geheugen |
3 |
_SCHIJFSCHRIJVEN |
Schrijft een of meer schijfsectoren uit het geheugen |
4 |
_SCHIJF_VERIFICEREN |
Verifieert een of meer sectoren |
5 |
_DISK_FORMAAT |
Formatteert een track |
Hoewel u vrij bent om cmd = 0, 1, 2, 3, 4, 5 of cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT te gebruiken en beide opties hetzelfde effect hebben, wordt u aangeraden om een woordenoptie te gebruiken zoals cmd = _DISK_FORMAT in plaats van cmd = 5, omdat dit u kan helpen fouten te voorkomen die kunnen optreden als u een verkeerd opdrachtnummer voor cmd hebt getypt.
In de declaratie van de biosdisk- of _bios_disk-functie, als we cmd = _DISK_RESET opgeven, reset de functie het schijfsysteem door alle andere parameters te negeren en _DISK_STATUS retourneert de status van de laatste schijfbewerking, waarbij alle andere parameters worden genegeerd
Voor cmd =_DISK_READ, _DISK_WRITE of _DISK_VERIFY (2, 3 of 4) gebruiken de functies biosdisk en _bios_disk ook andere parameters die hieronder worden weergegeven:
Parameter |
Wat het doet |
hoofdspoor
sector
|
Deze drie specificeren de locatie van de startsector voor de opgegeven bewerking. (minimale mogelijke waarden kunnen zijn: head = 0, track = 0 en sector = 1) |
nsectoren |
Hiermee wordt het aantal sectoren gespecificeerd dat moet worden gelezen of geschreven |
buffer |
Het wijst naar de buffer waar gegevens moeten worden gelezen en geschreven |
Als de waarde van cmd = 5 (_DISK_FORMAT) is, gebruiken biosdisk en _bios_disk de volgende parameters volgens de beschrijving in de tabel. Het wordt altijd aanbevolen dat u voorzichtig bent bij het gebruik van _DISK_FORMAT en dat u weet wat u gaat doen. Gebrek aan kennis of zelfs een kleine fout kan ertoe leiden dat u te maken krijgt met een groot gegevensverlies.
Parameter |
Wat het doet |
hoofdspoor
|
Deze specificeren de locatie van het te formatteren spoor |
buffer |
Het verwijst naar een tabel met sectorkoppen die op het genoemde spoor moeten worden geschreven |
Er zijn enkele extra waarden van cmd die alleen door biosdisk-functies worden gebruikt. Deze waarden van cmd zijn alleen toegestaan voor de XT, AT, PS/2 en compatibele apparaten. Waarden worden beschreven in de volgende tabel:
cmd |
Wat het doet |
6 |
Formatteert een track en stelt slechte sectorvlaggen in |
7 |
Formatteert de drive beginnend bij een specifiek spoor |
8 |
Retourneert de huidige schijfparameters in de eerste 4 bytes van de buffer |
9 |
Initialiseert kenmerken van drive-pair |
10 |
Voert een lange leesbewerking uit (512 plus 4 extra bytes per sector) |
11 |
Voert een lange schrijfbewerking uit (512 plus 4 extra bytes per sector) |
12 |
Zoekt een schijf |
13 |
Alternatieve schijfreset |
14 |
Leest sectorbuffer |
15 |
Schrijft sectorbuffer |
16 |
Test of het genoemde station gereed is |
17 |
Kalibreert de aandrijving opnieuw |
18 |
Controller RAM-diagnose |
19 |
Diagnose van de aandrijving |
20 |
Interne diagnose van de controller |
diskinfo_t Structuur
diskinfo_t structuur wordt gebruikt door _bios_disk functie. De beschrijving van de structuur is als volgt:
structuur diskinfo_t {
ongetekende schijf, kop, spoor, sector, nsectoren;
leeg ver *buffer;
};
Waar drive de disk drive specificeert die gebruikt moet worden. Vergeet niet dat voor de harde schijven de fysieke drive gespecificeerd wordt, niet de disk partitie. Als u partities wilt bedienen, moet het applicatieprogramma ook de partitietabelinformatie van die disk zelf interpreteren.
De waarde van head, track en sector specificeert de locatie van de startsector voor de bewerking. nsectors specificeert het aantal sectoren dat moet worden gelezen of geschreven en bufferpunten naar de buffer waar gegevens worden gelezen en geschreven. Afhankelijk van de waarde van cmd zijn de andere parameters in de diskinfo_t-structuur mogelijk wel of niet nodig.
De waarde voor de specificatie van het schijfstation dat moet worden gebruikt in de functies biosdisk en _bios_disk is weergegeven in de volgende tabel:
Drive Waarde |
Te gebruiken schijfstation |
0 |
Eerste floppydiskdrive |
1 |
Tweede floppydiskdrive |
2 |
Derde floppydiskdrive |
.... |
(enzovoort) |
0x80 |
Eerste harde schijf |
0x81 |
Tweede harde schijf |
0x82 |
Derde harde schijf |
.... |
(enzovoort) |
Genoeg theorie! Laten we nu eens kijken naar wat praktische zaken en een voorbeeld van deze functies. Het volgende voorbeeld leest de sectoren van beide zijden van vier sporen van de floppy en slaat de inhoud op in het bestand, opgegeven door de gebruiker. Het maakt niet uit of u de bestanden van uw disk hebt verwijderd, omdat het programma het oppervlak van de disk rechtstreeks leest.
Om de verwijderde gegevens te zien, is het beter om een volledig geformatteerde floppy disk te nemen en wat tekstbestanden te kopiëren, zoals uw .c programma's, codering of andere tekstbestanden (zodat u de inhoud van de bestanden kunt begrijpen) die ongeveer 73 KB in beslag nemen (gegevens opgeslagen in vier sporen, twee zijden en 18 sectoren in elk spoor. Elke sector is 512 bytes). Het programma is ontwikkeld om het voorbeeld te demonstreren. U kunt het echter aanpassen en ontwikkelen om klaar te zijn om gegevens te herstellen.
/* Programma om 4 sporen (0, 1, 2 en 3) van een floppy te lezen en de inhoud naar het opgegeven bestand te schrijven */
#include <bios.h>
#include <stdio.h>
#include<conio.h>
leeg hoofd(leeg)
{
int hoofd,track;
int resultaat,i,sector;
char bestandsnaam[80];
teken *buffer;
structuur diskinfo_t dinfo;
statische char dbuf[512];
BESTAND *tt;
clrscr();
/// Controleer of de drive gereed is of niet \\\
als(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf(" Drive A: Niet gereed:\n Plaats schijf in Drive A:
en druk op een toets\n");
halen();
}
/* Haal de bestandsnaam op om de gegevens van de sectoren van de schijf op te slaan */
printf("\nVoer de naam van het doelbestand in met het volledige pad
om de gegevens op te slaan \n\n >");
krijgt(bestandsnaam);
als((tt= fopen(bestandsnaam, "wb"))==NULL)
{
printf("Kan het bestand niet openen!!!");
halen();
}
voor(track=0;track<4;track++)
{
voor(hoofd=0; hoofd<=1;hoofd++)
{
voor(sector=1;sector<=18;sector++)
{
dinfo.drive = 0; /* schijfnummer voor A: */
dinfo.head = head; /* schijfkopnummer */
dinfo.track = track; /* tracknummer */
dinfo.sector = sector; /* sectornummer */
dinfo.nsectors = 1; /* sectoraantal */
dinfo.buffer = dbuf; /* gegevensbuffer */
/// Toon de status \\\
gotoxy(10,10); printf("Gegevens lezen van: Head=%d
Spoor=%d Sector=%d",
hoofd, spoor, sector);
fprintf(tt,"\n Gegevens gelezen van: Head=%d Track=%d Sector=%d\n",
hoofd, spoor, sector);
/// Lees de opgegeven sectoren \\\
resultaat = _bios_disk(_DISK_READ, &dinfo);
/// Sla de inhoud op in het opgegeven bestand \\\
als ((resultaat & 0xff00) == 0)
{
voor(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Foutmelding op het scherm en in het bestand weergeven voor fout tijdens het lezen van een sector */
anders
{
printf("\n Kan niet lezen op Head= %d Track= %d
Sector= %d\n",kop,spoor,sector);
fprintf(tt,"\n Kan niet lezen op Head= %d Track= %d
Sector =%d\n",kop,spoor,sector);
}
}
}
}
fsluiten(tt);
}
Het voorbeeld toont het gebruik van de functies biosdisk en _bios_disk. De biosdisk-functie controleert of de schijf gereed is of niet en adresmarkering wordt gevonden. De _bios_disk-functie leest de sectoren van beide zijden tot vier sporen.
De volgorde van het lezen (of schrijven) op het oppervlak van de schijf moet als volgt zijn:
absread en abswrite Functies
Deze functies zijn gedefinieerd in Dos.h. De absread-functie leest absolute schijfsectoren en de abswrite-functie schrijft absolute schijfsectoren. De functie absread gebruikt DOS-interrupt 0x25 om specifieke schijfsectoren te lezen en de functie abswrite gebruikt DOS-interrupt 0x26 om specifieke schijfsectoren te schrijven.
Absolute lees- of schrijfbewerkingen verlopen op sequentiële wijze door de sector(en) stap voor stap te verhogen en zijn volledig onafhankelijk van de kop- en tracknummers etc. Het is de taak van het BIOS van de computer om de absolute sectoren te vertalen naar de respectievelijke track-, kop- en sectornummers.
Absolute lees- en schrijfbewerkingen worden aanbevolen in programma's waarbij we lees-/schrijfbewerkingen op de gehele schijf gaan uitvoeren en we extra codering en lussen in ons programma willen vermijden om de snelheid van het programma zo hoog mogelijk te maken.
Beide functies absread en abswrite negeren de logische structuur van een schijf en besteden geen aandacht aan bestanden, FAT's of mappen. Deze functies voeren rechtstreeks absolute lees- en schrijfbewerkingen uit op het oppervlak van de schijf. Dit is de reden dat abswrite, indien onjuist gebruikt, bestanden, mappen en FAT's kan overschrijven.
De declaratie van de absread-functie is als volgt:
int absread(int drive, int nsects, long lsect,
leeg *buffer);
en de abswrite-functie wordt als volgt gedeclareerd:
int abswrite(int drive, int nsects, long lsect,
leeg *buffer);
Waarbij de betekenis van parameters als volgt is:
Param. |
Wat het is/doet |
drijfveer |
Stationsnummer om te lezen (of schrijven): 0 = A, 1 = B, etc. |
insecten |
Aantal te lezen (of te schrijven) sectoren |
doorsnee |
Begin logisch sectornummer |
buffer |
Geheugenadres waar de gegevens moeten worden gelezen (of geschreven) |
Bij succes retourneren beide functies 0. Wanneer er een fout optreedt, retourneren beide functies -1 en stellen ze foutnummer in op de waarde van het AX-register dat door de systeemoproep wordt geretourneerd.
Het aantal sectoren voor lees- of schrijfbewerkingen is beperkt tot 64K of de grootte van de buffer, afhankelijk van welke kleiner is. We zullen echter in de volgende hoofdstukken het gebruik van Huge memory leren om de geheugenlimiet van 64K te overschrijden, om een zeer snel programma te ontwikkelen.
|
Interruptverwerking met C
C wordt soms een high level assemblertaal genoemd omdat het de verschillende interrupts kan aanroepen met behulp van enkele van zijn gedefinieerde functies. Enkele belangrijke functies zijn als volgt:
- int86: roept MS-DOS-interrupts aan.
- int86x: roept MS-DOS-interrupt aan met segmentregisterwaarden.
- intdos: roept MS-DOS-service aan met behulp van andere registers dan DX en AL
- intdosx: roept MS-DOS-service aan met segmentregisterwaarden.
- segread: Leest segmentregisters
We zullen deze functies in detail bespreken. Allereerst bespreken we een aantal vooraf gedefinieerde structuren en vakbonden die vaak of noodzakelijkerwijs worden gebruikt met deze functies.
SREGS-structuur
Deze structuur is gedefinieerd in dos.h en is een structuur van de segmentregisters die zijn doorgegeven aan en ingevuld door de functies int86x, intdosx en segread. De declaratie van de structuur is als volgt:
structuur SREGS {
ongetekende int es;
ongetekende int cs;
ongetekende int ss;
ongetekende int ds;
};
REGS-vakbond
REGS is de unie van twee structuren. De unie REGS is gedefinieerd als dos.h en wordt gebruikt om informatie door te geven aan en van de functies int86, int86x, intdos en intdosx. De declaratie van de unie is als volgt:
vakbond REGS {
struct WOORDREGELS x;
structuur BYTEREGS h;
};
BYTEREGS en WORDREGS-structuren
De BYTEREGES en WORDREGS structuren zijn gedefinieerd in dos.h en deze worden gebruikt voor het opslaan van byte en word registers. De WORGREGS structuur geeft de gebruiker toegang tot de registers van CPU als 16-bit hoeveelheden, terwijl de BYTEREGES structuur toegang geeft tot de individuele 8-bit registers.
De BITEREGS-structuur wordt als volgt gedeclareerd:
structuur BYTEREGS {
ongetekend char al, ah, bl, bh;
ongetekende tekens cl, ch, dl, dh;
};
En de WORDREGS-structuur wordt als volgt gedeclareerd:
struct WOORDREGELS {
ongetekende int ax, bx, cx, dx;
unsigned int ja, van, cflag, vlaggen;
};
int86 en int86x functies
Deze functies zijn de algemene 8086 software interrupt interfaces gedefinieerd in dos.h. Registers worden ingesteld op de gewenste waarden en deze functies worden aangeroepen om de MS-DOS interrupts aan te roepen. De declaratie van de int86 functie is als volgt:
int int86(int intno, unie REGS *inregs,
vakbond REGS *outregs);
int86x is de variatie van de int86-functie. Deze wordt als volgt gedeclareerd:
int int86x(int intno, unie REGS *inregs,
unie REGS *outregs, struct SREGS *segregs);
Zowel de functies int86 als int86x voeren een 8086 software-interrupt uit, gespecificeerd door het argument intno. We kunnen ook zeggen dat de te genereren interrupt wordt gespecificeerd door intno.
Met de int86x-functie is alleen toegang mogelijk tot ES en DS en niet tot CS en SS. U kunt dus een 8086-software-interrupt aanroepen die een waarde van DS aanneemt die verschilt van het standaardgegevenssegment en/of een argument in ES aanneemt.
Deze functies kopiëren registerwaarden van inregs naar de registers vóór de uitvoering van de software-interrupt. De functie int86x kopieert ook de segregs->ds en segregs->es waarden naar de corresponderende registers vóór de uitvoering van de software-interrupt. Deze functie stelt programma's die far pointers of een groot datageheugenmodel gebruiken in staat om te specificeren welk segment moet worden gebruikt voor de software-interrupt.
De functies kopiëren de huidige registerwaarden naar outregs, de status van de carry-vlag naar het veld x.cflag in outregs en de waarde van het 8086 flags-register naar het veld x.flags in outregs, nadat de software-interrupt is geretourneerd. De functie int86x herstelt ook DS en stelt de velden segregs->es en segregs->ds in op de waarden van de overeenkomstige segmentregisters.
In beide functies kunnen inregs en outregs naar dezelfde structuur verwijzen en beide functies retourneren de waarde van AX na voltooiing van de software-interrupt. Als de carry-vlag is ingesteld, geeft dit doorgaans aan dat er een fout is opgetreden.
De REGS-unie-elementen die in C worden gebruikt en die gelijkwaardig zijn aan Assembler, staan in de onderstaande tabel:
16-bit |
8-bit |
C-taal |
Assemblertaal |
C-taal |
Assemblertaal |
inregs.x.ax |
BIJL |
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 |
KL |
|
|
inregs.h.ch |
CH |
inregs.x.dx |
DX |
inregs.h.dl |
DL |
|
|
inregs.h.dh |
DH |
inregs.x.si |
EN |
|
|
inregs.x.of |
VAN |
|
|
inregs.x.cvlag |
CF |
|
|
Laten we de voorbeelden van int86 en int86x functies bekijken. Het volgende programma scant elke sector van de floppy disk en print de status van elke sector op het scherm.
/* Programma om elke sector van de floppydisk te scannen en de status af te drukken */
#include<dos.h>
#include<conio.h>
leeg hoofd()
{
int hoofd,spoor,sector,i;
char *buf;
vakbond REGS inregs, outregs;
structuur SREGS sregs;
clrscr();
/// Schijf initialiseren door schijfsysteem te resetten \\\
gotoxy(10,2); printf("De schijf initialiseren...");
voor(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Functie Nummer
inregs.h.dl=0x00; // Floppydisk
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("De status van de schijf is als....\n");
/* Scan de floppydisk van 0 tot 79 tracks (totaal aantal tracks 80) */
voor(track=0;track<=79;track++)
voor(hoofd=0;hoofd<=1;hoofd++)
voor(sector=1;sector<=18;sector++)
{
inregs.h.ah = 0x04; /// functie Nummer
inregs.h.al = 1; /// Aantal sectoren
inregs.h.dl = 0x00; /// Floppydisk
inregs.h.ch = spoor;
inregs.h.dh = hoofd;
inregs.h.cl = sector;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// De status van de gescande sector afdrukken \\\\
schakelaar(outregs.h.ah)
{
geval 0x00:
cprintf("STATUS: Geen fout !!");
pauze;
geval 0x01:
cprintf("STATUS: Ongeldige opdracht ");
pauze;
geval 0x02:
cprintf("STATUS: Adresmarkering niet gevonden ");
pauze;
geval 0x03:
cprintf("STATUS: Poging om te schrijven naar
schrijfbeveiligde schijf ");
pauze;
geval 0x04:
cprintf("STATUS: Sector niet gevonden ");
pauze;
geval 0x05:
cprintf("STATUS: Reset mislukt (harde schijf) ");
pauze;
geval 0x06:
cprintf("STATUS: Schijf gewijzigd sinds laatste
operatie ");
pauze;
geval 0x07:
cprintf("STATUS: Activiteit van aandrijfparameter
mislukt") ;
pauze;
geval 0x08:
cprintf("STATUS: Directe geheugentoegang (DMA)
overschreden ");
pauze;
geval 0x09:
cprintf("STATUS: Poging om DMA uit te voeren over
64K grens ");
pauze;
geval 0x0A:
cprintf("STATUS: Slechte sector gedetecteerd ");
pauze;
geval 0x0B:
cprintf("STATUS: Slechte track gedetecteerd ");
pauze;
geval 0x0C:
cprintf("STATUS: Mediatype niet gevonden ");
pauze;
geval 0x0D:
cprintf("STATUS: Ongeldig aantal sectoren op
formatteren (harde schijf) ");
pauze;
geval 0x0E:
cprintf("STATUS: Controlegegevens adresmarkering
gedetecteerd (harde schijf) ");
pauze;
geval 0x0F:
cprintf("STATUS: DMA-arbitrageniveau uit
bereik (harde schijf) ");
pauze;
geval 0x10:
cprintf("STATUS: Slechte CRC/ECC bij het lezen van de schijf ");
pauze;
geval 0x11:
cprintf("STATUS: CRC/ECC gecorrigeerde datafout ");
pauze;
geval 0x20:
cprintf("STATUS: Controller is mislukt ");
pauze;
geval 0x31:
cprintf("STATUS: Geen media in station (IBM/MS INT 13H
extensies) ");
pauze;
geval 0x32:
cprintf("STATUS: Onjuist schijftype opgeslagen in
CMOS (Compaq) ");
pauze;
geval 0x40:
cprintf("STATUS: Zoekbewerking mislukt ");
pauze;
geval 0x80:
cprintf("STATUS: Bijlage kon niet reageren
(Schijf time-out) ");
pauze;
geval 0xAA:
cprintf("STATUS: Schijf niet gereed (harde schijf)
alleen) ");
pauze;
geval 0xB0:
cprintf("STATUS: Volume niet vergrendeld in station (INT
13H-extensies) ");
pauze;
geval 0xB1:
cprintf("STATUS: Volume vergrendeld in station (INT 13H-extensies) ");
pauze;
geval 0xB2:
cprintf("STATUS: Volume niet verwijderbaar (INT 13H
extensies) ");
pauze;
geval 0xB3:
cprintf("STATUS: Volume in gebruik (INT 13H
extensies) ");
pauze;
geval 0xB4:
cprintf("STATUS: Lock count overschreden (INT 13H
extensies) ");
pauze;
geval 0xB5:
cprintf("STATUS: Geldige uitwerpaanvraag mislukt (INT
13H-extensies) ");
pauze;
geval 0xBB:
cprintf("STATUS: Er is een ongedefinieerde fout opgetreden (harde
alleen schijf) ");
pauze;
geval 0xCC:
cprintf("STATUS: Er is een schrijffout opgetreden ");
pauze;
geval 0xE0:
cprintf("STATUS: Statusregisterfout ");
pauze;
geval 0xFF:
cprintf("STATUS: Sense-bewerking mislukt ");
pauze;
standaard: cprintf("STATUS: ONBEKENDE StatusCODE ");
}
printf("\nHuidige positie= Track:%d Hoofd:%d Sector:%d \n",
spoor,hoofd,sector);
}
gotoxy(10,24);printf("Scannen voltooid!! Druk op een willekeurige toets OM
Uitgang..");
halen();
}
Het programma toont het voorbeeld van het gebruik van de functies int86 en int86x. In dit programma initialiseert de int86-functie de disk door het disksysteem te resetten, met behulp van functie 00H van INT 13H. De int86x-functie verifieert elke sector van de floppy (1,44 Mb, 3½ floppy disk) van beide kanten, tot 0 tot 79 tracks (totaal 80 tracks) met behulp van de functie 04H van INT 13H.
segread-functie
Deze functie is gedefinieerd in dos.h. Deze functie leest de segmentregisters. De declaratie van de functie is als volgt:
void segread(struct SREGS *segp);
waar segread de huidige waarden van de segmentregisters in de structuur *segp plaatst. Er wordt niets geretourneerd door de functie en de aanroep is bedoeld voor gebruik met intdosx en int86x. laten we een voorbeeld bekijken
#include <stdio.h>
#include <dos.h>
leeg hoofd()
{
struct SREGS-segmenten;
segmenteren(&segmenteren);
printf("Huidige segmentregisterinstellingen\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segmenten.es, segmenten.ss);
halen();
}
De uitvoer van het programma zal er ongeveer zo uitzien:
Huidige segmentregisterinstellingen
CS: EED DS: 10BA
EN: 10BA SS: 10BA
intdos en intdosx Functies
Deze functies zijn gedefinieerd in dos.h. Dit zijn de algemene DOS-interruptinterfaces. De functie intdos roept MS-DOS-serviceregisters aan, vervolgens DX en AL, terwijl de functie intdosx MS-DOS-service aanroept met segmentregisterwaarden.
De declaratie van de intdos-functie is als volgt:
int intdos(union REGS *inregs, union REGS *outregs);
en de declaratie van de intdosx-functie is als volgt:
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
De functies intdos en intdosx voeren DOS-interrupt 0x21 uit om een opgegeven DOS-functie aan te roepen. De waarde van inregs->h.ah specificeert de DOS-functie die moet worden aangeroepen. De functie intdosx kopieert ook de waarden segregs ->ds en segregs ->es naar de overeenkomstige registers voordat de DOS-functie wordt aangeroepen en herstelt vervolgens DS.
Deze functie van de functies laat de programma's die verre pointers of een groot datageheugenmodel gebruiken, specificeren welk segment moet worden gebruikt voor de uitvoering van de functie. Met de intdosx-functie kunt u een DOS-functie aanroepen die een waarde van DS aanneemt die verschilt van het standaarddatasegment en/of een argument in ES aanneemt.
Beide functies retourneren de waarde van AX na voltooiing van de DOS-functieaanroep en als de carry-vlag is ingesteld (outregs -> x.cflag != 0), geeft dit aan dat er een fout is opgetreden.
Na de interrupt 0x21 retourneert de functie de huidige registerwaarden naar outregs, de status van de carry-vlag naar het x.cflag-veld in outregs en de waarde van het 8086 flags-register naar het x.flags-veld in outregs. Zowel inregs als outregs kunnen naar dezelfde structuur verwijzen. Laten we de voorbeelden van deze functies bekijken.
Het voorbeeld van het gebruik van de intdos-functie is hieronder gegeven. Dit programma verkrijgt de geselecteerde informatie over de floppy (1,44 Mb, 3½ inch floppy disk) diskdrive. Dit programma biedt de toewijzingsinformatie van een floppy disk.
/* De schijftoewijzingsinformatie voor schijfgebruik ophalen */
#include <dos.h> /* voor intdos() en union REGS */
#include <stdio.h> /* voor printf() */
vakbond REGS inregs, outregs;
leeg hoofd()
{
inregs.h.ah = 0x36; /* schijfruimte vrijmaken
functie nummer */
inregs.h.dl = 0x01; /* station A: */
intdos(&inregs, &outregs);
printf("%d sectoren/cluster,\n%d clusters,\n%d bytes/sector,
\n%d totale clusters",
uitregs.x.ax,uitregs.x.bx,
uitregs.x.cx, uitregs.x.dx);
halen();
}
De uitvoer van het programma zal er als volgt uitzien:
1 sectoren/cluster,
1933 clusters,
512 bytes/sector,
2843 totale clusters
Laten we nu een voorbeeld bekijken van de functie intdosx . Het volgende voorbeeld toont het gebruik van de functie intdosx . Het programma geeft een string uit naar de standaarduitvoer.
/* Het programma om 'string' naar de standaarduitvoer te sturen. */
#include <dos.h>
vakbond REGS inregs, outregs;
struct SREGS scheidt;
char far *string = "deze string staat niet in de
standaard gegevenssegment$";
leeg hoofd()
{
inregs.h.ah = 0x09; /* functie nummer */
inregs.x.dx = FP_OFF(string);/*DS:DX is ver
adres van 'string */
segmenten.ds = FP_SEG(tekenreeks);
intdosx(&inregs, &outregs, &segregs);
halen();
}
De uitvoer van het programma zal er als volgt uitzien:
Deze string bevindt zich niet in het standaardgegevenssegment |
Hier printen we de gegeven string met de functie intdosx, door functie 09H van INT 21H. Houd er altijd rekening mee dat de gegeven string altijd moet eindigen met het teken “$”.
Hoe weet u het nummer van de fysieke harde schijf?
Het fysieke harde schijfnummer is erg belangrijk en moet exact worden geschreven. De illegale schijfspecificatie kan leiden tot groot gegevensverlies. We moeten zeker zijn van het schijfnummer tijdens het dataherstel of het programmeren van schijfproblemen. Hoe u het schijfnummer van een schijf met verschillende schijfindelingen kunt achterhalen, kunt u schatten aan de hand van de volgende voorbeelden.
Volgens een veelvoorkomende mythe worden de nummers van de fysieke schijven verstrekt op basis van de verbindingsstatus van de schijf. In sommige of speciale gevallen kan dit echter afhankelijk zijn van de opstartprocedure of opstartinstellingen van uw besturingssysteem.
Het meest algemene idee voor het fysieke schijfnummer dat door BIOS wordt gegeven, is hier gegeven, maar zelfs dan moet u met behulp van een schijfbewerkingstool of met de programma's die in de volgende hoofdstukken worden gegeven, de configuratie van de schijf bevestigen. Nadat u zeker bent, moet u een beslissing nemen over het uitvoeren van dergelijke programma's die de gegevens kunnen beschadigen of beschadigen, als ze illegaal of bij gebrek aan kennis worden gebruikt.
Over het algemeen geldt dat als er twee schijven op het systeem zijn aangesloten, waarvan er één de primaire master is en de andere de secundaire master, de eerste voorkeur wordt gegeven aan de primaire master (en vervolgens aan de primaire slave indien beschikbaar) en vervolgens aan de secundaire master (en vervolgens aan de secundaire slave indien beschikbaar, enzovoort). Het fysieke nummer wordt gegeven op basis van hun voorkeuren.
Laten we aannemen dat uw systeem maximaal vier harde schijven tegelijk ondersteunt. Alle vier de harde schijven kunnen worden aangesloten zoals aangegeven Volgende:
Primaire Meester |
Primaire slaaf |
Secundaire Meester |
Secundaire slaaf |
Laten we nu eens wat cases bekijken voor het aantal fysieke schijven. Hierbij neem ik aan dat u de schijven hebt aangesloten met de juiste jumperinstellingen zoals vermeld door de fabrikant van de schijf, en in de juiste Master-Slave-instellingen:
- Als alle vier de harde schijven op het systeem zijn aangesloten: als alle vier de schijven op het systeem zijn aangesloten, zijn de fysieke schijfnummers als volgt:
Primair/Secundair (Master/Slave) |
Staat |
Fysiek schijfnummer en beschrijving |
Primaire Meester |
Schijf is aanwezig |
Het fysieke schijfnummer is 80H. In dit geval wordt de harde schijf de eerste harde schijf genoemd . |
Primaire slaaf |
Schijf is aanwezig |
Het fysieke schijfnummer is 81H. In dit geval wordt de harde schijf de tweede harde schijf genoemd . |
Secundaire Meester |
Schijf is aanwezig |
Het fysieke schijfnummer is 82H. In dit geval wordt de harde schijf de derde harde schijf genoemd . |
Secundaire slaaf |
Schijf is aanwezig |
Het fysieke schijfnummer is 83H. In dit geval wordt de harde schijf de vierde harde schijf genoemd . |
- Als er drie harde schijven op het systeem zijn aangesloten: als er drie harde schijven op het systeem zijn aangesloten, worden de fysieke schijfnummers weergegeven volgens hun bevestigingsvoorkeuren. De volgende voorbeelden geven enkele van de regelingen weer:
Primair/Secundair (Master/Slave) |
Staat |
Fysiek schijfnummer en beschrijving |
Primaire Meester |
Schijf is aanwezig |
Het fysieke schijfnummer is 80H. In dit geval wordt de harde schijf de eerste harde schijf genoemd . |
Primaire slaaf |
Schijf is aanwezig |
Het fysieke schijfnummer is 81H. In dit geval wordt de harde schijf de tweede harde schijf genoemd . |
Secundaire Meester |
Schijf is aanwezig |
Het fysieke schijfnummer is 82H. In dit geval wordt de harde schijf de derde harde schijf genoemd . |
Secundaire slaaf |
Schijf niet aanwezig |
------------------- |
Primair/Secundair (Master/Slave) |
Staat |
Fysiek schijfnummer en beschrijving |
Primaire Meester |
Schijf niet aanwezig |
------------------- |
Primaire slaaf |
Schijf is aanwezig |
Het fysieke schijfnummer is 80H. In dit geval wordt de harde schijf de eerste harde schijf genoemd . |
Secundaire Meester |
Schijf is aanwezig |
Het fysieke schijfnummer is 81H. In dit geval wordt de harde schijf de tweede harde schijf genoemd . |
Secundaire slaaf |
Schijf is aanwezig |
Het fysieke schijfnummer is 82H. In dit geval wordt de harde schijf de derde harde schijf genoemd . |
Primair/Secundair (Master/Slave) |
Staat |
Fysiek schijfnummer en beschrijving |
Primaire Meester |
Schijf is aanwezig |
Het fysieke schijfnummer is 80H. In dit geval wordt de harde schijf de eerste harde schijf genoemd . |
Primaire slaaf |
Schijf niet aanwezig |
------------------- |
Secundaire Meester |
Schijf is aanwezig |
Het fysieke schijfnummer is 81H. In dit geval wordt de harde schijf de tweede harde schijf genoemd . |
Secundaire slaaf |
Schijf is aanwezig |
Het fysieke schijfnummer is 82H. In dit geval wordt de harde schijf de derde harde schijf genoemd . |
Primair/Secundair (Master/Slave) |
Staat |
Fysiek schijfnummer en beschrijving |
Primaire Meester |
Schijf is aanwezig |
Het fysieke schijfnummer is 80H. In dit geval wordt de harde schijf de eerste harde schijf genoemd . |
Primaire slaaf |
Schijf is aanwezig |
Het fysieke schijfnummer is 81H. In dit geval wordt de harde schijf de tweede harde schijf genoemd . |
Secundaire Meester |
Schijf niet aanwezig |
------------------- |
Secundaire slaaf |
Schijf is aanwezig |
Het fysieke schijfnummer is 82H. In dit geval wordt de harde schijf de derde harde schijf genoemd . |
- Als er twee harde schijven op het systeem zijn aangesloten: Op dezelfde manier, als er twee harde schijven op het systeem zijn aangesloten, zullen de fysieke schijfnummers zijn volgens hun bevestigingsvoorkeuren. Het volgende voorbeeld illustreert dit:
Primair/Secundair (Master/Slave) |
Staat |
Fysiek schijfnummer en beschrijving |
Primaire Meester |
Schijf is aanwezig |
Het fysieke schijfnummer is 80H. In dit geval wordt de harde schijf de eerste harde schijf genoemd . |
Primaire slaaf |
Schijf niet aanwezig |
------------------- |
Secundaire Meester |
Schijf niet aanwezig |
------------------- |
Secundaire slaaf |
Schijf is aanwezig |
Het fysieke schijfnummer is 81H. In dit geval wordt de harde schijf de tweede harde schijf genoemd . |
- Als er één harde schijf op het systeem is aangesloten: U hoeft er niet over na te denken. Als er maar één schijf beschikbaar is, is het fysieke schijfnummer 80H.
Interrupt 13H (INT 13H), ROM BIOS-schijfstuurprogrammafuncties
De beschrijving van INT 13H-functies is hier gegeven. Deze functies moeten met zorg worden geleerd, omdat het verkeerd gebruiken van deze functies of het gebruik ervan met gebrek aan zorg of gebrek aan kennis, kan leiden tot groot gegevensverlies of veel andere problemen. Echter, als ze op een gepaste en juiste manier worden gebruikt, helpen deze functies om de codering van uw programma te minimaliseren en uw programmering eenvoudig en gemakkelijk te maken.
INT 13U (0x13)
Functie 00H (0x00) Schijfsysteem resetten
Bellen met AH = 00H
DL = rijden
00H-7FH floppydisk
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Reset de diskcontroller, kalibreert de aangesloten drives opnieuw. De lees-/schrijfarm wordt verplaatst naar cilinder 0 en bereidt zich voor op de disk I/O.
Deze functie moet worden aangeroepen na een mislukte floppy disk Read, write, Verify of Format-aanvraag voordat de bewerking opnieuw wordt geprobeerd. Als de functie wordt aangeroepen met een vaste diskdrive (d.w.z. door DL>=80H te selecteren), worden de floppy diskcontroller en vervolgens de vaste diskcontroller gereset.
INT 13U (0x13)
Functie 01H (0x01) Schijfsysteemstatus ophalen
Bellen met: AH = 01H
DL = rijden
00H-7FH floppydisk
80H-FFH vaste schijf
Retourneert: AH = 00H
AL = status van vorige schijfbewerking
(Zie de eerder gegeven tabel voor fouten
en beschrijving van statuscodes).
Reacties:
Geeft de status van de meest recente schijfbewerking terug
INT 13U (0x13)
Functie 02H (0x02) Sector lezen
Bellen met: AH = 02H
AL = aantal sectoren
CH = cilinder
CL = sector
DH = hoofd
DL = rijden
00H-7FH floppydisk
80H-FFH vaste schijf
ES:BX = segment: offset van buffer
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
AL = aantal overgedragen sectoren
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie leest een of meer sectoren van de schijf in het geheugen. Op vaste schijven worden de bovenste 2 bits van het 10-bits cilindernummer in de bovenste 2 bits van register CL geplaatst.
INT 13U (0x13)
Functie 03H (0x03) Sector schrijven
Bellen met: AH = 03H
AL = aantal sectoren
CH = cilinder
CL = sector
DH = hoofd
DL = rijden
00H-7FH floppydisk
80H-FFH vaste schijf
ES: BX = segment: offset van buffer
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
AL = aantal overgedragen sectoren
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie schrijft een of meer sectoren van het geheugen naar de schijf. Op vaste schijven worden de bovenste 2 bits van het 10-bits cilindernummer in de bovenste 2 bits van register CL geplaatst.
INT 13U (0x13)
Functie 04H (0x04) >> Sector verifiëren
Bellen met: AH = 04H
AL = aantal sectoren
CH = cilinder
CL = sector
DH = rijden
00H-7FH floppydisk
80H-FFH vaste aandrijving
ES: BX = segment: offset van buffer
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
AL = aantal geverifieerde sectoren
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Opmerkingen:
Deze functie verifieert de adresvelden van een of meer sectoren. Er worden geen gegevens naar of van het geheugen overgebracht door deze bewerking. Op vaste schijven worden de bovenste 2 bits van het 10-bits cilindernummer in de bovenste 2 bits van register CL geplaatst.
Deze functie kan worden gebruikt om te testen of er een leesbare media in een floppy disk drive zit. Het aanvragende programma moet het floppy disk systeem resetten (INT 13H Functie 00H) en de bewerking drie keer opnieuw proberen voordat wordt aangenomen dat er geen leesbare floppy disk aanwezig is. Het wordt aanbevolen bij de meeste floppy initialisatiebewerkingen.
INT 13U (0x13)
Functie 05H (0x05) >> Track formatteren
Bellen met: AH = 05H
AL = interleave (PC/XT vaste schijven)
CH = cilinder
DH = hoofd
DL = rijden
00H-7FH floppydisk
80H-FFH vaste schijf
ES: BX = segment: offset van adresveldlijst
(Behalve vaste PC/XT-schijf)
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status (zie de gegeven statustabel)
eerder)
Opmerkingen:
Initialiseer schijfsector en volg adresvelden op het opgegeven spoor. Op floppydisks bestaat de adresveldlijst uit een reeks van 4-byte-items, één item per sector. De indeling is gegeven in de volgende tabel.
Op vaste schijven worden de bovenste 2 bits van het 10-bits cilindernummer in de bovenste 2 bits van register CL geplaatst.
Byte |
Inhoud |
0 |
Cilinder |
1 |
Hoofd |
2 |
Sector |
3
|
Sector-groottecode
Waarde |
Beschrijving |
00U |
128 bytes per sector |
01U |
256 bytes per sector |
02U |
512 bytes per sector |
03U |
1024 bytes per sector |
|
INT 13U (0x13)
Functie 06H (0x06) >> Formatteer slecht spoor
Bellen met: AH = 06H
AL = doorschieten
CH = cilinder
DH = hoofd
DL = rijden
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie is alleen gedefinieerd voor vaste PC/XT-schijven. Het initialiseert een track, schrijft schijfadresvelden en datasectoren en stelt bad sector flags in.
INT 13U (0x13)
Functie 07H (0x07) >> Schijf formatteren
Bellen met: AH = 07H
AL = doorschieten
CH = cilinder
DL = rijden
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status (zie de gegeven statustabel)
eerder)
Opmerkingen:
Deze functie is alleen gedefinieerd voor vaste PC/XT-schijven. Het formatteert de gehele schijf, schrijft schijfadresvelden en gegevenssectoren, beginnend bij de opgegeven cilinder.
INT 13U (0x13)
Functie 08H (0x08) >> Aandrijfparameters ophalen
Bellen met: AH = 08H
DL = rijden
00H-7FH floppydisk
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
BL = drive type (PC/AT en PS/2 floppy)
schijf)
Waarde |
Beschrijving |
01U |
360KB, 40 sporen, 5,25” |
02U |
1,2 MB, 80 sporen, 5,25” |
03U |
720KB, 80 sporen, 3,5” |
04U |
1,44 MB, 80 sporen, 3,5” |
CH = lage 8 bits van maximale cilinder
nummer
CL = bits 6-7 hoogste orde 2 bits van maximaal
cilindernummer bits 0-5 maximaal
sectornummer
DH = maximaal hoofdnummer
DL = aantal schijven
ES: DI = segment: offset van schijfstation
parametertabel
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Opmerkingen:
Deze functie retourneert verschillende parameters voor de opgegeven drive. De waarde die wordt geretourneerd in register DL weerspiegelt het werkelijke aantal fysieke drives dat is aangesloten op de adapter voor de gevraagde drive.
INT 13U (0x13)
Functie 09H (0x09) >> Initialiseer vaste schijfkarakteristieken
Bellen met: AH = 09H
DL = rijden
80H-FFH vaste schijf
Op de PC/XT Vector voor INT 41H
moet verwijzen naar het schijfparameterblok of, op de PC/AT en PS/2
Vector voor INT 41H moet naar schijf verwijzen
parameterblok voor aandrijving 0
Vector voor INT 46H moet naar schijf verwijzen
parameterblok voor aandrijving 1
Retourneert : Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie initialiseert de vaste schijfcontroller voor volgende I/O-bewerkingen, met behulp van de waarden die in de ROM BIOS-schijfparameterblok(ken) zijn gevonden. De functie wordt alleen op vaste schijven ondersteund. Het parameterblokformaat voor vaste PC- en PC/XT-schijven is als volgt:
Verandering(en) |
Inhoud |
00U-01U |
Maximaal aantal cilinders |
02U |
Maximaal aantal hoofden |
03U-04U |
Starten met gereduceerde schrijfstroomcilinder |
05U-06U |
Beginnen met schrijven pre-compensatie cilinder |
07U |
Maximale ECC-burstlengte |
08U
|
Rijoptie
Beetje(s) |
Betekenis (indien ingesteld) |
0 – 2 |
aandrijfoptie |
3 – 5 |
gereserveerd (0) |
6 |
ECC-items uitschakelen |
7 |
schijftoegangspogingen uitschakelen |
|
09U |
Standaard time-outwaarde |
0AH |
Time-outwaarde voor formatteren schijf |
0BH |
Time-outwaarde voor controle-drive |
0CH-0FH |
Gereserveerd |
Het parameterblokformaat voor PC/AT en PS/2 vaste schijven is als volgt:
Verandering(en) |
Inhoud |
00U_01U |
maximaal aantal cilinders |
02U |
maximaal aantal hoofden |
03U-04U |
Gereserveerd |
05U-06U |
begin schrijven pre compensatie cilinder |
07U |
maximale ECC-burstlengte |
08U |
Rijopties
Beetje(s) |
Betekenis (indien ingesteld) |
0 – 2 |
niet gebruikt |
3 |
meer dan 8 hoofden |
4 |
niet gebruikt |
5 |
defectenkaart van de fabrikant aanwezig bij
maximale cilinder +1 |
6 – 8 |
niet nul (10, 01 of 11) als herhalingen zijn uitgeschakeld |
|
09H-0BH |
Gereserveerd |
0CH-0DH |
landingszone cilinder |
0EH |
sector per spoor |
0FH |
Gereserveerd |
INT 13U (0x13)
Functie 0A H (0x0A of 10) >> Lees sector lang
Bellen met: AH = 0AH
AL = aantal sectoren
CH = cilinder
CL = sector
DH = hoofd
DL = rijden
80H-FFH vaste schijf
ES: BX = segment: offset van buffer
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
AL = aantal overgedragen sectoren
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Opmerkingen:
Deze functie leest een sector of sectoren van de schijf in het geheugen, samen met een 4 byte Error Correcting Code (ECC)-code voor elke sector. In tegenstelling tot de normale Read sector-functie (INT 13H (0x13) Functie 02H), worden ECC-fouten niet automatisch gecorrigeerd. Multi-sector transfers worden beëindigd na elke sector met een leesfout.
Deze functie wordt alleen ondersteund op vaste schijven. De bovenste 2 bits van het 10-bits cilindernummer worden in de bovenste 2 bits van register CL geplaatst.
INT 13U (0x13)
Functie 0BH (0x0B of 11) >> Schrijf sector lang
Aanroepen met: AH = 0BH
AL = aantal sectoren
CH = cilinder
CL = sector
DH = hoofd
DL = rijden
80H-FFH vaste schijf
ES: BX = segment: offset van buffer
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
AL = aantal overgedragen sectoren
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie schrijft een sector(en) van het geheugen naar de schijf. De data van elke sector moet worden gevolgd door zijn 4-byte ECC-code. De bovenste 2 bits van het 10-bits cilindernummer worden in de bovenste 2 bits van register CL geplaatst. Deze functie wordt alleen ondersteund op vaste schijven.
INT 13U (0x13)
Functie 0CH (0x0C of 12) >> Zoeken
Bellen met: AH = 0CH
CH = onderste 8 bits van de cilinder
CL = bovenste 2 cilinderdelen in delen 6-7
DH = hoofd
DL = rijden
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie positioneert de lees-/schrijfkoppen van de schijf naar de opgegeven cilinder zonder gegevens over te dragen. De bovenste 2 bits van het cilindernummer worden in de bovenste 2 bits van register CL geplaatst. Deze functie wordt alleen ondersteund op vaste schijven.
INT 13U (0x13)
Functie 0DH (0x0D of 13) >> Vaste schijfsysteem resetten
Aanroepen met: AH = 0DH
DL = rijden
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status (zie INT 13H Functie 01H)
Reacties:
Met deze functie wordt de vaste schijfcontroller gereset, worden aangesloten schijven opnieuw gekalibreerd, wordt de lees-/schrijfarm naar cilinder 0 verplaatst en worden de volgende schijf-I/O-bewerkingen uitgevoerd.
INT 13U (0x13)
Functie 0EH (0x0E of 14) >> Sectorbuffer lezen
Bellen met: AH = 0EH
ES: BX = segment: offset van buffer
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie brengt de inhoud van de interne sectorbuffer van de vaste schijfadapter over naar het systeemgeheugen. Er worden geen gegevens van de fysieke schijf gelezen.
INT 13U (0x13)
Functie 0FH (0x0F of 15) >> Sectorbuffer schrijven
Aanroepen met: AH = 0FH
ES: BX = segment: offset van buffer
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie brengt gegevens over van het systeemgeheugen naar de interne sectorbuffer van de vaste adapter. Er worden geen gegevens naar de fysieke schijf geschreven. Deze functie moet worden aangeroepen om de inhoud van de sectorbuffer te initialiseren voordat de schijf wordt geformatteerd met INT 13H Functie 05H.
INT 13U (0x13)
Functie 10H (0x10 of 16) >> Drivestatus ophalen
Bellen met: AH = 10H
DL = rijden
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie test of de opgegeven vaste schijf operationeel is en retourneert de status van de schijf. Deze functie wordt alleen ondersteund op vaste schijven.
INT 13U (0x13)
Functie 11H (0x11 of 17) >> Schijf opnieuw kalibreren
Aanroepen met: AH = 11H
DL = rijden
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie zorgt ervoor dat de vaste schijfadapter zichzelf opnieuw kalibreert voor de opgegeven schijf, waarbij de lees-/schrijfarm op cilinder 0 wordt geplaatst en de status van de schijf wordt geretourneerd. Deze functie wordt alleen ondersteund op vaste schijven.
INT 13U (0x13)
Functie 12H (0x12 of 18) >> Controller RAM-diagnose
Bellen met: AH = 12H
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie zorgt ervoor dat de vaste schijfadapter een ingebouwde diagnostische test uitvoert op de interne sectorbuffer, waarbij wordt aangegeven of de test is geslaagd op basis van de geretourneerde status.
INT 13U (0x13)
Functie 13H (0x13 of 19) >> Diagnose van controller-aandrijving
Aanroep met: AH = 13H
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Met deze functie voert de vaste adapter interne diagnostische tests uit op de aangesloten schijf. De geretourneerde status geeft aan of de test is geslaagd.
INT 13U (0x13)
Functie 14H (0x14 of 20) >> Interne diagnose van de controller
Bellen met: AH = 14H
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00H
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Reacties:
Deze functie zorgt ervoor dat de vaste schijfadapter een ingebouwde diagnostische zelftest uitvoert, die aangeeft of de test is geslaagd op basis van de geretourneerde status.
INT 13U (0x13)
Functie 15H (0x15 of 21) >> Schijftype ophalen
Bellen met: AH = 15H
DL = rijden
00H-7FH floppydisk
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = schijftypecode
00H als er geen drive aanwezig is
01H als er een floppydiskdrive is zonder change-line-ondersteuning
02H als er een floppydiskdrive is met change-line-ondersteuning
03H als er een vaste schijf is
|
En als vaste schijf (AH = 03H)
CX: DX = aantal sectoren van 512 bytes
Als de functie niet succesvol is
Vlag dragen = instellen
AH = status
Opmerkingen:
Deze functie retourneert een code die het type floppy of vaste schijf aangeeft waarnaar wordt verwezen door de opgegeven stationscode.
INT 13U (0x13)
Functie 16H (0x16 of 22) >> Schijfwijzigingsstatus ophalen
Bellen met: AH = 16H
DL = rijden
00H-7FH floppydisk
Retourneert: Als de wijzigingsregel inactief is en de schijf niet is gewijzigd
Vlag dragen = vrij
AH = 00H
Als de wijzigingslijn actief is en de schijf mogelijk is gewijzigd
Vlag dragen = instellen
AH = 06H
Reacties:
Deze functie retourneert de status van de wijzigingslijn, die aangeeft of de schijf in het station mogelijk is vervangen sinds de laatste schijftoegang. Als deze functie retourneert met de carry-vlag ingesteld, is de schijf niet noodzakelijkerwijs gewijzigd en kan de wijzigingslijn worden geactiveerd door eenvoudigweg de schijfstationdeur te ontgrendelen en te vergrendelen zonder de floppydisk te verwijderen.
INT 13U (0x13)
Functie 17H (0x17 of 23) >> Schijftype instellen
Bellen met: AH = 17H
AL = floppy disk typecode
Waarde |
Beschrijving |
00U |
Niet gebruikt |
01U |
320/360 KB floppy disk in 360 KB drive |
02U |
320/360 KB floppy disk in 1,2 MB drive |
03U |
1,2 MB floppy disk in 1,2 MB drive |
04U |
720 KB floppy disk in 720 KB drive |
SL = rijden
00H-7FH floppydisk
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00X
Als de functie faalt
Vlag dragen = instellen
AH = status
Reacties:
Met deze functie selecteert u het type floppydisk voor het opgegeven station.
INTERNE 13H (0x13)
Functie 18H (0x18 of 24) >> Stel mediatype in voor formaat
Bellen vanaf: AH = 18H
CH = aantal cilinders
CL = sector per spoor
DL = rijden
00H-7FH floppydisk
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00X
ES : DI = segment : schijfoffset
tabel met parameters voor het mediatype
Als de functie faalt
Vlag dragen = instellen
AH = status
Opmerkingen:
Met deze functie selecteert u de mediakenmerken voor het opgegeven station. Het station moet dus over een floppydisk beschikken.
INTERNE 13H (0x13)
Functie 19H (0x19 of 25) >> Parkeerkoppen
Bellen vanaf: AH = 19H
DL = rijden
80H-FFH vaste schijf
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00X
Als de functie faalt
Vlag dragen = instellen
AH = status
Opmerkingen:
Met deze functie verplaatst u de lees-/schrijfhendel naar een spoor dat niet wordt gebruikt voor gegevensopslag, zodat gegevens niet beschadigd raken wanneer het station wordt uitgeschakeld.
INTERNE 13H (0x13)
Functie 1AH (0x1A of 26) >> ESDI-schijf formatteren
Bellen met: AH = 1AH
AL = Relatief Blok Adres (RBA)
aantal defecten in de tabel
0 als er geen RBA-tabel is
>0 als RBA-tabel wordt gebruikt
CL = formaatmodifierbits
Pagina(s) |
Betekenis (indien ingesteld) |
0 |
Negeer de primaire defectkaart |
1 |
Negeer secundaire defectkaart |
2 |
Update secundaire defectenkaart |
3 |
Geavanceerde oppervlakteanalyse uitvoeren |
4 |
Genereer een periodieke onderbreking |
5-7 |
Gereserveerd (moet 0 zijn) |
DL = rijden
80H-FFH vaste schijf
ES:BX = segment:RBA tabeloffset
Retourneert: Als de functie succesvol is
Vlag dragen = vrij
AH = 00X
Als de functie faalt
Vlag dragen = instellen
AH = status (zie INT 13H Functie 01H)
Opmerkingen:
Deze functie initialiseert de schijfsector- en trackingadresvelden op een schijf die is aangesloten op een ESDI-harde schijfadapter.
De werking van deze functie wordt low-level formattering genoemd en bereidt de schijf voor op fysieke lees-/schrijfbewerkingen op sectorniveau. Vervolgens moet de schijf worden gepartitioneerd met de opdracht FDISK en vervolgens op hoog niveau worden geformatteerd met de opdracht FORMAT om het bestandssysteem te installeren.