Главная » Ассемблер, Железо » Работа контроллера параллельного порта в режиме ЕСР

0

Спецификация ЕСР была разработана фирмами Microsoft и Hewlett- Packard. Она предусматривает введение в контроллер параллельного порта дополнительного блока регистров, изменение назначения стандартных регистров и использование специальных протоколов, увеличивающих скорость передачи данных более чем на порядок (со 1- 50 Кбайт/с в режиме SPP до 2-5 Мбайт/с в режиме ЕСР).

Регистры контроллера параллельного порта в режиме ЕСР

Перечень регистров параллельного порта для режима ЕСР приведен в табл. 7.2. В графе «Доступ» используются следующие обозначения:

•           R/W — регистр доступен для чтения и записи данных,

•           R — регистр доступен только для чтения.

Таблица 7.2. Регистры ЕСР

Мнемоника

Смещение

Доступ

Режимы ЕСР

Наименование

Data

OOOh

R/W

ООО, 001

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

EcpAFifo

OOOh

R/W

011

Регистр очереди адресов ЕСР

Dsr

001 h

R

Все

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

Dcr

002h

R/W

Все

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

CFifo

400h

R/W

010

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

EcpDFifo

400h

R/W

011

Регистр очереди данных ЕСР

TFifo

400h

R/W

110

Регистр тестирования очереди

CnfgA

400h

R

111

Конфигурационный регистр А

CnfgB

401 h

R/W

111

Конфигурационный регистр В

Ecr

402h

R/W

Все

Дополнительный регистр управления

Регистр данных SPP (Parallel port Data Register, сокращенно data) имеет смещение OOOh и используется в режимах ООО и 001, обеспечивающих совместимость со стандартным режимом работы параллельного порта — SPP.

Регистр очереди адресов ЕСР (ЕСР Address FIFO, сокращенно ecpAFifo) имеет смещение OOOh и используется только в режиме 011. Байт данных, записанный в регистр ecpAFifo, помещается в очередь FIFO и трактуется либо как адрес, либо как код повторения RLE. Регистр ecpAFi fo имеет следующую структуру:

•     биты 0-6 — адрес или код повторения RLE;

•     бит 7 — тип данных, записанных в битах 0-6 (0 — код RLE, 1 — адрес ЕСР).

1

Регистр состояния (Device Status Register, сокращенно dsr), формат которого показан на рис. 7.4, доступен только для чтения и имеет смещение OOlh. Его структура идентична структуре регистра состояния стандартного параллельного порта (только для разрядов используются иные мнемонические обозначения):

•     биты 0-2 зарезервированы, и их значение при считывании не стандартизировано, поэтому их следует игнорировать;

•     бит 3 — признак отсутствия ошибки (в стандарте ЕСР обозначается как nFault);

•     бит 4 — признак выбора принтера (в стандарте ЕСР обозначается как Select);

•     бит 5 — контроль наличия бумаги (в стандарте ЕСР обозначается как PError);

•     бит 6 — подтверждение приема (в стандарте ЕСР обозначается как nAck);

Регистр управления (Device Control Register, сокращенно dcr), формат которого показан на рис. 7.5, имеет смещение 002h и доступен как чтения, так и для записи. Его структура аналогична структуре

•     бит 7 — признак занятости принтера (в стандарте ЕСР обозначается как nBusy).

Рис. 7.4. Формат регистра состояния dsr

регистра управления стандартного параллельного порта (за исключением пятого бита):

•     бит 0 — строб данных (в стандарте ЕСР обозначается как strobe);

•     бит 1 — автоматический перевод строки (в стандарте ЕСР обозначается как autofd);

•     бит 2 — сброс принтера (в стандарте ЕСР обозначается как nlni t);

•     бит 3 — выбор принтера (в стандарте ЕСР обозначается как Se- lectln);

•     бит 4 — разрешение прерывания при переходе сигнала nAsk из О в 1 (в стандарте ЕСР обозначается как acklntEn);

•     бит 5 — направление передачи данных (в стандарте ЕСР обозначается как direction);

•     биты 6 и 7 зарезервированы.

Бит Direction регистра управления задает направление передачи

данных:

•     0 — вывод данных, выходные усилители на линиях данных активны;

•      1 — вывод данных, выходные усилители на линиях данных отключены.

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

Переключение бита direction в состояние 1 возможно только в режиме 001. В режимах ООО и 010 возможен только вывод данных, и значение бита di recti on игнорируется.

Регистр очереди данных SPP (Parallel Port Data FIFO, сокращенно cFi fo) имеет смещение 400h и используется только в режиме 010. Регистр доступен как чтения, так и для записи, однако очередь работает только на вывод данных. Запись данных в регистр может осуществляться процессором или контроллером DMA. Следует отметить, что при работе со встроенным параллельным портом чипсеты системных плат допускают использование только 8-разрядного режима DMA.

Регистр очереди данных ЕСР (ЕСР Data FIFO, сокращенно ecpDFi fo) имеет смещение 400h и используется только в режиме 011. Регистр доступен как чтения, так и для записи. Операции чтения и записи данных могут выполняться процессором или контроллером DMA (разрешен только 8-разрядный режим). Перед началом передачи данных бит di recti on регистра управления должен быть сброшен в О, а перед началом приема — установлен в 1.

Регистр тестирования очереди (Test FIFO Mode, сокращенно tFi fo) имеет смещение 400h и используется только в режиме 110. Регистр доступен как чтения, так и для записи. Операции чтения и записи данных могут выполняться процессором или контроллером DMA (разрешен только 8-разрядный режим).

Конфигурационный регистр A (Configuration Register А, сокращенно cnfgA) имеет смещение 400h, используется только в режиме 111, доступен только для чтения и содержит константу 10h (встроенный параллельный порт системной платы имитирует работу 8-разрядной шины ISA).

Конфигурационный регистр В (Configuration Register В, сокращенно cnfgB) имеет смещение 401h, используется только в режиме 111 и доступен только для чтения. Разряды регистра cnfgB имеют следующее назначение:

•     биты 0-5 зарезервированы (содержат нули);

•     бит б — признак наличия конфликта, связанного с использованием линии IRQ ISA (данный бит доступен только для чтения);

•     бит 7 — управление аппаратным сжатием данных (у встроенного параллельного порта системной платы бит 7 доступен только для чтения и всегда сброшен в ноль — аппаратная компрессия не поддерживается).

Рис. 7.6. Формат дополнительного регистра управления ecr

Дополнительный регистр управления (Extended Control Register, сокращенно ecr), формат которого показан на рис. 7.6, имеет смещение 402h и доступен для чтения и записи во всех режимах работы контроллера ЕСР. Разряды регистра ecr имеют следующее назначение:

•     бит 0 (empty) — признак освобождения очереди (0 — очередь пуста, 1 — очередь содержит по крайней мере один байт данных);

•     бит 1 (full) — признак отсутствия свободного места в очереди (0 — в очереди есть место по крайней мере для одного байта данных; 1 — очередь заполнена);

•       бит 2 (servicelntr) — блокировка служебных прерываний (0 — прерывания разрешены, 1 — запрещено использование DMA и обслуживание прерываний);

•       бит 3 (dmaEn) — управление режимом DMA (0 — использование DMA запрещено, 1 — использование DMA разрешено при условии servicelntr = 0);

•       бит 4 (пЕггIntEn) — блокировка обслуживания прерывания по сигналу nFault (0 — разрешено прерывание при переходе сигнала nFault с высокого уровня на низкий, 1 — прерывание отnFault запрещено);

•       биты 5-7 — код режима работы контроллера ЕСР (табл. 7.3).

Таблица 7.3. Режимы работы контроллера ЕСР

Код

Режим работы контроллера

ООО

Режим SPP. Контроллер передает данные в стандартном режиме

 

параллельного порта, бит direction регистра управления

 

игнорируется, очередь данных не используется (очищается)

001

Режим параллельного порта PS/2. Кроме передачи данных

 

в стандартном режиме, возможно осуществление приема

 

информации с линий данных, когда бит direction регистра управления

 

установлен в 1

010

Режим параллельного порта с очередью данных. Контроллер передает

 

данные в стандартном режиме параллельного порта, однако,

 

в отличие от режима 000, данные должны записываться процессором

 

или контроллером DMA не в регистр data, а в регистр cFifo

011

Режим ЕСР. При выводе данных (бит direction регистра управления

 

сброшен в 0) информация, записываемая в регистры ecpDFifo

 

и ecpAFifo, заносится в общую очередь и передается автоматически

 

под управлением контроллера ЕСР. При выполнении чтения

 

(бит direction установлен в 1) информация из очереди данных

 

считывается через регистр ecpDFifo

100

Режим ЕРР

110

Режим тестирования очереди данных. Информация может

 

записываться в очередь или считываться из нее, но на выходные

 

линии данных параллельного порта она не выдается

111

Режим конфигурирования контроллера. В этом режиме регистры

 

cnfgA и cnfgB доступны для чтения и записи данных (у встроенного

 

порта системной платы — только для чтения)

Управление работой контроллера ЕСР

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

Контроллер ЕСР генерирует прерывания в следующих случаях:

•       servicelntr = 0, dmaEn = 1, завершена прямая передача данных (счетчик DMA достиг конечного значения);

•       servicelntr = 0, dmaEn = 0, di recti on = 0 и имеется свободное место в очереди данных;

•       servicelntr = 0, dmaEn = 0, direction = 1 ив очереди имеется по крайней мере один байт данных;

•       nErrlntEn = 0 и сигнал nFault переключился с высокого уровня на низкий;

•       при переключении бита nErrlntEn из 1 в 0, если сигнал nFault имеет на низкий уровень;

•           acklntEn = 1 и сигнал nAsk переходит из 0 в 1.

Переключение режимов работы контроллера ЕСР осуществляется программным обеспечением через дополнительный регистр управления есг. При установке направления передачи данных используется также бит direction регистра управления dcr.

Из режимов ООО и 001 контроллер можно сразу переключить в любой другой режим. Если контроллер находится в одном из режимов 010-111, то его можно переключить только в режим ООО или режим 001; для переключения в другие режимы необходимо вначале переключиться в режим 000 или 001. Переключение бита di recti on в регистре управления может производиться только в режиме 001. Перед переключением режима необходимо убедиться, что в очереди FIFO нет данных (очередь пуста).

Перед началом использования любого режима передачи данных, отличного от стандартного режима SPP, программное обеспечение должно выполнить процедуру переговоров (negotiation) с периферийным устройством для согласования режима работы. Согласование осуществляется в соответствии со стандартом IEEE 1284.1 [61].

ВНИМАНИЕ

Переговоры с периферийным устройством могут выполняться только в режимах ООО и 001 контроллера ЕСР.

После завершения процедуры согласования режима необходимо инициализировать регистр управления dcr, загрузив в него код OCh: strobe = 0, autofd = 0, nlnit = 1, Selectln = 1, acklntEn = 0, direction = 0. Далее производится установка режима ЕСР путем загрузки кода 74h в дополнительный регистр управления есг.

Процедура переговоров

Для того чтобы между контроллером параллельного порта и периферийным устройством была возможна передача данных, режимы работы контроллера и устройства должны быть согласованы друг с другом.

Стандарт IEEE 1284.1 предусматривает определенный порядок переключения периферийных устройств (в том числе — принтеров) из стандартного режима SPP в другие режимы передачи данных, а также порядок возврата в стандартный режим передачи. Процедуры переговоров для разных режимов различаются между собой. Ниже мы будем рассматривать только процедуру переключения устройства в режим ЕСР и процедуру возврата в режим SPP из режима ЕСР.

Стандарт IEEE 1284.1 рассматривает различные протоколы передачи данных с точки зрения сигналов на линиях связи, но для программиста такой подход неудобен, так как некоторые сигналы представлены в регистрах контроллера порта в инверсной форме. Во избежание путаницы с обозначением сигналов на линиях кабеля и в регистрах контроллера процедуру переговоров будем рассматривать с точки зрения программиста, работающего с регистрами порта.

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

1.     Установить режим передачи SPP, загрузив в дополнительный регистр управления код 14h (прерывания блокированы, использование DMA запрещено, прерывание по сигналу nFault запрещено, режим работы — SPP).

2.     Загрузить в регистр данных код режима ЕСР — значение 10h.

3.     Загрузить в регистр управления код OCh (strobe = 0, autofd = О, nlmt = 1, Selectln = 1).

4.     Вставить задержку на один тик системного таймера (0,05 с).

5.     Проверить готовность принтера к работе (биты Sel ect и nBusy в регистре состояния должны быть установлены в 1).

6.     Начать фазу переговоров, загрузив в регистр управления код 06h (strobe = 0, autofd = 1, nlnit = 1, Selectln = 0).

7.     Вставить задержку на один тик системного таймера.

8.     Проверить наличие в регистре состояния следующей комбинации сигналов: nFault = 1, Select = 1, Perror = 1, nAsk = 0 (любая другая комбинация значений указывает на то, что принтер не соответствует стандарту IEEE 1284.1).

9. Загрузить в регистр управления код 07h (strobe = 1, autofd = 1, nlmt = 1, Selectln = 0).

10. Вставить задержку на одну микросекунду.

И. Загрузить в регистр управления код 04h (strobe = 0, autofd = О, nlnit = 1, Selectln = 0).

12.  Вставить задержку на один тик системного таймера.

13.  Проверить наличие в регистре состояния следующей комбинации сигналов: Select = 1, Perror = 0, nAsk = 1 (любая другая комбинация значений указывает на то, что принтер не поддерживает режим ЕСР).

14.  Начать фазу установки, загрузив в регистр управления код 06h (strobe = 0, autofd = 1, nlmt = 1, Selectln = 0).

15.  Вставить задержку на один тик системного таймера.

16.  Проверить значение бита PError в регистре состояния (если он не установлен в 1, произошел сбой).

17.  Установить для контроллера порта режим ЕСР, загрузив в дополнительный регистр управления код 74h.

18.  Установить нулевой адрес канала, загрузив в регистр данных значение 0.

Если все перечисленные операции выполнены успешно, принтер готов к приему данных в режиме ЕСР.

ПРИМЕЧАНИЕ

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

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

1.     Установить для контроллера порта режим SPP, загрузив в дополнительный регистр управления код 14h.

2.     Загрузить в регистр управления код OCh (strobe = 0, autofd = 0, nlmt = 1, Selectln = 1).

3.         Вставить задержку на один тик системного таймера.

4.     Проверить наличие в регистре состояния следующей комбинации сигналов: nFault = 1, Select = 0, nAsk = 0, nBusy = 0 (любая другая комбинация означает сбой в работе принтера).

5.     Загрузить в регистр управления код OEh (strobe = 0, autofd = 1, nlnit = 1, Select In = 1).

6.         Вставить задержку на один тик системного таймера.

7.     Проверить значение бита nAsk в регистре состояния (если он не установлен в 1, произошел сбой).

8.     Загрузить в регистр управления код OCh (strobe = 0, autofd = О, nlnit = 1, Selectln = 1).

Передача данных в режиме ЕСР

Существует три способа передачи данных в режиме ЕСР:

•           программно-управляемая передача данных;

•           передача данных по прерываниям;

•           передача данных в режиме DMA.

Режим программно-управляемой передачи самый простой и самый неэффективный, так как требует постоянного контроля состояния очереди данных. Все процессорное время в этом случае тратится на управление передачей, причем большая часть расходуется на опрос регистра есг.

Возможно несколько вариантов реализации программной передачи.

1.     Процессор ожидает полного освобождения очереди и загружает в нее один байт данных.

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

3.     Процессор ожидает полного освобождения очереди и загружает в нее сразу 16 байт данных.

Режим передачи по прерываниям позволяет освободить процессор от необходимости постоянно контролировать состояние очереди данных. Чтобы начать передачу данных по прерываниям, нужно настроить соответствующий порту вектор прерывания на обработчик прерывания и сбросить в 0 бит блокировки служебных прерываний servicelntr в регистре есг. В режиме передачи прерывание генерируется в том случае, когда в очереди появляется свободное место; в режиме приема прерывание вырабатывается, когда в очереди имеется хотя бы один байт. Обработчик прерывания должен знать, в каком режиме работы (передачи или приема) находится порт в данный момент, и в соответствии с этим либо загружать байт в очередь, либо считывать байт из очереди.

Использование DMA — самый эффективный, но самый сложный (с точки зрения настройки) способ передачи данных. Подготовка к передаче в режиме DMA начинается с установки направления передачи. Далее следует настроить третий канал контроллера DMA, загрузив в него адрес буфера данных в оперативной памяти и количество передаваемых байтов. Затем нужно установить вектор прерывания от параллельного порта на обработчик прерывания по завершению передачи в режиме DMA. После этого нужно разрешить служебные прерывания и использование DMA, для чего следует сбросить в 0 бит блокировки служебных прерываний sem – celntr и установить в 1 бит управления режимом DMA dmaEn в регистре есг. Процесс передачи данных будет происходить без участия центрального процессора; когда передача данных будет завершена, следует запретить служебные прерывания и режим DMA.

Переключение направления передачи данных

Переключение направления передачи данных производится путем изменения значения бита di recti on в регистре управления. Переключение направления передачи, однако, разрешено только в режиме совместимости, поэтому контроллер должен быть временно переключен в режим 001. В этом режиме контроллер должен выполнить процедуру согласования направления передачи данных. Процесс передачи данных от компьютера к периферийному устройству в спецификации ЕСР называется фазой прямой передачи данных (Forward Phase), а процесс передачи от периферийного устройства к компьютеру — фазой обратной передачи (Reverse Phase). После установки режима ЕСР контроллер параллельного порта и периферийное устройство настроены на прямую передачу данных. Для переключения направления передачи с прямого на инверсное нужно выполнить перечисленные ниже операции.

1.     Загрузить в регистр управления код 06h (strobe = 0, autofd = 1, nlmt = 1, Select In = 0).

2.         Вставить задержку на одну микросекунду.

3.     Загрузить в регистр управления код 02h (strobe = 0, autofd = 1, nlmt = 0, Selectln = 0).

4.         Вставить задержку на один тик системного таймера.

5.     Проверить значение бита PError в регистре состояния (если он не сброшен в О, произошел сбой).

Для переключения направления передачи с инверсного на прямое

нужно выполнить указанные далее операции.

1.     Загрузить в регистр управления код 06h (strobe = 0, autofd = 1, nlmt = 1, Selectln = 0).

2.         Вставить задержку на один тик системного таймера.

3.     Проверить значение бита PError в регистре состояния (если он не установлен в 1, произошел сбой).

ПРИМЕЧАНИЕ

Использование инверсного режима связано с определеным риском и требует неукоснительного соблюдения правил перключения между прямым и инверсным режимом, указанных в стандарте IEEE 1284.1 и спецификации ЕСР. При нарушении порядка перключения параллельный порт компьютера и порт принтера могут одновременно оказаться в режиме передачи, что приведет к повреждению выходных усилителей портов.

Пример программы, которая выполняет переключение в режим ЕСР, передает на принтер строку символов, состоящую из заглавных латинских букв от А до Z, а затем выполняет возврат в режим SPP, приведен в листинге 7.3.

Листинг 7.3. Программа для проверки способности принтера работать в режиме ЕСР

IDEAL

Р386

LOCALS

MODEL MEDIUM

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

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

Include "listl_03.inc"

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

Include "listl_04.inc"

DATASEG

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

DB LIGHTCYAN.О,19

DB "ПЕЧАТЬ ТЕКСТА С ИСПОЛЬЗОВАНИЕМ РЕЖИМА ЕСР".О

AnyK

DB YELLOW,24,29,"Нажните любую клавишу".О

WPrn D8 YELLOW,12,26,"Ждите завершения печати …".О

Errl D8 12,25,"Порт находится не в режине ЕСР",О

Егг2 D8 12,27,"Принтер не готов к работе",О

ЕггЗ D8 12,21,"Режин ЕСР не поддерживается принтерон",0

ENDS

SEGMENT sseg para stack ‘STACK’

DB 400h DUP(?)

ENDS CODESEG

• A А А* А* А* А А ‘А ‘А’ Л А* А1 А ‘А ‘А’ А А’Аг ААг A A"A* A* A’A’A’ A A

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

PROC TestECPMode

mov AX.DGRDUP

mov DS.AX

mov [CS:Mai nDataSeg],AX

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

mov АХ.З int 10h

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

mov [ScreenString],25

mov [ScreenColumn],О call SetCursorPosition

; Проверить режин работы порта

mov DX,378h+402h in AL.DX cmp AL.OFFh

je

@@Errl

; Вывести текстовые сообщения на экран

mov SI,offset Txtl call ShowColorString

mov SI.offset WPrn call ShowColorString

; ПОДГОТОВИТЕЛЬНАЯ ФАЗА : Установить для порта режин SPP

mov DX,378h+402h

mov AL,00010100b out DX.AL

; Загрузить код режима ЕСР в регистр данных

mov DX,378h

mov AL.00010000b out DX.AL : Установить strobe в 0, AutoFeed в 0. Selectln в 1

mov DX,378h+2

mov AL.00001100b out DX.AL

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

callWait05s ;задержка на 0,05 с : Принтер готов к работе?

movDX.378h+l

inAL.DX

andAL,10010000b

cmpAL,10010000b

jne@@Err2

; ФАЗА ПЕРЕГОВОРОВ

: Установитьstrobe в 0. AutoFeed в 1, Selectln в 0

movDX.378h+2

movAL.00000110b

outDX.AL

callWait05s ;задержка на 0.05 с : Принтер соответствует стандарту IEEE 1284?

movDX,378h+l

inAL.DX

andAL,01111000b

cmpAL.00111000b

jne@@Err3

: Установитьstrobe в 1. AutoFeed в 1, Selectln в 0

movDX.378h+2

movAL.00000111b

outDX.AL

callWaitlus ;задержка на 1 икс

; Установитьstrobe в 0, AutoFeed в 0, Selectln в 0

movDX,378h+2

movAL.00000100b

outDX.AL

callWait05s -.задержка на 0,05 с : Принтер поддерживает режим ЕСР?

movDX,378h+l

inAL.DX

andAL.01110000b

cmpAL.01010000b

jne@@Err3

; ФАЗА УСТАНОВКИ

; Установитьstrobe в 0, AutoFeed в 1, Selectln в 0

movDX,37Bh+2

movAL,00000110b

outDX.AL

callWait05s ;задержка на 0.05 с

; Бит PErrorустановлен?

movDX,378h+l

inAL.DX

testAL.00100000b

jz@@Err3

: Установитьдля порта режим ЕСР

movDX,378h+402h

movAL,01110100b

outDX.AL

; Установка нулевого адреса канала

movDX,378h

movAL,0

outDX.AL

; ПЕРЕДАЧА ДАННЫХ НА ПРИНТЕР

; Печать строкисимволов (от А до Z)

movAL.’A’

@@OutNextChar:

callECP_0ut

incAL

cmpAL.’Z’

jbePGOutNextChar

movAL.ODh ;возврат каретки

callECP_0ut

movAL.OAh ;перевод строки

callECP_0ut

movAL.OCh ;перевод формата

callECP_Out

: Вывести текстовые сообщения на экран call ClearScreen

mov SI,offset Txtl call ShowColorString

mov SI.offset AnyK call ShowColorString

; Ожидать нажатия клавиши call GetChar

: ЗАВЕРШАЮЩАЯ ФАЗА

; Установитьдля порта режии SPP

movDX.378h+402h

movAL.00010100b

outDX.AL

; УстановитьSelectln в 1. AutoFeed в 0, strobe в 0

movDX.378h+2

movAL.00001100b

outDX.AL

callWaitOSs задержка на 0,05 с

; В регистре состояния присутствует комбинация

; nFault=l, Select=0, nAck=0. n8usy=0?

movDX,378h+l

1nAL.DX

andAL,11011000b

cmpAL.00001000b

jne@@Err3

; Установитьstrobe в 0, AutoFeed в 1. Selectln в 1

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

movDX,378h+2

movAL.00001110b

outDX.AL

callWait05s :задержка на 0,05 с

; В регистре состояния бит nAck=l?

movDX,378h+l

inAL.DX

testAL,01000000b

jz@@Err3

; Установить Selectln в 1, AutoFeed в 0. strobe в О

mov , DX,378h+2

movAL.00001100b

outDX,AL

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

mov ax,3 int lOh

; Выход в DOS

mov AH,4Ch int 21h

: Сообщения об ошибках

@@?rrl: MFatalError Errl ;порт не в режиме ЕСР

@@?rr2: MFatalError Err2 ;принтер не готов к работе

@@Err3: MFatalError ЕггЗ ;режин ЕСР не поддерживается ENDP TestECPMode

;* ПРОЦЕДУРА ДЛЯ ВЫВОДА БАЙТА ДАННЫХ В РЕЖИМЕ ЕСР * ;* Передаваемые параметры:*

;* AL – выводимый байт данных.*

PROC ECP_Out near push AX push DX

mov AH,AL : Ожидать очистки очереди данных ЕСР

mov DX,378h+402h

@@Wai t_FI FOEmpty:

in AL.DX and AL,00000001b jz

@@Wait_FIFO_Empty

; Загрузить байт данных в очередь sub DX,2

mov AL,AH out DX.AL pop DX pop AX

ret

ENDP ECPJJut

. kkkk-k-kirk-kk AAAAAAAA A k-k-kick-k-Mckick-k-klck-Mck-k к A A A A

;* ЗАДЕРЖКА НА ОДИН ТИК СИСТЕМНОГО ТАЙМЕРА *

PROC Wait05s near

pushES

pushEAX

movAX,0

movES.AX

movEAX,[ES:046Ch]

incEAX

@@Wait: cmpEAX.[ES:046Ch]

jae@@Wait

popEAX

popES ret

ENDP Wait05s

;* ЗАДЕРЖКА НА ОДНУ МИКРОСЕКУНДУ *

• A A "A"Jc A A A A ‘A"Jc "A"Jc AAA ‘A"Jc A A A A A A A ‘A’ A ‘Ap A A "A"Jc A A

PROC Waitlusnear push CX

movCX.1000

@@Wait: nop

loop 0@Wait

popCX ret

ENDP Waitlus

ENDS

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

include "listl_02.inc"

END

ПРИМЕЧАНИЕ

Пример из листинга 7.3 пригоден только для принтеров, поддерживающих текстовый режим печати. Перед запуском программы контроллер порта должен быть настроен на режим ЕСР. Если системная плата поддерживает EPP BIOS, можно выполнить переключение контроллера при помощи программы, приведенной в листинге 7.2. Если EPP BIOS не поддерживается, нужно переключить контроллер в режим ЕСР в процессе начальной загрузки компьютера, с помощью BIOS SETUP. Проверьте также базовый адрес набора регистров порта — пример рассчитан на использование стандартного адреса (378h).

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

По теме:

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