Assembler - язык неограниченных возможностей


Драйверы устройств в DOS - часть 2


Итак, код драйвера устройства представляет собой обычный код программы, как и в случае с СОМ-файлом, но в начале не надо размещать директиву org 100h для пропуска PSP. Можно также объединить драйвер и исполнимую программу, разместив в ЕХЕ-файле код драйвера с нулевым смещением от начала сегмента, а точку входа самой программы ниже.

При обращении к драйверу DOS сначала вызывает процедуру стратегии (адрес по смещению 06 в заголовке), передавая ей адрес буфера запроса, содержащий все параметры, передаваемые драйверу, а затем процедуру прерывания (адрес по смещению 08) без каких-либо параметров. Процедура стратегии должна сохранить адрес буфера запроса, а процедура прерывания — собственно выполнить все необходимые действия. Структура буфера запроса меняется в зависимости от типа команды, передаваемой драйверу, но структура его заголовка остаетсй постоянной:

    +00h: байт — длина буфера запроса (включая заголовок)

    +01h: байт — номер устройства (для блочных устройств)

    +02h: байт — код команды (00h – 19h)

    +03h: 2 байта — слово состояния драйвера — должно быть заполнено драйвером

    бит 15: произошла ошибка

    биты 10 – 14: 00000

    бит 9: устройство занято

    бит 8: команда обслужена

    биты 7 – 0: код ошибки

    00h: устройство защищено от записи

    01h: неизвестное устройство

    02h: устройство не готово

    03h: неизвестная команда

    04h: ошибка CRC

    05h: ошибка в буфере запроса

    06h: ошибка поиска

    07h: неизвестный носитель

    08h: сектор не найден

    09h: нет бумаги

    0Ah: общая ошибка записи

    0Bh: общая ошибка чтения

    0Ch: общая ошибка

    0Fh: неожиданная смена диска

+05h: 8 байт — зарезервировано

+0Dh: отсюда начинается область данных, различающаяся для разных команд

Даже если драйвер не поддерживает запрошенную от него функцию, он обязательно должен установить бит 8 слова состояния в 1.

Рассмотрим символьные и блочные драйверы на конкретных примерах.





Начало  Назад  Вперед