Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992. 7.7. Печать русских буквЕсли среди национальных наборов символов, имеющихся в постоянном запоминающем устройстве, имеются русские буквы, то вам достаточно правильно установить переключатели SW 1-6...1-8 и SW 1-1. Если же набора русских символов нет, или в ПЗУ принтера использована не та кодировка русских символов, вам потребуются специальные программы загрузки шрифтов, такие как SETPR, комплекс SOLO, LOADFONT или аналогичные. Все эти программы используют специальные командные последовательности для переопределения тех символов, коды которых соответствуют русским буквам. Для разработки собственных символов используется сетка. В 9-игольчатых принтерах эта сетка имеет 11 столбцов и девять строк:
Из девяти строк может использоваться только 8 верхних или 8 нижних (это показано на левом и правом рисунках соответственно). Обычно символ располагается выше утолщенной линии, то есть в строках с номерами от 1 до 7. Исключение составляют такие буквы, как "у", "ц" и т.п. Нижние "хвостики" этих букв должны находиться на строке с номером 0. Есть ограничение на расположение отдельных точек определяемого символа в строке - эти точки не должны находиться рядом, то есть между точками в строке должна находиться одна свободная ячейка. Для переопределения символов 9-игольчатый принтер Epson использует команду ESC "&": ESC "&" "0" n1 n2 a1 d1 d2 ... dn Определить символы Параметры n1 и n2 задают диапазон кодов ASCII символов, начертание которых необходимо переопределить. Если вы переопределяете только один символ, эти два параметра должны быть одинаковыми. Параметр a1 определяет ширину символа в точках и его положение в сетке (использует ли символ верхние восемь линий, либо нижние восемь линий). Ширина определяемого символа требуется для печати в пропорциональном режиме, когда место, занимаемое каждой буквой в строке распечатки, зависит от ее ширины. Например, буква "Ш" шире, чем буква "И". Старший бит параметра a1 задает расположение символа в сетке. Если этот бит равен 1, используются восемь верхних линий сетки, если 0 - восемь нижних. Младшие семь битов задают ширину символа и представляют собой число, определяемое по следующей схеме:
Пусть определяемый символ располагается в верхней части сетки (использует восемь верхних строк). Пусть этот символ начинается в третьем столбце и заканчивается в 7 столбце. Тогда десятичное значение параметра a1 вычисляется следующим образом: a1 = 8(начальное значение) - - 2(два пустых столбца справа) + + 32(два пустых столбца слева) + + 128(старший бит равен 1) = 166 Если ваш символ использует верхние восемь строк сетки, начинается в первом столбце и заканчивается в девятом, в качестве параметра a1 подходит значение 136. При этом символы будут печататься верхними восемью иголками печатающей головки. Для использования нижних восьми иголок и такой же ширины символа задайте значение a1 равное 8. Параметры d1...dn - образцы столбцов точек для определяемого символа. Их должно быть всегда 11, даже если символ содержит пустые столбцы. Для пустых столбцов в качестве образца надо задать 0. Для включения определенного программой набора символов в работу необходимо выдать команду ESC "%" "0", для использования набора символов из внутреннего ПЗУ принтера выдайте команду ESC "%" "1". Приведем пример программы, изменяющей начертание символа "@" в принтере Epson FX-850/1050. Для правильной работы программы переключатель SW 1-1 должен быть установлен в положение OFF. #include <dos.h> #include <stdio.h> main() { char buffer[] = { 0x1b, '@', // Сбрасываем принтер в исходное // состояние. 7,7,7, // Выдаем 3 раза звуковой сигнал. // Определяем вместо "@" новый символ: 0x1b, '&', 0, '@', '@', 136, 32,80,168,84,42,84,168,80,32,0,0, // Выдаем строку символов, используем начертание, // заданное в ПЗУ принтера. '@', '@', '@', '@', '@', 0x0a, // Используем новое начертание: 0x1b, '%', 1, '@', '@', '@', '@', '@', 0x0a, // Возвращаемся опять к старому начертанию: 0x1b, '%', 0, '@', '@', '@', '@', '@', 0x0a, 7,7,7, // Выдаем 3 раза звуковой сигнал. '$' // Признак конца массива данных }; char *p; // Выводим строку символов на принтер for(p = buffer; *p != '$'; p++) bdos(0x05, *p, 0); } Рассмотрим теперь метод переопределения начертания символов в 24-иголочном принтере Epson LQ-2550. Для определения начертания символов в этом принтере используется сетка высотой 24 точки - соответственно, по одной точке для каждой иголки в печатающей головке. 24-иголочный принтер использует несколько наборов символов:
В зависимости от используемого набора символов ширина сетки может быть либо 9 точек (для чернового набора символов, либо 29 точек (для качественного набора символов), либо 37 точек (для пропорционального набора символов). Кроме того, для последних двух наборов столбцы сетки расположены ближе друг к другу, чем для чернового набора. На рисунке показаны сетки для чернового и качественного/пропорционального наборов символов принтера Epson LQ-2550:
Обычные символы располагаются между жирными линиями. Нижние линии сетки используются для подчеркивания и изображения "хвостиков" таких букв, как "у", "ц" и т.п. Так же, как и для 9-игольчатых принтеров, существует ограничение на расположение точек в узлах сетки: справа и слева от каждой точки должны располагаться пустые позиции. Приведем формат команды для переопределения символов в принтере Epson LQ-2550: ESC "&" "0" n1 n2 d0 d1 d2 data Определить символы Параметры n1 и n2 задают диапазон кодов ASCII символов, начертание которых необходимо переопределить. Их назначение такое же, как и для 9-игольчатых принтеров Epson. Если вы переопределяете только один символ, эти два параметра должны быть одинаковыми. Далее следуют три байта данных, которые задают ширину символа и размер свободного пространства вокруг символа. Параметр d0 задает количество свободных столбцов слева от символа, параметр d2 определяет количество свободных столбцов справа от символа. Параметр d1 определяет ширину символа в столбцах сетки. Изменяя ширину символа и размер свободного пространства вокруг него можно формировать пропорциональные наборы символов. В следующей таблице приведены максимальные значения для параметров d0, d1, d2 для различных наборов символов: Набор d1 d0+d1+d2 Черновой 9 12 Качественный, 29 36 10 символов на дюйм Качественный, 23 30 12 символов на дюйм Пропорциональный 37 42 После параметра d2 следует последовательность байтов, описывающих символ, т.е. образец для символа. Для задания одного столбца сетки требуется три байта, поэтому для определения одного символа вы должны задать (d1 * 3) байтов данных. |