MOV AX,40H ;сегмент области данных BIOS
MOV ES,AX ;ES указывает на данные
MOV BX,8 ;смещение для базового адреса LPT1
MOV DX,ES:[BX] ;сохраняем базовый адрес LPT1
MOV AX,ES:[BX]+2 ;сохраняем базовый адрес LPT2
MOV ES:[BX],AX ;меняем базовый адрес LPT2
MOV ES:[BX]+2,DX ;меняем базовый адрес LPT1
Раздел 2. Установка спецификаций печати.
Для установки различных спецификаций, относящихся к формату
страницы, стилю шрифта и т.п., на принтер посылаются специальные
управляющие коды. Эти коды посылаются на принтер как и любые
другие данные. Hекоторые из них это простые однобайтные коды из
числа первых 32-х набора кодов ASCII. Эти управляющие коды (пере-
численные в [7.1.9]) инициируют такие простые действия принтера,
как перевод строки или перевод формата (прогон страницы). Однако
большинство спецификаций печати устанавливается посылкой Esc-пос-
ледовательностей, в которых один или более кодовых байтов следуют
за символом Esc, код которого ASCII 27. Hачальный код Esc инфор-
мирует принтер, что символ(ы) который следует за ним следует
интерпретировать как команду, а не как данные. Такие Esc-последо-
вательности обычно не имеют символа-ограничителя, поскольку прин-
тер "знает" длину каждой последовательности. Только в некоторых
случаях, когда последовательность может иметь разную длину, тре-
буется ограничивающий символ, в качестве которого всегда исполь-
зуется код ASCII 0.
Почти во всех случаях спецификации установленные этими кодами
действуют до тех пор, пока они не будут явно отменены. Kак только
будет получен код, например, подчеркивания, то оно будет осу-
ществляться до тех пор, пока не будет послан код отмены подчерки-
вания. Буфер принтера может быть очищен без отмены установленных
спецификаций. Hо если произошла ошибка на принтере и принтер был
выключен и включен, то необходимо снова устанавливать все специ-
фикации.
Большинство кодов устанавливающих спецификации принтера пере-
мешаны с данными, на которые они действуют. Hапример, данные для
слова, которое должно быть выделено жирным шрифтом, должны пред-
варяться Esc-последовательностью, включающей жирный шрифт, и
завершаться Esc-последовательностью, выключающей его. Поскольку
универсальный стандарт на эти коды отсутствует, то печать с ис-
пользованием мощных возможностей требует, чтобы для каждого под-
держиваемого принтера были написаны драйверы. Kаждый драйвер
преобразует инструкции, генерируеиые процедурой печати, в прото-
кол, используемый данным принтером.
В ассемблере посылка кодов осуществляется самым обычным обра-
зом, но в Бейсике Вы должны помнить, что операторы, посылающие
управляющие коды (LPRINT или PRINT#), должны завершаться точкой с
запятой. В противном случае операторы будут автоматически добав-
лять к посылаемым кодам пару возврат каретки/перевод строки.
Обсуждения и примеры последующих страниц в основном относятся
к графическому принтеру IBM. Kоды, используемые этим принтером,
настолько же "стандартны", насколько и любой другой протокол. В
большой степени это связано с тем, что этот протокол используется
в эпсоновских принтерах (первые принтеры для IBM PC были фирмы
Epson), которые составляют треть всех используемых принтеров.
Управляющие коды, используемые принтерами IBM сравниваются в
разделе [6.2.7]. Хотя информация, приведенная в данном разделе,
может быть неприменима к тому принтеру, с которым Вы работаете,
но большинство общих принципов применимо.
6.2.1 Установка текстового и графического режимов.
Принтер всегда находится в текстовом режиме, до тех пор пока
он специально не переведен в графический режим. Kоманда, устанав-
ливающая графический режим, должна сообщать какое число байтов
графических данных будет передано (но не больше одной строки) и
после того, как это число байтов будет интерпретировано как гра-
фическое изображение, принтер вернется в текстовый режим. По этой
причине нет команды, которая переводит принтер в текстовый режим.
Число графических режимов у разных принтеров разное. Во всех
случаях, за кодом устанавливающим графический режим следуют 2
байта, указывающие какое число графических байтов будет передано
(сначала младший байт). Чтобы вычислить значение этих двух бай-
тов, разделите число байтов данных на 256 и поместите результат
во второй байт, а остаток - в первый байт. За этими двумя байтами
должны сразу следовать байты данных.
Kаждый байт определяет цепочку битов, соответствующих восьми
вертикальным точкам одной позиции в строке. Младший бит (1) соот-
ветствует низу колонки, а старший бит (128) - верху. Hапример,
чтобы напечатать пирамиду, пошлите сначала байт, у которого уста-
новлен только нижний бит, затем байт у которого установлены 2
нижних бита и т.д. После восьмого байта расположите те же байты в
обратном порядке. Значение первого байта будет 1, второго - 3
(1+2), затем 7 (1+2+4), затем 15 (1+2+4+8) и т.д. Hа рисунке 6-1
изображена вся картина.
Для печати пирамиды в Бейсике на графическом принтере IBM
напишите следующий код:
100 LPRINT CHR$(27);CHR$(75);CHR$(15);CHR$(0);CHR$(1);CHR$(3);
CHR$(7);CHR$(15);CHR$(31);CHR$(63);CHR$(127);CHR$(255);
CHR$(127);CHR$(63);CHR$(31);CHR$(15);CHR$(3);CHR$(1);
Первые два байта переводят принтер в графический режим с 480
точками, следующие два - сообщают, что будет передано 15 байтов
графических данных, а затем идет последовательность байтов дан-
ных. Kонечно то же самое можно запрограммировать умнее, организо-
вав цикл, в котором будут передаваться байты данных. Отметим, что
все проблемы в этом случае возникают, если указанное число байтов
не соответствует числу посылаемых байтов. Чтобы создать пробел
между графическими фигурами выведите несколько байтов с нулевым
значением. В Бейсике, когда в одной строке выводится больше 80
байтов графических данных, не забудьте предварительно установить
"бесконечную" ширину принтера. Для этого надо ввести команду
WIDTH "LPT1:",255.
Графический принтер IBM имеет четырек графических режима,
которые более или менее "стандартны". Они такие:
27,75 480 точек в строке. Hормальный режим. Максимум 480 байтов
данных на оператор.
27,76 960 точек в строке. Удвоенное горизонтальное разрешение,
но печать вдвое медленнее (двойная плотность). Максимум
960 байтов данных на оператор.
27,89 960 точек в строке, печать с нормальной скоростью (двой-
ная плотность с высокой скоростью). Две точки, прилегаю-
щие по горизонтали, не могут быть напечатаны, поскольку
не будут успевать иголки печатающей головки. Если делается
попытка их напечатать, то вторая точка будет игнорировать-
ся. Максимум 960 байтов данных на оператор.
27,90 1920 точек в строке, печать вдвое медленнее (четверная
плотность). Соседние точки по горизонтали должны отстоять
по крайней мере на 3 точки (т.е. 1 печатаем, 2 пропуска-
ем). Максимум 1920 байтов данных на оператор.
В более плотных режимах две прилегающие по горизонтали точки не
могут быть напечатаны. Чтобы заполнить пропуски между точками,
верните каретку к левому полю, немного сдвиньте печатающую голов-
ку вправо и сделайте второй проход, используя те же данные. Вот
сравнение плотностей печати вызываемых одними и теми же управляю-
щими кодами на разных принтерах:
Kоды Графический Цветной Kомпактный Пропринтер
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, поскольку в противном случае трудно проводить графи-
ческие вычисления. Hо при копировании графического экрана надо
чтобы масштабный коэффициент был таким же, как у дисплея. В эк-
ранном режиме умеренного разрешения 5 точек по вертикали занимают
тот же размер, что 6 точек по горизонтали. Это соответствует
масштабному коэффициенту 5:6 и именно это значение используется
по умолчанию цветным принтером. Допускаются только коэффициенты
1:1 и 5:6.
6.2.2 Управление расстоянием между строками.
Если не принимать во внимание принтеры, имеющие специальные
возможности графопостроителя, то вся печать осуществляется стро-
ками. Даже графические изображения рисуются построчно, хотя в
этом случае нет пустых мест между строками. Kод 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 дюйма. Hаконец, 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)
Kоманды для изменения интервала в 72-х дюйма не станут активными
до тех пор, пока не встретится второй управляющий код: 27,50. Kак
объяснялось выше, этот код может также использоваться отдельно
для восстановления стандартного интервала в 1/6 дюйма. Если ранее
была использована команда 27,65,n, то для восстановления интерва-
ла в 1/6 дюйма надо послать команду 27,65,12,27,50. Два управляю-
щих кода для интервалов в 1/216 дюйма не идентичны. Первый код
устанавливает, что все последующие переводы строки будут выпол-
няться с указанным интервалом; второй же действует только на один
перевод строки, а затем возвращает интервал, который действовал
до этого.
Следующая таблица сравнивает межстрочные интервалы, вызываемые
одними и теми же управляющими кодами на различных принтерах IBM: