|
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.
_________________________________________
Другие статьи номера:
Похожие статьи:
В этот день... 17 ноября