А. Девятов

Программирование 9-игольчатых матричных Принтеров семейства Epson

Данная статья предназначается в первую очередь пользователям ПК "Корвет", однако будет полезна всем, имеющим дело с Epson-совместимыми и близкими к ним принтерами. Полное описание системы команд принтера Epson довольно велико, поэтому в журнальном варианте оставлены лишь наиболее употребимые команды.

Матричные принтеры являются неотъемлемой частью любого аппаратно-программного комплекса на базе персонального компьютера. Наиболее доступны и поэтому распространены принтеры, головка которых содержит 9 иголок.

Текст или графическое изображение, формируемые матричным принтером, состоят из горизонтальных строк, набранных из близко расположенных вертикальных колонок, состоящих в свою очередь из отдельных точек.

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

Признанным лидером в сфере разработки и производства матричных принтеров является фирма Seiko Epson (Япония). Именно ей удалось в свое время разработать удачный набор команд для программирования режимов таких принтеров и продать большое количество своих принтеров на рынке компьютерной техники.

В результате соблюдение протокола команд фирмы Epson стало почти обязательным для всех производителей принтеров, претендующих на сбыт своей продукции на рынке.

Ниже описаны набор команд принтеров семейства Epson, способы задания режимов печати из программ пользователя, написанных для ПК "Корвет".

Характеристики принтеров семейства Epson

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

В табл. 1 приведены основные технические характеристики распространенных в нашей стране 9-игольчатнх матричных Ерson-совместимых принтеров.

Таблица 1. Технические характеристики принтеров
Тип принтера Скорость
печати,
зн/с*
Знакогенератор
кириллицы
Режим
печати
NLQ
Размер
буфера
печати,
Кбайт
FX-850/1050 264 Нет Есть 8
FX-800/1000 200 Есть Есть 8
LX-800 180 Нет Есть 3
FX-80 160 Нет Нет 2
RAVI-8010M 180 Есть Есть 4
Compute Mate-160 160 Есть Есть 8

* - Скорость печати указана для черновикового режима при плотности 10 зн/дюйм.

Многие принтеры могут печатать как в черновиковом режиме (draft), так и в режиме качественной печати (Near Letter Quality, или сокращенно NLQ). Во втором случае шрифт напоминает шрифт портативной пишущей машинки.

Аппаратно русифицированные принтеры с записанным в ПЗУ знакогенератором кириллицы обеспечивают печаль смешанных текстов с английским и русским алфавитами. Отдельные модели могут различаться типом кодировки кириллицы, что обычно приводит к полному несоответствию распечатки и исходного текста при использовании стандартных способов печати из операционной системы (например, с помощью программы PIP или переключения в режим дублирования выдачи с помощью команд CTRL+Р). Обойти это препятствие позволяют прикладные программы печати, осуществляющие перекодировку текста перед выдачей его на принтер.

Ниже будут приведены стандартные таблицы кодировок символов, а также способ управления процессом перекодировки при печати, которую можно реализовать непосредственно в операционной системе.

Встроенный тест и печать в шестнадцатиричном формате. Все типы принтеров имеют встроенную самопроверку и возможность печати в шестнадцатиричном формате.

Самопроверка инициируется, если при включении питания была нажата клавиша FORM FEED (или LINE FEED) на верхней панели управления принтера. Она выводит на печать все символы, определенные во внутреннем знакогенераторе, и позволяет проверить правильность функционирования принтера, не прибегая к помощи компьютера.

Некоторые принтеры (FX-800, FX-850 и др.) в режиме самопроверки перед распечаткой алфавита выводят полезную информацию о текущей установке DIP-переключателей (DIP - аббревиатура от Dual Inline Package), расположенных на основной плате внутри принтера и отвечающих за инициализацию тех или иных режимов печати при включении питания.

Печать в шестнадцатиричном фоомате инициируется, если при включении питания были нажаты клавиши FORM FEED и LINE FEED, после чего принтер принимает передаваемые ему коды и печатает как сами эти коды, так и соответствующие им символы. Соответствие устанавливается на основе кодировки знакогенератора, записанного в ПЗУ принтера. Режим полезен при отладке собственных прикладных программ, написанных для обслуживания принтера.

Управление принтером из программ пользователя на "Корвете"

Из программ пользователя на печать выдаются обычно либо массивы данных, либо текстовая информация, либо графическая копия экрана.

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

Однако в этом случае есть опасность потери работоспособности программы при ее переносе в другую версию ОС СР/М, поскольку физические адреса устройств не являются стандартизованных, параметром и могут меняться от версии к версии.

Стандартные способы работы с принтером. На нижнем уровне ОС, где осуществляется непосредственная связь между программной и аппаратной частями компьютера, в стандартной версии ОС СР/М есть две функции для общения с принтером: одна - для выдачи символа на печать, другая - для проверки готовности принтера.

Функция № 5 BIOS: LIST

Входные параметры: регистр С процессора должен содержать код символа, выводимого на принтер.

Выходные параметры: нет.

Действие: символ из регистра С выводится на параллельный интерфейс принтера в соответствии с протоколом. Если принтер не готов, то функция находится в состоянии ожидания готовности.

Функция № 15 BIOS: LISTST

Входные параметры: нет.

Выходные параметры: регистр А (аккумулятор процессора) содержит 255, если принтер готов к приему данных, и 0, если не готов.

Действие: чтение состояния линии данных BUSY параллельного интерфейса.

Функция № 15 является "подмножеством" функции № 5, т. е. вызывается последней в процессе выполнения. Способы доступа к этим функциям (как и к описанным далее) определены в конкретных языках программирования.

Драйвер принтера в ОС СР/М-80 на ПК "Корвет" использует эти функции BIOS; протокол обмена соответствует протоколу интерфейса Centronix в его наиболее простой версии. Опознавание готовности внешнего устройства к приему данных осуществляется с помощью функции LISTST, отсутствие сигнала BUSY является признаком готовности принтера.

При вызове функции LIST сначала проверяется готовность принтера к приему данных. В случае его занятости функция ожидает готовности; при ее наступлении код передаваемого символа записывается в порт параллельного интерфейса, а затем программно формируется строб записи данных с отрицательной логический полярностью и длительностью около 20 мкс.

С помощью этого драйвера передаются любые коды от 0 до 255. Символы с кодами от 0 до 127, представляющие нижнюю часть таблицы символов и совпадающие с нижней половиной стандарта ASCII, передаются без изменений; верхняя половина таблицы, т. е. символы с кодами от 128 до 255, передается после перекодировки в соответствии со специальной перекодировочной таблицей (она будет описана ниже).

Базовая дисковая операционная система (BDOS), состоящая из процедур обмена с дисками и другими логическими устройствами, в отличие от BIOS представляет собой аппаратно независимую часть операционной системы СР/М-80. Для работы с внешним печатающим у тройством BDOS имеет функцию № 5 LIST, выполняющую вывод символа на логическое устройство LST:.

Функция № 5 BDOS: LIST

Входные параметры: регистр С содержит 05H, регистр Е - код выводимого символа.

Выходные параметры: нет.

Действие: вывод не LST: символа, код которого задан в регистре E.

Бейсик, Паскаль и Си имеют стандартные программные средства для вывода информации на печать с помощью описанных выше функций BDOS и BIOS.

В интерпретаторе Бейсик ПК "Корвет" есть две команды выдачи на печать: LPRINT - выдача на принтер произвольных выражений, LLIST - печать текста программы. Любой режим работы принтера может быть запрограммирован с помощью команды LPRINT. В виводимом примере принтер инициализируется, включается режим "элита", ширина левого поля устанав ливается равной 12 символам, после чего печатается сообщение.

    10 LPRINT CHR$(27);"@";:REM Инициализация
    20 LPRINT CHR$(27);"М";:REM Установка "элиты"
    30 LPRINT CHR;(27);"l";CHR$(12):REM левое поле=12 зн.
    40 LPRINT "Elite-sized characters"

Оператор LPRINT следит за выдачей кода CR (возврат каретки). Если после последнего CR будут выданы 70 символов, LPRINT самостоятельно выдаст дополнительные коды CR (0DH) и LF (ОАН, перевод строки). Поэтому использование LPRINT для работы в графических режимах весьма неудобно. В некоторых версиях Бейсика есть оператор WIDTH, позволяющий изменять длину строки при выдаче информации на внешнее устройство (консоль или принтер). Увеличение длины до 255 символов в некоторых случаях облегчает печать графики. К сожалению, в Бейсик-Корвет 1.0 длину строки можно менять лишь в пределах от 15 до 64 символов.

На языке компилятора Паскаль/МТ+ в разделе описания переменных объявляется переменная-файл (например, printer) типа TEXT. С помощью операторов ASSIGN (printer, 'LST:') и RESET(printer) (или REWRITE (printer), что в данном случае эквивалентно) вывод в нее направляется на логическое устройство LST:, связанное через BIOS с адаптером принтера. Вывод реализуется с помощью операторов WRITE(nepe-менная-файл, выражение) и WRITELN (переменная-файл, выражение). В приводимом примере включается режим печати сжатых подчеркнутых символов и выводится сообщение "Hello!".

    Program TestPrinter; 
    var 
        printer : text;
    begin
        assign(printer, 'LST:');
        reset(printer);
        write(printer, chr(15)); { condensed }
        write(printer, chr(27), '-', chr(1)); {underlined}
        writeln(printer, 'Hello !');
        close(printer);
    end. 

В языке Express Pascal есть логические устройства LST:, LPT: и PRN:, которые связаны с драйвером параллельного порта принтера. Для вывода информации на принтер можно использовать любое из них.

В разделе описания переменных объявляется переменная-файл (например, printer) типа TEXT. С помощью операторов ASSIGN (printer, (имя логического устройства)) и REWRITE (printer) вывод в нее направляется на указанное логическое устройство, связанное через BIOS с адаптером принтера. Вывод реализуется с помощью операторов WRITE (переменная-файл, ...) и WRITELN (переменная-файл, ...). Пример аналогичен предыдущему.

    Program TestPrinter; 
    var 
        printer : text;
    begin
        assign(printer, 'LST:');
        rewrite(printer);
        write(chr(15)); { condensed }
        write(chr(27), '-', chr(1)); {underlined}
        writeln(printer, 'Hello !');
        close(printer);
    end. 

Работа с принтером в среде языка компилятора Aztec Си похожа на работу с дисковым файлом.

Одним из возможных способов является применение функций буферированного ввода-вывода. В этом случае пользователь должен объявить указатель на макроопределение FILE (например, FlLE*printer), затем присвоить этому указателю значение, полученное в результате открывания файла с именем LST: на запись (printer==fopen('LST:','w')). Имя LST: является зарезервированной синтаксической конструкцией, присвоенной логическому устройству вывода на принтер, поэтому оно распознается компилятором среди других имен файлов.

После открывания такого файла можно применять любые функции буферированного ввода-вывода, используемые обычно для записи в поток, связанный с дисковым файлом: fprintf (printer, format, arg1, ...), fputs (printer), fwrite (buffer, size, count, printer), aputc (printer). Пример аналогичен предыдущему.

    #include "libc.h"
    #define CR  13
    #define ESC 27

    main() {
        FILE *printer;

        printer=fopen("LST:", "w");
        fprintf(printer, "%c%c%c%c\n", 15, ESC, '-', 1);
        fputs("Hello !", printer);
        aputc(CR, printer);
        fclose(printer);
    }

Для 8-разрядных машин с операционной системой СР/М-80 существуют и другие компиляторы Си. Приведенный пример подходит для компиляторов, в которых определено логическое устройство LST:, и компьютеров, содержащих в BIOS подпрограммы работы с принтером.

Управление принтером на физическом уровне. Если применение стандартного драйвера принтера становится неудобным, пользователь может написать свой собственный драйвер, адресуясь непосредственно по физическим адресам аппаратного адаптера принтера.

Адреса регистров адаптера принтера ПК "Корвет" в ОС СР/М v. 2.2, BIOS v. 2.0 приведены в табл. 2.

Таблица 2. Адреса регистров адаптера принтера
Регистр Адрес Назначение
Регистр данных FB30H Передача данных
Регистр состояния FB38H Проверка готовности
Регистр управления FB33H Формирование строба

Готовность принтера к приему данных проверяется чтением из регистра состояния и проверки бита 2: если он равен 1, принтер готов к приему данных. В этом случае передаваемый байт данных в инвертированном виде записывается в регистр данных, после чего программно формируется управляющий строб (последовательной записью в регистр управления чисел 0ВН и 0АН).

В соответствии с техническими описаниями Epson-совместимых принтеров управляющий строб должен иметь длительность не менее 0,5 мкс, задержку относительно момента выставления данных на шину - не менее 0,5 мкс. Нетрудно видеть, что для 8-разрядных компьютеров эти условия выполняются автоматически при применении любых языков программирования, в том числе и ассемблера.

Некоторые принтеры, не принадлежащие к семейству Epson, требуют прямого (а не инвертированного) представления байта данных. Это относится, например, к термопечатающим устройствам отечественного производства семейства "Электроника".

Для адекватной печати русского текста на русифицированных принтерах в случае несовпадения кодировок кириллицы в компьютере и принтере пользователю следует создать и разместить в своей программе собственную перекодировочную таблицу, через которую необходимо пропускать передаваемый текст.

Подпрограмму передачи символа или массива символов непосредственно через параллельный порт лучше писать на ассемблере - это позволит достичь максимальной скорости передачи. Выигрыш в скорости особенно наглядно проявляется при выдаче больших массивов данных (до 2 Кбайт) при печати графических изображений в режиме учетверенной плотности.

Ниже приведен пример простой реализации драйвера печати на Бейсике (собственно драйвер записан в строках 200- 250). Его алгоритм легко переписать на Паскале или Си.

    
    10 S$="My own printer driver"
    20 FOR I=1 TO LEN(S$)
    30 D=ASC(MID$(S$,I,1)): GOSUB 200
    40 NEXT I
    50 D=13: GOSUB 200
    60 END
    70 REM Подпрограмма выдачи символа с кодом D на принтер
    200 S=PEEK(&HFB38) :REM Чтение регистра состояния
    210 IF (S AND 4) <> 4 THEN 200 :REM Проверка готовности принтера
    220 POKE &HFB30, 255-D :REM Запись инвертированного Байта в регистр данных
    230 POKE &HFB33, &НВ :REM Формирование строва
    240 POKE &HFB33, &НА :REM Формирование строва
    250 RETURN

Продолжение следует.