Рубрика "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).