Консалтинговая компания Консалтер.Ру
Главная Новости Библиотека Исследования Законодательство Консалтинг Бизнес-форумы Контакты

Реклама

Рекомендуем



Консалтер.Ру > Библиотека > Информационные технологии

В.А. Авдеев, В.Ф. Гузик
Компьютеры: шины, контроллеры, периферийные устройства

Учебное пособие. Таганрог: ТРТУ, 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 ЕТКС )
Грохотовщик



О сайте   Авторам   Реклама и услуги   Контакты
Copyright © 2007-2021, Консалтер.Ру