В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства
Учебное пособие. Таганрог: ТРТУ, 2001. - 536 с.
Приложение В. Проверочные задания, основные сведения и примеры программ
Параллельный порт. Принтер
2.1. Формулировка задания
Изучить
принцип работы печатающего устройства (ПУ). Написать программу на ассемблере,
осуществляющую вывод данных на печать с помощью портов адаптера (регистра
данных, регистра управления и состояния). Программа выполняет опрос флага
готовности ПУ (6 или 7 разряда порта состояния, адрес которого 379h) перед
выводом очередного символа на печать, предварительно размещенного в регистре
данных (378h) адаптера. Если ПУ готово принять символ (6 разряд (АСК) порта состояния
равен 0 или 7 разряд (BUSY) порта состояния равен 1), то программа
устанавливает разряд 0 (STR) регистра управления (37Ah), сигнал с выхода
которого осуществляет запись символа в ПУ. После чего единичное значение
разряда 0 регистра управления сбрасывается в исходное состояние. Данные,
выводимые на печать, могут быть заданы в программе, вводятся в буфер с помощью
клавиатуры с использованием соответствующего прерывания DOS или BIOS или
размещены в виде текстового файла на диске.
2.2. Основные сведения
В общем случае в ПК
предусматривается наличие трех параллельных портов (LPT1 - LPT3). Базовый
(начальный) адрес LPT1 хранится в области данных BIOS в ячейке 0040-0008: а для
LPT2 - в ячейке 0040-000A и т.д. Наиболее употребительным является базовый
адрес принтера, равный 378h, который соответствует регистру данных адаптера
принтера. Базовый адрес - это младший адрес из группы адресов (378h - 37Ah).
Регистру состояния адаптера принтера присвоен адрес 379h, а регистру управления
- адрес 37Ah. Форматы регистров состояния и управления имеют следующий вид.
Формат регистра состояния принтера:
Формат регистра управления принтером:
Рассмотрим протокол обмена данными между адаптером и
принтером. Байт данных помещается в регистр данных (порт 378h) адаптера, с
выходов которого он поступает в принтер. Затем устанавливается бит 0 (STR)
регистра управления (порт 37Ah) и тут же сбрасывается. Сигналом STR выполняется
запись байта данных во входной регистр принтера и формирование сигнала прерывания,
указывающего микропроцессору принтера, что его входной регистр полон.
После этого программа сканирует бит 7 или бит 6 регистра
состояния (порта 379h) с целью определить момент готовности принтера к приему
следующего байта данных. Принтер может не печатать сразу байт данных, а хранит
его в своем буфере до тех пор, пока не будет образована строка данных для
печати. Кроме того, вывод данных на печать можно организовать и с помощью
тайм-аута (определенного интервала времени), учитывающего задержку в готовности
принтера. Более эффективно процессорное время используется в режиме прерывания,
которое выполняется в том случае, если принтер готов принять очередной символ.
Тогда адаптер при наличии сигнала разрешения прерывания (бита D4=1 порта 37Ah)
формирует сигнал прерывания IRQ7, поступающий в контроллер прерывания.
Несмотря на простоту управления, принтер представляет собой
достаточно сложное устройство, имеющее свой микропроцессор, ПЗУ и ОЗУ.
Микропроцессор используется для обработки управляющих
последовательностей и управления печатью. ПЗУ содержит описание рисунков
символов в зависимости от их кода и выбранной таблицы и программы на языке
используемого микропроцессора. ОЗУ применяется для временного хранения
введенных данных и спроектированных пользователем символов. Ряд принтеров,
помимо интерфейса Centronics, могут подключаться и к последовательному
интерфейсу.
Принтер обрабатывает ряд спецсимволов (таких, как звонок,
забой, горизонтальная и вертикальная табуляция), а также имеет достаточно
сложную систему команд для изменения режимов работы и управления печатью.
Обычно
команды начинаются с символа ESC (шестнадцатеричный код 1Bh) и имеют длину от
двух байт и более (существуют командные последовательности, включающие по
несколько килобайт информации, например команды загрузки спроектированных
пользователем шрифтов). Спецсимволы и байты команд передаются принтеру так же,
как и обычные символы, предназначенные для печати, описанным выше способом.
Подобный
способ управления удобен для программного изменения режимов работы устройства.
Учитывая, что выпуском принтеров для ПК занимается достаточно большое число
компаний, и возможности принтеров постоянно совершенствуются, нет смысла
приводить полностью какую-либо систему команд, так как, во-первых, она в разных
марках и моделях принтеров различна, и, во-вторых, достаточно полно описывается
в документации на каждый конкретный принтер.
Существует
два основных стандарта на систему команд и таблицу используемых символов
(стандарты IBM и EPSON), которых в основном придерживаются фирмы-изготовители,
оставляя за собой право вносить в них изменения и дополнения. Единого стандарта
как на систему команд, так и на расположение и рисунки символов второй половины
таблицы ASCII (коды 129-255) нет. Наиболее часто используемые команды:
- установка вида шрифта и режима печати;
- черновой текстовый (draft), нормальной ширины (pica), узкий
(condensed) или средней ширины (elita),
- качественный шрифт (NLQ, Proportional,
Orator, Script и т. д.);
- выбор таблицы символов из ПЗУ (обычно имеется несколько
таблиц, отличающихся расположением управляющих кодов, наличием и расположением
псевдографических символов или курсива);
- загрузка в ОЗУ принтера спроектированных пользователем
шрифтов и работа с ОЗУ принтера (именно в этой группе команд имеются наибольшие
различия между разными моделями);
- управление принтером в режиме точечной графики;
- установка служебных параметров (размеры отступов, страницы,
шаг табуляции, расстояние между строками) и изменение характеристик (сброс,
включение/отключение датчика конца бумаги, печать в одну или в две стороны и
т.п.).
Ряд характеристик и режимов работы может выбираться как
программно, так и аппаратно с использованием кнопок и клавиш на лицевой панели
и DIP-переключателей. Существуют характеристики, изменить которые можно только
аппаратно (например, возможность загрузки шрифтов или размер используемого
ОЗУ).
В последних моделях ПК используется улучшенный параллельный
двунаправленный 8-разрядный порт (ЕРР), который реализует рутинные операции, а
процессор выполняет только передачу данных в буферную память ЕРР. Поэтому порт
ЕРР выполняет передачу быстрее (режим Fast Centronics), чем LPT-порт. Порт ЕРР
совместим с портом LPT и требует предварительной программной инициализации.
Другим
стандартом параллельного порта является порт с расширенными возможностями
(ЕСР), в котором сохранен режим Fast Centronics и реализованы новые функции, в
частности сжатие данных.
2.3. Пример выполнения варианта задания
Вариант задания: выводимый на печать текст хранится в
программе, для опроса готовности принтера используется бит 7 порта состояния и
команда проверки TEST.
В приведенной ниже программе сегмент стека с именем и типом
STACK используется для временного хранения содержимого регистров и для
обеспечения нормального возврата в систему по завершению программы. Под сегмент
стека резервируется 48 слов (96 байт). Адрес первой выполняемой команды
задается в операторе END в конце программы. Операторы вталкивания в стек
значения регистра DS и нулевого содержимого регистра АХ совместно с оператором
RET (в конце основной программы) предназначены для возврата в систему.
В начале
текста программы порту данных (РД), состояния и управления (РУ) адаптера ПУ
присвоены символические имена Data_Port, State_Port и Control_Port
соответственно.
Выводимая строка символов имеет начальный адрес OUTS. В конце
текстовой строки, заключенной в апострофы, следуют символы перевода строки,
возврата каретки и код 0, указывающий на окончание печати.
Основная программа имеет имя TEST. Первый выполняемый
оператор памяти обозначен меткой START. Индексный регистр SI устанавливается на
начало печатаемой строки. В регистр AL загружается байт из сегмента,
адресуемого регистром CS (сегмент PROGS) по адресу OUTS + SI (начальный адрес строки
+ смещение). Затем производится сравнение этого байта с нулем (знаком
завершения строки печатаемого текста). В случае неравенства вызывается
подпрограмма печати символа, наращивается на единицу содержимое SI и
выполняется переход на метку COIL (вызов очередного байта). Если очередной байт
равен нулю, то осуществляется выход в систему командой RET (метка FINITA).
Печать
одного символа реализована в виде отдельной процедуры с именем PRINT, которая
выполняет печать символа, содержащегося в регистре AL, для ввода-вывода
содержимого портов используется регистр DX. Прежде всего, в порт данных (РД)
выводится код печатаемого символа. Затем вводится содержимое порта состояния и
анализируется флаг готовности (АСК).
Если флаг готовности сброшен, то осуществляется циклический
переход на метку WAIT1 до тех пор, пока флаг готовности не станет равным 1.
После этого в порт управления (РУ) последовательно выводятся два управляющих
байта, в которых младший (нулевой) разряд вначале равен 1 (первый байт), а
затем равен 0 (второй байт), т.е. осуществляется запись содержимого РД адаптера
в регистр контроллера ПУ. Возврат в основную программу производится после того,
как символ напечатан.
При
использовании текстового редактора исходная программа заносится в файл под
именем L_PRN.ASM. Трансляция и компоновка осуществляется инструкциями:
masm L_PRN L_PRN
link L_PRN L_PRN
Текст программы
.model tiny
Data_Port equ 378h ; адрес порта данных
State_Port equ
379h ; адрес порта состояний
Control_Port equ
37Ah ; адрес порта управления
progr
segment
assume cs:progr,ds:progr
org
100h
Start:
Call testp
int 20h
outs1 db ' _____ This is a printer Test ____', 10,13,0
testp
proc near
push ds
xor ax, ax
push ax
mov si, 0
coil: mov
al, cs:outs1[si] ; чтение в AL выводимого байта
cmp al, 0 ; конец сообщения?
jz
finita ; переход на конец программы
call
print ; подпрограмма печати байта
inc
si ; следующий символ
jmp coil
finita:
pop ax
pop dx
ret
testp
endp
print
proc near
mov dx, Data_Port ; засылаем в DX адрес
порта данных
out dx,
al ; выводим в порт печатаемый символ
mov dx,
State_Port ; DX - адрес порта состояний
wait1:
in al, dx
test al,80h
jz wait1
mov dx, Control_Port
mov al, 0Dh
out dx, al ; установить strobe =1
mov al, 0Ch
out dx, al ; strobe = 0
ret
print
endp
progr
ends
end start
2.4. Требования к оформлению задания
Отчет по контрольному заданию должен содержать:
- вариант задания;
- блок-схему программы;
- программу на ассемблере с
комментариями;
- дискету с программой для
демонстрации ее работы.
2.5. Варианты заданий
Варианты заданий получаются из морфологического графа (рис.
1), содержащего три уровня: алгоритма, программы и данных, каждый из которых
имеет несколько вершин (1-4).
Рис.
1. Морфологический граф вариантов заданий
Маршрут в графе, включающий по
одной вершине из каждого уровня, образует вариант задания, например 1а-2п-3д.
Вершина 4 в каждом уровне введена для проявления творческой самостоятельности
студентов.
Уровень
алгоритма определяет опрос одного или нескольких битов порта состояния, например,
1а - опрос бита 7 или бита 6, 2а - опрос бита 7 или 5 (в случае отсутствия
бумаги вывести сообщение на экран), За - опрос бита 7 или 3 и т.д.
Уровень
программы показывает командную реализацию опроса битов состояния, например, 1П
- опрос с использованием команды проверки (TEST), 2П - команды AND, ЗП — команды
сравнения (СМР) и т.д.
Уровень
данных указывает на источник печатаемых символов, например:
1 д. - сообщение хранится в программе,
2 д. - вводится с клавиатуры (с отображением на экране или
без эхопечати),
3 д. - сообщение в виде текстового файла хранится на жестком
диске.
Приведенный текст программы 1 соответствует варианту
1а-1п-1д. Без учета вершины 4 морфологический граф дает 27 вариантов заданий.
Похожие материалы:
Параллельный интерфейс
Парадокс бережливости (Фролова Т.А.)
Парадокс Леонтьева
Параметрические и непараметрические гипотезы
Парафинировщик изделий (Выпуск №7 ЕТКС)
Парафинировщик керамических и фарфоровых изделий
|