ПК-ностальгия
HOME
Железо
Программы
Оборудование
Статьи и публикации
Фототаблица
Ссылки
Почта
Гостевая
ПОИСК
Новости Яndex
О сайте

Этот сайт предназначен, прежде всего, людям, ностальгирующим по ушедшим РУССКОМУ СЛОВУ, Windows 3.1, ФОТОНУ, процессорам 486SX и иже с ними.
Конечно, времена должны идти вперед, но почему они обязательно должны уходить?

StuhlbergR 2007 ©
Драйверы принтеров для IBM PC: опыт разработки
(окончание)


Принтеры, совместимые с Epson LQ
Epson LQ
Все известные мне принтеры типа Epson LQ (Epson LQ-500, Epson LQ-1000, Epson LQ-850/1050) позволяют загружать шрифты, но делать это приходится на разных моделях по-разному.

Принтеры Epson LQ-500 и Epson LQ-850/1050 позволяют загружать как символы с кодами 20h..7Eh, так и с кодами 80h..FFh - иными словами, загрузка в них русских шрифтов не требует никаких ухищрений. Иначе обстоит дело с моделью Epson LQ-1000, позволяющей загружать только символы с кодами 20h..7Eh (кроме того, у этой модели принтера отсутствует псевдографика - ее тоже надо загружать, и не происходит загрузка шрифта, если установлена плотность 12 символов на дюйм - надо переключиться на обычную плотность, загрузить шрифт и вернуться к прежней плотности). Для обеспечения универсальности соответствующего ДП пришлось загружать русский шрифт (и часть псевдографики - если это указано при запуске ДП) на место символов с кодами 20h..7Eh.

Печать текста производится способом, который был уже упомянут выше: перед печатью первого RAM-символа после ряда ROM-символов принтеру выдается команда переключения на RAM-шрифт, а перед печатью первого ROM-символа после ряда RAM-символов - команда переключения на ROM-шрифт. К счастью, во всех известных мне принтерах Epson LQ "запинок" при переключении между ROM-шрифтом и RAM-шрифтом не происходит, но я не могу поручиться, что это относится ко всем моделям. Если головка все же "запинается", следует применить буферизацию.

Главная проблема, возникающая при русификации принтеров Epson LQ, связана с тем, что в них шрифты для режимов печати Draft (черновой), Draft Indexes (верхние/нижние индексы для черновой печати), Pica LQ (качественная печать 10 символов на дюйм), Elite LQ (качественная печать 12 символов на дюйм), Proportional LQ (качественная пропорциональная) и LQ Indexes (верхние/нижние индексы для качественной печати) - считаются различными, и в каждый момент времени в принтере может находиться только один шрифт. Некоторые преобразования щрифтов принтер может выполнять автоматически. Скажем, если загрузить шрифт Pica LQ (Elite, Proportional) принтер начнет печатать русский текст преобразованным шрифтом - правда, установленная таким образом плотность 12 символов на дюйм даст текст со слишком тесно прижатыми друг к другу знаками, а в режиме Proportional печать будет происходить шрифтом постоянной ширины, но все же это будут русские буквы.

Однако преобразовывать Draft-шрифт в LQ-шрифт и наоборот принтер не может, и, таким образом, если в принтер загружен русский шрифт Pica LQ, то при переключении в режим Pica Draft печатаемый текст перестанет быть русским. Поэтому при каждом переключении между Draft и LQ (желательно также и при других переключениях, чтобы текст выглядел красиво) необходимо перезагрузить шрифт. Переключение режимов с помощью управляющих символов принтера можно предусмотреть в интерпретаторе команд, который в любом случае должен входить в состав ДП. Проблема переключения режимов с лицевой панели будет рассмотрена ниже.

Из сказанного следует, что ДП обязательно должен содержать шрифты Pica LQ и Draft, и желательно также Draft Indexes, Elite LQ, Proportional LQ, LQ Indexes. И тут возникают сразу две проблемы: где все эти шесть шрифтов взять и где взять место в памяти для их хранения. В решении первой проблемы я преуспел лишь частично, так что мой ДП для Epson LQ поддерживает только шрифты Draft, Pica LQ и Elite LQ. Вторая проблема рассматривается в разделе "Проблема "больших" шрифтов".

Принтеры, в которых русский шрифт есть, но не в нужной кодировке
С такими принтерами проблем нет: надо лишь добавить в интерпретатор команд перекодировку руских букв перед печатью.

RAVI 8010 MВ листинге 3 приведены изменения, которые надо внести в ДП из Приложения 1 для того, чтобы он печатал русские тексты на принтере RAVI 8010 M (в этом принтере нет псевдографики, а русские буквы имеют весьма экзотическую кодировку).

Русские буквы на принтерах, совместимых с HP LaserJet
Сразу же замечу, что мне приходилось сталкиваться только с принтерами HP LaserJet+, HP LaserJet II и некоторыми совместимыми с ними. Я надеюсь, что все сказанное верно также для принтеров HP LaserJet III.

Главная трудность при русификации этих принтеров носит не технический, а экономический характер: руководство программиста (содержащее подробное изложение системы команд) является библиографической редкостью. Это связано с тем, что фирма Hewlett-Packard продает это руководство не вместе с принтером, а за отдельную плату (приблизительно 10 долл.), что, конечно, делает его важной статьей экономии средств при покупке принтера (который стоит около 1500 долл.).

Другая существенная трудность состоит в том, что подавляющее большинство шрифтов для этих принтеров - пропорциональные, шрифтов постоянной ширины почти нет. Вообще, шрифты для HP LaserJet устроены довольно сложно, и для манипуляций с ними (перекодировка, повороты, разрезание/склейка, подготовка к автономной загрузке в принтер и т.д.) потребовалось написать отдельную, довольно большую (около 2 000 строк) программу. Однако вернемся к проблеме написания ДП.

Все лазерные принтеры, совместимые с HP LaserJet, позволяют загрузку шрифта. Однако символы с кодами 80h..9Fh, что соответствует заглавным русским буквам альтернативной кодировки, стандартно не печатаются даже тогда, когда они присутствуют в текущем шрифте.

На некоторых моделях, совместимых с HP LaserJet II, эти символы можно сделать печатаемыми, установив в заголовке шрифта значение параметра Font Type (тип шрифта), равное 2. При этом можно обойтись и вовсе без ДП: для загрузки шрифта достаточно ввести, например, команду COPY /B <имя файла со шрифтом> PRN. ДП может загружать шрифт автоматически по включении принтера, о чем еще пойдет речь в следующем разделе. Однако такую установку параметра Font Type позволяют не все модели; в частности, этот способ не работает на HP LaserJet+.

Существует и другое средство, позволяющее напечатать "запрещенные" символы - команда transparent printing (прозрачная печать). С помощью этой команды можно напечатать практически все символы (кроме очень ограниченного числа управляющих), но она, увы, также поддерживается далеко не всеми моделями принтеров и отсутствует на HP LaserJet+. В отношении ДП, использующих "прозрачную печать", следует заметить, что заголовок этой команды имеет длину не менее 5 байт, следовательно, ее вызов по поводу каждого "запрещенного" символа был бы непомерно накладным расходом. Пэтому здесь целесообразно прибегнуть к буферизации: накапливать символы в буфере, содержимое которого выводится на принтер либо по его заполнении, либо после поступления символа, являющегося командой или началом команды. При выводе содержимого буфера на принтер используется "прозрачная печать", если в буфере имеется хотя бы одна буква с "запрещенным" кодом, и обычный вывод - в противном случае.

Если ни один из описанных приемов использовать невозможно (как в случае принтера HP LaserJet+), остается прибегнуть к нестандартной кодировке. Шрифт в такой кодировке будет, естественно, содержать на 32 символа меньше, зато соответствующий подход будет заведомо применим при работе со всеми моделями HP LaserJet.

Разработчики русских шрифтов для лазерных принтеров создают их сразу в нестандартных кодировках (шрифты в альтернативной кодировке мне неизвестны), которых набралось уже не менее десятка; программ перекодировки этих шрифтов я пока не встречал (пришлось писать свою).

Что касается ДП, печатающего таким способом, то шрифт лучше хранить все же в альтернативной кодировке, перекодируя его при перезагрузке; аналогичный перекодировке будет подвергаться печатаемый текст. Это позволит использовать тот же набор шрифтов, что и в ДП, не использующем перекодировки, и заодно сделает манипуляции с кодами "невидимыми" для пользователя.

Проблема "больших" шрифтов
Высококачественная печать (LQ, печать на лазерном принтере) требует шрифтов, занимающих большой объем памяти. Хранить такие шрифты в оперативной памяти (для автоматической загрузки после включения принтера) нецелесообразно, а значит, их надо держать на диске, в нужный момент считывать и посылать на принтер. И здесь встает извечная проблема обращения к DOS из резидентной программы - я не буду подробно останавливаться на ее описании, так как предполагаю, что читатель с ней знаком.

К счастью, в данном случае проблема эта решается довольно просто. Действительно, обращение к функции 0 прерывания 17h могло произойти либо непосредственно из многопользовательской программы, либо из DOS. Эти случаи можно различить, перехватив прерывание 21h. В первом случае ДП может, обратившись к DOS, прочесть файл со шрифтом и скопировать его на принтер, во втором он должен, не выводя ничего на принтер, сообщать DOS о том, что символ выведен, и делать так до тех пор, пока прерывание 21h не вернет управление. В этот момент ДП может, обратившись к DOS, прочесть шрифт и скопировать его на принтер. Затем, изучив параметры функции DOS, вызвавшей прерывание 17h, ДП выводит на принтер те байты, которые она собиралась напечатать, а если принтер не готов, возвращает соответствующий код ошибки DOS.

В качестве примера было бы уместно привести ДП, загружающий шрифт в 24-игольчатый или лазерный принтер. Однако для этого потребовался бы его полный текст, поскольку "базовый" ДП, приведенный в Приложении 1, предназначен для работы с 9-игольчатым принтером. Рассмотрим несколько искусственный пример ДП, загружающего шрифт в 9-игольчатый EPSON FX или IBM Proprinter II/XL (в котором можно определять символы с кодами 90h..FEh), беря его из файла 9X11.FNT (содержимое этого файла совпадает с содержимым массива font, определенного в файле UPRFONT.C листинга 1). Поскольку ДП все равно получается "игрушечным", будем для простоты считать, что 9X11.FNT находится в текущем каталоге, и не будем уделять серьезного внимания буферизации при работе с ним. Соответствующие изменения, которые надо внести в ДП из Приложения 1, приводятся в Приложении 2. Как можно заключить из этой программы, борьба с DOS - занятие ничуть не более приятное, чем борьба с принтером.

Проблема переключателей на лицевой панели принтера
Во многие матричные принтеры можно загружать шрифты различного типа: для режима черновой (Draft) и качественной (LQ) печати, верхних и нижних индексов и т.п., и, как уже говорилось, в каждый момент времени может быть загружен только один шрифт (например, в принтере не могут одновременно присутствовать загруженные Draft и LQ-шрифты). Это не было бы серьезной проблемой, если бы переключение шрифтов осуществлялось только программно, - действительно, поскольку ДП содержит интерпретатор команд принтера, то он вполне может при таком переключении загружать в принтер нужный шрифт. Но, к сожалению, шрифты можно переключать и с лицевой панели принтера - в этом случае ДП не может об этом узнать и соответствующим образом среагировать.

Сходная проблема возникает при печати букв в графическом режиме: если на лицевой панели принтера есть клавиши, регулирующие плотность печати (10, 12, 15 символов на дюйм), ДП опять-таки остается в неведении о переключении плотности.

Чтобы справиться с этой трудностью, надо каким-то образом пользователя убедить не "жать" на клавиши управления принтером, а осуществлять все управление из программы. Ясно, что такая программа должна быть очень удобной, иначе пользователю будет проще нажать на кнопку. Идеальным вариантом, бесспорно, была бы удобная программа печати, но таковых, увы, по-видимому, не существует. Можно также написать ДП, который при нажатии на специальную клавишу "выбрасывал" бы на экран какое-нибудь меню, имитирующее лицевую панель принтера. Но, во-первых, это может непомерно увеличить объем резидентной части драйвера, а во-вторых, такое меню все же вряд ли будет удобнее, чем сама лицевая панель.

Некоторое, далеко не блестящее, но приемлемое решение этой проблемы состоит в том, чтобы написать отдельно программу установки режимов, предназначенную для работы в паре с ДП. В самом ДП при этом потребуется предусмотреть начальную установку режима, повторно осуществляемую при каждой инициализации принтера (после включения питания, выполнении функции 1 прерывания 17h и т.д.), а программа установки режимов будет передавать в ДП необходимые управляющие последовательности.

Вариант такой программы, с заданием набора нужных режимов в командной строке, приводится в листинге 4. Достоинством ее является, во-первых, то, что при задании набора режимов предоставляется больший выбор, чем на лицевой панели принтера, а во-вторых, нужный режим можно установить, не включая принтер (о своевременной посылке соответствующих команд на принтер позаботится ДП). Эта программа рассчитана на работу в паре с ДП, приведенным в Приложении 1, и требует, чтобы в том же каталоге, что и PSET.EXE, присутствовал файл PSET.DAT, содержащий описание режимов. Формат этого файла следующий.

Строки, начинающиеся с ';;', считаются комментариями и игнорируются программой.

Строки, начинающиеся с 'tt', считаются обязательным текстом и всегда выдаются на экран.

Строки, начинающиеся с 'hh', считаются текстом "шпаргалки" и выдаются на экран только тогда, когда программа вызвана без параметров.

Строки, начинающиеся с 'mm', считаются описателями режима. Далее следует имя режима (в нем существенны только первые 2 буквы), а затем - произвольный текст. Эти строки целиком выдаются на экран при вызове программы без параметров.

Вслед за строкой 'mm' должна следовать строка, содержащая команды принтера, включающие данный режим, и строка, содержащая команды принтера, выключающие данный режим. Каждая из этих строк состоит из "элементов" - групп из 1, 2 или 3 символов, окруженных пробелами. Каждый элемент задает один байт команды принтера. Односимвольный элемент задает байт с кодом, равным коду этого символа, двухсимвольный - шестнадцатиричный код байта, а трехсимвольный - его десятиричный код.

В листинге 5 приведен пример файла PSET.DAT.

Проблема слишком "гибких" принтеров
Обсуждаемая в этом разделе проблема относится не к программированию ДП, а к их применению.

В своей практике я встречал принтеры, которые могли эмулировать сразу несколько печатающих устройств (например, один из них умел "притворяться" принтером Epson, IBM Proprinter и IBM Graphics Printer). Практически все такие принтеры имеют серьезный недостаток - их внутренние микропрограммы содержат массу ошибок (много больше, чем у обычных "негибких" принтеров), большинство из которых, естественно, сосредоточены в редко используемых (на Западе) командах. А к таковым относятся прежде всего команды загрузки шрифтов. В частности, упомянутый мною принтер был, согласно документации, способен загружать шрифты во всех трех режимах, однако на практике выяснилось, что это осуществимо только в режиме эмуляции довольно редкой модели IBM Graphics Printer.

Таким образом, столкнувшись с подобным принтером, следует прежде всего выяснить, какой из его режимов эмуляции работает наиболее удовлетворительно.

Прим. Листинги к статье (включая опущенные при печати таблицы шрифтов и перекодировки) будут помещены в электронном журнале "Мир ПК Диск" №4.

... которого у меня, естественно, не оказалось в наличии... - Ш.Р.

ОБ АВТОРЕ
Федор Николаевич Шерстюк - программист, аспирант механико-математического факультета МГУ.

[1]  [2]  [Листинги и Приложения]

Статья опубликована в журнале "Мир ПК" №6/92


Программы

Большинство предоставленного здесь материала является цитированием со старых номеров компьютерных журналов, таких, как "Мир ПК" или "Весь Компьютерный Мир". К сожалению, все мои попытки связаться с этими изданиями по поводу вопроса о цитировании были безуспешны. Издания упорно хранили молчание. Что я разрешил себе расценивать как знак согласия, указывая, тем не менее, повсюду как выходные данные издания (с работающей ссылкой на Интернет-представительство), так и автора публикации. Тем более, что, в силу срока давности этих публикаций, вряд ли материал можно рассматривать как коммерческий или рекламный, пусть даже названия фирм здесь и присутствуют (уж без этого никуда). Ежели появятся какие претензии по оному поводу, прошу издания связаться со мной

Райво Штулберг


Rambler's Top100

Рейтинг@Mail.ru Сайт мышонка Портал HotINDEX: знакомства, товары, хостинг, создание сайта, Интернет-магазин, развлечения, анекдоты, юмор, эротика, погода, курсы валют и многое другое! Сайт Татьяны Полукаровой Яндекс цитирования Каталог Ресурсов Интернет
Белый каталог сайтов Литературное ДАО

Автор обращает внимание на то, что никакой представленный здесь материал не служит рекламным целям ни фирм,ни их продкутам, а носит сугубо информационно-образовательный характер

Hosted by uCoz