Hoofdstuk – 9
Omgaan met grote harde schijven
Omgaan met grote harde schijven
In het vorige hoofdstuk hebben we de BIOS-schijffuncties besproken en het gebruik van interrupts om toegang te krijgen tot de fysieke media van de harde schijven. We gebruikten daar INT 13H-functies om toegang te krijgen tot de harde schijven.
De INT 13H-interface ondersteunt veel verschillende opdrachten, zoals lezen, schrijven, formatteren en verifiëren enz., die aan de BIOS kunnen worden gegeven, die ze vervolgens doorgeeft aan de harde schijf. Omdat het al heel lang door DOS wordt gebruikt, is INT13H al jaren de standaard.
De INT 13H wijst 24 bits toe voor de specificatie van de geometrie van de schijf en vereist dat het aanroepende programma de specifieke parameters van de harde schijf kent en de routines exacte kop-, cilinder- en sectoradressering geeft om schijftoegang mogelijk te maken.
Het BIOS gebruikt de geometrie voor de harde schijf zoals deze is ingesteld in het BIOS-setupprogramma. De 24 bits, toegewezen door de INT 13H-interface voor de specificatie van de aandrijfgeometrie, zijn als volgt onderverdeeld:
- 10 bits voor het cilindernummer. De maximale limiet van het totale aantal cilinders kan dus tot 1024 cilinders zijn.
- 8 bits voor het kopnummer. Dus de maximale limiet van het totale aantal heads is tot 256.
- 6 bits voor het sectornummer. Dus een maximum totaal van sectoren kan tot 63 sectoren zijn.
Het maximum aantal sectoren dat door deze aanpak wordt ondersteund, kan dus oplopen tot 1024 * 256 * 63 = 16515072.
Dit betekent dat de INT13H-interface schijven kan ondersteunen met maximaal ongeveer 16,5 miljoen sectoren, wat met 512 bytes per sector een maximum van 8,46 GB is. Dat is precies wat ik wil uitleggen. Dus door al deze functies of INT 13H te gebruiken, hebben we toegang tot de schijven tot 8,46 GB.
Dat is de reden waarom de beperkingen van deze oude interface er de afgelopen jaren voor hebben gezorgd dat deze is losgelaten ten gunste van een nieuwe manier om harde schijven aan te pakken, zoals hierna in dit hoofdstuk wordt beschreven.
Laat me je eerst een verhaal vertellen!
Elf jaar geleden, toen ik in de zevende klas zat, op mijn school, hoorde ik over de harde schijf met een capaciteit van 42 MB, misschien was het WDA-L42 van IBM. Het was echt moeilijk voor mij en mijn vrienden om me in die tijd zo'n grote capaciteit van de harde schijf voor te stellen.
De INT 13H-methodologie is vanaf vandaag ongeveer twintig jaar geleden ontwikkeld. Je kunt nu begrijpen dat een harde schijf van 8 GB veel groter was om zelfs in dromen in die tijd te passen. Maar als we het tegenwoordig hebben over een harde schijf van 8 GB met pc-gebruikers, zal hij het misschien niet graag gebruiken omdat hij zegt dat het weinig opslagcapaciteit heeft.
Dit is de reden dat de INT 13H-interface eindelijk aan het einde is gekomen van zijn bruikbaarheid in moderne systemen. INT 13H gebruikte 24 bits om de schijfgeometrie toe te wijzen en helaas was het niet mogelijk om de bestaande INT 13H BIOS-interface uit te breiden, omdat als het zou gebeuren, veel oudere hardware en software niet meer zouden werken, en u begrijpt dat de huidige computermarkt kan zo'n grote verandering nooit verdragen met miljoenen oudere software- en hardwareproducten die niet meer werken.
Rekening houdend met deze voorwaarde, is INT 13H vervangen door een nieuwere interface genaamd INT 13H-extensies. INT 13H kan echter nog steeds worden gebruikt door DOS en sommige andere oudere besturingssystemen en voor andere compatibiliteitsdoeleinden.
De nieuwe INT 13H-interface gebruikt 64 bits in plaats van 24 bits voor adressering en maakt een maximale harde schijfgrootte van 9,4 * 1021 bytes mogelijk, wat in feite 9,4 biljoen gigabytes of 9400000000000 gigabytes is. Ik hoop dat we nu een tijdje ontspannen zijn totdat deze limiet is overschreden.
Enkele belangrijke functies van de extensie voor Interrupt 13H zijn hierna beschreven. U kunt deze functies bij het programmeren op dezelfde manier gebruiken als u de functies van INT 13H gebruikte. Dit is ook een reden dat deze functies de extensies van INT 13H worden genoemd.
INT 13H Extensions:
INT 13H (0x13)
Function 1BH (0x1B or 27) --> Get Manufacturing Header (ESDI Fixed Disk)
Call with: AH = 1BH
AL = number of sector(s) to read
DL = drive
ES: BX = buffer for manufacturing header
(defect list)
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Comments:
Deze functie wordt gebruikt om de productiekop van de vaste schijf te krijgen. De eerste gelezen sector bevat de fabricagekop met het aantal defecten en het begin van de defectkaart; de overige sectoren bevatten de rest van de defectkaart. Het productie-headerformaat (Defect Map Record-formaat) is te vinden in IBM 70MB, 115MB Fixed Disk Drives Technical Reference.
INT 13H (0x13)
Function 1BH (0x1B or 27) --> Get Pointer to SCSI Disk Information Block (Future Domain SCSI Controller)
Call with: AH = 1BH
DL = hard drive ID
Returns: If function successful
Carry flag = clear
AH = 01H
If function unsuccessful
Carry flag = set
AH = status
ES:BX = SCSI disk information block
Comments:
Deze functie wordt gebruikt om de aanwijzer naar het SCSI-schijfinformatieblok te krijgen. Dit stelt ook een niet-resetbare vlag in die voorkomt dat sommige controllerberichten worden weergegeven.
INT 13H (0x13)
Function 1CH (0x1C or 28) --> Get Pointer to Free Controller Ram (Future Domain SCSI Controller)
Call with: AH = 1CH
DL = hard drive ID for any valid SCSI
hard disk
Returns: If function successful
Carry flag = clear
AH = 01H
If function unsuccessful
Carry flag = set
AH = status
ES:BX = first byte of free RAM on controller
Comments:
Deze functie wordt gebruikt om de gratis controller Ram te krijgen. ES:BX verwijst naar de eerste byte vrij RAM op de controller, beschikbaar voor ander gebruik. ES bevat het segment waar de controller zich bevindt. De twee memory-mapped I/O-poorten van de controller bevinden zich op de offsets 1C00H en 1E00H.
INT 13H (0x13)
Function 1C08H (0x1C08) --> Get Command Completion Status (ESDI Fixed Disk)
Call with: AX = 1C08H
DL = drive
ES:BX = buffer for Command Complete
Status Block
Return: If function successful
Carry flag = clear
AH = 01H
If function unsuccessful
Carry flag = set
AH = status
Comments:
Deze functie wordt gebruikt om de voltooiingsstatus van de opdracht te krijgen. Als de functie succesvol is, is de carry-vlag gewist en als de carry-vlag niet is gelukt, wordt de carry-vlag gezet.
INT 13H (0x13)
Function 1C09H (0x1C09) --> Get Device Status (ESDI Fixed Disk)
Call with: AX = 1C09H
DL = drive
ES:BX = buffer for Device Status Block
Return: If function successful
Carry flag = clear
AH = 01H
If function unsuccessful
Carry flag = set
AH = status
Comments:
Deze functie wordt gebruikt om de apparaatstatus te krijgen. Als de functie succesvol is, is de carry-vlag gewist en als de carry-vlag niet is gelukt, wordt de carry-vlag gezet.
INT 13H (0x13)
Function 1C0AH (0x1C0A) --> Get Device Configuration (ESDI Fixed Disk)
Call with: AX = 1C0AH
DL = drive
ES:BX = buffer for Drive Configuration Status
Block
Return: If function successful
Carry flag = clear
AH = 01H
If function unsuccessful
Carry flag = set
AH = status
Comments:
Deze functie wordt gebruikt om de apparaatconfiguratie voor de schijf op te halen. Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 01H, anders is de carry-vlag ingesteld en het AH-register Retourneert de status. De volgende tabel toont het formaat van het ESDI-schijfconfiguratiestatusblok:
Offset
|
Size
|
Description
|
00H
|
Byte
|
09H
|
01H
|
Byte
|
number of words in block (06H)
|
02H
|
Byte
|
flags
|
03H
|
Byte
|
number of spare sectors per cylinder
|
04H
|
Double Word
|
total number of usable sectors
|
08H
|
Word
|
total number of cylinders
|
0AH
|
Byte
|
tracks per cylinder
|
0BH
|
Byte
|
sectors per track
|
INT 13H (0x13)
Function 1C0BH (0x1C0B) --> Get Adapter Configuration (ESDI Fixed Disk)
Call with: AX = 1C0BH
ES:BX = buffer for Controller Configuration
Status Block
Return: If function successful
Carry flag = clear
AH = 01H
If function unsuccessful
Carry flag = set
AH = status
Comments:
Deze functie wordt gebruikt om de adapterconfiguratie op te halen. Als de functie succesvol is, is de carry-vlag gewist en is AH 01H, als de niet-succesvolle carry-vlag is ingesteld en AH de status retourneert.
INT 13H (0x13)
Function 1C0CH (0x1C0C) --> Get POS Information (ESDI Fixed Disk)
Call with: AX = 1C0CH
ES:BX = buffer for POS Information Status
Block
Return: If function successful
Carry flag = clear
AH = 01H
If function unsuccessful
Carry flag = set
AH = status
Comments:
Deze functie wordt gebruikt om de POS-informatie te verkrijgen. Als de functie succesvol is, is de carry-vlag gewist en is AH 01H, als de niet-succesvolle carry-vlag is ingesteld en AH de status retourneert.
INT 13H (0x13)
Function 1C0EH (0x1C0E) --> Translate RBA to ABA (ESDI Fixed Disk)
Call with: AX = 1C0EH
CH = low 8 bits of cylinder number
CL = sector number (high two bits of
cylinder number in bits 6 and 7)
DH = head number
DL = drive number
ES:BX = ABA (Absolute Block Address)
number
Return: If function successful
Carry flag = clear
AH = 01H
If function unsuccessful
Carry flag = set
AH = status
Comments:
Deze functie vertaalt het RBA (Relative Block Address) naar ABA (Absolute Block Address). Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 01H, anders wordt de Carry Flag ingesteld en geeft AH de status terug.
INT 13H (0x13)
Function 20H (0x20 or 32) --> Get Current Media Format (Compaq ATAPI Removable Media Device)
Call with: AH = 20H
DL = drive number
Return: If Function Successful,
Carry Flag = clear
AL = media type
AH = 00H
If Function Unsuccessful,
CF = set
AH = error code
Comments:
Deze functie wordt gebruikt om het huidige mediaformaat op te halen. De waarden voor het Compaq/ATAPI-diskettemediatype staan in de volgende tabel:
Value
|
Media
|
03H
|
720K (1M unformatted)
|
04H
|
1.44M (2M unformatted)
|
06H
|
2.88M (4M unformatted)
|
0CH
|
360K
|
0DH
|
1.2M
|
0EH
|
Toshiba 3mode
|
0FH
|
NEC 3mode (1024 bytes per sectors)
|
10H
|
ATAPI Removable Media Device
|
INT 13H (0x13)
Function 21H (0x21 or 33) --> Read Multiple Disk Sectors (PS and PS/2, Hard Disks)
Call with: AH = 21H
AL = number of sectors to Read
CH = low byte of 12-bit cylinder number
CL = starting sector (bits 0 to 5) and bits 8
and 9 of cylinder (bits 6 and 7)
DH = head number (bits 0 to 5) and bits 10
and 11 of cylinder (bits 6 and 7)
DL = drive number
ES:BX = Data buffer to be read
Return: If Function Successful,
Carry flag = clear
ES:BX = Filled Data Buffer
If Function Unsuccessful,
Carry flag = set
AH = status
Comments:
De functie wordt gebruikt om de meerdere schijfsectoren te lezen met behulp van de meervoudige blokmodus, die alleen een onderbreking genereert na het einde van de overdracht van een groep sectoren in plaats van na elke sector.
INT 13H (0x13)
Function 22H (0x22 or 34) --> Write Multiple Disk Sectors (PS and PS/2, Hard Disks)
Call with: AH = 22H
AL = number of sectors to be written
CH = low byte of 12-bit cylinder number
CL = starting sector (bits 0 to 5) and bits 8
and 9 of cylinder (bits 6 and 7)
DH = head number (bits 0 to 5) and bits 10
and 11 of cylinder (bits 6 and 7)
DL = drive number
ES:BX = buffer containing data to be written
Return: If function Successful,
Carry Flag = clear
AH = 01H
If function Unsuccessful,
Carry Flag = Set
AH = Status
Comments:
De functie wordt gebruikt om de meerdere schijfsectoren te schrijven met behulp van de meervoudige blokmodus, die alleen een onderbreking genereert na het einde van de overdracht van een groep sectoren in plaats van na elke sector.
INT 13H (0x13)
Function 22H (0x22 or 34) --> Enable/Disable Cache (QuickCache II v4.20)
Call with: AH = 22H
AL = new state (00H, if disabled and 01H,
if enabled)
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = status
Comments:
Deze functie schakelt het cachen van alle schijven in en/of uit. Als de functie succesvol is, is het AX-register 0000H, anders wordt de status geretourneerd.
INT 13H (0x13)
Function 23H (0x23 or 35) --> Set Controller Features Register (PS and PS/2, Hard Disk)
Call with: AH = 23H
AL = feature number
DL = drive number
Return: If Function Successful,
Carry Flag = Clear
If Function Unsuccessful,
Carry Flag = Set
AH = Status
Comments:
Deze functie wordt gebruikt om het functieregister van de controller in te stellen. Als de functie succesvol is, is de carry-vlag gewist en als de niet-succesvolle carry-vlag is ingesteld en het AH-register de status retourneert
INT 13H (0x13)
Function 24H (0x24 or 36) --> Set Multiple – Transfer Mode (Hard Disk, PS and PS/2)
Call with: AH = 24H
AL = number of sectors per block
DL = drive number
Return: If Function Successful,
Carry Flag = Clear
If Function Unsuccessful,
Carry Flag = Set
AH = Status
Comments:
Deze functie wordt gebruikt om Meerdere – Overdrachtsmodus in te stellen. Als u de meervoudige overdrachtsmodus wilt uitschakelen, stelt u het aantal sectoren in op 0. De maximale waarde voor de blokgrootte (zoals 2,4,6,8 en 16 enz.) hangt af van het type vaste schijf.
De waarde wordt opgeslagen in byte 15H van de vaste schijfparametertabel die is gemaakt door POST (Power On Self-Test). De byte op adres 0040H:0074H is ingesteld op de bedrijfsstatus. De functienummers voor de PS/1-harde schijf zijn weergegeven in de volgende tabel:
Value
|
Description
|
01H
|
Select 8-bit data transfers instead of 16-bit
|
02H
|
Enable write cache
|
22H
|
Write Same, user-specified area
|
33H
|
Disable retries
|
44H
|
Set number of ECC bytes for read long/write long
|
54H
|
Set cache segments
|
55H
|
Disable look ahead
|
66H
|
Disable reverting to power-on defaults
|
77H
|
Disable error correction
|
81H
|
Select 16-bit data transfers (default)
|
82H
|
Disable write cache
|
88H
|
Enable error correction (default)
|
99H
|
Enable retries (default)
|
AAH
|
Enable look ahead
|
BBH
|
Set ECC length for read long/write long to four bytes
|
CCH
|
Enable reverting to power-on defaults
|
DDH
|
Write Same, entire disk
|
INT 13H (0x13)
Function 24H (0x24 or 36) --> Set Sectors (QuickCache II v4.20)
Call with: AX = 24H
BX = New number of sector buffers in
cache
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de sectoren in te stellen. Als de functie succesvol is, is het AX-register 0000H, anders retourneert AX de Status.
INT 13H (0x13)
Function 25H (0x25 or 37) --> Identify Drive (Hard Disk, PS and PS/2)
Call with: AH = 25H
DL = Drive number
ES:BX = Buffer of 512 bytes for reply packet
Return: If Function Successful,
Carry Flag = Clear
Buffer filled with drive information block
If Function Unsuccessful,
Carry Flag = Set
AH = Status
Comments:
Deze functie wordt gebruikt om de omvormer te identificeren. De byte op adres 0040h:0074h wordt ingesteld op de status van de bewerking. IBM classificeert deze functie officieel als optioneel. De Bit-velden voor de algemene schijfconfiguratie zijn weergegeven in de volgende tabel:
Bit(s)
|
Description
|
0
|
Reserved (0)
|
1
|
Hard sectored
|
2
|
Soft sectored
|
3
|
Not MFM encoded
|
4
|
Head switch time greater than 15msec
|
5
|
Spindle motor control option implemented
|
6
|
Fixed drive
|
7
|
Removable cartridge drive
|
8
|
Disk transfer rate is less than or equal to 5Mbs
|
9
|
Disk transfer rate is greater than 5Mbs but less than or equal to 10Mbs
|
10
|
Disk transfer rate is greater than 10Mbs
|
11
|
Rotational speed tolerance is greater than 0.5%
|
12
|
Data strobe offset option available
|
13
|
Track offset option available
|
14
|
Format speed tolerance gap required
|
15
|
Reserved for non-magnetic drives (0)
|
De beschrijving van het informatieblok Format of Drive zoals gegeven in de ATA (AT Attachment)-specificatie is gegeven in de volgende tabel:
Offset
|
Size
|
Description
|
00H
|
WORD
|
General drive configuration
|
02H
|
WORD
|
Number of cylinders
|
04H
|
WORD
|
Reserved
|
06H
|
WORD
|
Number of heads
|
08H
|
WORD
|
Number of unformatted bytes per track
|
0AH
|
WORD
|
Number of unformatted bytes per sector
|
0CH
|
WORD
|
Number of sectors per track
|
0EH
|
6 BYTES
|
Vendor unique
|
14H
|
20 BYTES
|
Serial number in ASCII, (0000H=not specified)
|
28H
|
WORD
|
Buffer type
|
2AH
|
WORD
|
Buffer size in 512 byte increments (0000H=not specified)
|
2CH
|
WORD
|
Number of ECC bytes passed on Read/Write Long commands 0000H = not specified
|
2EH
|
8 BYTES
|
Firmware revision in ASCII, 0000H=not specified
|
36H
|
40 BYTES
|
Model number in ASCII, 0000H=not specified
|
5EH
|
WORD
|
Bits 15-8 Vendor Unique, bits 7-0, (if 00H = Read/Write Multiple commands not Implemented, else xxH = Maximum number of sectors that can be transferred per interrupt on Read and Write Multiple Commands)
|
60H
|
WORD
|
0000H = Cannot perform Doubleword I/O,
0001H = Can perform Doubleword I/O.
|
62H
|
WORD
|
Bit 15-9 (0=reserved),
bit 8 (1=DMA Supported),
Bit 7-0 Vendor Unique.
|
64H
|
WORD
|
Reserved
|
66H
|
WORD
|
Bits 15-8 PIO data transfer cycle timing mode, Bits 7-0 Vendor Unique
|
68H
|
WORD
|
Bits 15-8 DMA data transfer cycle timing mode, Bits 7-0 Vendor Unique
|
6AH
|
WORD
|
Bits 15-1 reserved,
bit 0 (1=the fields reported in translation mode are valid,
0=the fields reported in translation mode may be valid)
|
6CH
|
WORD
|
Number of current cylinders
|
6EH
|
WORD
|
Number of current heads
|
70H
|
WORD
|
Number of current sectors per track
|
72H
|
DWORD
|
Current capacity in sectors
|
76H
|
>WORD
|
Reserved
|
78H
|
136 BYTES
|
Not defined
|
100H
|
64 BYTES
|
Vendor unique
|
140H
|
96 BYTES
|
Reserved
|
INT 13H (0x13)
Function 25H (0x25 or 37) --> Set Flush Interval (QuickCache II v4.20)
Call with: AH = 25H
BX = Interval of Flush
Return: If Function Successful,
AH = 0000H
If Function Unsuccessful,
AH = status
Comments:
Deze functie wordt gebruikt om het spoelinterval in te stellen. Als de functie succesvol is, is de AH 0000H, anders geeft AH de status terug.
INT 13H (0x13)
Function 26H (0x26 or 38) --> QuickCache II v4.20 Uninstall
Call with: AH = 26H
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = status
Comments:
AX retourneert de status van 0001H naar 00FFH voor de onderbrekingsvector die is gekoppeld aan een andere TSR
INT 13H (0x13)
Function 27H (0x27 or 39) --> Installation Check (QuickCache II v4.20)
Call with: AH = 27H
BX = 0000H
Return: BH = Major Version
BL = Binary Minor Version
If installed,
AX = 0000H
BX = Non-zero
Comments:
Indien geïnstalleerd, is AX Register 0000H en retourneert BX een waarde die niet nul is.
INT 13H (0x13)
Function 28H (0x28 or 40) --> Set Automatic Dismount (QuickCache II v4.20)
Call with: AH = 28H
AL = New State
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Roep functie op met AL = 00H om uit te schakelen en met AL = 01H om in te schakelen.
INT 13H (0x13)
Function 29H (0x29 or 41) --> No Operation (QuickCache II v4.20)
Call with: AH = 29H
Return: AX = 0000H
INT 13H (0x13)
Function 2AH (0x2A or 42) --> Set Buffer Size (QuickCache II v4.20)
Call with: AH = 2AH
AL = Buffer Size
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de buffergrootte in te stellen. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 2BH (0x2B or 43) --> Drive Access Sounds (QuickCache II v4.20)
Call with: AH = 2BH
AL = new state (00h disabled, 01h
enabled)
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status. Oproepfunctie met AL = 00H om uit te schakelen en AL = 01H om toegang tot de aandrijving in te schakelen
INT 13H (0x13)
Function 2CH (0x2C or 44) --> Set Buffered Write (QuickCache II v4.20)
Call with: AH = 2CH
AL = new state
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie schakelt vertraagde schrijfbewerkingen in of uit voor alle stations. Gebruik AH=38H om een enkele schijf te wisselen. Gebruik AL = 00H om uit te schakelen en 01H om in te schakelen.
INT 13H (0x13)
Function 2DH (0x2D or 45) --> Set Buffered Read (QuickCache II v4.20)
Call with: AH = 2Dh
AL = new state (00h disabled, 01h
enabled)
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Met deze functie wordt het vooruitlezen voor alle aandrijvingen in- of uitgeschakeld. Gebruik AL = 00H om uit te schakelen en AL = 01H om in te schakelen. Gebruik AH=37H om een enkele schijf te wisselen.
INT 13H (0x13)
Function 2EH (0x2E or 46) --> Set Flush Count (QuickCache II v4.20)
Call with: AH = 2EH
BX = Flush count
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de spoeltelling in te stellen. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 2FH (0x2F or 47) --> Force Immediate Incremental Flush (QuickCache II v4.20)
Call with: AH = 2FH
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 30H (0x30 or 48) --> Get Information (QuickCache II v4.20)
Call with: AH = 30H
AL = Information Number (See Table in
Comments)
DS:DX = buffer for info
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de verschillende soorten informatie over het systeem te krijgen, gespecificeerd door AL. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status. AX = 8000H geeft de ongeldige informatiespecificatie aan. Aan AL te specificeren informatienummers zijn vermeld in de volgende tabel:
Value
|
Description
|
00H
|
System information
|
01H
|
Drive information
|
02H
|
Access frequency (Array of 30 words)
|
03H
|
Drive Index (Array of 32 bytes indicating BIOS drive for DOS drive)
|
INT 13H (0x13)
Function 31H (0x31 or 49) --> Reserve Memory (QuickCache II v4.20)
Call with: AH = 31H
BX = Number of paragraphs of
conventional memory to reserve for
Applications.
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om het geheugen voor applicaties te reserveren. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 32H (0x32 or 50) --> Enable Caching For Specific Drive(QuickCache II v4.20)
Call with: AH = 32H
AL = drive number
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om caching voor een specifieke schijf in te schakelen. Roep bijvoorbeeld Functie aan met AL = 00H voor A: enzovoort. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 33H (0x33 or 51) --> Disable Caching For Specific Drive (QuickCache II v4.20)
Call with: AH = 33H
AL = drive number
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om caching voor een specifieke schijf uit te schakelen. Roep bijvoorbeeld Functie aan met AL = 00H voor A: enzovoort. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 34H (0x34 or 52) --> Lock/Unlock Sector(s) (QuickCache II v4.20)
Call with: AH = 34H
AL = Locking/Unlocking function number
(See the Table Given in Comments)
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om functies van sectoren te vergrendelen/ontgrendelen, gespecificeerd door AL. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status. De verschillende functienummers die met AL moeten worden aangeroepen, staan in de volgende tabel:
Value
|
Function
|
00H
|
End sector locking/unlocking
|
01H
|
Lock all accessed sectors into cache
|
02H
|
Unlock all accessed sectors and discard from cache
|
INT 13H (0x13)
Function 35H (0x35 or 53) --> Set Lock Pool Size (QuickCache II v4.20)
Call with: AH = 35H
BX = Number of sectors in lock pool
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de poolgrootte in te stellen. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 36H (0x36 or 54) --> Set Trace Buffer Size
Call with: AH = 36H
AL = New size of trace buffer
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de traceerbuffergrootte in te stellen. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status. Deze functie wordt meestal aangeroepen met functie 24H of INT 13H met AL=05H.
INT 13H (0x13)
Function 37H (0x37 or 55) --> Set Buffered Reads For Specific Drive (QuickCache II v4.20)
Call with: AH = 37H
AL = New state
DL = Drive number
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om gebufferde uitlezingen in te stellen voor een specifieke drive. Als AL = 00H is de staat ingeschakeld, anders uitschakelen. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 38H (0x38 or 56) --> Set Buffered Writes for Specific Drive (QuickCache II v4.20)
Call with: AH = 38H
AL = New state
DL = Drive number
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om gebufferde schrijfbewerkingen in te stellen voor een specifieke drive. Als AL = 00H is de staat ingeschakeld, anders uitschakelen. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 39H (0x39 or 57) --> Set Read Buffer Size for Specific Drive (QuickCache II v4.20)
Call with: AH = 39H
AL = New size of read buffer
DL = Drive number
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de leesbuffergrootte voor een specifieke schijf in te stellen, zoals DL = 00H voor A: enzovoort. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 3AH (0x3A or 58) --> Set Write Buffer Size for Specific Drive (QuickCache II v4.20)
Call with: AH = 3AH
AL = New size of Write buffer
DL = Drive number
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de schrijfbuffergrootte voor een specifieke schijf in te stellen, zoals DL = 00H voor A: enzovoort. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 3DH (0x3D or 61) --> Enable/Disable Cylinder Flush for Drive (QuickCache II v4.20)
Call with: AH = 3DH
AL = New state
DL = drive number
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om cilinderspoeling in/uit te schakelen voor specifieke aandrijving, zoals DL = 00H voor A: enzovoort. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status. Als het AL-register is ingesteld op 01H, is de status ingeschakeld, anders uitgeschakeld.
INT 13H (0x13)
Function 3EH (0x3E or 62) --> Set Single-Sector Bonus (QuickCache II v4.20)
Call with: AH = 3EH
AL = New value for bonus
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de Single-Sector Bonus in te stellen. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status.
INT 13H (0x13)
Function 3FH (0x3F or 63) --> Set Bonus Thrashold (QuickCache II v4.20)
Call with: AH = 3FH
AL = New value for bonus threshold
Return: If Function Successful,
AX = 0000H
If Function Unsuccessful,
AX = Status
Comments:
Deze functie wordt gebruikt om de bonusdrempel in te stellen. Als de functie succesvol is, is de AX 0000H, als de functie niet succesvol is, retourneert AX de status
INT 13H (0x13)
Function 41H (0x41 or 65) --> Installation Check (IBM/MS INT 13H Extensions)
Call with: AH = 41H
BX = 55AAH
DL = Drive number (80H-FFH)
Return: If Extensions Supported and Function Successful,
Carry Flag = Clear
BX = AA55H
AH = Major version of extensions (See the
table in Comments)
AL = Internal use
CX = API subset support bitmap (See the
Table in Comments)
DH = Extension version (v2.0 and later)
If Extension not Supported or Function Unsuccessful,
Carry Flag = set
AH = 01H (Function Invalid)
Comments:
Deze functie controleert of de IBM/MS INT 13H Extensions zijn geïnstalleerd en ondersteund. Waarden voor hoofdversies van extensies zijn gegeven in de volgende tabel:
Value
|
Major Version of Extension
|
01H
|
1.x
|
20H
|
2.0 / EDD-1.0
|
21H
|
2.1 / EDD-1.1
|
30H
|
EDD-3.0
|
De Bit-velden voor IBM/MS INT 13H Extensions API-ondersteuningsbitmap zijn gegeven in de volgende tabel:
Bit(s)
|
Description
|
0
|
Extended disk access functions (AH=42H, 43H, 44H, 47h and 48H) supported.
|
1
|
Removable drive controller functions (AH=45H, 46H, 48H, 49H, and INT15/AH =52H) supported.
|
2
|
Enhanced disk drive (EDD) functions (AH=48H and AH=4EH) supported. Extended drive parameter table is valid.
|
3-15
|
Reserved (0)
|
INT 13H (0x13)
Function 42H (0x42 or 66) --> Extended Read (IBM/MS INT 13H Extensions)
Call with: AH = 42H
DL = Drive number
DS:SI = Disk address packet (See the table in
comments)
Return: If Function Successful,
Carry Flag = Clear
AH = 00H
If Function Unsuccessful,
Carry Flag = Set
AH = error code
Comments:
Deze functie is de extensie voor de schijfleesfunctie. Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 00H, anders wordt de carry-vlag ingesteld en geeft AH de foutcode terug. Het bloktellingveld van het schijfadrespakket is ingesteld op het aantal blokken dat met succes is overgedragen. Het formaat van het schijfadrespakket is hieronder weergegeven:
Offset
|
Size
|
Description
|
00H
|
BYTE
|
Size of Packet (10H)
|
01H
|
BYTE
|
Reserved (0)
|
02H
|
WORD
|
Number of blocks to transfer
|
04H
|
DWORD
|
Transfer buffer
|
08H
|
QWORD
|
Starting absolute block number (LBA)
|
INT 13H (0x13)
Function 43H (0x43 or 67) --> Extended Write (IBM/MS INT 13H Extensions)
Call with: AH = 43H
AL = write flags (See the table in
comments)
DL = drive number.
DS:SI = disk address packet
Return: If Function Successful,
Carry Flag = clear
AH = 00H
If Function Unsuccessful,
Carry Flag = set
AH = error code
Comments:
Deze functie is de extensie voor de schijfschrijffunctie. Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 00H, anders wordt de carry-vlag ingesteld en geeft AH de foutcode terug. Het bloktellingveld van het schijfadrespakket is ingesteld op het aantal blokken met succes. De informatie van schrijfvlaggen voor verschillende versies is gegeven in de volgende tabel:
Version 1.0 and 2.0
|
Version 2.1 and later
|
Value
|
Description
|
Value
|
Description
|
Bit 0
|
Verify Write
|
00H and 01H
|
Write without Verify
|
Bits 1 to 7
|
Reserved (0)
|
02H
|
Write with verify
|
INT 13H (0x13)
Function 44H (0x44 or 68) --> Verify Sectors (IBM/MS INT 13H Extensions)
Call with: AH = 44H
DL = drive number
DS:SI = disk address packet
Return: If Function Successful,
Carry Flag = Clear
AH = 00H
If Function Unsuccessful,
Carry Flag = Set
AH = error code
Comments:
Deze functie is de extensie voor de functie Sectoren verifiëren. Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 00H, anders wordt de carry-vlag ingesteld en geeft AH de foutcode terug. Het bloktellingveld van het schijfadrespakket is met succes ingesteld op het aantal blokken
INT 13H (0x13)
Function 45H (0x45 or 69) --> Lock/Unlock Drive (IBM/MS INT 13H Extensions)
Call with: AH = 45H
AL = Operation Number (See the Table in
comments)
DL = Drive number
Return: If Function Successful,
Carry Flag = Clear
AH = 00H
AL = Lock State (00H = Unlocked)
If Function Unsuccessful,
Carry Flag = Set
AH = Error code
Comments:
Deze functie wordt gebruikt om de drive te vergrendelen/ontgrendelen. Deze functie moet worden ondersteund voor verwisselbare schijven met het nummer 80H of hoger. Er kunnen maximaal 255 vergrendelingen op een schijf worden geplaatst en de media worden niet fysiek ontgrendeld totdat alle vergrendelingen zijn verwijderd.
Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 00H, anders wordt de carry-vlag ingesteld en geeft AH de foutcode terug.
Bewerkingsnummers voor verschillende Lock/Unlock-bewerkingen van de drive zijn gegeven in de volgende tabel:
Value
|
Function
|
00H
|
Lock media in drive
|
01H
|
Unlock media
|
02H
|
Check lock status
|
INT 13H (0x13)
Function 46H (0x46 or 70) --> Eject Media (IBM/MS INT 13H Extensions)
Call with: AH = 46H
AL = 00H (reserved)
DL = Drive number
Return: If Function Successful,
Carry Flag = Clear
AH = 00H
If Function Unsuccessful,
Carry Flag = Set
AH = error code
Comments:
Deze functie is om media uit te werpen. Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 00H, anders wordt de carry-vlag ingesteld en geeft AH de foutcode terug.
INT 13H (0x13)
Function 47H (0x47 or 71) --> Extended Seek (IBM/MS INT 13H Extensions)
Call with: AH = 47H
DL = Drive number
DS:SI = Disk address packet
Return: If Function Successful,
Carry Flag = Clear
AH = 00H
If Function Unsuccessful,
Carry Flag = Set
AH = error code
Comments:
Deze functie is de extensie voor de zoekfunctie. Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 00H, anders wordt de carry-vlag ingesteld en geeft AH de foutcode terug. Het bloktellingveld van het schijfadrespakket is ingesteld op het aantal blokken met succes.
INT 13H (0x13)
Function 48H (0x48 or 72) --> Get Drive Parameters (IBM/MS INT 13H Extensions)
Call with: AH = 48H
DL = Drive (80H-FFH)
DS:SI = Buffer for drive parameters
Return: If Function Successful,
Carry Flag = Clear
AH = 00H
DS:SI = Buffer filled
If Function Unsuccessful,
Carry Flag = Set
AH = Error code
Comments:
Deze functie wordt gebruikt om de aandrijfparameters op te halen. Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 00H met DS:SI van de gevulde buffer, anders wordt de carry-vlag ingesteld en geeft AH de foutcode terug.
INT 13H (0x13)
Function 49H (0x49 or 73) --> Extended Media Change (IBM/MS INT 13H Extensions)
Call with: AH = 49H
DL = Drive number (any drive number, see
Comments)
Return: If media has not been changed,
Carry Flag = Clear
AH = 00H
If media may have been changed,
Carry Flag = Set
AH = 06H (Error code for media change)
Comments:
Deze functie is de extensie voor de mediawisselfunctie. Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 00H, anders wordt de carry-vlag ingesteld en geeft AH de foutcode terug.
Het belangrijkste verschil in deze functie en functie AH = 16H van INT 13H is dat we elk stationnummer kunnen specificeren, terwijl Functie 16H alleen stationnummer 00H tot 7FH van diskettes toestaat.
INT 13H (0x13)
Function 4AH (0x4A or 74) --> Initiate disk Emulation (Bootable CD-ROM)
Call with: AH = 4AH
AL = 00H
DS:SI = Specification packet (see the Table in comments)
Return: If Function Successful,
Carry Flag = Clear
If Function unsuccessful,
Carry Flag = Set
AX = Status Code
Comments:
Deze functie wordt gebruikt om de schijfemulatie te starten. Als de functie succesvol is, is de carry-vlag gewist, anders is de carry-vlag ingesteld en geeft het AX-register de statuscode terug en staat de drive niet in de emulatiemodus.
Het formaat van het opstartbare cd-romspecificatiepakket is weergegeven in de volgende tabel:
Offset
|
Size
|
Description
|
00H
|
BYTE
|
Size of packet in bytes (13H)
|
01H
|
BYTE
|
Boot media type
|
02H
|
BYTE
|
Drive Number
Drive Number
|
Drive Description
|
00H
|
Floppy image
|
80H
|
Bootable hard disk
|
81H to FFH
|
Non bootable or no Emulation
|
|
03H
|
BYTE
|
CD-ROM controller number
|
04H
|
DWORD
|
Logical Block Address of disk image to Emu
|
08H
|
WORD
|
Device Specification
Value
|
Description
|
(IDE) Bit 0
|
Drive is slave instead of master
|
(SCSI) Bits 0 to 7
|
LUN (Logical Unit Number) and PUN (Physical Unit Number)
|
Bits 8 to 15
|
Bus Number
|
|
0AH
|
WORD
|
Segment of 3Kb buffer for caching CD-ROM reads
|
0CH
|
WORD
|
Load segment for initial boot image (if 0000H, load at segment 07C0H)
|
0EH
|
WORD
|
Number of 512-byte virtual sectors to load (only valid for Function 4CH of INT 13H)
|
10H
|
BYTE
|
Low byte of cylinder count (for Function 08H of INT 13H)
|
11H
|
BYTE
|
Sector count, high bits of cylinder count (for Function 08H of INT 13H)
|
12H
|
BYTE
|
Head count (for Function 08H of INT 13H)
|
De bitvelden voor het opstartmediatype voor opstartbare cd-rom zijn gegeven in de volgende tabel:
Bit(s)
|
Description
|
3-0
|
Media type
Value
|
Description
|
0000
|
No emulation.
|
0001
|
1.2M diskette.
|
0010
|
1.44M diskette.
|
0011
|
2.88M diskette.
|
0100
|
Hard disk (drive C:)
|
Other
|
Reserved
|
|
5-4
|
Reserved (0)
|
6
|
Image contains ATAPI driver
|
7
|
Image contains SCSI driver(s)
|
INT 13H (0x13)
Function 4B00H (0x4B00) --> Terminate Disk Emulation (Bootable CD-ROM)
Call with: AX = 4B00H
DL = Drive number (or 7FH to terminate
all emulations)
DS:SI = Empty specification packet
Return: If Function Successful,
Carry Flag = Clear
If Function Unsuccessful,
Carry Flag = Set
AX = Status code
DS:SI = Specification packet filled
Comments:
Deze functie wordt gebruikt om de schijfemulatie te beëindigen. Als u alle emulaties wilt beëindigen, roept u de functie aan met DL = 7FH. Als de functie succesvol is, is de carry-vlag gewist, anders wordt de carry-vlag ingesteld en geeft het AX-register de statuscode terug en blijft de drive in de emulatiemodus.
INT 13H (0x13)
Function 4B01H (0x4B01) --> Get Status (Bootable CD-ROM)
Call with: AX = 4B01H
DL = Drive number
DS:SI = Empty specification packet
Return: If Function Successful,
Carry Flag = Clear
If Function Unsuccessful,
Carry Flag = Set
AX = Status code
DS:SI = Specification packet filled
Comments:
De functie wordt gebruikt om de status te krijgen. Als de functie succesvol is, is de carry-vlag duidelijk, anders is de carry-vlag ingesteld en geeft het AX-register de statuscode terug
INT 13H (0x13)
Function 4CH (0x4C or 76) --> Initiate Disk Emulation and Boot (Bootable CD-ROM)
Call with: AH = 4CH
AL = 00H
DS:SI = Specification packet
Return: If Function Successful,
Nothing
If Function Unsuccessful,
Carry Flag = Set
AX = Status code
Comments:
Deze functie wordt gebruikt om de schijfemulatie te starten en het systeem op te starten. Als de functie succesvol is, retourneert niets anders, de carry-vlag is ingesteld en het AX-register retourneert de statuscode.
INT 13H (0x13)
Function 4D00H (0x4D00) --> Return Boot Catalog (Bootable CD-ROM)
Call with: AX = 4D00H
DS:SI = Command packet (See the Table in
comments)
Return: If Function Successful,
Carry Flag = Clear
If Function Unsuccessful,
Carry Flag = Set
AX = Status code
Comments:
Deze functie wordt gebruikt om de opstartcatalogus te retourneren. Als de functie succesvol is, is de carry-vlag gewist, anders wordt de carry-vlag ingesteld en geeft het AX-register de statuscode terug. Het formaat van de opstartbare cd-rom van "Get Boot Catalog" opdrachtpakket is gegeven in de volgende tabel:
Offset
|
Size
|
Description
|
00H
|
BYTE
|
Size of packet in bytes (08H)
|
01H
|
BYTE
|
Number of sectors of boot catalog to read
|
02H
|
DWORD
|
Buffer for boot catalog
|
06H
|
WORD
|
First sector in boot catalog to transfer
|
INT 13H (0x13)
Function 4EH (0x4E or 78) --> Set Hardware Configuration (IBM/MS INT 13H Extensions v2.1)
Call with: AH = 4EH
AL = Function Number ( See the Table in comments)
DL = Drive number
Return: If Function Successful,
Carry Flag = Clear
AH = 00H
If Function Unsuccessful,
Carry Flag = Set
AH = error code
AL = Status
Comments:
Deze functie wordt gebruikt om de hardwareconfiguratie in te stellen. De functienummers voor AL om deze functie aan te roepen zijn gegeven in de volgende tabel:
Value
|
Description
|
00H
|
Enable prefetch
|
01H
|
Disable prefetch
|
02H
|
Set maximum PIO transfer mode
|
03H
|
Set PIO mode 0
|
04H
|
Set default PIO transfer mode
|
05H
|
Enable INT 13H DMA maximum mode
|
06H
|
Disable INT 13H DMA
|
DMA- en PIO-modi sluiten elkaar wederzijds uit, daarom schakelt het selecteren van DMA PIO uit voor het gespecificeerde apparaat of alle apparaten op die controller en het selecteren van PIO schakelt DMA uit
INT 13H (0x13)
Function 5001H (0x5001) --> Send Packet Command (Enhanced Disk Drive Spec v3.0)
Call with: AX = 5001H
DL = Drive number
ES:BX = Command packet (See the Table in
comments)
Return: If Function Successful,
Carry Flag = Clear
AH = 00H
If Function Unsuccessful,
Carry Flag = Set
AH = error code
Comments:
Deze functie wordt gebruikt om de pakketopdrachten te verzenden. Als de functie succesvol is, is de carry-vlag gewist en is het AH-register 00H, anders wordt de carry-vlag ingesteld en geeft AH de foutcode terug. Het opdrachtpakket Format of Enhanced Disk Drive Spec v3.0 is weergegeven in de volgende tabel:
Offset
|
Size
|
Description
|
00H
|
WORD
|
Signature B055H
|
02H
|
BYTE
|
Length of packet in bytes
|
03H
|
BYTE
|
Reserved (0)
|
04H
|
N BYTEs
|
Formatted packet data
|
INT 13H (0x13)
Function 5501H (0x5501) --> Inquiry (Seagate ST01/ST02)
Call with: AX = 5501H
DH = Number of bytes to transfer
DL = Drive Number
ES:BX = Buffer for results
Return
ES:BX buffer, filled with the Inquiry results.
Comments:
Deze functie wordt gebruikt om een aanvraag te verzenden. Het ST01/ST02 BIOS geeft geen succes- of foutindicatie voor de functie terug, daarom moet worden aangenomen dat alle opdrachten succesvol zijn geweest.
Het ST01/ST02 BIOS wijst zijn schijven altijd toe aan de vorige BIOS-schijven zonder de BIOS-schijftelling om 0040H:0075H te wijzigen. Deze opdracht is identiek aan de opdracht SCSI Inquiry
INT 13H (0x13)
Function 5502H (0x5502) --> Reserved (Seagate ST01/ST02)
INT 13H (0x13)
Function 5503H (0x5503) --> Set DTQ (Device Type Qualifier) (Seagate ST01/ST02)
Call with: AX = 5503H
DH = DTQ byte (See the table in
comments)
DL = Drive Number
Return: Nothing
Comments:
Deze functie wordt gebruikt om de DTQ (Device Type Qualifier) in te stellen. De functie retourneert niets. De Bit-velden voor DTQ-byte zijn weergegeven in de volgende tabel:
Bit(s)
|
Description
|
0
|
Seagate installation software present
|
1
|
Selected drive has been installed
|
2
|
Host Adapter checks parity on the selected drive
|
3
|
Selected drive is ST225N
|
4
|
Selected drive is paired ST225N/NP
|
5
|
Reserved
|
6
|
SCSI drive attached
|
7
|
Reserved
|
INT 13H (0x13)
Function 5504H (0x5504) --> Return Identification (Seagate ST01/ST02)
Call with: AX = 5504H
DL = Drive Number
Return:
AX = 4321H
BL = selected drive number (00H, 01H)
BH = number of drives attached to Host
Adapter
Comments:
Functie wordt gebruikt om de identificatie van de drive(s) terug te geven.
INT 13H (0x13)
Function 5505H (0x5505) --> Park Heads (Seagate ST01/ST02)
Call with: AX = 5505H
DL = Drive Number
DH = Sub function (see the comments)
Return:
Nothing
Comments:
De functie wordt gebruikt om de koppen van de schijf te parkeren. Het werd gebruikt in de oude harde schijven, maar de moderne harde schijven hebben geen extern programma nodig om hun hoofd te parkeren.
De Sub-functie 00H parkeert de heads (SCSI Stop-commando) en de Sub-functie 01H de-parkeert de heads (SCSI Start-commando) van de schijf.
INT 13H (0x13)
Function 5506H (0x5506) --> SCSI Bus Parity (Seagate ST01/ST02)
Call with: AX = 5506H
DL = Drive Number
DH = Sub function Number (See
Comments)
Return:
AL = Status (00H parity checking
disabled, 01H parity checking enabled)
Comments:
Roep de functie op met het volgende subfunctienummer voor DH:
Value
|
Description
|
00H
|
Disable parity check
|
01H
|
Enable parity check
|
02H
|
Return current parity setting
|
INT 13H (0x13)
Function 5507H (0x5507) To Function 550DH (0x550D) --> Reserved Functions (Seagate ST01/ST02)
Call with: AX = 5507H to AX = 550DH
Comments:
Deze functies zijn officieel vermeld als "Gereserveerd"
INT 13H (0x13)
Function A0H (0xA0 or 160) --> Get Resident Code Segment (Super PC-Kwik v3.20 and Later)
Call with: AH = A0H
SI = 4358H
Return:
AX = Segment of Resident Code
Comments:
Deze functie wordt gebruikt om het residente codesegment op te halen. AX retourneert het segment van de ingezeten code.
INT 13H (0x13)
Function A1H (0xA1 or 161) --> Flush Cache (Super PC-Kwik v3.20 and Later)
Call with: AH = A1H
SI = 4358H
Return:
Carry Flag = Clear
AH = 00H (v5.10)
Comments:
De functie wordt gebruikt om de cache te wissen.
INT 13H (0x13)
Function A3H (0xA3 or 163) --> Disable Cache (Super PC- Kwik v3.20 and Later)
Call with: AH = A3H
SI = 4358H
Return:
Carry Flag = Clear
Comments:
Functie wordt gebruikt om de cache uit te schakelen.
INT 13H (0x13)
Function A4H (0xA4 or 164) --> Enable Cache (Super PC-Kwik v3.20 and Later)
Call with: AH = A4H
SI = 4358H
Return:
Carry Flag = Clear
Comments:
Deze functie wordt gebruikt om cache in te schakelen.
INT 13H (0x13)
Function EEH (0xEE or 238) --> Set 1024-Cylinder Flag (SWBIOS)
Call with: AH = EEH
DL = Drive Number
Return:
Carry Flag = Clear
AH = 00H
Comments:
De functie wordt gebruikt om 1024 in te stellen – Cilindervlag. De vlag wordt gewist door alle INT 13H-oproepen behalve AH=EEH en AH=EFH. Disk Manager ondersteunt deze oproepen ook. Deze functie is gelijk aan het aanroepen van functie AH=EFH met CX=0400H voor de software die die aanroep ondersteunt.
Deze functie wordt ook ondersteund door HyperDisk v4.01 en later, en PC-Cache v5.5 en later, om caching van schijven mogelijk te maken met SWBIOS om toegang te krijgen tot meer dan 1024 cilinders.
INT 13H (0x13)
Function EFH (0xEF or 239) --> Set Cylinder Offset (Ontrack Drive Rocket)
Call with: AH = EFH
CX = Cylinder offset for next INT 13H call
DL = Drive Number
Return:
Carry Flag = Clear
AH = 00H
Comments:
De functie wordt gebruikt om de cilinderoffset in te stellen. Voor software die deze aanroep ondersteunt, is de functie AH=EEH gelijk aan het aanroepen van deze functie met CX=0400H. De cilinderoffset wordt door alle opgeroepen INT 13H op 0 gezet, behalve AH=EEH en AH=EFH.
INT 13H (0x13)
Function F9H (0xF9 or 249) --> Installation Check (SWBIOS)
Call with: AH = F9H
DL = Drive Number
Return: If Function Successful,
Carry Flag = Clear
DX = Configuration Word (see comments)
If Function Unsuccessful,
Carry Flag = Set
Comments:
Deze functie wordt gebruikt voor installatiecontrole. Als de functie succesvol is, is de carry-vlag gewist en DX retourneert het configuratiewoord, anders wordt de carry-vlag ingesteld.
Bit 15 wordt ingesteld als er andere SWBIOS-extensies beschikbaar zijn. Disk Manager ondersteunt deze oproepen ook.
INT 13H (0x13)
Function FEH (0xFE or 254) --> Get Extended Cylinder Count (SWBIOS)
Call with: AH = FEH
DL = Drive Number
Return:
Carry Flag = Clear
DX = Number of Cylinders beyond 1024
on drive
Comments:
Deze functie wordt gebruikt om het uitgebreide aantal cilinders te krijgen. De functie AH = 08H van INT 13H retourneert een cilindertelling die is afgekapt tot 1024. BIOS zonder deze extensie zou tellingsmodule 1024 retourneren. Schijfbeheer ondersteunt deze aanroepen ook
INT 13H (0x13)
Function FFH (0xFF or 255) --> Officially Private Function (IBM SurePath BIOS)
INT 13H (0x13)
Function FFFFH (0xFFFF) --> Set Turbo Mode (UNIQUE UX Turbo Utility)
Call with: AX = FFFFH
BH = AAH
BL = Sub Function Number (See the table
in Comments)
Return: If installed,
AX = 1234H
Comments:
Deze functie wordt gebruikt om de Turbomodus in te stellen. De subfunctienummers om de functie met BL aan te roepen zijn gegeven in de volgende tabel:
Value
|
Description
|
00H
|
Installation check
|
01H
|
Turn on Turbo mode
|
02H
|
Turn off Turbo mode
|
03H
|
Set Turbo mode according to hardware switch
|
04H
|
Set disk access to Turbo mode
|
05H
|
Set disk access to Normal mode
|
Hoe INT 13H-extensies te gebruiken in C-programmering
We kunnen de extensiefuncties van INT 13H aanroepen met dezelfde C-functies (int86(), int86x() etc.) , die we in de eerdere hoofdstukken gebruikten. Laten we het aan de hand van een voorbeeld leren.
Het volgende voorbeeld geeft de focus op de drie functies (Check Extensions present, extended read en extended write). In dit hoofdstuk gaan we echter geen uitgebreide schrijffunctie gebruiken.
Het programma controleert eerst of extensies worden ondersteund of niet of de extensies aanwezig zijn voor INT 13H, het leest de absolute sector 0 (dus MBR) van de schijf. De codering van het programma gaat op de volgende manier:
/* Programma voor toegang tot sectoren groter dan 8,46 GB met behulp van INT 13 BIOS-extensies */
#include<stdio.h>
#include<dos.h>
/* Assigns the identifier to the data type */
typedef unsigned char Byte;
typedef unsigned int Word;
typedef unsigned long DWord;
/* disk_packet structure is loaded in DS:SI and command executed */
struct disk_packet
{
Byte size_pack; // Size of packet must be 16 or 16+
Byte reserved1; // Reserved
Byte no_of_blocks;// Number of blocks for transfer
Byte reserved2; // Reserved
/* Address in Segment:Offset format */
Word offset; //offset address
Word segment; //segment address
/* To Support the Disk Even of Capacity of 1152921504.607 GB */
DWord lba1;
DWord lba2;
}
disk_pack;
/* Function to check if the Extensions are supported */
void check_ext_present()
{
union REGS inregs, outregs; /* Input Registers and
Output */
inregs.h.ah=0x41; /* Function to Check
Extension Present */
inregs.x.bx=0x55AA;
inregs.h.dl=0x80; /* Drive No for first Hard Disk */
int86(0x13,&inregs,&outregs); /*Call interrupt */
if(outregs.x.cflag)
{
/* Extension Not Supported */
printf("\nBios extension not supported");
exit(1);
}
if(outregs.x.bx==0xAA55)
if(outregs.x.cx & 0x1)
/* Extension Present */
printf("\nExtended I/O supported");
}
/* Function to read the Sector */
void read_sectors(void *buffer)
{
union REGS inregs, outregs; /* Input and Output
Registers */
struct SREGS segregs; // Segment Registers
disk_pack.size_pack=16; // Set size to 16
disk_pack.no_of_blocks=1; // One block
disk_pack.reserved1=0; // Reserved Word
disk_pack.reserved2=0; // Reserved Word
disk_pack.segment=FP_SEG(buffer);// Segment of buffer
disk_pack.offset=FP_OFF(buffer); // Offset of buffer
/* request for MBR of hard disk 1 */
/* Read Absolute sector 0 */
disk_pack.lba1=0; /* LBA address, Contains first
32 bits */
/* We normally require( drives < 2.1 T.B) to set
only this */
disk_pack.lba2=0; // Last 32 bit address
inregs.h.ah=0x42; // Function to read
inregs.h.dl=0x80; // Drive Number for First Hard Disk inregs.x.si = FP_OFF(&disk_pack); /*Make DS:SI point
to disk_pack */
segregs.ds = FP_SEG(&disk_pack);
/* Call Interrupt */
int86x(0x13,&inregs,&outregs,&segregs);
if(outregs.x.cflag)
printf("\n\nError %d\n",outregs.h.ah);
else
printf("\n\nI hope Everything is all Right");
}
//// Write Sector Function \\\\
void write_sector()
{
/* Het wordt op dezelfde manier geschreven als de functie read_sectors, behalve het functienummer, dat in deze functie 0x43 is. We zullen de uitgebreide schrijffunctie in de volgende hoofdstukken bespreken.
Controleer en verifieer wat u gaat doen voordat u deze functie gebruikt. Je moet de juiste kennis hebben van wat je gaat doen. Gebruik van deze functie bij gebrek aan kennis of onzorgvuldigheid kan uw gegevens vernietigen. */
}
/// Main Function \\\\
void main()
{
int i=0;
/* buffer to hold MBR */
Byte mbr[512];
clrscr();
/* check for BIOS extension present */
check_ext_present();
/* read sector */
read_sectors(&mbr);
printf("\n\n Data of MBR \n");
printf("▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\n\n");
while(i++<512)
{
/* display the MBR buffer */
printf("%c",mbr[i]);
}
}
Opmerkingen over de codering van het programma
typedef Wijst de identifier toe aan het datatype zodat typedef unsigned char Byte; wijst identifier Byte toe voor het gegevenstype char. Op dezelfde manier wordt de identifier Word toegewezen aan int en DWord aan long.
De disk_packet-structuur wordt geladen in DS:SI en het commando (zoals uitgebreid lezen, uitgebreid schrijven of verifiëren enz.) wordt uitgevoerd. Zie de eerder gegeven functies van IBM/MS INT 13H-extensies (functie 41H tot functie 49H).
De functie check_ext_present() controleert of de extensies beschikbaar/ondersteund zijn of niet. De functie wordt aangeroepen met BX=55AAH (inregs.x.bx=0x55AA;) en als extensies worden ondersteund, wordt het BX-register ingesteld op AA55H. (Zie Functie 41H eerder gegeven)
De functie read_sectors wordt gebruikt om de absolute sector van de schijf te lezen, gespecificeerd door disk_pack.lba1. In dit programma hebben we disk_pack.lba1=0 gegeven, dus gaan we de absolute sector 0 lezen (zie de opmerking hieronder) en dus de MBR van de schijf lezen.
De functie write_sector is ook hetzelfde als de functie read_sectors en wordt op dezelfde manier geschreven, maar met de verschillende functie-opties. We zullen het in de volgende hoofdstukken gebruiken.
Opmerking:
We lezen de schijfsectoren op de volgende twee manieren:
- Relatieve sector lezen (of schrijven)
- Absolute sector lezen (of schrijven)
In Relative Sector Read lezen we de schijfsectoren in overeenstemming met de CHS-geometrie (Cylinder, Head en Sector) van de schijf. In relatieve sector lees de MBR van de schijf (eerste sector van de schijf) op cilinder 0, kop 0 en sector 1.
Bij het absoluut lezen van de schijfsectoren hoeven we de cilinder- of kopnummers in ons programma niet op te geven. De absolute sectoren worden geteld vanaf absolute sector 0.
Dus als we de MBR van de schijf gaan lezen (eerste sector van de schijf), gaan we absolute sector 0 lezen. Het is het werk van BIOS om het absolute sectornummer om te zetten naar de overeenkomstige cilinder, kop en Sectornummer.
Net als bij het lezen (of schrijven van absolute sectoren), hoeven we alleen de absolute sectoren binnen de lus te berekenen in de bewerkingen zoals het lezen of schrijven van de volledige schijf, terwijl we in het geval van het lezen (of schrijven van relatieve sectoren) dat moeten doen voer drie lussen tegelijk uit voor het berekenen van CHS, daarom is het lezen/schrijven van absolute sectoren veel sneller dan het lezen/schrijven van relatieve sectoren.
Bijvoorbeeld, als we een harde schijf hebben met de 16 koppen (zijkanten), 12 cilinders en met 63 sectoren, toont de volgende tabel de procedure en het verschil van beide leesmethoden en laat zo zien hoe een absolute sectorbenadering onze tijdrovende programma's kan maken ( zoals het lezen/schrijven van volledige schijven of programma's voor het wissen van volledige schijven enz.) om veel sneller te werken:
Relative Sectors Reading
|
Absolute Sector reading
|
Cylinder =0, Head =0, Sector = 1
|
Absolute Sector = 0
|
Cylinder =0, Head =0, Sector = 2
|
Absolute Sector = 1
|
Cylinder =0, Head =0, Sector = 3
|
Absolute Sector = 2
|
.
.
.
.
|
.
.
.
.
|
Cylinder =0, Head =0, Sector = 62
|
Absolute Sector = 61
|
Cylinder =0, Head =0, Sector = 63
|
Absolute Sector = 62
|
Cylinder =0, Head =1, Sector = 1
|
Absolute Sector = 63
|
Cylinder =0, Head =1, Sector = 2
|
Absolute Sector = 64
|
Cylinder =0, Head =1, Sector = 3
|
Absolute Sector = 65
|
Cylinder =0, Head =1, Sector = 4
|
Absolute Sector = 66
|
.
.
.
.
|
.
.
.
.
|
Cylinder =0, Head =1, Sector = 63
|
Absolute Sector = 125
|
Cylinder =0, Head =2, Sector = 1
|
Absolute Sector = 126
|
Cylinder =0, Head =2, Sector = 2
|
Absolute Sector = 127
|
Cylinder =0, Head =2, Sector = 3
|
Absolute Sector = 128
|
.
.
.
.
|
.
.
.
.
|
Cylinder =0, Head =15, Sector = 63
|
Absolute Sector = 1007
|
Cylinder =1, Head =0, Sector = 1
|
Absolute Sector = 1008
|
Cylinder =1, Head =0, Sector = 2
|
Absolute Sector = 1009
|
Cylinder =1, Head =0, Sector = 3
|
Absolute Sector = 1010
|
.
.
.
.
|
.
.
.
.
|
Cylinder =1, Head =0, Sector = 63
|
Absolute Sector = 1070
|
Cylinder =1, Head =1, Sector = 1
|
Absolute Sector = 1071
|
Cylinder =1, Head =1, Sector = 2
|
Absolute Sector = 1072
|
Cylinder =1, Head =1, Sector = 3
|
Absolute Sector = 1073
|
.
.
.
.
|
.
.
.
.
|
Cylinder =1, Head =15, Sector = 63
|
Absolute Sector = 2015
|
Cylinder =2, Head =0, Sector = 1
|
Absolute Sector = 2016
|
Cylinder =2, Head =0, Sector = 2
|
Absolute Sector = 2017
|
Cylinder =2, Head =0, Sector = 3
|
Absolute Sector = 2018
|
.
.
.
.
|
.
.
.
.
|
Cylinder =11, Head =15, Sector = 60
|
Absolute Sector = 12092
|
Cylinder =11, Head =15, Sector = 61
|
Absolute Sector = 12093
|
Cylinder =11, Head =15, Sector = 62
|
Absolute Sector = 12094
|
Cylinder =11, Head =15, Sector = 63
|
Absolute Sector = 12095
|
De informatie van de partitietabel van MBR, die wordt weergegeven door een schijf-MBR-analysetool, wordt hieronder gegeven:
In de bovenstaande informatie zijn de relatieve sectornummers voor het starten van beide partities respectievelijk 63 en 11277630, die vrij zijn van partities en worden geteld volgens het aantal sectoren dat beschikbaar is op schijf.
Pagina aangepast op: 13/01/2022