|
Чтобы подключить печатающее устройство
фирмы IBM или любое другое,
которое подключается через параллельный
интерфейса, вам нужен
адаптер параллельного печатающего
устройства (принтера). Этот
адаптер встроен в адаптер монохромного
дисплея и принтера. Если вы
используете адаптер цветного графического
монитора, то нужен
отдельный адаптер принтера. С точки зрения
интерфейса с печатающим
устройством, эти два адаптера идентичны,
за исключением адресов
ввода-вывода. Порты принтера на
монохромной плате имеют адреса от
3BCH до 3BEH, а отдельная плата принтера
имеет адреса от 378H до
37AH.
Адаптер принтера имеет два выводных порта
и один порт ввода.
Этот адаптер очень похож на микросхему
8255, используемую для
интерфейса клавиатуры. Фактически, сначала
в конструкции платы
печатающего устройства использовалась
микросхема 8255. Но фирма IBM
решила лучше делать адаптеры с раздельными
компонентами.
Выводной 8-битовый порт данных по адресу
3BCH или 378H передает
данные принтеру. Адаптер посылает
символьный код ASCII, помещаемый
вэтот порт, прямо в принтер. Второй порт
вывода, расположенный
по адресам 3BEH или 37AH, имеет 5 выводных
бит. В нем содержатся
управляющие сигналы для принтера; эти
линии управляют его работой и
инициализацией. В частности, бит 0
инициирует передачу данных в
принтер. Простая запись данных в порт
вывода данных не означает
пересылку символа на принтер. Для того,
чтобы в него поступил
символ, нужно установить бит строба (бит 0
порта 3BEH или 37AH)
равным 1, а затем снова сбросить на 0. На
Фиг. 8.15 показана
короткая программа, передающая печатающему
устройству строку
символов. Подпрограмма с именем PRINT
обеспечивает сам процесс
передачи данных в принтер.
Обратите внимание, что процедура PRINT
читает код из вводного
порта (3BCH или 379H). Этот порт
возвращает информацию состояния
печатающего устройства программе. В данном
примере программа
проверяет состояние, чтобы выводить
следующий символ именно тогда,
когда принтер готов его принять. Бит 7
состояния порта ввода
показывает занятость принтера. Если этот
бит содержит 1, печатающее
устройство готово принимать следующий
символ для печати. В
противном случае программа должна
подождать. Остальные 4 вводных
бита этого порта отражают возможные ошибки
на печатающем
устройстве, например, отсутствие бумаги.
Наш пример не контролирует
эти ситуации. Техническое описание
содержит структуры вводных и
выводных портов платы адаптера печатающего
устройства.
Microsoft (R) Macro Assembler Version 5.001/1/80
04:05:39
Фиг. 8.15 Вывод на принтерPage1-1
PAGE
,132
TITLE
Фиг. 8.15 Вывод на принтер
0000 STACK SEGMENT STACK
00000040[ DW 64 DUP (?)
????
]
0080 STACK ENDS
= 0378 BASE EQU
378H
0000 CODE SEGMENT
ASSUMECS:CODE
000094 A8 A3 2E 20 38 2E MSG
DB 'Фиг. 8.15', 13, 10, '$'
31 35 0D 0A 24
000C MAIN PROC FAR
000C1E PUSH DS
; Адрес возврата
000D2B C0 SUB AX, AX
000F50 PUSH AX
00108D 1E 0000 R LEA BX, MSG
0014
PRINT_LOOP:
00142E: 8A 07 MOV AL, CS:[BX] ; Выбор
символа из строки для вывода
00173C 24 CMP AL, '$'; Конец
строки?
001974 06 JE MAIN_RETURN
001BE8 0022 R CALL PRINT ; Печать
символа
001E43 INC BX
001FEB F3 JMP PRINT_LOOP ; Переход к
следующему символу
0021
MAIN_RETURN:
0021CB RET
0022 MAIN ENDP
;-----Эта подпрограмма печатает символ в регистр AL
0022 PRINT PROC
NEAR
0022BA 0378 MOV DX, BASE ; Порт вывода данных на принтер
0025EE OUT DX,
AL ; Занесение символа в порт вывода на принтер
002642 INC DX ; Адрес порта состояния принтера
0027
WAIT_BUSY:
0027EC IN AL,
DX ; Опрос состояния принтера
0028A8 80 TEST AL, 80H ; Проверка разряда
занятости принтера
002A74 FB
JZ WAIT_BUSY ; Цикл до освобождения принтера
002C42 INC DX
002DB0 0D MOV AL, 0DH ; Установка
разряда готовности данных
002FEE OUT DX,
AL
0030B0 0C MOV AL, 0CH ; Сброс разряда
готовности данных
0032EE OUT DX,
AL
0033C3 RET
0034 PRINT ENDP
0034 CODE ENDS
END
MAIN
Фиг. 8.15 Вывод на принтер
Один из управляющих битов порта 3BEH (или
37AH) управляет
линией прерывания от печатающего
устройства. Для того, чтобы
печатающее устройство могло посылать свой
сигнал прерывания в
контроллер 8259, этот бит нужно установить
равным 1. Однако адаптер
печатающего устройства выдает неверный
сигнал прерывания, т.е.
выбранный для этой цели сигнал не вызывает
правильного прерывания.
Поэтому не стоит и пытаться писать
программу, которая бы
использовала возможности прерывания от
адаптера печатающего
устройства (если вы не захотите физически
изменить плату
печатающего устройства). Далее мы приведем
пример, который обходит
эту проблему с помощью системного таймера.
|