ZX Format #05
11 декабря 1996
  IS-DOS  

IS-DOS - программистам: краткий курс программирования в среде IS-DOS.

<b>IS-DOS</b> - программистам: краткий курс программирования в среде 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).



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

Авторы журнала - ZX-Format No.5

От авторов - о пятом номере журнала.

Игрушки - 48 утюгов (част 4).

Игрушки - по пополочкам: Castle Master #1

Игрушки - новелла по игре Robin Of Sherlock.

Программистам - Basic для чайников - часть 5.

Программистам - искусственный интеллект в компьютерных играх.

Программистам - TR-DOS для программистов.

Программистам - описание и история создания MEM.

Программистам - обмен опытом: Об эффектах на бордюре и кое о чём ещё.

Программистам - обмен опытом: "Подсчет мозгов" - AUTOconfig v5.03.

Программистам - adventure: разумный подход к прохождению.

IS-DOS - пользователям: справочник по основным командам и утилитам базового комплекта IS-DOS.

IS-DOS - программистам: краткий курс программирования в среде IS-DOS.

IS-DOS - IS-NEWS - "Новости в мире IS-DOS".

IS-DOS - програмно-аппаратный комплекс поддержки IDE HDD для ZX Spectrum.

Железо - KAY: ZX Spectrum Ttransformer.

Железо - Технология это война.

Железо - General Sound.

Железо - XTR Modem.

Железо - Схемa KEMPSTON MOUSE.

Железо - Что делать, если мыша не правильного типа.

Железо - LPT COVOX и не только...

Премьера - описание программы Catalogue Master.

Премьера - описание программы Micro-editor. (MED)

Премьера - Text designer.

Интервью - интервью с разработчиком клона HOBBIT (2-я часть).

Отдохнём - словарь рекламы (С юмором, но не без здравого смысла!).

Отдохнём - Воспоминания о будущем.

Почта - Письма читателей.

Почта - реклама и обьявления.

Почта - уголок ламера (Детям до 16 лет читать категорически воспрещается).

Разное - перспективы: новая игра от Медноногова "Чёрный Ворон".

Разное - перспективы: Pink Floyd - новая операционная система для Спектрума.

Разное - перспективы: игра Экспансия.

Разное - Здесь был ТЫ.

Разное - Рецензия на игру Kings bounty II.

Разное - Конкурс на лучший уровень к игру Laser Squad продолжается. Новый конкурс на микро-демо.

Разное - анкета для читателей журнала.

Amiga - Крик души: Windows 95 и еще кое о чем.

Amiga - Amiga-клуб, вопросы и ответы.

Amiga - Проект PowerUp - следующее поколение Aмиг.


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

Похожие статьи:
Фанта - ЗАВТРА НЕ НАСТУПИТ (Артур КЛАРК).
Г. Каттнер. - "Профессор накрылся" (фантастический рассказ)
Реклама - реклама и обьявления от и для спектрумистов.
Новости ZXNet - ZXNet "вышла" в Internet. Обращение к поклонникам ZX-Spectrum'a.
ZX-Preview - Crazy Siberian Party 1999.

В этот день...   2 декабря