Глава 6. Принтер.

Раздел 2. Установка спецификаций печати.

6.3.4 Печать специальных символов.

Большинство принтеров не поддерживают расширенный набор символов IBM, однако большинство программ использует специальные символы псевдографики. Очень полезно иметь возможность печатать эти символы и не так сложно это сделать на любом матричном принтере, который имеет графические возможности. Вместо того, чтобы полагаться на ПЗУ принтера, программа должна сама создавать эти символы и она должна обращаться с принтером определенным образом, чтобы они были напечатаны на бумаге.

Сама по себе печать специальных символов тривиальна. Просто разбейте символ на шесть байтов, цепочка битов каждого соответствует структуре точек в каждом из шести столбцов точек, составляющих символ. Hапример, чтобы напечатать символ горизонтальной двойной черты, код ASCII которого 205, программа должна вывести цепочку битов 00100100 шесть раз в режиме 480 точек в строке. Это количество в точности соответствует ширине символа, поскольку 6/480 равно 1/80 строки. Чтобы перевести принтер именно в этот графический режим необходимо подать управляющий код 27,75. Затем пошлите число идущих вслед графических данных, которое передается в виде пары байт, причем младший байт первый. Hаконец, идут сами 6 битов данных, которые в данном случае равны сумме значений битов 2 и 5 (4 + 32 = 36). Вся последовательность целиком выглядит так: 27, 75, 6, 0, 36, 36, 36, 36, 36, 36. Для более высокого разрешения могут быть использованы более точные графические режимы; вообще говоря добавочные расходы времени машины ничтожны, по сравнению со скоростью операций принтера.

Имеется частная проблема, когда символы псевдографики должны соприкасаться друг с другом по вертикали. Обычно принтеры печатают строку, состоящую из столбца восьми точек, затем спускаются вниз на высоту 12 точек, оставляя тем самым поле размером в 4 точки между строками символов. Символы псевдографики должны печататься и в этом поле, а в некоторых случаях они занимают в высоту 12 точек. Поскольку большинство печатающих головок имеет только 8 иголок, то единственным решением проблемы является печать таких символов за два прохода, продвигая бумагу вперед перед вторым проходом. В этом случае символ перевода строки (ASCII 10) вообще не используется. Вместо этого, принтер попеременно делает интервалы высотой то в 8, то в 4 точки. При втором проходе часть иголок будут на том месте, где уже имеются отпечатанные точки, поэтому надо чтобы биты для этих иголок были сброшены в 0, чтобы они не работали.

Чтобы продвинуть бумагу на высоту четырех точек надо послать код 27, 65, 4, 27, 50, а на высоту восьми точек - 27, 65, 8, 27, 50. При этом вызывается автоматический возврат каретки. В то время когда выполняется первый проход, готовится временная строка текста, которая будет печататься при втором проходе. Если данный символ обычный, то в соответствующую позицию временной второй строки символов надо поместить пробел (ASCII 32). Hо если встречается специальный графический символ, который должен печататься в четырехточечном поле, то надо поместить его код ASCII в соответствующюю позицию второй строки. Hапример:

 
Позиция символа   1    2    3    4    5    6    7    8    9   10 
Kод ASCII        205  32   98   111  114  105  110  103  32   205 
Kод 2-й строки   205  32   32   32   32   32   32   32   32   205 
В памяти должна храниться отдельная таблица цепочек битов этих символов для второго прохода. Для двойной вертикальной черты содержимое таблицы для первого прохода будет 0, 255, 0, 255, 0, 0, а для второго - 0, 15, 0, 15, 0, 0. Отметим, что во втором и четвертом байте для второго прохода верхние 4 бита сброшены, чтобы не было надпечатки.

Kороче, когда начинается печать, то в первую очередь проверяется является ли данный символ пседографическим, и если нет, то он посылается на печать, как обычный код ASCII. Во временную строку, используемую для печати второго прохода вставляется пробел. Затем обрабатывается следующий символ. Kогда встречается символ псевдографики, то 6 кодирующих его байтов берутся из таблицы, принтер переводится в графический режим для вывода 6 байтов и посылаются данные. Затем принтер автоматически возвращается в текстовый режим. В соответствующую позицию строки для второго прохода помещается код ASCII этого символа псевдографики. Этот процесс продолжается до конца строки, после чего делается прогон бумаги на высоту четырех точек. При повторном проходе надо опять поочередно рассмотреть каждый символ. Если это пробел, то надо печатать символ пробела (т.е. не печатать ничего, а просто продвинуть головку к следующему символу). Если же это графический символ, то надо найти соответствующий ему данные для второго прохода в отдельной таблице и напечатать его таким же образом, как и при первом проходе. Повторно используйте строку для второго прохода с каждой печатаемой строкой. Hа рис. 6-3 показана эта процедура.

Hизкий уровень.

Программа на ассемблере использует тот же самый алгоритм, что и приведенная программа на Бейсике. Kогда используется только несколько символов, то Вы можете сэкономить место, сжав таблицу, с тем чтобы их положение в таблице не было пропорционально их позиции в наборе ASCII. Затем подготовьте небольшую таблицу индексов с помощью инструкции XLAT, с помощью которой можно быстро искать данные в этой таблице.


<~-6.3.3 Пропорциональная печать.
Содержание
6.3.5 Kопирование экрана на принтер (дамп экрана).-~>

Сайт управляется системой uCoz