Жанр: Учеба
Справочник программиста на IBM PC
... 3 должен показывать, что
принтер выключен, бит 4 - что отменен выбор принтера и бит 5 -
что нет бумаги). Нижеприведенные значения возвращаются в регистр
статуса по стандарту "Эпсон", которому обычно следует IBM:
Значение Цепочка битов Интерпретация
223 11011111 принтер готов
87 01010111 принтер не готов
119 01110111 нет бумаги в принтере
247 11110111 принтер выключен
Регистр статуса ввода имеет адрес порта на 1 больше, чем базовый
адрес принтера. Базовый адрес для LPT1 хранится по адресу
0040:0008, для LPT2 - по адресу 0040:000A и т.д. Имейте в виду,
что если принтер был выключен, то ему требуется некоторое время
на инициализацию после включения. Не начинайте печатать до тех
пор, пока регистр статуса ввода не сообщит, что принтер связан с
машиной и готов к приему данных.
Высокий уровень.
Данная процедура проверяет связан ли принтер с машиной и говорит
пользователю что делать, если нет. Она использует значения из
вышеприведенной таблицы. Как уже отмечалось, такой подход не
подходит для процедуры общего назначения, которая будет обслуживать
множество разных принтеров, но он вполне подходит, когда Вы
пишете драйвер данного печатающего устройства. Отметим, что в
строке 120 вычисляется двухбайтное число, путем умножения старшего
байта на 256 и добавления к младшему байту. Для получения
адреса регистра статуса ввода к значению полученного базового
адреса добавляется 1.
100 '''Получаем адрес LPT1 и проверяем готов ли принтер
110 DEF SEG = &H40 'указываем на область BIOS
120 PRTRBASE = PEEK(9)+256*PEEK(8)+1 'адрес регистра статуса
130 IF INP(PRTRBASE) = 223 THEN 180 'если принтер готов
140 BEEP 'иначе звонок и проверки
150 IF INP(PRTRBASE) = 87 THEN LOCATE 1,1: PRINT"Strike the
SELECT key": GOTO 150
160 IF INP(PRTRBASE) = 247 THEN LOCATE 1,1: PRINT"Turn the
printer on": GOTO 160
170 IF INP(PRTRBASE) "" 223 THEN 170 'ждем инициализации
180 '''Теперь принтер on-line — можно начинать печать
190 LPRINT Z$
Средний уровень.
Для получения байта статуса из порта принтера надо использовать
функцию 2 прерывания 17H. При входе DX содержит номер LPT
(0-2 для LPT1-3). Эта функция сбрасывает три неиспользуемых бита
байта и делает операцию исключающего ИЛИ над двумя другими, поэтому
значения отличаются от приведенных выше:
Значение Цепочка битов Интерпретация
144 10010000 принтер готов
24 00011000 принтер не готов
184 10111000 принтер выключен
И опять необходимо помнить, что эти значения меняются от принтера
к принтеру. Наиболее общую информацию "выключен или не готов"
дает бит 3 статуса равный 0.
Низкий уровень.
Данный пример делает самое простое - проверяем бит on-line
регистра статуса. Для получения байта статуса используется базовый
адрес LPT1.
;---в сегменте
MESSAGE DB 'Printer not ready - strike any key when OK$'
;---проверка связан ли принтер с машиной (on-line)
MOV AX,40H ;ES указывает на область данных BIOS
MOV ES,AX ;
MOV DX,ES:[8] ;получаем базовый адрес
INC DX ;смещение для регистра статуса
IN AL,DX ;получаем байт статуса в AL
TEST AL,1000B ;проверяем бит 3
JNZ GO_AHEAD ;если принтер on-line, то вперед
;---печатаем сообщение об ошибке и ждем нажатия клавиши
MOV AH,9 ;функция вывода строки
LEA DX,MESSAGE ;DS:DX указывают на сообщение
INT 21H ;печатаем сообщение
MOV AH,7 ;функция ожидания ввода
INT 21H ;ожидаем нажатия клавиши (без эха)
GO_AHEAD: ;продолжение программы
6.1.3 Интерпретация ошибок принтера и восстановление после
них.
Проверка ошибок не должна прекращаться на том, что Вы убедились,
что принтер связан с машиной. Ошибки принтера могут происходить
в любой момент печати и программа должна быть готова восстановить
ситуацию при сбоях. Хотя на принтере могут происходить
самые разнообразные ошибки, только три типа ошибок возвращают
информацию о себе в компьютер. Это ошибка "отсутствия бумаги",
ошибка "отсутствия связи с машиной" и общее сообщение "произошла
ошибка". Как уже говорилось в [6.1.2], не все принтеры сообщают
об этих ошибках одинаковым образом, но теоретически регистр статуса
ввода использует следующие биты:
бит 3 = 0 когда произошла ошибка на принтере
бит 4 = 0 когда принтер не связан с машиной (off-line)
бит 5 = 1 когда кончилась бумага на принтере
В частности, бит 4 может не использоваться указанным образом.
Регистр статуса ввода имеет адрес порта, который на 1 больше, чем
базовый адрес принтера. Базовый адрес для LPT1 хранится по адресу
0040:0008, для LPT2 - по адресу 0040:000A и т.д.
На низком уровне, когда программа посылает данные на принтер,
то она постоянно обращается к биту 7 этого регистра, чтобы проверить
готов ли принтер принять очередной символ. Несложно при этом
проверить при этом и бит 3, чтобы узнать о произошедшей ошибке.
Если происходит ошибка, индицируемая битами 4 и 5, то по крайней
мере бит 3 будет равен 0. Программа должна постараться проанализировать
ошибку, а затем может попросить пользователя исправить
ситуацию. Отметим, что функцию DOS, которая выводит символы на
принтер (функция номер 5 прерывания 21H - см. [6.3.1]), можно
заставить непрерывно проверять принтер на ошибку таймаута посредством
команды MODE. Перед загрузкой программы, использующей
функцию 5, надо ввести команду MODE LPT1: ,,P (еще лучше поместить
эту команду в файл AUTOEXEC.BAT, с тем чтобы она всегда
выполнялась при загрузке системы).
Все эти ошибки приводят к тому, что печать останавливается и
должны быть предприняты какие-то действия прежде чем она будет
продолжена. Слишком огорчительно для пользователя программы, если
большая порция документа должна будет печататься заново при возникновении
ошибки на принтере. Тщательное продумывание процедуры
восстановления по ошибке позволит программе возобновить печать с
начала той страницы, на которой произошла ошибка. Необходимо
всегда запоминать указатель выводимых данных при начале печати
новой страницы. При начале работы процедуры восстановления она
может попросить пользователя вставить новый лист бумаги, а затем
продолжить печать с начала той страницы, на которой произошла
ошибка.
Высокий уровень.
В Бейсике распознаются два ошибочных условия для принтера. Код
ошибки 24 возвращается когда был отменен выбор принтера, а код 27
- когда принтер выключен или в нем отсутствует бумага. Эти коды
можно получить с помощью техники обнаружения ошибок, приведенной
в [7.2.5]. K сожалению эффективно отлавливается только код 27.
Чтобы зарегистрировать код 24 требуется примерно полминуты, в
течение которых программа заморожена. Не слишком полезно прямо
читать регистр статуса перед каждой операцией печати. Этот метод
сработает перед началом печати, но ничем не поможет, если во
время печати произойдет отмена выбора принтера. Приводим процедуру
обработки ошибок принтера:
100 ON ERROR GOTO 1000 'устанавливаем обработку ошибок
1000 '''проверяем произошла ли ошибка на принтере
1010 IF ERR = 24 OR IF ERR = 27 THEN GOSUB 2000: RESUME
2000 BEEP: LOCATE 1,1: PRINT"Printer not ready"
2010 PRINT "Strike any key when ready"
2020 IF INKEY$ = "" THEN 2020 'ожидаем ввода
2030 RETURN
Средний уровень.
Когда функция 0 прерывания 17H выводит символ на принтер, то
она возвращает байт статуса принтера в AH. Проверяйте значение
этого байта после посылки каждого символа. BIOS слегка модифицирует
байт статуса. Обычно бит 0 не имеет значения, но в данном
случае он устанавливается, когда происходит ошибка таймаута
(принтер не связан с машиной). В следующем примере проверяются
два типа ошибок: общая ошибка "принтер не готов" и ошибка "отсутствия
бумаги". В примере предполагается, что в начале каждой
страницы (т.е. после каждого перевода формата) программа запоминает
указатель на начало выводимых данных, помещая его в переменную
STARTING_PTR. Это позволяет программе при возникновении ошибки
повторить печать с начала страницы, а не с начала всего документа.
Конечно принтер должен быть повторно инициализирован перед
повторной печатью и должны быть восстановлены все его параметры.
(Данный пример просто иллюстрирует проверку ошибок - он ни в коей
мере не является рабочей процедурой.)
;---в сегменте данных
MESSAGE1 DB 'Printer off-line - strike any key when ready$'
MESSAGE2 DB 'Printer out of paper - strike any key when ready$'
;---посылаем символ и проверяем на ошибку
NEXT_CHAR: MOV AH,0 ;номер функции
MOV DX,0 ;выбираем LPT1
MOV AL,[BX] ;BX указывает на данные
INC BX ;увеличиваем указатель
INT 17H ;посылаем символ на принтер
TEST AH,00001000B ;выделяем бит 3 (флаг ошибки)
JZ NEXT_CHAR ;если нет ошибки, то печатаем дальше
TEST AH,00100000B ;выделяем бит 5 (отсутствие бумаги)
JZ OFF_LINE ;переход если с бумагой все в порядке
MOV AH,9 ;готовим печать сообщения
LEA DX,MESSAGE2 ;DS:DX указывает на строку
INT 21H ;выводим строку
JMP SHORT RECOVER ;уходим на восстановление
OFF_LINE: MOV AH,9 ;готовим печать сообщения
LEA DX,MESSAGE1 ;DS:DX указывают на строку
INT 21H ;выводим строку
RECOVER: MOV BX,STARTING_PTR ;восстанавливаем указатель
MOV AH,0 ;функция ожидания ввода
INT 16H ;ждем
CALL PRTR_INIT ;инициализация принтера
JMP NEXT_CHAR ;начинаем печать с начала страницы
6.1.4 Переключение между двумя или несколькими принтерами.
Компьютеры, оснащенные несколькими параллельными портами могут
иметь одновременно подсоединенными два или более принтеров. Вывод
может перенаправляться с одного принтера на другой двумя способами.
Один способ состоит в том, чтобы использовать только такие
операторы вывода на печать, которые указывают на какой принтер
надо осуществлять вывод. Вы можете написать такой код, который
позволит Вам изменять спецификацию.
Второй способ переключения принтеров состоит в использовании
вывода по умолчанию на LPT1, но указания другого принтера, который
будет использоваться в качестве LPT1. Это достигается изменением
базового адреса, относящегося к LPT1. Этот базовый адрес
хранится в области данных BIOS в ячейке 0040:0008. Поменяйте его
с базовым адресом для LPT2 или 3 (хранящимися в ячейках 0040:000A
и 0040:000C) и в качестве LPT1 будет использоваться другой адаптер.
Высокий уровень.
В Бейсике, если принтер был открыт оператором OPEN "LPT1" AS
#1, то чтобы переключиться на другой принтер надо сначала написать
оператор CLOSE #1, а затем открыть другой принтер с помощью
оператора OPEN "LPT2" AS #1. Впоследствии все операторы PRINT #1
будут направлять свой вывод на второй принтер. Это изменение
труднее осуществить в программах, использующих оператор LPRINT,
поскольку LPRINT по умолчанию посылает весь вывод на LPT1. В этом
случае Вам необходимо поменять базовые адреса принтеров. Следующая
программа на Бейсике делает именно это, переключая 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. Когда Вы напечатаете OTHERPRN,
то будет автоматически загружен Бейсик, который загрузит
и выполнит программу 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
...Поділитися у соцмережах