VII.4.3. У п р а в л е н и е г о р и з о н т а л ь н о й п о з и - ц и е й п е ч а т а ю щ е й г о л о в к и Как Вам известно, любой текст имеет правую и левую границу, называемые п о л я м и. 1. Поговорим об у с т а н о в к е п о л е й ┌──────────────────────────────────┬────────────────────────────────────┐ │ Ф у н к ц и я │ У п р а в л я ю щ и й к о д │ ├──────────────────────────────────┼────────────────────────────────────┤ │ Установка левого поля в колонке n│ CHR$(27);"L";"n1n2n3" │ ├──────────────────────────────────┼────────────────────────────────────┤ │Установка правого поля в колонке n│ CHR$(27);"/";"n1n2n3" │ └──────────────────────────────────┴────────────────────────────────────┘ Команда ┌──────────────────────────────────┐ │ LPRINT CHR$(27);"L";"n1n2n3" │ └──────────────────────────────────┘ устанавливает позицию н а ч а л а строки, определенную трехзначным чис- лом. Например, при выполнении команды LPRINT CHR$(27);"L";"126" л е в а я граница будет сдвинута на 126 символов. Команда ┌──────────────────────────────────┐ │ LPRINT CHR$(27);"/";"n1n2n3" │ └──────────────────────────────────┘ устанавливает позицию к о н ц а строки, определенную трехзначным числом. Например, при выполнении команды LPRINT CHR$(27);"/";"065" п р а в а я граница будет установлена на 65 символов. Для печатающего устройства д е с я т и д ю й м о в о г о типа (напри- мер, "Gemini-10XR") максимальная печатная позиция равна: α) для шага "ц и ц е р о" - 80, β) для шага "э л и т е" - 96, а γ) для у п л о т н е н н о г о шага - 136. Для печатающего устройства п я т н а д ц а т и д ю й м о в о г о типа максимальная печатная позиция равна: α) для шага "ц и ц е р о" - 136, β) для шага "э л и т е" - 163 и γ) для у п л о т н я е м о г о шага - 233. П р и м е р 17. Установка полей. ─────────────── 10 GOSUB 40 20 LPRINT CHR$(27);"L";"010";:LPRINT CHR$(27);"/";"070" 30 GOSUB 40:END 40 FOR I=1 TO 80:LPRINT "=";:NEXT I:RETURN Подпрограмма осуществляет печать 80 символов"="в одной строке. При пер- вом вызове подпрограммы все символы "=" печатаются в одной строке. Затем строка 20 устанавливает левое и правое поля. Теперь, после обращения к подпрограмме в строке 30, на одной строке уместятся лишь 60 символов, ос- тальные будут напечатаны со следующей строки. Для того, чтобы установить поля в исходное положение п о у м о л ч а- н и ю , имеются две возможности: α) Вы можете выключить и затем снова включить печатающее устройство; β) установить поля равными значениям по умолчанию. Это означает, что Вы должны установить левое поле на 0-й и правое поле на 80-й позиции на печа- тающем устройстве д е с я т и д ю й м о в о г о типа или 136 - на печа- тающем устройстве п я т н а д ц а т и д ю й м о в о г о типа. ┌─────────────────────────────────────────────────────────────────┐ │ Если изменять шаг печати после установки полей, поля не будут │ │ изменяться (количество символов в строке останется тем же)! │ └─────────────────────────────────────────────────────────────────┘ 2. У с т а н о в к а г о р и з о н т а л ь н ы х м е т о к ┌───────────────────────────────┬───────────────────────────────────────┐ │ Ф у н к ц и я │ У п р а в л я ю щ и й к о д │ ├───────────────────────────────┼───────────────────────────────────────┤ │ Перемещение на следующую гори-│ CHR$(9) │ │ зонтальную метку │ │ ├───────────────────────────────┼───────────────────────────────────────┤ │ Установка положений горизон- │CHR$(27);"(";"n11n12n13,...,nn1nn2nn3."│ │ тальных меток │ │ ├───────────────────────────────┼───────────────────────────────────────┤ │ Стирание установленных гори- │CHR$(27);")";"n11n12n13,...,nn1nn2nn3."│ │ зонтальных меток (селективное│ │ │ стирание меток) │ │ ├───────────────────────────────┼───────────────────────────────────────┤ │ Стирание всех горизонтальных │ CHR$(27);"2" │ │ меток │ │ └───────────────────────────────┴───────────────────────────────────────┘ Версия MSX-BASIC предоставляет возможность использования двух режимов работы с горизонтальными метками. Дело в том, что у компьютера и у принте- ра р а з н ы й набор меток. У компьютера метки располагаются строго через в о с е м ь позиций. У принтера же сразу после его включения горизонтальные метки автоматически устанавливаются через д е с я т ь печатных позиций. Кроме того, набор меток печатающего устройства можно изменять программным путем. Информация о том, из какого набора будут взяты горизонтальные метки та- буляции, хранится в ячейке памяти с адресом &HF418. Если содержимое этой ячейки равно нулю, то принтер будет работать с метками из набора компьюте- ра. Если же содержимое ячейки памяти отлично от нуля,то печатающее устрой- ство будет работать с горизонтальными метками из своего набора. Для перемещения печатающей головки в позицию следующей горизонтальной метки табуляции применяется команда ┌──────────────────┐ │ LPRINT CHR$(9); │ └──────────────────┘ П р и м е р 18. Демонстрация использования горизонтальных меток. ─────────────── α) 10 LPRINT "ONE";CHR$(9);"TWO";CHR$(9);"THREE";CHR$(9);"FOUR" run ONE TWO THREE FOUR ▲ ▲ ▲ │ │ │ 8-я позиция 16-я позиция 24-я позиция Ok β) POKE &HF418,1 Ok 10 LPRINT "ONE";CHR$(9);"TWO";CHR$(9);"THREE";CHR$(9);"FOUR" run ONE TWO THREE FOUR ▲ ▲ ▲ │ │ │ 10-я позиция 20-я позиция 30-я позиция Ok γ) Установка позиции горизонтальной табуляции (установка положений ме- ток) осуществляется следующей командой: ┌───────────────────────────────────────────────────────────┐ │ LPRINT CHR$(27);"(";"n11n12n13,n21n22n23,...nn1nn2nn3." │ └───────────────────────────────────────────────────────────┘ При этом аннулируются все позиции текущей горизонтальной табуляции и уста- навливает новые, определенные трехзначными числами. POKE &HF418,1 Ok 10 LPRINT CHR$(27);"(";"008,016,024." 20 LPRINT "ONE";CHR$(9);"TWO";CHR$(9);"THREE";CHR$(9);"FOUR" run ONE TWO THREE FOUR ▲ ▲ ▲ │ │ │ 8-я позиция 16-я позиция 24-я позиция Ok Метки будут установлены в колонках 8, 16 и 24. Запятые в 10-Й строке используются для разделения цепочки меток, точка - для окончания определе- ния. δ) Для того, чтобы стереть часть горизонтальных меток из набора печата- ющего устройства, существует следующая команда: ┌───────────────────────────────────────────────────────────┐ │ LPRINT CHR$(27);")";"n11n12n13,n21n22n23,...nn1nn2nn3." │ └───────────────────────────────────────────────────────────┘ По коду селективного стирания табуляции стираются позиции табуляции, определенной трехзначными номерами. POKE &HF418,1 Ok 10 LPRINT CHR$(27);"(";"008,016,024." 20 LPRINT "ONE";CHR$(9);"TWO";CHR$(9);"THREE";CHR$(9);"FOUR" 30 LPRINT CHR$(27);")";"016." 40 LPRINT "ONE";CHR$(9);"TWO";CHR$(9);"FOUR" run ONE TWO THREE FOUR ONE TWO FOUR Ok В настоящей программе метки стираются в колонке 16. ┌───────────────────────┐ Если командой │ LPRINT CHR$(27);"2" │ Вы уберете все метки, то при └───────────────────────┘ использовании меток из набора принтера команда LPRINT CHR$(9) будет игно- рироваться. 3. П р о ч и е к о м а н д ы д л я у п р а в л е н и я г о р и з о н т а л ь н о й п о з и ц и е й п е ч а т а ю щ е й г о л о в к и ┌───────────────────────────────┬───────────────────────────────────────┐ │ Перемещение на n пробелов │ CHR$(27);"b";CHR$(n) │ ├───────────────────────────────┼───────────────────────────────────────┤ │ Перемещение на n точек │ CHR$(27);"F";"n1n2n3n4" │ ├───────────────────────────────┼───────────────────────────────────────┤ │ Смещение на один символ влево │ CHR$(8) │ └───────────────────────────────┴───────────────────────────────────────┘ ┌───────────────────────────────┐ Команда │ LPRINT CHR$(27);"b";CHR$(n) │, └───────────────────────────────┘ где n - целое число из отрезка [1,255], позволяет пропустить n печатных позиций. Эта команда не изменяет текущего значения позиции горизонтальной табуляции. ┌─────────────────────────────────┐ Команда │ LPRINT CHR$(27);"F";"n1n2n3n4" │, └─────────────────────────────────┘ где n1,n2,n3,n4 - цифры от 0 до 9, перемещает печатающую головку на n то- чечных позиций в п р а в о. При этом величина n должна принадлежать от- резку [0,479] и вычисляется по следующей формуле: ┌──────────────────────────────┐ │ n = 1000·n1+100·n2+10·n3+n4 │ └──────────────────────────────┘ ┌─────────────────────┐ Команда │ LPRINT CHR$(8) │ └─────────────────────┘ смещает печатающую головку на одну колонку в л е в о . Если печатная го- ловка находится в исходной позиции, то команда игнорируется. Эта команда используется для печати дополнительных знаков. VII.4.4. К о м а н д ы у п р а в л е н и я г р а ф и к о й Принтер можно использовать в качестве г р а ф о п о с т р о и т е л я, т.е. устройства, которое позволяет вывести на печать рисунки, графики и т.д. Дело в том, что принтер печатает восемью штырьками печатающей голов- ки. Каждый штырек печатает о д н у точку. Существует р е ж и м р а с - т р о в о й г р а ф и к и , позволяющий непосредственно управлять уда- ром к а ж д о г о штырька. Взгляните на следующую таблицу: ┌───────────────────────────────┬─────────────────────────────────────┐ │ Ф у н к ц и я │ У п р а в л я ю щ и й к о д │ ├───────────────────────────────┼─────────────────────────────────────┤ │ Печать растровой графики │ CHR$(27);"S";"n1n2n3n4" │ ├───────────────────────────────┼─────────────────────────────────────┤ │ Повторение растровой графики │ CHR$(27);"V";"n1n2n3n4";CHR$(m) │ └───────────────────────────────┴─────────────────────────────────────┘ Режим р а с т р о в о й графики устанавливается командой ┌──────────────────────────────────┐ │ LPRINT CHR$(27);"S";"n1n2n3n4"; │ , └──────────────────────────────────┘ где n1,n2,n3,n4 - цифры от 0 до 9. Если обозначить n - количество положений печатающей головки в строке при растровой печати, то n=1000·n1+100·n2+10·n3+n4 . На к а ж д о е такое положение нужно подать команду ┌───────────────────────────────────────────────┐ │ LPRINT CHR$(Двоичный код положения штырька); │ └───────────────────────────────────────────────┘ с указанием того, какие штырьки печатающей головки должны печатать. - Боюсь, что от объяснений все проигрывает,- сказал он. - Одни только результаты впечатляют гораздо больше. Конан Дойль. Приключения клерка П р и м е р 19. ─────────────── К о д ш т ы р ь к а &b00000001 ───▶ · &b00000010 ───▶ · · &b00000100 ───▶ · · · &b00001000 ───▶ · · · · &b00010000 ───▶ · · · · &b00100000 ───▶ · · · &b01000000 ───▶ · · &b10000000 ───▶ · ▲ ▲ ▲ ▲ │ │ │ │ &b11111111 &b01111110 &b00111100 &b00011000 10 LPRINT CHR$(27);"S";"0008"; 20 FOR T=1 TO 2:LPRINT CHR$(&B11111111);:NEXT 30 FOR T=1 TO 2:LPRINT CHR$(&B01111110);:NEXT 40 FOR T=1 TO 2:LPRINT CHR$(&B00111100);:NEXT 50 FOR T=1 TO 2:LPRINT CHR$(&B00011000);:NEXT run ·· ···· ······ ········ ········ ······ ···· ·· Ok П р и м е р 20. Программа печатает прямоугольник размерами ─────────────── 200 точек╳ 16 точек . 10 DATA &B00000001,&B10000000 30 LPRINT CHR$(27);"T16"; 'Команда устранения пробелов между строками 40 FOR I=1 TO 2 50 LPRINT CHR$(27);"S0200";:LPRINT CHR$(255);:READ A 80 LPRINT STRING$(198,CHR$(A));:LPRINT CHR$(255) 100 NEXT I Сделаешь раз по сто - вот и будет просто. П.А. Федотов ┌───────────────────────────────────────────┐ Команда │ LPRINT CHR$(27);"V";"n1n2n3n4";CHR$(m) │, └───────────────────────────────────────────┘ где n1,n2,n3,n4 - цифры от 0 до 9; m - целое число, принадлежащее отрезку [0,255]; позволяет повторить N раз изображение вертикальной линии (8 точек),шаблон которой устанавливается двоичным представлением числа m. Величина N определяется по формуле: N=1000·n1+100·n2+10·n3+n4 Отметим, что для выполнения этой команды н е требуется предваритель- ной установки растровой печати. П р и м е р 21. Результат действия следующих двух фрагментов одинаков! ─────────────── α) 10 LPRINT CHR$(27);"S";"0008"; 20 FOR T=1 TO 8:LPRINT CHR$(&B11111111);:NEXT β) 10 LPRINT CHR$(27);"V";"0008";CHR$(&B11111111) VII.4.5. И с п о л ь з о в а н и е м а к р о к о м а н д ┌───────────────────────────────┬─────────────────────────────────────┐ │ Ф у н к ц и я │ У п р а в л я ю щ и й к о д │ ├───────────────────────────────┼─────────────────────────────────────┤ │ Определение макрокоманды │ CHR$(27);"+";...;CHR$(0) │ │ (макроопределение) │ ▲ │ │ │ │ │ │ │ Совокупность команд │ ├───────────────────────────────┼─────────────────────────────────────┤ │ Выполнение макрокоманды │ CHR$(27);"%" │ └───────────────────────────────┴─────────────────────────────────────┘ Команда ┌──────────────────────────────────┐ │ LPRINT CHR$(27);"+";...;CHR$(0) │ └──────────────────────────────────┘ отменяет существующую макрокоманду и заменяет ее определяемой макрокоман- дой. Максимальное число символов в макрокоманде (не считая символов "+" и CHR$(0)) равно 16, в противном случае печатающее устройство будет реагиро- вать только на первые 16 символов макроопределения. ┌──────────────────────────┐ Команда │ LPRINT CHR$(27);"%" │ └──────────────────────────┘ выполняет макрокоманду, которая предварительно была определена при помощи макроопределения. После описания макроопределения, Вы можете использовать макрокоманду в любой требуемый момент времени и печатающее устройство будет "делать" все, что Вы включили в макроопределение. П р и м е р 22. Макроопределение для установки принтера в исходное ─────────────── положение всех стилей печати. 10 LPRINT CHR$(27);"+"; ' Начало макроопределения 20 LPRINT CHR$(27);"P"; ' Шаг "цицеро" 30 LPRINT CHR$(15); ' Отмена расширенной печати 40 LPRINT CHR$(27);"H"; ' Отмена двойного удара 50 LPRINT CHR$(27);CHR$(34); ' Отмена выделенной печати 70 LPRINT CHR$(27);"s";"0"; ' Отмена индексов 80 LPRINT CHR$(27);"5"; ' Отмена шрифта "италик" 90 LPRINT CHR$(27);"Y"; ' Отмена подчеркивания 100 LPRINT CHR$(27);"A" ' Высота строки =24/144 дюйма 110 LPRINT CHR$(0) ' Конец макроопределения Печатающее устройство будет "помнить" об этом макроопределении до тех пор, пока не будет введено новое макроопределение! Теперь посмотрите, как можно использовать описанное макроопределение. П р и м е р 23. Программа печатает всего одну строку, используя не- ─────────────── сколько различных стилей печати. Затем программная строка 50 позволяет вызвать макрокоманду, определенную в примере 21. 10 LPRINT CHR$(27);"4"; ' "Италик" 20 LPRINT CHR$(27);"G"; ' Двойной удар 30 LPRINT CHR$(14); ' Расширенная печать 40 LPRINT "TESTING ONE, TWO, THREE" 50 LPRINT CHR$(27);"%"; ' Вызов макрокоманды 60 LPRINT "TESTING FOUR, FIVE, SIX" VII.4.6. Д р у г и е п о л е з н ы е к о м а н д ы Все правила достойного поведения давным-давно известны, остановка за малым - за умением ими пользоваться. Блез Паскаль. Мысли Предлагаем Вашему вниманию следующую таблицу: ┌──────────────────────────────────┬────────────────────────────────────┐ │ Ф у н к ц и я │ У п р а в л я ю щ и й к о д │ ├──────────────────────────────────┼────────────────────────────────────┤ │ Повторение символа │ CHR$(27);"R";"n1n2n3";CHR$(m) │ ├──────────────────────────────────┼────────────────────────────────────┤ │ Отмена последней строки │ │ │ ("стирание" последней строки в │ CHR$(24) │ │ буфере) │ │ ├──────────────────────────────────┼────────────────────────────────────┤ │ Установка печатающего устройства │ CHR$(19) │ │ в автономный режим ("OFF LINE") │ │ ├──────────────────────────────────┼────────────────────────────────────┤ │ Установка печатающего устройства │ CHR$(17) │ │ в неавтономный режим ("ON LINE") │ │ ├──────────────────────────────────┼────────────────────────────────────┤ │ Звучание звонка печатающего │ CHR$(7) │ │ устройства │ │ ├──────────────────────────────────┼────────────────────────────────────┤ │ Выключение из работы детектора │ CHR$(27);"p";"0" │ │ отсутствия бумаги │ │ ├──────────────────────────────────┼────────────────────────────────────┤ │ Включение в работу детектора │ CHR$(27);"p";"1" │ │ отсутствия бумаги │ │ ├──────────────────────────────────┼────────────────────────────────────┤ │ Инициализация печатающего │ CHR$(27);"c";"1" │ │ устройства │ │ └──────────────────────────────────┴────────────────────────────────────┘ Выполнение команды повторения символа ┌──────────────────────────────────────┐ │ LPRINT CHR$(27);"R";"n1n2n3";CHR$(m) │ , └──────────────────────────────────────┘ где n1,n2,n3 - цифры от 0 до 9, приводит к повторению n раз (n=100·n1+10·n2+n3) символа с кодом m. П р и м е р 24. α) LPRINT CHR$(27);"R120";"+" ─────────────── β) LPRINT CHR$(27);"R120";"+";CHR$(24) ┌────────────────────┐ Команда │ LPRINT CHR$(19) │ └────────────────────┘ приводит к установке печатающего устройства в автономный режим. При этом игнорируются все последующие символы и функциональные коды, кроме кода CHR$(17) , который служит для возвращения печатающего устройства в режим "ON LINE". Действие команды ┌────────────────────┐ │ LPRINT CHR$(17) │ └────────────────────┘ отличается от нажатия на кнопку "ON LINE", расположенную на принтере. Ког- да горит лампочка "ON LINE", то печатающее устройство "игнорирует" код CHR$(17). ┌─────────────────────┐ Команда │ LPRINT CHR$(7) │ └─────────────────────┘ "заставляет" печатающее устройство издавать звук в течение приблизительно 1/4 секунды. ┌───────────────────────────┐ Командой │ LPRINT CHR$(27);"p";"0" │ └───────────────────────────┘ отменяется сигнал, подаваемый детектором отсутствия бумаги. Сигнал отсут- ствия бумаги обычно заставляет звучать звонок печатающего устройства и ос- танавливает печать до тех пор, пока не будет вставлена бумага. ┌───────────────────────────┐ Команда │ LPRINT CHR$(27);"p";"1" │ └───────────────────────────┘ восстанавливает функции детектора отсутствия бумаги. Команда и н и ц и а л и з а ц и и печатающего устройства ┌──────────────────────────┐ │ LPRINT CHR$(27);"c";"1" │ └──────────────────────────┘ повторно инициализирует печатающее устройство. Буфер печати при этом очи- щается.