ZX Format #02
30 ноября 1995
  IS-DOS  

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.
_________________________________________



Другие статьи номера:

IS-DOS - Информация: новости в мире IS-DOS

IS-DOS - Как это сделано No 2

IS-DOS - начинающим No 2

IS-DOS - пользователям No 2

IS-DOS - программистам No 2

Ассемблер - Ассемблер для чайников

Железо - Доработки: Пеpеключатель turbo/normal для Scorpion ZS-256-Turbo

Железо - Переферия: презентация звуковой карты General Sound.

Железо - Производители: Create Soft - Возвращаясь к напечатанному

Железо - Производители: KAY - Турбирование Spectrum - машин

Игрушки - Новелла: 48 Утюгов.

Игрушки - По полочкам: Carrier Command.

Интервью - интервью с Сергеем Зоновым и Андреем Ларченко

Информация - Авторы журнала

Информация - От авторов

Информация - Помощь

Информация - Чёрный ящик

Конкурс

Отдохнём - Нечто: Нервная работа

Почтовый ящик - Доска объявлений

Почтовый ящик - Письма читателей

Премьера - Digital Studio v1.12

Программистам - Basic для всех.

Разное - Из истории Амиги.

Разное - Перспективы П/О.

Системы - музыкальный редактор Instrument 3.01

Что новенького - Обзор новинок: Night Hunter, Extreme, Grell & Falla, Duck Out, Internationl Ninja Rabbits, Italian Super Car, Sly Spy Secret Agent, The Turn, Sextris.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Сеть - Сетевые новости. Список BBS: ZX-Net 095, Независимые BBS,
Сатира и юмор - Диалог или из-за чего спиваются SysOp'ы.
Реклама - Реклама и объявления ...

В этот день...   18 июля