Из журнала ZX Format #4, Санкт-Петербург, 15.06.1996 (с) 1996 А. Ларченко _________________________________________ Предлагаемая читателям ZX Format статья представляет собой часть справочника программиста по встроенному программному обеспечению компьютера Scorpion ZS 256. Полный справочник будет сопровождать но- вую версию Теневого Сервис-монитора с ус- ловным номером 4.0. Библиотека пользовательских подпрограмм (функций) Воспользоваться подпрограммами Теневого монитора можно из ассемблера, указав код функции непосредственно за кодом команды программного прерывания RST 8. Данные в подпрограмму передаются в регистрах или через память (примерно также осуществлял- ся вызов подпрограмм, работавших с Mic- rodrive, из Interface I). ____ RST 8 код 80h Вывод на принтер Подфункций нет. вх.: Akk код выводимого на принтер симво- ла; вых.: CY=1, если во время вывода был на- жат BREAK. Действие: код символа, выводимого на принтер помещается в регистр аккумулято- ра. Если в процессе выполнения операции произошла ошибка (нажата клавиша BREAK), то при возврате управления вызывавшей программе будет установлен флаг CY, в противном случае флаг сбрасывается. ____ RST 8 код 81h Вызов дисковой BIOS Номер подфункции передается через регистр C. Указанное имя подфункции является ус- ловным. Дисковая BIOS не использует стан- дартный TR-DOS и работает полностью авто- номно. Низкий уровень В эту группу входят подфункции обеспечи- вающие "низкий" уровень работы с устройствами. RESETC equ 0 ;сброс контроллера гибких дисков вх.: C=0 вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: сброс контроллера гибких дисков (и установка магнитных головок выбранного дисковода в начальное положение). Работу с дисководом рекомендуется начинать с этой подфункции. Ею же необходимо пользо- ваться при возникновении ошибок обмена. CHDRV equ 1 ;выбор дисковода вх: C=1; Aкк=0...3 код дисковода. вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: выбор текущего дисковода для последующих операций. Физически же диско- вод выбирается при выполнении подфункций, производящих реальную передачу данных (2, 5...8, 10...14). Коды дисководов 0 и 1 соответствуют физическим устройствам А и В, коды 2 и 3 могут быть заданы только после подключения к какому-либо эмулируе- мому диску на винчестере (см. подфункцию hddmount 35). При первом включении компьютера оба физических дисковода полу- чают фиксированную спецификацию, соот- ветствующую 80-дорожечному двух сторонне- му дисководу. Если коду спецификации дис- ка (см. RST 8, код 82h подфункция 4, BC = 0ch) присвоить значение 0ffh, то функции 2, 5...8, кроме того, могут определять спецификацию дисковода при первом к нему обращении. Скорость перемещения головки дисковода не определяется и устанавлива- ется максимальной (03h). MPOSIT equ 2 ;"логическое" позиционирова- ние вх: C=2; D=0...x номер логического трека. вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: позиционирование на заданный логический трек. При выполнении этой функции читается и проверяется номер до- рожки на которой находится магнитная го- ловка. IGNORE equ 3 ;пропуск сбойного сектора вх: C=3. вых.: CY если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: игнорирование ошибки и продол- жение выполнения подфункции READGR (5) (или WRITGR (6)). RETRY equ 4 ;повтор считывания/записи вх: C=4. вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: повторить, в случае ошибки, подфункцию READGR (5) (или WRITGR (6)). READGR equ 5 ;считывание секторов вх: C=5; D=0...x номер логического трека (первого обрабатываемого сектора); E=0...x номер первого обрабатывае- мого сектора; HL адрес буфера; B количество секторов в операции. вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: чтение группы секторов, распо- ложенных подряд, начиная с указанного ре- гистрами D и E, в буфер, заданный ре- гистром HL. Количество секторов задается в регистре B. Эта подфункция аналогична такой же в интерпретаторе системных функций TR-DOS. В случае возникновения ошибки чтения, можно воспользоваться под- функциями 3 или 4. Подфункция 4 повторит считывание сбойного сектора, а выполнение 5 подфункции игнорирует ошибку, при этом в буфере будет пропущено столько байт, сколько занимает сбойный сектор. WRITGR equ 6 ;запись секторов вх: C=6 остальное как у подфункции 5. вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: запись группы секторов, распо- ложенных подряд, начиная с указанного ре- гистрами D и E, из буфера, заданного ре- гистром HL. Количество секторов задается в регистре B. IDENT equ 7 ;идентификация диска вх: C=7 вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: идентификация диска. По этой команде производится комплексный тест дискеты в процессе которого проверяется тип записи (частотная модуляция/модифици- рованная частотная модуляция), количество используемых сторон дискеты (только при неформатированной верхней стороне для од- ностороннего диска), количество рабочих дорожек (40/80) (только, если нет старой разметки на 80), размер сектора (128/256/512/1024 байт). Эти параметры используются в дальнейшем всеми функциями оперирующими с логическими величинами (2, 3...6). Посмотреть и/или изменить код спецификации диска можно также с помощью подфункции 16. TR_DOS equ 8 ;идентификация диска TR-DOS вх: C=8 вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: идентификация диска для ОС TR-DOS, аналогично функции 18h интерпре- татора системных функций TR-DOS. Перед вызовом необходимо установить рабо- чий буфер, размером не менее 256 байт, используя подфункцию 9. SETWRK equ 9 ;установка рабочего буфера вх: C=9 HL адрес рабочего буфера. вых.: D код версии Теневого-монитора; C, B, E дата компиляции ПЗУ (число, ме- сяц и год). Действие: установка рабочего буфера для функции 8. Дата компиляции ПЗУ возвращается версиями старше 3.0a (код 68 от 29.04.95); в пре- дыдущих версиях содержимое регистров B, C, D и E остается неизменным. SCANSEC equ 10 ;анализ дорожки вх: C=10 HL адрес таблицы секторов; вых: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh; информация в таблице о находящихся на дорожке секто- рах. Действие: сканирование дорожки. Операция выполняется для той дорожки на которую установлена головка дисковода (либо после функции 2, либо после функции 14). В ре- зультате выполнения в памяти строится таблица расположения секторов на дорожке начиная от индексного маркера. Эта табли- ца (или аналогичная ей) является входной для функций FORMAT (11), F_READ (12) и F_WRITE (13). На каждый сектор в таблице отводится 5 байт. +0 идентификационный байт: 00h информация о секторе досто- верна; FFh сбойный сектор (информация о секторе не достоверна); FEh конец таблицы секторов; воз- можны значения FDh и FCh (см. ниже); +1 номер дорожки (физический [0...x]); +2 номер стороны [0/1]; +3 номер сектора [1...x]; +4, длина сектора, байт: 00 128; 01 256; 02 512; 03 1024. Байты +1...+4 извлекаются непосредственно из адресных маркеров секторов. FORMAT equ 11 ;форматирование дорожки вх: C=11 HL адрес таблицы секторов; DE адрес указателя; B=20h. вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: форматирование дорожки на кото- рой находится магнитная головка дисково- да. Форматирование производится согласно таблице секторов. Данные из таблицы нап- рямую переносятся на дискету, никаких проверок на их корректность не произво- дится, заканчивает таблицу идентификаци- онный байт больший 128. Размер сектора выбирается согласно байту +4, заполняет- ся сектор константой 0. После записи оче- редного сектора в байт по адресу, содер- жащемуся в регистре DE записывается число 2ch, а значение DE увеличивается на еди- ницу. F_READ equ 12 ;чтение секторов с дорожки вх: C=12 HL адрес таблицы секторов; DE адрес буфера дорожки. вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: чтение дорожки. Порядок считывания определяется содержи- мым таблицы расположения секторов. Счи- танные сектора помещаются в буфер дорож- ки, никаких разделителей между ними не ставится. Сектора со значением идентифи- кационного байта 0FFh или 0FCh не считы- ваются, но в буфере для них пропускается соответствующее длине (байт +4) место. Если сектор не может быть считан, то со- ответствующий идентификатор в таблице за- меняется на FDh. Идентификатор успешно считанного сектора заменяется на FCh, а по окончании операции все идентификаторы FCh автоматически переводятся в 00h. F_WRITE equ 13 ;запись секторов на дорож- ку вх: C=13 HL адрес таблицы секторов; DE адрес буфера дорожки. вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: последовательная запись. Поря- док записи определяется содержимым табли- цы расположения секторов. Сектора для ко- торых значение идентификационного байта 0FFh или 0FCh не записываются, а в буфере пропускается соответствующее длине такого сектора (байт +4) место. Если сектор не может быть записан, то соответствующий идентификатор в таблице заменяется на 0FDh. По окончании записи все идентифика- торы 0FCh автоматически переводятся в 00h. M_POSF equ 14 ;физическое позиционирова- ние вх: C=14 D=0...x номер физической дорож- ки; A номер стороны [0 нижняя, 1 верхняя]. вых.: CY=1, если были ошибки, значение см. RST 8, код 82, DE=04, BC=+1eh. Действие: физическое позиционирование на трек, номер которого задан в регистре D. Не проверяется на какой дорожке действи- тельно находится магнитная головка диско- вода. ERRES equ 15 ;замена в таблице секторов вх: C=15 HL адрес таблицы секторов; E заменяемый идентификатор; D устанавливаемый идентификатор. Действие: замена идентификаторов в табли- це расположения секторов. Все идентифика- ционные байты, совпадающие с заданным в регистре E заменяются на указанный в ре- гистре D. DISEXT equ 16 ;получение/изменение типа дискеты вх: C=16 A спецификация диска; B режим: 0FFh установка, дру- гое чтение. Действие: чтение/установка спецификации дискеты (для каждого дисковода предусмот- рена своя спецификация). Спецификация ус- танавливается также функцией 7 (и 8). Назначение бит в байте спецификации дис- ка: 0,1 размер сектора (соответствует байту +4 в таблице размещения секторов); 2 служебный бит (диск 40 работает на дис- ководе 80, не сохраняется, но использует- ся, менять не рекомендуется); 3, 4 не используются; 5 количество дорожек (0 40, 1 80); 6 тип записи (0 FM, 1 MFM); 7 количество сторон (0 одна, 1 две). DRVEXT equ 17 ;получение типа дисковода вых: C=17 Akk - код спецификации дисковода. Действие: чтение кода спецификации диско- вода. Спецификация дисковода определяется и за- носится в специальную ячейку внутри драй- вера при выполнении теста, который прово- дится при первом обращении к дисководу функциями 2, 5...8 (либо при первом вклю- чении компьютера). Функции 10..14 тест не выполняют. Назначение бит в байте спецификации дис- ковода: 0, 1 скорость перемещения магнитной го- ловки дисковода; 2...5 не используются; 6 количество дорожек (0 40, 1 80); 7 количество магнитных головок (0 одна, 1 две). Unused equ 18 Во всех версиях Теневого Сервис-монитора эта подфункция оставлена пустой. TIMSUB equ 19 ;установка режима time out вх: C=19 B - байт установки time-out; вых: HL - адрес процедуры time-out. Действие: установка режима time-out (тайм аут) для счтчика включения двигателя дисковода. Формат байта установки time-out: 0...3 Биты определяют номер дисковода (0 для A, 1 для B, 2 для C и 3 для D). 4...7 Состояние time out для дисковода. Сброшенный бит соответствует выключенной функции, а установленный включенной. 4-й бит соответствует дисководу A, 5-й дисководу B и т.д.). Функции 2...8, 10...14 в начале работы включают двигатель дисковода, при этом отрабатывается задержка на время раскрут- ки двигателя. Если для какого-либо диско- вода включн режим time-out, то драйвер для последующих операций в состоянии оп- ределить время, в течении которого за- держку можно не делать, это существенно сокращает время работы. Для обеспечения режима time out необходимо каждые 1/50 сек, то есть раз в прерывание вызывать функцию 19 с обнулнным регистром B. ________ Файловый уровень К существующим функциям дискового ин- терпретатора (BIOS) добавлены подпрограм- мы, работающие с файловой системой TRDOS. После их вызова установленный флаг CY обычно указывает на ошибку, при этом в Akk передатся код ошибки (за- метьте, только для файловых функций!). В случае, если значение Akk равно 80h, это указывает на физическую ошибку, е код, в свою очередь, доступен через функцию RST 8, код 82, DE=04, BC=+1eh. Для каждого файла в памяти должна быть отведена спе- циальная 28-ми байтная область дескрип- тор управления файлом (fcb) и буфер как минимум на один сектор (256 байт). Все операции по поддержанию записей в дескрипторе управления обеспечивают подпрограммы монитора. "Открывает" файл и создает управляющие структуры подфункция f_open (20). Входны- ми параметрами являются: адрес строки спецификации файла (HL), адреса буфера управления (IX) и буфера обмена (DE). Файл может быть открыт в двух различных режимах (по содержимому регистра B) байтового и блочного (секторного) обмена. Можно указать вид допустимых операций с файлом: чтение/модификация/запись. В за- висимости от режима открытия файла для передачи данных можно воспользоваться следующими подпрограммами. Подфункции f_read (22) и f_save (23) предназначены для считывания или записи одного байта, при этом файл рассматрива- ется как файл последовательного доступа. Позиционирование внутри файла осуществля- ется с помощью подфункций putpos (32) и getpos (33), позволяющих соответственно задать и считать текущую позицию в файле. Подпрограммы монитора следят за достовер- ностью данных в буфере обмена, который выступает здесь как кеш-память на один сектор (256 байт). Для файлов блочного обмена предназначены подфункции r_sec (28) и w_sec (29), которые соответственно считывают и записывают один очередной це- лый сектор, либо подфункции r_ms (30) и w_ms (31) для работы с несколькими пос- ледовательно расположенными секторами за одну операцию. Байтовые и блочные под- функции обмена данными, в принципе, можно совмещать. Для операций чтения и записи сектора, если предварительно был обрабо- тан байт (т. е. счтчик текущей позиции находится не на границе целого сектора) будет пересчитан текущий сектор. Закрывает файл и освобождает буфер об- мена (с дозаписью файла в случае необхо- димости) подфункция f_close (21). Предус- мотрены подфункции для поддержания файло- вой системы TR-DOS. fcbint (27) позволяет построить управляющую структуру файла без его открытия. Эта структура может ис- пользоваться для подфункций fndname (25) поиск файла, и fndnext (26) поиск следующего совпадающего файла. В имени файла, помещенного в fcb, символы '?' рассматриваются как "заменители", что позволяет подфункции "поиск следующего" искать файлы по получившемуся шаблону. Наконец, для удаления файла с диска может быть применена подфункция delfil (24). Следующие функции доступны с версии 2.70 (код 8 от 09.02.94) f_open equ 20 ;открыть файл вх.: С=20; ix адрес буфера для fcb; hl адрес строки, содержащей имя и тип файла в asciz; de адрес буфера dma; b способ открытия: 2 "физический" файл (если сброшен "логический"); 1 файл для записи; 0 файл для чтения; установка 0 и 1 бит указывает файл для модификации. вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе: Akk=71 файл существует; 72 файл не существует; 73 нет места для создания нового файла; + все ошибки создания fcb и поиска файла; bc длина файла в байтах. Действие: открыть файл для последующих операций с ним. Для открытия необходимо задать местоположение файла, которое в общем виде выглядит следующим образом: [Drive:]filename[.type] Отсутствие указания имени устройства (Drive) приводит к поиску файла на теку- щем дисководе. Тип файла по умолчанию "C". Строка спецификации должна заканчи- ваться нулевым байтом. Режим работы с файлом определяется содержимым регистра B: 2-й бит определяет буферезацию, и дол- жен быть установлен если предполагается обмен целыми секторами ("физический" файл), и сброшен, если обмен будет вес- тись байтами ("логический" файл). Кроме этого биты 0 и 1 задают режим доступа к данным, установка обоих бит открывает файл для модификации, то есть, как для записи, так и для чтения. В случае, если указанный файл не найден и режим доступа задан "для записи" или "для модификации" файл будет создан. f_close equ 21 ;закрыть файл вх.: C=21; ix адрес буфера fcb; вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе: см. коды ошибок функции f_save (23). Действие: закрыть файл, открытый функция- ми f_open (20). При закрытии файла происходит дозапись (при необходимости) информации из откры- тых буферов. f_read equ 22 ;чтение байта вх.: C=22; ix адрес буфера fcb; вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе: Akk=74 неверный тип операции (по- пытка читать из файла "только для запи- си"); 70 конец файла (end of file); Akk (при CY=0) очередной считанный байт. Действие: чтение очередного байта из фай- ла. Файл должен быть открыт как "логический". f_save equ 23 ;запись байта вх.: C=23; ix адрес буфера fcb; Akk байт для записи в файл; вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе: Akk=73 попытка записи после конца файла; 74 неверный тип операции (попытка записать в файла "только для чтения"); Действие: запись байта в файл. Файл должен быть открыт как "логический". delfil equ 24 ;удаление файла вх.: C=24; ix адрес буфера для fcb; hl -- имя и тип в asciz; вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе: Akk=72 файл не найден Действие: удаление файла, адрес специфи- кации которого задан в регистрах HL. ____ Следующие функции доступны из ПЗУ Тенево- го монитора, начиная с версии 3.0c, код 64 от 05.11.94 fndname equ 25 ;поиск файла на диске вх.: C=25; ix адрес буфера fcb (в имени файла допустимы заменители '?'); вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе или флаге Z: Akk=63 дискета не TR-DOS; Z=1 файл не найден. Действие: физический поиск файла, указан- ного в fcb, в каталоге диска, параметры файла возвращаются в полях fcb. Буфер fcb должен быть построен подфункци- ей fcbint (27). В имени файла допустимы заменители '?', вместо них при поиске файла подставляется "любой символ", таким образом подфункция fndname cnhjbn в fcb параметры для первого из найденных фай- лов. fndnext equ 26 ;поиск следующего совпада- ющего файла вх.: С=26; остальные параметры и выход те же, что и у подфункции fndname (25). Действие: продолжает поиск файла, указан- ного в fcb. Эта подфункция может использоваться при поиске следующего, совпадающего с "мас- кой" файла. Под "маской" подразумевается наличие в имени файла (при создании fcb подфункцией fcbint (27)) заменителей '?'. ВНИМАНИЕ! Подфункция fndnext использует внутренние ячейки монитора, поэтому, ска- жем, между вызовами функции нельзя смот- реть каталог из монитора. fcbint equ 27 разбор имени файла, созда- ние fcb вх.: C=27; hl адрес строки имени файла в ASCII; ix адрес буфера создаваемого fcb; de адрес буфера dma; b способ открытия; вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе: Akk=74 неверный тип файла; 68 несуществующий номер устройства; 69 ошибка в имени файла; ix адрес буфера fcb. Действие: разбор спецификации файла и построение на ее основе блока управления (fcb). Спецификация файла и способ открытия за- даются так же, как и для подфункции f_o- pen (20). r_sec equ 28 ;чтение очередного сектора в область dma вх.: C=28; ix адрес буфера fcb; вых.: CY=1, если были ошибки, коды оши- бок, возвращаемые в аккумуляторе, такие же, как для функций f_read (22) и f_save (23). Действие: последовательное чтение очеред- ного сектора из файла, содержимое сектора размещается в памяти с адреса, указанного полем dma в блоке управления файлом (fcb). Для обеспечения максимальной скорости вы- полнения операции Файл должен быть открыт как "физический". Если файл был в режиме "логический" и если предварительно был считан байт (т. е. счетчик указывает не на границу целого сектора) подфункцией будет "перечитан" текущий сектор. Макси- мальный номер сектора 254. w_sec equ 29 ;запись очередного сектора из области dma вх.: C=29; ix адрес буфера fcb; вых.: CY=1, если были ошибки, коды оши- бок, возвращаемые в аккумуляторе, такие же, как для функций f_read (22) и f_save (23). Действие: последовательная запись одного сектора из памяти с адреса, указанного полем dma в блоке управления файлом (fcb), в файл. r_ms equ 30 ;"мультисекторное" чтение на- чиная с dma вх.: C=30; ix адрес буфера fcb; b число считываемых секторов; вых.: CY=1, если были ошибки, коды оши- бок, возвращаемые в аккумуляторе, такие же, как для функций f_read (22) и f_save (23). Действие: последовательное считывание за- данного количества целых секторов. Подфункция r_ms подобна многократному вы- полнению подфункции r_sec (28), с той лишь разницей, что значение, указанное в поле dma не изменяется. В случае ошибки полагается, что все сектора не считались. w_ms equ 31 ;"мультисекторная" запись на- чиная с dma вх.: C=31; ix адрес буфера fcb; b число записываемых секторов; вых.: CY=1, если были ошибки, коды оши- бок, возвращаемые в аккумуляторе, такие же, как для функций f_read (22) и f_save (23). Действие: последовательная запись задан- ного количества секторов. Подфункция w_ms подобна многократному вы- полнению подфункции w_sec (29), с той лишь разницей, что значение, указанное в поле dma не изменяется. В случае ошибки полагается, что все сектора, принимавшие участие в операции получили случайные значения. putpos equ 32 ;установить значение указа- теля в файле вх.: C=32; ix адрес буфера fcb; de новое значение указателя; вых.: CY=1, если были ошибки, коды оши- бок, возвращаемые в аккумуляторе, такие же, как для функций f_read (22) и f_save (23). Действие: устанавливается новое значение указателя в файле. getpos equ 33 ;считать значение указателя в файле вх.: C=33; ix адрес буфера fcb; вых.: CY=1, если были ошибки, коды оши- бок, возвращаемые в аккумуляторе, такие же, как для функций f_read (22) и f_save (23). bc текущее значение указателя. Действие: возвращение текущего указателя. __ Жесткий диск Для TR-DOS жесткий диск эмулируется на стандартных для этой системы логических устройствах: B, C или D. На самом же вин- честере необходимо создать (из меню Тене- вого монитора) так называемые образы дис- кет это копии стандартных дискет (80 дорожек, 2 стороны и по 16 секторов на дорожке). Все преобразования форматов осуществляются программами ПЗУ Теневого монитора. Один подраздел типа TR-DOS спо- собен содержать до 51-го образа дискеты. Сам подраздел и образы дискет имеют уни- кальное шестисимвольное имя, по которому можно установить соответствие образа дис- кеты и "дисковода". Связь между "дисково- дом" и образом дискеты на жестком диске осуществляется подфункцией hddmount (35). Все назначения автоматически запоминаются на винчестере. После установления связи все команды системы TR-DOS и вызовы ин- терпретатора системных функций, а так же все низкоуровневые и файловые вызовы дис- ковой BIOS Теневого монитора будут отра- батываться встроенным эмулятором. Дисковод "A" не может быть связан с жестким диском, так как ряд программ не могут совместно работать с теневым сер- вис-монитором (обычным аргументом в этом случае является защита от отладчика). А поскольку все функции эмулятора вызывают те или иные подпрограммы из Теневого сер- вис-монитора, работа таких программ была бы невозможна. Поэтому, если происходит обращение к дисководу А, эмулятор жестко- го диска никогда не вызывается. Разбирая существующие дисковые программы была вы- явлена неприятная особенность часть из программ не определяют и не запоминают дисковод, с которого они были загружены. Так, программа будучи загружена с диско- вода В сразу же устанавливает в качестве рабочего "зашитый намертво" дисковод А, вместо того, чтобы "посмотреть" в систем- ные переменные TR-DOS (23798). Поэтому огромная просьба ко всем разработчикам программ - детально прорабатывать алго- ритм взаимодействия своих произведений с "внешним миром", чтобы посмотреть на ра- боту программы можно было не только у ее автора. Подфункции для работы с жестким диском вступят в силу в версии 4.0 Теневого Сер- вис-монитора. hddid equ 34 ;идентификация жесткого дис- ка вх.: C=34; буфер, установленный подфункцией SETWRK (9); вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе: Akk=86 жесткий диск не найден; Действие: поиск жесткого диска и настрой- ка на его параметры. Предварительно необходимо задать буфер, объемом не менее 512 байт, подфункцией SETWRK (9). hddid выполняется автомати- чески каждый раз при "холодном" сбросе компьютера. hddmount equ 35 ;подключение раздела TR-DOS к HDE вх.: C=35; Akk - номер диска (1 "B", 2 "C" или 3 "D") или тип раздела; de текстовая строка спецификации раздела (dr:[\]part\dos); вых.: CY=1, если были ошибки раздел не найден Действие: подключение раздела Для начала эмуляции подразделов типа TR-DOS на устройствах "C" и "D" предвари- тельно необходимо "соединить" соот- ветствующее устройство с подразделом. Ес- ли в спецификации раздела задано устройство (dr), то значение аккумулятора игнорируется. В обозначение part имя подраздела TR-DOS, dos имя диска в под- разделе. Подфункция hddmount может применятся и для установки других типов подразделов, конкретные режимы указываются отдельными битами аккумулятора. Эта подфункция находится в стадии отлад- ки, и некоторые параметры могут быть из- менены. $hddrd equ 36 ;чтение секторов из раздела жесткого диска вх.: C=36; hl адрес буфера в памяти; de начальный номер сектора (в разделе); b число секторов (размер сектора 512 байт!) вых.: CY=1, если были ошибки. Действие: считывание указанного коли- чества секторов из текущего подключенного раздела в буфер. $hddwr equ 37 ;запись секторов из раздела жесткого диска вых.: C=37; hl адрес буфера в памяти; de начальный номер сектора; b число секторов (размер сектора 512 байт!) вых.: CY=1, если были ошибки. Действие: запись указанного количества секторов из буфера в текущий подключенный раздел. ________ RST 8 код 82h Установка переменных монитора вх.: DE код подфункции (тип перемен- ных); BC относительный адрес перемен- ных в подфункции; CY вид операции: установленный запись, сброшенный чтение; Akk записываемое или считываемое значение. При изменении отдельных бит необходимо сначала считать значение переменной, за- тем изменить требуемый бит и, наконец, записать новое значение. Обозначения размеров переменных: db один байт; dw два байта, но доступ должен осу- ществляться побайтно; ds несколько байт однотипных перемен- ных. DE=00 Системные переменные монитора BC=+12 (db) Отдельные биты этого байта позволяют уп- равлять выводом значений регистров на эк- ран монитора (запись 1 запрещает вывод): 7 PC 6 SP 5 IX 4 IY 3 HL (HL') 2 DE (DE') 1 BC (BC') 0 AF (AF') BC=+21 (db) Байт управления выводом на принтер: 7 (0) данные выводятся в прямом виде, (1) данные выводятся в инверсном виде; 3 (0) два стоповых бита, (1) один сто- повой бит; 2 (0) 8 бит в байте данных, (1) 7 бит в байте данных; 1 (0) скорость передачи 9600 бод, (1) скорость передачи 1200 бод; 0 (0) интерфейс Centronics, (1) интер- фейс RS232. DE=02 Переменные режимов BC=+0 (db) константа антидребезговой задержки мони- тора. BC=+1 (db) константа задержки перед автоповтором. BC=+2 (db) константа задержки между автоповторами. BC=+5 (db) цвет бордюра, устанавливаемый монитором, при подаче звукового сигнала ошибки. BC=+6 (db) код символа "возврата каретки" для прин- тера. BC=+7 (db) код символа "перевода строки" для принте- ра. BC=+8 (db) код символа "перевода формата" для прин- тера. BC=+9 (dw) код, определяющий скорость передачи 9600 бод для последовательного интерфейса (по умолчанию 0bh). BC=+0bh (dw) код, определяющий скорость передачи 1200 бод для последовательного интерфейса (по умолчанию 6ah). BC=+0dh (ds 11) первый байт (+0dh) задает количество уп- равляющих символов, служащих для перевода принтера в графический режим (непос- редственно за ними будет выдано 768 байт графической информации при печати экрана из монитора). Сами коды располагаются со- ответственно со смещения +0eh и далее. BC=+15h (ds 4) коды, служащие для перевода принтера в текстовый режим, завершающие печать экра- на. Байт +015h хранит количество управля- ющих кодов, сами коды хранятся со смеще- ния +16h и далее. BC=+1dh (db) число строк на странице при печати на принтере. BC=+1eh (db) число символов в строке при печати на принтере. DE=04 Переменные дисковой BIOS BC=+4 (ds 4) байты хранят максимальное число секторов на дорожке при размере сектора 128, 256, 512 и 1024 байта соответственно. BC=+0ah (db) номер текущего дисковода: 0 дисковод "A", 1 "B", 2 "C" и 3 "D". BC=+0bh (db) число попыток считывания при ошибке, на- чальное значение 3. BC=+0ch (ds 4) коды, определяющие тип дисководов (специ- фикации) "A", "B", "C" и "D" соот- ветственно. BC=+10h (ds 4) коды, определяющие тип дискеты в дисково- дах "A", "B", "C" и "D" соответственно. BC=+18h (ds 2) коды, time-out для дисководов "A" и "B" соответственно. BC=+1dh (db) код ошибки дискового интерпретатора, ус- танавливается RST 8, код 81h: 1 нет готовности (диск не крутиться или его нет); 2 попытка записи на защищенную дискету (функции 6, 11 и 13); 3 во время выполнения функции была нажата клавиша BREAK; 4 ошибка при чтении или записи сектора функциями 5 или 6, можно воспользоваться функциями 3 или 4; 5 ошибка позиционирования (не соот- ветствует номер дорожки); 6 ошибка позиционирования (не считался адресный маркер дорожки); 8 ошибка позиционирования, несоответствие типов (попытка использовать 80 дорожечный диск на 40 дорожечном дисководе или двухсторонний диск на одностороннем дис- ководе); 9 неформатированная дискета (функции 7, 8); 16 дискета не соответствует формату TR-DOS по физическим параметрам: размер сектора, плотность записи, либо нет кода идентификатора <197> 10h (функция 8); 17 несовпадение кода типа дискеты TR-DOS реальному формату; 18 не открыт рабочий буфер (функция 8); 20 были ошибки при чтении/записи дорожки (функции 12, 13). ____ RST 8 код 83h Очистка окна пользователя Подфункций нет. вх.: IX дескриптор используемого окна. Действие: инициализация и очистка окна, задаваемого "дескриптором" блоком, сос- тоящим из 13 байт. Назначение байт в дескрипторе окна приведено ниже. +0, +1 Координаты курсора в окне (Y, X) <197> первоначально устанавливаются в ноль программой очистки окна, затем могут мо- дифицироваться пользователем. +2, +3 Координаты начала окна (Y, X). Эти коор- динаты измеряются в стандартных знакомес- тах размером 8*8 точек. +4, +5 Размер окна в стандартных символах (8*8 точек), первое число размер по вер- тикали, второе <197> по горизонтали. +6 Байт хранит цветовые атрибуты окна. +7 Системные атрибуты окна, задаются от- дельными битами: 5 запрет вывода, все выводимые символы игнорируются; 4 произвольный формат, по достижению правого края окна будут автоматически вы- полнены команды перевод строки и возврат каретки (см. RST 8, код 84h); 3 выполнять автоматический возврат ка- ретки при приходе символа перевода стро- ки; 2 выполнять автоматический переход строки при приходе символа возврат карет- ки; 1 изменять атрибуты при выводе каждого символа (в противном случае атрибуты ус- танавливаются только во время очистки ок- на); 0 не выводить символ курсора. +8, +9 Служебные байты. +10 Размер символов в точках. Монитором под- держивается два размера символов в 6 и в 8 точек. +11 Размер окна в символах. Для символов в 8 точек этот размер совпадает с шириной ок- на. Если размер символа 6 точек, то перед инициализацией (очисткой) необходимо рассчитать размер окна и поместить в этот байт. +12 Код символа курсора. Код с этим символом будет выводится в месте отмечая положение курсора, если сброшен 0 бит в системных атрибутах окна. Использование: прежде всего окно необхо- димо описать, задав в дескрипторе на- чальные координаты окна и его размер. Все координаты отсчитываются от верхнего ле- вого угла окна, либо экрана. Затем окно необходимо очистить функцией 83h, которая инициализирует некоторые переменные в дескрипторе. ____ RST 8 код 85h Вывод символа в окно пользователя Подфункций нет. вх.: Akk код выводимого на принтер симво- ла; IX дескриптор используемого ок- на. Действие: вывод символа в окно, указывае- мое дескриптором. Символы из набора ASSCI (коды в диапазоне 32...127) непос- редственно печатаются в определнном окне экрана (см. режимы в дескрипторе, описан- ные в RST 8, код 84h). Наряду с обычными "печатаемыми" символами, возможно ис- пользование управляющих кодов. Символом * отмечены управляющие коды, появившиеся и действующие в версиях старше 3.0b (код 64 от 05.11.94). 1 Установка атрибутов для последующих символов Непосредственно за управляющим кодом должны быть выведены два байта: первый байт маска устанавливаемых атрибутов, второй маска сбрасываемых атрибутов. Значимые биты должны быть установлены в байтах маски. 2 Восстановление запомненных атрибутов 4* Вывод с выравниванием Следом за этим управляющим кодом должна быть передана строка печатаемых символов, которая будет выровнена по центру или по правому краю окна. Длина строки не должна превышать ширину окна, управляющие символы в строке не допускаются, за исключением двух сле- дующих, завершающих строку, кодов. 5* Вывод строки по центру окна 6* Вывод строки выровненной по правому краю окна 7 Вывод звукового сигнала Программа отрабатывает короткий звуковой сигнал. Бордюр получает при этом цвет, установленный в специальной ячейке мони- тора (см. Переменные режимов, цвета). 10 Перевод строки Если курсор находится в последней строке, то происходит "свиток". 12* Очистка окна, курсор устанавливается в левый верхний угол 13 Перевод каретки Перемещение курсора в крайнюю левую пози- цию строки в окне. Если установлен соот- ветствующий бит в дескрипторе окна, то совместно с возвратом каретки вызывается и программа обслуживания символа перевода строки. 27 Позиционирование курсора внутри окна Непосредственно за управляющим кодом должны быть выведены два байта. Первый определяет позицию курсора в строке, вто- рой номер строки. Отсчет ведтся от лево- го верхнего угла окна начиная с нуля. 30* Обратный свиток Положение курсора не изменяется, весь текст в окне сдвигается на одну строку вверх, первая строка текста пропадает, последняя строка заполняется пробелами. ____ RST 8 код 86h копия графического экрана на принтер Подфункций нет. вых.: CY=1, если во время вывода был на- жат BREAK. Функция доступна, начиная с версии 2.4a (код 3). Действие: вывод на принтер копии графи- ческого экрана, аналогичной получаемому из меню Сервис-монитора. При печати ис- пользуются текущие настройки монитора. ____ RST 8 код 87h установка двойной скорости Подфункций нет. вых.: CY=1, если плата компьютера не поз- воляет переключать скорость. Функция доступна, начиная с версии 2.4d (код 3 от 11.12.93) ____ RST 8 код 88h установка обычной скорости Подфункций нет. вых.: CY=1, если плата компьютера не поз- воляет переключать скорость. Функция доступна, начиная с версии 2.4d (код 3 от 11.12.93) ____ RST 8 код 89h работа с микросхемой CMOS Подфункций нет. вх.: D код операции: 7 записать (1)/ считать (0) значение времени и/или даты; 6 считать в буфер (только, ес- ли бит 7 = 0, см. также бит 5); 5 формат считывания (1) пря- мое считывание; (0) считывание в формате ASCIZ; 0 работать с датой (1), или со временем (0); HL адрес буфера (если бит 6 = 1); C секунды/число; B - минуты/месяц; E - часы/год | формат считывания в буфер. вых.: CY=1, если микросхемы CMOS нет или задан неверный формат запроса; (HL) строка текста ASCIZ (если бит 6 = 1); C секунды/число; B - минуты/месяц; E - часы/год; L - день недели. Функция доступна, начиная с версии 3.1f (код 70 от 21.05.95) Действие: установка или чтение показаний текущего времени из микросхемы энергоне- зависимой памяти и часов (CMOS). Использование: один вызов функции обеспе- чивает доступ либо к текущей дате (бит 0 регистра D установлен), либо к текущему времени (бит 0 регистра D сброшен). 7-м битом регистра D указывается тип выполня- емой функцией операции: запись 1, счи- тывание 0. Считывание значений из микросхемы возмож- но в двух вариантах передачей в буфер, адрес которого указывается в регистрах HL (бит 6 регистра D установлен), либо пере- дачей в регистры C, B, E и L (бит 6 ре- гистра D сброшен). Интерпретация считываемых через буфер значений определяется 5-м битом регистра D. Если он установлен, то в буфер помеща- ется 6 байт данных о текущем времени и дате (по одному байту на секунды, мину- ты, часы, число, месяц, год). Если 5-й бит регистра D сброшен, то осуществляется перевод времени или даты в строку симво- лов ASCII, оканчивающуюся нулевым байтом. При этом содержимое регистра E использу- ется как формат вывода: младшие 5 бит символ разделителя к ним будет добавле- но 20h; биты 7, 6 и 5 разрешают вывод со- ответственно часов, минут и секунд; для вывода даты: 7 выводить день недели, 6 ставить символ "0" перед числом, 5 выводить месяц словом и перед годом до- бавлять "19". При изменение текущей даты задание нового значения возможно только через регистры C, B и E; изменить день недели нельзя, он рассчитывается программно для текущей да- ты. Остальные ячейки CMOS-памяти используются монитором для своих нужд, поэтому подпрограмм работы с ними пока не предус- мотрены. ____________ Замечания и предложения по работе встро- енного программного обеспечения можно высказать, написав письмо в электронную почту по адресу 2:5030/25.1 (FidoNet) или moa#ddeeds.spb.su (InterNet). _________________________________________