┌──────────────────────────────┐ │ │ │ СТРАНИЧКА 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