Глава – 8
Функции Disk-BIOS и обработка прерываний с помощью C
Введение
В этой главе мы обсудим важные функции Disk-BIOS и другие важные функции, которые дают нам свободу использования и обработки прерываний в нашей программе на C простым и коротким методом. Эти функции являются задней – костяк программирования восстановления данных и устранения неполадок диска. Именно эти функции делают язык C “High – уровень языка ассемблера”.
функции biosdisk и _bios_disk
Эти две функции являются наиболее важными для нашей задачи восстановления данных и программирования устранения неполадок диска. Мы будем использовать эти функции большую часть времени.
Эти две службы являются службами дисководов BIOS и определены в файле bios.h, где biosdisk работает ниже уровня файлов в необработанных секторах. Если эти функции используются даже с небольшой небрежностью, это может привести к уничтожению содержимого файлов и каталогов на жестком диске. И функция biosdisk, и функция _bios_disk используют прерывание 0x13 для отправки дисковых операций непосредственно в BIOS. Функция _bios_disk объявляется в программе следующим образом:
unsigned _bios_disk(unsigned cmd, struct diskinfo_t *dinfo);
And the declaration for the bios disk function is as follows:
int biosdisk(int cmd, int drive, int head, int track,
int sector, int nsects, void *buffer);
The meaning of these parameters has been described in the following table:
Parameter |
Function |
What It Is or what it does |
cmd |
Both |
Indicates the operation to perform such as read, write, verify etc.(See the description of cmd, given next) |
dinfo |
_bios_disk |
Points to a diskinfo_t structure that contains the remaining Parameters required by the operation.(see the description of diskinfo_t structure, given next) |
drive |
biosdisk |
Specifies which disk drive is to be used(0 for a:, 1for b: and 0x80 for first physical hard disk, 0x81 for second and so on.) |
head
track
sector |
biosdisk |
These specify the starting sector location from which the Operation is to be started. |
nsects |
biosdisk |
Number of sectors to read, write, verify etc. |
buffer |
biosdisk |
Memory address where data is to be read or written |
В обеих этих функциях данные считываются и записываются из буфера по 512 байт на сектор, что является логическим размером сектора жесткого диска, а значение, возвращаемое обеими функциями, является значением регистра AX, установленным INT 0x13H. Вызов BIOS.
Если функция выполнена успешно, старший байт = 0, что означает успешное завершение, а младший байт содержит количество прочитанных, записанных или проверенных секторов и так далее.
Но если есть какая-либо ошибка и функция не работает, значение старшего байта будет одним из следующих кодов ошибок, которые описаны в следующей таблице:
Value |
Description |
0x00 |
Successful completion (Not an Error!!) |
0x01 |
Bad command |
0x02 |
Address mark not found |
0x03 |
Attempt to write to write-protected disk |
0x04 |
Sector not found |
0x05 |
Reset failed (hard disk) |
0x06 |
Disk changed since last operation |
0x07 |
Drive parameter activity failed |
0x08 |
Direct memory access (DMA) overrun |
0x09 |
Attempt to perform DMA across 64K boundary
(data Boundary error or >80H sectors) |
0x0A |
Bad sector detected |
0x0B |
Bad track detected |
0x0C |
Unsupported track |
0x0D |
Invalid number of sectors on format (PS/2 hard disk) |
0x0E |
Control data address mark detected (hard disk) |
0x0F |
DMA arbitration level out of range (hard disk) |
0x10 |
Bad CRC/ECC on disk read |
0x11 |
CRC/ECC corrected data error (Not an error actually) |
0x20 |
Controller has failed |
0x31 |
No media in drive (IBM/MS INT 13 extensions) |
0x32 |
Incorrect drive type stored in CMOS (Compaq) |
0x40 |
Seek operation failed |
0x80 |
Attachment failed to respond |
0xAA |
Drive not ready (hard disk only) |
0xB0 |
Volume not locked in drive (INT 13 extensions) |
0xB1 |
Volume locked in drive (INT 13 extensions) |
0xB2 |
Volume not removable (INT 13 extensions) |
0xB3 |
Volume in use (INT 13 extensions) |
0xB4 |
Lock count exceeded (INT 13 extensions) |
0xB5 |
Valid eject request failed (INT 13 extensions) |
0xBB |
Undefined error occurred (hard disk only) |
0xCC |
Write fault occurred |
0xE0 |
Status register error |
0xFF |
Sense operation failed |
В приведенной ниже таблице представлены команды операций, которые должны выполняться с помощью параметра cmd. Прежде всего, мы увидим общие операции обеих функций.
biosdisk |
_bios_disk |
What it does |
0 |
_DISK_RESET |
Resets disk system, forcing the drive controller to do a hard reset. Ignore all other parameters |
1 |
_DISK_STATUS |
Returns the status of the last disk operation. Ignores all other parameters |
2 |
_DISK_READ |
Reads one or more disk sectors into memory |
3 |
_DISK_WRITE |
Writes one or more disk sectors from memory |
4 |
_DISK_VERIFY |
Verifies one or more sectors |
5 |
_DISK_FORMAT |
Formats a track |
Хотя вы можете использовать либо cmd = 0, 1, 2, 3, 4,5, либо cmd = _DISK_RESET, _DISK_STATUS, _DISK_READ, _DISK_WRITE, _DISK_VARIFY, _DISK_FORMAT, и оба параметра имеют одинаковый эффект, но рекомендуется имейте привычку использовать такие слова, как cmd = _DISK_FORMAT вместо cmd = 5, потому что это может помочь вам избежать ошибок, которые могут возникнуть, если вы ввели неправильный номер команды для cmd.
В объявлении функции biosdisk или _bios_disk, если мы даем cmd = _DISK_RESET, функция сбрасывает дисковую систему, игнорируя все остальные параметры, а _DISK_STATUS возвращает статус последней операции с диском, игнорируя все остальные параметры
Для cmd =_DISK_READ, _DISK_WRITE или _DISK_VERIFY (2, 3 или 4) функции biosdisk и _bios_disk также используют другие параметры, показанные ниже:
Parameter |
What It Does |
head
track
sector |
These three specify the location of starting sector for the specified operation. (minimum possible values may be head = 0, track = 0 and sector =1) |
nsectors |
This specifies the number of sectors to read or write |
buffer |
It points to the buffer where data is to be read and written |
Если значение cmd = 5 (_DISK_FORMAT), biosdisk и _bios_disk используют следующие параметры согласно описанию в таблице. Всегда рекомендуется соблюдать осторожность при использовании _DISK_FORMAT и знать, что вы собираетесь делать. Недостаток знаний или даже небольшая ошибка могут привести к большой потере данных.
Parameter |
What It Does |
head
track |
These specify the location of the track to format |
buffer |
It points to a table of sector headers to be written on the named track |
Есть несколько дополнительных значений cmd, которые используются только функциями biosdisk. Эти значения cmd разрешены только для XT, AT, PS/2 и совместимых устройств. Значения описаны в таблице, приведенной ниже:
cmd |
What it does |
6 |
Formats a track and sets bad sector flags |
7 |
Formats the drive beginning at a specific track |
8 |
Returns the current drive parameters in first 4 bytes of buffer |
9 |
Initializes drive-pair characteristics |
10 |
Does a long read (512 plus 4 extra bytes per sector) |
11 |
Does a long write (512 plus 4 extra bytes per sector) |
12 |
Does a disk seek |
13 |
Alternates disk reset |
14 |
Reads sector buffer |
15 |
Writes sector buffer |
16 |
Tests whether the named drive is ready |
17 |
Recalibrates the drive |
18 |
Controller RAM diagnostic |
19 |
Drive diagnostic |
20 |
Controller internal diagnostic |
структура diskinfo_t
Структура diskinfo_t используется функцией _bios_disk. Описание структуры выглядит следующим образом:
struct diskinfo_t {
unsigned drive, head, track, sector, nsectors;
void far *buffer;
};
Где диск указывает используемый диск. Всегда помните, что для жестких дисков указывается физический диск, а не раздел диска. Если вы хотите работать с разделами, прикладная программа должна также интерпретировать информацию таблицы разделов этого диска.
Значения заголовка, дорожки и сектора указывают местоположение начального сектора для операции. nsectors указывает количество секторов для чтения или записи, а buffer указывает на буфер, в котором данные считываются и записываются. В зависимости от значения cmd другие параметры в структуре diskinfo_t могут понадобиться или не понадобиться.
Значение спецификации диска, используемого в функциях biosdisk и _bios_disk, указано в следующей таблице:
drive Value |
Disk drive to use |
0 |
First floppy-disk drive |
1 |
Second floppy-disk drive |
2 |
Third floppy-disk drive |
.... |
(and so on) |
0x80 |
First hard-disk drive |
0x81 |
Second hard-disk drive |
0x82 |
Third hard-disk drive |
.... |
(and so on) |
Хватит теории! Теперь давайте посмотрим на некоторые практические вещи и некоторые примеры этих функций. В следующем примере считываются сектора с обеих сторон четырех дорожек дискеты и сохраняется содержимое в файл, указанный пользователем. Не имеет значения, удалили ли вы файлы с вашего диска, потому что программа читает непосредственно поверхность диска.
Чтобы увидеть удаленные данные, лучше всего взять полностью отформатированную дискету и скопировать некоторые текстовые файлы, такие как код вашей программы .c или другие текстовые файлы (чтобы вы могли понять содержимое файлов) занимая примерно 73 КБ (данные хранятся на четырех дорожках, двух сторонах и 18 секторах на каждой дорожке. Каждый сектор имеет размер 512 байт). Программа была разработана для демонстрации примера. Однако вы можете изменить и развить его, чтобы он был готов к восстановлению данных.
/* Программа для чтения 4 дорожек (0, 1, 2 и 3) дискеты и записи содержимого в указанный файл */
#include <bios.h>
#include <stdio.h>
#include<conio.h>
void main(void)
{
int head,track;
int result,i,sector;
char filename[80];
char *buffer;
struct diskinfo_t dinfo;
static char dbuf[512];
FILE *tt;
clrscr();
/// Проверьте, готов ли диск или нет \\\
if(!(biosdisk(4,0,0,0,0,1,buffer) & 0x02))
{
printf(" Drive A: Not Ready:\n Insert disk into Drive A:
and press any key\n");
getch();
}
/* Получите имя файла для хранения данных секторов
диск */
printf("\nEnter the Destination File name with full Path
to store the data \n\n >");
gets(filename);
if((tt= fopen(filename, "wb"))==NULL)
{
printf("Could not open the File!!!");
getch();
}
for(track=0;track<4;track++)
{
for(head=0; head<=1;head++)
{
for(sector=1;sector<=18;sector++)
{
dinfo.drive = 0; /* drive number for A: */
dinfo.head = head; /* disk head number */
dinfo.track = track; /* track number */
dinfo.sector = sector; /* sector number */
dinfo.nsectors = 1; /* sector count */
dinfo.buffer = dbuf; /* data buffer */
/// Показать статус \\\
gotoxy(10,10); printf("Reading Data from: Head=%d
Track=%d Sector=%d",
head, track, sector);
fprintf(tt,"\n Data read from: Head=%d Track=%d Sector=%d\n",
head, track, sector);
/// Чтение указанных секторов \\\
result = _bios_disk(_DISK_READ, &dinfo);
/// Сохранить содержимое в указанном файле \\\
if ((result & 0xff00) == 0)
{
for(i=0;i<512;i++)
fprintf(tt,"%c",dbuf[i] & 0xff);
}
/* Печать сообщения об ошибке на экране и в файле для сообщения об ошибке при чтении сектора */
else
{
printf("\n Can not read at Head= %d Track= %d
Sector= %d\n",head,track,sector);
fprintf(tt,"\n Can not read at Head= %d Track= %d
Sector =%d\n",head,track,sector);
}
}
}
}
fclose(tt);
}
В примере показано использование функций biosdisk и _bios_disk. Функция biosdisk проверяет, готов диск или нет, и найдена ли адресная метка. Функция _bios_disk считывает сектора обеих сторон до четырех дорожек.
Последовательность чтения (или записи) на поверхность диска должна быть следующей:
Функции abread и abwrite
Эти функции определены в Dos.h. Функция absread считывает абсолютные сектора диска, а функция abswrite записывает абсолютные сектора диска. Функция absread использует прерывание DOS 0x25 для чтения определенных секторов диска, а функция abswrite использует прерывание DOS 0x26 для записи определенных секторов диска.
Операции абсолютного чтения или записи выполняются последовательно, увеличивая сектор(ы) шаг за шагом, и полностью свободны от номеров головок и дорожек и т. д. Задача BIOS компьютера состоит в преобразовании абсолютных секторов в соответствующие номер дорожки, головы и сектора.
Операции абсолютного чтения и записи рекомендуются в таких программах, где мы собираемся выполнять операции чтения/записи на всем диске, и мы хотим избежать дополнительного кодирования и циклов в нашей программе, чтобы максимально увеличить скорость программы.
Обе функции abread и abwrite игнорируют логическую структуру диска и не обращают внимания на файлы, FAT или каталоги. Эти функции непосредственно выполняют операции абсолютного чтения и абсолютной записи на поверхности диска. По этой причине при неправильном использовании функция abswrite может перезаписывать файлы, каталоги и FAT.
Объявление функции abread выглядит следующим образом:
int absread(int drive, int nsects, long lsect,
void *buffer);
а функция abwrite объявляется следующим образом:
int abswrite(int drive, int nsects, long lsect,
void *buffer);
Где значение параметров следующее:
Param. |
What It Is/Does |
drive |
Drive number to read (or write): 0 = A, 1 = B, etc. |
nsects |
Number of sectors to read (or write) |
lsect |
Beginning logical sector number |
buffer |
Memory address where the data is to be read (or written) |
В случае успеха обе функции возвращают 0. При возникновении ошибки обе возвращают -1 и устанавливают номер ошибки. к значению регистра AX, возвращенному системным вызовом.
Количество секторов для операции чтения или записи ограничено 64 КБ или размером буфера, в зависимости от того, что меньше. Однако в следующих главах мы узнаем, как использовать Огромную память, чтобы превысить лимит памяти в 64 КБ, чтобы разработать очень быструю программу.
|
Обработка прерываний с помощью C
C иногда называют языком ассемблера высокого уровня, потому что он может вызывать различные прерывания, используя некоторые из определенных функций. Вот некоторые важные функции:
- int86: вызывает прерывания MS-DOS.
- int86x: вызывает прерывание MS-DOS со значениями регистра сегмента.
- intdos: вызывает службу MS-DOS, используя регистры, отличные от DX и AL
- intdosx: вызывает службу MS-DOS со значениями регистра сегмента.
- segread: считывает регистры сегментов.
Мы подробно обсудим эти функции. Прежде всего, мы обсудим некоторые предопределенные структуры и объединения, которые часто или обязательно используются с этими функциями.
Структура SREGS
Эта структура была определена в dos.h и представляет собой структуру сегментных регистров, передаваемых и заполняемых функциями int86x, intdosx и segread. Объявление структуры выглядит следующим образом:
struct SREGS {
unsigned int es;
unsigned int cs;
unsigned int ss;
unsigned int ds;
};
Союз REGS
REGS — это объединение двух структур. Объединение REGS было определено как dos.h и используется для передачи информации между функциями int86, int86x, intdos и intdosx. Декларация профсоюза выглядит следующим образом:
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Структуры BYTEREGS и WORDREGS
Структуры BYTEREGES и WORDREGS определены в dos.h и используются для хранения регистров байтов и слов. Структура WORGREGS позволяет пользователю обращаться к регистрам ЦП как к 16-битным величинам, тогда как структура BYTEREGES дает доступ к отдельным 8-битным регистрам.
Структура BITEREGS объявлена следующим образом:
struct BYTEREGS {
unsigned char al, ah, bl, bh;
unsigned char cl, ch, dl, dh;
};
А структура WORDREGS объявляется следующим образом:
struct WORDREGS {
unsigned int ax, bx, cx, dx;
unsigned int si, di, cflag, flags;
};
функции int86 и int86x
Эти функции являются общими интерфейсами программных прерываний 8086, определенными в dos.h. Регистры устанавливаются в желаемые значения, и эти функции вызываются для вызова прерываний MS-DOS. Объявление функции int86 выглядит следующим образом:
int int86(int intno, union REGS *inregs,
union REGS *outregs);
int86x — это разновидность функции int86. Он объявляется следующим образом:
int int86x(int intno, union REGS *inregs,
union REGS *outregs, struct SREGS *segregs);
Обе функции int86 и int86x выполняют программное прерывание 8086, указанное аргументом intno. Или мы можем сказать, что генерируемое прерывание указано intno.
С помощью функции int86x доступ возможен только к ES и DS, но не к CS и SS, поэтому вы можете вызвать программное прерывание 8086, которое принимает значение DS, отличное от сегмента данных по умолчанию, и/или принимает аргумент в ES.
Эти функции копируют значения регистров из inregs в регистры перед выполнением программного прерывания. Функция int86x также копирует значения segregs->ds и segregs->es в соответствующие регистры перед выполнением программного прерывания. Эта функция позволяет программам, использующим дальние указатели или модель памяти с большими данными, указывать, какой сегмент следует использовать для программного прерывания.
Функции копируют текущие значения регистров в outregs, состояние флага переноса в поле x.cflag в outregs и значение регистра флагов 8086 в поле x.flags в outregs после возврата программного прерывания. Функция int86x также восстанавливает DS и устанавливает поля segregs->es и segregs->ds в значения соответствующих сегментных регистров.
В обеих функциях inregs и outregs могут указывать на одну и ту же структуру, и обе функции возвращают значение AX после завершения программного прерывания. Если флаг переноса установлен, это обычно означает, что произошла ошибка.
Элементы объединения REGS, используемые в C, эквивалентные языку ассемблера, приведены в следующей таблице:
16-bit |
8-bit |
C language |
Assembly language |
C language |
Assembly language |
inregs.x.ax |
AX |
inregs.h.al |
AL |
|
|
inregs.h.ah |
AH |
inregs.x.bx |
BX |
inregs.h.bl |
BL |
|
|
inregs.h.bh |
BH |
inregs.x.cx |
CX |
inregs.h.cl |
CL |
|
|
inregs.h.ch |
CH |
inregs.x.dx |
DX |
inregs.h.dl |
DL |
|
|
inregs.h.dh |
DH |
inregs.x.si |
SI |
|
|
inregs.x.di |
DI |
|
|
inregs.x.cflag |
CF |
|
|
Давайте посмотрим на примеры функций int86 и int86x. Следующая программа сканирует каждый сектор дискеты и выводит состояние каждого сектора на экран.
/* Программа для сканирования каждого сектора дискеты и печати статуса */
#include<dos.h>
#include<conio.h>
void main()
{
int head,track,sector,i;
char *buf;
union REGS inregs, outregs;
struct SREGS sregs;
clrscr();
/// Инициализация диска путем сброса дисковой системы \\\
gotoxy(10,2); printf("Initializing The Disk...");
for(i=0;i<3;i++)
{
inregs.h.ah=0x00; // Function Number
inregs.h.dl=0x00; // Floppy Disk
int86(0x13,&inregs,&outregs);
}
gotoxy(10,2); printf("The Status of the Disk is as....\n");
/* Просканируйте дискету от 0 до 79 дорожек (всего 80 дорожек) */
for(track=0;track<=79;track++)
for(head=0;head<=1;head++)
for(sector=1;sector<=18;sector++)
{
inregs.h.ah = 0x04; /// function Number
inregs.h.al = 1; /// Number of sectors
inregs.h.dl = 0x00; /// Floppy Disk
inregs.h.ch = track;
inregs.h.dh = head;
inregs.h.cl = sector;
inregs.x.bx = FP_OFF(buf);
sregs.es = FP_SEG(buf);
int86x(0x13,&inregs,&outregs,&sregs);
//// Распечатать статус сканируемого сектора \\\\
switch(outregs.h.ah)
{
case 0x00:
cprintf("STATUS: No Error!!");
break;
case 0x01:
cprintf("STATUS: Bad command");
break;
case 0x02:
cprintf("STATUS: Address mark not found");
break;
case 0x03:
cprintf("STATUS: Attempt to write to
write-protected disk");
break;
case 0x04:
cprintf("STATUS: Sector not found");
break;
case 0x05:
cprintf("STATUS: Reset failed (hard disk)");
break;
case 0x06:
cprintf("STATUS: Disk changed since last
operation");
break;
case 0x07:
cprintf("STATUS: Drive parameter activity
failed");
break;
case 0x08:
cprintf("STATUS: Direct memory access (DMA)
overrun");
break;
case 0x09:
cprintf("STATUS: Attempt to perform DMA across
64K boundary");
break;
case 0x0A:
cprintf("STATUS: Bad sector detected");
break;
case 0x0B:
cprintf("STATUS: Bad track detected");
break;
case 0x0C:
cprintf("STATUS: Media type not found");
break;
case 0x0D:
cprintf("STATUS: Invalid number of sectors on
format (hard disk)");
break;
case 0x0E:
cprintf("STATUS: Control data address mark
detected (hard disk)");
break;
case 0x0F:
cprintf("STATUS: DMA arbitration level out of
range (hard disk)");
break;
case 0x10:
cprintf("STATUS: Bad CRC/ECC on disk read");
break;
case 0x11:
cprintf("STATUS: CRC/ECC corrected data error");
break;
case 0x20:
cprintf("STATUS: Controller has failed");
break;
case 0x31:
cprintf("STATUS: No media in drive (IBM/MS INT 13H
extensions)");
break;
case 0x32:
cprintf("STATUS: Incorrect drive type stored in
CMOS (Compaq)");
break;
case 0x40:
cprintf("STATUS: Seek operation failed");
break;
case 0x80:
cprintf("STATUS: Attachment failed to respond
(Disk Timed-out)");
break;
case 0xAA:
cprintf("STATUS: Drive not ready (hard disk
only)");
break;
case 0xB0:
cprintf("STATUS: Volume not locked in drive (INT
13H extensions)");
break;
case 0xB1:
cprintf("STATUS: Volume locked in drive (INT 13H extensions)");
break;
case 0xB2:
cprintf("STATUS: Volume not removable (INT 13H
extensions)");
break;
case 0xB3:
cprintf("STATUS: Volume in use (INT 13H
extensions)");
break;
case 0xB4:
cprintf("STATUS: Lock count exceeded (INT 13H
extensions)");
break;
case 0xB5:
cprintf("STATUS: Valid eject request failed (INT
13H extensions)");
break;
case 0xBB:
cprintf("STATUS: Undefined error occurred (hard
disk only)");
break;
case 0xCC:
cprintf("STATUS: Write fault occurred");
break;
case 0xE0:
cprintf("STATUS: Status register error");
break;
case 0xFF:
cprintf("STATUS: Sense operation failed");
break;
default: cprintf("STATUS: UNKNOWN Status CODE");
}
printf("\nCurrent position= Track:%d Head:%d Sector:%d \n",
track,head,sector);
}
gotoxy(10,24);printf("Scanning Completed!! Press Any Key TO
Exit..");
getch();
}
В программе показан пример использования функций int86 и int86x. В этой программе функция int86 инициализирует диск путем сброса дисковой системы с использованием функции 00H из INT 13H. Функция int86x проверяет каждый сектор дискеты (1,44 Мб, 3½ дискеты) с обеих сторон, от 0 до 79 дорожек (всего 80 дорожек), используя функцию 04H из INT 13H.
Функция разделения
Эта функция определена в dos.h. Эта функция считывает сегментные регистры. Объявление функции выглядит следующим образом:
void segread(struct SREGS *segp);
где segread помещает текущие значения сегментных регистров в структуру *segp. Функция ничего не возвращает, и вызов предназначен для использования с intdosx и int86x. давайте посмотрим пример
#include <stdio.h>
#include <dos.h>
void main()
{
struct SREGS segs;
segread(&segs);
printf("Current segment register settings\n\n");
printf("CS: %X DS: %X\n", segs.cs, segs.ds);
printf("ES: %X SS: %X\n", segs.es, segs.ss);
getch();
}
И вывод программы будет примерно таким:
Current segment register settings
CS: EED DS: 10BA
ES: 10BA SS: 10BA
Функции intdos и intdosx
Эти функции определены в dos.h. Это общие интерфейсы прерываний DOS. Функция intdos вызывает сервисные регистры MS-DOS, затем DX и AL, где функция intdosx вызывает сервис MS-DOS со значениями сегментных регистров.
Объявление функции intdos выглядит следующим образом:
int intdos(объединение REGS *inregs, объединение REGS *outregs);
и объявление функции intdosx выглядит так:
int intdosx(union REGS *inregs, union REGS *outregs,
struct SREGS *segregs);
Функции intdos и intdosx выполняют прерывание DOS 0x21 для вызова указанной функции DOS. Значение inregs->h.ah определяет вызываемую функцию DOS. Функция intdosx также копирует значения segregs ->ds и segregs ->es в соответствующие регистры перед вызовом функции DOS, а затем восстанавливает DS.
Эта функция функций позволяет программам, использующим дальние указатели или модель памяти с большими данными, указывать, какой сегмент должен использоваться для выполнения функции. С помощью функции intdosx вы можете вызвать функцию DOS, которая принимает значение DS, отличное от сегмента данных по умолчанию, и/или принимает аргумент в ES.
Обе функции возвращают значение AX после завершения вызова функции DOS, и если установлен флаг переноса (outregs -> x.cflag != 0), это означает, что произошла ошибка.
После прерывания 0x21 функции копируют текущие значения регистров в outregs, состояние флага переноса в поле x.cflag в outregs и значение регистра флагов 8086 в поле x.flags в outregs. И inregs, и outregs могут указывать на одну и ту же структуру. Давайте посмотрим на примеры этих функций.
Пример использования функции intdos приведен ниже. Эта программа получает выбранную информацию о флоппи-дисководе (1,44 Мб, 3½ дюймовый флоппи-диск). Эта программа предоставляет информацию о размещении гибкого диска.
/* Получение информации о выделении диска для использования диска */
#include <dos.h> /* for intdos() and union REGS */
#include <stdio.h> /* for printf() */
union REGS inregs, outregs;
void main()
{
inregs.h.ah = 0x36; /* get disk free space
function number */
inregs.h.dl = 0x01; /* drive A: */
intdos(&inregs, &outregs);
printf("%d sectors/cluster,\n%d clusters,\n%d bytes/sector,
\n%d total clusters",
outregs.x.ax,outregs.x.bx,
outregs.x.cx, outregs.x.dx);
getch();
}
И вывод программы будет таким:
1 sectors/cluster,
1933 clusters,
512 bytes/sector,
2843 total clusters
Теперь давайте посмотрим на пример функции intdosx. В следующем примере показано использование функции intdosx. Программа выводит строку на стандартный вывод.
/* Программа для вывода 'строки' в стандарт
выход. */
#include <dos.h>
union REGS inregs, outregs;
struct SREGS segregs;
char far *string = "this string is not in the
default data segment$";
void main()
{
inregs.h.ah = 0x09; /* function number */
inregs.x.dx = FP_OFF(string);/*DS:DX is far
address of 'string */
segregs.ds = FP_SEG(string);
intdosx(&inregs, &outregs, &segregs);
getch();
}
И вывод программы будет следующим:
this string is not in the default data segment |
Здесь мы печатаем данную строку с помощью функции intdosx, с помощью функции 09H из INT 21H. Следует всегда помнить, что данная строка всегда должна заканчиваться символом “$”.
Как узнать номер физического жесткого диска
Номер физического жесткого диска очень важен и должен быть указан точно. Недопустимая спецификация диска может привести к серьезной потере данных. Мы должны быть уверены в номере диска во время восстановления данных или программирования устранения неполадок диска. Как узнать номер диска любого диска при различном расположении дисков, можно оценить на примерах, приведенных далее.
Согласно наиболее распространенному мифу, номера физических дисков предоставляются в соответствии со статусом подключения диска, однако в некоторых или особых случаях это может зависеть от процедуры загрузки вашей операционной системы или настройки загрузки.
Здесь была дана наиболее общая идея для Номера физического диска, предоставляемого BIOS, но даже в этом случае вы должны подтвердить это с помощью любого инструмента редактирования диска или с помощью программ, приведенных в следующих главах. о конфигурации диска. Убедившись, вы должны принять любое решение о запуске таких программ, которые могут испортить или повредить данные, если они используются нелегально или по незнанию.
Как правило, если к системе подключены два диска, один из которых является основным ведущим, а другой — второстепенным, первое предпочтение будет отдано основному ведущему (а затем основному ведомому, если он доступен), а затем вторичному ведущему ( а затем вторичному подчиненному устройству, если оно доступно, и т. д.), и физический номер будет присвоен в соответствии с их предпочтениями.
Предположим, что ваша система одновременно поддерживает не более четырех жестких дисков. Все четыре жестких диска могут быть подключены, как указано Далее:
Primary Master |
Primary Slave |
Secondary Master |
Secondary Slave |
Теперь давайте рассмотрим некоторые случаи для количества физических дисков. Здесь я предполагаю, что вы подключили диски с правильными настройками перемычек, как указано производителем диска, и с правильными настройками Master–Slave:
- Если к системе подключены все четыре жестких диска: если к системе подключены все четыре диска, номера физических дисков будут следующими:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 83H. In this case the Hard Disk is called the Fourth Hard Disk. |
- Если к системе подключено три жестких диска: если к системе подключено три жестких диска, номера физических дисков будут соответствовать предпочтениям их подключения. Следующие примеры представляют некоторые из механизмов:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Secondary Slave |
Disk Not Present |
------------------- |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk Not Present |
------------------- |
Primary Slave |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 82H. In this case the Hard Disk is called the Third Hard Disk. |
- Если к системе подключены два жестких диска: Аналогичным образом, если к системе подключены два жестких диска, номера физических дисков будут соответствовать их предпочтениям подключения. Следующий пример иллюстрирует это:
Primary/Secondary (Master/Slave) |
Status |
Physical Drive Number and Description |
Primary Master |
Disk is Present |
Physical Drive Number will be 80H. In this case the Hard Disk is called the First Hard Disk. |
Primary Slave |
Disk Not Present |
------------------- |
Secondary Master |
Disk Not Present |
------------------- |
Secondary Slave |
Disk is Present |
Physical Drive Number will be 81H. In this case the Hard Disk is called the Second Hard Disk. |
- Если к системе подключен один жесткий диск: не нужно думать, что если доступен только один диск, номер физического диска будет 80H.
Прерывание 13H (INT 13H), функции драйвера диска ROM BIOS
Здесь приведено описание функций INT 13H. Эти функции следует изучать с осторожностью, так как неправильное использование этих функций или использование по невнимательности или недостатку знаний может привести к большой потере данных или многим другим проблемам. Однако при правильном и правильном использовании эти функции помогают свести к минимуму кодирование вашей программы и сделать ваше программирование простым и легким.
INT 13H (0x13)
Function 00H (0x00) Reset disk system
Call with AH = 00H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function is successful
Carry flag = clear
AH = 00H
If function is unsuccessful
Carry flag = set
AH = status
Comments:
Сброс контроллера диска, повторная калибровка подключенных дисков. Рычаг чтения/записи перемещается в цилиндр 0 и готовится к дисковому вводу-выводу.
Эта функция должна вызываться после неудачного запроса на чтение, запись, проверку или форматирование гибкого диска перед повторной попыткой операции. Если функция вызывается с фиксированным дисководом (т. е. при выборе DL>=80H), сбрасываются контроллер гибких дисков, а затем и контроллер фиксированных дисков.
INT 13H (0x13)
Function 01H (0x01) Get disk system status
Call with: AH = 01H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: AH = 00H
AL = status of previous disk operation
(See the table given before for error
and status codes description).
Comments:
Возвращает статус последней операции с диском
INT 13H (0x13)
Function 02H (0x02) Read sector
Call with: AH = 02H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES:BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция считывает один или несколько секторов с диска в память. На фиксированных дисках старшие 2 бита 10-битного номера цилиндра помещаются в старшие 2 бита регистра CL.
INT 13H (0x13)
Function 03H (0x03) Write sector
Call with: AH = 03H
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AH = 00H
AL = number of sector transferred
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция записывает один или несколько секторов из памяти на диск. На фиксированных дисках старшие 2 бита 10-битного номера цилиндра помещаются в старшие 2 бита регистра CL.
INT 13H (0x13)
Function 04H (0x04) >> Verify sector
Call with: AH = 04H
AL = number of sectors
CH = cylinder
CL = sector
DH = drive
00H-7FH floppy disk
80H-FFH fixed drive
ES: BX = segment: offset of buffer
Returns: If function is successful
Carry flag = clear
AH = 00H
AL = number of sectors verified
If function is unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция проверяет поля адреса одного или нескольких секторов. С помощью этой операции данные не передаются в память или из памяти. На фиксированных дисках старшие 2 бита 10-битного номера цилиндра замещаются старшими 2 битами регистра CL.
Эту функцию можно использовать для проверки наличия читаемого носителя в дисководе для гибких дисков. Запрашивающая программа должна сбросить систему гибких дисков (INT 13H, функция 00H) и повторить операцию три раза, прежде чем предположить, что читаемая дискета отсутствует. Рекомендуется в большинстве операций инициализации дискет.
INT 13H (0x13)
Function 05H (0x05) >> Format track
Call with: AH = 05H
AL = interleave (PC/XT fixed disks)
CH = cylinder
DH = head
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
ES: BX = segment: offset of address field list
(Except PC/XT fixed disk)
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
Комментарии:
Инициализировать сектор диска и адресные поля дорожек на указанной дорожке. На гибких дисках список адресных полей состоит из серии 4-байтовых записей, по одной записи на сектор. Формат приведен в следующей таблице.
На фиксированных дисках старшие 2 бита 10-битного номера цилиндра помещаются в старшие 2 бита регистра CL.
Byte |
Contents |
0 |
Cylinder |
1 |
Head |
2 |
Sector |
3
|
Sector-size code
Value |
Description |
00H |
128 Byte per sector |
01H |
256 Byte per sector |
02H |
512 Byte per sector |
03H |
1024 Byte per sector |
|
INT 13H (0x13)
Function 06H (0x06) >> Format bad track
Call with: AH = 06H
AL = interleave
CH = cylinder
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция определена только для жестких дисков PC/XT. Он инициализирует дорожку, записывая поля адреса диска и сектора данных и устанавливая флаги сбойных секторов.
INT 13H (0x13)
Function 07H (0x07) >> Format drive
Call with: AH = 07H
AL = interleave
CH = cylinder
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see the status table given
earlier)
Комментарии:
Эта функция определена только для жестких дисков PC/XT. Он форматирует весь диск, записывая поля адреса диска и сектора данных, начиная с указанного цилиндра.
INT 13H (0x13)
Function 08H (0x08) >> Get drive parameters
Call with: AH = 08H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
BL = drive type (PC/AT and PS/2 floppy
disk)
Value |
Description |
01H |
360KB, 40 track, 5.25” |
02H |
1.2MB, 80 track, 5.25” |
03H |
720KB, 80 track, 3.5” |
04H |
1.44MB, 80 track, 3.5” |
CH = low 8 bits of maximum cylinder
number
CL = bits 6-7 high order 2 bits of maximum
cylinder number bits 0-5 maximum
sector number
DH = maximum head number
DL = number of drives
ES: DI = segment: offset of disk drive
parameter table
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция возвращает различные параметры для указанного диска. Значение, возвращаемое в регистре DL, отражает истинное количество физических дисков, подключенных к адаптеру для запрошенного диска.
INT 13H (0x13)
Function 09H (0x09) >> Initialize fixed disk characteristics
Call with: AH = 09H
DL = drive
80H-FFH fixed disk
On the PC/XT Vector for INT 41H
must point to disk parameter block or, on the PC/AT and PS/2
Vector for INT 41H must point to disk
parameter block for drive 0
Vector for INT 46H must point to disk
parameter block for drive 1
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция инициализирует контроллер фиксированного диска для последующих операций ввода-вывода, используя значения, найденные в блоке (блоках) параметров диска ROM BIOS. Функция поддерживается только на фиксированном диске. Формат блока параметров для фиксированных дисков PC и PC/XT следующий:
Byte(s) |
Contents |
00H-01H |
Maximum number of cylinders |
02H |
Maximum number of heads |
03H-04H |
Starting reduced write current cylinder |
05H-06H |
Starting write pre compensation cylinder |
07H |
Maximum ECC burst length |
08H
|
Drive option
Bit(s) |
Significance (if set) |
0 – 2 |
drive option |
3 – 5 |
reserved (0) |
6 |
disable ECC entries |
7 |
disable disk-access retries |
|
09H |
Standard time-out value |
0AH |
Time-out value for format drive |
0BH |
Time-out value for check drive |
0CH-0FH |
Reserved |
Формат блока параметров для жестких дисков PC/AT и PS/2 следующий:
Byte(s) |
Contents |
00H_01H |
maximum number of cylinders |
02H |
maximum number of heads |
03H-04H |
Reserved |
05H-06H |
starting write pre compensation cylinder |
07H |
maximum ECC burst length |
08H |
Drive options
Bit(s) |
Significance (if set) |
0 – 2 |
not used |
3 |
more than 8 heads |
4 |
not used |
5 |
manufacturer’s defect map present at
maximum cylinder +1 |
6 – 8 |
nonzero (10, 01,or 11) if retries disabled |
|
09H-0BH |
Reserved |
0CH-0DH |
landing zone cylinder |
0EH |
sector per track |
0FH |
Reserved |
INT 13H (0x13)
Function 0A H (0x0A or 10) >> Read sector long
Call with: AH = 0AH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция считывает сектор или секторы с диска в память вместе с 4-байтовым кодом исправления ошибок (ECC) для каждого сектора. В отличие от обычной функции чтения сектора (INT 13H (0x13) Function 02H), ошибки ECC не исправляются автоматически. Многосекторные передачи прекращаются после любого сектора с ошибкой чтения.
Эта функция поддерживается только на фиксированных дисках. Старшие 2 бита 10-битного номера цилиндра помещаются в старшие 2 бита регистра CL.
INT 13H (0x13)
Function 0BH (0x0B or 11) >> Write sector long
Call with:AH = 0BH
AL = number of sectors
CH = cylinder
CL = sector
DH = head
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
AH = 00H
AL = number of sectors transferred
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция записывает сектор(ы) из памяти на диск. За данными каждого сектора должен следовать его 4-байтовый код ECC. Старшие 2 бита 10-битного номера цилиндра помещаются в старшие 2 бита регистра CL. Эта функция поддерживается только на фиксированных дисках.
INT 13H (0x13)
Function 0CH (0x0C or 12) >> Seek
Call with:AH = 0CH
CH = lower 8 bits of cylinder
CL = upper 2 bits of cylinder in bits 6-7
DH = head
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция перемещает головки чтения/записи диска на указанный цилиндр без передачи каких-либо данных. Старшие 2 бита номера цилиндра помещаются в старшие 2 бита регистра CL. Эта функция поддерживается только на фиксированных дисках.
INT 13H (0x13)
Function 0DH (0x0D or 13) >> Reset fixed disk system
Call with:AH = 0DH
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
Комментарии:
Эта функция сбрасывает контроллер фиксированного диска, повторно калибрует подключенные диски, перемещает рычаг чтения/записи на цилиндр 0 и подготавливает к последующему вводу-выводу диска.
INT 13H (0x13)
Function 0EH (0x0E or 14) >> Read sector buffer
Call with:AH = 0EH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция передает содержимое внутреннего буфера секторов адаптера фиксированного диска в системную память. Данные с физического диска не считываются.
INT 13H (0x13)
Function 0FH (0x0F or 15) >> Write sector buffer
Call with:AH = 0FH
ES: BX = segment: offset of buffer
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция передает данные из системной памяти во внутренний секторный буфер фиксированного адаптера. Данные не записываются на физический диск. Эту функцию следует вызывать для инициализации содержимого буфера секторов перед форматированием накопителя с помощью функции INT 13H 05H.
INT 13H (0x13)
Function 10H (0x10 or 16) >> Get drive status
Call with:AH = 10H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция проверяет, работает ли указанный фиксированный диск, и возвращает состояние диска. Эта функция поддерживается только на фиксированных дисках.
INT 13H (0x13)
Function 11H (0x11 or 17) >> Recalibrate drive
Call with:AH =11H
DL = drive
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция вызывает повторную калибровку адаптера фиксированного диска для указанного диска, устанавливая рычаг чтения/записи на цилиндр 0, и возвращает статус диска. Эта функция поддерживается только на фиксированных дисках.
INT 13H (0x13)
Function 12H (0x12 or 18) >> Controller RAM
diagnostic
Call with:AH = 12H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция заставляет адаптер фиксированного диска выполнять встроенный диагностический тест своего внутреннего буфера сектора, указывая, прошел ли тест возвращаемый статус.
INT 13H (0x13)
Function 13H (0x13 or 19) >> Controller drive diagnostic
Call with:AH = 13H
Returns:If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция заставляет фиксированный адаптер запускать внутренние диагностические тесты подключенного диска, указывая, был ли тест пройден возвращенным статусом.
INT 13H (0x13)
Function 14H (0x14 or 20) >> Controller internal
diagnostic
Call with:AH = 14H
Returns:If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция заставляет адаптер фиксированного диска выполнять встроенную диагностическую самопроверку, указывающую, пройден ли тест возвращаемым статусом.
INT 13H (0x13)
Function 15H (0x15 or 21) >> Get disk type
Call with:AH = 15H
DL = drive
00H-7FH floppy disk
80H-FFH fixed disk
Returns:If function successful
Carry flag = clear
AH = drive type code
00H if no drive present
01H if floppy disk drive without change-line support
02H if floppy disk drive with change-line support
03H if fixed disk
|
And, if fixed disk (AH =03H)
CX: DX = number of 512-byte sectors
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция возвращает код, указывающий тип гибкого или фиксированного диска, на который ссылается указанный код привода.
INT 13H (0x13)
Function 16H (0x16 or 22) >> Get disk change
status
Call with: AH = 16H
DL = drive
00H-7FH floppy disk
Returns:If change line inactive and disk has not been changed
Carry flag = clear
AH = 00H
If change line active and disk may have been changed
Carry flag = set
AH = 06H
Комментарии:
Эта функция возвращает статус строки изменения, указывающий, был ли заменен диск в дисководе с момента последнего обращения к диску. Если эта функция возвращается с установленным флагом переноса, диск не обязательно был заменен, и строку замены можно активировать, просто разблокировав и заблокировав дверцу дисковода, не извлекая дискету.
INT 13H (0x13)
Function 17H (0x17 or 23) >> Set disk type
Call with: AH = 17H
AL = floppy disk type code
Value |
Description |
00H |
Not used |
01H |
320/360 KB floppy disk in 360 KB drive |
02H |
320/360 KB floppy disk in 1.2 MB drive |
03H |
1.2 MB floppy disk in 1.2 MB drive |
04H |
720 KB floppy disk in 720 KB drive |
SL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция выбирает тип гибкого диска для указанного дисковода.
INT 13H (0x13)
Function 18H (0x18 or 24) >> Set media type for format
Call with: AH = 18H
CH = number of cylinders
CL = sector per track
DL = drive
00H-7FH floppy disk
Returns: If function successful
Carry flag = clear
AH = 00H
ES: DI = segment: offset of disk
parameter table for media type
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция выбирает характеристики носителя для указанного дисковода, поэтому в дисководе должна быть дискета.
INT 13H (0x13)
Function 19H (0x19 or 25) >> Park heads
Call with: AH = 19H
DL = drive
80H-FFH fixed disk
Returns: If function successful
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status
Комментарии:
Эта функция перемещает рычаг чтения/записи на дорожку, которая не используется для хранения данных, чтобы данные не были повреждены при выключении накопителя.
INT 13H (0x13)
Function 1AH (0x1A or 26) >> Format ESDI drive
Call with: AH = 1AH
AL = Relative Block Address (RBA)
defect table count
0, if no RBA table
>0, if RBA table used
CL = format modifier bits
Bit(s) |
Significance (if set) |
0 |
Ignore primary defect map |
1 |
Ignore secondary defect map |
2 |
Update secondary defect map |
3 |
Perform extended surface analysis |
4 |
Generate periodic interrupt |
5-7 |
Reserved (must be 0) |
DL = drive
80H-FFH fixed disk
ES: BX = segment: offset of RBA table
Returns: If function successfu
Carry flag = clear
AH = 00H
If function unsuccessful
Carry flag = set
AH = status (see INT 13H Function 01H)
Комментарии:
Эта функция инициализирует сектор диска и отслеживает поля адреса на диске, подключенном к адаптеру фиксированного диска ESDI.
Операция этой функции называется низкоуровневым форматированием и подготавливает диск к физическим операциям чтения/записи на уровне секторов. Затем диск необходимо разбить на разделы с помощью команды FDISK, а затем выполнить форматирование высокого уровня с помощью команды FORMAT для установки файловой системы.
Страница изменена: 16/03/2022