В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства
Учебное пособие. Таганрог: ТРТУ, 2001. - 536 с.
Приложение В. Проверочные задания, основные сведения и примеры программ
Графический режим принтера. Символы псевдографики
4.1. Формулировка здания
Изучение принципа работы матричного принтера в графическом
режиме, назначение управляющих кодов (ESC – последовательностей) и спецификаций
печати (типа шрифта, шага печати и т.д.).
4.2. Основные сведения
Существует несколько систем управляющих кодов (УК), например,
Epson, IBM и т.д., которые в принтере могут устанавливаться с помощью
соответствующих переключателей. Однобайтовые УК используются из набора (0 – 31)
таблицы кодов ASCII (перевод строки (код 10), возврат каретки (код 13), перевод
формата (код 12)). Многобайтовые УК для большинства систем – это
ESC-последовательности, в которых первый байт – символ ESC (ASCII 27).
Многобайтовые УК имеют фиксированную (2 – 9 байт) или переменную длину от трех
до нескольких Кбайт. Признаком конца переменного многобайтового УК является код
ASCII 0. В качестве примера УК большой переменной длины может служить
ESC-последовательность для вывода информации загружаемого знакогенератора,
хранящего матричные образы символов. УК, которые иногда называют командами
управления, осуществляют выбор соответствующего шрифта (чернового, «курьера»,
курсива и т.д.), шага печати (пайка, элит и т.д.), режима печати (двуударного,
подчеркивания, индекса и т.д.), размера знака, позиции по вертикали и
горизонтали, режимов графики и т.д. Действие одних УК в большинстве случаев
длится до тех пор, пока не будет отменено выполнением соответствующих других
УК.
В
исходном состоянии принтер работает в текстовом режиме. Для перевода принтера
IBM в 8-битовый графический режим необходимо задать в нем соответствующий УК,
формат которого имеет следующий вид:
ESC m n1,
n2, b1, b2, …
где m – графический режим,
n2 – число
полных блоков, каждый из которых содержит 256 байт,
n1 – остаток графической информации,
bi – i-й байт графической информации.
Пусть число
колонок (байтов) графической информации равно N, тогда n1=N-256n2, а n2=N/256.
Если m=75, то в каждой строке содержится 480 точек (нормальная плотность). При
m=76 в каждой строке содержится 960 точек (удвоенная плотность).
Каждый байт
(bi) графической информации составляет колонку (восемь точек по вертикали),
нижний младший бит которой имеет вес (1), а верхний старший
бит - (128).
Чтобы
напечатать принтером, содержащим восьмиигольчатую печатающую головку, знак H, каждая вертикальная линия которого
содержит 12 точек, необходимо программе при первом прогоне печатающей головки
вывести следующую последовательность байт (УК): 27, 75, 6, 0, 4, 255, 4, 4,
255, 4. В этом УК последние 6 байт задают изображение верхней части знака
(рис.1).
Рис.1
Изображение знака при первом проходе
Затем следует вторым проходом продвинуть бумагу на четыре
точки, посылая на принтер УК 27, 65, 4, 27, 50, и подать следующую
последовательность байтов 27, 75, 6, 0, 0, 15, 0, 0, 15, 0. Последние шесть
байт этого УК определяют изображение нижней части знака (рис.2).
Рис. 2 Печать знака при втором
проходе
При вычерчивании различных рамок (в том числе и с помощью
символов псевдографики, кодов ASCII 176-223) потребуется, кроме того,
необходимость сдвига бумаги на высоту восьми точек путем посылки следующего УК:
27, 65, 8, 27, 50, (27, 65, 8, 10, 13) после выполнения которого осуществляется
сдвиг каретки.
На
совместимость принтера и ПК влияют следующие основные факторы: тип интерфейса
(Centronics, RS-232, SCSI, двухсторонний интерфейс EPP), таблицы наборов
символов (IBM, ASCII, Epson) и система управляющих кодов (IBM, Epson и т.д.).
Рассмотрим некоторые общие управляющие коды (команды), необходимые для
выполнения лабораторной работы. К таким командам относятся управляющие коды
выбора типа шрифта и шага печати. Шрифт – набор литер (знаков) определенного
размера, стиля и начертания. Команды управления шрифтами осуществляют выбор
следующих шрифтов: чернового, «курьера», «сансерифа», курсива и т.д. Следует
отметить, что одна и та же команда может иметь несколько представлений даже для
одного режима, например, IBM. Некоторые команды являются общими для режимов IBM
и Epson, которые и следует использовать в программах. Для выбора чернового
шрифта, «курьера», «сансерифа», курсива применяются соответственно команды: 27,
120, 48, (27,120, 0); 27, 107, 0; 27, 107, 1; 27, 52. Печать выделенным
шрифтом, в котором вертикальные штрихи имеют утолщенный вид, выполняется по
команде 27, 69, а отмена выделенной печати – по команде 27, 70.
Шаг печати
определяет горизонтальную плотность печати. Различают следующие шаги печати:
пайка (10 символов на дюйм), элит (12 символов на дюйм), уплотненная пайка (17
символов на дюйм) и т.д. Один дюйм равен 25,4 мм. Для выбора шагов пайка, элит,
уплотненная пайка используют соответственно следующие команды: 27, 80; 27, 77;
27, 15. Для управления размером символа предназначены команды: печать с двойной
шириной (27, 87, 49) или 14, отмена печати с двойной шириной (27, 87, 48) или
20, печать с удвоенной высотой (27, 119, 49), возврат к нормальной высоте (27,
119, 48) и т.д.
4.3. Пример выполнения варианта задания
В программе представлены данные, содержащие заданную рамку с
текстом. Рамка рисуется с помощью знаков псевдографики, описанных в программе в
виде таблицы данных. Программа проверяет каждый символ. Если обнаруживается
знак псевдографики, то принтер переводится в графический режим и выполняется
вывод шести табличных байтов. После выполнения принтером команды графического
режима, он автоматически возвращается в текстовый режим. Вертикальные линии
рамки вычерчиваются в два прохода (см. рис.1 и рис.2). Обычный символ
печатается в текстовом режиме как код ASCII.
Code Segment 'Code'
org 100h
assume cs:Code,ds:Code
Begin: jmp Start
UpLine db 4
N2 dw 0
Line db '
',10
db 3
Symbols db
'+---------------------------------+',10
db '¦ IIPU ¦ xxx
¦',10
db '¦----------------+----------------¦',10
db '¦ A-4x ¦ text
¦',10
db
'+---------------------------------+',10
db 3
Stable db 36,36,36,36,36,36
db 0,0,0,0,0,0
db 36,36,36,36,36,36;4,4,4,4,4,4
db 0,0,0,0,0,0
db 0,255,0,0,255,0
db 0,15,0,0,15,0
db 0,0,255,0,0,0
db 0,0,15,0,0,0
db 4,255,4,4,255,4
db 0,15,0,0,15,0
db 4,4,255,4,4,4
db 0,0,15,0,0,0
db 0,63,32,32,39,36
db 0,15,0,0,15,0
db 36,39,32,32,63,0
db 0,15,0,0,15,0
db 0,0,7,4,4,4
db 0,0,15,0,0,0
db 4,4,7,0,0,0
db 0,0,15,0,0,0
db 0,252,4,4,0E4h,36
db 0,0,0,0,0,0
db 36,0E4h,4,4,252,0
db 0,0,0,0,0,0
db 0,0,252,4,4,4
db 0,0,0,0,0,0
db 4,4,252,0,0,0
db 0,0,0,0,0,0
db 0,255,0,0,0E7h,36
db 0,15,0,0,15,0
db 36,0E7h,0,0,255,0
db 0,15,0,0,15,0
db 0,255,0,0,255,4
db 0,15,0,0,15,0
db 4,255,0,0,255,0
db 0,15,0,0,15,0
db 36,36,39,36,36,36
db 0,0,15,0,0,0
db 36,36,0E4h,36,36,36
db 0,0,0,0,0,0
;--------------- Процедура инициализации принтера--------------
PrInit Proc Near
inc dx
inc dx
mov al,12
out dx,al
mov ax,3000 ;Задержка на
3000 циклов
Delay: dec ax
jnz Delay
mov al,8
out dx,al
;Нормальная установка принтера
dec dx
dec dx
mov al,24
call OutByt
;Очистка буфера принтера
ret
PrInit EndP
;------------- Процедура вывода символа на принтер-------------
OutByt Proc
Near
out dx,al ;
Вывод содержимого AL в порт DX
inc dx
inc dx
mov al,13
out dx,al ;
Вывод байта данных
dec al
out dx,al
; dec al
; out dx,al
dec dx
Busy: in al,dx
test al,80h
jz Busy ; Принтер готов?
dec dx
; В DX адрес порта данных
ret
OutByt EndP
;--------------- Процедура проверки кодировки-------------------
TstCod Proc Near
mov cl,128
cmp cl,'А'
; Русская буква А
jnz EndTst
mov cl,176
EndTst: mov ch,cl
add ch,48
ret
TstCod EndP
;---------Процедура прогона бумаги в принтере на 8 точек--------
UpLne Proc Near
mov al,27
call OutByt
mov al,65
call OutByt
mov al,UpLine ; UpLine -
количество точек для прогона
call OutByt
mov al,10
call OutByt
mov al,13
call OutByt
ret
UpLne EndP
;---------------Процедура печати вторым проходом----------------
PrnLn Proc
Near
; mov UpLine,4
;Прогон бумаги на 4 точки
; call UpLne
lea si,Line
NxtS2: mov al,[si] ;Печать пустой строки
cmp al,10
jz EndLn
cmp al,32
;Если символ - "пробел",то не переходим
jz PrnS2
;в графический режим
mov N2,6
;Выбираем 6-й байт последовательности
call Graph
;Переход в графический режим
jmp short Go2
PrnS2: call OutByt
Go2: inc si
jmp NxtS2
EndLn: ret
PrnLn EndP
;--------Процедура перевода принтера в графический режим--------
Graph Proc Near
push cx
xor bx,bx
Srch: cmp [Symbols+bx],al ;Проверяем на
псевдографику
jz GrMode
inc bx
jmp Srch
GrMode: mov al,27
; Переводим в графический режим
call OutByt
mov al,75
call OutByt
mov al,6
call OutByt
mov al,0
call OutByt
mov al,bl
mov cx,6 ; Выводим
6 байт
mul cl
shl ax,1
; Умножаем на 12
mov bx,ax
add bx,N2
; Получаем в bx индекс таблицы
Out6: mov al,[Stable+bx]
call OutByt
inc bx
loop Out6
pop cx
ret
Graph EndP
;-------------------Процедура печати текста---------------------
PrnTxt Proc Near
lea di,Symbols ; DI - текст для печати
NxtLn: lea si,Line ;
SI - пустая строка
NxtS: mov al,[di]
; Проверка окончания текста
cmp al,3
jz EndPrn
cmp al,10
; Конец строки?
jnz GrTst
; call PrnLn
; Печать строки
inc di
mov UpLine,8
call UpLne
; Прогон на 8 точек
jmp NxtLn
; Переход к новой строке
GrTst: cmp al,cl
; Псевдографика
jb PrnS
cmp al,ch
ja PrnS
mov [si],al
mov N2,0
call Graph
jmp short Go
PrnS: mov byte ptr [si],32 ; Печатаем символ
call OutByt
Go: inc si ; Следующие символы
inc di
jmp NxtS
EndPrn: ret
PrnTxt EndP
;--------------------Основная программа-------------------------
Start: mov ax,40h
; Адрес базового порта принтера
mov es,ax
mov bx,8
PrTst: mov dx,es:[bx] ;
Сохраняем его в DX
inc bx
inc bx
or dx,dx
jz PrTst ;
Проверка подключения принтера LPT1 или LPT2
call PrInit ;
Инициализация принтера
call TstCod ;
Определяем кодировку
call PrnTxt ;
Печатаем текст
mov ax,4c00h
int 21h
Code Ends
End Begin
Программа print.asm демонстрирует пример печати графической информации на
матричном принтере. В качестве элементов графических изображений используются
символы псевдографики. Описания (образы) символов псевдографики берутся из
таблицы шрифтов знакогенератора. Однако формат, в котором они содержатся в
видеопамяти, не совпадает с форматом, необходимым для принтера. В таблице
шрифтов знакогенератора каждый байт кодирует строку пикселов символа, а принтер
для печати использует столбец пикселов символа. Таким образом, описание символа
необходимо “повернуть” перед тем, как передать его принтеру. Символы имеют
высоту 12 пикселов, для печати которых принтер употребляет 9 иголок. Поэтому
печать производится в два прохода – сначала печатаются 8 верхних пикселов и
одновременно формируется в буфере вторая (нижняя) часть строки. После печати
первой половины строки принтер опускает каретку на 4 пиксела вниз и печатает
содержимое ранее сформированного буфера. После этого каретка принтера
переводится еще на 8 пикселов вниз (на новую строку).
Программа print.asm
cseg segment 'code'
org 100h
assume cs:cseg,ds:cseg
Start:
jmp @@0
File db'+------------------+',0ah ;текст с
символами псевдографики
db'¦ Hello, World! ¦',0ah ;для
вывода на принтер
db'+------------------+',0ah
db 0
data_p equ 378h
;Адрес порта данных
stat_p equ 379h
;Адрес порта состояния
contr_p
equ 37ah ;Адрес порта
управления
up4 equ 4
up8 equ 8
ask_0 db 'Вывод
данных на печать',10,13,'$'
ask_1 db 'Принтер
не готов',10,13,'$'
old_Video
db 0
_ch db 0 ;ASCII код
текущего символа
_4down db
27,65,4,10 ;управляющие коды для перевода
;каретки на 4 точки вниз
char db
27,75,8,0 ;Заготовка управляющих кодов
db 7 dup(00h) ;для
вывода графической информации
_char db 0
bits db
0 ;Количество информационных бит
;в байте для вывода как
графическую
;информацию
_SI dw 0
cnt dw 0
;Указатель на конец "второй половины"
;печатаемой строки
point dw 0
nextStr db 960 dup(0) ;буфер
для второго прохода kаретки
;Процедура, считывающая из таблицы шрифтов описание текущего
;символа и преобразующая ее для вывода на принтер
H_V proc
mov cx,8
@@a3:
push cx
mov bh,cl
xor bl,bl
xor ch,ch
mov cl,cs:[bits]
@@a2:
push cx
mov al,es:[si]
mov cl,bh
shl al,cl
rcl bl,1
inc si
pop cx
loop @@a2
mov cs:[di],bl
dec di
mov al,cs:[bits]
xor ah,ah
sub si,ax
pop cx
loop @@a3
ret
endp H_V
;Печать CX байт, начиная с адреса CS:SI
Graph proc
@Graph:
mov dx,data_p
mov al,cs:[si]
out dx,al
inc si
@Busy:
mov dx,stat_p
in al,dx
test al,80h
jz @Busy
;ожидание готовности принтера
mov dx,contr_p
;Установка STR=1
mov al,0dh
out dx,al
;Установка STR=0
mov al,0ch
out dx,al
loop @Graph
ret
endp Graph
convert proc
mov di,ds:[cnt]
mov ax,4b1bh
mov cs:[di],ax
inc di
inc di
mov ax,0008h
mov cs:[di],ax
inc di
inc di
mov cs:[cnt],di
mov ax,1130h
;Получаем адрес таблицы символов
mov bh,02h
;знакогенератора в ES:BP
int 10h
mov si,bp
;Определяем смещение на текущий
xor ah,ah
;символ (псевдографики)
mov al,cs:[_ch]
mov cl,14
mul cl
inc ax
add si,ax
mov cs:[_SI],si
lea di,cs:[_char]
mov cs:[bits],8
;Считываем из таблицы символов и
call H_V
;преобразуем для вывода на принтер
;верхнюю часть символа
псевдографики
mov di,cs:[cnt]
add di,7
mov si,cs:[_SI]
add si,8
;Считываем из таблицы символов и
mov cs:[bits],4
;преобразуем для вывода на принтер
call H_V
;нижнюю часть символа псевдографики
add [cnt],8
;Вывод текущего символа на
mov ah,2
;экран монитора
mov dl,cs:_ch
int 21h
lea si,cs:char ;вывод на
принтер подготовленной
mov cx,12
;последовательности байтов для
call Graph
;принтера (вывод верхней части)
ret
endp convert
;Вывод символа на печать
PRN proc
;Вывод данных на экран
mov ah,2
mov dl,cs:_ch
int 21h
;Вывод данных на печать
mov dx,data_p ;адрес
порта данных
mov al,cs:_ch
out dx,al
mov dx,contr_p
;адрес порта управления
;Установка Str=1
mov al,0dh
out dx,al
;Установка Str=0
mov al,0ch
out dx,al
ret
endp PRN
;-------------------------
;Основная программа
@@0:
mov dx,stat_p
mov al,0dh
out dx,al
in al,dx
and al,80h
jz a1
;Выйти из программы,если принтер не готов
jmp _a
a1:
call Error
call TheEnd
_a:
mov ah,9
lea dx,ask_0
int 21h
mov cs:[_ch],0dh
;возврат каретки принтера
call PRN
lea si,cs:[File] ;инициализация
mov cs:[point],si
lea si,cs:[nextStr]
mov cs:[cnt],si
;Проверка готовности принтера
a6:
mov dx,stat_p
in al,dx
and al,80h
jz a6
;Выдача сообщения об ошибке и
; call Error
;выход
@@ready:
;Чтение символа
mov si,cs:[point]
inc cs:[point]
mov al,cs:[si]
mov cs:[_ch],al
or al,al
jnz @@NC
;Если 0, то конец работы,
call TheEnd
;выход в ОС
@@NC:
;Проверка на 'Перевод строки'
a2:
cmp al,0ah
jne a4
mov ah,2
mov dl,0dh
int 21h
mov ah,2
mov dl,0ah
int 21h
;Перевод каретки на 4 точки вниз
mov cx,4
mov al,up4
lea si,cs:[_4down]
mov cs:[si+2],al
call Graph
;Возврат каретки
mov cx,cs:[cnt]
lea si,cs:[nextStr]
sub cx,si
inc cx
call Graph
lea si,cs:nextStr
mov cs:[cnt],si
@@to8:
;Перевод каретки на 8 точек вниз
mov cx,4
mov al,up8
lea si,cs:[_4down]
mov cs:[si+2],al
call graph
jmp next
;Символ псевдографики
a4:
cmp al,176
;Если убрать проверку кода символа
jl a5
;на его "принадлежность" к символам
cmp al,223
;псевдографики, то принтер будет
jg a5
;печатать все символы, как графику
call convert
jmp next
;Обычный символ
a5:
mov di,cs:[cnt]
mov bl,20h
mov cs:[di],bl
inc cs:[cnt]
call PRN
next:
jmp a6
a7:
;Выдача сообщения об ошибке и завершение работы
Error proc
mov ah,9
lea dx,ask_1
int 21h
endp Error
;Завершение работы
TheEnd proc
mov ah,4ch
int 21h
endp TheEnd
cseg ends
end Start
4.4. Варианты заданий
Морфологический граф вариантов программ (заданий) изображен
на рис. 3 и содержит четыре уровня.
Рис. 3.
Морфологический граф вариантов программ
Маршрут в графе, включающий соответствующую вершину каждого
уровня, составляет вариант задания, например, 1-4-9-11. Без учета вершины 8
морфологический граф позволяет разработать 72 варианта программ. Первый
уровень (вершины 1-3) определяет источник текстовых и графических данных.
Вершина 1 указывает, что данные находятся в программе, а вершина 2 – на диске в
виде текстового файла, содержащего знаки псевдографики. Вершина 3 предписывает
употребить таблицу знакогенератора дисплея (таблицу определения символов) с
соответствующим преобразованием матричных образов знаков. Для адаптера VGA
(EGA) знаковый генератор использует таблицы шрифтов, размещенные в
фиксированных областях оперативной памяти для различных режимов. Более подробно
знакогенераторы рассмотрены в проверочном задании №6. Для выполнения рассматриваемой
работы можно использовать символьные матрицы 8х8 для текстового режима 80х25 с
16-ю цветами. Второй уровень (вершины 4-8) соответствует таблицам используемых
псевдографических данных, необходимых для изображения на бумаге принтера заданных
рамок (рис. 4).
Вершина 8 определяет более сложную рамку (творческий
вариант), выбираемую студентом для своей программы.
В каждой рамке, состоящей из четырех прямоугольников, следует
поместить следующий текст. В первом прямоугольнике необходимо указать номер
группы, во - втором - фамилию, имя и отчество, в третьем – номер проверочного
задания и в четвертом – название дисциплины (периферийные устройства).
Рис. 4. Знаки псевдографики для
изображения рамок,
соотносящихся с вершинами 4-7
В программе
знаки описываются в виде байтовых табличных данных. Способ доступа к таблице
определяется третьим уровнем графа. Вершина 8 соответствует доступу к таблице с
помощью транслирующей команды XLAT, а вершина 9 – путем применения индексной адресации.
Четвертый
уровень определяет режим печати: вершина 11 – нормальную печать, вершина 12 –
плотную печать, а вершина 13 – печать двойной ширины. Для реализации режимов
печати необходимо использовать соответствующие коды управления.
Похожие материалы:
Графический режим
Графические режимы дисплея - Авдеев В.А. и др., 2001
Графитировщик асбестовых технических изделий
Графопостроители (плоттеры)
Гример-пастижер (Часть №2 выпуска №58 ЕТКС )
Грохотовщик
|