ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.07.2020
Просмотров: 3145
Скачиваний: 1
щая программа на Бейсике делает именно это, переключая LPT1 и
LPT2. Ее повторное использование переключает адреса обратно,
возвращая систему к первоначальной конфигурации.
100 DEF SEG = &H40 'указываем на область данных BIOS
110 X = PEEK(8) 'получаем младший байт адреса LPT1
120 Y = PEEK(9) 'получаем старший байт адреса LPT1
130 POKE 8,PEEK(10) 'переносим младший байт адреса LPT2
140 POKE 9,PEEK(11) 'переносим старший байт адреса LPT2
150 POKE 10,X 'посылаем младший байт LPT1 в LPT2
160 POKE 11,Y 'посылаем старший байт LPT1 в LPT2
170 SYSTEM 'выходим из Бейсика
Эта программа будет очень кстати, если готовое программное
обеспечение не адресуется к нужному принтеру. Ее можно откомпили-
ровать и хранить на диске, скажем под именем OTHERPRN, после чего
надо будет только напечатать ее имя (в ответ на запрос DOS),
чтобы переключиться с принтера на принтер. Если у Вас нет транс-
лятора с Бейсика, то создайте командный файл OTHERPRN.BAT и по-
местите в него строку BASIC OTHERPRN. Когда Вы напечатаете OT-
HERPRN, то будет автоматически загружен Бейсик, который загрузит
и выполнит программу OTHERPRN.BAS, после чего Вы вернетесь в
операционную систему. Необходимо, правда, чтобы на диске имелся
интерпретатор Бейсика BASIC.COM. Помните, что Вы должны устоять
перед искушением испытать эту программу перед тем, как она будет
записана на диск, поскольку если Вы ее запустите, то она сотрет
себя.
Низкий уровень.
Один способ, которым программа на ассемблере может изменить
принтер, на который она посылает данные, состоит в использовании
для печати только функции 0 прерывания 17H [6.3.1]. Эта функция
требует, чтобы номер принтера был помещен в DX. Заведите перемен-
ную для этого номера, с тем чтобы он мог быть изменен в любой
момент. Вторая возможность состоит в обмене базовых адресов LPT1
и LPT2 или LPT3. Следующая программа делает именно это. Как и все
короткие утилиты, она должна писаться в COM форме, как объяснено
в [1.3.6].
;---обмен базовыми адресами LPT1 и LPT2
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. Установка спецификаций печати.
Для установки различных спецификаций, относящихся к формату
страницы, стилю шрифта и т.п., на принтер посылаются специальные
управляющие коды. Эти коды посылаются на принтер как и любые
другие данные. Некоторые из них это простые однобайтные коды из
числа первых 32-х набора кодов ASCII. Эти управляющие коды (пере-
численные в [7.1.9]) инициируют такие простые действия принтера,
как перевод строки или перевод формата (прогон страницы). Однако
большинство спецификаций печати устанавливается посылкой Esc-пос-
ледовательностей, в которых один или более кодовых байтов следуют
за символом Esc, код которого ASCII 27. Начальный код Esc инфор-
мирует принтер, что символ(ы) который следует за ним следует
интерпретировать как команду, а не как данные. Такие Esc-последо-
вательности обычно не имеют символа-ограничителя, поскольку прин-
тер "знает" длину каждой последовательности. Только в некоторых
случаях, когда последовательность может иметь разную длину, тре-
буется ограничивающий символ, в качестве которого всегда исполь-
зуется код ASCII 0.
Почти во всех случаях спецификации установленные этими кодами
действуют до тех пор, пока они не будут явно отменены. Как только
будет получен код, например, подчеркивания, то оно будет осу-
ществляться до тех пор, пока не будет послан код отмены подчерки-
вания. Буфер принтера может быть очищен без отмены установленных
спецификаций. Но если произошла ошибка на принтере и принтер был
выключен и включен, то необходимо снова устанавливать все специ-
фикации.
Большинство кодов устанавливающих спецификации принтера пере-
мешаны с данными, на которые они действуют. Например, данные для
слова, которое должно быть выделено жирным шрифтом, должны пред-
варяться Esc-последовательностью, включающей жирный шрифт, и
завершаться Esc-последовательностью, выключающей его. Поскольку
универсальный стандарт на эти коды отсутствует, то печать с ис-
пользованием мощных возможностей требует, чтобы для каждого под-
держиваемого принтера были написаны драйверы. Каждый драйвер
преобразует инструкции, генерируеиые процедурой печати, в прото-
кол, используемый данным принтером.
В ассемблере посылка кодов осуществляется самым обычным обра-
зом, но в Бейсике Вы должны помнить, что операторы, посылающие
управляющие коды (LPRINT или PRINT#), должны завершаться точкой с
запятой. В противном случае операторы будут автоматически добав-
лять к посылаемым кодам пару возврат каретки/перевод строки.
Обсуждения и примеры последующих страниц в основном относятся
к графическому принтеру IBM. Коды, используемые этим принтером,
настолько же "стандартны", насколько и любой другой протокол. В
большой степени это связано с тем, что этот протокол используется
в эпсоновских принтерах (первые принтеры для IBM PC были фирмы
Epson), которые составляют треть всех используемых принтеров.
Управляющие коды, используемые принтерами IBM сравниваются в
разделе [6.2.7]. Хотя информация, приведенная в данном разделе,
может быть неприменима к тому принтеру, с которым Вы работаете,
но большинство общих принципов применимо.
6.2.1 Установка текстового и графического режимов.
Принтер всегда находится в текстовом режиме, до тех пор пока
он специально не переведен в графический режим. Команда, устанав-
ливающая графический режим, должна сообщать какое число байтов
графических данных будет передано (но не больше одной строки) и
после того, как это число байтов будет интерпретировано как гра-
фическое изображение, принтер вернется в текстовый режим. По этой
причине нет команды, которая переводит принтер в текстовый режим.
Число графических режимов у разных принтеров разное. Во всех
случаях, за кодом устанавливающим графический режим следуют 2
байта, указывающие какое число графических байтов будет передано
(сначала младший байт). Чтобы вычислить значение этих двух бай-
тов, разделите число байтов данных на 256 и поместите результат
во второй байт, а остаток - в первый байт. За этими двумя байтами
должны сразу следовать байты данных.
Каждый байт определяет цепочку битов, соответствующих восьми
вертикальным точкам одной позиции в строке. Младший бит (1) соот-
ветствует низу колонки, а старший бит (128) - верху. Например,
чтобы напечатать пирамиду, пошлите сначала байт, у которого уста-
новлен только нижний бит, затем байт у которого установлены 2
нижних бита и т.д. После восьмого байта расположите те же байты в
обратном порядке. Значение первого байта будет 1, второго - 3
(1+2), затем 7 (1+2+4), затем 15 (1+2+4+8) и т.д. На рисунке 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 байтов
графических данных, а затем идет последовательность байтов дан-
ных. Конечно то же самое можно запрограммировать умнее, организо-
вав цикл, в котором будут передаваться байты данных. Отметим, что
все проблемы в этом случае возникают, если указанное число байтов
не соответствует числу посылаемых байтов. Чтобы создать пробел
между графическими фигурами выведите несколько байтов с нулевым
значением. В Бейсике, когда в одной строке выводится больше 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 Управление движением бумаги.
Бумага на принтере передвигается командами перевода строки,
вертикальной табуляции и перевода формата. Установкой переключа-
телей на принтере определяется будет ли принтер автоматически
переходить на новую страницу при обнаружении перфорации между
страницами. Если перфорация не будет пропускаться, то печать
может завершиться прямо на вернем краю очередной страницы. Про-