РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА I.1. Файловая подсистема ОС (продолжение) 2. ОПИСАНИЕ ВЫЗОВОВ ДОС 2.1. Общие замечания Ниже приводится полная спецификация интерфейса вызовов ДОС для программы на ассемблере. Указание, что для вызова требуется FCB открытого файла, означает, что на вход вызову предается FCB, полученный в результате исполнения вызовов открытия файла и корректного обмена с ним без изменения значений полей, не обозначенных в интерфейсе вызова. Не указывается особо возврат ДОС ошибок обмена с устрой- ствами (ошибка обмена,перестановка диска,защита от записи). В вызовах, проводящих поиск файла по каталогу, в поле FCB.FILENUM указывается код доступа к отчему ФК: 01-3F - явный номер ФК-отца, выданный ДОС в этом же поле при открытии; 41-7F - явный номер ФК + $40 - код префиксного открытия; C0-FF - неявная адресация относительно текущего каталога: числом FF-N кодируется возврат на N уровней вверх (N=0 - текущий каталог, большое N - корневой); 00 - признак закрытого файла: обмен невозможен. При относительной адресации в поле FCB.LOGDR необходимо указывать номер устройства, текущий каталог которого берет- ся за начало отсчета; 0-е значение означает текущее устрой- ство. При явной адресации ДОС игнорирует значение LOGDR и переопределяет его номером устройства, накотором открыт яв- но указанный файл. Все вызовы, кроме SG_DMA, SG_HIMEM, SG_DATA, SELDRIVE, G_DEFDEV, могут включать рабочее устройство и оставлять его включенным на выходе. Принудительное выключение устройства по завершении вызова задается прибавлением 1 к номеру вызо- ва (без нее все номера вызовов четные). Включение устройст- ва (и обращение к нему), однако, не происходит, если вслед- ствие используемой ДОС внутренней буферизации последних об- работанных блоков вся нужная информация уже считана и не перезаписывается. Запись вида AY означает передачу двухбайтового числа че- рез пару регистров со старщим байтом в A, младшим в Y. 2.2. RESETDOS - инициализация ДОС / завершение программы Код вызова: A = 00. Входные данные: Y - код возврата. Выходные данные: Y - код возврата (для Командера). Первый вызов RESETDOS при загрузке системы инсталлирует ДОС и запускает Командер. При повторных запусках определя- ет сохранность Командера в памяти (считает контрольную сум- му), если нет - загружает его и передает управление с кодом повторного входа. Этот вызов должен делаться при завершении всех программ для нормального возврата в командный диалог. Значение кода возврата определяет результат завершения программы при возврате управления Командеру и запоминается в переменной #Q среды диалога. В зависимости от кода воз- врата Командер может выполнить некоторые дополнительные действия. Код нормального завершения - 0. Возможные ошибки: при ошибке загрузки Командера ДОС воз- вращает стандартный код завершения по ошибке вызвавшей про- грамме. Но в этой ситуации ее, может быть, уже незачем об- рабатывать. 2.3. CALLRWTS - обращение к RWTS Код вызова: A = 02. Входные данные: таблица параметров RWTS (IOB: A000-A00E), буфер записи блока. Выходные данные: выходные данные RWTS, буфер чтения блока. Непосредственный вызов драйвера устройства внешней памя- ти RWTS в соответствии с его внешним интерфейсом (РСП.I.2). Вся забота об окончании отсрочки и поддержке целостности тома возлагается на пользователя. Внимание! Настройка параметров RWTS для заказанного уст- ройства (таблица DCT) может быть не произведена до его включения. Возможные ошибки: ошибка обмена, переставлен диск, диск защищен; возможны также внутренние запросы на отказ/продол- жение, отрабатываемые RWTS. 2.4. S_DEFDEV - установка текущих устройства и каталога Код вызова: A = 04. Входные данные: Y - системный номер ФК (0 - сброс), X - номер устройства (0 - текущее). Выходные данные: нет. Устанавливает одновременно текущее устройство и текущий каталог на нем, которые в дальнейшем можно использовать в качестве неявного префикса для доступа к файлам (достаточно указать нулевой номер устройства и FF - номером файла). Текущий каталог задается по правилам: - При Y=0 выполняется только сброс устройства: закрытие текущего ФК на устройстве X (0 - текущем) и перевод его в пассивное состояние (если нет других открытых файлов) с разрешением смены носителя. - Y/=0 означает номер ранее открытого ФК, устанавливаемого теперь текущим. - Если код ФК в Y явный (01-3F), то устройство, на котором файл открыт, известно и значение X игнорируется. - Если код ФК в Y неявный (C0-FF), то в X должно переда- ваться устройство, текущий каталог которого берется за начало относительного доступа. - Если текущий каталог устройства X не назначен, берется корневой; если он не открыт - открывается (это единст- венный случай, когда файл можно не открывать предвари- тельно). - Старый текущий ФК закрывается после установки нового: это позволяет указывать новый ФК относительно старого; - Новый ФК должен быть явно открыт с целью установки его текущим: если ранее он был открыт для использовния в других целях, то его следует открыть повторно либо не закрывать. Номер устройства кодируется алфавитным номером буквы в имени устройства (1-'A:', 2-'B:', 3-'C:' и т.д.). Явный номер файла присваивается ему системой при откры- тии, пользователю же достаточно знать о нем вышесказанное. Возможные ошибки: неверно заданы коды устройства или ФК. 2.5. G_DEFDEV - выдача текущего каталога и устройства Код вызова: A = 06. Входные данные: X - номер устройства (0 - текущее). Выходные данные: A - N текущего устройства, Y - N текущего каталога. Выдает текущее устройство и его текущий каталог либо те- кущий каталог на заданном устройстве - в том же виде, в ка- ком они передаются на вход другим вызовам или пишутся в FCB. Текущее устройство назначено всегда. Если не назначен текущий каталог, выдается Y=0. Возможные ошибки: неверный N устройства на входе. 2.6. SELDRIVE - ассоциирование номеров устройства Код вызова: A = 08. Входные данные: X - логический N устройства (0 - текущее); Y - физический N устройства (0 - отключ.). Выходные данные: нет. Настраивает данное логическое устройство на данное физи- ческое с разрывом ранее существовавшей ассоциации логичес- кого. Устройство должно находиться в пассивном состоянии. физического номеров устрйств X=0 задает текущее логическое устройство. Y=0 выключает данное логическое устройство из текущей конфигурации. Возможные ошибки: на переопределяемом устройстве есть открытые файлы, неверный N устройства на входе. 2.7. SG_DMA - установка/выдача адреса передачи данных Код вызова: A = 10 ($0A). Входные данные: YX = адрес (Y=0 - выдать) Выходные данные: AY = адрес. Устанавливает (до следующей переустановки), а при Y=0 выдает значение DMA - адреса приема из ДОС в память или пе- редачи в ДОС из памяти дополнительной информации, использу- емой в вызовах RW_DATA, SEARCH, RENAME. Во время приема/пе- редачи этот адрес не меняется. 2.8. SG_HIMEM - установка/выдача верхней границы памяти Код вызова: A = 12 ($0C). Входные данные: YX = адрес (Y=0 - выдать). Выходные данные: AY = адрес. Устанавливает (до следующей переустановки), а при Y=0 выдает HIMEM - верхнюю границу приема данных для вызова RW_ DATA. Чтение данных в память с контролем HIMEM гарантирует окончание обмена при достижении этого адреса и сохранность области памяти с этого адреса и выше. Контроль верхней границы можно не включать (см. 2.18). 2.9. SG_DATE - установка/выдача текущей даты Код вызова: A = 14 ($0E). Входные данные: YX - код даты (Y=0 - выдать). Выходные данные: AY - код даты. Устанавливает, а при Y=0 выдает код текущей даты, ис- пользуемый для маркировки измененных файлов. Дата кодирует- ся так: вх: Y X г4 г3 г2 г1 г0 м4 м3 м2 м1 м0 ч5 ч4 ч3 ч2 ч1 ч0 вы: A Y чччччч, ммммм, ггггг - младшие биты двоично-десятичного представления числа, месяца и года (за 0 год принят 1980). 2.10. G_FREMEM - выдача свободной памяти на носителе Код вызова: A = 16 ($10). Входные данные: X - N устройства (0 - текущее). Выходные данные: YA - число свободных блоков. Выдает число блоков на носителе, отмеченных как свобод- ные. Возможные ошибки: неверный N устройства на входе. 2.11. G_DPB - выдача таблицы параметров устройства (DPB) Код вызова: A = 18 ($12). Входные данные: X - N устройства (0 - текущее). Выходные данные: (DMA)-> DPB устройства (16 байтов). Выдает DPB указанного устройства по адресу DMA. Возможные ошибки: неверный N устройства на входе. 2.12. S_STATUS - установка атрибутов файла по маске Код вызова: A = 20 ($14). Входные данные: - Y - режим поиска файла, битовая строка: [76] - 00: поиск со след.позиции ФК (задана в POSITN), 01: поиск с текущей позиции ФК (POSITN-32), 1x: поиск с начала каталога; - X - маска битов изменяемых атрибутов (1 - меняется); - (CURFILE)-> FCB, где заданы параметры открытого ФК: FCB.NAME - шаблон имени файла, FCB.STATUS - новые значения изменяемых атрибутов, FCB.FILENUM,LOGDR - код ФК и устройства, при Y[7]=0 прочие поля FCB должны быть сохранены от предыдущего вызова SEARCH,PROTECT,DELETE или RENAME. Выходные данные: - Y = 00/FF - файл не найден/найден; - FCB настроен на запись следующего файла или конец ФК. Устанавливает новые значения заданных маской атрибутов файла. Возможные ошибки: неверно заданы номера устройства или ФК, ФК закрыт на запись или не открыт, конфликт по доступу (файл уже открыт для обработки). 2.13. SEARCH - поиск следующего файла в ФК по шаблону имени и маске атрибутов Код вызова: A = 22 ($16). Входные данные: - Y - режим поиска и работы, битовая строка: [76] - 00: поиск со след.позиции ФК (задана в POSITN), 01: поиск с текущей позиции ФК (POSITN-32), 1х: поиск с начала каталога; [0] - 1 здесь задает прекращение поиска при обнаруже- нии первого же подкаталога (для последующего по- гружения в него при сквозном поиске); - (CURFILE)-> FCB, где заданы параметры открытого ФК: FCB.NAME - шаблон имени файла, FCB.STATUS - маска атрибутов: 0 - атрибут файла должен быть 0, 1 - атрибут файла может быть любым; FCB.FILENUM,LOGDR - код ФК и устройства, при Y[7]=0 прочие поля FCB должны быть сохранены от предыдущего вызова SEARCH,PROTECT,DELETE или RENAME. Выходные данные: - Y = 00: файл по шаблону не найден, FF: файл по шаблону найден, 7F: найден подкаталог (при вх.Y[0]=1); - Если найдены файл или подкаталог, то (DMA)-> его FPB, переписанную из каталога; - FCB настроен на запись следующего файла или конец ФК. Ищет файл по шаблону в открытом каталоге. Возможные ошибки: неверно заданы номера устройства или ФК, ФК закрыт не открыт. 2.14. DELETE - уничтожение файла/каталога Код вызова: A = 24 ($18). Входные данные: - Y - режим поиска и работы, битовая строка: [76] - 00: поиск со след.позиции ФК (задана в POSITN), 01: поиск с текущей позиции ФК (POSITN-32), 1х: поиск с начала каталога; [0] - 0: стереть файл, 1: стереть пустой ФК; - (CURFILE)-> FCB, где заданы параметры открытого ФК: FCB.NAME - шаблон имени файла, FCB.FILENUM,LOGDR - код ФК и устройства, при Y[7]=0 прочие поля FCB должны быть сохранены от предыдущего вызова SEARCH,PROTECT,DELETE или RENAME. Выходные данные: - Y = 00/FF - файл по шаблону не найден/найден; - FCB настроен на запись следующего файла или конец ФК. Стирает файл в каталоге (пишет FF в первый байт имени файла) и освобождает занятые файлом блоки. Перед уничтоже- нием каталога следует предварительно уничтожить в нем все файлы или убедиться, что он пуст. Возможные ошибки: неверно заданы номера устройства или ФК, ФК закрыт на запись или не открыт, конфликт по доступу (файл уже открыт для обработки или защищен от записи), сти- раемый ФК не пуст. 2.15. RENAME - переименование файла Код вызова: A = 26 ($1A). Входные данные: - Y - режим поиска и работы, битовая строка: [76] - 00: поиск со след.позиции ФК (задана в POSITN), 01: поиск с текущей позиции ФК (POSITN-32), 1х: поиск с начала каталога; [0] - 0: переименовать файл в каталоге и выдать новое имя в (DMA), 1: выдать новое имя в (DMA) без переименования; - (CURFILE)-> FCB, где заданы параметры открытого ФК: FCB.NAME - шаблон имени файла, при Y[7]=0 прочие поля FCB должны быть сохранены от предыдущего вызова SEARCH,PROTECT,DELETE или RENAME; - (DMA)+$20-> шаблон нового имени (до 15 байтов). Выходные данные: - Y = 00/FF - файл по шаблону не найден/найден; - (DMA)-> фактическое новое имя файла; - FCB настроен на запись следующего файла или конец ФК. Записывает новое имя на место старого в записи файла в каталоге. Проверка наличия в ФК файла с новым именем не проводится: предполагается, что она была сделана ранее. В шаблоне замены допустимы те же знаки умолчания '*?'. i-й по порядку знак умолчания заменяется на группу символов, соответствующих i-й '*' в шаблоне поиска, при этом вместо '?' подставляется пустая строка. Избыточные '*' в шаблоне поиска и замены заменяются пустыми строками. Новое имя, по- лученное после подстановки выдается в (DMA). Занесение его в каталог может и не выполняться (вх.Y[0]=1). Возможные ошибки: неверно заданы номера устройства или ФК, ФК закрыт на запись или не открыт, конфликт по доступу (файл уже открыт для обработки или защищен от записи). 2.16. OPEN - открытие доступа к файлу для обработки Код вызова: A = 28 ($1C). Входные данные: - Y - режим поиска и открытия, битовая строка: [0] - открыть - 0: на чтение, 1: на чтение и запись, [1] - если файл есть - 0: открыть, 1: создать заново, [2] - если файла нет - 0: ошибка, 1: создать новый, [3] - 0: открыть файл по имени и отчему ФК в FILENUM, 1: открыть КФК устройства по номеру в X, [4] - 0: открыть файл данных, 1: открыть ФК, [76] - 00: поиск со след.позиции ФК (задана в POSITN), 01: поиск с текущей позиции ФК (POSITN-32), 1х: поиск с начала каталога; - при Y[3]=1: X - номер устройства: ABC..->123; 0 - тек. - (CURFILE)-> FCB, где заданы параметры открытого ФК: FCB.FILENUM,LOGDR - код ФК и устройства. Выходные данные: - при открытии: в постоянной части FCB - запись файла из ФК, FCB.STATUS[7] - ранг записи (W) в файл; - при создании: FCB.STATUS[6:0] - 0 для ФК / 1 для файлов данных, FCB.RECLEN - 1 (для файлов данных) / 32 (для ФК), FCB.PARDIR - N блока отчего ФК с записью (для ФК), FCB.PAROFF - смещение записи в этом блоке (для ФК), прочие поля постоянной части FCB обнулены; - в непостоянной части FCB: FCB.POSITN = 0, FCB.RECIO = 1, FCB.FILENUM - системный номер файла, FCB.LOGDR - номер логич.устр-ва, где открыт файл. Определение указанных выходных полей в FCB и означает открытие доступа к файлу. Замечание: при открытии корневого каталога его данные в FCB недоступны до первого обращения (поиска файла)! Следует учитывать это при доступе к записи КФК в 0-м блоке. Возможные ошибки: неверно заданы коды устройства или ФК, несоответствие режима открытия рангам доступа (файл для за- писи уже открыт или защищен, файл уже открыт на запись), использование '?' и '*' в имени создаваемого файла, отсут- ствие открываемого файла, слишком много открытых файлов в системе, много файлов в каталоге, нет места на носителе. 2.17. CLOSE - закрытие файла: прекращение обмена Код вызова: A = 30 ($1E). Входные данные: - Y - режим закрытия, битовая строка: [7] - 0: закрыть всю цепочку доступа к файлу (путь), 1: закрыть файл до его отчего ФК; - (CURFILE)-> FCB, где заданы параметры открытого файла: FCB.FILENUM - явный N файла (выданный при открытии); FCB.MODF[7] - 1: FPB изменен; если да, то: [0] - 1: уст-ть тек.дату, 0: оставить старую. [6] - 1: не менять, 1: переписать в ФК из FCB имя и байт атрибутов (FCB.STATUS) Выходные данные: - FCB закрытого файла: FCB.FILENUM - 0, если мультидоступ к файлу закрыт, - N ФК-отца, если вх.Y[7]=1. Записывает постоянную часть FCB файла в каталог(если она менялась), сохраняя, т.о., все возможные модификации посто- янных параметров в ходе обработки файла; устанавливает (по заказу) текущую дату. В режиме закрытия пути закрывает все ФК в цепочке доступа к файлу. Дополнительные режимы: установкой указанных битов в FCB. MODF можно отменить обновление даты модификации файла при закрытии (при этом сохраняется дата, записанная в FCB.DATE), а также изменить имя или атрибуты открытого файла (чего не позволяют делать вызовы RENAME и S_STATUS). Эти режимы бы- вают нужны при копировании файлов. Возможные ошибки: файл уже закрыт (не был открыт). 2.18. RW_DATA - чтение/запись данных файла Код вызова: A = 32 ($20). Входные данные: - Y - режим обмена, битовая строка: [7] - направление обмена: 0: чтение, 1: запись, [6] - нет данных в файле: 0: мусор, 1: обнулять, [5] - нет данных в файле: 0: см.[6], 1: останов, [43] - позицию взять из: 00:POSITN в байтах, 01:POSITN в тек.записях, 1X:FILELEN в байтах (с конца), [21] - длина обмена: 00:RECIO в байтах, 01:RECIO в тек. записях, 1X:FILELEN-POSITN в байтах (до конца), [1] - длина обмена задана в: 0:байтах, 1:тек.записях, [0] - контроль HIMEM при чтении: 1:вкл., 0:выкл.; - (CURFILE)-> FCB, где заданы параметры открытого файла: FCB.POSITN - позиция в файле для обмена (при Y[4]=0), FCB.FILELEN - длина файла (при Y[2]=1), FCB.RECLEN - длина записи файла (при Y[3,1]/=00), FCB.RECIO - длина обмена (при Y[2]=0), FCB.FILENUM - N файла, FCB.LOGDR - N устройства (выдается при открытии). - При записи: (DMA)-> фрагмент данных. Выходные данные: - YA - адрес конца реально обработанного фрагмента (+1); - при чтении: (DMA)-> фрагмент данных из файла; - FCB.POSITN - позиция конца обмена в байтах. Вариациями режима обмена позволяет читать и записывать последовательность байтов и записей с произвольного места файла, указываемого в байтах, записях или относительно кон- ца файла. Возможные ошибки: файл закрыт на запись, нет места на носителе, файл закрыт (не открыт). 2.19. POSITN - установка позиции текущего обмена Код вызова: A = 34 ($22). Входные данные: - Y - режим работы, битовая строка: [76] - позицию взять из: 00:POSITN в байтах, 01:POSITN в тек.записях, 1X:FILELEN в байтах (с конца), (совп.с битами [43] в RW_DATA). - (CURFILE)-> FCB, где заданы параметры открытого файла: FCB.POSITN - позиция в файле для обмена (при Y[7]=0), FCB.FILELEN - длина файла, FCB.RECLEN - длина записи файла (при Y[6]=1). Выходные данные: - FCB.POSITN - позиция в байтах. Устанавливает поле текущей позиции в файле, пересчитывая ее, если надо, из записей в байты. 2.20. CHKNAME - сравнение и замена имени файла Код вызова: A = 36 ($22) (Введен в версии 1.5). Входные данные: - Y - режим-индекс сравнения и замены: = 0: режим сравнения с шаблоном, /= 0: режим замены по шаблону, индекс шаблона замены в DMA (рекомендуемое значение - $20); - (CURFILE)-> FCB, где в FCB.NAME - шаблон имени файла; прочие поля несущественны; - (DMA) +0 -> имя файла, сравниваемое с шаблоном (ровно 15 символов: при необходимости заполнять пробелами); - (DMA) +Y -> шаблон замены этого имени (до 15 символов) Оба шаблона заканчиваются 0. Выходные данные: - Y[7] = 0/1: файл под шаблон подходит/не подходит; - (DMA)-> фактическое новое имя файла. Поиск и замена выполняются, как в вызове RENAME. Данный вызов позволяет сравнивать и заменять имена при самостоя- тельной обработке каталога: имя сравниваемого файла, напри- мер, автоматически выдается в (DMA) вызовом SEARCH в нужном формате. Если имя файла не подходит под шаблон поиска, замена не выполняется. 2.21. Прочие вызовы - выдача адреса таблицы вызовов ДОС Указание ДОС неверного вызова работает как выдача в YA адреса таблицы программ-исполнителей вызовов. Допускается прямое обращение к этим программам для ускорения обращения к ДОС, а также подмена этих программ другими.