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

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

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

Ф.Н. Шерстюк

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

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

  • ДП должен обеспечивать печать русских букв в требуемой кодировке (обычно - альтернативной);

  • он должен быть "прозрачным" для других программ. Так, если какая-то программа производит графический вывод на принтер, то ДП не имеет права этому препятствовать. Причем не должно требоваться какой-то явной команды со стороны пользователя - ДП обязан сам "сообразить", когда ему следует вмешаться, а когда нет. В действительности ДП, как правило, можно написать таким образом, чтобы он оказался "прозрачным" и для других ДП (иногда запуск нескольких ДП имеет смысл - например, драйвер программы Lettrix + обычный ДП);

  • будучи раз запущенным (скажем, из AUTOEXEC.BAT), ДП не должен ни при каких обстоятельствах требовать к себе внимания пользователей. Так, например, в момент его запуска принтер не обязан быть включенным. Если же пользователь, печатая русский текст, выключит и снова включит принтер, а затем продолжит печать (весьма частая операция!), то после такой процедуры выводимый текст должен оставаться русским. Это самое сильное требование к ДП, и оно выполняется чрезвычайно редко;

  • ДП не должен занимать слишком много места в оперативной памяти;

  • при попытке повторно запустить ДП не должна создаваться еще одна резидентная копия программы; это самое слабое требование, однако и ему удовлетворяют отнюдь не все ДП.
  • Все эти минимальные и абсолютно необходимые требования, ничего экстраординарного в них нет. И все же мне не удалось обнаружить ни одного ДП, для которого бы все они выполнялись, и в результате пришлось писать соответствующие программы самостоятельно. В данной статье я хочу поделиться своим опытом работы в этой области. Все сказанное будет относиться к принтеру, подключенному к IBM PC через параллельный интерфейс (Centronix).

    Но сначала - несколько "лирических отступлений".

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

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

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

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

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

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

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

    Следует, впрочем, отметить, что при написании ДП необходимо в ряде случаев пользоваться некоторыми дополнительными возможностями компилятора, не предусмотренными стандартами языка Си. Для компиляции программ, приводимых в этой статье, использовался пакет Turbo C 2.0.

    ЧТО ДЕЛАЕТ ДРАЙВЕР ПРИНТЕРА
    Прикладная программа выводит информацию на принтер одним из следующих способов:

  • используя порты принтера. Программа получает полный контроль над принтером, и никакой ДП не может повлиять на результат ее работы. Такой способ весьма зависим аппаратно, и для его применения должны быть веские основания. Единственной известной мне программой, действующей таким образом, является PCWATCH;

  • используя BIOS. Для печати вызывается прерывание 17h (INT 17). Программа обработки этого прерывания, естественно, использует для печати порты принтера;

  • используя DOS. Печать осуществляется как вывод на одно из устройств: PRN; LPT1; LPT2; LPT3. Это самый "легальный" способ печати, однако он имеет ряд недостатков (на которых мы не будем здесь останавливаться), поэтому чаще всего прикладные программы печатают с помощью прерывания 17h. Драйверы устройств PRN и LPT1-LPT3 и т.д. для вывода на печать также используют это прерывание.

  • Как правило, ДП бывает рассчитан и на программы, печатающие через DOS, и на печатающие через BIOS. Такой ДП "перехватывает" прерывание 17h, т.е. запоминает содержимое его вектора и записывает в этот вектор адрес своей подпрограммы. Тогда, если какая-нибудь программа (или драйвер устройства PRN, LPT1,...), желая напечатать символ, обращается к прерыванию 17h, управление получает та подпрограмма ДП, адрес которой записан в векторе. Эта подпрограмма, в свою очередь, для печати символа может обратиться к той программе, адрес которой находился в векторе раньше. Все рассмотренные в статье ДП действуют именно по этому принципу.

    Заметим, что ДП, вопреки своему названию, строго говоря, драйвером не является. Действительно, драйвером принято называть программу обслуживания запросов к какому-то устройству DOS, в то время как разновидность программ, о которой идет речь, - это скорее "усовершенствование" BIOS. Однако, поскольку среди отечественных пользователей IBM PC устоялась терминология, в соответствии с которой резидентную программу русификации называют драйвером, то и мы будем ее придерживаться.

    ПОРТЫ ПАРАЛЛЕЛЬНОГО ИНТЕРФЕЙСА И ПРЕРЫВАНИЕ 17H

    Возможности BIOS позволяют подключать к компьютеру до четырех принтеров, имеющих интерфейс Centronix. Каждому подключенному принтеру соответствуют три порта (будем называть их портами 0, 1 и 2), которые располагаются подряд в адресном пространстве ввода-вывода. Адрес порта 0 (базового) записывается в области данных BIOS (см. табл. 1).
    В порт данных (0) выводится символ, который надо напечатать. Из него можно также считать последний выведенный символ.
    Порт стояния (1) предназначен только для чтения. Назначение его битов - флагов состояния принтера - подробно описано в табл. 2.
    Порт управления (2) предназначен для чтения/записи. Назначение его битов приводится на рисунке.

    Программа обработки прерывания 17h имеет определенные входные и выходные параметры, передаваемые через регистры процессора. Входной параметр, находящийся в регистре AH, определяет функцию, ради которой вызвано прерывание. Выходной параметр в регистре AH для всех функций представляет собой флаги состояния принтера. Эти флаги совпадают с битами порта 1 (см. табл. 2), за исключением флага ERR, который является инверсией бита -ERR: он равен 0, когда ошибки нет. Функций прерывания 17h имеется три.

    ФУНКЦИЯ 0: печать символа
       Входные параметры:
    AH=0.
    AL=символ, который должен быть напечатан.
    DX=номер принтера (0, 1, 2 - LPT1, LPT2, LPT3, LPT4 соответственно).
       Выходные параметры:
    AH=флаги состояния принтера.
    Дополнительно устанавливается бит 0 (TIMEOUT); он равен 1, когда символ не напечатан.

    Комментарий. Эта функция выполняет печать символа. Управление возвращается либо если символ напечатан, либо по прошествии определенного времени (оно называется тайм-аут - timeout - и величина его варьируется в зависимости от компьютера) так и не представилась возможность его напечатать (например, принтер был выключен).

    ФУНКЦИЯ 1: инициализация принтера
       Входные параметры:
    AH=1.
    DX=номер принтера (0, 1, 2 - LPT1, LPT2, LPT3, LPT4 соответственно).
       Выходные параметры: AH=флаги состояния принтера.

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

    ФУНКЦИЯ 2: получение состояния принтера
       Входные параметры:
    AH=2.
    DX=номер принтера (0, 1, 2 - LPT1, LPT2, LPT3, LPT4 соответственно).
       Выходные параметры:
    AH=флаги состояния (см. табл. 2).

    Драйвер принтера должен перехватывать прерывание 17h и поддерживать тот же интерфейс. Как правило, он оставляет без изменения обработку функций 1 и 2, сосредоточив всю содержательную деятельность на имитации выполнения функции 0.


    Таблица 1. Адреса, по которым размещаются номера базовых портов принтера в сегменте данных BIOS.

    Адрес
    Содержимое
    40h:8h
    40h:Ah
    40h:Ch
    40h:Eh
    Номер базового порта принтера LPT1
    Номер базового порта принтера LPT2
    Номер базового порта принтера LPT3
    Номер базового порта принтера LPT4

    Таблица 2. Значения порта 1.

    Бит
    Описание
    3
    (-ERR)

    Если он равен 0 (или, что то же самое, бит ERR, возвращаемый функциями INT 17, равен 1) - с принтером что-то не в порядке. Смысл этого "что-то" может быть очень широким, поэтому пользоваться данным битом следует с осторожностью.

    4
    (SEL)

    Очень важный для написания ДП бит. У большинства принтеров он равен 1, когда принтер включен, и 0 - когда выключен.
    К сожалению, из этого правила есть исключения. На некоторых принтерах (например, IBM Proprinter II/XL) SEL равен 0 и в тех случаях, когда принтер находится в состоянии OFF-LINE. А на некоторых других (например, HP LaserJet II) его состояние вообще не зависит от включения/выключения принтера.

    5
    (PE)

    Этот бит равен 1, если на принтере кончилась бумага. Следует учитывать, что на некоторых принтерах датчик конца бумаги отключают (программно или установкой соответствующего ключа) либо глушат механически, так как он срабатывает раньше, чем печать доходит до низа страницы (например, на принтере RAVI 8010).

    6
    (ACK)

    Этот бит так же важен, как и бит SEL. На большинстве принтеров он установлен 0, когда принтер выключен, а при включенном принтере его значение почти все время равно 1, но в тот момент, когда принтер оказывается готов к приему очередного символа, на несколько десятков микросекунд становится равным 0.
    Бит ACK дает более надежную информацию о том, включен ли принтер, чем бит SEL, однако добыть ее несколько сложнее.

    7
    (BUSY)

    Если этот бит равен 1, принтер готов к приему очередного символа.


    Назначение битов порта 2.

    Назначение битов порта 2

    ИНТЕРПРЕТАТОР КОМАНД ПРИНТЕРА
    Большинство ДП должны реагировать на каждый печатаемый символ. Например, если в принтере уже имеются русские буквы, но в другой кодировке, то каждую печатаемую букву необходимо перекодировать. Однако при печати изображений байты, составляющие графическую последовательность, перекодировать не надо. Не подлежат перекодировке также символы, являющиеся частью команд принтера.

    Чтобы отличить собственно печатаемые символы от управляющих и графических последовательностей, в ДП должен быть встроен интерпретатор команд принтера. В Приложении 1 к этой статье приводится ДП, в котором такой интерпретатор реализован в виде программы, обрабатывающей входные символы по одному и меняющей подпрограмму их обработки в зависимости от того, какой символ поступил на вход и какой была предыдущая подпрограмма обработки. Интерпретатор находится в файле UPRDRV.C, подпрограммам обработки соответствуют функции от emu до cond.

    Большинство матричных принтеров имеют систему команд, почти совместимую с принтерами Epson, IBM Proprinter либо C-ITOH 8510 (экзотическая система команд, однако в нашей стране появляется все больше совместимых с ней принтеров - причина, по видимому, в ее непопулярности на Западе и связанной с этим невысокой стоимостью принтеров). Написание интерпретаторов команд для них не представляет особого труда и не слишком удлиняет резидентную часть кода ДП. Например, ДП из Приложения 1, осуществляющий вывод символов в графическом режиме и способный интерпретировать как систему команд Epson, так и систему команд IBM Proprinter, имеет размер резидентной части 5 Кбайт (из них 2 Кбайт занимает шрифт).

    Определенную трудность представляет интерпретация система команд принтеров HP LaserJet, которая не только отличается сложностью, но в добавок еще и не однозначна. Однако вооружившись терпением, аккуратностью и здравым смыслом, можно справиться и с этой проблемой.

    ВКЛЮЧЕН ЛИ ПРИНТЕР?
    При выключении принтера интерпретатор команд, очевидно, должен устанавливать подпрограмму обработки обычного (не являющегося частью ни управляющей, ни графической последовательностью) символа; кроме того, если в принтер, обслуживаемый ДП, можно загрузить шрифт, то эта загрузка производится перед печатью первого символа после включения принтера. Таким образом, перед тем, как напечатать символ, ДП должен узнать, не был ли принтер только что включен.

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

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

    Таким образом, для получения информации о том, включен ли принтер, следует опрашивать непосредственно порт состояния. Как показывает мой опыт, в подавляющем большинстве случаев бывает достаточно проанализировать бит SEL (нет ничего страшного, если на 9-игольчатом принтере SEL устанавливается в 0 при переводе принтера в OFF-LINE - перезагрузка шрифта занимает всего одну-две секунды). Если бит SEL не поддерживается (как в случае HP LaserJet II), можно использовать бит ACK (его поддерживает большое количество принтеров). Вообще говоря, желательно, чтобы ДП мог каким-то образом настраиваться на получение информации из одного или другого бита.

    Работать с битом ACK несколько сложнее, чем с SEL, поскольку при включенном принтере он в течение коротких интервалов времени может пребывать в состоянии 0. Но подпрограмма обработки прерываний от таймера не имеет права ждать несколько десятков микросекунд, чтобы выяснить, вернется ли ACK в состояние 1 или нет. Здесь можно придумать разные хитрости, например, такую: если во время двух последовательных прерываний от таймера ACK оказывался в состоянии 0 и между этими прерываниями не происходило обращение к функции 0 прерывания 17h, то принтер выключен.

    В ДП из Приложения 1 реализованы оба способа получения информации о включении/выключении принтера (через бит SEL или бит ACK - в зависимости от наличия ключа /А в командной строке при вызове ДП). С ними можно ознакомиться в функции new_int8 (обратив также внимание на функцию prn).

    СПЕЦИФИЧЕСКИЕ ПРОБЛЕМЫ РАЗРАБОТКИ ДП
    Объем журнальной статьи не позволяет останавливаться в ней на общих вопросах, касающихся написания на языке Си резидентных программ (кстати, ДП - простейшая их разновидность), и поэтому дальнейшее изложение будет посвящено только специфическим проблемам, связанным с разработкой ДП.

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

    Матричные принтеры, в которые можно загрузить весь шрифт
    Если в принтер можно загрузить шрифт для всех 222 печатаемых символов (или хотя бы для символов с кодами от 80h до FEh), то написание ДП не представляет никакой проблемы. Этот ДП должен всего лишь следить за тем, был ли принтер включен (или инициализирован посредством функции 1 прерывания 17h) непосредственно перед печатью данного символа, и если да, то, прежде, чем печатать символ, загрузить в принтер русский шрифт.

    Следует обратить внимание на следующие обстоятельства:

  • многие принтеры печатают символы псевдографики в два подхода - в этом случае вертикальные линии выглядят непрерывными. Однако если на месте символов псевдографики загрузить какие-либо символы (пусть даже эти самые символы псевдографики), то принтер перестанет использовать для них двухпроходную печать, и вертикальные линии станут "рваными". Поэтому шрифт надо загружать только для символов с кодами 80h ... AFh и E0h ... FEh;

  • принтеры, совместимые с Epson, имеют команду ESC@, инициализирующую принтер. Как правило, эта команда не стирает загруженный в принтер шрифт, но вызывает переключение на стандартный шрифт принтера. ДП должен либо переключить принтер обратно на загруженный шрифт, либо произвести процедуру инициализации полностью.

  • В листинге 1 приведены изменения, которые надо внести в ДП из Приложения 1 для того, чтобы он загружал шрифт в 9-игольчатые принтеры Epson FX (те модели, которые позволяют произвести полную загрузку шрифта) и IBM Proprinter II/XL.

    Матричные принтеры, в которые можно загрузить только символы с кодами 20h..7Eh
    Некоторые модели принтера Epson (и совместимые с ними) позволяют загружать шрифт только для символов с кодами от 20h до 7Eh. При этом также имеются команды, позволяющие переключать принтер с загруженного шрифта (назовем его RAM-шрифтом) на стандартный (назовем его ROM-ширфтом) и обратно. Казалось бы, это решает все проблемы: переносим русский шрифт на место символов, скажем, с кодами 20h ... 7Eh (например, символы с кодами 20h..4Fh, а символы с кодами E0h..FEh - на место символов с кодами 50h..6Fh), строим интерпретатор команд принтера и при печати первой русской буквы после ряда "нерусских" символов переключаемся на загруженный шрифт, а при печати "нерусского" символа после ряда русских букв - обратно.

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

    Решить эту проблему позволяет следующий трюк: поскольку русских бекв всего 2*33=66 (или 2*32=64 - если исключить букву ё), а максимальное число загружаемых символов - 95, то на место оставшихся 29 (или 31) символов можно загрузить те, которые часто встречаются в русских текстах (пробел, знаки препинания, цифры и т.п.). Тогда при печати этих символов ДП уже не должен будет переключать шрифты. Осуществлять подобную операцию помогает специальная команда принтера, копирующая ROM-шрифт в RAM-шрифт.

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

    В листинге 2 приведены изменения, которые надо внести в ДП из Приложения 1 для того, чтобы он загружал шрифт в 9-игольчатые принтеры Epson FX (те модели, которые позволяют только неполную загрузку шрифта).

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

    Однако, как и в предыдущем случае, нас здесь подстерегает проблема "запинок". На сей раз к остановке головки будет приводить каждая графическая последовательность, поэтому головка будет "запинаться" после каждой буквы.

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

    Однако это еще не все. При графическом выводе букв возникает ряд проблем. Укажем их.

    1. Головка принтера имеет 9 игл, а в графическом режиме используются только 8 из них (графические команды для управления одновременно девятью иглами имеются не на всех принтерах). Поэтому буквы, напечатанные графическим способом, менее красивы, чем алфавитно-цифровые. Конечно, можно некоторые буквы печатать в два прохода, но, во-первых, это непомерно увеличит и без того немалое время печати, а, во-вторых, для этого нужна команда обратной подачи бумаги (Reverse Linefeed), которая есть не на всех принтерах.

    2. В зависимости от плотности печати букв различаются три основных модификации шрифта: стандартный шрифт (10 символов на дюйм), шрифт "elite" (12 символов на дюйм) и сжатый (17 символов на дюйм). Хорошо бы, чтобы ДП поддерживал все три плотности печати, причем, используя один и тот же шрифт. И тут-то выясняется, что в графическом режиме плотность печати, соответствующая 12 символам на дюйм, отсутствует. В ДП из Приложения 1, который работает в графическом режиме, для букв использован шрифт 8х9 точек, для печати стандартным шрифтом и шрифтом "elite" применяется плотность 120 точек на дюйм, а для печати сжатым шрифтом - 240 точек на дюйм. Матрицы символов дополняются справа нужным количеством пустых колонок (соответственно 3, 1 и 5 для плотности 10, 12 и 17 символов на дюйм). Однако шрифт "elite", напечатанный таким способом, выглядит не очень красиво.

    3. И снова проблемы с псевдографикой. Печатать таблицы можно:

  • в графическом режиме, как и русские буквы. Но тогда вертикальные линии таблиц будут иметь разрывы, а также горизонтальные несмыкания со стандартной псевдографикой - ведь ДП не может определить, какой конкретно шрифт содержится в ПЗУ данного принтера;

  • в графическом режиме в два прохода. При реализации этого способа удобно воспользоваться тем, что на Epson-совместимых принтерах после вывода графики команда BS отводит головку в позицию начала вывода графики. Однако и здесь мы не избежим проблемы горизонтальных несмыканий, а кроме того, потребуется команда обратной подачи бумаги, которой на большинстве принтеров нет;

  • стандартным шрифтом. Но при этом возникают либо "запинки", либо потребуется трехпроходная печать (один проход - буквы и еще два - псевдографика). Как и в предыдущем случае, для организации прохода печати псевдографики можно воспользоваться командой BS.

  • По-видимому, лучше всего предоставить пользователю выбирать между первым и третьим вариантом.

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

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

    Комментарий: от себя замечу, что эта статья некогда довольно значительно помогла нам при "оживлении" одного старинного-престаринного принтера в Рязани. Буду весьма рад, если кому-нибудь она также окажется полезна. Отдельное спасибо автору статьи - Ф. Шерстюку. (Р.Ш.)
    Также о старых принтерах можно почитать (и посмотреть) в статье "28 матричных принтеров".

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

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


    Программы

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

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


    Rambler's Top100

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

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

    Hosted by uCoz