Главная » Ассемблер, Железо » Функции EPP BIOS

0

Когда получили массовое распространение периферийные устройства, выполняющие обработку документов (печать или сканирование) в растровом режиме, возникла потребность в значительном увеличении скорости передачи данных через параллельный порт. Две группы разработчиков практически одновременно выдвинули два различных стандарта [51,61]:

•       улучшенный параллельный порт (Enhanced Parallel Port, сокращенно EPP);

•       порт с расширенными возможностями (Extended Capability Port, сокращенно ЕСР).

Оба стандарта имеют свои преимущества, поэтому разработчикам оборудования пришлось в одном контроллере параллельного порта реализовать поддержку сразу трех режимов — SPP, ЕРР и ЕСР.

Режим EPP применяется для работы со сканерами и внешними дисководами, а режим ЕСР — для работы с лазерными и струйными принтерами.

Стандарт ЕРР предусматривает возможность соединения подключаемых к параллельному порту устройств в цепочки, для чего ЕРР- устройство снабжается двумя 25-коптактными разъемами (входным и выходным) и специальным коммутатором, делающим устройство «невидимым» для компьютера, когда оно не используется. В одну цепочку можно включить до 8 ЕРР-устройств; кроме того, в конце цепочки может присутствовать устройство, не поддерживающее стандарт ЕРР (например, принтер, работающий только в режимах SPPhECP).

Цепочку устройств можно подключить к компьютеру напрямую или через мультиплексор. Мультиплексор может иметь до восьми выходных разъемов, так что общее количество подключенных устройств может достигать 72 (восемь цепочек по девять устройств).

Рассмотрим дополнительный набор функций BIOS, предназначенный для обслуживания новых режимов работы и получивший наименование ЕРР BIOS [44, 85].

Прерывание Int 17h, функция 02h: проверить наличие ЕРР BIOS

Функция проверяет наличие ЕРР BIOS. В случае если ЕРР BIOS поддерживается системой, функция возвращает вектор («точку входа») для вызова функций ЕРР BIOS.

Перед вызовом прерывания требуется записать в регистры следующую информацию:

•           в АН — значение 02h;

•       в DX — номер параллельного порта (0 — LPT1, 1 — LPT2, 2 — LPT3);

•           в AL — значение 0;

•           в СН — значение 45h (символ Е);

•           в BL — значение 50h (символ Р);

•           в ВН — значение 50h (символ Р).

В случае успешного завершения операции функция возвращает:

•           в АН — значение 0;

•            в AL — значение 45h; 20*

•       в СХ — значение 5050h;

•           в паре регистров DX :ВХ — вектор ЕРР (точку входа ЕРР BIOS). Для вызова всех остальных функций ЕРР BIOS применяется вектор точки входа ЕРР BIOS, возвращаемый данной функцией.

ПРИМЕЧАНИЕ

Кроме регистров, используемых для передачи параметров при вызове функций ЕРР и для возврата результатов, в функциях используется также регистр ВХ, содержимое которого не сохраняется (теряется после вызова функции).

Переход по вектору ЕРР, функция OOh: определить конфигурацию и возможности порта

Функция Query Config позволяет определить текущую конфигурацию параллельного порта с заданным номером.

Перед вызовом данной функции по вектору ЕРР требуется записать в регистры следующую информацию:

•       в АН — значение OOh;

•       в DL — номер параллельного порта (0 — LPT1,1 — LPT2,2 — РТЗ).

После выполнения функции в регистрах находится следующая информация:

•       в АН — код ошибки;

•       в AL — уровень прерывания от ЕРР порта (может принимать значения в диапазоне от 0 до 15; код FFh означает, что прерывания портом не поддерживаются);

•       в ВН — номер версии ЕРР BIOS;

•       в BL — возможности параллельного порта (бит 0 — признак наличия мультиплексора, бит 1 — признак наличия поддержки двунаправленного режима PS/2, бит 2 — признак наличия поддержки режима ЕРР 1.9, бит 3 — признак наличия поддержки режима ЕСР, бит 4 — зарезервирован, бит 5 — признак наличия поддержки Centronics FIFO, бит 6 — признак наличия поддержки режима ЕРР 1.7, бит 7 — зарезервирован);

•       в СХ — базовый адрес группы регистров порта при работе в режиме SPP;

•       в паре регистров ES: DI — указатель на ограниченную нулем текстовую строку, содержащую информацию о разработчике данной версии ЕРР BIOS.

Переход по вектору ЕРР, функция 01 h: установить режим работы порта

Функция Set Mode позволяет установить режим работы параллельного порта с заданным номером. Вызов данной функции разрешен только в том случае, если процессор работает в «реальном» режиме.

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

•       в АН — значение Olh;

в DL — номер параллельного порта;

•       в AL — код устанавливаемого режима (бит 0 — установить «режим совместимости» SPP, бит 1 — установить двунаправленный режим SPP, бит 2 — установить режим ЕРР, бит 3 — установить режим ЕСР, бит 4 — зарезервирован, бит 5 — установить режим Centronics FIFO, бит 6 — установить режим ЕРР 1.7, бит 7 — зарезервирован).

После выполнения функция возвращает в регистре АН код ошибки.

Переход по вектору ЕРР, функция 02h: определить режим работы порта

Функция Get Mode позволяет определить текущий режим работы параллельного порта с заданным номером. Вызов данной функции разрешен только в том случае, если процессор работает в «реальном» режиме.

Перед вызовом функции требуется записать в регистры следующую информацию:

•       в АН — значение 02h;

•       в DL — номер параллельного порта.

После выполнения функции в регистрах находится следующая информация:

•       в АН — код ошибки;

•       в AL — код режима работы порта (бит 0 — признак режима совместимости, бит 1 — признак двунаправленного режима, бит 2 — признак режима ЕРР, бит 3 — признак режима ЕСР, бит 4 — зарезервирован, бит 5 — признак режима Centronics FIFO, бит 6 — признак режима ЕРР 1.7, бит 7 — признак того, что разрешена обработка прерываний в режиме ЕРР).

Переход по вектору ЕРР, функция 03h: управление прерываниями

Функция Interrupt Control позволяет включать и отключать обработку прерывания, связанного с заданным параллельным портом. Вызов дайной функции разрешен только в том случае, если процессор работает в «реальном» режиме.

Перед вызовом функции требуется записать в регистры следующую информацию:

•           в АН — значение 03h;

•           в DL — номер параллельного порта;

•       в АН — управляющий код (0 — запретить прерывания от порта EPP, 1 — разрешить прерывания).

После выполнения функция возвращает в регистре АН код ошибки.

Переход по вектору ЕРР, функция 04h: инициализация

Функция ЕРР Reset позволяет осуществить инициализацию («сброс») устройства, подключенного к заданному параллельному порту. Перед вызовом данной функции требуется записать в регистры следующую информацию:

•           в АН — значение 04h;

•           в DL — номер параллельного порта.

После выполнения функция возвращает в регистре АН код ошибки.

Переход по вектору ЕРР, функция 05h: запись адреса

Функция Address Write выполняет цикл записи адреса устройства. Перед вызовом функции требуется записать в регистры следующую информацию:

•           в АН — значение 05h;

•           в DL — номер параллельного порта;

•           в AL — адрес устройства.

После выполнения функция возвращает в регистре АН код ошибки.

Переход по вектору ЕРР, функция 06h: считывание адреса

Функция Address Read выполняет цикл считывания адреса активного устройства.

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

•       в АН — значение 06h;

•       в DL — номер параллельного порта.

После выполнения функции в регистрах находится следующая информация:

•       в АН — код ошибки;

•       в AL — адрес устройства и дополнительные данные.

Переход по вектору ЕРР, функция 07h: запись байта

Функция Write Byte выполняет вывод одного байта данных через порт данных ЕРР.

Перед вызовом функции требуется записать в регистры следующую информацию:

•       в АН — значение 07h;

•       в DL — номер параллельного порта;

•       в AL — байт данных.

После выполнения функция возвращает в регистре АН код ошибки.

Переход по вектору ЕРР, функция 08h: запись блока данных

Функция Write Block выполняет вывод блока данных из заданного, буфера через порт данных ЕРР.

Перед вызовом функции требуется поместить в регистры следующую информацию:

•       в АН — значение 08h;

•       в DL — номер параллельного порта;

•       в СХ — размер передаваемого блока в байтах (значение 0 в данном регистре соответствует размеру блока, равному 64 Кбайт);

•       в пару регистров ES:SI – указатель на область памяти (буфер), содержащую передаваемый блок данных.

После выполнения функции в регистрах находится следующая информация:

•       в АН — код ошибки;

•       в СХ — значение 0 в случае успешного выполнения передачи блока или количество не переданных байт в случае возникновения ошибки (сбоя) в процессе передачи.

ПРИМЕЧАНИЕ

Задавать значение 0 в регистре СХ при вызове данной функции не рекомендуется: могут возникать проблемы совместимости, связанные с различными реализациями ЕРР BIOS.

Переход по вектору ЕРР, функция 09h: считывание байта данных

Функция Read Byte выполняет считывание одного байта данных из порта данных ЕРР.

Перед вызовом функции требуется записать в регистры следующую информацию:

•       в АН — значение 09h;

•       в DL — номер параллельного порта.

После выполнения функции в регистрах находится следующая информация:

•       в АН — код ошибки;

•       в AL — принятый байт данных.

Переход по вектору ЕРР, функция OAh: считывание блока данных

Функция Read Block выполняет считывание блока данных в заданный буфер через порт данных ЕРР.

Перед вызовом функции требуется записать в регистры следующую информацию:

•       в АН — значение OAh;

•       в DL — номер параллельного порта;

•       в СХ — размер принимаемого блока в байтах (значение 0 в данном регистре соответствует размеру блока, равному 64 Кбайт);

•       в пару регистров ES. DI — указатель на область памяти, предназначенную для размещения принимаемого блока данных.

После выполнения функции в регистрах находится следующая информация:

•            в АН — код ошибки;

•       в СХ — значение 0 в случае успешного завершения операции или количество не переданных байт в случае возникновения ошибки.

ПРИМЕЧАНИЕ

Задавать значение 0 в регистре СХ при вызове данной функции не рекомендуется: могут возникать проблемы совместимости, связанные с различными реализациями ЕРР BIOS.

Переход по вектору ЕРР, функция OBh: запись адреса и считывание байта

Функция Address/Byte Read выполняет комбинированную операцию: устанавливает адрес устройства, а затем принимает от него байт данных.

Перед вызовом функции требуется записать в регистры следующую информацию:

•            в АН — значение OBh;

•            в DL — номер параллельного порта;

•           в AL — адрес устройства.

После выполнения функции в регистрах находится следующая информация:

•            в АН — код ошибки;

•            в AL — принятый байт данных.

Переход по вектору ЕРР, функция OCh: запись адреса и байта данных

Функция Address/Byte Write выполняет комбинированную операцию: устанавливает адрес устройства, а затем передает этому устройству байт данных.

Перед вызовом функции требуется записать в регистры следующую информацию:

•            в АН— значение OCh;

•            в DL — номер параллельного порта;

•           в AL — адрес устройства;

•           в DH — передаваемый байт данных.

После выполнения функция возвращает в регистре АН код ошибки.

Переход по вектору ЕРР, функция ODh: запись адреса и считывание блока данных

Функция Address/Block Read выполняет комбинированную операцию: устанавливает адрес устройства, а затем принимает от него блок данных.

Перед вызовом функции требуется записать в регистры следующую информацию:

•           в АН — значение ODh;

•           в DL — номер параллельного порта;

•           в AL — адрес устройства;

•       в СХ — размер принимаемого блока в байтах (значение 0 в данном регистре соответствует размеру блока, равному 64 Кбайт);

•       в паре регистров ES DI — указатель на область памяти, предназначенную для размещения принимаемого блока данных.

После выполнения функции в регистрах находится следующая информация:

•            в АН — код ошибки;

•       в СХ — значение 0 в случае успешного завершения операции; количество не переданных байт в случае возникновения ошибки.

ПРИМЕЧАНИЕ

Задавать значение 0 в регистре СХ при вызове данной функции не рекомендуется: могут возникать проблемы совместимости, связанные с различными реализациями ЕРР BIOS.

Переход по вектору ЕРР, функция OEh: запись адреса и блока данных

Функция Address/Bl ock Wri te выполняет комбинированную операцию: устанавливает адрес устройства, а затем передает ему блок данных.

Перед вызовом функции требуется записать в регистры следующую информацию:

•            в АН — значение OEh;

•           в DL — номер параллельного порта;

•            в AL — адрес устройства;

•       в СХ — размер передаваемого блока в байтах (значение 0 в данном регистре соответствует размеру блока, равному 64 Кбайт);

•       в пару регистров ES: SI — указатель на область памяти, содержащую передаваемый блок данных.

После выполнения функции в регистрах находится следующая информация:

•            в АН — код ошибки;

•       в СХ — значение 0 в случае успешного завершения операции или количество не переданных байт в случае возникновения ошибки.

ПРИМЕЧАНИЕ

Задавать значение 0 в регистре СХ при вызове данной функции не рекомендуется: могут возникать проблемы совместимости, связанные с различными реализациями ЕРР BIOS.

Переход по вектору ЕРР, функция OFh: захватить порт

Функция Lock Port позволяет упорядочить ввод и вывод данных через ЕРР-порт. Данная функция применяется для выбора порта конкретного устройства, если это устройство входит в состав цепочке устройств или подключено через мультиплексор. Перед вызовом функции требуется записать в регистры следующую информацию:

•            в АН — значение OFh;

•            в DL — номер параллельного порта;

•       в BL — адрес устройства (биты 0-3 задают номер порта мультиплексора, биты 4-7 — номер устройства в цепочке).

После выполнения функция возвращает в регистре АН код ошибки. Номер порта мультиплексора может принимать значения в диапазоне от 1 до 8, номер устройства в цепочке — также от 1 до 8. При использовании в системе драйвера для работы с мультиплексором или цепочкой устройств вызов функции Lock Port завершается успешно только в том случае, если порт еще не захвачен.

Захват порта должен быть выполнен перед началом работы с устройством. Пока порт не захвачен, допускается выполнение следующих операций:

•       Device Interrupt;• Query Config;

•       Installation Check;• Query Daisy Chain;

•       Real time Mode;• Query Device Port;

•       Rescan Daisy Chain;• Query Mux.

•       Set Product ID;

Переход по вектору EPP, функция 10h: освободить порт

Функция Unl ock Port освобождает ЕРР-порт и позволяет его использовать драйверам других устройств.

Перед вызовом функции требуется записать в регистры следующую информацию:

•       в АН — значение 10h;

•       в DL — номер параллельного порта;

•       в BL — адрес устройства (биты 0-3 задают номер порта мультиплексора, биты 4-7 — номер устройства в цепочке).

После выполнения функция возвращает в регистре АН код ошибки.

Переход по вектору ЕРР, функция 11 h: установить обработчик прерываний

Функция Device Interrupt позволяет драйверу ЕРР-устройства установить собственный обработчик прерывания для параллельного порта с заданным номером. Вызов данной функции разрешен только в том случае, если процессор работает в «реальном» режиме. Перед вызовом функции требуется поместить в регистры следующую информацию:

•       в АН — значение llh;

•       в DL — номер параллельного порта;

•       в AL — код выполняемой операции (0 — запретить обработку прерываний, 1 — разрешить обработку прерываний, 2 — удалить обработчик прерываний);

•       в пару регистров ES:DI — дальний указатель на обработчик прерываний;

•       в BL — адрес устройства (биты 0-3 задают номер порта мультиплексора, биты 4-7 — номер устройства в цепочке).

После выполнения функция возвращает в регистре АН код ошибки. Перед вызовом обработчика прерывания запрещаются. Обработчик не должен выполнять захват устройства, так как эта операция уже осуществлена драйвером. При выходе из обработчика нужно отправить инструкцию EOI контроллеру прерываний. Выход должен осуществляться при помощи инструкции IRET.

Переход по вектору ЕРР, функция 12h: режим реального времени

Функция Real Time Mode настраивает драйвер для работы в режиме реального времени. С помощью данной функции можно определить наличие устройств, требующих использования режима реального времени: если таких устройств нет, драйвер может передавать данные большими блоками; в противном случае должны использоваться маленькие блоки.

Перед вызовом функции требуется поместить в регистры следующую информацию:

•           в АН — значение 12h;

•       в AL — код выполняемой операции (0 — проверить наличие устройств, работающих в режиме реального времени; 1 — проинформировать драйвер о наличии устройства реального времени; 2 — сбросить флаг реального времени).

После выполнения функция возвращает в регистре АН код ошибки. При выполнении поиска устройств, работающих в режиме реального времени (код операции 0) в регистре AL будет возращен результат поиска (0 — устройства реального времени не обнаружены, 1 — найдено одно или несколько устройств).

Переход по вектору ЕРР, функция 40h: опросить мультиплексор

Функция Query Mux позволяет получить информацию о мультиплексоре, подключенном к указанному порту.

Перед вызовом функции требуется записать в регистры следующую информацию:

•           в АН — значение 40h;

•           в DL — номер параллельного порта.

После выполнения функции в регистрах находится следующая информация:

•           в АН — код ошибки;

•       в AL — флаги состояния (бит 0 — захват канала, бит 1 — наличие обработчика прерываний);

•           в BL — номер выбранного (активного) порта мультиплексора;

•            в ВН — номер версии драйвера мультиплексора;

•       в паре регистров ES.DI — указатель на ASCIIZ-строку, идентифицирующую разработчика драйвера.

Переход по вектору ЕРР, функция 41 h: опросить устройство

Функция Query Device Port позволяет получить информацию об устройстве с заданным адресом, подключенном к указанному порту. Перед вызовом функции требуется записать в регистры следующую информацию:

•           в АН — значение 4lh;

•           в DL — номер параллельного порта;

•       в BL — адрес устройства (биты 0-3 задают номер порта мультиплексора, биты 4-7 — номер устройства в цепочке).

После выполнения функции в регистрах находится следующая информация:

•           в АН — код ошибки;

•       в AL — флаги состояния (бит 0 — выбор порта, бит 1 — захват порта, бит 2 — прерывания разрешены, бит 3 — наличие обработчика прерываний);

•       в СХ — идентификатор устройства (ноль, если устройство не определено).

Переход по вектору ЕРР, функция 42h: задать идентификатор устройства

Функция Set Product ID позволяет задать идентификатор для устройства, которое не поддерживает циклы чтения адреса или не способно выдать собственный идентификатор.

Перед вызовом функции требуется записать в регистры следующую информацию:

•           в АН — значение 42h;

•           в DL — номер параллельного порта;

•       в BL — адрес устройства (биты 0-3 задают номер порта мультиплексора, биты 4-7 — номер устройства в цепочке);

•           в СХ — идентификатор для устройства.

После выполнения функция возвращает в регистре АН код ошибки.

Переход по вектору ЕРР, функция 50h: повторное сканирование цепочки устройств

Функция Rescan Daisy Chain Product используется для динамического перераспределения номеров портов между устройствами, соединенными в цепочку.

Перед вызовом функции требуется записать в регистры следующую информацию:

•           в АН — значение 50h;

•           в DL — номер параллельного порта;

•       в BL — номер порта мультиплексора (допускается использование номеров от 1 до 8; ноль означает отсутствие мультиплексора).

После выполнения функция возвращает в регистре АН код ошибки. •

Переход по вектору ЕРР, функция 51 h: задать идентификатор устройства

Функция Query Daisy Chain позволяет получить информацию о цепочке устройств, подключенной к указанному порту. Перед вызовом функции требуется записать в регистры следующую информацию:

•           в АН — значение 51h;

•           в DL — номер параллельного порта.

После выполнения функции в регистрах находится следующая информация:

•           в АН — код ошибки;

•       в AL — флаги состояния (бит 0 — признак захвата канала, 1 — признак наличия обработчика прерываний);

•           в BL — номер выбранного устройства;

•           в CL — количество устройств в цепочке (0 — нет цепочки);

•       в паре регистров ES.DI — указатель на ASCIIZ-строку, идентифицирующую разработчика драйвера.

Коды ошибок ЕРР BIOS

Значение кода ошибки, возвращаемого функциями ЕРР BIOS в регистре АН, расшифровывается следующим образом:

•           OOh — успешное завершение операции, ошибок нет;

•           Olh — тайм-аут;

•           02h — команда или операция не поддерживаются ЕРР BIOS;

•           03h — некорректный адрес порта устройства;

•           04h — ЕРР BIOS занята (BIOS не является реентерабельным);

•           05h — некорректный параметр;

•           10h — мультиплексор уже заблокирован (захвачен);

•           20h — мультиплексор отсутствует;

•       40h — программа обслуживания (менеджер) цепочки или мультиплексора не установлена;

•           41h — порт устройства заблокирован (захвачен);

•           42h — порт устройства не был заблокирован;

•           43h — ошибка блокировки (некорректный адрес порта).

Использование ЕРР BIOS при работе с принтерами

К сожалению, дополнительный набор функций BIOS, который мы рассмотрим ниже, появился со значительным опозданием и до сих пор не поддерживается многими изготовителями системных плат. Кроме того, этот набор, как явствует из его названия, ориентирован на использование режима ЕРР, который практически не поддерживается изготовителями принтеров.

При работе с принтерами реальную пользу могут принести только головная функция, позволяющая проверить наличие ЕРР BIOS и получить вектор ЕРР, и функция для установки режима работы контроллера параллельного порта. Функция установки режима представляет особый интерес, так как позволяет задать нужный режим работы контроллера прямо из прикладной программы (до появления

ЕРР BIOS операцию выбора режима можно было осуществить только в процессе начальной загрузки компьютера, через BIOS Setup). Все остальные функции ЕРР BIOS при работе с принтером могут пригодиться только в том случае, если принтер подключен к компьютеру через автоматический мультиплексор. В России, однако, такие мультиплексоры используются крайне редко вследствие относительного дефицита периферийного оборудования (на один системный блок редко приходится более одного принтера, а со сканером и внешним дисководом принтер обычно объединяют в цепочку, без мультиплексора).

В листинге 7.2 приведен пример программы, которая использует функцию установки режима работы ЕРР BIOS для переключения контроллера параллельного порта в режим ЕСР.

Листинг 7.2. Программа для проверки наличия ЕРР BIOS и переключения порта LPT1 в режим ЕСР

IDEAL

Р386

LOCALS

MODEL MEDIUM

; Подключить файл мнемонических обозначений

; кодов управляющих клавиш и цветовых кодов

Include "listJ._03.inc"

; Подключить файл макросов

Include "listl_04.inc"

DATASEG

; Вектор точки входа ЕРР BIOS label EPPVector DWORD EPPOffset DW ? EPPSegment DW ?

; Конфигурация порта EPP InterruptLevel

DB ? BIOS Revision

DB ? IO_Capabilities

DB ? IO_BaseAddress DW ? label EPPManufacturer DWORD Manuf Offset DW ? Manuf_Segment DW ? : Режим работы параллельного порта OperationMode

DB ?

; Текстовые сообщения

AnyK

DB YELLOW,24.29,"Нажмите любую клавишу".О Txtl

DB LIGHTCYAN,0,28,"ТЕСТИРОВАНИЕ ЕРР BIDS",О Txt2

DB 2,23."Вектор ЕРР BIOS: :",0

Листинг 7.2(продолжение)

DB 3,8,"Номер используемого прерывания:",0

DB 4,17."Номер версии ЕРР BIOS:".0

DB 5,14,"Возможности ввода-вывода:",0

DB 6,3,"Базовый адрес блока регистров порта:",0

DB 8,0,"Разработчик BIOS:",0 ECPV

DB LIGHTCYAN,12,26."Порт переключен в режин ЕСР",0 ECPN

DB LIGHTRED.12,22,"Режим ЕСР не поддерживается портом",0 Errl

DB 12,22,"ЕРР BIOS не поддерживается системой",0 ENDS

SEGMENT sseg para stack ‘STACK’

DB 400h DUP(?)

ENDS CODESEG

;* Основной модуль программы * ;******к кк к*******************

PROC EPP_BIOS_Test

mov AX.OGROUP

mov DS.AX

mov [CS:MainDataSeg],AX

; Установить текстовый режим и очистить экран

mov АХ,3 Int 10h

; Скрыть курсор • убрать за нижнюю границу экрана

mov [ScreenString],25

mov [ScreenColumn],0 call SetCursorPosition : Вывести текстовые сообщения на экран

mov SI.offset Txtl call ShowColorString

mov SI,offset AnyK call ShowColorString

; Инициализация EPP

mov AH,2

mov DX.O

mov AL.O

mov CH,’E’

mov BX,"PP" int 17h

; Проверка наличия EPP BIOS or AH,AH jnz

@@No_EPP cmp AL.’E’ jne

@@No_EPP cmp CX,"PP" jne

@@No_EPP

; Сохранение вектора точки входа ЕРР BIOS

mov [EPPOffset] ,ВХ

mov [EPP_Segment].DX : Вывести наименования параметров

mov [TextColorAndBackground],LIGHTGREEN MShowText 6,Txt2

mov [TextColorAndBackground].WHITE

; Вывести вектор точки входа ЕРР BIOS на экран MShowHexWord 2,40.[EPP_Segment] MShowHexWord 2.45,[EPPOffset]

; Определить конфигурацию порта ЕРР push ES

mov АН,О

mov OL.O call [Epp_Vector] : Сохранить параметры настройки порта

mov [InterruptLevel],AL

mov [BIOS_Revision],BH

mov [IOCapabilities] ,BL

mov [ IOBa seAdd res s], CX

mov [Manuf_Offset],DI

mov AX,ES

mov [Manuf_Segroent],AX pop ES

; Вывести значения параметров

MShowHexByte 3,40,[InterruptLevel] MShowHexByte 4,40,[BIOS_Revision] MShowBinByte 5.40.[lO Capabi 1 itiesj MShowHexWord 6,40.[IO_BaseAddress]

; Вывести имя разработчика BIOS pusha

push DS push ES

mov AX,0B800h

mov ES.AX

; Задать позицию строки в видеопамяти

mov DI,160*8 + 18*2

; Использовать цвет, заданный по умолчанию

mov АН,[TextColorAndBackground] : Установить указатель на начало ASCIIZ-строки

mov SI,[Manuf_Offset]

mov ВХ,[Manuf_Segment]

mov DS.BX

mov CX.62 юграничитель длины строки ePNextChar: lodsb

and AL.AL :конец строки?

jz PPZero

stosw

loop PPNextChar

@@Zero: pop ES

Листинг 7.2(продолжение)

pop DS popa

: Переключить порт в режим ЕСР

mov АН,1

mov DL.0

mov AL,1000b cal1 [EppJ/ector]

; Операция выполнена? cmp AH,0

jne

@@ECP_Not_Supported MShowColorString ECPY ;режим ЕСР установлен jmp

@@End aaECPNotSupported:

MShowColorString ECPN ;режии ЕСР не установлен

PPEnd: callGetChar

; Переустановить текстовый режим

movах.З

int10h

; Выход в DOS

movAH,4Ch

int21h

; Сообщения об ошибках <a@No_EPP:

MFatalError Errl

; отсутствует EPP BIOS ENDP EPPBIOSJTest ENDS

; Подключить процедуры вывода данных на экран

Include "listl_02.inc"

END

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии