ZX Review #7-8-9-10
08 ноября 1997

Страничка iS-DOS - Описание рестартов системы IS DOS.

┌──────────────────────────────┐
│                              │
│       СТРАНИЧКА iS-DOS       │
│                              │
└──────────────────────────────┘

Music by MITCHELL

(c) Сергей Астров, г.Чебоксары

      ОПИСАНИЕ РЕСТАРТОВ
        СИСТЕМЫ IS DOS

   Прим. ред.: Данная работа была выполне-
на уже довольно давно. В  рядах  экспертов
ZX РЕВЮ она вызвала положительные отклики,
но, к сожалению, не была автором  заверше-
на. Надеемся, что кто-то из наших  читате-
лей закончит этот труд.
   Слово С.Астрову...

 ╓────────────────────────────────────────────────────────────╖
 ║ #00=0 DOS.create - Инициализация электронного диска        ║
 ╙────────────────────────────────────────────────────────────╜

   Электронный диск (не путать с
"быстрым"; виртуальным или RAM-,
или квазидиском) - это  внутрен-
ний кэш дискового  пространства,
он нужен для увеличения  быстро-
действия обращения к диску.  При
первом  считывании   какого-либо
блока его содержимое  сохраняет-
ся в памяти. Если затем произой-
дет еще одно обращение  к  этому
же  блоку, то  информация  будет
считана  уже  из  ОЗУ.  Название
"электронный" является не совсем
удобным, в этом издании оно  за-
менено  на  "дисковый  кэш"  или
просто "кэш".

   При вызове этого рестарта ак-
кумулятор должен содержать  раз-
мер кэша в блоках.  Для  каждого
блока резервируется по 260 байт:
256 - для содержимого блока;  по
одному байту для  регистра  сос-
тояния блока и счетчика  обраще-
ний к блоку;  2  байта  -  номер
блока на устройстве.
   Размер кэша может быть любым,
в зависимости от нужд  пользова-
теля. В фирменном  описании  IS-
DOS оптимальный размер кэша при-
нят за  29  блоков, я  использую
кэш  размером  в  32  блока.  Не
стоит  использовать  малые   или
большие размеры кэша.  В  первом
случае  обращение  к  диску  бу-
дет замедленным, во втором  слу-
чае многие программы  не  смогут  
разместиться в  памяти, а следо-
вательно, не смогут работать.
   Итак, регистр A должен содер-
жать размер кэша.  Во  избежание
зависания не следует загружать в
аккумулятор значение 0. Если бу-
дет  задан  размер  кэша  огром-
ных размеров, больше чем возмож-
но создать, то рестарт ничего не
сделает, при выходе будет  вклю-
чен флаг Carry - ошибка.
   Не   рекомендуется   задавать
значения кэша меньше, чем девять
блоков, поскольку  тогда  пропа-
дет возможность широкого исполь-
зования "быстрого" диска. Други-
ми словами, в  этом  случае  все
программы  будут  искаться    на
"системном" диске, не  обращаясь
сначала к "быстрому".

 ╓────────────╖
 ║   Пример   ║
 ╙────────────╨

; Приведенная программа создает кэш размером в 25 блоков.
140.
       LD   A,25    ;кэш в 325 блоков
       LD   C,0     ;create
       RST  #10

       XOR  A
       LD   A,#F4
       RET
2

 ╓─────────────────────────────────────────────╖
 ║ #07=7 DOS.ttyin - Ввод символа с клавиатуры ║
 ╙─────────────────────────────────────────────╜
 ╓─────────╖
 ║  Пример ║
 ╙─────────╨

; Программа вводит с клавиатуры символ и изображает его
; в верхнем левом углу экрана. Для выхода нажать <ENTER>.
140.
LOOP   LD   HL,0    ;координата (0,0)
       LD   C,#0C   ;prapd - установка позиции печати
       RST  #10

       LD   C,#07   ;ttyin - ввод символа
       RST  #10

       CP   13
       JR   Z,EXIT

       LD   C,#0A   ;ttyout - вывод символа
       RST  #10
       JR   LOOP

EXIT   XOR  A
       LD   A,#F4
       RET2


╓────────────────────────────────────────────────────────────╖
║ #08=8 DOS.kwait - Ожидание состояния клавиатуры с          ║
║                   ненажатыми клавишами.                    ║
╙────────────────────────────────────────────────────────────╜
2
   Во время работы этого рестар-
та постоянно будет  опрашиваться
клавиатура, и  пока  нажата  од-
на клавиша, выхода  из  рестарта
происходить не будет. Как только
будут отпущены все  клавиши, ли-
бо нажаты две или более клавиши,
то сразу произойдет выход.  Если
в нижеприведенном примере  будет
нажата, скажем, клавиша "A" и не
будет отпускаться, то  программа
не будет  выходить  в  оболочку.
Если нажать еще и клавишу  <CAPS
SHIFT> или  <SYMBOL  SHIFT>  (не
отпуская  "A"!), то  выхода  все
равно не произойдет. Если же все
клавиши будут отпущены, либо на-
жаты "A" и "B" вместе, то  прои-
зойдет выход в оболочку.

   Применение этого рестарта бы-
вает  нужно  в  некоторых  меню,
имеющих  "горячие кнопки", когда
может случайно произойти повтор-
ный вызов по  этой  же  "горячей
кнопке".  Иначе говоря, применя-
ется в  случае, когда  необходи-
мо быть уверенным, что какая-ни-
будь клавиша будет отжата.

 ╓──────────╖
 ║  Пример  ║
 ╙──────────╨

; Программа очищает экран, ждет нажатия клавиши и "висит",
; пока не будет отжата эта клавиша.
140.
       XOR  A
       LD   C,#73   ;cls - очистка экрана
       RST  #10

       LD   C,#07   ;ttyin - ожидание нажатия клавиши
       RST  #10

       LD   C,#08   ;kwait - ожидание "отжатия" клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET
2

 ╓─────────────────────────────────────────────╖
 ║ #0A=10 DOS.ttyout - Вывод символа на экран  ║
 ╙─────────────────────────────────────────────╜

   Данный  рестарт  используется
самой  системой  в   большинстве
случаев, когда нужно вывести  на
экран (или на другое  символьное
устройство  вывода)   какой-либо
текст.  В  большинстве   случаев
этот рестарт не  используется  в
прикладных  программах, подпрог-
рамма печати символа выделена  в
отдельный рестарт, чтобы  упрос-
тить обращение к  процедуре  са-
мой системой.

   Если используется драйвер пе-
чати ty42.typ, то при печати уп-
равляющие  символы  (chr  0..chr
31) не распознаются и вместо них
будут выведены символы с хаотич-
ными очертаниями. При  использо-
вании драйвера ty42-f.typ управ-
ляющие символы будут выведены  в
соответствии с  кодировкой  IBM.
Вообще, рестарт только  передает
без  изменения  коды    символов
драйверу печати. Что будет выве-
дено  на  экран  (напечатано  на
принтере)  -  зависит  только от
драйвера.

   Не рекомендуется  при  печати
на экран выходить за пределы эк-
рана, хотя зависания, как прави-
ло, не происходит.

 ╓──────────╖
 ║  Пример  ║
 ╙──────────╨

; Программа очищает экран и выводит полный набор символов,
; которые позволяет печатать данный драйвер вывода.
; Для выхода нажать <ENTER>.
140.
       LD   C,#73   ;cls - очистка экрана
       XOR  A
       RST  #10

       LD   D,8     ;8 строк
       LD   H,-1    ;начальное значение координаты
       XOR  A       ;печатаемый символ
LOOP   LD   B,32    2;32 символа в строке
       INC  H       ;переход на новую строку
       LD   L,0     ;координата (H,0)
       LD   C,#0C   ;prapd - установка позиции печати
       PUSH AF
       RST  #10
       POP  AF

L1     LD   C,#0A   ;ttyout - вывод символа
       PUSH AF
       RST  #10
       POP  AF
       INC  A       ;следующий символ
       DJNZ L1

       DEC  D
       JR   NZ,LOOP

       LD   C,#07   ;ttyin - ожидание
       RST  #10

EXIT   XOR  A
       LD   A,#F4
       RET
2

 ╓─────────────────────────────────────────╖
 ║ #0B=11 DOS.prcpl - Выбор режима печати  ║
 ╙─────────────────────────────────────────╜

   Рестарт  позволяет    выбрать
один  из  двух  режимов  печати:
прямой или инверсный.  Инверсный
вывод часто используется для вы-
деления какого-либо участка тек-
ста.
   Режим печати задается  регис-
тром A.  Устанавливается  прямой
(обычный) режим печати, если ак-
кумулятор содержит 0, иначе  бу-
дет установлен инверсный режим.

 ╓───────────╖
 ║   Пример  ║
 ╙───────────╨

; Программа очищает экран и выводит полный набор символов,
; которые позволяет печатать данный драйвер вывода. Печать
; происходит в инверсном режиме. Для выхода нажать <ENTER>.
140.
       LD   A,1
       LD   C,#0B
       RST  #10

       LD   C,#73   ;cls - очистка экрана
       XOR  A
       RST  #10

       LD   D,8     ;8 строк
       LD   H,-1    ;начальное значение координаты
       XOR  A       ;печатаемый символ
LOOP   LD   B,32    ;32 символа в строке
       INC  H       ;переход на новую строку
       LD   L,0     ;координата (H,0)
       LD   C,#0C   ;prapd - установка позиции печати
       PUSH AF
       RST  #10
       POP  AF

L1     LD   C,#0A   ;ttyout - вывод символа
       PUSH AF
       RST  #10
       POP  AF
       INC  A       ;следующий символ
       DJNZ L1

       DEC  D
       JR   NZ,LOOP

       LD   C,#07   ;ttyin - ожидание
       RST  #10

EXIT   XOR  A
       LD   A,#F4
       RET
2
 ..............................................................
 ╓────────────────────────────────────────────────────────────╖
 ║ #15=21 DOS.empty - Рестарт не используется.                ║
 ╙────────────────────────────────────────────────────────────╜
 ..............................................................
 ╓────────────────────────────────────────────────────────────╖
 ║ #22=34 DUD.empty - Рестарт не используется                 ║
 ║        DUD.mkdir                                           ║
 ╙────────────────────────────────────────────────────────────╜

   Старый  рестарт  DUD.mkdir  -
создание  директории.  В   более
поздних версиях IS-DOS был  уда-
лен за ненадобностью.

 ..............................................................
 ╓────────────────────────────────────────────────────────────╖
 ║ #24=36 DUD.erfil - Удаление файла по имени                 ║
 ╙────────────────────────────────────────────────────────────╜

   Для удаления какого-либо фай-
ла необходимо указать  его  имя.
Адрес описателя имени файла дол-
жен находиться  в  регистре  HL.
Имя файла  должно  быть  указано
точно, без  глобальных  символов
"*" и "?". Сразу за именем  фай-
ла должно быть указано  расшире-
ния. Например, файл unicolor.com
должен иметь описатель:  "unico-
lorcom" (без разделяющей точки!)
   Если  указано  имя  файла,  а
файл не существует, то при вызо-
ве erfil ошибки не будет.

 ..............................................................
 ╓────────────────────────────────────────────────────────────╖
 ║ #3A=58 DUD.empty - Рестарт не используется                 ║
 ║        DUD.paste                                           ║
 ╙────────────────────────────────────────────────────────────╜

   Старый рестарт  DUD.paste.  В
более поздних версиях IS-DOS был
удален за ненадобностью.

 ..............................................................
 ╓────────────────────────────────────────────────────────────╖
 ║ #60=96 WIND.empty - Не используется                        ║
 ╙────────────────────────────────────────────────────────────╜

 ╓────────────────────────────────────────────────────────────╖
 ║ #61=97 WIND.wt - Вывод окна                                ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт используется для  вы-
вода окна. Для задания  конфигу-
рации окна используется  регистр
A и вектор окна, на адрес  кото-
рого  указывает  индексный   ре-
гистр IX.


           Содержимое регистра A (для вывода окна):
             (при этих значениях окно очищается)

A=0        #00        окно с одинарной рамкой
A=1        #01        окно без рамки
A=2        #02        окно с двойной рамкой
A=3..127   #03..#7F   окно без рамки

   При  использовании  следующих
значений  окно  не  очищается, а
только подкрашивается и рисуется
рамка. Следует учесть, что  рам-
ка рисуется  линиями  (вероятно,
с  использованием   подпрограммы
PLOT в ПЗУ Спектрума). При любом
значении регистра A рамка  будет
наложена на  изображение, причем
место под рамкой очищено не  бу-
дет. Демонстрирующий пример  по-
казывает такой  эффект.  Следует
отметить, что этот рестарт  мож-
но эффективно использовать, если
необходимо одновременно  подкра-
сить или перекрасить  существую-
щее окно  и  заменить  одинарную
рамку на двойную, а также  окай-
мить  окно  рамкой вместе с под-
краской или сменой цветов.

                    Содержимое регистра A:
                 (окно только подкрашивается)

A=128      #80        окно с одинарной рамкой
A=129      #81        окно без рамки
A=130      #82        окно с двойной рамкой
A=131..255 #83..#FF   окно без рамки

                        Вектор окна

смещение   имя    длина   комментарии

   0     X_COOR     1     координата X для распечатки окна
   1     Y_COOR     1     координата Y для распечатки окна
   2     Y_SIZE     1     высота окна
   3     X_SIZE     1     ширина окна
   4     ATTR       1     атрибуты окна
   5     SHADE      1     атрибуты тени
   6     X_coor     1     координаты X для распечатки текста
   7     X_size     1     ширина окна для распечатки текста

   Все координаты  откладываются
от левого верхнего угла. X_COOR,
Y_COOR, Y_SIZE и X_SIZE отсчиты-
ваются в знакоместах 8*8  пиксе-
лей. Первые две  величины  могут
принимать значения от 0 до 31  и
от  0  до  23    соответственно.
Y_SIZE и X_SIZE не должны прини-
мать нулевых значений. X_coor  и
X_size задают расположение  тек-
ста в окне  ОТНОСИТЕЛЬНО  ГРАНИЦ
ЭКРАНА, А НЕ ТЕКУЩЕГО ОКНА!  Эти
величины отсчитываются в  знако-
местах печатаемых  символов, при
использовании обычного  драйвера
печати (42 символа в строке) па-
раметры могут  быть  выбраны  из
диапазона 0..41.

   ВНИМАНИЕ! Всегда  следите  за
тем, чтобы не выйти  за  границы
физического экрана.  Система  не
следит  за  такими  нарушениями,
и, в лучшем случае, экран  будет
выглядеть неряшливо.
   Атрибуты тени (SHADE) опреде-
ляют цвет  тени  и  ее  наличие.
Цвет тени устанавливается  стан-
дартно:

            биты                   значение
 7   6   5   4   3   2   1   0
└┬┘ └┬┘ └────┬────┘ └────┬─────┘
 │   │       │           └─────── цвет чернил
 │   │       └─────────────────── цвет бумаги
 │   └─────────────────────────── яркость
 └─────────────────────────────── 0 = наличие тени
                                  1 = отсутствие тени

 ╓───────────╖
 ║  Пример   ║
 ╙───────────╨
140.
; Программа открывает окно и распечатывает в нем текст

       LD   A,#82        ;двойная рамка без очистки, но с подкраской
       LD   C,#61        ;wt - вывод окна
       LD   IX,WIND1     ;вектор окна
       RST  #10

       LD   C,#66        ;adrwt - печать текста в окне
       LD   IX,WIND1
       RST  #10

       LD   C,#07
       RST  #10

       XOR  A
       LD   A,#F4
       RET

WIND1  DEFB 1,5,8,10,71,4,2,8
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize

       DEFM "Ну и что?"
       DEFB 13
       DEFM "So what?"
       DEFB 13,32

   Если при запуске этого  файла
экран будет содержать  какое-ли-
бо изображение, то окно наложит-
ся на содержимое  экрана.  Место
будет очищено только под  печат-
ными символами.


 ╓────────────────────────────────────────────────────────────╖
 ║ #62=98 WIND.box - Рисование/стирание рамки                 ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт используется для про-
рисовки или удаления рамки окна.
При вызове регистровая  пара  IX
должна содержать  адрес  вектора
окна, регистр D хранит отступ по
Y от края окна, а регистр E - по
оси X. Аккумулятор  (регистр  A)
указывает на конфигурацию рамки.
   Следует обратить внимание  на
то,  что  рестарт  рисует  рамку
одинарными  линиями.  Для  того,
чтобы окаймить окно двойными ли-
ниями, следует вызывать  рестарт
два раза либо использовать вызов
wt (#61).
   При вызове в аккумуляторе мо-
гут быть включены следующие  би-
ты:

            биты                  значение
 7   6   5   4   3   2   1   0
└┬┘ └────┬────┘ └┬┘ └┬┘ └┬┘ └┬┘
 │       │       │   │   │   └─── левая  ┐ если 1 - сторона
 │       │       │   │   └─────── правая │ рисуется/удаляется
 │       │       │   └─────────── верхняя│ если 0 -
 │       │       └─────────────── нижняя ┘ игнорируется
 │       └─────────────────────── не используются
 └─────────────────────────────── 0 = рисовать
                                  1 = стирать

   Регистры D и E  содержат  от-
ступы в пикселах от границ  окна
к центру. Обратите внимание, что
отступы слева и  справа  опреде-
ляются регистром E по  модулю  8
(сверху и снизу - регистром  D),
иными словами, отступ  определя-
ется тремя младшими битами реги-
стров (и, фактически, может при-
нимать значения от 0 до 7). Вто-
рой пример показывает  эту  осо-
бенность.

                        Вектор окна

смещение   имя    длина   комментарии

   0     X_COOR     1     координата X для распечатки окна
   1     Y_COOR     1     координата Y для распечатки окна
   2     Y_SIZE     1     высота окна
   3     X_SIZE     1     ширина окна
   4     ATTR       1     атрибуты окна
   5     SHADE      1     атрибуты тени
   6     X_coor     1     координаты X для распечатки текста
   7     X_size     1     ширина окна для распечатки текста

 ╓───────────╖
 ║   Пример  ║
 ╙───────────╨

; Программа открывает окно без рамки, распечатывает в нем текст,
; а затем ожидает нажатия клавиши. После нажатия рисуется
; одинарная рамка и опять происходит ожидание. Затем боковые
; стороны рамки удаляются и программа ждет нажатия клавиши
; для выхода в оболочку.
140.
       LD   A,#01   ;без рамки, с очисткой
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   C,#66   ;adrwt - печать текста
       LD   IX,WIND1
       RST  #10

       LD   C,#07   ;ttyin - ожидание клавиши
       RST  #10

       LD   IX,WIND1
       LD   DE,#0001     ;отступы в пикселах
       LD   A,%00011111
       LD   C,#62   ;box - обрамление
       RST  #10

       LD   C,#07   ;ttyin - ожидание клавиши
       RST  #10

       LD   IX,WIND1
       LD   DE,#0101     ;отступы в пикселах
       LD   A,%10000011
       LD   C,#62   ;box - стирание боковых сторон
       RST  #10

       LD   C,#07   ;ttyin - ожидание
       RST  #10

       XOR  A
       LD   A,#F4   ;выход в SHELL
       RET

WIND1  DEFB 0,18,5,19,71,4,1,25
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize

       DEFM "     Привет, люди!!"
       DEFB 13
       DEFM "You can't put your arms"
       DEFB 13
       DEFM "    around a memory"
       DEFB 13,3

 ╓─────────╖
 ║  Пример ║
 ╙─────────╨

; Открывается окно без рамки на весь экран. Окно не очищается.
; Ожидается нажатие клавиши.
; (1) Рисуется рамка.
;     Увеличивается отступы от края на единицу.
;     Ожидается нажатие клавиши.
;     Выполняется с пункта (1) еще девять раз.
; Точно таким же образом все стирается.
; Происходит выход в оболочку.

       LD   A,#01   ;без рамки
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   C,#07   ;ttyin - ожидание клавиши
       RST  #10

       LD   B,10
LOOP   LD   IX,WIND1
       LD   D,B
       LD   E,B     ;отступы в пикселах
       LD   A,%00001111  ;рисуем со всех сторон
       LD   C,#62   ;box
       RST  #10

       LD   C,#07   ;ttyin - ожидание
       RST  #10
       DJNZ LOOP

       LD   B,10
LOOP1  LD   IX,WIND1
       LD   D,B
       LD   E,B     ;отступы в пикселах
       LD   A,%10001111  ;удаляем со всех сторон
       LD   C,#62   ;box
       RST  #10

       LD   C,#07   ;ttyin - ожидание
       RST  #10
       DJNZ LOOP1

       XOR  A
       LD   A,#F4   ;выход в SHELL
       RET

WIND1  DEFB 0,0,24,32,71,128,1,25
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize
2

 ╓────────────────────────────────────────────────────────────╖
 ║ #63=99 WIND.awt - Подкраска строки в окне вместе с рамкой  ║
 ╙────────────────────────────────────────────────────────────╜

   Данный  рестарт  удобен   для
создания меню выбора, что и  де-
лает IS-DOS (см. рестарт  SHELL.
menu #91=145).
   При вызове регистр IX  должен
содержать  адрес  вектора  окна,
регистр B - цвет, а  аккумулятор
- строку, которую нужно  подсве-
тить. Номер строки  отсчитывает-
ся от верхней границы окна. Если
в аккумуляторе указана строка  с
номером 0, то  будет  подсвечена
верхняя строка, содержащая  рам-
ку. Следует  обратить  внимание,
что номер строки может быть  от-
рицательным.   Если   необходимо
подкрасить  строку  над   окном,
следует  загрузить  в  аккумуля-
тор число -1 (255).  Разумеется,
строка будет иметь  размер, рав-
ный длине окна.
   При выходе за  границы  физи-
ческого экрана ничего не  проис-
ходит, вызов игнорируется. Номе-
ром строки для системы  является
остаток деления содержимого  ак-
кумулятора на 32, другими слова-
ми значения k и k+32*n для  это-
го рестарта  эквивалентны  (n  -
целое число, 0 <= k <= 31).

 ╓──────────╖
 ║  Пример  ║
 ╙──────────╨

; Программа открывает окно и подкрашивает вторую строку.
140.
       LD   A,0     ;одинарная рамка
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   C,#66   ;adrwt - печать текста
       LD   IX,WIND1
       RST  #10

       LD   C,#63   ;awt - подкраска строки
       LD   A,2     ;номер 2
       LD   B,15    ;белым по синему
       RST  #10

       LD   C,#07   ;ttyin - ждать нажатие клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET

WIND1  DEFB 0,0,6,9,71,4,2,8
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize

       DEFM "Строка 1"
       DEFB 13
       DEFM "Строка 2"
       DEFB 13
       DEFM "Строка 3"
       DEFB 13
       DEFM "Строка 4"
       DEFB 13,3
2

 ╓────────────────────────────────────────────────────────────╖
 ║ #64=100 WIND.awtc - Подкраска строки в окне без рамки      ║
 ╙────────────────────────────────────────────────────────────╜

   Этот рестарт практически  ни-
чем не отличается от  предыдуще-
го с той лишь разницей, что под-
крашивается строка окна не вклю-
чая границы.
   Если размеры окна по горизон-
тали меньше трех, то при  вызове
рестарта могут  быть  неприятные
последствия.  При  благоприятном
стечении  обстоятельств  и   при
особенном расположении звезд эк-
ран будет выглядеть  уродливо, а
в общем случае можно и  повесить
систему - надо будет  перезагру-
жаться. Следующий пример  демон-
стрирует это.

 ╓───────────╖
 ║   Пример  ║
 ╙───────────╨

; Программа открывает окно и подкрашивает вторую строку.
140.
       LD   A,0     ;одинарная рамка
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   C,#64   ;awtc - подкраска
       LD   A,2     ;второй строки
       LD   B,15
       RST  #10

       LD   C,#07   ;ttyin - ожидание
       RST  #10

       XOR  A
       LD   A,#F4
       RET

WIND1  DEFB 0,0,5,2,71,4,2,8 ;размер по горизонтали - два
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize
2

 ╓────────────────────────────────────────────────────────────╖
 ║ #65=101 WIND.lwt - Распечатка данного количества строк в   ║
 ║                    окне                                    ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт удобен для  печати  в
окне  текста, т.к.  при  задании
корректных   параметров    текст
всегда выдается  в  ограниченной
области, выйти за которую  текст
не может.
   Для вызова  рестарта  регистр
IX должен содержать  адрес  век-
тора окна, аккумулятор  -  номер
строки окна, с которой будет пе-
чататься текст, регистр  B - ко-
личество  строк,  которые  будут
выведены на экран.  Текст  может
содержать любые символы, в  кон-
це каждой строки  должен  стоять
символ CR  (chr(13)).  Если  при
печати  встретится  символ   EOF
(chr(3)), то  дальнейшая  печать
прекращается, происходит возврат
в основную программу.

                        Вектор окна
                                                       размеры
смещение  имя  длина комментарии                      в пикселах

   0    X_COOR   1   координата X для распечатки окна   (8*8)
   1    Y_COOR   1   координата Y для распечатки окна   (8*8)
   2    Y_SIZE   1   высота окна                        (8*8)
   3    X_SIZE   1   ширина окна                        (8*8)
   4    ATTR     1   атрибуты окна
   5    SHADE    1   атрибуты тени
   6    X_coor   1   координаты X для распечатки текста (8*6)
   7    X_size   1   ширина окна для распечатки текста  (8*6)

   Здесь, как и  в  двух  преды-
дущих  рестартах, значения  k  и
k+32*n для этого рестарта  экви-
валентны (n - целое число, 0  <=
k <= 31), аккумулятор может при-
нимать отрицательные значения  с
той лишь разницей, что выход  за
пределы физического экрана  опа-
сен - система может повиснуть.
   Печать  производится  следую-
щим образом:  очищается  прямоу-
гольник с шириной X_size и высо-
той, содержащейся в регистре  B,
левый верхний угол имеет коорди-
наты (X_coor; Y_COOR +  содержи-
мое аккумулятора).  (Длины  сто-
рон прямоугольника - в знакомес-
тах). Затем происходит печать со
строки Y_COOR + содержимое акку-
мулятора. Если длина  печатаемой
строки окажется  больше  X_size,
то произойдет автоматический пе-
ренос строки. В окне  будет  на-
печатано столько  строк, сколько
содержится в регистре B, вне за-
висимости от переноса.

 ╓──────────╖
 ║  Пример  ║
 ╙──────────╨

; Распечатка трех строк в окне.
140.
       LD   A,0
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   C,#65   ;lwt - распечатка
       LD   B,3     ;трех строк
       LD   A,2     ;начиная со второй строки окна,
       LD   IX,WIND1     ;печать в окно WIND1
       LD   HL,TEXT      ;текста, содержащегося по адресу TEXT
       RST  #10

       LD   C,#07   ;ttyin - ожидание нажатия клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET

TEXT   DEFM "1. Один"
       DEFB 13
       DEFM "2. Два"
       DEFB 13
       DEFM "3. Три"
       DEFB 13
       DEFM "4. Четыре"
       DEFB 13

WIND1  DEFB 1,10,6,8,71,4,2,9
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize
2

 ╓────────────────────────────────────────────────────────────╖
 ║ #66=102 WIND.adrwt - Печать текста в окне                  ║
 ║                      текст - после вектора окна            ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт  используется   очень
часто, если необходимо много раз
высвечивать окно с одним  и  тем
же текстом.
   При вызове рестарта необходи-
мо определить всего один регистр
IX, который должен содержать ад-
рес вектора окна. Сразу же  пос-
ле вектора окна следует располо-
жить текст сообщения. Текст  бу-
дет распечатываться до тех  пор,
пока не  встретится  символ  EOF
(chr(3)).  Печать  может    быть
прервана также в том случае, ес-
ли будет достигнута нижняя  гра-
ница окна.

 ╓───────────╖
 ║  Пример   ║
 ╙───────────╨

; Пример взят из программы mkdir.com
; Распечатка текста в окне.
140.
       LD   A,2     ;двойная рамка
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   C,#66   ;adrwt - распечатка текста
       RST  #10

       LD   C,#07   ;ttyin - ожидание нажатия клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET

WIND1  DEFB 17,8,5,11,56,1,25,10
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize

       DEFM "  Create"
       DEFB 13
       DEFM "Directory:"
       DEFB 3
2

 ╓────────────────────────────────────────────────────────────╖
 ║ #67=103 WIND.lenwt - Печать текста в окне                  ║
 ║                      текст - в регистре HL                 ║
 ╙────────────────────────────────────────────────────────────╜

   Отличие Lenwt (#67) от  adrwt
(#66) заключается в том, что ад-
рес начала текста  содержится  в
регистре HL.

 ╓────────────╖
 ║   Пример   ║
 ╙────────────╨

; Пример взят из программы calculat.com (iS-EDIT Calculator 1993)
; Распечатывается текст в окне.
140.
       LD   IX,WIND1
       XOR  A       ;одинарная рамка
       LD   C,#61   ;wt - вывод окна
       RST  #10

       LD   HL,TEXT
       LD   C,#67   ;lenwt - распечатка текста
       RST  #10

       LD   C,#07   ;ttyin - ожидание нажатия клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET

TEXT   DEFM "Add +"
       DEFM "Sub -"
       DEFM "Mul *"
       DEFM "Div :"
       DEFM "Input"
       DEFM "Exit  !"

WIND1  DEFB 23,9,8,6,56,1,32,5
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize2


 ..............................................................
 ╓────────────────────────────────────────────────────────────╖
 ║ #69=105 WIND.empty - Рестарт не используется.              ║
 ║         WIND.iniwt                                         ║
 ╙────────────────────────────────────────────────────────────╜

   Бывший  рестарт  IND.iniwt, в
поздних версиях  IS-DOS  не  ис-
пользуется.

 ..............................................................
 ╓────────────────────────────────────────────────────────────╖
 ║ #6B=107 WIND.wtpos - Установка курсора относительно        ║
 ║                      границ окна                           ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт вызывается в тех слу-
чаях, когда  необходимо  устано-
вить курсор  в  позиции, находя-
щейся в каком-либо окне.
   При выходе из этого  рестарта
устанавливается системная  пере-
менная xypos, отвечающая за рас-
положение курсора на экране. По-
зиции k  и  k+32*n  эквивалентны
(как по оси X, так и по оси Y).
   Координата  X  должна  содер-
жаться в регистре L, а Y - в ре-
гистре  H.  Координаты  отсчиты-
ваются относительно границ окна,
а не экрана. Если H=YY, L=XX, то
позиция курсора будет установле-
на в (X_coor + XX; Y_COOR + YY).

                        Вектор окна

смещение   имя    длина   комментарии

   0     X_COOR     1     координата X для распечатки окна
   1     Y_COOR     1     координата Y для распечатки окна
   2     Y_SIZE     1     высота окна
   3     X_SIZE     1     ширина окна
   4     ATTR       1     атрибуты окна
   5     SHADE      1     атрибуты тени
   6     X_coor     1     координаты X для распечатки текста
   7     X_size     1     ширина окна для распечатки текста

   Чтобы избежать недопонимания,
специально  хочу  заметить,  что
ПОЗИЦИЯ КУРСОРА УСТАНАВЛИВАЕТСЯ,
НО САМ КУРСОР ОСТАЕТСЯ В ТОМ  ЖЕ
СОСТОЯНИИ, В КАКОМ ОН БЫЛ ДО ВЫ-
ЗОВА РЕСТАРТА. Если  курсор  был
включен до  вызова  рестарта, то
он таким и останется.
   ВНИМАНИЕ: рестарт  устанавли-
вает только переменную  xypos, а
не сам курсор. Курсор устанавли-
вает рестарт y___ (#76=118).

 ╓───────────╖
 ║  Пример   ║
 ╙───────────╨

; Открывается окно, в нем устанавливается мигающий курсор.
; После нажатие клавиши курсор гасится и происходит выход
; в оболочку.
140.
       LD   A,0     ;одинарная рамка
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   H,-1-32 ;эквивалентно -1
       LD   L,-1
       LD   C,#6B   ;wtpos - установка курсора
       RST  #10

       LD   C,#76   ;y___
       RST  #10

       LD   C,#07   ;ожидание нажатия клавиши
       RST  #10

       LD   C,#77   ;n___
       RST  #10

       XOR  A
       LD   A,#F4
       RET

WIND1  DEFB 1,10,8,14,71,4,2,17
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize2


 ╓────────────────────────────────────────────────────────────╖
 ║ #6C=108 WIND.str - Печать строки, оканчивающейся           ║
 ║                    на CR (chr 13)                          ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт используется для рас-
печатки  строки,  оканчивающейся
на символ CR (chr 13).  Процеду-
ра выполняется очень  быстро, но
не проверяет критические  ситуа-
ции. Выход за нижнюю границу эк-
рана опасен. Выход же за  правую
границу не страшен, но  при  ис-
пользовании драйвера печати 42-х
символов в строке портится внеш-
ний вид экрана, поскольку  иска-
жается 43-й  символ  (печатается
не полностью).
   Печать происходит  с  текущей
позиции xypos, для вызова  необ-
ходимо определить только регистр
HL, который должен содержать ад-
рес текста строки.

 ╓─────────╖
 ║ Пример  ║
 ╙─────────╨

; Пример взят не очень эстетичный, но он зато показывает
; особенности рестарта. Открывается окно, устанавливается
; курсор, печатается длинная строка (с выходом за границы
; экрана). Выход по нажатии клавиши.
140.
       LD   A,0
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   H,6+32  ;эквивалентно 3
       LD   L,5
       LD   C,#6B   ;wtpos - установка курсора
       RST  #10

       LD   C,#6C   ;str - печать строки
       LD   HL,TEXT
       RST  #10

       LD   C,#07   ;ttyin - ожидание нажатия клавиши
140.
       RST  #10

       XOR  A
       LD   A,#F4
       RET

TEXT   DEFM "IS-DOS - дисковая операционная система"
       DEFM " для ZX-Spectrum"
       DEFB 13

WIND1  DEFB 1,10,8,14,71,4,2,17
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize
2

 ╓────────────────────────────────────────────────────────────╖
 ║ #6D=109 WIND.lnstr - Печать строки определенной длины      ║
 ║                                                            ║
 ╙────────────────────────────────────────────────────────────╜

   При  вызове  этого   рестарта
распечатывается  заданное  коли-
чество символов строки. Процеду-
ра не проверяет выход за  грани-
цы экрана. Выход за нижнюю  гра-
ницу нежелателен, при выходе  за
левую границу  искажается  самый
правый 43-й символ.
   Печать происходит  с  текущей
позиции xypos.  При  вызове  ре-
гистр HL содержит  адрес  текста
строки, а регистр B  -  количес-
тво символов, которые нужно рас-
печатать. При распечатке  систе-
ме безразлично, какой символ пе-
чатается. Встречается ли  символ
CR (chr 13) или символ EOF  (chr
3) - все равно они  будут  пред-
ставлены как символы, а  не  уп-
равляющие  коды.  Отсюда   можно
сделать только  один  вывод:  не
используйте  при  вызове   этого
рестарта строки с символами (chr
0..chr 31).

 ╓────────╖
 ║ Пример ║
 ╙────────╨
140.
; Программа открывает окно, устанавливает курсор и печатает
; "IS-DOS" - первые шесть символов строки.

       LD   A,0
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   H,1
       LD   L,5
       LD   C,#6B   ;wtpos - установка курсора
       RST  #10

       LD   B,6
       LD   C,#6D   ;lnstr - печать сроки длиной B=6 символов
       LD   HL,TEXT
       RST  #10

       LD   C,#07   ;ttyin - ожидание нажатия клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET

TEXT   DEFM "IS-DOS - дисковая операционная система"
       DEFM " для ZX-Spectrum"
       DEFB 13

WIND1  DEFB 1,10,8,14,71,4,2,17
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize
2

╓────────────────────────────────────────────────────────────╖
║ #6E=110 WIND.smbgt - Строковый мобильный редактор          ║
╙────────────────────────────────────────────────────────────╜

   Этот рестарт часто  использу-
ется в тех случаях, когда  нужно
бывает ввести в  программу  дан-
ные с клавиатуры. Основным удоб-
ством  редактора  является   его
подвижность (мобильность).  Вво-
дить данные можно в любом  месте
экрана.
   При входе в редактор распеча-
тывается содержимое  буфера, ад-
рес которого содержится в регис-
тре HL. Аккумулятор содержит ши-
рину окна вводимой области  (X).
Биты 0..4  регистра  B  содержат
значение высоты окна ввода  (Y).
При выходе окна ввода за  грани-
цы экрана может  произойти  сбой
системы. Содержимое буфера зани-
мает полностью все  окно  ввода,
таким образом, необходимо  выде-
лить для буфера ввода X*Y  байт.
Регистр  B  выполняет  еще  одну
роль -  он  определяет  первона-
чальную позицию курсора  в  окне
ввода информации. Назначение би-
тов регистра B показано на  сле-
дующей схеме.

7 6 5 4 3 2 1 0  -  биты регистра B
└┬┘ │ └───┬───┘
 │  │     └──────── высота окна
 │  │
 │  └─ 0: режим "overtype" - печать одних символов поверх других
 │     1: режим "ME" - очистка буфера при попытке ввести коррек-
 │        тивы
 │     00: на конец строки (последний пробел)
 │     01: на начало буфера
 └──── 10: курсор позиционируется на первом пробеле с начала
       11: на начало буфера

   Если пятый бит установлен в 1
(включен), то биты  6 и  7 игно-
рируются, курсор устанавливается
на начало буфера.  Курсор  можно
передвигать  клавишами  "вверх",
"вниз", "вправо" и  "влево", при
вводе какого-либо символа содер-
жимое буфера  слева  от  курсора
очищается и добавляется  введен-
ный символ.

   Если пятый бит сброшен (уста-
новлен в 0), а шестой бит  вклю-
чен, то  курсор  позиционируется
на начало буфера.
   Расположение левого  верхнего
угла окна ввода определяется те-
кущим значением системной  пере-
менной xypos, содержащей коорди-
наты курсора. Перед вызовом рес-
тарта  необходимо  инициализиро-
вать положение курсора (см. при-
мер).
   Регистр E содержит байт  сос-
тояния  клавиатуры,  формат  его
такой:

7 6 5 4 3 2 1 0  -  биты регистра E
└──┬──┘ │ │ │ │
   │    │ │ │ └─── 0: строчные   1: прописные
   │    │ │ └───── 0: латиница   1: кириллица
   │    │ └─────── 0: текст      1: псевдографика
   │    └───────── 0: 1:
   └────────────── не используются

   Регистр  D  является   маской
переключения регистра  клавиату-
ры, назначение битов  аналогично
регистру E. Если при вводе  пре-
дусматривается  смена  регистра,
то соответствующие биты  необхо-
димо установить в 1. В  нижепри-
веденном примере происходит сме-
на имени файла (не директории) -
поэтому  переключение   регистра
строчные/прописные  не  происхо-
дит.
   Если при выходе из  редактора
флаг Carry включен, то  произош-
ла ошибка (например, отсутствует
драйвер печати). Если флаг Carry
выключен, то возможны  два  слу-
чая:  флаг  Zero  включен - была
нажата клавиша  ENTER, аккумуля-
тор содержит  длину  строки  без
символа CR (chr 13);  флаг  Zero
сброшен -  были  нажаты  клавиши
SS/CS, CS/9, SS/A, SS/ENTER  или
SS/SPACE,  аккумулятор  содержит
код клавиши (с #0E по #12  соот-
ветственно).

 ╓───────────╖
 ║   Пример  ║
 ╙───────────╨

; Взят из программы renam.com. В окне печатается исходное имя
; файла, в отдельном окне происходит редактирование имени файла.
140.
       LD   IX,WIND1  ;окно 1
       LD   C,#61     ;wt - вывод окна
       LD   A,#02     ;двойная рамка
       RST  #10
       LD   IX,WIND2  ;окно 2
       LD   A,#02     ;двойная рамка
       RST  #10       ;вывод окна - регистр C не изменен

       LD   IX,WIND1  ;печать в окне 2
       LD   HL,TEXT   ;текста "RENAME"
       LD   C,#65     ;lwt -
       LD   B,#01     ;распечатать 1 строку
       LD   A,#01     ;с 1 строки окна
       RST  #10

       LD   IX,WIND1
       LD   HL,#0302  ;X = 2, Y = 3 (в окне 1)
       LD   C,#6B     ;wtpos - установка позиции курсора
       RST  #10

       LD   HL,FILE1  ;печать строки - старого имени файла
       LD   C,#6D     ;lnstr
       LD   B,#0C     3;12 символов
       RST  #10

       LD   IX,WIND1  ;установка позиции курсора (2, 6)
       LD   HL,#0602  ;(необходимо для указания координат
       LD   C,#6B     ;окна редактирования)
       RST  #10

       LD   HL,FILE1  ;содержимое буфера - имя файла
       LD   A,12      ;длина буфера
       LD   B,%10000000 +1   ;Высота буфера: одна строка.
                      ;Позиционирование на первый пробел с начала.
                      ;Режим "overtype".
       LD   DE,#0200  ;можно менять только алфавит,
                      ;регистр (верхний/нижний) - нельзя
       LD   C,#6E     ;smbgt
       RST  #10

       JR   NZ,EXIT   ;NZ - выход без изменения имени

;
;здесь подпрограмма записи нового имени в каталог
;

EXIT   XOR  A
       LD   A,#F4
       RET

WIND1  DEFB 9,8,9,14,40,255,13,14
WIND2  DEFB 10,13,3,12,79,255,17,14

TEXT   DEFM "      RENAME"
       DEFB 13

FILE1  DEFM "unicolor com" ;пример имени
2

 ╓────────────────────────────────────────────────────────────╖
 ║ #6F=111 WIND.empty - Не используется                       ║
 ║         WIND.beep                                          ║
 ╙────────────────────────────────────────────────────────────╜

   Старый  рестарт  WIND.beep  -
звуковой  сигнал, в  новых  вер-
сиях системы не используется.


 ╓────────────────────────────────────────────────────────────╖
 ║ #70=112 WIND.scrol - Скроллинг                             ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт  используется  в  тех
случаях, когда возникает необхо-
димость в вертикальном скроллин-
ге.
   Для нормальной работы  проце-
дуры скроллинга необходимо  сна-
чала настроить ее. Во время нас-
тройки IS-DOS запоминает в своих
внутренних ячейках параметры ок-
на, для которого будет  произво-
диться скроллинг. Настроив  про-
цедуру на одно  окно  один  раз,
впоследствии можно много раз вы-
зывать   процедуру   скроллинга,
практически не передавая  проце-
дуре  никаких  параметров.  Это,
конечно же, было  сделано, чтобы
обеспечить быстродействие и  ма-
лый объем процедуре скроллинга.
   Настройка скроллинга произво-
дится в  случае, если  аккумуля-
тор содержит 0.  В  регистре  IX
должен содержаться адрес  расши-
ренного вектора окна, регистр  H
хранит  биты  заполнения  правой
границы окна, а регистр L -  ле-
вой  границы.  Когда  происходит
скроллинг, то сдвигается ВСЕ ок-
но, ВКЛЮЧАЯ боковые границы, со-
держащие рамку. Регистр  HL  со-
держит  битовую  карту,  которая
содержит информацию  о  том, чем
будут заполняться  боковые  гра-
ницы.  Для  двойной  рамки  L  =
%10100000, H = %00000101.
   Для одинарной рамки  рекомен-
дуется  в  регистр  HL  записать
значение #0180, для двойной рам-
ки - #05A0, а для окон без  рам-
ки  регистр  должен    содержать
#0000.
   Процедура  скроллинга  содер-
жит небольшую недоработку, кото-
рая не  была  исправлена  в  по-
следующих версиях  IS-DOS, чтобы
сохранить  совместимость   снизу
вверх.  Недоработка  состоит   в
том, что вектор  окна  обрабаты-
вается  процедурой  некорректно.
При скроллинге этого окна  сдви-
нута  будет  область, обозначен-
ная стрелками.

   ╔════════════════════════╗
   ║   Give me something    ║
   ║     for the pain       ║
   ║                        ║
   ╚════════════════════════╝

   Будут сдвинуты эти столбцы (а
должны быть сдвинуты еще и  гра-
ницы)

   А после  скроллинга  на  одну
строку вверх (регистр HL  содер-
жит #05A0) окно будет  выглядеть
так:

   ╔════════════════════════╗
   ║     for the pain       ║
   ║                        ║
   ║║                      ║║
   ╚════════════════════════╝
    ^                      ^
    └── "Лишние" границы ──┘

   Процедура как бы сузила  окно
слева и справа на один  столбец.
Для нормальной работы при  вызо-
ве  программы  следует  вставить
следующие  команды:  (см.  также
пример)

       DEC  (IX)   ;X_COOR
       INC  (IX+3) ;X_SIZE
       INC  (IX+3) ;X_SIZE

   Данная     последовательность
расширяет окно на  одну  позицию
вправо  и  влево.  Для  возврата
вектора окна в исходное  состоя-
ние необходимо выполнить следую-
щие команды:

       INC  (IX)   ;X_COOR
       DEC  (IX+3) ;X_SIZE
       DEC  (IX+3) ;X_SIZE

                  Расширенный вектор окна

смещение   имя    длина   комментарии

  -2     S_DLAY     1     пауза
  -1     S_STEP     1     дискретность скроллинга
   0     X_COOR     1     координата X для распечатки окна
   1     Y_COOR     1     координата Y для распечатки окна
   2     Y_SIZE     1     высота окна


   3     X_SIZE     1     ширина окна
   4     ATTR       1     атрибуты окна
   5     SHADE      1     атрибуты тени
   6     X_coor     1     координаты X для распечатки текста
   7     X_size     1     ширина окна для распечатки текста

(Названия S_DLAY <Scroll  Delay>
и  S_STEP  <Scroll  Step>   даны
мной, поскольку  я  не  встречал
обозначения этих  величин  ни  в
одном из известных  мне  изданий
по IS-DOS).

   S_STEP содержит значение  ша-
га для  скроллинга  в  пикселах,
рекомендуются значения 1, 2, 4 и
8. Не  используйте  значение  0,
так как в  этом  случае  система
зависнет. Не  рекомендуется  ис-
пользовать другие  значения, хо-
тя система не зависнет, но полу-
ченный эффект  будет  неэстетич-
ным - слишком  большая  дискрет-
ность, скроллинг будет грубым.

   S_DLAY  -  это  пауза   между
двумя  промежуточными   сдвигами
изображения с заданной  дискрет-
ностью. Значение 0 означает, что
паузы не произойдет вообще. Диа-
пазон значений: 0..255.
   После инициализации можно вы-
зывать процедуру  скроллинга, не
загружая специально  в  регистры
HL и IX значения шаблона  запол-
нения границ и расширенного век-
тора окна  соответственно.  Важ-
но лишь  содержимое  аккумулято-
ра, который  задает  направление
скроллинга. ВНИМАНИЕ!  В  скрол-
линге принимают участие  атрибу-
ты!  Если  A = 1, то  произойдет
скроллинг на одну строку  вверх,
атрибуты окна сместятся на  одну
строку вверх, а атрибуты  нижней
строки  НЕ  ИЗМЕНЯТСЯ.    Нижняя
строка будет очищена.  Если  A =
2, то на одну строку вниз  будут
сдвинуты атрибуты и изображение,
верхняя  строка  будет  очищена.
Атрибуты верхней строки не изме-
нятся.

 ╓────────────╖
 ║   Пример   ║
 ╙────────────╨
140.
       LD   A,2
       LD   C,#61   ;wt - вывод окна
       LD   IX,WIND1
       RST  #10

       LD   C,#66   ;adrwt - печать текста в окне
       RST  #10

       LD   A,0     ;A = 0 - настройка
       DEC  (IX)    ;═╕
       INC  (IX+3)  ; │ "раздвигание окна"
       INC  (IX+3)  ;═╛
       LD   HL,#05A0 ;битовая карта
       LD   C,#70   ;scrol - скроллинг
       RST  #10

       INC  (IX)
       DEC  (IX+3)
       DEC  (IX+3)
       LD   B,24    3;повторить 24 раза
LOOP   LD   A,2     ;скроллинг вниз
       LD   C,#70   ;scrol - скроллинг
       RST  #10
       DJNZ LOOP

       LD   C,#07  ;ttyin - ожидание нажатия клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET

       DEFB 20,1  ;S_DLAY, S_STEP
WIND1  DEFB 1,0,24,16,71,255,3,18
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize

       DEFM "Give me something"
       DEFB 13
       DEFM "  for the pain"
       DEFB 13,32


 ..............................................................
 ╓────────────────────────────────────────────────────────────╖
 ║ #72=114 WIND.g_scr - Возврат вектора третьего уровня "WIND"║
 ╙────────────────────────────────────────────────────────────╜

   После выхода  из  рестарта  в
регистре HL' возвращается  адрес
вектора третьего уровня:

сме- имя  длина  комментарии
щение

-2          2  адрес таблицы функций пользователя для panel(#6A)
 0  PAPER   1  атрибуты экрана
 1  BORD    1  атрибуты бордюра
 2          9  зарезервированы
11  SMDRV   1  логический номер драйвера клавиатуры
12  SMKCS * 1  байт состояния драйвера клавиатуры (K_CSR)
13  SMMCS * 1  маска разрешения смены битов (M_CSR)
14  SMXS  * 1  ╒═ координаты левого верхнего угла редактируемой
15  SMYS  * 1  ╘═ строки на экране в знакоместах
16  SMLN  * 1  длина редактируемой области экрана
17  SMHT  * 1  высота редактируемой области экрана
18  SMCSR   1  регистр состояния строкового редактора.
               Биты 0/1:
           * 6 - s_e - smbgt/edstr - режим работы (0)
             1 - c_i - change/insert

19  SMDBF * 2  адрес строки
21  SMXC  * 1  текущая координата X курсора в тексте
22  SMXMX * 1  максимальная длина строки-2
23  SMLM  * 1  левая логическая граница    (0)
24  SMRM    1  правая логическая граница
25  SMXO  * 1  число пропускаемых символов (0)
26  SMSZ    1  ширина поля требования скроллинга
27  SMCOD   1  код, возвращаемый редактором
28  SMLNS   1  длина строки с кодом CR (chr 13)
29  SMCOM   1  команда, кoторую должен выполнить редактор при
               входе
30  SMTYP   2  адрес подпрограммы отображения текущего состояния
               (если 0, то не вызывается)

   Значения  всех  границ  могут
изменяться в пределах  от  0  до
253.
   *  Все  параметры, отмеченные
звездочками, smbgt инициализиру-
ет сам.

 ╓──────────╖
 ║  Пример  ║
 ╙──────────╨
140.
       LD   C,#72   ;g_scr - возврат адреса 3-го уровня
       RST  #10
       EXX          ;помещаем HL' в IX
       PUSH HL
       POP  IX
       EXX
       LD   (IX+0),%00001111  ;PAPER  = белый по синему
       LD   (IX+1),%00000010  ;BORDER = красный

       LD   A,0     ;очистка экрана цветом PAPER и BORDER
       LD   C,#73   ;cls
       RST  #10

       LD   C,#07   ;ttyin - ожидание нажатия клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET2


 ╓────────────────────────────────────────────────────────────╖
 ║ #73=115 WIND.cls - Очистка/подкраска экрана                ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт   используется    для
очистки экрана или его  подкрас-
ки  (заливки  атрибутами).  Если
регистр A = 0, то изображение на
экране стирается, затем происхо-
дит подкраска атрибутами  PAPER,
бордюр окрашивается цветом  BOR-
DER. Значения PAPER и BORDER бе-
рутся  из  вектора  уровня  WIND
(см. предыдущий рестарт).
   Если аккумулятор не равен ну-
лю, то экран  заливается  цветом
A, причем очистка изображения не
происходит. Цвет бордюра остает-
ся неизменным.

 ╓─────────────╖
 ║   Пример    ║
 ╙─────────────╨
140.
       LD   C,#72   ;g_scr - возврат адреса 3-го уровня
       RST  #10
       EXX          ;помещаем HL' в IX
       PUSH HL
       POP  IX
       EXX
       LD   (IX+0),%00001111  ;PAPER  = белый по синему
       LD   (IX+1),%00000010  ;BORDER = красный

       LD   A,0     ;очистка экрана цветом PAPER и BORDER
       LD   C,#73   ;cls
       RST  #10

       LD   C,#07   ;ttyin - ожидание нажатия клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET2


 ╓────────────────────────────────────────────────────────────╖
 ║ #74=116 WIND.empty - Не используется                       ║
 ╙────────────────────────────────────────────────────────────╜

 ╓────────────────────────────────────────────────────────────╖
 ║ #75=117 WIND.empty - Не используется                       ║
 ╙────────────────────────────────────────────────────────────╜

 ╓────────────────────────────────────────────────────────────╖
 ║ #76=118 WIND.y___ - Включение мигающего курсора            ║
 ╙────────────────────────────────────────────────────────────╜

   Найти  применение   рестартов
управления   курсором   довольно
трудно, практически он использу-
ется крайне  редко, если  только
пользователь не станет создавать
свой текстовый редактор.  Проце-
дуры включения/выключения  выде-
лены как рестарт для простого  к
ней обращения самой системы.
   Мигание  курсора   происходит
при включенных  прерываниях, это
показывает нижеприведенный  при-
мер. После запуска программы уп-
равление будет передано в файло-
вую оболочку, причем  на  экране
будет  виден  мигающий   курсор.
Если теперь произвести какое-ни-
будь  действие  (например, прос-
мотреть любой  файл  на  диске),
при котором прерывания будут от-
ключены,  то  курсор  перестанет
мигать. Мерцание будет возобнов-
лено при включении прерываний.
   При вызове рестарта не  стоит
переживать за возможные  ошибки:
в случае, когда курсор  находит-
ся за пределами физического  эк-
рана, сбоя не происходит, курсор
на экране не включен.

 ╓────────────╖
 ║   Пример   ║
 ╙────────────╨
140.
       LD   C,#76  ;y___
       RST  #10
       LD   C,#7   ;ttyin
       RST  #10    ;здесь используется как ожидание нажатия клавиши
       XOR  A
       LD   A,#F4
       RET2

   После запуска этой  программы
на экране  останется курсор, ко-
торый может немного  раздражать.
Отключить курсор можно, загрузив
какую-нибудь программу, в  кото-
рой необходимо ввести  какой-ни-
будь текст (управление  курсором
возьмет на себя  эта  программа,
при выходе из которой курсор бу-
дет отключен).  Загрузите  мони-
тор командной строки  и  выйдите
из него!


 ╓────────────────────────────────────────────────────────────╖
 ║ #77=119 WIND.n___ - Выключение мигающего курсора           ║
 ╙────────────────────────────────────────────────────────────╜

   Если предыдущий рестарт вклю-
чает курсор, то этот делает  как
раз обратное. При включении кур-
сора содержимое экрана под  кур-
сором запоминается в  специально
отведенном буфере. При  отключе-
нии  курсора  содержимое  буфера
восстанавливается.  Таким  обра-
зом, после гашения  курсора  со-
держимое экрана будет  представ-
лено в первоначальном виде.

 ╓─────────────╖
 ║   Пример    ║
 ╙─────────────╨
140.
       LD   C,#76 ;y____
       RST  #10
       LD   C,#7  ;ttyin
       RST  #10
       LD   C,#77 ;n____
       RST  #10
       LD   C,#7  ;ttyin
       RST  #10
       XOR  A
       LD   A,#F4
       RET2


 ╓────────────────────────────────────────────────────────────╖
 ║ #78=120 WIND.empty - Рестарт не используется.              ║
 ║         WIND.cr^on                                         ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт  не  используется.  В
ранних версиях  IS-DOS, по-види-
мому, использовался для  включе-
ния курсора.


 ╓────────────────────────────────────────────────────────────╖
 ║ #78=120 WIND.empty - Рестарт не используется.              ║
 ║         WIND.cr^of                                         ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт не используется.  Ра-
нее, вероятно, использовался для
выключения курсора.

 ..............................................................
 ╓────────────────────────────────────────────────────────────╖
 ║ #7A=122 WIND.empty - Рестарт не используется               ║
 ╙────────────────────────────────────────────────────────────╜

 ╓────────────────────────────────────────────────────────────╖
 ║ #7B=123 WIND.empty - Рестарт не используется               ║
 ╙────────────────────────────────────────────────────────────╜

 ╓────────────────────────────────────────────────────────────╖
 ║ #7C=124 WIND.d_a - Преобразование числа в строку           ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт используется для  вы-
вода чисел в различных  системах
счисления.
   При вызове рестарта  регистры
должны содержать следующие  зна-
чения:

HL - адрес строкового  буфера, в
     котором будет  сформировано
     число в ASCII символах
A  - длина буфера в байтах
B  - основание системы счисления
DE - двухбайтовое  число   (флаг
     Carry выключен); адрес  бу-
     фера, в котором  содержится
     четырехбайтовое число (флаг
     Carry включен)

   При выходе флаг  Carry  вклю-
чен, если  произошло  переполне-
ние буфера.
   При выборе системы  счисления
следует учесть, что  практически
бесполезно использовать  основа-
ния системы больше 16 - выдавае-
мые значения будут совсем не та-

кими, какими можно было бы пред-
положить. Бесполезно  также  ис-
пользовать  такое   экзотическое
основание системы счисления, как
1 - при любом  числе  произойдет
переполнение  буфера.  Если   же
выбрано основание 0, то  система
поймет,  что  выбрано  основание
10.

 ╓──────────╖
 ║  Пример  ║
 ╙──────────╨
140.
       LD   IX,WIND1 ;вектор окна
       XOR  A        ;A=0 - одинарная рамка
       LD   C,#61    ;wt - вывод окна
       RST  #10
       LD   HL,BUFF  ;HL - буфер для числа
       XOR  A        ;сброс флага Carry - двухбайтовое число
       LD   A,15     3;буфер на 15 байт
       LD   DE,682   ;само число
       LD   B,2      ;основание системы счисления
       LD   C,#7C    ;d_a
       RST  #10
       JR   C,ERROR  ;если флаг Carry включен, то было переполнение
                     ;немедленный выход в оболочку
       LD   C,#66    ;ADRwt - распечатка текста
       RST  #10
       LD   C,#07    ;ожидание нажатия клавиши
       RST  #10
ERROR  XOR  A
       LD   A,#F4
       RET

WIND1  DEFB 1,10,8,14,71,4,2,15
       ;xc,yc,ys,xs,attr,shade,xcoor,xsize
BUFF   DEFS 15
       DEFB 13
       DEFB 3
2

 ╓────────────────────────────────────────────────────────────╖
 ║ #7D=125 WIND.a_d - Преобразование строки в число           ║
 ╙────────────────────────────────────────────────────────────╜

   Рестарт используется для вво-
да  чисел  в различных  системах
счисления. Вводятся  четырехбай-
товые числа, таким  образом, мо-
гут быть введены значения  от  0
до 4 294 967 295. Ведущие пробе-
лы будут проигнорированы.
   При вызове рестарта  регистры
должны содержать следующие  зна-
чения:

HL - адрес строкового  буфера, в
     котором содержится число  в
     ASCII символах
A  - длина буфера в байтах
B  - основание  системы  счисле-
     ния по умолчанию

   Если регистр A равен нулю, то
размер буфера не определен, чис-
ло будет считываться до кода  CR
(chr 13).
   Не  рекомендуется   использо-
вать  основания  системы  больше
16. Основание системы  счисления
0,  эквивалентно  основанию  10.
Если основание равно  1, то  при
любом числе, кроме 0, произойдет
переполнение буфера.
   Основание  системы  счисления
можно задать  принудительно  не-
посредственно при  вводе  числа.
Перед числом в этом случае необ-
ходимо  поставить  соответствую-
щий префикс: "#", "H", "h" - для
системы счисления  с  основанием
16; ".", "d"  -  для  десятичных
значений; "o", "O" - для восьме-
ричных,  "%",  "b",  "B"  -  для
двоичных чисел.
   ВНИМАНИЕ! Латинские буквы при
вводе в шестнадцатеричной систе-
ме  должны  быть  прописными!  В
противном   случае    произойдет
ошибка - нецифровой символ.
   При  выходе  32-x   разрядное
число  содержится  в   регистрах
DE'HL'.  Число  #12345678  будет
представлено   так:   DE'=#1234,
HL'=#5678.  Регистр BC' содержит
адрес продолжения буфера.
   Если при  выходе  флаг  Carry
включен, то возможны две ошибки:
нецифровой символ или переполне-
ние, регистр A содержит тогда  0
и 1 соответственно.

 ╓────────────╖
 ║   Пример   ║
 ╙────────────╨
140.
; Этот пример является примитивной программой, печатающей дамп
; памяти. Для распечатки необходимо ввести адрес, с которого
; затем будет выведено 128 байт в шестнадцатеричном виде.
; Адрес по умолчанию вводится в шестнадцатеричной системе.
; После распечатки программа ожидает ввода нового значения
; адреса. Для выхода из программы нужно ввести неправильное
; число (нецифровой символ), либо нажать ss/A.

       XOR  A
       LD   C,#73   ;cls - очистить экран
       RST  #10
START  LD   HL,#0000
       LD   C,#0C   ;prapd - установка позиции курсора
       RST  #10

       LD   B,1        ;высота окна=1, overtype, на конец буфера
       LD   E,%00000001  ;прописные буквы
       LD   D,%00000001  ;регистром CAPS можно управлять
       LD   HL,BUFF
       LD   A,173;17 байт в буфере (можно вводить двоичные числа)
       LD   C,#6E   ;sbmbgt - мобильный редактор
       RST  #10
       JR   NZ,EXIT ;если выход по ss/A - выход в SHELL

       LD   HL,BUFF
       LD   C,#7D   ;a_d -   ASCII -> число
       LD   A,17    3;17 байт в буфере
       LD   B,16    3;16-ричная система по умолчанию
       RST  #10

       JR   C,EXIT  ;если ошибка, то выход

       EXX
       PUSH HL      3;HL' - младшие 16 байт числа
       POP  IX      ;IX - текущая ячейка
       LD   HL,#0200;курсор на позицию (2,0)

       LD   B,16    3;16 строк
LOOP   PUSH BC      ;--- (1) - уровни вложенности стека
       PUSH HL      ;--- (2)

       LD   C,#0C   ;prapd - установка курсора
       RST  #10

       LD   HL,STRING
       OR   A       3;Carry RES: DE = 16-битовое число
       LD   A,4     ;буфер - 4 байта
       LD   B,16    3;16-ричная система (по умолчанию)
       PUSH IX
       POP  DE      ;DE = IX = текущий адрес
       LD   C,#7C   ;d_a -  число -> ASCII
       RST  #10

       LD   D,0     ;DE = 00XX - текущий байт (8-битовое число)
       LD   B,8     ;8 байтов в строке
       LD   HL,STRING+4

L1     LD   E,(IX)  ;DE = текущий байт
       OR   A       3;Carry RES: DE = 16-битовое число
       LD   A,3     ;буфер = 3 байта
       PUSH BC      ;--- (3)
       LD   B,16    3;16-ричная система
       LD   C,#7C   ;d_a -  число -> ASCII
       RST  #10
       POP  BC      ;=== (3)
       INC  IX      ;следующий байт
       INC  HL
       INC  HL
       INC  HL      ;3 символа на байт
       DJNZ L1

       LD   HL,STRING
       LD   C,#6C   ;str - печать строки, оканчивающейся на CR
       RST  #10

       POP  HL      ;=== (2)
       INC  H       ;следующая строка
       POP  BC      ;=== (1)
       DJNZ LOOP

       LD   HL,BUFF ;формирование следующего адреса
       OR   A       3;Carry RES: DE = 16-битовое число
       LD   A,4     ;буфер в 4 символа
       LD   B,16    3;16-ричная система
       PUSH IX      ;
       POP  DE      ;DE = IX = текущий адрес
       LD   C,#7C   ;d_a -  число -> ASCII
       RST  #10

       LD   HL,BUFF+4
       LD   B,13    ;очистка остатка буфера
L2     LD   (HL),32
       INC  HL
       DJNZ L2
       JR   START

EXIT   XOR  A
       LD   A,#F4
       RET

BUFF   DEFM " .32768          "3; 17 пробелов - буфер ввода адреса
STRING DEFS 28 ;буфер формирования строки дампа
       DEFB 132

 ╓────────────────────────────────────────────────────────────╖
 ║ #7E=126 WIND.analys - Передача управления подпрограмме     ║
 ╙────────────────────────────────────────────────────────────╜

   Этот рестарт позволяет  гибко
вызывать подпрограммы по  номеру
в  таблице  (по  коду  команды).
Рестарт  может  эффективно   ис-
пользоваться в  базах  данных  и
программах,  требующих   наличия
сложного  интерактивного  интер-
фейса. Таблица  имеет  следующий
формат (на каждую запись по  три
байта):

1-ая запись:
  1 байт:  номер команды
  2 байта: адрес подпрограммы
2-ая запись:
  1 байт:  номер команды
  2 байта: адрес подпрограммы
...
N-ая запись:
  1 байт:  номер команды
  2 байта: адрес подпрограммы
OTHERWISE:  (обработка   случая,
  когда команды в таблице нет) 1
  байт: номер команды  =  #FF  2
  байта: адрес подпрограммы  об-
  работки OTHERWISE

   Таким образом, команда OTHER-
WISE является последней, она за-
вершает таблицу. Номера команд в
таблице могут идти не по  поряд-
ку, а вразброс. Если  в  таблице
два одинаковых  номера  команды,
то будет выполнена подпрограмма,
которая  определена  раньше,  то
есть  запись  которой  находится
ближе к началу таблицы.  Если  в
нижеприведенном примере  устано-
вить все номера подпрограмм в 2,
то будет выполнена  подпрограмма
PRINT.

   При вызове рестарта регистр A
должен содержать код подпрограм-
мы, причем A может принимать лю-
бое значение (0..#FF). В  регис-
тре  HL  следует  указать  адрес
таблицы-анализатора.

 ╓────────────╖
 ║   Пример   ║
 ╙────────────╨
140.
; Программа демонстрирует применение рестарта analys. В
; регистре A (метка REG_A) содержится код команды. Если A=1,
; то вызывается подпрограмма CLRSCR; если A=2, то вызывается
; PRINT. В любом другом случае вызывается NOTFND.

       LD   HL,#0000;координаты курсора (0,0)
       LD   C,#0C   ;prapd - установка курсора
       RST  #10

REG_A  LD   A,2     ;код команды = 2
       LD   HL,TABL ;таблица-анализатор
       LD   C,#7E   ;analys - передача управления
       RST  #10

       LD   C,#07   ;ttyin - ожидание
       RST  #10

       XOR  A
       LD   A,#F4
       RET

PRINT  LD   HL,TEXT ;адрес строки
       LD   C,#6C   ;str - печать строки
       RST  #10
       RET

CLRSCR LD   A,%00010111  ;цвет: белый по красному
       LD   C,#73   ;cls - подкраска экрана цветом
       RST  #10
       RET

NOTFND LD   HL,NOTHIN    ;текст: "Nothing"
       LD   C,#6C   ;str - печать строки
       RST  #10
       RET

TEXT   DEFM "Команда 2 - Printing this line"
       DEFB 13
NOTHIN DEFM "Nothing"
       DEFB 13
TABL   DEFB 2       ;команда 2
       DEFW PRINT
       DEFB 1       ;команда 1
       DEFW CLRSCR
       DEFB #FF     ;otherwise
       DEFW NOTFND

;dumper.com - выводит на экран дамп памяти

       XOR  A
       LD   C,#73   ;cls
       RST  #10

START  LD   HL,#0000
       LD   C,#0C   ;prapd
       RST  #10

       LD   B,%00000000+1
       LD   E,%00000001
       LD   D,%00000001
       LD   HL,BUFF
       LD   A,17
       LD   C,#6E   ;sbmbgt
       RST  #10
       JR   NZ,EXIT

       LD   HL,BUFF
       LD   C,#7D   ;a_d
       LD   A,17
       LD   B,16
       RST  #10

       JR   C,EXIT

       EXX
       PUSH HL
       POP  IX
       LD   HL,#0200

       LD   B,16
LOOP   PUSH BC
       PUSH HL

       LD   C,#0C
       RST  #10

       LD   HL,STRING
       OR   A       ;Carry RES
       LD   A,4
       LD   B,16
       PUSH IX
       POP  DE
       LD   C,#7C   ;d_a
       RST  #10

       LD   D,0
       LD   B,8
       LD   HL,STRING+4

L1     LD   E,(IX)
       OR   A       ;Carry RES
       LD   A,3
       PUSH BC
       LD   B,16
       LD   C,#7C   ;d_a
       RST  #10
       POP  BC
       INC  IX
       INC  HL
       INC  HL
       INC  HL
       DJNZ L1

       LD   HL,STRING
       LD   C,#6C
       RST  #10

       POP  HL
       INC  H
       POP  BC
       DJNZ LOOP

       LD   HL,BUFF
       OR   A       ;Carry RES
       LD   A,4
       LD   B,16
       PUSH IX
       POP  DE
       LD   C,#7C   ;d_a
       RST  #10

       LD   HL,BUFF+4
       LD   B,13
L2     LD   (HL),32
       INC  HL
       DJNZ L2
       JR   START

EXIT   XOR  A
       LD   A,#F4
       RET

BUFF   DEFM " .32768          ";3 17 пробелов
STRING DEFS 28
       DEFB 13

;chgwait.com - Перевод сообщения Please wait на русский язык

       LD   HL,#FFFF
       LD   BC,#8000
LOOP   LD   A,(HL)
       CP   "<"
       JR   Z,FIND
L1     DEC  HL
       DEC  BC
       LD   A,B
       OR   C
       JR   NZ,LOOP

EXIT   LD   C,#8B   ;mwait - печать "<..Please Wait..>"
       RST  #10

       LD   C,#07   ;ttyin - ожидание нажатия клавиши
       RST  #10

       XOR  A
       LD   A,#F4
       RET

FIND   PUSH HL
       PUSH BC
       LD   DE,PLEASE
       LD   B,17
L2     LD   A,(DE)
       CP   (HL)
       JR   NZ,NOTFND
       INC  HL
       INC  DE
       DJNZ L2

       POP  BC
       POP  DE
       LD   HL,RUS
       LD   BC,17
       LDIR
       JR   EXIT

NOTFND POP  BC
       POP  HL
       JR   L1

PLEASE DEFM "<..Please Wait..>"
RUS    DEFM "<   Подождите   >"


3; Coming from gmen.res (C) 1993, IskraSOFT corp. СПб, Россия
3; Модифицировал Сергей Астров, 1996
;
; gmen - подпрограмма назначения системного,
; быстрого и текущего устройства


ENTCUR EQU  #60
CURSOR EQU  #06
ATTR   EQU  #70
SHADE  EQU  #41

       DEFW 0,0

       XOR  A
MEM1   EQU  $+1
       LD   IX,WIND
       LD   C,#61
       RST  #10
       LD   C,#91
       RST  #10
       XOR  A
       LD   A,#F2
       RET

; подпрограмма инициализации меню
INIT   LD   C,#10
       RST  #10
       EXX
       LD   C,#41 ;= "A" латинское
       DEC  HL
       LD   A,(HL)
       ADD  A,C
MEM2   LD   (S_DEV),A
       DEC  HL
       LD   A,(HL)
       ADD  A,C
MEM3   LD   (Q_DEV),A
       DEC  HL
       LD   A,(HL)
       ADD  A,C
MEM4   LD   (T_DEV),A
       EXX
       RET

; подпрограмма обработки нажатия клавиши <ENTER>
KEYS   LD   C,#10
       RST  #10
       EXX
       LD   E,(IX-#09)   ;CURPOS
       XOR  A
       LD   D,A
       SBC  HL,DE
       PUSH HL
       LD   A,(HL)
       LD   H,(IX-#09)
       LD   L,#08
       SCF
       LD   C,#8C
       RST  #10
       POP  HL
       JR   NZ,NOPUT
       LD   (HL),A
NOPUT  LD   C,#08
       RST  #10
       XOR  A
       INC  A
       RET

       DEFB ENTCUR,0,CURSOR,1
MEM5   EQU  $-1
       DEFW INIT,0,0
MEM6   EQU  $-1
       DEFW ENTER
WIND   DEFB 21,3,5,8,ATTR,SHADE,29,9
       DEFB 1,1,1
       DEFM "System  A"
S_DEV  EQU  $-1
       DEFM "Quick   A"
Q_DEV  EQU  $-1
       DEFM "Current A"
T_DEV  EQU  $-1
MEM7   EQU  $-1
ENTER  DEFW KEYS
MEM8   EQU  $-1
       DEFW KEYS
MEM9   EQU  $-1
       DEFW KEYS

       DEFW #FFFF,MEM1,MEM2,MEM3,MEM4
       DEFW MEM5,MEM6,MEM7,MEM8,MEM9




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

TR-DOS для начинающих - Окончание.

Компьютерная новелла - Prince of Persia.

Компьютерная новелла - Лазерная бригада (по игре Laser Squad).

Перекресток драконов - Игра Rapscallion.

Перекресток драконов - Игра The Runes of Zendos.

Перекресток драконов - Игра The Saga.

Перекресток драконов - Игра Witch's Cauldron.

Перекресток драконов - Создаём Адвентюру. Обзор редакторов.

Перекресток драконов - Создаём словарь к Адвентюрной игре.

Программы, которые мы выбираем - Возможные последствия использования недокументированных команд.

Программы, которые мы выбираем - О замеченных шероховатостях в работе некоторых программ и пожелания к следующим версиям.

Программы, которые мы выбираем - Предложение ко всем авторам программ, печатающих дамп памяти. Программистам, использующим защиту дисков от копирования.

Программы, которые мы выбираем - Несколько предложений по усовершенствованию ассемблера.

Программы, которые мы выбираем - Предложения по доработке ZX Word v2.5.

Программы, которые мы выбираем - Программа "Эмулятор Спектрума" v1.2.

Программы, которые мы выбираем - Что хотелось бы иметь в идеальном ассемблере.

Ретро - 40 лучших процедур: Копирование данных в памяти.

Ретро - 40 лучших процедур: Обмен токена.

Ретро - 40 лучших процедур: Определение адреса БЕЙСИК-строки.

Ретро - 40 лучших процедур: Определение длины БЕЙСИК-программы.

Ретро - 40 лучших процедур: Определение размера свободной памяти.

Ретро - 40 лучших процедур: Поиск и замещение строки.

Ретро - 40 лучших процедур: Поиск подстроки.

Ретро - 40 лучших процедур: Поиск строки.

Ретро - 40 лучших процедур: Составление списка переменных.

Ретро - 40 лучших процедур: увеличение и копирование экрана.

Ретро - 40 лучших процедур: Удаление REM-строк.

Ретро - 40 лучших процедур: Удаление блока программы.

Советы экспертов - Игра Fredloader.

Советы экспертов - Игра Robin of Sherwood: The Touchstones of Rhianon.

Советы экспертов - Игра Scorpions: Die Machines.

Советы экспертов - Игра Terropods.

Страничка iS-DOS - Описание рестартов системы IS DOS.

Форум - Алгоритм распознавания символов.

Форум - Время выполнения недокументированных команд процессора Z80.

Форум - Концепция экрана высокого цветового разрешения.

Форум - Несколько Pokes к играм. Программа Hacman96.

Форум - По поводу новых DOS и BIOS для Спектрума.

Форум - Программа Multicolor на любой модели компьютера. Использование 2-го экрана для Multicolor'а. Демонстрация текста. Электронные журналы.

Форум - Проект ZX Config.

Форум - Усовершенствование Art Studio. Идеи относительно компрессии файлов.

Форум - Эмулятор ZX Spectrum на IBM. По поводу шестнадцатеричной системы счисления. Программа ZX-Stars. Странности в Elita

Форум - Эффекты на бордюре и Multicolor.

Читатель-читателю - ZX Spectrum 128 - новые возможности, новые проблемы.

Читатель-читателю - Группа 'Light'. Спектрум и экспертная система.

Читатель-читателю - Драйвер принтера для Scorpion'а.

Читатель-читателю - Печать чисел в различных системах счисления.

Читатель-читателю - Программирование аркадной игры со скроллингом экрана.

Читатель-читателю - Процедура печати меток ассемблера XAS для монитора-отладчика STS 4.3.

Этюды - Атрибутная бегущая строка. "Гасилка" экрана. Упрощенный вариант процедуры "Занавес". Процедура гащения картинки. Процедура проявления картинки по точкам.

Этюды - Графический эффект "цветные полосы".

Этюды - Драйвер экрана для печати по 64 символа в строке.

Этюды - Комплект защит загрузчиков.

Этюды - Обращение к диску в режиме IM 2. Работа с диском нестандартного формата.

Этюды - Печать символа, увеличенного в 8 раз. Программа "наливания" экрана. Процедура гашения экрана по точкам. Очистка экрана как в Terminator'е. Поиск последовательности символов в памяти. Система перекодировки символьного набора.

Этюды - Программа - каталогизатор дисков.

Этюды - Программа вывода значений амплитуды каналов муз. сопроцессора на бордюр.

Этюды - Программа вывода картинки.

Этюды - Программа зажигания спрайта.

Этюды - Программа очистки заданного окна экрана.

Этюды - Программа сортировки массива по возрастанию. Процедура заполнения экрана заданным атрибутом. Процедура проявления картинки. Эффект летящих навстречу звезд. "Душ", идущий из верхнего левого угла экрана. Процедура "осыпания" картинки по пиксельным линиям. Программа "вытягивания" картинки под углом в 45 градусов. Три процедуры "Scroll".

Этюды - Процедура печати чисел.

Этюды - Процедура прорисовки символа с помощью атрибутов.

Этюды - Процедура проявления картинки. Fade-OUT эффект (картинка уходит за края экрана). Графический эффект "Фонтан". Fade-OUT эффект, имитирующий выключение телевизора. Процедура "зажигания" картинки. Программа плавной прорисовки картинки.

Этюды - Процедура рисования линии.

Этюды - Процедура составления оптимальной таблицы символов.

Этюды - Скроллинг строк текста в заданном окне. Атрибутный скроллер. Диагональный скроллинг.

Этюды - Спрайтовый скроллер. Процедуры проявления экрана.

Этюды - Укороченная процедура индикации амплитуды каналов муз. сопроцессора. Способ вычитания константы из регистровой пары HL.

Этюды - Формула для вычисления дня недели.


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

Похожие статьи:
От редакции - Первые отклики о газете.
Демопати - первые полные результаты Chaos Construction'2000.
Железо - Настройка сигнала INT.

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