ZX Format
#02
30 ноября 1995 |
|
IS-DOS - программистам No 2
Рубрика "IS-DOS - программистам". No 2 Елисеев В. А. "Оконная система IS-DOS" (журнальный вариант) (C) PENCRAFT 1995 (C) IskraSoft 1995 Продолжение, начало в No 1. _________________________________________ Рестарты печати. Следующая важнейшая операция - пе- чать текстовых сообщений - представлена в системе IS-DOS целой группой рестартов, различающихся, главным образом, способом задания исходных параметров и некоторыми дополнительными возможностями. Всего в составе уровня WIND.SYS имеется 7 рестартов, относящихся к про- цессу печати текстов. Первые три из них отличаются использованием в качестве координат печати информации, заключенной в векторе окна (Print pos, Print size, Y-coord). Практически эти три рестарта представляют собой одну программу, имею- щую три точки входа для задания различ- ных параметров. lwt (#65) lwt(#65) - позволяет распечатать в окне заданное количество строк из тексто- вого буфера с заданным отступом по Y от верхнего края окна. Входные параметры: C - код рестарта (#65) IX - адрес вектора окна HL - адрес текстового буфера A - величина отступа по Y от верхней границы окна B - количество печатаемых строк Формат текстового буфера для lwt яв- ляется стандартным для большинства рес- тартов печати в IS-DOS: символы распола- гаются последовательно, начиная от стар- тового адреса в сторону увеличения адре- сов, строки отделяются друг от друга сим- волом с кодом #0D, маркер окончания тек- ста - символ с кодом #03. При работе lwt маркер #03 не обязате- лен, т. к. печатаемый текст ограничивает- ся заданным количеством строк. Однако, если маркер #03 встретится в тексте до того, как будет напечатано требуемое ко- личество строк, печать прекращается. Сим- волы перевода строки тоже не обязательны, так как при достижении правого края окна печать продолжается с начала следующей строки, причем счетчик строк учитывает это, так что независимо от наличия симво- лов #0D в окне будет распечатано задан- ное количество строк. Остальная часть текста обрезается. Если заданное количество строк превы- шает размер окна, текст продолжает выво- диться за его пределами. При работе рестарта lwt сохраняется неизменным содержимое регистра IX и ре- гистровой пары HL. Рассмотрим пример: ;**************************************** ;Листинг 4 Пример использования lwt(#65) ORG #5D64 ;открытие окон CALL CLS LD IX,WIND1 LD C,#61 LD A,2 RST #10 LD IX,WIND2 LD C,#61 LD A,0 RST #10 CALL WAIT ;печать строк текста из буфера в окне 1 LD IX,WIND1 ;адрес вектора окна LD HL,TEXT1 ;адрес текста LD C,#65 ;код рестарта LD A,1 ;отступ по Y LD B,4 ;количество строк RST #10 CALL WAIT ;печать строк текста из буфера в окне 2 LD IX,WIND2 LD HL,TEXT2 LD C,#65 LD A,1 LD B,4 RST #10 CALL WAIT JP EXIT ;векторы окон WIND1 DEFB 5 DEFB 2 DEFB 8 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20 WIND2 DEFB 5 DEFB 12 DEFB 8 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20 ;текстовые буферы TEXT1 DEFM "Рестарт lwt(65)" DEFB 13 DEFM "позволяет печатать" DEFB 13 DEFM "в окне текст из" DEFB 13 DEFM "текстового буфера." DEFB 13 TEXT2 DEFM "В регистре B задано" DEFB 13 DEFM "количество строк," DEFB 13 DEFM "которое требуется" DEFB 13 DEFM "напечатать" DEFB 13 ;дополнительные процедуры CLS LD C,#73 ;рестарт cls RST #10 ;для очистки экрана RET WAIT LD C,#07 ;рестарт ttyin RST #10 ;для ожидания нажа- RET ;тия клавиши EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** Результат работы программы Листинг 1 см. на Рис. 4. ┌───────────────────────────────────────┐ │ │ │ ╔═══════════════════════╗ │ │ ║ Рестарт lwt(#65) ║ │ │ ║ позволяет печатать ║ │ │ ║ в окне текст из ║ │ │ ║ текстового буфера ║ │ │ ║ ║ │ │ ║ ║ │ │ ╚═══════════════════════╝ │ │ │ │ ┌───────────────────────┐ │ │ │ в регистре B задано │ │ │ │ количество строк, │ │ │ │ которое необходимо │ │ │ │ напечатать │ │ │ │ │ │ │ │ │ │ │ └───────────────────────┘ │ │ │ │ │ ├───────────────────────────────────────┤ │ Рис. 4: Печать текста в окне lwt(#65) │ └───────────────────────────────────────┘ adrwt (#66) adrwt(#66) - предназначен для распечатки в окне текста, расположенного непосредственно после вектора окна. Входные параметры: C - код рестарта (#66) IX - адрес вектора окна Рестарт adrwt очень удобен для печа- ти окон с текстом, жестко привязанным к конкретному окну. Главное его достоинство - всего один входной параметр (не считая самого кода рестарта в регистре C). Для вывода текста на экран adrwt ис- пользует те же процедуры, что и lwt, поэ- тому все, что было сказано относительно формата текста для lwt, справедливо и для adrwt. При достижении нижнего края окна печать прекращается, а оставшаяся часть текста игнорируется. При работе рестарта adrwt содержимое регистра IX сохраняется. Пример: ;**************************************** ;Листинг 5 Печать при помощи adrwt(#66) ORG #5D64 ;открытие окон CALL CLS LD IX,WIND1 LD C,#61 LD A,2 RST #10 LD IX,WIND2 LD C,#61 LD A,0 RST #10 CALL WAIT ;печать строк текста в окне 1 LD IX,WIND1 ;адрес вектора окна LD C,#66 ;код рестарта RST #10 CALL WAIT ;печать строк текста в окне 2 LD IX,WIND2 LD C,#66 RST #10 CALL WAIT JP EXIT ;векторы окон WIND1 DEFB 5 DEFB 3 DEFB 7 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20 ;текст окна 1 DEFM "Рестарт adrwt(66)" DEFB #0D DEFM "позволяет печатать" DEFB #0D DEFM "текст, следующий" DEFB #0D DEFM "за вектором окна." DEFB #03 WIND2 DEFB 5 DEFB 12 DEFB 7 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20 ;текст окна 2 DEFM "Строки разделяются" DEFB #0D DEFM "символом с кодом #0D" DEFB #0D DEFM "конец текста - " DEFB #0D DEFM "символ с кодом #03" " DEFB #03 ;дополнительные процедуры CLS LD C,#73 ;рестарт cls RST #10 ;для очистки экрана RET WAIT LD C,#07 ;рестарт ttyin RST #10 ;для ожидания нажа- RET ;тия клавиши EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** lenwt (#67) lenwt(#67) - так же предназначен для распечатки текста в окне, однако текст не закрепляется за вектором конкретного ок- на, а может находиться в произвольном месте программы. Основное преимущество рестарта lenwt - возможность печати одного текста в нескольких окнах и наоборот - возможность печати разных текстов в одном окне. Входные параметры: C - код рестарта IX - адрес вектора окна HL - адрес текста При работе рестарта lenwt содержимое регистра IX и регистровой пары HL сохра- няется. Пример: ;**************************************** ;Листинг 6 Печать при помощи lenwt(#67) ORG #5D64 ;открытие окон CALL CLS LD IX,WIND1 LD C,#61 LD A,2 RST #10 LD IX,WIND2 LD C,#61 LD A,0 RST #10 CALL WAIT ;печать строк текста из буфера в окне 1 LD IX,WIND1 ;адрес вектора окна LD HL,TEXT ;адрес текста LD C,#67 ;код рестарта RST #10 CALL WAIT ;печать строк текста из буфера в окне 2 LD IX,WIND2 LD HL,TEXT LD C,#67 RST #10 CALL WAIT JP EXIT ;векторы окон WIND1 DEFB 5 DEFB 3 DEFB 7 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20 WIND2 DEFB 5 DEFB 12 DEFB 7 DEFB 20 DEFB %00001111 DEFB %00000001 DEFB 8 DEFB 20 ;текстовый буфер TEXT DEFM "Рестарт lenwt(67)" DEFB #0D DEFM "позволяет печатать" DEFB #0D DEFM "текст, находящийся" DEFB #0D DEFM "в любом месте" DEFB #0D DEFM "программы" DEFB #03 ;дополнительные процедуры CLS LD C,#73 ;рестарт cls RST #10 ;для очистки экрана RET WAIT LD C,#07 ;рестарт ttyin RST #10 ;для ожидания нажа- RET ;тия клавиши EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** Результат работы программы Листинг 6 представлен на рис. 5: ┌───────────────────────────────────────┐ │ │ │ ╔═══════════════════════╗ │ │ ║ Рестарт lenwt(67) ║ │ │ ║ позволяет печатать ║ │ │ ║ текст, находящийся ║ │ │ ║ в любом месте ║ │ │ ║ программы ║ │ │ ║ ║ │ │ ╚═══════════════════════╝ │ │ │ │ ┌───────────────────────┐ │ │ │ Рестарт lenwt(67) │ │ │ │ позволяет печатать │ │ │ │ текст, находящийся │ │ │ │ в любом месте │ │ │ │ программы │ │ │ │ │ │ │ └───────────────────────┘ │ │ │ │ │ ├───────────────────────────────────────┤ │ Рис. 5: Печать текста lenwt(#67) │ └───────────────────────────────────────┘ ... ... prstr (#68) Рестарт prstr(#68) - самый мощный и универсальный из всех рестартов, предназ- наченных для печати строк текста в окне. Основным его достоинством является воз- можность автоматического выравнивания строки по левому и правому краю, а также центровки строки. Рестарт имеет 4 подфун- кции, позволяющие задать печатаемую стро- ку различными способами. Код подфункции помещается в регистре E: E=0 - распечатка строки по логическому имени, определенному в специальном массиве-анализаторе E=1 - распечатка строки заданной длины, содержащейся по указанному адресу E=2 - служебная подфункция, которая ни- чего не печатает, но позволяет вы- числить параметры для предыдущей подфункции, зная адрес начала текстового буфера и номер строки E=3 - распечатка строки по номеру ее в тексте - фактически представляет собой комбинацию подфункций 2 и 1 Диспетчер подфункций имеет "защиту от дурака" - если Вы задали в регистре E но- мер, больший чем 3, он будет автоматичес- ки приравнен к нулю. Теперь рассмотрим более подробно ра- боту с подфункциями рестарта prstr(#68). Для начала - общие положения. При вызове рестарта в регистре A должно нахо- диться число, определяющее два основных параметра печати - режим выравнивания (два старших бита) и отступ по Y от вер- хнего края окна (шесть младших битов). Режим выравнивания кодируется следующим образом: 00 - выравнивание по левому краю 01 - выравнивание по левому краю 10 - выравнивание по правому краю 11 - центровка строки При работе рестарта содержимое регис- тра A не сохраняется. Формат текстового буфера для prstr стандартный - символы располагаются пос- ледовательно, начиная со стартового адре- са, строки отделяются друг от друга сим- волом #0D, маркер конца текста - #03. Для вывода символов на экран prstr использует рестарт ttyout(#0A) из уровня DOS.SYS. При формировании текстового бу- фера, задании отступа и числа печатаемых символов необходимо самостоятельно сле- дить за тем, чтобы текст не вышел за пре- делы окна. При ширине строки, большей чем ширина поля печати окна выравнивание ав- томатически осуществляется по левому краю, независимо от состояния двух стар- ших битов регистра A. Подфункция 0, как уже сообщалось вы- ше, позволяет распечатать строки из тек- стового буфера по их логическим именам. Что это такое? Допустим, Вам необходимо распечатать в окне текст, содержащий часто повторяю- щиеся строки. Вместо того, чтобы многок- ратно вызывать prstr, каждый раз задавая все параметры и строго следя за тем, ка- кую из строк печатать следующей, или, что еще хуже, забивать текстовый буфер одина- ковыми строками, Вы можете просто соста- вить массив, в котором будет установлена последовательность печати строк путем ссылок на их порядковые номера в буфере. Оперативно переключая разные массивы, Вы сможете легко перекомпоновывать Ваши тек- сты, менять местами строки, вставлять другие и т. п. При помощи подфункции 0 легко также организовать печать тексто- вых сообщений по коду из таблицы (по ти- пу сообщений об ошибках в Spectrum BASIC). Входные параметры: С - код рестарта (#68) E - код подфункции (0) IX - адрес вектора окна HL - адрес массива-анализатора A - режим центровки и отступ по Y (см. выше) B - логическое имя строки - любой код, кроме #FF На выходе при нормальном завершении работы регистр HL содержит число, на еди- ницу меньшее,чем адрес первого символа строки, следующей за напечатанной, сохра- няется неизменным содержимое регистра IX, содержимое регистров A, B, C, E - теряет- ся. Рестарт prstr также модифицирует сис- темную переменную xypos (см. вектор сим- вольного устройства вывода). Возможные ошибки: 1. Если логическое имя строки не найде- но в массиве-анализаторе, то рестарт воз- вращается в вызывающую программу с уста- новленным флагом C и кодом ошибки 140 (нет имени в массиве) в регистре A. 2. Если текст не содержит строки с по- рядковым номером, указанным в массиве, рестарт возвращается с установленным фла- гом C и кодом ошибки 141 (нет строки в тексте) в регистре A. Массив-анализатор имеет следующую структуру: первые два байта - адрес тек- стового буфера, далее - двухбайтовые за- писи, в которых первый байт - логическое имя строки, а второй - ее порядковый но- мер в буфере. Завершается массив обяза- тельно кодом #FF. Рассмотрим пример. Изобразим на экра- не рамку из звездочек в двух разных ва- риантах для двух окон (см. Рис. 6): ┌───────────────────────────────────────┐ │ │ │ ************************* │ │ * * * │ │ * * * │ │ ************************* │ │ * * │ │ * * │ │ * * │ │ * * │ │ ************************* │ │ │ │ ************************* │ │ * * * * │ │ * * * * │ │ * * * * │ │ ************************* │ │ * * * │ │ * * * │ │ * * * │ │ ************************* │ │ │ ├───────────────────────────────────────┤ │ Рис. 6: Рамки из звездочек для │ │ демонстрации работы prstr │ └───────────────────────────────────────┘ Для рисования двух этих рамок при по- мощи подфункции 0 рестарта prstr необхо- димы только 4 вида строк: 1. "*************************" 2. "* *" 3. "* * *" 4. "* * * *" Составим программу, выполняющую эту задачу: ;***************************************** ; Листинг 7 Печать при помощи ; подфункции 0 рестарта prstr ORG #5D60 ;открытие окон CALL CLS ;очистка экрана LD IX,WIND1 ;открыть окно 1 LD C,#61 LD A,2 RST #10 LD IX,WIND2 ;открыть окно 2 LD C,#61 LD A,0 RST #10 ;печать первой рамки LD IX,WIND1 ;адрес вектора окна LD HL,TABL1 ;адрес массива CALL PRINT ;вызов процедуры ;печати текста ;печать второй рамки LD IX,WIND2 LD HL,TABL2 CALL PRINT CALL WAIT ;ожидание клавиши JP EXIT ;выход в IS-DOS ;процедура печати PRINT LD B,#09 ;число строк, кот. ;необходимо распе- ;чатать, одновре- ;менно - логическое ;имя первой строки ;режим выравнивания - по центру, ;отступ - 1 строка LD A,%11000001 M1 PUSH HL ;сохранить на стеке ;адрес массива PUSH AF ;сохранить на стеке ;режим выравнивания ;и текущую величину ;отступа по Y LD C,#68 ;код рестарта LD E,#00 ;код подфункции RST #10 ;вызов рестарта POP AF ;снять со стека ;текущую величину ;отступа INC A ;увеличить ее на 1 ;для печати следую- ;щей строки POP HL ;восстановить в HL ;адрес массива DJNZ M1 ;повторить, пока ;значение B не ;уменьшится до 0 ;значение B служит одновременно счетчиком ;в цикле печати и логическим именем оче- ;редной печатаемой строки RET ;возврат в основную ;программу ;векторы окон WIND1 DEFB 0 DEFB 0 DEFB 11 DEFB 30 DEFB %00001111 DEFB #FF DEFB 3 DEFB 38 WIND2 DEFB 0 DEFB 12 DEFB 11 DEFB 30 DEFB %00001111 DEFB #FF DEFB 3 DEFB 38 ;текстовый буфер TEXT DEFM "*************************" DEFB #0D DEFM "* *" DEFB #0D DEFM "* * *" DEFB #0D DEFM "* * * *" DEFB #0D DEFB #03 ;массивы-анализаторы TABL1 DEFW TEXT DEFB #09 DEFB 1 DEFB #08 DEFB 3 DEFB #07 DEFB 3 DEFB #06 DEFB 1 DEFB #05 DEFB 2 DEFB #04 DEFB 2 DEFB #03 DEFB 2 DEFB #02 DEFB 2 DEFB #01 DEFB 1 DEFB #FF TABL2 DEFW TEXT DEFB #09 DEFB 1 DEFB #08 DEFB 4 DEFB #07 DEFB 4 DEFB #06 DEFB 4 DEFB #05 DEFB 1 DEFB #04 DEFB 3 DEFB #03 DEFB 3 DEFB #02 DEFB 3 DEFB #01 DEFB 1 DEFB #FF ;дополнительные процедуры CLS LD C,#73 ;очистка экрана RST #10 RET WAIT LD C,#07 ;ожидание клавиши RST #10 RET EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** Подфункция 1 позволяет распечатать строку заданной длины, хранящуюся в памя- ти по указанному адресу. Эта подфункция вычисляет координаты печати строки, учи- тывая количество символов, отступ, режим выравнивания и ширину поля печати. При этом она пользуется той же процедурой, что и подфункция 0, поэтому за соответ- ствием размеров окна размерам текста при- ходится следить самостоятельно. После вычисления координат подфун- кция 1 вызывает тот же рестарт ttyout(#0A) в цикле до тех пор, пока не будет напечатано требуемое количество символов. Входные параметры: C - код рестарта (#68) E - код подфункции (#01) IX - адрес вектора окна HL - адрес начала строки B - длина строки A - режим выравнивания и отступ по Y Длина печатаемой строки определяется исключительно значением регистра B. Сим- вол перевода строки #0D в этом случае за- меняется пробелом, остальные символы с кодами меньше #20 применять не рекомен- дуется во избежание появления "мусора" на экране. Пример использования подфункции 1: ;**************************************** ;Листинг 8 Пример печати при помощи ; prstr(#68) подфункция 1 ORG #5D64 ;открытие окна CALL CLS LD IX,WIND LD C,#61 LD A,2 RST #10 CALL WAIT ;печать строки текста из буфера в окне ;через подфункцию 1 LD IX,WIND ;вектор окна LD C,#68 ;код рестарта LD E,1 ;код подфункции LD HL,TEXT1 ;адрес строки LD A,%11000010 ;два старших бита - режим выравнивания ;(в данном случае - центровка) ;шесть младших - отступ сверху (2 строки) LD B,30 ;кол-во символов ;в строке RST #10 ;вызов рестарта CALL WAIT ;печать следующей строки LD IX,WIND ;вектор окна LD C,#68 ;код рестарта LD E,1 ;код подфункции LD HL,TEXT2 ;адрес начала ;строки LD A,%11000100 ;печать без выравнивания и отступ ;сверху - 4 строки LD B,36 ;кол-во символов ;в строке RST #10 ;вызов рестарта CALL WAIT JP EXIT ;вектор окна WIND DEFB 1 DEFB 1 DEFB 8 DEFB 30 DEFB %00001111 DEFB %00000001 DEFB 3 DEFB 38 ;текстовый буфер TEXT1 DEFM "Рестарт prstr(68) " DEFM "подфункция 1" TEXT2 DEFM "печать строки в окне " DEFM "с выравниванием" ;дополнительные процедуры CLS LD C,#73 ;очистка экрана RST #10 RET WAIT LD C,#07 ;ожидание клавиши RST #10 RET EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** Подфункция 2 позволяет вычислить входные параметры для подфункции 1 (ад- рес и длину строки) по ее порядковому но- меру в текстовом буфере. Входные параметры: C - код рестарта (#68) E - код подфункции (#02) HL - адрес начала текста B - порядковый номер строки Выходные параметры: HL - адрес строки B - длина строки Содержимое регистров C и E не сохра- няется. Формат текста - стандартный. Если значение порядкового номера строки превы- шает число строк в тексте, рестарт воз- вращается с установленным флагом C и ко- дом ошибки 141 (нет строки в тексте) в регистре A. ... ... Пример использования подфункции 2: ;**************************************** ;Листинг 9 Пример использования ; prstr(#68) подфункция 2 ORG #5D64 ;открытие окна CALL CLS LD IX,WIND LD C,#61 LD A,2 RST #10 CALL WAIT ;пример использования подфункции 2 для ;определения параметров для подфункции 1 ;по известному номеру строки в тексте LD C,#68 ;код рестарта LD E,2 ;код подфункции 2 LD HL,TEXT ;адрес начала ;текста LD B,1 ;номер строки RST #10 ;на выходе в HL' - адрес строки, ;а в B - длина EXX LD C,#68 LD E,1 ;код подфункции 1 LD A,%11000001 RST #10 LD C,#68 LD E,2 ;определение LD HL,TEXT ;параметров след. LD B,2 ;строки RST #10 EXX LD C,#68 LD E,1 ;печать LD A,%11000011 RST #10 LD C,#68 LD E,2 LD HL,TEXT LD B,3 RST #10 EXX LD C,#68 LD E,1 LD A,%11000101 RST #10 CALL WAIT JP EXIT ;вектор окна WIND DEFB 1 DEFB 1 DEFB 8 DEFB 30 DEFB %00001111 DEFB %00000001 DEFB 3 DEFB 38 ;текстовый буфер TEXT DEFM "Рестарт prstr(68) " DEFM "подфункция 2" DEFB #0D DEFM "определяет параметры для " DEFB #0D DEFM "подфункции 1" DEFB #0D DEFB #03 ;дополнительные процедуры CLS LD C,#73 ;очистка экрана RST #10 RET WAIT LD C,#07 ;ожидание клавиши RST #10 RET EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** Подфункция 3 - комбинация подфункций 2 и 1. В качестве входных параметров ис- пользуются адрес начала текста и порядко- вый номер строки в нем. Сначала подфункция 3 при помощи под- функции 2 вычисляет значения адреса и длины строки, после чего управление пере- дается подфункции 1. Входные параметры: C - код рестарта (#68) E - код подфункции (#03) IX - адрес вектора окна HL - адрес начала текста B - номер строки A - режим выравнивания и отступ по Y Как и в подфункции 2, отсутствие в тексте строки с указанным порядковым но- мером приводит к возврату в вызывающую программу с установленным флагом C и ко- дом ошибки 141 (нет строки в тексте) в регистре A. Пример использования подфункции 3: ;**************************************** ;Листинг 10 Пример использования ; prstr(#68) подфункция 3 ORG #5D64 ;открытие окна CALL CLS LD IX,WIND LD C,#61 LD A,2 RST #10 CALL WAIT ;печать строк текста из буфера в окне ;через подфункцию 3 LD IX,WIND ;вектор окна LD C,#68 ;код рестарта LD E,3 ;код подфункции LD HL,TEXT ;адрес начала ;текста LD A,%11000010 ;печать с центровкой и отступ ;сверху - 2 строки LD B,1 ;номер строки ;в тексте RST #10 ;вызов рестарта CALL WAIT LD IX,WIND ;вектор окна LD C,#68 ;код рестарта LD E,3 ;код подфункции LD A,%11000101 LD B,2 ;печать следующей RST #10 ;строки в окне CALL WAIT JP EXIT ;вектор окна WIND DEFB 1 DEFB 1 DEFB 8 DEFB 30 DEFB %00001111 DEFB %00000001 DEFB 3 DEFB 38 ;текстовый буфер TEXT DEFM "Рестарт prstr(68) " DEFM "подфункция 3" DEFB #0D DEFM "печать строки по номеру" DEFB #0D DEFB #03 ;дополнительные процедуры CLS LD C,#73 ;очистка экрана RST #10 RET WAIT LD C,#07 ;ожидание клавиши RST #10 RET EXIT $XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** Следующие два рестарта предназначены для печати на экране в абсолютных коорди- натах, не привязанных к конкретному окну. str (#6C) Рестарт str(#6C) - печать в текущей позиции экрана строки, ограниченной кодом #0D. Адрес строки задается в регистро- вой паре HL. Этот рестарт удобен для пе- чати строк на экране за пределами окон, не требует задания координат, а ис- пользует текущую позицию печати, храня- щуюся в системной переменной XYPOS. Рестарт str - это всего лишь цикли- ческое обращение к уже упоминавшемуся вы- ше рестарту ttyout(#0A) из уровня DOS.SYS, осуществляемое до тех пор, пока не встретится код перевода строки #0D. Для определения координат печати ис- пользуется системная переменная XYPOS, располагающаяся в векторе символьного ус- тройства вывода. Доступ к этой перемен- ной можно получить, используя рестарты wtpos(#6B) и prapd(#0C), о чем несколько позже. При работе рестарта str символ пере- вода строки рассматривается только как ограничитель текста, и реальный перевод строки при печати не производится. Сле- дует отметить, что размер поля печати при вызове str ограничивается одной из тре- тей экрана - верхней, средней или нижней, а именно той, в пределах которой находи- лась текущая позиция печати до вызова. При достижении правой границы экрана пе- чать переносится на следующую строку, причем последний символ может быть "ра- зорван" при переносе, а при достижении нижней границы соответствующей трети эк- рана печать переносится на первую из восьми строк этой трети. Входные параметры: C - код рестарта (#6C) HL - адрес строки XYPOS - системная переменная - текущая позиция печати. Пример: ;**************************************** ;Листинг 11 Пример использования str(#6C) ORG #5D64 CALL CLS ;очистка экрана LD HL,TEXT1 ;адрес текста LD C,#6C ;код рестарта RST #10 ;печать строки CALL WAIT LD HL,TEXT2 ;печать второй LD C,#6C ;строки RST #10 CALL WAIT LD HL,TEXT3 ;печать третей LD C,#6C ;строки RST #10 CALL WAIT JP EXIT ;текстовый буфер TEXT1 DEFM "Рестарт str (#6C) " DEFB #0D TEXT2 DEFM " позволяет печатать " DEFB #0D TEXT3 DEFM " в абсолютных " DEFM " координатах" DEFB #0D ;дополнительные процедуры CLS LD C,#73 ;рестарт cls RST #10 ;для очистки экран RET WAIT LD C,#07 ;рестарт ttyin RST #10 ;для ожидания нажа- RET ;тия клавиши EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** lnstr (#6D) Рестарт lnstr(#6D) - так же, как и предыдущий, обращается в цикле к ttyout(#0A), но распечатывает только за- данное количество символов. Координаты печати также хранятся в системной пере- менной XYPOS. Входные параметры: C - код рестарта (#6D) HL - адрес текста строки B - количество символов XYPOS - системная переменная - текущая позиция печати. При печати символы перевода строки #0D заменяются пробелами, другие же сим- волы с кодами меньшими #20 применять не рекомендуется. Как и в случае со str, по- ле печати ограничивается одной из третей экрана. Для задания координат через систем- ную переменную XYPOS пользуйтесь рестар- тами prapd(#0C) из уровня DOS.SYS и wtpos(#6B). Пример: ;**************************************** ;Листинг 12 Пример работы lnstr(#6D) ORG #5D64 CALL CLS ;очистка экрана LD HL,TEXT ;адрес текста LD C,#6D $ ?код рестарта LD B,81 RST #10 ;печать строки CALL WAIT JP EXIT ;текстовый буфер TEXT DEFM "Рестарт str (#6C) " DEFM "позволяет печатать " DEFM " в абсолютных" DEFM " координатах" ;дополнительные процедуры CLS LD C,#73 ;рестарт cls RST #10 $ ;для очистки экран RET WAIT LD C,#07 ;рестарт ttyin RST #10 ;для ожидания нажа- RET ;тия клавиши EXIT XOR A ;стандартный выход LD A,#F4 ;в IS-DOS RET ;**************************************** Еще один рестарт печати tylin(#71) имеет непосредственное отношение к работе строкового редактора edstr(#7F), поэтому он будет рассмотрен в одной из следующих статей нашей рубрики. Продолжение следует ... В следующем номере нашего журнала Вы поз- накомитесь с довольно большой группой вспомогательных рестартов, также входя- щих в состав уровня WIND.SYS. _________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября