Deja Vu #08
31 мая 1999

Тема - Принтер и ZX-Spectrum (система команд принтеров семейства Epson).

AY-Track: "Blue moon" in small remix :)   
__________________________________________


(C) Seiko EPSON corp.
(C) ZK System/Excess team
__________________________________________


     Принтер и ZX-Spectrum


   Одними из  более распространенных  уст-
ройств  для  получения твердой копии доку-
ментов  являются  принтеры. Их  существует
великое множество, однако стандартом явля-
ется  система  команд  принтеров семейства
Epson (tm).
   Обычно принтер подключается к компьюте-
ру  через  разъем  паралельного интерфейса
(LPT).

┌───────┬───────┬───────┬─┬────────────────────────────────────┐
│ Штырь │Возвращ│Сигнал │Н│            Пояснения               │
│сигнала│ штырь │       │ │                                    │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│   1   │   19  │/STROBE│O│Сигнал СТРОБ означает чтение данных.│
│       │       │       │ │Ширина сигнала не должна быть более │
│       │       │       │ │0.5 мкс на принимающем терминале.   │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│   2   │   20  │ DATA0 │O│ Данные сигналы представляют парал- │
│   3   │   21  │ DATA1 │O│лельные биты с 0 по 7 соответственно│
│   4   │   22  │ DATA2 │O│Высокий уровень соответствует лог.1,│
│   5   │   23  │ DATA3 │O│а низкий - лог.0                    │
│   6   │   24  │ DATA4 │O│                                    │
│   7   │   25  │ DATA5 │O│                                    │
│   8   │   26  │ DATA6 │O│                                    │
│   9   │   27  │ DATA7 │O│                                    │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  10   │   28  │/ACKNLG│I│ Сигнал длит. 12 мкс. Низкий уровень│
│       │       │       │ │означает, что данные приняты и прин-│
│       │       │       │ │тер готов к приему дальнейшей инфор-│
│       │       │       │ │мации.                              │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  11   │   29  │  BUSY │I│ Высокий сигнал означает, что прин- │
│       │       │       │ │тер не может принять данные. Сигнал │
│       │       │       │ │является высоким                    │
│       │       │       │ │     в следующих случаях :          │
│       │       │       │ │1) Во время приема данных.          │
│       │       │       │ │2) Во время печати.                 │
│       │       │       │ │3) При ошибке.                      │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  12   │   30  │   PE  │I│ Высокий уровень сигнала означает,  │
│       │       │       │ │что в принтере кончилась бумага.    │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  13   │ ----- │ ------│-│ Находится под напряжением +5 V,    │
│       │       │       │ │ Сопротивлением 3.3 кОм.            │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  14   │ ----- │ /AUTO │O│ При низком уровне сигнала бумага   │
│       │       │FEED XT│ │автоматически переводится на одну   │
│       │       │       │ │строку после печати.                │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  15   │ ----- │   NC  │-│ Не используется.                   │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  16   │ ----- │  0 V  │-│ Логическое заземление.             │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  17   │ ----- │CHASSIS│-│ Заземление на шасси принтера,      │
│       │       │  GND  │ │изолировано от логического.         │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  18   │ ----- │   NC  │-│ Не используется.                   │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│ 19-30 │ ----- │  GND  │-│ Спаренный возвращающий сигнал      │
│       │       │       │ │заземления.                         │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  31   │ ----- │ /INIT │O│ Когда уровень сигнала становится   │
│       │       │       │ │низким, контроллер принтера сбрасы- │
│       │       │       │ │вается в состояние загрузки,и буфер │
│       │       │       │ │печати очищается. Нормальный уровень│
│       │       │       │ │сигнала - высокий; ширина сигнала   │
│       │       │       │ │должна быть более 50 мкс. на прини- │
│       │       │       │ │мающем терминале.                   │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  32   │ ----- │/ERROR │I│ Уровень становится низким когда:   │
│       │       │       │ │1) В принтере кончается бумага.     │
│       │       │       │ │2) Принтер отключен от линии.       │
│       │       │       │ │3) При ошибке.                      │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  33   │ ----- │  GND  │-│ Такой же как и 19-30               │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  34   │ ----- │   NC  │-│ Не используется.                   │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  35   │ ----- │ ------│-│ Находится под напряжением +5 V,    │
│       │       │       │ │cопротивлением 3.3 кОм.             │
├───────┼───────┼───────┼─┼────────────────────────────────────┤
│  36   │ ----- │/SEL IN│O│ Код DC1/DC3 действителен, когда    │
│       │       │       │ │этот сигнал "высокий" по уровню.    │
└───────┴───────┴───────┴─┴────────────────────────────────────┘



   В  Speccy интерфейс LPT имеет несколько
упрощенную  схему. Для обмена используется
восемь линий данных (D0-D7), линия сигнала
стробирования данных (Strobe), линия опро-
са  занятости  принтера (Busy) и, конечно,
нулевого  провода  (GND),  иногда,  что не
совсем обязательно, линия /ERROR.


Speccy                          Printer
                    8
D0...D7 ============/========== D0...D7
/STROBE ----------------------- /STROBE
 /ERROR ----------------------- /ERROR
   BUSY ----------------------- BUSY
    GND ----------------------- GND


   Принтер  представляет из себя компьютер
со  своим  ОЗУ, ПЗУ и процессором, который
управляет  обменом информации, ее обработ-
кой, перемещением печатающей головки, вер-
тикальным  движением листа и, конечно, пе-
чатающими иголками.
   В ОЗУ принтера отведен небольшой буфер,
в  который  вводятся извне данные, которые
необходимо  напечатать. Загрузка  данных в
принтер производится следующим образом:

   На  линию  данных  LPT  порта выводится
требуемый байт, после чего нужно проверить
состояние  линии  BUSY,  если она активна,
то это значит, что буфер принтера перепол-
нен или произошла ошибка. Если BUSY не ак-
тивна, то принтер готов к приему очередно-
го байта данных. А так, как байт уже сфор-
мирован, то остается его подтвердить стро-
бирующим импульсом на линии /STROBE.

Для интерфейса ZX-Lprint III драйвер будет
иметь следующий вид:

        org  #5b00
        nop
        jr   detect
        jr   init
        jr   output


detect  ld   b,0      ;программа проверки
                      ;наличия принтера и
dlp     in   a,(#7b)  ;его готовности
                      ;к работе
        and  #80
        ret  z
        djnz dlp
        ret           ;если при выходе А=0,
                      ;то принтер готов

init    nop           ;обычно здесь ничего
        nop           ;не пишут


output  push af       ;программа вывода
                      ;байта в принтер
        out  (#fb),a  ;выставляем байт на
                      ;линию данных LPT

busy    call #1f54    ;опрос клавиши BREAK.
                      ;Это нужно, чтобы
        jr   nc,error ;избежать зависания
                      ;при ошибке.

        in   a,(#7b)  ;проверяем линию BUSY
        rlca
        jr   c,busy   ;если занято, то ждем,
                      ;пока не освободится
        pop  af


        out  (#fb),a  ;Сброс Strobe
        out  (#7b),a  ;Активизация Strobe
        out  (#fb),a  ;Сброс Strobe

        and  a        ;нормальный выход
                      ;из программы
        ret


error   pop  af       ;выход с устновленным
                      ;CF флагом
        scf           ;если ошибка.
        ret


   Некоторые принтеры очень  чувствительны
к длительности  сигнала  Strobe. Например,
для   моего  Epson(tm)  LX-800(tm ) сигнал
Strobe срабатывает по переднему или задне-
му фронту сигнала, и для нормальной работы
сигнал Strobe должен формироваться следую-
щим образом:

        ...
        out  (#fb),a
        out  (#7b),a
        ...


   При этом, первый введенный  байт  после
включения  принтера  будет проигнорирован!
Во избежание  утраты   логической  цепочки
необходимо   первым  послать  какую-нибудь
безвредную однобайтную  команду, например,
BEL (#07) - звуковой сигнал.

   При  написании  драйвера  для ZX-Lprint
III необходимо помнить, что команда  in a,
(#fb) подключает  ПЗУ  ZX-Lprint III, а in
a,(#7b) - отключает.

   Далее привожу описание команд Epson(tm)
совместимых  принтеров. На некоторых прин-
терах  могут не работать команды установки
кодировок и работа с NLQ шрифтами. Команда
ESC  означает,  что  команда  ESC  n будет
иметь вид #1B,n.


1. Работа принтера.


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
ESC @        40  Инициализация принтера
DC1          11  Выбрать принтер
DC2          13  Отменить выбор принтера
ESC s 1/0    73  Вклвыкл половинной скорости
ESC <        3C  Выбор однонаправленной печати (для 1ой строки)
ESC U 1/0    55  Вклвыкл однонаправленной печати
ESC 8        38  Отключить определение отсутствия бумаги
ESC 9        39  Включить определение отсутсвия бумаги
ESC EM n     19  Контроль загрузкивыгрузки бумаги
                  n="0": Выключен
                    "1": Выбрать приемник 1
                    "2": Выбрать приемник 2
                    "4": Включен
                    "R": Выгрузить лист

ESC =        3D  Установить MSB в 0
ESC >        3E  Установить MSB в 1
ESC #        23  Выключить MSB контроль
BEL          07  Звонок


2. Управление данными.


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
CR           0D  Возврат каретки
CAN          18  Отменить строку
DEL          7F  Удалить символ


3. Вертикальное движение.


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
FF           0C  Прогон листа
ESC C n      43  Установка длины страницы в строках n=1-127
ESC C 0 n    43  Установка длины страницы в дюймах n=1-22
ESC N n      4E  Установка пропуска перфорации n=1-127
ESC O        4F  Отмена пропуска перфорации
LF           0A  Перевод строки
ESC 0        Межстрочный интервал 1/8 дюйма
ESC 1        31  Межстрочный интервал 7/72 дюйма
ESC 2        32  Межстрочный интервал 1/6 дюйма
ESC 3 n      33  Межстрочный интервал n/216 дюйма n=0-255
ESC A n      41  Межстрочный интервал n/72 дюйма n=0-85
ESC J n      4A  Перевод строки на n/216 дюйма n=0-255
VT           0B  Вертикальная табуляция
ESC B nn     42  Установка вертикальной табуляции. До 16-и
                 точек табуляции (1-255) в возрастающем
                 порядке; последний параметр должен быть 0.
                 ESC B 0 очищает все табуляции.
ESC b nn   62    Установка вертикальной табуляции в каналах.
                 ESC b c n1 n2 ... n16 0. c=0-7
ESC / c    2F    Выбор канала для вертикальной табуляции с=0-7.


4. Горизонтальное движение.


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
ESC 1 n      6C  Установка левого поля n=количество колонок
ESC Q n      51  Установка правого поля n=количество колонок
BS           08  Забой символа
ESC $ n1 n2  24  Установка абсолютной горизонтальной позиции
                 n=(n1+n2*256)/60 дюймов.
                 n: Положение печати на расстоянии n/60 дюймов
                 от левого поля.
ESC / n1 n2  5C  Установка относительной горизонтальной позиции
                 n=(n1+n2*256)/120 дюймов
                 n: Перевод положения печати на n/120 дюймов.
                 Если перевод осуществляется влево, вычтите это
                 число из 65536.
HT           09  Горизонтальная табуляция.
ESC D nn     44  Установка горизонтальной табуляции до 32 точек
                 (1-255) в возрастающем порядке.


5. Стили печати.


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
ESC x n      78  Выбор NLQ или Draft
                 n=0: Draft
                   1: NLQ
ESC k n      6B  Выбор шрифта высококачественной печати
                 n=0: Roman
                   1: Sans Serif
ESC ! n      21  Выбор набора символов
                 n= бит 0: 10 знд/12 знд
                        1: пропорциональный
                        2: уплотненный
                        3: выделенный
                        4: двойной удар
                        5: двойная ширина
                        6: курсив
                        7: подчеркивание


6. Шаг и размер знака.


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
ESC P        50  Выбор режима 10 знд
ESC M        4D  Выбор режима 12 знд
ESC p 1/0    70  Bклвыкл пропорционального режима
SI           0F  Включение плотной печати
ESC SI       0F  Выключение плотной печати
DC2          12  Отмена уплотненного режима
SO           0E  Включение режима двойной ширины
                 (на одной строке)
ESC SO       0E  Включение режима двойной ширины
                 (на одной строке)
DC4          14  Выключение режима двойной ширины
                 (на одной строке)
ESC W 1/0    57  Вклвыкл режим двойной ширины
ESC w 1/0    77  Вклвыкл режим двойной ширины


7. Расширение возможностей печати.


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
ESC E        45  Вкл. режима выделенной печати
ESC F        46  Выкл. режима выделенной печати
ESC G        47  Вкл. режима печати за два прохода
ESC H        48  Выкл. режима печати за два прохода
ESC S0       53  Вкл. печати верхними индексами
ESC S1       53  Вкл. печати нижними индексами
ESC T        54  Выкл. печати индексами
ESC 4        34  Вкл. курсива
ESC 5        35  Выкл. курсива
ESC - 1/0    2D  Вклвыкл режим подчеркивания
ESC a n      61  Выравнивания шрифта
                 n=0:Влево
                   1:В центр
                   2:Вправо
                   3:На формат
ESC SP n     20  Установка расстояния между символами
                 n=1/120 дюймов пробелов (1-127) справа от
                 каждого символа


8. Таблицы символов


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
ESC t n      74  Выбор таблицы символов
                 Выбор таблицы n, назначенной командой ESC (t
                 n=0,1,48, или 49
ESC R n      52  Выбор международного набора символов n=
                 0:США               7:Испания 1
                 1:Франция           8:Япония
                 2:Германия          9:Норвегия
                 3:Англия           10:Дания 2
                 4:Дания 1          11:Испания 2
                 5:Швеция           12:Латинская Америка
                 6:Италия
ESC 6        36  Расширение области печати кодов, позволяет
                 печатать коды 128-159 как символы
ESC 7        37  Выкл. ESC 6
ESC (t nn  28 74 Выбор таблицы символов ESC (t 3 d1 d2 d3
                 Назначает таблицу знаков с d2 d3 таблицей,
                 установленной ESC t в соответствии с d1
                 d1=0: Назначить таблицей выбранной ESC t 0
                 d1=1: Назначить таблицей выбранной ESC t 1
                 d2 d3 Таблицы символов
                 0  0  Курсив
                 1  0  PC 437 (США, стандарт Европа)
                 14 0  PC 866 (Русская)
                 15 0  PC 869 (Греческая)
                 32 0  Болгария


9. Определяемые пользователем знаки.


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
ESC & nn     26  Определить пользовательские символы
                 ESC & 0 n1 n2 a1 data
                 n1= ASCII код первого символа
                 n2= ASCII код последнего символа
                 a1= Байт атрибутов, указывающий ширину и
                 используеиые иголки
                 data: данные символа
ESC : 0 n 0  3A  Скопировать символы в RAM из ROM
                 n=0: Roman
                 n=1: Sans Serif
ESC % n      25  Выбор набора символов
                 n=0: Нормальный набор
                   1: Пользовательский  набор
ESC I n      49  Расширение области печатыемых кодов
                 Десятичные коды от 0 до 31 и от 128 до 159
                 n=0: Непечатыемые коды
                   1: Печатаемые коды для пользовательских
                   символов


10. Графика.


ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
ESC K n1 n2  4B  Вкл. режима нормальной плотности
                 ESC K n1 n2 data
                 n=n1+n2*256
ESC L n1 n2  4C  Вкл. режима двойной плотности
                 ESC L n1 n2 data
ESC Y n1 n2  59  Вкл. режима двойной плотности, высокой скорости
                 ESC Y n1 n2 data
ESC Z n1 n2  5A  Вкл. режима учетверенной плотности
                 ESC Y n1 n2 data
ESC * mn     2A  Выбор графического режима
                 ESC * m n1 n2 data

┌────────────────────────────────┬───────┬───┬─────┐
Графический режим              Код   m DPI
                               │       │   │     │
Нормальная плотность           ESC K 0 60 
Двойная плотность              ESC L 1 120
Высокоскор. двойная плотность* ESC Y 2 120
Учетверенная плотность*        ESC Z 3 240
CRT 1                           нет  4 80 
Графопостроитель (1:1)          нет  5 72 
CRT 2                           нет  6 90 
Графопостроитель (1:2)          нет  7 144
└────────────────────────────────┴───────┴───┴─────┘
* Смежные точки не могут быть отпечатаны.

ASCII        HEX Oписание
───────────────────────────────────────────────────────────────
ESC ? s m    3F  Переназначить графический режим
                 ESC ? s m
                 s=K,L,Y, или Z
                 m=0-7
                 m: графический режим для изменения m=ESC * m
ESC ^        5E  Выбор режима графики с девятью иголками
                 ESC ^ m n1 n2 data
                 m=0: Нормальная плотность
                   1: Двойная плотность
                 n=n1+n2*256
                 data = (n*2)

───────────────────────────────────────────────────────────────


   Следует отметить, что введенные в буфер
принтера   данные   будут   активизированы
только  после  того, как будет послана ко-
манда возврата каретки CR (#0D). Это нужно
для команд управления данными буфера прин-
тера CAN (#18) и DEL (#7F).




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Фантастика - крыса из нержавеющей стали (часть 9).
О звездах рока - Краткая хронология жизни и творчества Виктора Цоя.
Разное - "Моя мама прочитала птичку. Первый номер поверг её в шок. "Разве, говорит она, это юмор?"

В этот день...   16 ноября