Жанр: Учеба
Справочник программиста на IBM PC
...ться за
счет использования функции CHR$. Управляющие коды обычно посылаются
именно этим способом, например, LPRINT CHR$(10) посылает
на принтер управляющий код перевода строки. Чаще всего CHR$ используется
при посылке кодов ASCII, которые нельзя ввести с клавиатуры.
Любые из перечисленных типов данных могут быть объединены
в одном операторе. Если Вы хотите, чтобы различные элементы
данных печатались подряд, то разделяйте их точкой с запятой; если
же Вы разделите их запятыми, то следующий элемент будет выводиться
со следующей позиции табуляции. Это говорит о том, что оператор
LPRINT форматирует печать в точности так же, как это делает
оператор PRINT при выводе на экран. Вот несколько примеров:
100 LPRINT S$;" and ";Y$ 'комбинация трех строк
110 LPRINT X, Y, Z 'вывод трех чисел
120 LPRINT "The total is "; X 'комбинация строки и числа
130 LPRINT "The ";CHR$(27);CHR$(45);CHR$(1);"real";
CHR$(27);CHR$(45);CHR$(0);" thing."
'подчеркивание среднего слова
Оператор PRINT# может использовать те же типы данных, что и
оператор LPRINT, и он также позволяет включать несколько элементов
данных в один оператор и смешивать различные типы данных.
Точки с запятой и запятые действуют в нем аналогичным образом.
Вот примеры, эквивалентные вышеприведенным:
100 OPEN "LPT1:" AS #2
110 PRINT #2,S$;" and ";Y$
120 PRINT #2,X, Y, Z
130 PRINT #2,"The total is "; X
140 PRINT #2,"The ";CHR$(27);CHR$(45);CHR$(1);"real";
CHR$(27);CHR$(45);CHR$(0);" thing."
Средний уровень.
Функция 0 прерывания 17H посылает один символ на принтер.
Поместите символ в AL, а номер принтера в DX. При возврате AH
будет содержать регистр статуса, который надо постоянно проверять
для обнаружения ошибок. В [6.1.3] объясняется как это делать. Для
вывода потока данных установите указатель на буфер, содержащий
данные, и напишите процедуру типа следующей:
;---вывод данных на LPT1
MOV CX,NUMBER_CHARS ;CX содержит число байт для вывода
MOV DX,0 ;выбираем LPT1
NEXT_CHAR: MOV AH,0 ;функция посылки символа на принтер
MOV AL,[BX] ;BX указывает на буфер данных
INT 17H ;посылаем символ
TEST AH,8 ;проверяем бит ошибки
JNZ PRNTR_ERROR ;на обработку ошибки
INC BX ;увеличиваем указатель
LOOP NEXT_CHAR ;выводим следующий символ
Стандартное прерывание MS DOS для вывода на принтер это функция
5 прерывания 21H. Просто поместите символ в DL и выполните
прерывание. Эта функция всегда выводит на LPT1 и у нее нет возвращаемых
регистров.
;---вывод данных на LPT1
MOV AH,5 ;номер функции
MOV DL,CHAR ;готовим печатаемый символ
INT 21H ;посылаем его на принтер
Другой способ вывода данных на принтер это функция 40H прерывания
21H. Это функция стандартного вывода, с использованием
метода дескриптора файлов для доступа к файлу или устройству
[5.3.0]. В данном случае эта функция использует специальный предопределенный
номер файла для принтера. Этот номер #4 и его надо
поместить в BX. Функция имеет доступ только к LPT1, поэтому для
вывода на другой принтер Вам надо поменять базовые адреса
[6.1.4]. DS:DX должны указывать на выводимые данные, а CX содержать
число посылаемых байтов. Например:
;---вывод 120 байтов данных на LPT1
MOV AH,40H ;номер функции
MOV BX,4 ;номер файла для принтера
MOV CX,120 ;число посылаемых байтов
LEA DX,PRTR_DATA ;DS:DX указывают на данные
INT 21H ;посылаем данные
JC PRTR_ERROR ;на обработку ошибки
При возврате установленный флаг переноса индицирует ошибку, при
этом AX будет содержать 5, если принтер не связан с машиной и 6 -
если указан неверный номер файла. Отметим, что при использовании
предопределенного номера файла ненужно открывать устройство.
Низкий уровень.
Байт данных посылается на принтер, путем посылки его в регистр
выводимых данных, адрес порта которого совпадает с базовым адресом
принтера. Помните, что базовые адреса для LPT1-3 хранятся со
смещениями 8, 10 и 12 в области данных BIOS (начинающейся с
0040:0000). После того как данные посланы в регистр на короткое
время включается бит строба регистра управления выводом, адрес
порта которого на 2 больше, чем для регистра данных. Номер бита
строба равен 0 и он должен быть установлен только на очень короткое
время, чтобы инициировать передачу данных, находящихся в
регистре данных. Процедура печати может немедленно сбросить бит
строба обратно в 0.
После того как байт данных послан, программа должна ожидать,
пока принтер не сообщит, что он готов к приему следующего. Это
делается двумя способами. При готовности принтер дает импульс в
бит подтверждения регистра статуса ввода, адрес порта которого на
1 больше базового адреса принтера. Номер бита подтверждения равен
6 и обычно он установлен в 1. Импульс подтверждения сбрасывает
этот бит в 0 на достаточно долгое время, чтобы программа на языке
ассемблера могла увидеть это, если она постоянно следит за регистром.
Другой способ узнать, что принтер готов к приему следующего
байта данных состоит в непрерывной проверке бита 7 регистра статуса,
который сбрасывается в 0, когда принтер занят и устанавливается
в 1, когда он готов принять данные. Если Вы пишите процедуру
печати низкого уровня, которая должна работать в интерпретируемом
Бейсике или другом очень медленном языке, то надо использовать
этот метод.
Следующий пример получает базовый адрес LPT1 из области данных
BIOS и затем выводит данные из буфера, на который указывает регистр
BX. Программа постоянно проверяет регистр статуса на занятость
и одновременно проверяет бит 3, чтобы проверить наличие
ошибки на принтере.
;---подготовка
MOV AX,40H ;ES указывает на область данных BIOS
MOV ES,AX ;
MOV DX,ES:[8] ;базовый адрес LPT1 в DX
MOV BX,DATA_START ;BX указывает на буфер данных
;---посылаем символ
NEXTCHAR: MOV AL,[BX] ;помещаем символ в AL
OUT DX,AL ;посылаем символ
INC DX ;DX будет указывать на регистр
INC DX ;управления выводом
MOV AL,13 ;цепочка битов для импульса строба
OUT DX,AL ;посылаем сигнал строба
DEC AL ;нормальное ссотояние регистра
OUT DX,AL ;посылаем его
;---проверка на ошибку и ожидание готовности принтера
DEC DX ;DX указывает на регистр статуса
NOT_YET: IN AL,DX ;получаем байт статуса
TEST AL,8 ;ошибка?
JNZ PRTR_ERROR ;переход на обработку ошибки
TEST AL,80H ;принтер занят?
JZ NOT_YET ;если занят, то назад
INC BX ;увеличиваем указатель в буфере данных
DEC DX ;DX указывает на регистр данных
JMP NEXTCHAR ;идем на печать следующего символа
Когда установлен бит 4 управляющего регистра принтера, то
разрешено прерывание принтера. Когда используется прерывание, то
программа не должна ожидать сигнала готовности от принтера, непрерывно
опрашивая регистр статуса принтера. Вместо этого, программа
может послать символ и заниматься другими делами; когда
принтер будет готов для приема следующего символа, то он пошлет
сигнал подтверждения (бит 6 регистра статуса на короткое время
будет установлен в 1) и автоматически будет вызвано прерывание
принтера. Процедура обработки прерывания пошлет на принтер следующий
символ и вернет управление в программу, чтобы она могла
продолжать свою работу, до тех пор пока не произойдет следующего
прерывания. Когда все данные будут выведены, то прерывание должно
отключить себя. Прерывание принтера во многом аналогично коммуникационному
прерыванию, которое обсуждается в [7.1.8].
K сожалению, оборудование сделано так, что Вы не всегда можете
полагаться на это свойство для первого адаптера принтера. На
некоторых адапторах оно работает, а на других нет. Только в случае
последовательной/параллельной карты AT Вы может полагаться на
него полностью. Вместо него можно использовать прерывание таймера,
как объяснено в [2.1.7]. Установите микросхему таймера 8253
так, чтобы прерывание происходило медленнее, чем скорость, с
которой принтер обрабатывает данные. Затем напишите процедуру
обработки прерывания, которая посылает на принтер очередной символ
каждый раз, когда происходит прерывание времени суток. Для
того чтобы обеспечить надежную синхронизацию заставьте процедуру
проверять бит занятости принтера регистра статуса (бит 7) и если
принтер еще занят, то пусть процедура не посылает символ.
6.3.2 Выравнивание правого поля.
Реальное выравнивание правого поля заключается в распределении
пробелов, находящихся в конце строки, равномерно по промежуткам
между словами. Некоторые принтеры имеют специальный режим, который
автоматически осуществляет это выравнивание. Такую возможность
имеет цветной принтер IBM, посылка управляющего кода
27,77,0 заставляет электронику принтера интерпретировать поступающие
данные и форматировать их. В других случаях принтер должен
менять ширину пробелов между словами, переключаясь в графический
режим, когда выводится символ пробела. В графических режимах
ширина пробела может изменяться на размер до 1/6 размера символа.
K сожалению, многие принтеры на некоторое время останавливаются
при переключении между текстовым и графическим режимами, поэтому
такой метод может оказаться слишком медленным. Другой подход
состоит во вставке обычных символов пробела, распределяя их как
можно более равномерно по строке. Более сложный графический подход
описан ниже.
Шаги, которые необходимо выполнить для форматирования с выравниванием
правого поля, следующие. Во-первых, из установок формата
страницы должно быть вычислено число символов в строке. Затем
необходимо подсчитать число символов, занимаемое каждым из последовательно
введенных слов, включая пробелы между словами. Отдельный
счетчик должен подсчитывать число пробелов. Когда общая сумма
символов превзойдет 80 (или ту ширину принтера, которая установлена),
то последнее слово должно быть отброшено из этой суммы,
вместе с предшествующим ему пробелом. Число оставшихся свободными
позиций в строке умножается на 6, поскольку каждый символ занимает
размер шести точек по горизонтали, а получившееся число
делится на число пробелов между словами.
После печати каждого слова принтер устанавливается в графический
режим 480 точек в строке и посылает на принтер ряд кодов
ASCII 0. Каждый такой байт сдвигает печатающую головку на одну
точку вправо. Посылаемое число должно быть равно шести для обычного
пробела, плюс результат распределения пустого пространства.
Наконец, если остаток от деления ненулевой, то надо добавить по
одному добавочному байту к первым пробелам, до тех пор пока остаток
не будет исчерпан.
Для примера рассмотрим случай, когда строка состоит из 12
слов, содержащих 61 букву, плюс 11 пробелов между словами. Это
оставляет в 80-тисимвольной строке 8 свободных позиций. Эти восемь
позиций, умноженные на 6 точек, составляют 48 точек дополнительного
пространства строки. Поскольку в строке 11 пробелов, то
к каждому из них должно быть добавлено по 4 дополнительные точки
и после этого останутся еще 4 лишние точки, которые надо добавить
по одной к первым четырем пробелам. Тогда первые 4 пробела будут
иметь размер 6 точек нормального пробела, плюс добавочные 5, что
в сумме равно 11. Остальные пробелы этой строки будут иметь размер
10 точек. Чтобы послать эти данные на принтер, подготовьте
сначала код, посылающий на принтер 1 байт ASCII 0, а затем поместите
его в цикл, который выполняйте столько раз, сколько нужно
послать таких байтов. На рис. 6-2 показан этот процесс.
В нижеприведенном примере показаны основы выравнивания по
правому полю. Не забудьте об обработке специальных случаев, таких
как слово, которое длиннее строки (напр., длинный ряд тире).
Процедура нуждается в модификации, которая позволяла бы ей иметь
дело со случаем, когда строка содержит всего несколько слов, как
это бывает в конце параграфа. Не позволяйте ей распределить эти
слова равномерно по всей ширине страницы.
Высокий уровень.
В данном примере, BUFFERPTR указывает на место в буфере данных,
с которого начинается следующая строка, выводимая на печать.
100 S$ = "This text will be printed with right justification
using the printer alternately in text modes and graphics modes."
110 STRINGPTR = 1 'указатель в строке данных S$
120 COLUMNS = 1 'счетчик позиции в строке
130 SPACES = 0 'счетчик пробелов в строке
140 '''вычисляем сколько слов помещается в строке
150 C$ = MID$(S$,STRINGPTR,1) 'получаем символ
160 IF C$ "" " " THEN 190 'если не пробел, то вперед
170 LASTSPACE = COLUMNS 'иначе зпоминаем позицию
180 SPACES = SPACES + 1 'увеличиваем число пробелов
190 COLUMNS = COLUMNS+1 'увеличиваем указатель столбца
200 STRINGPTR = STRINGPTR + 1 'увеличиваем указатель данных
210 IF COLUMNS = 81 THEN 230 'уход по концу строки
220 GOTO 150 'иначе к следующему символу
230 IF C$ "" " " THEN 270 'если последний не пробел, то уход
240 COLUMNS = 79 'иначе длина строки равна 79
250 SPACES = SPACES - 1 'отнимаем последний пробел
260 GOTO 340 'идем на вычисление пробелов
270 C$ = MID$(S$,STRINGPTR+1,1) 'проверяем на конец слова
280 IF C$ "" " " THEN 300 'если не пробел, то уход
290 GOTO 340 'иначе на вычисление пробелов
300 COLUMNS = COLUMNS - LASTSPACE 'возвращаемся к концу слова
310 STRINGPTR = STRINGPTR - COLUMNS + 1 'возвращаем указатель
320 COLUMNS = LASTSPACE - 1 'убираем последний пробел
330 SPACES = SPACES - 1 'уменьшаем число пробелов
340 '''вычисляем число точек на пробел
350 EXTRASPACES = 80 - COLUMNS 'вычисляем число пробелов в конце
360 TOTALSPACES = EXTRASPACES + SPACES 'добавляем к пробелам
370 TOTALDOTS = 6*TOTALSPACES 'вычисляем число точек
380 DOTSPERSPC = TOTALDOTS/SPACES 'получаем число точек на пробел
390 EXTRADOTS = TOTALDOTS MOD SPACES 'остаток от деления
400 '''теперь печатаем первую строчку нашего текста
410 OPEN "LPT1:" AS #1 'открываем принтер
420 PRINTPTR = 1 'указатель на начало буфера данных
430 C$ = MID$(S$,PRINTPTR,1) 'берем символ
440 PRINTPTR = PRINTPTR + 1 'увеличиваем указатель
450 IF C$ = " " THEN 500 'если пробел, то на обработку пробела
460 PRINT #1, C$ 'иначе печатаем символ
470 IF PRINTPTR = COLUMNS + 1 THEN 590 'выход по концу строки
480 GOTO 430 'иначе печатаем следующий символ
490 '''вот процедура печати пробелов
500 PRINT #1, CHR$(27) + "K"; 'переход в графический режим
510 NUMBERDOTS = DOTSPERSPC 'вычисляем число байтов ASCII 0
520 IF EXTRADOTS = 0 THEN 550 'если нет добавочных точек, уход
530 NUMBERDOTS = DOTSPERSPC + 1 'иначе добавляем точку
540 EXTRADOTS = EXTRADOTS - 1 'уменьшаем число добавочных точек
550 PRINT #1, CHR$(NUMBERDOTS); 'посылаем число графических байт
560 PRINT #1, CHR$(0); '
570 FOR N = 1 TO NUMBERDOTS: PRINT #1, CHR$(0): NEXT
580 GOTO 430 'пробел окончен, идем на след. символ
590 PRINT #1, CHR$(13) 'в конце печатаем возврат каретки
Низкий уровень.
Соответствующая ассемблерная процедура слишком длинная, чтобы
приводить ее здесь. Она работает в точности так же, как и процедура
на Бейсике, за исключением того, что нет необходимости заводить
отдельную переменную, чтобы хранить строку. Нужно просто
установить указатели на начало и конец строки, которую надо напечатать
в буфере данных.
6.3.3 Пропорциональная печать.
Вообще говоря, пропорциональная печать требует специального
принтера, который хранит в ПЗУ информацию о ширине каждого символа.
Цветной принтер IBM имеет режим пропорциональной печати,
который включается последовательностью 27,78,1, а выключается -
27,78,0. Программа, которая форматирует вывод на такой принтер,
должна знать информацию о ширине каждого символа (ее можно найти
в документации). Имея эту информацию, она может вычислить сколько
слов поместится на одной строке.
Имейте ввиду, что некоторые матричные принтеры автоматически
выводят пропорциональный текст в режиме за два прохода. Если
слова в строке разделяются добавочными пробелами в графическом
режиме, то принтер может переходить ко второму проходу после
печати каждого слова, вместо того, чтобы повторить сразу всю
строку. Поскольку принтеры относительно медленно меняют направление
перемещения печатающей головки, то в этом случае печать текста,
выравненного по правому краю, в пропорциональном режиме может
занимать очень много времени и оказывается непосильной ношей для
принтера. Эта проблема не возникает при однонаправленной пропорциональной
печати. Отметим, что цветной принтер IBM может автоматически
комбинировать пропорциональную печать с автоматическим
выравниванием правого края, что делает специальное программирование
ненужным.
Изощренные программисты могут заставить любой графический
принтер печатать в пропорциональном режиме. Программа должна
иметь в памяти картину битов для каждого символа (см. [6.3.4]).
Вместо того, чтобы посылать на принтер код ASCII, который вызывает
изображение символа из ПЗУ, используется данная цепочка
битов для создания графического изображения строки текста. Затем
вся нужная строка данных выводится на принтер в графическом режиме.
Этот подход расходует много памяти на хранение графических
образов символов, однако он позволяет полностью контролировать
выводимое изображение.
Высокий уровень.
В данном примере включается режим пропорциональной печати, а
затем выводится первая строка выходных данных программы. Ширина
пропорционального шрифта считывается в массив FONTWIDTH из последовательного
файла.
100 '''считываем массив ширин шрифта
110 DIM FONTWIDTH(127) 'отводим массив для ширин
120 OPEN "FONTS" FOR INPUT AS #1 'открываем файл ширин
130 FOR N = 32 TO 127 'хранятся ширины для кодов 32-127
140 INPUT #1, FONTWIDTH(N) 'читаем ширину из массива
150 NEXT 'следующий элемент
160 '''вычисляем сколько символов поместится в строке
170 CHARPTR = 0 'указатель в буфере
180 LINE$ = "" 'хранит строку для вывода
190 LINELENGTH = 0 'счетчик длины в точках
200 WHILE LINELENGTH "480 'добавляем до заполнения строки
210 C$ = PEEK(BUFFERPTR+CHARPTR) 'берем символ из буфера данных
220 LINELENGTH = LINELENGTH + FONTWIDTH(ASC(C$))
230 LINE$ = LINE$+C$ 'добавляем к строке вывода
240 CHARPTR = CHARPTR+1 'увеличиваем указатель
250 WEND 'на обработку следующего символа
260 '''по концу строки возвращаемся к концу последнего слова
270 IF C$ = "" THEN 310 'если последний пробел, то уход
280 FOR N = LEN(LINE$) TO 1 STEP -1 'идем назад от конца
290 IF MID$(LINE$,N,1) = " " THEN 310 'этот символ пробел?
300 NEXT 'есчли нет, то берем следующий
310 LINELENGTH = N - 1 'если да, то предыдущий - последний
320 '''инициализируем пропорциональную печать и посылаем данные
330 LPRINT CHR$(27);CHR$(78);CHR$(1); 'управляющие коды
340 FOR N = 1 TO LINELENGTH 'для каждого символа
350 LPRINT PEEK(BUFFERPTR+N-1); 'печатаем его
360 NEXT 'и идем на следующий символ
Низкий уровень.
Программа на языке ассемблера должна работать совершенно аналогично
приведенному бейсиковскому примеру. Одно из преимуществ
ассемблера состоит в том, что для просмотра ширин символов можно
использовать инструкцию XLAT. Поместите символ в AL, DS:DX должны
указывать на таблицу, после чего можно использовать XLAT. Ширина
символа будет возвращена в AL:
;---просмотр ширин символов
LEA SI,DATA_BUFFER ;указываем на буфер данных
LEA BX,WIDTH_TABLE ;указываем на таблицу ширин
MOV AL,[SI] ;получаем байт данных
XLAT WIDTH_TABLE ;теперь его ширина в AL
6.3.4 Печать специальных символов.
Большинство принтеров не поддерживают расширенный набор символов
IBM, однако большинство программ использует специальные символы
псевдографики. Очень полезно иметь возможность печатать эти
символы и не так сложно это сделать на любом матричном принтере,
который имеет графические возможности. Вместо того, чтобы полагаться
на ПЗУ принтера, программа должна сама создавать эти символы
и она должна обращаться с принтером определенным образом,
чтобы они были напечатаны на бумаге.
Сама по себе печать специальных символов тривиальна. Просто
разбейте символ на шесть байтов, цепочка битов каждого соответствует
структуре точек в каждом из шести столбцов точек, составляющих
символ. Например, чтобы напечатать символ горизонтальной
двойной черты, код ASCII которого 205, программа должна вывести
цепочку битов 00100100 шесть раз в режиме 480 точек в строке. Это
количество в точности соответствует ширине символа, поскольку
6/480 равно 1/80 строки. Чтобы перевести принтер именно в этот
графический режим необходимо подать управляющий код 27,75. Затем
пошлите число идущих вслед графических данных, которое передается
в виде пары байт, причем младший байт первый. Наконец, идут сами
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). Но если
встречается специальный графический символ, который должен печататься
в четырехточечном поле, то надо поместить его код ASCII в
соответствующюю позицию второй строки. Например:
Позиция символа 1 2 3 4 5 6 7 8 9 10
Код ASCII 205 32 98 111 114 105 110 103 32 205
Код 2-й строки 205 32 32 32 32 32 32 32 32 205
В памяти должна храниться отдельная таблица цепочек битов этих
символов для второго прохода. Для двойной вертикальной черты
содержимое таблицы для первого прохода будет 0, 255, 0, 255, 0,
0, а для второго - 0, 15, 0, 15, 0, 0. Отметим, что во втором и
четвертом байте для второго прохода верхние 4 бита сброшены,
чтобы не было надпечатки.
Короче, когда начинается печать, то в первую очередь проверяется
является ли данный символ пседографическим, и если нет, то
он посылается на печать, как обычный код ASCII. Во временную
строку, используемую для печати второго прохода вставляется пробел.
Затем обрабатывается следующий символ. Когда встречается
символ псевдографики, то 6 кодирующих его байтов берутся из таблицы,
принтер переводится в графический режим для вывода 6 байтов
и посылаются данные. Затем принтер автоматически возвращается в
текстовый режим. В соответствующую позицию строки для второго
прохода помещается код ASCII этого символа псевдографики. Этот
процесс продолжается до конца строки, после чего делается прогон
бумаги на высоту четырех точек. При повторном проходе надо опять
поочередно рассмотреть каждый символ. Если это пробел, то надо
печатать символ пробела (т.е. не печатать ничего, а просто продвинуть
головку к следующему символу). Если же это графический
символ, то надо найти соответствующий ему данные для второго
прохода в отдельной таблице и напечатать его таким же образом,
как и при первом проходе. Повторно используйте строку для второго
прохода с каждой печатаемой строкой. На рис. 6-3 показана эта
процедура.
Высокий уровень.
В данном примере текст разделен на две колонки, при этом непрерывная
линия разделяет страницу посредине. Для простоты печатается
только одна строка, однако этот пример может печатать и
целую страницу, если вставить цикл FOR/NEXT в строках 325 и 505.
Для демонстрации двух подходов при первом проходе печатается по
одному символу, в то время как при втором проходе печатается
целая строка.
100 '''таблица данных для первого прохода (только коды 178 и 179)
110 DATA 0, 0, 255, 0, 0, 0
120 DATA 4, 4, 255, 0, 0, 0
130 '''аналогичная таблица для второго прохода
140 DATA 0, 0, 15, 0, 0, 0
150 DATA 0, 0, 15, 0, 0, 0
160 '''помещаем первую таблицу в массив
170 DIM FIRSTPASS$(45) 'описываем массив
180 FOR N = 1 TO 2
...Поділитися у соцмережах