значением. В Бейсике, когда в одной строке выводится больше 80
байтов графических данных, не забудьте предварительно установить
"бесконечную" ширину принтера. Для этого надо ввести команду
WIDTH "LPT1:",255.
Графический принтер IBM имеет четырек графических режима,
которые более или менее "стандартны". Они такие:

27,75 480 точек в строке. Нормальный режим. Максимум 480 байтов
данных на оператор.
27,76 960 точек в строке. Удвоенное горизонтальное разрешение,
но печать вдвое медленнее (двойная плотность). Максимум
960 байтов данных на оператор.


27,89 960 точек в строке, печать с нормальной скоростью (двой-
ная плотность с высокой скоростью). Две точки, прилегаю-
щие по горизонтали, не могут быть напечатаны, поскольку
не будут успевать иголки печатающей головки. Если делается
попытка их напечатать, то вторая точка будет игнорировать-
ся. Максимум 960 байтов данных на оператор.
27,90 1920 точек в строке, печать вдвое медленнее (четверная
плотность). Соседние точки по горизонтали должны отстоять
по крайней мере на 3 точки (т.е. 1 печатаем, 2 пропуска-
ем). Максимум 1920 байтов данных на оператор.

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

Коды Графический Цветной Компактный Пропринтер

27,75 480 точек 1108 560 480
27,76 960 точек 2216 - 960
27,89 960 точек 2216 - 960
27,90 1920 точек 4432 - 1920

Цветной принтер уникален из принтеров IBM тем, что он может
устанавливать масштабный коэффициент (aspect ratio) для графичес-
ких изображений. Этот коэффициент отражает разницу горизонтальных
и вертикальных расстояний между точками. Обычно желателен коэффи-
циент 1:1, поскольку в противном случае трудно проводить графи-
ческие вычисления. Но при копировании графического экрана надо
чтобы масштабный коэффициент был таким же, как у дисплея. В эк-
ранном режиме умеренного разрешения 5 точек по вертикали занимают
тот же размер, что 6 точек по горизонтали. Это соответствует
масштабному коэффициенту 5:6 и именно это значение используется
по умолчанию цветным принтером. Допускаются только коэффициенты
1:1 и 5:6.


    6.2.2 Управление расстоянием между строками.



Если не принимать во внимание принтеры, имеющие специальные
возможности графопостроителя, то вся печать осуществляется стро-
ками. Даже графические изображения рисуются построчно, хотя в
этом случае нет пустых мест между строками. Код ASCII 10 - стан-
дартный управляющий код перевода строки. Посылка его на принтер
(без предшествующего кода Esc) приводит к тому, что бумага будет
продвинута вперед на указанный интервал. Обычно, если перевод
строки не посылается за кодом возврата каретки, то печатающая
головка возвращается к левому краю бумаги и можно снова печатать
на той же строке. Однако можно сделать так, чтобы перевод строки
делался автоматически при каждом возврате каретки. Этим управляют
переключатели на принтере. Это же можно сделать установив бит 1
регистра управления выводом (см. [6.1.0]). Многие принтеры могут


включать и выключать автоматический перевод строки с помощью
управляющих кодов 27,53, а некоторые могут делать обратный пере-
вод строки с пмощью кодов 27,93.
По умолчанию графический принтер использует интервал печати
равный 1/6 дюйма (т.е. выводят 6 строк на дюйм) и к этому режиму
всегда можно вернуться, посылая управляющие коды 27,50 (эти коды
используются также в сочетании с коды изменения интервала между
строками, обсуждаемыми ниже). Для этого принтера имеются еще два
предопределенных межстрочных интервала, 1/8 дюйма и 7/72 дюйма.
Соответствующие им управляющие коды 27,48 и 27,49.
Возможна и более тонкая градация межстрочных интервалов. Гра-
фический принтер использует три кода, позволяющие изменить интер-
вал на очень малую величину. Все три управляющих кода используют
2-хбайтную Esc-последовательность, за которой следует число 72-х
или 216-х долей дюйма, определяющих межстрочный интервал. Верти-
кальное расстояние между центрами двух точек равно 1/72 дюйма.
Интервал 8/72 дюйма не оставляет промежутка между строками (9
строк на дюйм). Стандартный интервал 6 строк на дюйм задается
числом 12/72 дюйма. Наконец, 1/216 равна 1/3 от 1/72. Изменение
на такую величину позволяет печатающей головке слегка сдвинуться
от центра строки, с тем чтобы точки при втором проходе заполнили
промежутки, обеспечивая печать более высокого качества. Вот эти
Esc-последовательности:

Изменение Esc-последовательность

72-е дюйма 27,65,n (где n от 1 до 85)
216-е дюйма 27,51,n (где n от 1 до 255)
216-е дюйма 27,74,n (где n от 1 до 255)

Команды для изменения интервала в 72-х дюйма не станут активными
до тех пор, пока не встретится второй управляющий код: 27,50. Как
объяснялось выше, этот код может также использоваться отдельно
для восстановления стандартного интервала в 1/6 дюйма. Если ранее
была использована команда 27,65,n, то для восстановления интерва-
ла в 1/6 дюйма надо послать команду 27,65,12,27,50. Два управляю-
щих кода для интервалов в 1/216 дюйма не идентичны. Первый код
устанавливает, что все последующие переводы строки будут выпол-
няться с указанным интервалом; второй же действует только на один
перевод строки, а затем возвращает интервал, который действовал
до этого.

Следующая таблица сравнивает межстрочные интервалы, вызываемые
одними и теми же управляющими кодами на различных принтерах IBM:

Коды Матричный Графический Цветной Компактный Струйный Ромашка Про-
принтер принтер принтер принтер принтер принтер

27,48 1/8 1/8 1/8 1/9 1/8 1/8 1/8
27,49 7/72 7/72 6/72 1/9 9/96 7/72
27,50 1/6 1/6 1/6 1/6 1/6 1/6 1/6
27,51 n/216 n/144 n/216
27,65 n/72 n/72 n/72 n/72 n/72
27,74 n/216 n/144 n/216


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


    6.2.3 Управление движением бумаги.



Бумага на принтере передвигается командами перевода строки,
вертикальной табуляции и перевода формата. Установкой переключа-
телей на принтере определяется будет ли принтер автоматически
переходить на новую страницу при обнаружении перфорации между
страницами. Если перфорация не будет пропускаться, то печать
может завершиться прямо на вернем краю очередной страницы. Про-
пуск перфорации оставляет по три пустых строки сверху и снизу
каждой страницы. На самом деле принтер не распознает перфорацию,
вместо этого он считает, что в начальный момент бумага выравнена
на начало страницы и считает число переводов строки. Можно прог-
раммно переопределить установку переключателей, посылая на прин-
тер управляющие коды 27,56, чтобы принтер не делал пропуска пер-
форации и 27,57, чтобы делал пропуск перфорации.
Графический принтер использует код, который определяют число
строк, пропускаемых между страницами. Этот код 27,78,n, где n -
число строк от 1 до 127. Например, код 27,78,10 приведет к тому,
что принтер будет пропускать по 10 строк. Если межстрочный интер-
вал равен 1/6 дюйма, то 11-тидюймовая страница будет содержать 66
строк и после печати каждых 56-ти строк принтер будет делать
пропуск 10-ти строк. Уже Ваша программа должна позаботиться,
чтобы в самом начале прогнать бумагу на 5 строк, с тем чтобы 55
строк текста были центрированы на каждой странице.
Если используется бумага, размер которой отличается от стан-
дартного 11-тидюймового, то можно изменить длину страницы, с тем
чтобы пропуски перфорации происходили в нужном месте и чтобы
перевод формата устанавливал бумагу в правильную позицию. Размер
страницы может устанавливаться либо числом строк на странице,
либо размером в дюймах. Чтобы установить число строк на странице,
пошлите код 27,67,n, где n - число строк. Та же последователь-
ность используется и для установки длины страницы в дюймах, за
исключением того, что длина страницы записывается в форме 0,n,
где n может быть от 1 до 22 дюймов. Для стандартной страницы надо
послать команду 27,67,0,11.


    6.2.4 Управление положением печатающей головки.



Печатаемый текст распределяется по странице частично за счет
движения бумаги [6.2.3], а частично за счет движения печатающей
головки. Головка может быть позиционирована в любое место, но не
путем задания ее координат. Вместо этого указывается ее смещение,
относительно самой левой позиции, которую она может достигать. У
принтера нет датчиков, сообщающих текущее положение головки. Ваша
программа должна отслеживать положение головки, если оно должно
быть известным. При этом хорошей практикокй является начинать
печать с подачи управляющего кода 27,60, который сдвигает головку
в самую левую позицию, не делая перевода строки (то же самое
делает и код возврата каретки).


При печати текста имеется несколько способов передвинуть го-
ловку в нужное положение. Она может сдвигаться вправо подачей
одного или нескольких символво пробела или табуляции и влево
подачей одного или нескольких символов "возврат на шаг" или сим-
вола возврата каретки. Движения осуществляются непрерывно - не
воспринимайте их как соответствующие последовательности на обыч-
ной пишущей машинке. До тех пор, пока Ваша программа знает на-
чальное положение печатающей головки она может комбинацией пере-
водов строки, пробелов, табуляций и возвратов на шаг форматиро-
вать Ваш вывод в соответствии с Вашими пожеланиями. Принтеры,
которые умеют выполнять обратный пеервод строки могут использо-
ваться и как графопостроители.
В графических режимах возможно перемещение головки на малые
доли дюйма. При печати текста Вы можете войти в графический ре-
жим, чтобы добиться разных промежутков между словами. К сожале-
нию, этот процесс существенно замедляет печать. Смотрите пример в
пункте [6.3.2].
Имеется специальный код, который заставляет головку всегда
возвращаться в крайнюю левую позицию перед печатью очередной
строки, отменяя двунаправленную печать. Хотя это значительно
замедляет печать, однако при этом достигается более точное пози-
ционирование головки. Это особенно полезно при работе в графичес-
ком режиме. Чтобы включить однонаправленную печать надо послать
код 27,85,1, а чтобы вернуться к двунаправленной печати - код
27,85,0.


    6.2.5 Установка позиций табуляции.



В зависимости от принтера могут устанавливаться позиции гори-
зонтальной и вертикальной табуляции (графический принтер IBM не
имеет вертикальной табуляции). Горизонтальные табуляции опреде-
ляются, как смещения от левого края, выраженные в пробелах. В
некоторых случаях допускаются до 112 позиций горизонтальной табу-
ляции. Аналогично, вертикальные табуляции определяются как смеще-
ния относительно верха страницы, а измеряются они в межстрочных
интервалах. Для большинства принтеров IBM допускается не больше
64-х позиций вертикальных табуляций.
Первые два байта кода для установки горизонтальной табуляции
27,68, а для установки вертикальной табуляции - 27,66. Для обоих
типов табуляций далее идет строка байтов, дающая позиции табуля-
ции в возрастающем порядке. Эта строка должна завершаться байтом
ASCII 0, который служит ограничителем. Для установки горизонталь-
ной табуляции в позициях 15, 30 и 60 пошлите на принтер код 27,
68, 15, 30, 60, 0. Для установки вертикальной табуляции в строках
8 и 12 - пошлите код 27, 66, 8, 12, 0. Отметим, что если размер
страницы отличается от стандартных 11-ти дюймов, то он должен
быть установлен перед установкой позиций вертикальной табуляции.
Вертикальная табуляция отменяется кодом 27,67.
Отметим, что большинство принтеров не имеют установки полей
как таковой. Левое поле может создаваться за счет вывода табуля-
ции или ряда пробелов в начале каждой строки. Для точной установ-
ки полей перейдите в графический режим и выведите ряд байтов
ASCII 0. Правое поле создается просто за счет ограничения длины
строки.



    6.2.6 Изменение шрифта печати.



Ширина страницы 8 1/2 дюйма позволяет напечатать в строке до
80-ти обычных символов, если все они имеют одинаковую ширину.
Пропорциональная печать [6.3.3] позволяет поместить в строке еще
несколько символов. С другой стороны, плотная печать позволяет
вывести в строке 132 символа, печать с двойной шириной - 40 сим-
волов, а плотная печать с двойной шириной - 64 символа. Имейте
ввиду, что использование печати с разной шириной в одной строке
приведет к трудностям с форматированием.
Большинство матричных принтеров предоставляют набор режимов
печати специальными шрифтами. Вот перечень стандартных возможнос-
тей предоставляемых графическим принтером IBM:

Плотная печать:
Для включения режима плотной печати надо послать однобайтный
управляющий код 15. Для выключения этого режима - код 18. Стан-
дартная страница шириной 8 1/2 дюйма позволяет напечатать 132
символа в строке в этом режиме.

Печать с двойной шириной:
Для того, чтобы принтер начал печатать с двойной шириной надо
послать на него управляющий код 14. Режим печати с двойной шири-
ной необычен тем, что принтер автоматически выключает этот режим,
когда встречает символ возврата каретки или перевода строки.
Поскольку такой вид печати обычно используется для однострочных
заголовков, то это свойство удобно. Чтобы выключить этот режим в
середине строки пошлите код 20.

Выделенная печать:
При выделенной печати каждый символ печатается два раза в
одной и той же позиции. Это делает точки темнее, что создает
эффект выделения. Скорость печати при этом уменьшается вдвое. Для
включения этого режима пошлите код 27,69. Для выключения - 27,70.

Печать за два прохода:
В режиме печати за два прохода бумага сдвигается на 1/216
дюйма перед вторым проходом печатающей головки. При этом полу-
чаются более заполненные буквы, которые к тому же выглядят ярче.
Скорость печати уменьшается вдвое. Этот режим включается управ-
ляющим кодом 27,71, а выключается кодом 27,72.

Печать с подчеркиванием:
Печать с подчеркиванием может выполняться двумя способами.
Графический принтер имеет режим подчеркивания, в котором подчерк
печатается под каждым символом, включая пробелы. Для графического
принтера IBM этот режим включается кодом 27,45,1, а выключается
кодом 27,45,0. Принтеры, не имеющие режима подчеркивания могут
сделать подчерки при втором проходе по той же строке, печатая
символы подчеркивания (ASCII 95) в тех местах, где оно нужно и
пробелы (ASCII 32) во всех остальных позцициях. Второй проход
достигается тем, что после первого прохода подается код возврата
каретки без кода перевода строки. Второй проход не мешает принте-
ру правильно подсчитывать строки при вычислении размера страницы.


Печать с верхними и нижними индексами:
На графических принтерах текст с верхними и нижними индексами
сжимается вертикально. Для печати верхнего индекса пошлите управ-
ляющий код 27,83,0, а для печати нижнего - 27,83,1. Можно прямо
переходить от одних индексов к другим. Для выключения печати
индексов, с тем, чтобы принтер оказался на текущей строке пошлите
управляющий код 27,84.

Некоторые режимы не могут использоваться в комбинации с други-
ми. Если Вы хотите использовать 4 режима одновременно, то прокон-
сультируйтесь со следующей таблицей. В каждом из шести столбцов
приведена допустимая комбинация.

Комбинация 1 2 3 4 5 6

нормальный Х Х
сжатый Х Х
выделенный Х Х
за два прохода Х Х Х
с индексами Х Х Х
двойной ширины Х Х Х Х Х Х
с подчеркиванием Х Х Х Х Х Х


    6.2.7 Сравнение возможностей принтеров IBM.



В следующей таблице сравниваются управляющие коды для принте-
ров IBM. Не вся информация относительно кодов точна (обращайтесь
к документации IBM), а в ряде случаев уникальные коды опущены.
Целью настоящей таблицы является показ диапазона возможностей
принтеров и указание тех кодов, которые можно считать стандартны-
мия. Отметим, что коды для первых четырех принтеров приведены в
выпуске "Возможности и адаптеры" (Options and Adapters) из серии
технических руководств, а коды для остальных принтеров приведены
в сопровождающих их руководств по эксплуатации.

Код Функция Матричный Графический Цветной Компактный Струйный Ромашка Пропринтер
принтер принтер принтер принтер принтер

Перемещение бумаги:
10 перевод строки Х Х Х Х Х Х Х
11 вертикальная табуляция Х Х Х Х Х Х
12 перевод формата Х Х Х Х Х Х Х
13 возврат каретки Х Х Х Х Х Х Х
27,52 установка начала страницы Х Х Х
27,56 игнорировать отсутствие бумаги Х Х
27,57 отмена игнор. отсутствия бумаги Х Х
27,66 установка вертикальных таб-ций Х Х Х Х Х
27,66 очистка вертикальных таб-ций Х
27,88 установка пропуска перфорации Х Х Х Х Х
27,79 отмена пропуска перфорации Х Х Х Х Х

Перемещение печатающей головки:
8 возврат на шаг Х Х Х Х
9 горизонтальная табуляция Х Х Х Х Х Х Х
27,60 сдвиг головки в левый конец Х Х Х
27,62 установка индекса горизонталь- Х
ного движения
27,68 установка горизонт. таб-ции Х Х Х Х Х Х Х
27,68 очистка горизонт. таб-ции Х
27,77 автоматическое форматирование Х
27,80 вкл./выкл. пропорц. печати Х Х
27,82 восстан. таб-ций по умолчанию Х Х Х Х
27,85 вкл./выкл. однонапр. печати Х Х
27,88 установка левого/правого поля Х Х
27,100 программируемый пробел Х
27,101 программируемый возврат на шаг Х


Межстрочные и межсимвольные интервалы:
27,48 межстрочный интервал 1/8 дюйма Х Х Х Х Х Х
27,48 межстрочный интервал 1/9 дюйма Х
27,48 межстрочный интервал 7/72 дюйма Х Х
27,49 межстрочный интервал 7/72 дюйма Х
27,49 межстрочный интервал 9/96 дюйма Х
27,49 межстрочный интервал 6/72 дюйма Х
27,49 межстрочный интервал 1/9 дюйма Х
27,50 начать программируемый пере- Х Х Х
вод строки по 27,65
27,50 межстрочный интервал 1/6 дюйма Х Х Х Х Х Х Х
27,51 программируемый перевод Х Х
строки (n/216)
27,51 программируемый перевод Х
строки (n/144)
27,53 вкл./выкл. автоматич. пере- Х Х Х Х Х
вода строки
27,65 программируемый перевод Х Х Х Х Х
строки (n/72)
27,67 установка длины страницы Х Х Х Х Х Х Х
27,74 программируемый перевод Х Х
строки (n/216)
27,74 программируемый перевод Х
строки (n/144)
27,93 обратный перевод строки Х
27,104 перевод на пол-строки вперед Х
27,105 перевод на пол-строки назад Х


Управление шрифтами:
11 режим 15 символов на дюйм Х
14 включение режима двойной ширины Х Х Х Х Х Х
15 включение плотной печати Х Х Х Х Х Х
18 выключение плотной печати Х Х Х Х Х
18 режим 10 символов на дюйм Х Х Х
20 выключ. режима двойной ширины Х Х Х Х Х Х
27,45 вкл./выкл. подчеркивания Х Х Х Х Х Х
27,58 режим 12 символов на дюйм Х Х Х
27,69 включение жирной печати Х Х Х Х
27,70 выключение жирной печати Х Х Х Х
27,71 включение печати в 2 прохода Х Х Х Х Х
27,72 выключение печати в 2 прохода Х Х Х Х Х
27,83 включение печати индексов Х Х Х Х Х
27,84 выключение печати индексов Х Х Х Х Х
27,87 вкл./выкл. печати двойной Х Х Х Х Х
с шириной
27,91 включение цветного подчеркив. Х
27,95 вкл./выкл. overscore Х

Установка специальных шрифтов и цветов:
27,54 выбор набора символов 2 Х Х Х Х Х
27,55 выбор набора символов 1 Х Х Х Х Х
27,61 загрузка шрифта Х Х
27,73 изменение качества печати Х Х Х
27,92 печатать управляющие символы Х Х Х
27,94 печатать все символы Х Х Х
27,97 сдвиг ленты в конце страницы Х
27,98 выбор 4-й полосы ленты Х
27,99 выбор 3-й полосы ленты Х
27,109 выбор 2-й полосы ленты Х
27,121 выбор 1-й полосы ленты Х


Графические режимы:
27,75 установка режима 480 точек Х Х
27,75 установка режима 560 точек Х
27,75 установка режима 1108 точек Х
27,76 установка режима 960 точек Х Х
27,76 установка режима 2216 точек Х
27,89 установка режима 960 точек Х Х
с нормальной скоростью
27,89 установка режима 2216 точек Х
27,90 установка режима 1920 точек Х Х
27,90 установка режима 4432 точек Х
27,91 установка разрешения/цвета Х
27,110 установка масштабного коэф-нта Х Х

Другие возможности:
7 звонок Х Х Х Х Х
20 выключ. режима двойной ширины Х Х Х Х Х Х
17 выбор принтера Х Х Х Х Х
19 отмена выбора принтера Х Х Х Х
24 очистка буфера Х Х Х Х Х Х Х
27,81 отмена выбора указанного Х Х
принтера


    Раздел 3. Посылка данных на принтер.



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


    6.3.1 Вывод текстовых или графических данных на принтер.



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