Главная » Ассемблер, Железо » Непосредственная работа с регистрами параллельного порта в режиме SPP

0

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

для подключения принтера. В большинстве случаев этого порта достаточно, но при необходимости можно установить дополнительный контроллер для работы с устройством LPT2 в один из разъемов расширения. По традиции принято, что устройство LPT1 может вырабатывать запрос на прерывание IRQ7 (Int OFh), а устройство LPT2 — IRQ5 (Int ODh), однако BIOS SETUP современных системных плат позволяет запретить эти прерывания или переопределить их на другие. Со времени разработки компьютеров серии IBM PC конструкция параллельного порта претерпела существенные изменения, однако, с целью обеспечения совместимости со старым программным обеспечением, после включения питания компьютера и выполнения процесса начальной загрузки контроллер порта будет настроен на режим совместимости (Compatibility Mode) стандартного порта. Стандартный параллельный порт (Standard Parallel Port, сокращенно SPP) имеет три регистра, расположенные в пространстве ввода- вывода последовательно, друг за другом. Адреса регистров для портов LPT1 и LPT2 перечислены в табл. 7.1.

Таблица 7.1. Регистры интерфейса параллельной передачи данных

Адрес регистра

 

Назначение регистра

Устройство LPT1

Устройство LPT2

 

378h

27 8h

Регистр данных

379h

279h

Регистр состояния

37 Ah

27 Ah

Регистр управления

Рассмотрим указанные регистры более подробно. Регистр данных (порт 378h для LPT1, порт 278h для LPT2) доступен для выполнения операций записи и считывания, применяется в основном для вывода информации на принтер.

Регистр состояния (порт 379h для LPT1, порт 279h для LPT2), формат которого показан на рис. 7.2, доступен только для чтения. Назначение разрядов регистра следующее:

•      биты 0-2 — не используются, установлены в 0;

•      бит 3 — признак ошибки ввода-вывода (0 — ошибка, 1 — нет ошибки);

•     бит 4 — признак выбора принтера (0 — принтер в автономном режиме, 1 — принтер в режиме подключения);

•     бит 5 — контроль наличия бумаги (0 — бумага вставлена, 1 — нет бумаги);

•       бит б — подтверждение приема (0 — подтверждение приема символа, 1 — обычное состояние);

•       бит 7 — признак занятости принтера (0 — принтер занят, 1 — принтер свободен).

Рис. 7.2. Формат регистра состояния принтера

Регистр управления принтером (порт 37Ah для LPT1, порт 27Ah для

LPT2), формат которого показан на рис. 7.3, доступен для записи

и считывания. Назначение разрядов регистра управления:

•       бит 0 — строб данных (0 — обычное состояние, 1 — выполнить вывод байта данных на принтер);

•       бит 1 — автоматический перевод строки после возврата каретки;

•       бит 2 — сброс принтера (0 — выполнить сброс принтера, 1 — обычное состояние);

•       бит 3 — выбор принтера (0 — отмена выбора принтера, 1 — обычное состояние);

•       бит 4 — разрешение прерывания от принтера (0 — прерывание запрещено, 1 — разрешено);

•       биты 5-7 — не используются, установлены в 0.

Рис. 7.3. Формат регистра управления принтером

Процесс передачи байта данных

Для передачи одного байта данных необходимо выполнить следующие операции:

1.     поместить передаваемый байт в регистр данных;

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

3.     загрузить в регистр управления значение ODh (установка в 1 младшего разряда регистра управления формирует сигнал стро- бирования данных);

4.     ожидать поступления сигнала подтверждения приема данных (когда данные приняты, бит 6 регистра состояния сбрасывается в 0). Цикл ожидания должен быть ограничен по времени;

5.     загрузить в регистр управления значение ОСЬ (в результате чего сигнал стробирования снимается).

Например, для параллельного порта LPT1, имеющего базовый адрес 378h, программный код передачи байта будет выглядеть следующим образом:

; Загрузить символ в регистр данных

mov DX.378h ;DX адресует регистр данных

mov AL.AH out DX.AL : Проверить состояние принтера

inc DX ;DX адресует регистр состояния xor СХ.СХ выполнить 65536 циклов опроса

@@Busy: in AL.DX

test AL,80h проверить бит готовности jnz

@@Strl loop

@@Busy

; Интервал ожидания исчерпан, ошибка передачи jmp

@@Error

; Подать сигнал стробирования

@@Strl:

inc DX ;DX адресует регистр управления

mov AL.ODh out DX.AL

; Ожидать поступление сигнала подтверждения

dec DX ;DX адресует регистр состояния

mov CX.1000 №Jait: in AL.DX

test AL,40h проверить бит подтверждения jnz

@@StrO loop

@@Wait : Снять сигнал стробирования

@@StrO:

inc DX :DX адресует регистр управления

mov AL.OCh out DX.AL

ПРИМЕЧАНИЕ

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

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

По теме:

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