Низкоуровневое програмирование Главная - Реальный режим - Прерывания Bios - INT 13h: Дисковый ввод-вывод .

INT 13h: Дисковый ввод-вывод .

Данное прерывание реализует несколько наборов API для работы с дисками

Оглавление

"Класический" API

Класический API использует адресацию в формате CHS (Цилиндр-Головка-Сектор), отводя под адрес 24 бита, и при этом имеет "разрывы" в нумерации. Таким образом возможно адресовать до 7,8 Гб информации, и поэтому данный API является устаревшим и имеет смысл если вы работаете с дискетами или на старом компьютере, не поддерживающем новые API.
Хотя максимальный адресуемый размер зависит от размера сектора, обычно приводится предел в 7,8 или 8 Гб, т.к. диcки с размером сектора, отличным от 512 Кб являются редкостью, а современные диски в силу определённых причин "скрывают" реальную геометрию за некими усреднёнными параметрами.
Кроме того, максимальный адресуемый размер зависит от аппаратной реализации - на особо старых компьютерах размер диска может быть ограничен 528 мегабайтами
AH функция
0Сброс устройства.

Вход:
DL - номер устройства

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.

Примечание:
Вызывает рекалибрацию контроллера, голоыки диска устанавливаются на нулевой трек.
На некоторых системах, в случае, если на одной линии расположено два диска (конфигурация Master/Slave), запрос на реколибрацию выполняется обоими дисками.
1Дать статус ошибки последней операции.

Вход:
DL = диск.

Выход:
AH содержит код ошибки диска

Примечание:
Некоторые БИОСы учитывают ошибки не всех операций
2Читать секторы

Вход:
DL = номер диска (0=диск A...; 80h=HDD 0; 81h=HDD 1...) (обычно при запуске системы номер диска, с которого проведён запуск передаётся в dl, но НЕ при запуске программы в DOS)
DH = номер головки чтения/записи
CH = биты 0-7 номера дорожки (цилиндра)
CL =
  биты 0-5 - номер сектора (Считая с 1)
  биты 6-7 - биты 8-9 номера дорожки
AL = число секторов
ES:BX => адрес буфера вызывающей программы

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
ES:BX буфер содержит данные, прочитанные с диска.
AL - количество считанных секторов (кроме ошибки 11h)

Примечание:
Старые БИОСы могут не поддерживать переход с одной дорожки на другую в процессе чтения, так что будте осторожны!
Документация на PhoenixBios (rev 6) утверждает, что максимальное значение, передаваемое в AL - 80h
3Писать секторы

Вход:
DL = номер диска (0=диск A...; 80h=HDD 0; 81h=HDD 1...) (обычно при запуске системы номер диска, с которого проведён запуск передаётся в dl, но НЕ при запуске программы в DOS)
DH = номер головки чтения/записи
CH = биты 0-7 номера дорожки (цилиндра)
CL =
  биты 0-5 - номер сектора (Считая с 1)
  биты 6-7 - биты 8-9 номера дорожки
AL = число секторов (в сумме не больше чем один цилиндр)
ES:BX => адрес буфера вызывающей программы

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
AL - количество записанных секторов

Примечание:
Старые БИОСы могут не поддерживать переход с одной дорожки на другую в процессе записи, так что будте осторожны!
Документация на PhoenixBios (rev 6) утверждает, что максимальное значение, передаваемое в AL - 80h
4Проверить секторы.

Вход:
DL = номер диска (0=диск A...; 80h=HDD 0; 81h=HDD 1...) (обычно при запуске системы номер диска, с которого проведён запуск передаётся в dl, но НЕ при запуске программы в DOS)
DH = номер головки чтения/записи
CH = биты 0-7 номера дорожки (цилиндра)
CL =
  биты 0-5 - номер сектора (Считая с 1)
  биты 6-7 - биты 8-9 номера дорожки
AL = число секторов (в сумме не больше чем один цилиндр)
Для биосов старше 15 ноября 1985-го года: ES:BX => адрес буфера вызывающей программы

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
AL - количество проверенных секторов

Примечание:
Старые БИОСы могут не поддерживать переход с одной дорожки на другую в процессе записи, так что будте осторожны!
Документация на PhoenixBios (rev 6) утверждает, что максимальное значение, передаваемое в AL - 80h, а для дисков с ECC - 79h
В зависимотси от реализации может проверять как сами данные, так и только служебные метки.
5Форматировать дорожку.

Вход:
DL,DH,CH = диск,головка,дорожка (см. функцию 02H)
ES:BX => дескрипторы секторов (формат дескрипторов см. ниже)
  дискета: 4-байтовый 'CHNS' (C - цилиндр,H - головка,N - сектор, S - размер) для каждого сектора на дорожке (т.е. 36 байт для 9-секторных дорожек); номера секторов должны быть упорядочены. 'S' - код размера сектора: 0=128; 1=256; 2=512; 3=1024
  для AT Тв. диск: 2-байтовый 'FN' (F - флаг,N - сектора) для каждого сектора на дорожке. последовательность полей 'N' определяет "коэффициент прослаивания" ("interleave factor").
  для XT Тв. диск: ES:BX не используется. Вместо этого AL содержит значение "прослаивания" между 1 и 16 (10h).
Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
AL - количество отформатированных секторов

Примечание:
Данные на дорожке разрушаются.
Тв. диск: 'F'-поля установливаются в 80h для плохих секторов
Крайне не реккомендуется применять эту функцию к современным жёстким дискам
6Форматировать дорожку и проверить на битые сектора.(HDD)

Вход:
AL - "коэффициент прослаивания" ("interleave factor")
DL,DH,CH = диск,головка,дорожка (см. функцию 02H)
CL = 0

Выход:
AH - код ошибки

Примечание:
Данные на дорожке разрушаются.
Эта функция поддерживается не всеми дисками
КРАЙНЕ НЕ реккомендуется применять эту функцию к современным жёстким диска
'F'-поля установливаются в 80h для плохих секторов
Некоторые БИОСы размещают в битах 6 и 7 регистра DH биты 10 и 11 номера дорожки
7Форматировать диск начиная с заданной дорожки

Вход:
AL - "коэффициент прослаивания" ("interleave factor")
DL,DH,CH = диск,головка,дорожка (см. функцию 02H)
CL = 0

Выход:
AH - код ошибки

Примечание:
Данные на дорожке разрушаются.
Эта функция поддерживается не всеми дисками
Крайне не реккомендуется применять эту функцию к современным жёстким диска
'F'-поля установливаются в 80h для плохих секторов
Некоторые БИОСы размещают в битах 6 и 7 регистра DH биты 10 и 11 номера дорожки
8Параметры диска

Вход:
DL = диск

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
если CX или DX ==0, то произошла ошибка и код ошибки диска в AH.
DL = число жёстких дисков на первом контроллере
DH = максимальный номер головки
CH = максимальный номер цилиндра (младшие 8 бит)
CL =
  биты 0-5 - максимальный номер сектора (и старшие биты максимум номера цилиндра)
  биты 6-7 - биты 8-9 максимаьного номера цилиндра
Для дискет: ES:DI - указатель на таблицу параметров дискеты
Для дискет: BL - Тип дисковода:
   0 - ошибка при определении типа дисковода
   1 - 360 кб, 5 дюймов, 40 дорожек
   2 - 1.2 мб, 5 дюймов, 80 дорожек
   3 - 720 кб, 3 дюйма, 80 дорожек
   4 - 1.44 мб, 3 дюйма, 80 дорожек
   5 - не определено, однако на некоторых компьютерах означает 2.88 мб, 3 дюйма
   6 - 2.88 мб, 3 дюйма
   10 - ATAPI-совместимое устройство со съёмным носителем

Примечание:
Только AT и XT совместимые компьютеры
BH и AL могут быть сброшены в ноль.
9Инициализировать параметры диска

Вход:
DL - номер диска

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.

Примечание:
Векторы для INT 41h и INT 46h адресуют Табл. параметров тв. диска соответственно для устройств 0 и 1.
В XT совместимом компьютере обе таблицы указываются через вектор INT 40h.
Только AT совместимые компьютеры
Сообщает BIOS о любом динамическом изменении таблиц параметров устройства.
0AhДлинное чтение

Вход:
DL = номер диска (0=диск A...; 80h=HDD 0; 81h=HDD 1...) (обычно при запуске системы номер диска, с которого проведён запуск передаётся в dl, но НЕ при запуске программы в DOS)
DH = номер головки чтения/записи
CH = биты 0-7 номера дорожки (цилиндра)
CL =
  биты 0-5 - номер сектора (Считая с 1)
  биты 6-7 - биты 8-9 номера дорожки
AL = число секторов
ES:BX => адрес буфера вызывающей программы

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
ES:BX => считанные данные

Примечание:
Только AT и XT совместимые компьютеры
Документация на PhoenixBios (rev 6) утверждает, что максимальное значение, передаваемое в AL - 79h

Буфер не должен пересекать адрес, кратный 64 Кб.
Чтение должно быть в пределах одной дорожки и одной головки.
0BhДлинная запись

Вход:
DL = номер диска (0=диск A...; 80h=HDD 0; 81h=HDD 1...) (обычно при запуске системы номер диска, с которого проведён запуск передаётся в dl, но НЕ при запуске программы в DOS)
DH = номер головки чтения/записи
CH = биты 0-7 номера дорожки (цилиндра)
CL =
  биты 0-5 - номер сектора (Считая с 1)
  биты 6-7 - биты 8-9 номера дорожки
AL = число секторов
ES:BX => адрес буфера вызывающей программы

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.

Примечание:
512 байт + 4-байтоый ECC (код коррекции ошибок).
Только AT и XT совместимые компьютеры
Документация на PhoenixBios (rev 6) утверждает, что максимальное значение, передаваемое в AL - 79h

Буфер не должен пересекать адрес, кратный 64 Кб.
Запись должна быть в пределах одной дорожки и одной головки.
0ChИскать цилиндр

Вход:
DL - номер диска
DH - Номер Головки
CH - Номер дорожки
CL - старшие биты номера дорожки

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.

Примечание:
Только AT и XT совместимые компьютеры
Только для жёстких дисков
Перемещает головку к нужной дорожке
0DhСброс устройства

Вход:
DL - диск

Примечание:
Только AT и XT совместимые компьютеры
Только для жёстких дисков
0EhЧитать буфер секторов

Вход:
как для функции 02H

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
По адресу ES:BX содержание буфера

Примечание:
Только AT совместимые компьютеры
0FhПисать буфер секторов

Вход:
как для функции 02h

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
По адресу ES:BX содержание буфера

Примечание:
Только AT совместимые компьютеры
10hпроверить готовность устройства

Вход:
DL = диск (обычно при запуске системы номер диска, с которого проведён запуск передаётся в DL, но НЕ при запуске программы в DOS)

Выход:
код ошибки диска (статус) в AH.

Примечание:
Только AT и XT совместимые компьютеры
11h Рекалибровать устройство

Вход:
DL = диск(обычно при запуске системы номер диска, с которого проведён запуск передаётся в DL, но НЕ при запуске программы в DOS)

Выход:
код ошибки диска (статус) в AH.

Примечание:
Только AT и XT совместимые компьютеры Только для жёстких дисков
12h Диагностика RAM контроллера

Вход:
DL = диск

Выход:
код ошибки диска (статус) в AH.

Примечание:
Только AT совместимые компьютеры
13h Диагностика устройства

Вход:
DL = диск

Выход:
код ошибки диска (статус) в AH.

Примечание:
Только AT совместимые компьютеры
14h Внутренняя диагностика контроллера

Вход:
DL = диск

Выход:
код ошибки диска (статус) в AH.

Примечание:
Только AT и XT совместимые компьютеры
Только для жёстких дисков
15hЧитать тип диска (недоступна в XT BIOS)

Вход:
DL = диск
AL = 0

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
AH = код устройства:
  == 0 , AL!=3 устройство DL отсутствует
  == 0 , AL==3 Жёсткий диск
  == 1 дискета; статус замены диска неподдерживается
  == 2 дискета; статус замены диска доступен (большинство случаев)
  == 3 Жёсткий диск

Примечание:
Для жёстких дисков по адресу CX:DX передаётся количество секторов
Только AT совместимые компьютеры Некоторые биосы ошибочно возвращают тип "жёсткий диск" в AL, по этому перед вызовом функции AL рекомендуется утсановить в 0 и если в AH в результате 0, то проверять AL
16hЧитать статус замены диска

Вход:
DL = диск

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
AH = код статуса:
  0 = замена диска непроизводится
  1 = неверный номер диска;
  6 = производится замена диска (открыта дисковая дверь), либо статус замены диска неподдерживается
  80h = ошибка таймаута

Примечание:
Только AT совместимые компьютеры
Не реккомендуется использовать на очень старых биосах, так как многие из них имеют ошибки в реализации из-за которых могут "испортится" различные данные
17hУстановить тип дискеты (используется перед операцией форматирования)

Вход:
DL = номер устройства диска (0 или 1)
AL = тип носителя диска:
  0 = не используется
  1 = 360K дискета в 360K устройстве
  2 = 360K дискета в 1.2M устройстве
  3 = 1.2M дискета в 1.2M устройстве
  4 = 720K дискета в 720K или (поддерживается не всеми биосами) 1.44M устройстве

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.

Примечание:
Только AT совместимые компьютеры
Документация на PhoenixBios (rev 6) явно оговаривает что случай с 1.44М дискетами не поддерживается, поэтому я реккомендую использовать функцию 18h
18hУстановить тип диска (используется перед операцией форматирования)

Вход:
DL = номер устройства диска
CH = Максимальный номер цилиндра
CL :
  биты 0-5 кол-во секторов на дорожке
  биты 6,7 старшие биты номера цилиндра

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
ES:DI - таблица параметров дискеты

Примечание:
Только AT и/или XT совместимые компьютеры Не многие БИОСы устанавливают основную таблицу параметров диска в соответствии со сформированной этой функцией, по этому рекомендуется перед проведением форматирования произвести замену адреса вектора прерывание 1Eh
20hПолучить тип дискеты

Вход:
DL = номер устройства диска (0 или 1)

Выход:
Carry-флаг=1 при ошибке и код ошибки диска в AH.
AL - тип:
  00 - 720 кб
  01 - 1.44 мб
  02 - 2.88 мб
  03 - 1 мб (неформатированная 720 кб)
  04 - 2 мб (неформатированная 1.44 мб)
  06 - 4 мб (неформатированная 2.88 мб)
  0Ch - 360 кб
  0Dh - 1,2 мб
  0Eh и 0Fh - дискета с размером сектора 1024 кб
  10h - устройство ATAPI

Примечание:
Некоторые старые БИОСы неподдерживают эту функцию
БИОСы Compaq изготовленные до 1993 года всегда возвращают 0 в AL

Коды ошибок классического API
КодЗначение
00Нет ошибки
01Неизвестная/неверная комманда
02Не найдена адресная метка
03Диск защищён от записи
04Не найден сектор
05Ошибка при сбросе HDD
06Произошла замена дискеты
07Ошибка инициализации
08Ошибка DMA
09Выход за приделы 64КБ при работе с DMA
0AhПлохой сектор
0BhПлохая дорожка
0ChНеправильный номер дорожки (В некоторых биосах - не правильный номер устройства)
0DhНеправильный номер сектора
0EhОбнаружена адресная метка управляющих данных
0FhОшибка DMA
10hОшибка данных (неверная контрольная сумма)
11hБыла произведена коррекция данных для устраниния ошибки
20hСбой контроллера
30hНеподдерживаемый формат дискеты
31hДискета извлечена
32hНеподдерживаемый тип дискеты
40hСбой при поиске дорожки
80hОшибка таймаута
AAhДиск не готов
BBhНеисовместимый контроллер или неизвестная ошибка
CChСбой при записи
E0hНеопознанная ошибка контроллера
FFhОшибка при чтении


"Расширенный" API

Этот набор API реализует стандарт Enhanced Disk Drive (EDD), а так же некоторые дополнительные возможности
EDD используют для адресации одно значение размером в 64 бита, что позволяет использовать диски с размером примерно до 8-ми зеттабайт. На деле стоит понимать, что количество реально используемых бит ограничено возможностями аппаратуры, к примеру ранние реализации этого стандарта позволяли использовать только 28 бит (128 гбайт), а в настоящее время существует ограничение в 48 бит(128 петабайт).
EDD предназначен для работы с устройствами в режиме адресации LBA, однако зачастую прекрасно работает и со старыми устройствами, не поддерживающими этот тип адресации.
AH функция
41hПроверка наличия расширения.

Вход:
BX = 55AAh
DL - номер диска(80h ... 0FFh)

Выход:
Флаг переноса установлен - расширение не поддерживается
Флаг переноса сброшен - расширение поддерживается:
BX = AA55h
AL - изменено
AH - номер версии (01 - первая; 20h - EDD версии 1.0, версия реализации функций 2; 21h - EDD версии 1.1, версия реализации функций 2; 30h - третья версия)
CX - поддерживаемые возможности:
       бит 0 = 1 : поддержка расширенного доступа к жёсткому диску диску (функции 42h-44h, 47h, 48h)
       бит 1 = 1 : поддержка расширенного управления дисками со съёмным носителем (функции 45h, 46h, 48h, 49h)
       бит 2 = 1 : поддержка EDD (функции 48h,4Eh)
       биты 3-15 - резерв

Примечание:
В некоторых реализациях регистр DH может быть изменён
В некоторых источниках утверждается, что третий бит регистра CX обозначает поддержку 64-х битного расширения для адреса буфера, однако найти подтверждение этому в официальной документации не удалось.
42hРасширенное чтение.

Вход:
DL - номер диска(80h ... 0FFh)
DS:SI - адрес пакета адресации

Выход:
AH - состояние дисковой подсистемы
Если флаг переноса установлен - произошла ошибка

Примечание:
Пакет адресации представляет из себя следующую структуру:
СмещениеРазмерСмысл
0 BYTEРазмер пакета. Не меньше 10h, кроме того БИОС "окургляет" это значение до бижайшего меньшего известного ему значения, таким образом не рекомендуется передавать значения, отличные от 10h или 18h
1 BYTEРезерв, должен быть 0
2 BYTEЧило передаваемых секторов(0 - 7Fh).
3 BYTEРезерв, должен быть 0
4 DWORDАдрес буфера (сегмент:смещение). Значение FFFFh:FFFFh означает, что используется поле расширенного адреса буфера
8 QWORDНомер начального блока
10h QWORDРасширенный адрес буфера. Используется, если адрес буфера установлен в FFFFh:FFFFh.
В некоторых источниках в пакете адресации указываются ещё несколько полей, однако найти подтверждение этому в официальной документации мне не удалось.
Для перевода из CHS-адресации в LBA-адресацию используйте следующую формулу: (Cylinder*NumHeads + Head) * SectorsPerTrack + Sector - 1 Если произошла ошибка в процессе чтения, то в поле число блоков записывается число успешно считанных блоков
43hРасширенная запись.

Вход:
AL - 0 или 1 - запись без проверки данных, 2 - запись с проверкой данных
DL - номер диска(80h ... 0FFh)
DS:SI - адрес пакета адресации

Выход:
AH - состояние дисковой подсистемы
Если флаг переноса установлен - произошла ошибка

Примечание:
Пакет адресации описан в функции 42h. Устройство может не поддерживать запись данных с проверкой. В таком случае если запрошена запись с проверкой, то после возврата из функци AH=01 и возведён флаг переноса.
Что бы узнать, поддерживается ли запись с проверкой используйте функцию 48h.
Если произошла ошибка в процессе записи, то в поле число блоков записывается число записанных блоков
44hПроверить секторы

Вход:
DL - номер диска(80h ... 0FFh)
DS:SI - адрес пакета адресации

Выход:
AH - состояние дисковой подсистемы
Если флаг переноса установлен - произошла ошибка

Примечание:
Пакет адресации описан в функции 42h. Если произошла ошибка в процессе проверки, то в поле число блоков записывается число проверенных сеторов (сеткторы проверяются последовательно)
45hЗаблокировать/разблокировать устройство

Вход:
DL - номер диска(80h ... 0FFh)
AL :
       = 0 - заблокировать
       = 1 - разблокировать
       = 2 - узнать статус

Выход:
AH - состояние дисковой подсистемы
AL - состояние диска Если флаг переноса установлен - произошла ошибка

Примечание:
Эта функция подразумевает, что носитель информации нельзя извлечь, пока устройство заблокированно.
Эта функция поддерживает до 255 блокировок на устройство. Для каждой блокировки необходима своя команда разблокировки, т.е. блокировки могут быть вложенными.
Если подать команду разблокировки на разблокированный диск, функция вернёт ошибку.
Некоторые диски с несъёмными носителями информации допускают использование команды блокировки. Точный смысл этой команды в таком случае зависит от производителя жёсткого диска.
46hИзвлечь носитель информации из устройства

Вход:
DL - номер диска(80h ... 0FFh)
AL = 00 (резерв)

Выход:
AH - состояние дисковой подсистемы
Если флаг переноса установлен - произошла ошибка

Примечание:
Если диск заблокирован, то функция вернёт ошибку.
Если диск имеет несъёмный носитель, то функция вернёт ошибку.
При попытке извлечь носитель из пустого дисковода функция вернёт ошибку.
Эта функция использует функцию 52h прерывания 15h
47hРасширенный поиск

Вход:
DL - номер диска(80h ... 0FFh)
DS:SI - адрес пакета адресации

Выход:
AH - состояние дисковой подсистемы
Если флаг переноса установлен - произошла ошибка

Примечание:
Это функция позволяет сообщить устройству, какой следующий блок понадобится системе
48hПолучить параметры диска

Вход:
DL - номер диска(80h ... 0FFh)
DS:SI - адрес буфера для сохранения параметров(не менее 26 байт, рекомендуется 66)

Выход:
AH - состояние дисковой подсистемы
Если флаг переноса установлен - произошла ошибка
По адресу DS:SI расположена таблица с параметрами диска:
СмещениеРазмерСмысл
00 WORDРазмер буфера в байтах. Должен быть установлен до вызова функции. Может быть 26, 30, 66 или 74
02 WORD бит 0 : "Прозрачное" управление сообщениями о нарушении границ при сипользовании DMA
бит 1 : Информаци о геометрии диска (значения по смещениям 4, 8 и 12) достоверна
бит 2 : Диск является устройством со сменным носителем. Если этот бит сброшен, то значение битов 4-6 не достоверно
бит 3 : Диск поддерживает режим записи с верификацией
бит 4 : Устройство подаёт сигнал при смене носителя (имеет смысл, если бит 2 установлен)
бит 5 : Устройство может быть заблокированно (имеет смысл, если бит 2 установлен)
бит 6 : Съёмный носитель в дисководе отсутствует, по смещениям 4, 8 и 12 записаны максимально возможные для этого устройства значения
бит 7 : БИОС использует функцию 50h прерывания 13h для доступа к устройству
биты 8-15 : резерв
04 DWORDКоличество цилиндров
08 DWORDКоличество головок
12 DWORDКоличество секторов на треке
16 QWORDКоличество секторов на диске
24 WORDКоличество байт в секторе
26 DWORDУказатель на таблицу конфигурации EDD (сегмент:смещение). Значение FFFFh:FFFFh означает, что таблица не доступна.
30 WORD== 0BEDD - признак того, что дальнейшие поля присутствуют
32 BYTEКоличество байт в таблице начиная со смещения 30h. Может быть 36 или 44.
33 BYTEРезерв
34 WORDРезерв
36 4*BYTEТип шины:
"PCI " (50h, 43h, 49h, 20h) - шина PCI или совместимая
"PCIX" (50h, 43h, 49h, 58h) - шина PCI-X
"IBND" (49h, 42h, 4Eh, 44h) - шина InfiniBand
"XPRS" (58h, 50h, 52h, 53h) - шина PCI-Express
"HTPT" (48h, 54h, 50h, 54h) - шина HyperTransport
"ISA " (49h, 53h, 41h, 20h) - шина ISA
40 8*BYTE Тип интерфейса
"ATA      "  (41h, 54h, 41h, 20h, 20h, 20h, 20h, 20h) - Устройство ATA/ATAPI с набором команд ATA
"ATAPI   " (41h, 54h, 41h, 50h, 49h, 20h, 20h, 20h) - Устройство ATA/ATAPI с набором команд ATAPI
"SCSI    "   (53h, 43h, 53h, 49h, 20h, 20h, 20h, 20h) - SCSI - совместимое устройство
"USB     "   (55h, 53h, 42h, 20h, 20h, 20h, 20h, 20h) - Устройство с интерфейсом USB
"1394    "   (31h, 33h, 39h, 34h, 20h, 20h, 20h, 20h) - Устройство с интерфейсом IEEE 1394 (FireWire)
"FIBRE   "  (46h, 49h, 42h, 52h, 45h, 20h, 20h, 20h) - Устройство с интерфейсом Fibre Chanel
"I2O     "    (49h, 32h, 4Fh, 20h, 20h, 20h, 20h, 20h) - Устройство подключено к шине I2O (Intelligent Input/Output)
"RAID    "  (52h, 41h, 49h, 44h, 20h, 20h, 20h, 20h) - Устройство является частью RAID-массива
"SATA    " (53h, 41h, 54h, 41h, 20h, 20h, 20h, 20h) - Устройство с интерфейсом SATA в нативном режиме
"SAS     "   (53h, 41h, 53h, 20h, 20h, 20h, 20h, 20h) - Устройство с интерфейсом SAS
48 QWORD Путь на шине
56 QWORD*
или
2*QWORD
Путь к устройству
64*
или
72*
BYTE Резерв
65*
или
73*
BYTE Контрольная сумма


Примечание:
*при длинне, записанной по смещению 32, равной 44 или больше используется второе значение.
Значения в таблице конфигурации EDD и её адрес могут менятся при вызове функций EDD
Путь на шине определяется по следующей логике:
ШинаСмещение в таблице параметров дискаРазмерСмысл
ISA 48WORDБазовый адрес устройства.
50WORDРезерв.
52DWORDРезерв.
PCI, PCI-X, HyperTransport, PCI-Express 48BYTEНомер шины. Значение FFh означает, что это поле не используется.
49BYTEНомер устройства. Значение FFh означает, что это поле не используется.
50BYTEНомер функции. Значение FFh означает, что это поле не используется.
51BYTEНомер канала. Значение FFh означает, что это поле не используется.
52DWORDРезерв.
InfiniBand 48QWORDРезерв.


Путь к устройству определяется по следующей логике:
ИнтерфейсСмещение в таблице параметров дискаРазмерСмысл
ATA 56BYTEНомер устройства
57остальныеРезерв
ATAPI 56BYTEНомер устройства
57BYTEНомер логического устройства
58остальныеРезерв
SCSIпри длинне, записанной по смещению 32, меньшей 44
56BYTEНомер устройства
57остальныеРезерв
при длинне, записанной по смещению 32, равной 44 или больше
56WORDФизический номер устройства/SCSI ID
58QWORDЛогический номер устройства
66остальныеРезерв
USBпри длинне, записанной по смещению 32, меньшей 44
56BYTEНомер TBD
57остальныеРезерв
при длинне, записанной по смещению 32, равной 44 или больше
56QWORDСерийный номер по стандарту USB Mass Storage
64остальныеРезерв
1394 56QWORD64-х битный GUID
64остальныеРезерв
FIBRE 56QWORD64-х битный WWN
64остальныеРезерв
I2O 56QWORD64-х битный тэг
64остальныеРезерв
RAID 56QWORDНомер RAID-массива
64остальныеРезерв
SATA 56BYTEНомер порта
57BYTEМножитель порта
58остальныеРезерв
SAS 56QWORD64-х битный адрес
64остальныеРезерв

Таблица конфигурации EDD выглядит следующим образом:
СмещениеРазмерСмысл
0 WORDБазовый порт ввода-вывода
2 WORDАдрес управляющего порта
4 BYTE   биты 0-3 : резерв
  бит 4 : 0 = Master, 1 = Slave
  бит 5 : резерв установлен
  бит 6 : используется LBA
  бит 7 : резерв, установлен
5 BYTE Зарезервированно для использования БИОСом
6 BYTE Инофрмация о IRQ. Третья версия стандарта EDD отводит под номер IRQ только порые четыре бита, в предварительной же редакции 4-ой версии отводит под номер IRQ все 8 бит.
7 BYTE Количество блоков для ATA комманд
8 BYTE   биты 0-3 : канал DMA
  биты 4-7 : тип DMA, по спецификации ATA
9 BYTE   биты 0-3 : тип PIO
  биты 4-7 : резерв
10 WORD Конфигурация диска
  бит 0 : включён режим PIO (в т.ч. FastPIO)
  бит 1 : включён режим DMA
  бит 2 : ипользуются команды ATA READ MULTIPLE и WRITE MULTIPLE
  бит 3 : используется CHS адресация
  бит 4 : используется LBA адресация
  бит 5 : устройство со съёмным носителем
  бит 6 : устройство ATAPI
  бит 7 : 32-х битный режим передачи
  бит 8 : ATAPI устройство использует прерывание для информирования о готовности
  биты 9-10 : тип трансляции
       00 - Трансляция с битовым смещением
       01 - Трансляция LBA
       10 - резерв
       11 - определяется производителем
  бит 11 : используется доступ с помощью UltraDMA
  бит 12 : HPA активна
  бит 13 : используется LBA48 адресация
  биты 14-15 : резерв
12 WORD Резерв
14 BYTE Версия таблицы. 10h : 1.0 , 11h : 1.1 - 3.0 , 30h : 4.0
15 BYTE Контрольная сумма (побайтовый XOR байт 0 - 14 включительно)
49hПолучить расширенный статус смены носителя

Вход:
DL - номер диска(80h ... 0FFh)

Выход:
Флаг переноса сброшен, AH==0 : носителт не менялся
Флаг переноса установлена, AH==6 : носитель сменился, если AH имеет иноезначение - то это код ошибки.

Примечание:
Если в DL передать номер диска с несъёмным носителем, то функция вернёт, что смены диска не было.
4EhУстановить конфигурацию оборудования

Вход:
DL - номер диска(80h ... 0FFh)
AL - функция:
    0 : разрешить предвыборку
    1 : запретить предвыборку
    2 : установить максимальный номер режима PIO и установить максимально возможную скорость передачи данных
    3 : установить минимальный номер режима PIO и установить минимальную скорость передачи данных
    4 : устновить скорость передачи данных и номер режима PIO на стандартные значения
    5 : включить передачу данных в режиме DMA. Установить максимально возможную скорость
    6 : отключить режим DMA

Выход:
Флаг переноса сброшен, AH==0 : функция выполнена успешно ; AH==1 : функция выполнена успешно, но повлияла на другие устройства
Флаг переноса установлен : произошла ошибка, AH - состояние дисковой подсистемы
50hПослать коммандный пакет

Вход:
DL - номер диска(80h ... 0FFh)
AL = 01 ES:BX - указатель на коммандный пакет
СмещениеРазмерСмысл
0 WORD0B055h
2 BYTEРазмер пакета
3 BYTEРезерв
4 определяется программистомТело пакета

Выход:
AH - состояние дисковой подсистемы
Эта функция используется БИОСом для работы с устройствами, подключёнными по интерфейсу 1394 или USB
Если флаг переноса установлен - произошла ошибка

Коды состояния дисковой подсистемы(коды ошибок) Расширенный дисковый API использует те же коды ошибок, что и класический, а так же определяет несколько новых
КодЗначение
B0Диск не заблокирован
B1Диск заблокирован
B2Диск не имеет съёмного носителя
B3Диск занят (используется)
B4Превышено количество блокировок
B5Пропытка извлечения носителя провалилась
B6Диск защищён от чтения


Сервис загружаемых CD

AH функция
4AhЗапустить эмуляцию.

Вход:
AL = 0
DI:SI - спецификационный пакет

Выход:
AX - состояние дисковой подсистемы (то же значение, что и для расширенного API)
Если флаг CF установлен, то произошла ошибка.

Примечание:
Спецификационный пакет имеет следующий формат:
СмещениеРазмерСмысл
0 BYTEРазмер пакета (13h)
1 BYTEТип устройтсва:
биты 0-3: тип эмулируемого устройства:
    нет эмуляции
    дискета 1.2 мб
    дискета 1.44 мб
    жёсткий диск
биты 4 и 5: резерв
бит 6: устройство ATAPI
бит 7: устройство SCSI
2 BYTEНомер диска
3 BYTEНомер контроллера
4 DWORDАдрес LBA
8 WORDПоложение устройства на шине.
Для ATAPI устройств:
    бит 0: 0==Master, 1==Slave
    биты 1-15: резерв
Для SCSI устройств:
    биты 0-7: LUN(номер логического устройства) и PUN(номер физического устройства)
    биты 8-16: номер шины.
10 WORDСегмент для буфера.
Обратите внимание, что смещение для буфера считается равным нулю. Кроме того, размер буфера должен бфть 3 Кб
12 WORDСегмент для загрузки (если установлен в ноль, то считается равным 7С0h)
14 WORDРазмер эмулируемого сектора в блоках по 512 байт.
16 3*BYTEпараметры CHS: биты 0-7: младшая часть количества дорожек биты 8-13: количество секторов биты 14-15: старшая часть количества дорожек биты 16-24: количество головок
4Bh
ALЗначение
00Отключить эмуляцию и получить статус

Вход:
DL - номер дискогого устройства (если переданно значение 7Fh, то будут завершенны все действующие эмуляции)
DS:SI - адрес, куда будет сохранён спецификационный пакет

Выход:
DS:SI - заполненный спецификационный пакет
AX - состояние дисковой подсистемы (то же значение, что и для расширенного API)
Если флаг CF установлен, то произошла ошибка.
01Получить статус

Вход:
DL - номер дискогого устройства
DS:SI - адрес, куда будет сохранён спецификационный пакет

Выход:
DS:SI - заполненный спецификационный пакет
AX - состояние дисковой подсистемы (то же значение, что и для расширенного API)
Если флаг CF установлен, то произошла ошибка.
4ChЗапустить эмуляцию и загрузится с диска.

Вход:
AL = 0
DI:SI - спецификационный пакет
4DhУзнать загрузочный каталог.

Вход:
AL = 0
DI:SI - пакет команды

Примечание:
Пакет крманды имеет следующий формат:
СмещениеРазмерСмысл
0BYTEразмер пакета (= 08)
1BYTEколичесвто передаваемых секторов
2DWORDадрес в памяти, куда будут записанны сектора
6WORDс какого сектора начинать чтение (относительно первого сектора корневого каталога)