Глава – 9
Работа с большими жесткими дисками
Работа с большими жесткими дисками
В предыдущей главе мы обсудили функции BIOS-Disk и использование прерываний для доступа к физическим носителям жестких дисков. Мы использовали функции INT 13H для доступа к жестким дискам.
Интерфейс INT 13H поддерживает множество различных команд, таких как чтение, запись, форматирование, проверка и т. д., которые можно передать в BIOS, который затем передает их на жесткий диск. Поскольку он уже давно используется в DOS, INT13H уже много лет является стандартом.
INT 13H выделяет 24 бита для спецификации геометрии диска и требует, чтобы вызывающая программа знала конкретные параметры жесткого диска и предоставляла подпрограммам точную адресацию головки, цилиндра и сектора, чтобы разрешить доступ к диску.
В BIOS используется геометрия жесткого диска, заданная в программе настройки BIOS. 24 бита, выделенные интерфейсом INT 13H для спецификации геометрии привода, разбиты следующим образом:
- 10 бит для номера цилиндра. Таким образом, максимальный предел общего количества цилиндров может составлять до 1024 цилиндров.
- 8 бит для номера головы. Таким образом, максимальный предел общего количества голов составляет до 256.
- 6 бит для номера сектора. Таким образом, максимальное количество секторов может достигать 63.
Таким образом, максимальное количество секторов, поддерживаемых этим подходом, может составлять до 1024 * 256 * 63 = 16515072.
Это означает, что интерфейс INT13H может поддерживать диски, содержащие примерно до 16,5 миллионов секторов, что при 512 байтах на сектор дает максимальный размер 8,46 ГБ. Именно это я и хочу объяснить. Таким образом, используя все эти функции или INT 13H, мы можем получить доступ только к дискам до 8,46 ГБ.
Вот почему в последние годы ограничения этого старого интерфейса заставили отказаться от него в пользу нового способа адресации жестких дисков, как описано далее в этой главе.
Прежде всего, позвольте мне рассказать вам историю!
Одиннадцать лет назад, когда я учился в седьмом классе, в школе я услышал о жестком диске емкостью 42 МБ, возможно, это был WDA-L42 фирмы IBM. В то время мне и моим друзьям было очень сложно представить такую большую емкость жесткого диска.
Методология INT 13H была разработана около двадцати лет назад. Теперь вы можете понять, что жесткий диск объемом 8 ГБ был намного больше, чтобы поместиться даже в мечтах в то время. Но сегодня, если мы говорим о жестком диске объемом 8 ГБ любому пользователю персонального компьютера, он может не захотеть его использовать, говоря, что у него мало места для хранения.
Вот почему интерфейс INT 13H окончательно исчерпал свою полезность в современных системах. INT 13H использовал 24 бита для выделения геометрии диска и, к сожалению, не было возможности расширить существующий интерфейс INT 13H BIOS, потому что, если бы это было сделано, многие старые аппаратные и программные средства перестали бы работать, и вы можете понять, что сегодняшний компьютерный рынок никогда не вынесет таких больших изменений, когда миллионы устаревших программных и аппаратных продуктов перестанут работать.
С учетом этого условия INT 13H был заменен более новым интерфейсом, называемым расширениями INT 13H. Однако INT 13H по-прежнему может использоваться DOS и некоторыми другими старыми операционными системами, а также для других целей совместимости.
Новый интерфейс INT 13H использует для адресации 64 бита вместо 24 и допускает максимальный размер жесткого диска 9,4 * 1021 байт, что на самом деле составляет 9,4 триллиона гигабайт или 9400000000000 гигабайт. Я надеюсь, что теперь мы немного расслабились, пока этот лимит не будет нарушен.
Некоторые важные функции расширения для прерывания 13H описаны далее. Вы можете использовать эти функции в программировании так же, как вы использовали функции INT 13H. Это также является причиной того, что эти функции называются расширениями INT 13H.
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:
Эта функция используется для получения производственного заголовка фиксированного диска. Первый считанный сектор содержит заголовок изготовления с количеством записей о дефектах и начало карты дефектов; остальные сектора содержат остаток карты дефектов. Формат производственного заголовка (формат записи карты дефектов) можно найти в Техническом справочнике по фиксированным дискам IBM 70MB, 115MB.
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:
Эта функция используется для получения указателя на блок информации о диске SCSI. Это также устанавливает несбрасываемый флаг, который предотвращает отображение некоторых сообщений контроллера.
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:
Эта функция используется для получения бесплатного контроллера Ram. ES:BX указывает на первый байт свободной оперативной памяти на контроллере, доступной для других целей. ES содержит сегмент, в котором находится контроллер. Два отображаемых на память порта ввода/вывода контроллера имеют смещения 1C00H и 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:
Эта функция используется для получения статуса завершения команды. В случае успешного выполнения функции флаг переноса сбрасывается, а в случае неудачи устанавливается флаг переноса.
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:
Эта функция используется для получения статуса устройства. В случае успешного выполнения функции флаг переноса сбрасывается, а в случае неудачи устанавливается флаг переноса.
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:
Эта функция используется для получения конфигурации устройства для диска. Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 01H, в противном случае флаг переноса установлен, и регистр AH возвращает состояние. В следующей таблице показан формат блока состояния конфигурации привода ESDI:
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:
Эта функция используется для получения конфигурации адаптера. Если функция выполнена успешно, флаг переноса сброшен, а AH равен 01H, если установлен флаг неудачного переноса, и AH возвращает статус.
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:
Эта функция используется для получения информации о POS. Если функция выполнена успешно, флаг переноса сброшен, а AH равен 01H, если установлен флаг неудачного переноса, и AH возвращает статус.
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:
Эта функция преобразует RBA (относительный адрес блока) в ABA (абсолютный адрес блока). Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 01H, в противном случае флаг переноса установлен, и AH возвращает статус.
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:
Эта функция используется для получения текущего формата мультимедиа. Значения для типа дискеты Compaq/ATAPI приведены в следующей таблице:
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:
Функция используется для чтения нескольких секторов диска с использованием режима нескольких блоков, который генерирует прерывание только после окончания передачи группы секторов, а не после каждого сектора.
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:
Функция используется для записи нескольких секторов диска с использованием режима множественных блоков, который генерирует прерывание только после окончания передачи группы секторов, а не после каждого сектора.
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:
Эта функция включает и/или отключает кэширование всех дисков. Если функция выполнена успешно, регистр AX равен 0000H, в противном случае возвращается статус.
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:
Эта функция используется для установки регистра функций контроллера. Если функция выполнена успешно, флаг переноса очищается, а в случае неудачи устанавливается флаг переноса, а регистр AH возвращает состояние
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:
Эта функция используется для установки множественного режима передачи. Если вы хотите отключить режим множественной передачи, установите количество секторов равным 0. Максимальное значение размера блока (например, 2, 4, 6, 8 и 16 и т. д.) зависит от типа жесткого диска.
Значение хранится в байте 15H таблицы параметров жесткого диска, созданной с помощью POST (самопроверка при включении). Байт по адресу 0040H:0074H устанавливается в рабочее состояние. Значения для номера функции жесткого диска PS/1 перечислены в следующей таблице:
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:
Эта функция используется для установки секторов. Если функция выполнена успешно, регистр AX равен 0000H, иначе AX возвращает статус.
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:
Эта функция используется для идентификации привода. Байт по адресу 0040h:0074h устанавливается в состояние операции. IBM официально классифицирует эту функцию как необязательную. Битовые поля для общей конфигурации привода приведены в следующей таблице:
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)
|
Описание информационного блока «Формат диска», приведенное в спецификации ATA (приложение AT), приведено в следующей таблице:
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:
Эта функция используется для установки интервала промывки. Если функция выполнена успешно, AH равен 0000H, иначе AH возвращает статус.
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 возвращает статус от 0001H до 00FFH для вектора прерывания, который был перехвачен другим 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:
Если он установлен, регистр AX имеет значение 0000H, а BX возвращает ненулевое значение.
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:
Вызов функции с AL = 00H для отключения и с AL = 01H для включения.
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:
Эта функция используется для установки размера буфера. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус. Функция вызова с AL = 00H для отключения и AL = 01H для включения звуков доступа к диску
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:
Эта функция включает или отключает отложенную запись для всех дисков. Используйте AH=38H для замены одного диска. Используйте AL = 00H для отключения и 01H для включения.
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:
Эта функция включает или отключает упреждающее чтение для всех дисков. Используйте AL = 00H для отключения и AL = 01H для включения. Используйте AH=37H для замены одного диска.
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:
Эта функция используется для установки счетчика промывки. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для получения различной информации о системе, указанной в AL. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус. AX = 8000H указывает на недопустимый спецификатор информации. Информационные номера, которые должны быть указаны для AL, перечислены в следующей таблице:
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:
Эта функция используется для резервирования памяти для приложений. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для включения кэширования для определенного диска. Например, вызовите Function с AL = 00H для A: и так далее. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для отключения кэширования для определенного диска. Например, вызовите Function с AL = 00H для A: и так далее. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для вызова функций блокировки/разблокировки секторов, указанных в AL. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус. Различные номера функций, вызываемых с помощью AL, приведены в следующей таблице:
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:
Эта функция используется для установки размера пула блокировок. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для установки размера буфера трассировки. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус. Эта функция обычно вызывается функцией 24H из INT 13H с 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:
Эта функция используется для установки буферизованных операций чтения для конкретного диска. Если AL = 00H, состояние включено, иначе отключено. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для установки буферизованной записи для конкретного диска. Если AL = 00H, состояние включено, иначе отключено. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для установки размера буфера чтения для определенного диска, например DL = 00H для A: и т.д. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для установки размера буфера записи для определенного диска, например, DL = 00H для A: и т.д. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для включения/отключения промывки цилиндра для конкретного привода, например, DL = 00H для A: и т.д. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус. Если регистр AL установлен на 01H, состояние включено, иначе отключено.
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:
Эта функция используется для установки бонуса одного сектора. Если функция выполнена успешно, AX равен 0000H, в случае неудачи AX возвращает статус.
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:
Эта функция используется для установки порога бонуса. Если функция выполнена успешно, AX равен 0000H, если неудачно AX возвращает статус
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:
Эта функция проверяет, установлены ли и поддерживаются ли расширения IBM/MS INT 13H. Значения для основных версий расширений приведены в следующей таблице:
Value
|
Major Version of Extension
|
01H
|
1.x
|
20H
|
2.0 / EDD-1.0
|
21H
|
2.1 / EDD-1.1
|
30H
|
EDD-3.0
|
Битовые поля для IBM/MS INT 13H Extensions API растрового изображения поддержки приведены в следующей таблице:
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:
Эта функция является расширением функции чтения с диска. Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 00H, в противном случае флаг переноса установлен, и AH возвращает код ошибки. В поле счетчика блоков пакета адресов дисков установлено количество успешно переданных блоков. Формат пакета адресов дисков приведен ниже:
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:
Эта функция является расширением функции записи на диск. Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 00H, в противном случае флаг переноса установлен, и AH возвращает код ошибки. Поле счетчика блоков пакета адреса диска успешно установлено на количество блоков. Информация о флагах записи для разных версий приведена в следующей таблице:
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:
Эта функция является расширением функции проверки секторов. Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 00H, в противном случае флаг переноса установлен, и AH возвращает код ошибки. Поле счетчика блоков пакета адреса диска успешно установлено на количество блоков
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:
Эта функция используется для блокировки/разблокировки диска. Эта функция должна поддерживаться всеми съемными дисками с номерами 80H и выше. На диск можно установить до 255 замков, и носитель не будет физически разблокирован, пока все блокировки не будут удалены.
Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 00H, в противном случае флаг переноса установлен, и AH возвращает код ошибки.
Номера операций для различных операций блокировки/разблокировки диска приведены в следующей таблице:
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:
Эта функция предназначена для извлечения носителя. Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 00H, в противном случае флаг переноса установлен, и AH возвращает код ошибки.
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:
Эта функция является расширением функции поиска. Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 00H, в противном случае флаг переноса установлен, и AH возвращает код ошибки. Поле счетчика блоков пакета адреса диска успешно установлено на количество блоков.
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:
Эта функция используется для получения параметров привода. Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 00H с заполненным буфером DS:SI, в противном случае устанавливается флаг переноса, и AH возвращает код ошибки.
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:
Эта функция является расширением функции смены носителя. Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 00H, в противном случае флаг переноса установлен, и AH возвращает код ошибки.
Основное отличие этой функции от функции AH = 16H от INT 13H заключается в том, что мы можем указать любой номер дисковода, где функция 16H допускает только номера дисков от 00H до 7FH гибких дисков.
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:
Эта функция используется для запуска эмуляции диска. Если функция выполнена успешно, флаг переноса сброшен, в противном случае флаг переноса установлен, а регистр AX возвращает код состояния, и привод не будет находиться в режиме эмуляции.
Формат пакета спецификации загрузочного компакт-диска приведен в следующей таблице:
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)
|
Битовые поля для типа загрузочного носителя Bootable CD-ROM приведены в следующей таблице:
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:
Эта функция используется для завершения эмуляции диска. Если вы хотите прекратить все эмуляции, вызовите функцию с DL = 7FH. Если функция выполнена успешно, флаг переноса сброшен, в противном случае устанавливается флаг переноса, а регистр AX возвращает код состояния, и привод остается в режиме эмуляции.
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:
Функция используется для получения статуса. Если функция выполнена успешно, флаг переноса сброшен, в противном случае флаг переноса установлен, и регистр AX возвращает код состояния.
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:
Эта функция используется для запуска эмуляции диска и загрузки системы. Если функция выполнена успешно, больше ничего не возвращается, устанавливается флаг переноса, а регистр AX возвращает код состояния.
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:
Эта функция используется для возврата загрузочного каталога. Если функция выполнена успешно, флаг переноса сброшен, в противном случае устанавливается флаг переноса, и регистр AX возвращает код состояния. Формат загрузочного компакт-диска "Получить загрузочный каталог" пакет команд приведен в следующей таблице:
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:
Эта функция используется для установки конфигурации оборудования. Номера функций для AL для вызова этой функции приведены в следующей таблице:
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 и PIO являются взаимоисключающими, поэтому выбор DMA отключает PIO либо для указанного устройства, либо для всех устройств на этом контроллере, а выбор PIO отключает DMA.
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:
Эта функция используется для отправки пакетных команд. Если функция выполнена успешно, флаг переноса сброшен, а регистр AH равен 00H, в противном случае флаг переноса установлен, и AH возвращает код ошибки. Командный пакет Format of Enhanced Disk Drive Spec v3.0 приведен в следующей таблице:
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:
Эта функция используется для отправки запроса. BIOS ST01/ST02 не возвращает индикацию об успешном или неудачном завершении функции, поэтому следует считать, что все команды выполнены успешно.
В BIOS ST01/ST02 всегда сопоставляются диски после предыдущих дисков BIOS без изменения количества дисков BIOS по адресу 0040H:0075H. Эта команда идентична команде запроса SCSI.
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:
Эта функция используется для установки DTQ (определителя типа устройства). Функция ничего не возвращает. Битовые поля для байта DTQ показаны в следующей таблице:
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:
Функция используется для возврата идентификации привода(ов).
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:
Функция используется для парковки головок диска. Он использовался в старых жестких дисках, однако современным жестким дискам не нужна никакая внешняя программа для парковки головок.
Подфункция 00H паркует головки (команда SCSI Stop), а подфункция 01H снимает парковку головок (команда SCSI Start) диска.
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:
Вызовите функцию со следующим номером подфункции для 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:
Эти функции были официально перечислены как «зарезервированные».
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:
Эта функция используется для получения сегмента резидентного кода. AX возвращает сегмент резидентного кода.
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:
Функция используется для очистки кеша.
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:
Функция используется для отключения кэша.
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:
Эта функция используется для включения кэша.
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:
Функция используется для установки флага 1024 – Цилиндр. Флаг очищается всеми вызовами INT 13H, кроме AH=EEH и AH=EFH. Disk Manager также поддерживает эти вызовы. Эта функция эквивалентна вызову функции AH=EFH с CX=0400H для программного обеспечения, поддерживающего этот вызов.
Эта функция также поддерживается HyperDisk версии 4.01 и выше, а также PC-Cache версии 5.5 и выше, чтобы разрешить кэширование дисков с помощью SWBIOS для доступа к более чем 1024 цилиндрам.
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:
Функция используется для установки смещения цилиндра. Для программного обеспечения, которое поддерживает этот вызов, функция AH=EEH эквивалентна вызову этой функции с CX=0400H. Смещение цилиндра сбрасывается в 0 всеми вызовами INT 13H, кроме AH=EEH и 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:
Эта функция используется для проверки установки. Если функция выполнена успешно, флаг переноса сброшен, и DX возвращает слово конфигурации, в противном случае флаг переноса установлен.
Бит 15 устанавливается, если доступны другие расширения SWBIOS. Disk Manager также поддерживает эти вызовы.
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:
Эта функция используется для получения расширенного количества цилиндров. Функция AH = 08H из INT 13H вернет количество цилиндров, усеченное до 1024. BIOS без этого расширения вернет модуль счета 1024. Диспетчер дисков также поддерживает эти вызовы.
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:
Эта функция используется для установки режима Turbo. Номера подфункций для вызова функции с BL приведены в следующей таблице:
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
|
Как использовать расширения INT 13H в программировании на C
Мы можем вызывать функции расширения INT 13H с теми же функциями C (int86(), int86x() и т. д.), которые мы использовали в предыдущих главах. Давайте узнаем это на примере.
В следующем примере основное внимание уделяется трем функциям (проверка наличия расширений, расширенное чтение и расширенная запись). Однако в этой главе мы не будем использовать расширенную функцию записи.
Программа сначала проверяет, поддерживаются ли расширения или нет, присутствуют ли расширения для INT 13H. Она считывает абсолютный сектор 0 (таким образом, MBR) диска. Кодирование программы происходит следующим образом:
/* Программа для доступа к секторам за пределами 8,46 ГБ с использованием расширений INT 13 BIOS */
#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()
{
/* It will be written in the same way as read_sectors function, except Function Number, which will be 0x43 in this function. We’ll discuss extended write function in next chapters.
Before Using this Function please check and verify what are you going to do. You should have the proper knowledge of what you are going to do. Use of this function in lack of knowledge or carelessly may destroy your data. */
}
/// 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]);
}
}
Комментарии к кодированию программы
typedef Присваивает идентификатор типу данных таким образом, что typedef unsigned char Byte; присваивает идентификатор Byte для типа данных char. Точно так же идентификатор Word присваивается int, а DWord присваивается long.
Структура disk_packet загружается в DS:SI и выполняется команда (например, расширенное чтение, расширенная запись или проверка и т. д.). См. функции расширений IBM/MS INT 13H (функция 41H — функция 49H), приведенные ранее.
Функция check_ext_present() проверяет, доступны/поддерживаются ли расширения. Функция вызывается с BX=55AAH (inregs.x.bx=0x55AA;), и если расширения поддерживаются, регистр BX устанавливается в AA55H. (См. приведенную выше функцию 41H)
Функция read_sectors используется для чтения абсолютного сектора диска, указанного в disk_pack.lba1. В этой программе мы указали disk_pack.lba1=0, таким образом, мы собираемся прочитать абсолютный сектор 0 (см. примечание ниже), таким образом, мы собираемся прочитать MBR диска.
Функция write_sector также аналогична функции read_sectors и будет написана таким же образом, но с другими параметрами функции. Мы будем использовать его в следующих главах.
Примечание:
Мы читаем сектора диска двумя способами:
- Относительное чтение (или запись) сектора
- Чтение (или запись) абсолютного сектора
В Relative Sector Read мы читаем сектора диска в соответствии с геометрией диска CHS (Cylinder, Head and Sector). В относительном секторе чтение MBR диска (первый сектор диска) находится на цилиндре 0, головке 0 и секторе 1.
При абсолютном чтении секторов диска нам не нужно указывать номера цилиндров или головок в нашей программе. Абсолютные сектора отсчитываются от абсолютного сектора 0.
Таким образом, если мы собираемся прочитать MBR диска (первый сектор диска), мы собираемся прочитать абсолютный сектор 0. Работа BIOS заключается в преобразовании абсолютного номера сектора в соответствующий цилиндр, головку. и номер сектора.
Как и при чтении (или записи) абсолютных секторов, мы должны вычислять только абсолютные сектора внутри цикла в таких операциях, как чтение или запись всего диска, тогда как в случае чтения (или записи) относительных секторов нам необходимо запускать три цикла одновременно для вычисления CHS, поэтому чтение/запись абсолютного сектора намного быстрее, чем чтение/запись относительного сектора.
Например, если у нас есть жесткий диск с 16 головками (сторонами), 12 цилиндрами и 63 секторами, приведенная ниже таблица показывает процедуру и различие обоих методов чтения и, таким образом, показывает, как приближается абсолютный сектор может заставить наши программы, требующие времени (такие как чтение/запись всего диска или программы очистки всего диска и т. д.), работать намного быстрее:
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
|
Информация о таблице разделов MBR, которая отображается любым инструментом анализа MBR диска, приведена ниже:
В приведенной выше информации относительные номера секторов для начала обоих разделов равны 63 и 11277630 соответственно, которые свободны от разделов и подсчитываются в соответствии с количеством секторов, доступных на диске.
Страница изменена: 16/03/2022