|
ZX Format
#05
11 декабря 1996 |
|
IS-DOS - программистам: краткий курс программирования в среде IS-DOS.

Рубрика "IS-DOS - программистам" No 5.
music by DNK
_________________________________________
Леонтьев А. Г.
КРАТКИЙ КУРС
ПРОГРАММИРОВАНИЯ В СРЕДЕ IS-DOS.
(под общей редакцией Елисеева В. А.)
От редактора.
Уважаемые читатели журнала ZX FORMAT!
Этой небольшой заметкой мы открываем но-
вую и, как нам кажется, чрезвычайно важ-
ную тему, а именно - написание программ в
среде операционной системы IS-DOS. В свя-
зи с катастрофическим отсутствием инфор-
мации о внутренем устройстве системы, до
сих пор развитие ее сдерживалось, так как
многие из программистов, желавшие напи-
сать что-либо в IS-DOS сталкивались с не-
обходимостью сначала разобраться, а как,
собствено она сама функционирует. Теперь,
надеемся, ситуация изменится. Предлагае-
мая вашему вниманию статья ведущего спе-
циалиста, одного из "отцов" IS-DOS Алек-
сея Леонтьева содержит в себе некоторые
первоначальные сведения, которые необхо-
димы каждому, кто решил попробовать свои
силы в программировании под IS-DOS. Итак,
передаем слово Алексею:
*****************************************
А. Леонтьев
ЧТО ДЕЛАТЬ?
или
КАК ПЕРЕСТАТЬ БЕСПОКОИТЬСЯ И НАЧАТЬ
ПРОГРАММИРОВАТЬ В ИСДОСЕ
1. РАСПРЕДЕЛЕНИЕ ПАМЯТИ В iS-DOS:
Операционная система iS-DOS изна-
чально писалась с расчетом ее работоспо-
собности в старом стандарте ZX с 48 KB
памяти и хотя бы одним дисководом. Посе-
му в iS-DOS Classic младшие 16 KB памя-
ти компьютера практически не используют-
ся (там находится ПЗУ бейсика). Выше,
с адреса #4000, находится экран.
Поскольку связь с флоппи-диском осу-
ществляется через TR-DOS, то сохранены
некоторые переменные бейсика и трдоса.
Т.о. нам остается память от 23900(#5D5C)
по 65535(#FFFF).
Буфер принтера (#5B00.. ..#5BFF) ис-
пользуется для командного файла exe-
bat.com, необходимого для работы bat-фай-
лов. Область с 23900(#5D5C) по
23999(#5DBF) резервируется под программы
mon.com и menu.com, которые также как и
exebat.com вызывают другие com-файлы.
Область выше 24000 обычно использует-
ся для загрузки системных или пользова-
тельских com-файлов. "Командники" грузят-
ся по адресу загрузки (12-ый, 13-ый байты
описателя файла). В ту же точку передает-
ся управление. 95% всех com-файлов имеет
адрес загрузки 24000.
Сверху область com-файлов ограничена
кэшем блочных устройств.
Кэш блочных устройств содержит прочи-
танные с помощью некоторых рестартов бло-
ки. Он необходим для работы почти всех
рестартов уровня файловой службы (с #20
по #38 и с #3B по #3F), многих рестартов
уровня командной строки, работающих с
файлами и каталогами, и некоторых рестар-
тов верхнего уровня: $shsubr(#8E),
$shpanl(#90).
При запуске com-файлов с помощью рес-
тартов $run(#48) или $exebat(#44) система
сама следит за неприкосновенностью кэша.
Если com-файл не влезает под кэш, гене-
рится ошибка 130. Адрес кэша и его размер
можно узнать у системы с помощью систем-
ного рестарта $g_cnfg(#10):
LD C,#10 ;$g_cnfg
RST #10
EXX ;в HL - адрес вектора
;конфигурации системы
LD BC,5 ;смещение +5
ADD HL,BC
LD E,(HL) ;адрес кэша
INC HL ;помещаем в DE
LD D,(HL)
INC HL ;смещение +7
LD A,(HL) ;размер кэша в блоках
Теперь будет не сложно проверить,
хватает ли памяти, и, если нет, пересоз-
дать кэш (если он нужен для работы прог-
раммы) размером поменьше с помощью рес-
тарта $creat(#00).
Если кэш временно не нужен, этой па-
мятью можно воспользоваться, но затем
обязательно пересоздать кэш рестартом
$creat(#00).
Выше кэша находится область каналов.
Адрес, размер и указатель области кана-
лов достаются через уже знакомый рес-
тарт $g_cnfg(#10) со смещениями +32, +34
и +36 соответственно. В каналах хранит-
ся самая необходимая системная информа-
ция, такая как каналы драйверов и ус-
тройств, каналы панелей и резидентов, а
посему начиная от адреса области кана-
лов и до #FFFF лучше ничего не трогать!
Над областью каналов находятся впе-
ремешку (в порядке загрузки) драйверы и
резиденты. Нижним будет резидент(драй-
вер) загруженный последним. Адрес нижне-
го резидента равен адресу конца области
каналов (см. выше).
Резиденты и драйверы доступны по
именам c помощью рестартов $fndev(#51) и
$run(#48) или по номерам каналов драйве-
ров или устройств.
Так любой драйвер или резидент Вы
можете достать, зная номер его канала:
; в A помещаем номер канала
LD C,#16 ;$stchn
RST #10
RET C ;выход по ошибке -
;нет канала и т. п.
EXX ;в HL - адрес
;тела канала
INC HL
INC HL
INC HL
INC HL
LD E,(HL)
INC HL
LD D,(HL) ;в DE - адрес
;тела драйвера
... и т.д.
(описание $stchn и каналов см. ниже)
Резидентную задачу можно запустить,
зная номер ее канала, рестартом
$exeres(#53).
Еще выше расположены 5 уровней сис-
темы. Сидят они сверху вниз, т. е. са-
мый нижний уровень "DOS" (работа с ус-
тройствами, кэшем, каналами и прерыва-
ниями) располагается на самом верху. Да-
лее идут "DUD" (файловая служба), "COM"
(интерпретатор командной строки), "WIN"
(рестарты работы с окнами, печати строк
и т. п.) и в самом низу "SHELL" (файло-
вая оболочка, работа с панелями, меню).
Два верхних уровня ("оконная техно-
логия" и "работа с панелями") могут быть
временно сняты программой set.com с клю-
чом /L, но используется это крайне редко.
Увидеть, чего где сколько, можно с
помощью программы Q:UTIL\show.com. Она
позволяет увидеть все основные адреса
системы, адреса загрузки уровней, реези-
дентов и драйверов, адрес и размер кэша
и многое другое.
ПРИМЕР РАСПРЕДЕЛЕНИЯ ПАМЯТИ
iS-DOS Classic
┌─────┬──────────────────────┐
│ 0│ ПЗУ бейсика │
│16384│ экран │
│24000│ область com-файлов │
│35903│ кэш │
│43443│ каналы │
│44143│ резиденты и драйверы │
│50304│ уровень 4: shell │
│54800│ уровень 3: win │
│58472│ уровень 2: com │
│60726│ уровень 1: dud │
│63296│ уровень 0: dos │
└─────┴──────────────────────┘
Вся дополнительная память ZX (128,
256 и т.д.) используется или для вир-
туального электронного диска, к которо-
му обращаются через специальный драйвер
как к обычному устройству (лучше всего
его назначить устройством Q:, тогда ра-
бота в системе резко ускоряется), или
под буферы (например копировщиками).
В январе 1995 года создан еще один
вариант iS-DOSa: "iS-DOS Chic" (исдос
шик), использующий нижние 16 KB для раз-
мещения неизменяемой части ядра системы.
Это оказалось возможным на компьютерах
KAY-256, Scorpion ZS-256, Spectrum-Profi
и др. им подобным.
Данные модификации Спектрума позво-
ляют в нижней странице памяти размес-
тить 0-ой банк памяти. Вместо него в
вверхней странице открывается 8-ой банк.
В нижнюю страницу помещаются как
правило неизменяемые части системных
программ (для возможности прошить эту
страницу в ПЗУ), знакогенераторы t42 и
t64 (2KB+1KB), благодаря чему транзит-
ная область расширяется почти вдвое (до
30 KB вместо 15 при минимальном количес-
тве резидентов и 29-блочном кэше).
ПРИМЕР РАСПРЕДЕЛЕНИЯ ПАМЯТИ
iS-DOS Chic
┌─────┬─────────────────────────────────┐
│#0010│rst #10 │
│#003B│подпрограмма драйвера эл. диска │
│#0047│признак типа системы/компьютера │
│#0067│таблица для драйвера эл. диска │
│#0101│буфер драйвера электронного диска│
│#0201│знакогенератор t64 (1KB) │
│#0601│не используется │
│#093A│ядро системы (неизменяемая часть)│
│#3800│знакогенератор t42 (2KB) │
│#4000│экран │
│#5DC0│область com-файлов │
│#A5A2│кэш (49 блоков) │
│#D6F0│каналы │
│#DAD8│резиденты и драйверы │
│#F365│уровень 4: shell ─┐ │
│#F78C│уровень 3: win │изменяемая │
│#FA88│уровень 2: com │ часть │
│#FC0C│уровень 1: dud │ │
│#FDE6│уровень 0: dos ─┘ │
└─────┴─────────────────────────────────┘
2. НЕСКОЛЬКО ОБЩИХ СЛОВ:
В системе iS-DOS вызов системных под-
программ осуществляется с помощью команды
RST 16 (или RST #10, если кто любит
шестнадцатиричные). При этом в iS-DOS
Classic должен быть открыт 4-ый канал
бейсика (после загрузки так оно и есть,
если Вы только не вызывали сами процедуру
#1601 или не запускали в исдосе скажем
MONS-4).
Код функции подается в регистре C.
Его старшие 3 разряда определяют уро-
вень системы. Обычно их (уровней) 5 (с 0
по 4). Дополнительный временный уровень
с номером 7 ставит текстовый редактор.
Отладчик устанавливает уровень номер 5.
Дополнительные уровни устанавливают так-
же Базы Данных.
Такой способ связи с системой или с
собственным ядром пакета из оверлеев че-
резвычайно удобен, так как ядро и овер-
леи полностью развязываются адресно и
после перетрансляции ядра не нужно пере-
линковывать все оверлеи. В противном
случае после изменения системы пришлось
бы перетранслировать все командные и ре-
зидентные файлы, многие драйверы и т. д.
и т. п.
При работе большинства рестартов
система сохраняет регистры BC, DE, HL,
IX и IY. У многих рестартов выходное
значение регистровой пары AF сигнализи-
рует об успехе операции. При этом подня-
тый в "1" флаг C означает ошибку и ре-
гистр A в этом случае содержит ея код. В
большинстве случаев при ошибках рекомен-
дуем просто отваливать по флагу C:
Например:
LD C,#02 ;flush
RST #10 ;вызов рестарта
RET C ;выход при ошибке
...
Некоторые рестарты, как например
рестарты оконной технологии $wt, $adrwt,
$box и др. могут вернуться с любым фла-
гом, т.е. ни флаг C, ни какой другой не
являются здесь признаком ошибки, и обра-
батывать их после вызова рестарта не
только не полезно, но и ошибочно. В
дальнейшем, при более подробном рассмот-
рении рестартов для каждого из них бу-
дут указаны возможные ошибки. Для неко-
торых рестартов важен не только флаг C
на выходе, но и флаг Z, а также содержи-
мое регистров. Такие случаи оговаривают-
ся особо.
Большинство рестартов, как уже было
сказано, сохраняют регистровые пары BC,
DE, HL, IX. Исключение: рестарты $exebat
и $run. Ими передается управление коман-
дным файлам или резидентным программам.
При выходе по RET'у из вызывавшихся
программ мы попадаем прямо в основную
программу минуя процедуру восстановле-
ния регистров.
ВНИМАНИЕ!
АЛЬТЕРНАТИВНЫЕ РЕГИСТРЫ
ПРИ RST 16
НЕ СОХРАНЯЮТСЯ!
Более того, именно ими многие рес-
тарты возвращают в программу такую по-
лезную информацию, как адреса системных
векторов (массивов), адреса или номера
блоков устройств, адреса каналов, драй-
веров и т. д. и т. п. Входные же данные
можно передать лишь через основные ре-
гистры.
3. ВАША ПЕРВАЯ ПРОГРАММА
Программы в исдосе могут быть двух
основных типов: командные файлы и рези-
денты.
Командные файлы (о резидентах мы по-
говорим позднее) имеют расширение *.com
и загружаются по адресу, указанному в
12-м и 13-м байтах описателя файла, ина-
че говоря, со смещением 12 dec (#0C hex)
в описателе файла и запускаются с адре-
са загрузки. Вызывать их можно из дру-
гих программ по командной строке рестар-
том run. Например:
LD HL,LINE;адрес командной
;строки помещаем в HL
LD C,#48 ;$run
RST #10
RET C
;описание командной строки, завершается
;кодом ENTER (#0D)
...
LINE DEFM "Q:RES\set user.res"
DEFB #0D
Из оболочки исдоса командный файл
можно запустить подведя к нему файловый
курсор и нажав Enter, либо описав его в
текстовом файле Q:SHELL\extkey.txt, или
из монитора командных строк mon.res
(mon+.res, mon.com), а так же из
bat-файла (подробнее см. книгу В. Ели-
сеева "IS-DOS - Первое знакомство").
Создать свой командный файл не прос-
то, а очень просто. Сперва при помощи
текстового редактора создайте исходный
текстовый файл в стандарте любимого Ва-
ми ассемблера. Рекомендуем наш as2.com.
Файл должен иметь расширение *.as (неко-
торые любят *.asm). В начале программы
установите адрес загрузки директивой ORG
(желательно не ниже 24000):
ORG 24000
Затем разместите тело вашей программы.
Выходить в исдос советуем по команде:
RET
При нормальном выходе флаг C должен
быть сброшен, флаг Z установлен, в ре-
гистре A помещаем код выходной операции:
#00 - ничего не делать
#F0 - перепечатать одну текущую панель,
при этом на ней сохраняется откры-
тым текущий каталог, который был
на панели до этого, сохраняется
позиция курсора, отметка файлов
сбрасывается.
#F1 - то же самое, но курсор устанавли-
вается в начало панели.
#F2 - перепечатать обе панели, сохранив
в текущей панели ранее открытый
каталог и позицию курсора. Перепе-
чатывается также и верхняя строка
подсказки, однако, окно монитора
командной строки не очищается.
#F3 - то же, но курсор устанавливается в
начало панели.
#F4 - полностью очищает экран и перепе-
чатывает обе панели и строку под-
сказки. На текущей панели сохра-
няется ранее открытый каталог и
позиция курсора.
#F5 - то же, но курсор устанавливается в
начало панели.
#F6 - полное обновление экрана, перепе-
чатка обеих панелей и подсказки
(как и при F4), кроме того заново
пересоздается кэш. Размер кэша бе-
рется из вектроа g_cnfg со смеще-
нием -6. Позиция курсора и ката-
лог в текущей панели сохраняются.
#F7 - то же, но курсор устанавливается в
начало панели.
#F8 - перепечатка текущей панели с сох-
ранением открытого каталога, пози-
ции курсора и отметки файлов.
#17 - (в старых версиях - #FB) - перепе-
чатка текущей панели, при этом те-
кущее устройство на ней открывает-
ся заново (перечитывается его кор-
невой каталог).
При ошибке флаг C должен быть уста-
новлен, в регистре A помещается код
ошибки.
Оттранслируйте программу ассембле-
ром, отлинкуйте полученный объектный
файл программой link.com. Для их вызова
можно написать bat-файл, а можно просто
нажимать Enter, наведя курсор сперва на
asm-файл, затем на obj (В файле
Q:extent.txt должны быть такие строки:
asm:Q:AS\as /auto
obj:Q:AS\link /old /sym S:AS\rst
Пользуйтесь при написании стандар-
тными названиями рестартов, тогда Вам
пригодится файл глобальных меток
rst.obj, а программа будет более чита-
бельной. Обязательно сосчитайте кон-
трольную сумму com-файла программой
ch.com. Для этого установите курсор на
Ваш com-файл и вызовите из командной
строки программу ch.com. В случае
bat-файла опишите вызов ch.com прямо в
нем.
4. РЕЗИДЕНТНЫЕ ПРОГРАММЫ
Резидентной программой в системе
IS-DOS называется программа, постоянно
находящаяся в специальной области памя-
ти и, поэтому, доступная для работы в
любое время без подгрузки ее с диска.
Работа с резидентной программой под-
разделяется на три этапа:
1. Установка (загрузка) в память с дис-
ка, настройка на адрес и инициализа-
ция.
2. Основная работа
3. Удаление программы из памяти
1-ый и 3-ий этапы осуществляются
командой set.com. Она же создает 18-бай-
товый канал, описывающий резидентную
программу.
Установленные (загруженные) рези-
дентные программы можно увидеть при по-
мощи программ show.com и eliminat.com.
Обращаться к резидентным программам мож-
но по именам из командной строки, ис-
пользуя встроенную команду DOS "@", на-
пример:
@date+3
или
@scan ch+ *.*
Последняя строка содержит сразу 2
имени резидентов. Это вызвано тем, что
некоторые резидентные программы предназ-
начены для работы в паре со специальными
служебными резидентами - scan.res и
univ.res. Эти служебные резиденты осу-
ществляют подбор файлов (по маске, от-
метке и т. п.) и передачу их в качестве
параметра резиденту, запускаемому в паре
с ними.
Т. о. Вы запускаете служебную рези-
дентную программу, указав в качестве
первого параметра имя рабочего резиден-
та, а в качестве второго - ключ или мас-
ку для подбора файлов. Служебный рези-
дент по имени определяет номер канала
рабочего резидента, запоминает его и
многократно запускает по номеру, предва-
рительно открывая следующий файл, подхо-
дящий под указанную маску или ключ.
Резиденты, работающие в паре с рези-
дентами scan.res и univ.res обычно имеют
специальную защиту от прямого обращения
к ним через команду "@".
Структура резидентной программы:
****************************************
смещ. длина комментарий
----------------------------------------
0 2 Адрес процедуры инициализа-
ции. Она вызывается при пе-
ремещении (при этом в рег. A
подается FF) или удалении
(в рег. A подается FE) прог-
раммой SET.com. Если этот
адрес равен 0, то процедура
не вызывается. Эта программа
должна подключать, если это
необходимо, резидента к це-
почке прерываний или к дру-
гой програме, перехватывать
рестарты и восстанавливать
их.
2 2 Адрес главного входа, т.е.
процедуры запуска по имени
рестартами $exebat(#44) и
$run(#48) или по номеру ка-
нала рестартом $exeres(#53)
Если адрес равен 0, то за-
пускается с 4-го байта.
4 R Тело программы - собственно
машинный код
R+4 2 #FFFF - отделяет тело про-
граммы от последующей слу-
жебной информации
R+6 2n таблица настраиваемых адре-
сов - 1. Смещения от начала
вычисляются по LSA. Единица
вычитается для пущей просто-
ты настраивания таких команд
как: CALL, JP, LD HL,
LD A,(nn), наиболее часто
встречающихся в программе.
----------------------------------------
С появлением программ ассемблера и
сборщика (as.com и link.com) все заботы
о разделителе и таблице настраиваемых
адресов у программиста отпали. Чтобы
собрать резидентную задачу надо лишь за-
резервировать в начале файла 4 байта (2
слова) для адресов точек входа (см.
только что приведенную структуру) и от-
линковать объектный файл(ы) с ключом
/res. Не забудьте лишь установить ORG
отличный от нуля, чтобы адрес #FFFF не
спутался с разделителем!
5. ДРАЙВЕРЫ УСТРОЙСТВ
Драйвер - это резидентная программа
специального назначения. Он обслуживает
физическое или логическое устройство од-
ного из трех типов:
1. Блочные устройства: файлы типа *.blk,
номера каналов драйверов F8..FF, номера
каналов устройств - 00..07
2. Символьные устройства вывода: файлы
типа *.typ и *.lpr, номера каналов драй-
веров F0..F7, номера каналов устройств -
08..0F
3. Cимвольные устройства ввода: файлы
типа *.key номера каналов драйверов
E8..EF, номера каналов устройств -
10..1F
Установленный в систему драйвер име-
ет только 8-буквенное имя (тип в канале
не хранится). typ от lpr можно отличить
по 0-му биту в 13-ом байте драйвера
(5-ый байт в векторе g_typ(#12)). В на-
чале каждого драйвера располагается век-
тор стандартной структуры:
****************************************
смещ. длина имя комментарий
----------------------------------------
0 2 INST Программа, инициализа-
ции вызываемая как и
для всех резидентов
программой SET.com, а
также при каждом пере-
ключении устройства,
обслуживаемого драйве-
ром. При этом в реги-
стре A подается номер
устройства
2 2 ENTRY1 1-ая точка входа
4 2 ENTRY2 2-ая точка входа
6 2 ENTRY3 3-я точка входа
8 8 служебная информация,
хранящаяся также в
описании канала ус-
тройства и в векторе
устройства - регистры
состояния, адреса бу-
феров и т. п.
16 ... тело драйвера
----------------------------------------
Точка входа INST может использо-
ваться для переключения драйвера на со-
ответствующее устройство (задействовано
в sys_driv и в драйверах винчестеров), а
также информирует драйвер (и резидент) о
том, что его передвинули или отключают.
Вся информация подается в регистре A:
A=0..7 - номер устройства, на которое
переключается драйвер
A=FE - драйвер (резидент) отключается,
т.е. будет снят или просто те-
кущее устройство скоро будет
сменено. Делается это на тот
случай если драйвер в рабочем
состоянии перехватывает обраще-
ния к какому-либо рестарту или
другому драйверу.
A=FF - драйвер (резидент) только что
передвинут.
Входы ENTRY1, 2, 3 соответствуют
группам системных рестартов IS-DOS:
****************************************
Драйвер ENTRY1 ENTRY2 ENTRY3
----------------------------------------
blk $read $write $binit
typ $type $tycpl $typos
key $key $kwait $ktest
----------------------------------------
Приложение: Структура драйверов
устройств IS-DOS
****************************************
blk - блочное устройство
----------------------------------------
0 2 INSTL - переключение на устр-во
или переинсталляция
(если значение равно 0,
то процедура не нужна)
2 2 BREAD ┐ точки входа
4 2 BWRIT │ для рестартов
6 2 BINIT ┘ (только для дисководов
со сменным носителем)
8 1 SCCSR - регистр состояния:
биты 0...2 - номер устройства для
кэш-памяти
бит 3 - 0 - драйвер с буфером
1 - драйвер без буфера
бит 4 - 0 - не выполнять
autoflush
1 - выполнять autoflush
при каждой модифи-
кации блоков в кэше
бит 5 - 0 - запрет чтения для
рестартов
1 - разрешение чтения
для рестартов
бит 6 - 0 - запрет записи для
рестартов
1 - разрешение записи
для рестартов
бит 7 - 0 - не использовать кэш
1 - использовать кэш
9 1 DRCSR - еще регистр состояния:
бит 0 - 0 - не выполнять запрос
по адресу QVST
(вектор g_cnfg сме-
щение +40) при об-
ращении к блочному
устройству
1 - выполнять запрос
бит 1 - флаг autoflush (сбрасы-
вается пользователем)
бит 2 - 0 - диск TR-DOS
1 - диск не TR-DOS
биты 3...6 - не используются
бит 7 - 0 - не обрабатывать
ошибки ($erdrv)
1 - обрабатывать ошибки
10 2 OFIM2 - смещение от начала
драйвера до кода IM2
в процедуре восстанов-
ления режима IM2 на вы-
ходе из драйвера.
Если значение равно 0,
то IM2 на выходе не
устанавливается
12 1 TPSYS - тип TR-DOS'а:
0 - 5.01
1 - 5.03 и выше)
14 2 TMBUF - адрес буфера драйвера,
объем буфера - 1Kb.
........
20 2 ..... - номер текущего сектора
в буфере драйвера
........
30 1 ..... - тип дисковода:
бит 0 - 0 - 40 дорожек
1 - 80 дорожек
бит 1 - 0 - односторонний
1 - двухсторонний
31 1 TMWT - задержка начала чтения
сектора
32 1 HTIME - время перемещения голо-
вок дисковода
33 1 ..... - тип диска:
бит 0 - 0 - 40 дорожек
1 - 80 дорожек
бит 1 - 0 - односторонний
1 - двухсторонний
34 1 ..... - размер сектора, значе-
ния этого байта:
1 - 256 байт
2 - 512 байт
4 - 1024 байта
35 1 ..... - количество секторов на
дорожке
36 16 ..... - таблица номеров секто-
ров на дорожке
--------
Примечание: байты 8...15 хранятся также
в канале и в векторе блочного устрой-
ства. Байты 33...51 считываются с диска,
это не что иное, как байты 23...25 и
64...79 из нулевого блока описателя дис-
ка. Подробнее о дисках мы поговорим чуть
позже, при описании рестарта $binit.
****************************************
typ - устройство вывода на дисплей
----------------------------------------
0 2 ..... - как правило, не исполь-
зуется
2 2 TYPE ┐ точки входа для
4 2 TYCPL │ рестартов печати
6 2 TYPOS ┘ символов
8 1 ..... - ширина матрицы символов
в точках (6 для ty42 и
4 для ty64). Использу-
ется рестартами y___ и
n___ уровня WIN
9 4 ..... - зарезервировано
13 1 ..... - должен быть равен 0
(признак typ)
14 2 ..... - зарезервировано
16 2 GSZ размер знакогенератора
в байтах
18 GSZ собственно знакогенера-
тор драйвера
--------
Примечание: байты 8...15 хранятся также
в канале и в векторе символьного устрой-
ства вывода. Байты, соответствующие за-
резервированным используются там для
хранения текущих координат печати и ад-
реса процедуры обработки ошибок сим-
вольного устройства вывода.
****************************************
lpr - устройство вывода на принтер
----------------------------------------
0 2 ..... - инициализация портов
принтера, если это не-
обходимо
2 2 ..... - процедура печати симво-
ла, поданного в рег. A,
4 9 ..... - зарезервировано
13 1 ..... - должен быть равен 1
(признак lpr)
14 2 ..... - зарезервировано
--------
Примечание: байты 8...15 хранятся также
в канале и в векторе символьного устрой-
ства вывода.
****************************************
key:
----------------------------------------
0 2 ..... - как правило, не исполь-
зуется
2 2 TTYIN ┐ точки входа для
4 2 KWAIT │ рестартов ввода
6 2 KTEST ┘ с клавиатуры
8 1 K_CSR - регистр состояния:
бит 0 - 0 - строчные
1 - заглавные
бит 1 - 0 - латинские
1 - русские
бит 2 - 0 - текст
1 - псевдографика
бит 3 - 0 - разрешение kwait
1 - запрет kwait(1)
этот бит сбрасывается
сам при пустом буфере
9 1 M_CSR - маска разрешений смены
соответствующих битов
регистра K_CSR
1 - смена разрешена
10 1 KLAST - код последней нажатой
клавиши
11 1 REPD - интервал между первыми
двумя одинаковыми кла-
вишами (задержка авто-
повтора), значение по
умолчанию - 29
12 1 REPP - интервал между последу-
ющими одинаковыми кла-
вишами (частота авто-
повтора), значение по
умолчанию - 1
13 2 IKEYB - адрес процедуры опроса
клавиатуры
14 2 ..... - зарезервировано
16 2 KS - Размер таблицы кодов
клавиш
18 KS ..... - собственно таблица ко-
дов клавиш
............
KS+18 1 PNKEY - число нажатых клавиш
KS+19 1 - смещение в буфере кла-
виш до кода для TTYIN
(INC)
KS+20 32 ..... - буфер нажатых клавиш
(заполняется и опорож-
няется с помощью INC)
----------------------------------------
****************************************
Ну вот на сегодня и все, уважаемые
читатели, в следующем номере ZX Format
будет напечатано продолжение книги А.
Леонтьева, в котором речь пойдет о рес-
тартах самого нижнего уровня системы -
уровня "DOS" (c #00 по #1F).
Другие статьи номера:
Похожие статьи:
В этот день... 2 ноября