ZX Format #02: Оконная система IS-DOS: Операции печати текста

Упомянутые программы

Рубрика "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) - позволяет распечатать в окне заданное количество строк из текстового буфера с заданным отступом по 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) - предназначен для распечатки в окне текста, расположенного непосредственно после вектора окна. Входные параметры: 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 - возможность печати одного текста в нескольких окнах и наоборот - возможность печати разных текстов в одном окне. Входные параметры: 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 #0D 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).

Входные параметры:

C - код рестарта (#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 5
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 (нет строки в тексте).Пример использования подфункции 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 ;для ожидания нажатия клавиши
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 ;для ожидания нажатия клавиши
EXIT XOR A ;стандартный выход
LD A,#F4 ;в IS-DOS
RET
;****************************************
Еще один рестарт печати tylin(#71) имеет непосредственное отношение к работе строкового редактора edstr(#7F), поэтому он будет рассмотрен в одной из следующих статей нашей рубрики.
Продолжение следует ...
В следующем номере нашего журнала Вы познакомитесь с довольно большой группой вспомогательных рестартов, также входящих в состав уровня WIND.SYS.

Оглавление издания: ZX Format #02

  • IS-DOS
    Анонс готового к использованию в школах аппаратно-программного комплекса от Iskra Soft и Петерс, оснащенного сетевым компьютерным классом на базе ZX Spectrum и IS-DOS.
  • IS-DOS - Владимир Елисеев
    Объяснение работы командного монитора и рестарта текстового редактора в IS-DOS на примере утилиты mon.com.
  • IS-DOS
    Введение в системные утилиты IS-DOS, охватывающее функции помощи, пользовательского меню, просмотра файлов, редактирования и операций с файлами.
  • IS-DOS
    Подробное описание программы eliminat.com для освобождения памяти от резидентных задач и драйверов с интерактивным режимом и ключами командной строки. Специфические номера каналов выделены для типов задач и драйверов. Включает варианты использования и настройку цветов.
  • Оконная система IS-DOS - Владимир Елисеев
    Изучение перезапусков оконной системы IS-DOS для печати текста в окнах и абсолютных координатах экрана. Примеры реализации перезапусков, таких как lwt, adrwt, lenwt, prstr, str и lnstr. Продолжение о вспомогательных перезапусках в следующем номере.
  • Ассемблер
    Введение в основы языка ассемблера с акцентом на флаги, арифметические операции и манипуляцию регистрами. Обсуждаются операции сложения, вычитания и сложные операции, такие как умножение и деление, через примеры. Подчеркивается использование специфических команд ассемблера и их функций для ZX Spectrum.
  • Железо
    Обсуждение модификаций железа для Scorpion ZS-256-Turbo, включая установку переключателя Turbo/Normal. Плюсы и минусы программных методов переключения. Советы по пайке и настройке схем.
  • Железо
    Обсуждение новой музыкальной приставки для ZX Spectrum от X-TRADE и HACKER STINGER под названием 'ZX GENERAL SOUND', предлагающей высокое качество звука и минимальное использование процессора.
  • Железо
    Обсуждение инноваций в железе и маркетинговых стратегий, с акцентом на интерфейсы мыши и клавиатуры для ZX Spectrum. Критика вводящей в заблуждение рекламы конкурентов и анализ технологий serial и пассивной мыши. Автор ставит под сомнение необходимость и стоимость продвинутых функций.
  • Железо
    Обсуждение методов аппаратного ускорения для ZX Spectrum, с акцентом на турбо-режимы и их влияние на производительность и совместимость.
  • Игрушки
    Фэнтезийный рассказ о магических существах, борющихся с вторжением людей. Главный герой набирает союзников для восстановления былого величия страны. Испытания включают поиск инструментов, преодоление препятствий и оживление компаньонов.
  • Игрушки
    Обзор игры 'Carrier Command', с акцентом на стратегические и симуляционные аспекты. Включает детали игровых механик, управления и целей. Подчеркивает стратегии для успеха и уникальные особенности, такие как управление ресурсами и автономными системами.
  • Интервью
    Интервью с Сергеем Зоновым и Андреем Ларченко об их опыте с микропроцессорами и разработке ZX Spectrum, включая создание компьютера Scorpion ZS 256.
  • Информация
    Контактная информация и список сотрудников ZX-Format №2 (1995), включая редактора, кодеров и дизайнеров.
  • Информация
    Обращение редактора к читателям ZX Format, обсуждение положительных отзывов, прошлых ошибок и поисков карикатуриста, планы на будущее для журнала.
  • Информация
    Обсуждение новой интерпретации системы оконного меню 'PULLDOWN' для ZX Spectrum с акцентом на обновления интерфейса и улучшение взаимодействия с пользователем.
  • Информация
    Обсуждение компаний, незаконно распространяющих ZX Format, с акцентом на преимущества покупки официальных копий.
  • Конкурс
    Обсуждается отсутствие участия в конкурсе ZX Format, приводятся правила и призы, и поощряются читатели к предложению новых идей.
  • Отдохнём
    Юмористический рассказ о трудностях продавца софта при общении с несведущими покупателями, демонстрирующий нервозность его работы.
  • Почтовый ящик
    Обзор комплектующих и цен для энтузиастов ZX Spectrum с деталями заказа.
  • Почтовый ящик
    Раздел писем читателей в ZX Format #02 обсуждает отзывы читателей, затрагивает вопросы с функциями ZX Format и предлагает будущие улучшения.
  • Премьера
    Инструкция к музыкальному редактору Digital Studio v1.12 для ZX Spectrum, включая функции, навигацию по меню и использование Digital Studio Compiler.
  • Программистам
    Изучение инструментов, расширяющих стандартный Basic 48, включая Renumber для Basic 128, Trace & Speed, Blast Toolkit и ZXeditor, с акцентом на их функции и полезности.
  • Разное
    История моделей компьютеров Amiga и их эволюция от A1000 до A4000/60T с характеристиками и уникальными особенностями. Объяснение технических терминов и различий между chip и fast памятью. Упоминание о новых разработках, таких как AGA чипсет и модели для разных нужд.
  • Разное
    Статья представляет предстоящие релизы программного обеспечения для ZX Spectrum и рассматривает новшества игр, таких как 'Приключения Винни Пуха' и 'НЛО 2: Дьяволы Бездны'. Она выделяет особенности, создателей и технические требования. Включает анонсы от SOFTLAND и Cracked Masters Group.
  • Системы
    Обсуждение создания музыки с Instrument 3.01, акцент на оцифрованный звук. Анализ возможностей программы и конвертация из ASC Sound Master. Инструкции по созданию композиции и конвертации.
  • Что новенького
    Обзор новых игр для ZX Spectrum на петербургском рынке в конце 1995 года. Подробные описания игр, требования к памяти, управление и оценки музыки/графики. Включает Night Hunter, Extreme, Grell & Falla и другие.