Научно-технический кооператив "Спрайт" г. Новосибирск 1992 ОПЕРАЦИОННАЯ СИСТЕМА "С П Р А Й Т" (версия 1.3) РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА II. КОМАНДНЫЙ РЕЖИМ ОС "СПРАЙТ" В данном документе описывается интерфейс языковой над- стройки ОС "Спрайт", реализуемой Командером, для ассемблер- ных программ. СОДЕРЖАНИЕ 1. Обращение к подпрограммам Командера 2. Описание вызовов Командера 3. Установка системных векторов Приложение. Модуль программных спецификаций интерфейса Командера (файл \SYSTEM\DEFINES\COMMAND.DEF) 1. Обращение к подпрограммам Командера Прикладные программы, сохраняющие Командер в памяти во время своей работы, могут пользоваться его подпрограммами, доступ к которым организован в виде набора вызовов. Командер располагается в адресах EEA0-FFF9 (нижняя гра- ница может меняться с развитием системы) банка ROM1. Спецификация вызова и входных параметров для ассемблер- ной программы такова: CALLCMD EQU $02F0 ; через межслотный вызов для любого банка CMDHAND EQU $FFF4 ; при доступном на чтение банке ROM1 LDX #код.вызова LDA #параметр1 LDY #параметр2 JSR CALLCMD ; или JSR CMDHAND Адреса всех ячеек и областей, используемых в интерфейсе вызовов, приводятся в 4. 2. Описание вызовов Командера Вызовы с нечетным номером (в X) размещают FCB файла в рабочей области Командера, с четным - берут на вход вектор CURFILE или вообще не используют FCB. Запись вида 'AY=число' означает: 'А = <число' (старший байт), 'Y = >число' (младший байт). 2.1. RSTSCAN - сброс сканера входной строки Инициирует позицию сканирования введенной командной строки и пропускает начальные пробелы. Входные данные: X = 00, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; Выходные данные: SAVPOS - позиция первого непробела в строке (далее вез- де SAVPOS - позиция следующего сканируемого символа в буфере командной строки INBUF); сохраняет X,Y. 2.2. SKIPBLAN - сканирование пробелов Сканирует символы до первого непробела или конца строки. Входные данные: X = 02, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; Выходные данные: позиция первого символа-непробела или конца строки; сохраняет X,Y. 2.3. SCANTRMN - сканирование символа-неразделителя Сканирует следующий символ, если он не разделитель. ( Разделителями называются символы, разделяющие имена фай- лов в путях, пути, числа, параметры и пр. в командной стро- ке. Символы: ПС, оканчивающий командную строку, приравнива- емое к концу строки начало комментария ';' и пробел, окан- чивающий более сложные конструкции (пути, параметры) - на- зываются терминаторами. Здесь и в ряде других вызовов множества разделителей за- даются хвостовыми вырезками из следующей строки: символы: . : / \ , пробел ; ПC индексы: 0 1 2 3 4 5 6 7 ) Входные данные: X = 04, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; Y - начальный индекс в строке разделителей: Выходные данные: A=0, C=Z=1, сканер не сдвигается - если следующий сим- вол входит в подстроку разделителей Y..7 ; A=след.символ, C=Z=0 и сканер сдвигается - иначе; сохраняет X,Y. 2.4. SCANTRM - сканирование символа-разделителя Сканирует следующий символ, если он разделитель (с рас- познаванием терминатора). Входные данные: X = 06, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; Выходные данные: A=символ, C=0, Y=8, сканер не сдвигается - если следую- щий символ - не разделитель; A=0, C=1, Y=5..7, сканер не сдвигается - если следующий символ - терминатор (разделитель с индексом Y>4); A=символ, C=1, Y=0..4, сканер сдвигается - если следую- щий символ - другой разделитель (с индексом Y<5). 2.5. SCANCHK - сканирование символа по образцу Сканирует следующий символ, если он совпадает с образцом. Входные данные: X = 08, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; A - требуемый символ (образец); Выходные данные: Z=1, сканер сдвигается - если символ равен образцу; Z=0, сканер не сдвигается - иначе; сохраняет X,Y. 2.6. SCANNUMH - сканирование шестнадцатеричного числа SCANNUMD - сканирование десятичного числа Сканирует и вводит число из строки. Десятичное число вы- дается в двоично-десятичном представлении. Входные данные: X = 0A/0C, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; число начинается с текущей позиции и заканчивается лю- бым нецифровым символом (16/10-чным). Выходные данные: AX=число, C=0, Y=0 - нормальный исход, AX=0, C=1, Y=0 - числа нет, AX=число, C=1, Y=1..4 - большое число. терминатор числа не сканируется. 2.7. SCANNAME - сканирование имени файла Сканирует имя (шаблон имени) файла в строке и записывает его в FCB. Концом имени считается любой разделитель. Входные данные: X = 0E, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; (CURFILE)-> буфер FCB. Выходные данные: (CURFILE)->FCB.NAME - имя файла с нулем в конце (до 15 символов); Y=POSEND - индекс позиции нуля в FCB; POSPNT - индекс позиции последней точки в имени или 0, если ее нет; терминатор имени не сканируется. 2.8. SCANPATH - сканирование и открытие пути Сканирует в строке путь доступа к файлу, открывает все промежуточные каталоги и выдает имя (шаблон) целевого файла в FCB открытого каталога. ( Формат пути: [[@] N:] {/} {имя\{\}} [шаблон] , где: N - имя устройства (латинская буква), имя - имя файла (см. 2.7), шаблон - имя с возможными символами умолчания '*','?'. Первое имя пути может быть пустым (корневой ФK), пробелы в начале пути допустимы и пропускаются, в середине недопусти- мы; терминаторы пути - разделители 4..7 (пробел,',',ПС,';'). Входные данные: X = 10, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; (CURFILE) -> буфер FCB. Выходные данные: все файлы цепочки до шаблона невключительно (целевой каталог) открываются в буфере FCB; (CURFILE)->FCB.NAME,FCB.FILENUM - шаблон целевого файла и номер ФK (FCB готов для поиска или открытия файла); C=0, Z=1 - шаблона нет: путь задает доступ к каталогу; C=0, Z=0 - шаблон есть: путь задает доступ к файлу(ам); C=1, A=код ошибки - ошибка при открытии пути (открытая часть пути при этом закрывается); POSEND, POSPNT - как в 2.7; терминатор пути не сканируется. 2.9. SCANPAT - сканирование пути и запись шаблона Аналогичен вызову SCANPATH, но при отсутствии шаблона в конце пути в FCB заносится шаблон '???..???' ("все файлы"). Входные данные: X = 12, см. 2.8. Выходные данные: см. 2.8; если шаблона нет - CURFILE->FCB.NAME = '???..???'; Z=0 всегда. 2.10. SCANKEYS - сканирование списка ключей/параметров Сканирует '/' и последующий список ключей и параметров до пробела, как вызов SCANPARS ниже. Входные данные: X = 14, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; см. 2.11. Выходные данные: таблица KEYS предварительно обнуляется, далее см.2.11; если '/' не найден, сканер не сдвигается и параметры не разбираются. 2.11. SCANPARS - сканирование списка ключей/параметров Сканирует список ключей и параметров через ',' (ключи можно писать слитно); формат см. в РП.II.3.6.; конец списка - пробел, внутри пробелы недопустимы. Входные данные: X = 16, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; KEYS - флаги ранее разобранных ключей; PARVALS - значения ранее заданных параметров; VARVALS - значения переменных среды диалога; C=0/1 - не/обнулить предварительно KEYS и PARVALS. Выходные данные: значения найденных в строке параметров заносятся в PAR- VALS в виде 2-байтовых констант, причем для текстовых параметров это ссылки на их начала во входной строке (адрес параметра с ключом K: PARVALS+(K&1F)*2 - 2б.); флаги найденных ключей заносятся в KEYS (для ключа K - по адресу KEYS+K&1F) в виде: [7]=0/1: ключ K не задан/задан, [6]=0/1: параметр K не задан/задан; если задан, то: [5]=0/1: текст/число - тип параметра; если параметром указана переменная ('#' без ключом), ей присваивается значение параметра (по адресу VARVALS+ +(K&1F)*2 - 2байта). 2.12. SCANCMD - сканирование имени внутренней директивы Сканирует имя внутренней директивы сначала строки, если оно есть. Допустимы пробелы перед именем. Конец имени - лю- бой разделитель. Входные данные: X = 18, (INBUF)-> командная строка, SAVPOS - позиция сканир-я; (AY)-> список команд (в DCI-формате, конец - 0). Выходные данные: C=0/1 - нет такой директивы / директива найдена; X - N директивы (список директив см. в 2.25), если ко- манды в списке нет - число команд+1; терминатор не сканируется. 2.13. OUTDECIM - вывод десятичного числа Выводит длинное или короткое (1/2 байта) число в деся- тичном виде в 3 или 5 позиций с лидирующими нулями или про- белами. Входные данные: X = 1A, AY - число в двоичном представлении; C=0/1: 1/2 байта (Y/AY, 3/5 позиций при выводе). Выходные данные: выводится 3 или 5 десятичных разрядов числа (A)Y на те- кущее устройство вывода; если на входе C=0 и A/=0 - лидирующие нули выдаются, иначе подавляются пробелами. 2.14. OUTFILE - вывод информации о файле Выводит информацию о файле в виде строки каталога. Вид выдачи управляется ключами W и L, как в командном диалоге (в частности при установленном W выдается только имя). Входные данные: X = 1C, (AY)-> запись файла из каталога (см. вызов SEARCH ДОС); значения ключей W,L,P в таблице KEYS; OTSTUP - счетчик уровней вложенности файлов для левого отступа. Выходные данные: строка каталога на текущем устройстве вывода. 2.15. OUTDATE - вывод даты Входные данные: X = 1E, AY - мммммггг,ччччччгг - дата в стандартном формате ДОС. Выходные данные: дата в виде ЧЧ.MM.ГГ на текущем устройстве вывода. 2.16. OUTERR - вывод диагностики об ошибке Выдает диагностику по коду ошибки ДОС (несколько диаг- ностик относятся к ошибкам Командера). Входные данные: X = 20, A - номер ошибки: 00 - СТОП ПО АДРЕСУ - Командер 01 - ПЕРЕСТАВЛЕН ДИСК 02 - ОШИБКА ОБМЕНА 03 - ДИСК ЗАЩИЩЕН 04 - УСТРОЙСТВО В РАБОТЕ 05 - НЕТ МЕСТА НА ДИСКЕ 06 - ОШИБКА ВО VTОС 07 - МНОГО ОТКРЫТЫХ ФАЙЛОВ 08 - ФАЙЛ/КАТАЛОГ ЗАЩИЩЕН 09 - НЕВЕРНЫЙ ТИП ФАЙЛА 0A - КАТАЛОГ НЕ ПУСТ 0B - ФАЙЛ ОТКРЫТ:КОНФЛИКТ ПО ДОСТУПУ 0C - ФАЙЛ НЕ НАЙДЕН 0D - МНОГО ФАЙЛОВ 0E - ОШИБКА В ИМЕНИ 0F - НЕТ УСТРОЙСТВА 10 - ЧУЖОЙ ДИСК: НЕТ DPB 11 - НЕ ОТКРЫТ ФАЙЛ/КАТАЛОГ 12 - ОШИБКА В КОМАНДЕ - Командер 13 - ОТКАЗ, ПОВТОР, ДАЛЬШЕ? - Командер для RWTS 14 - ВСТАВЬТЕ ДИСК - Командер для RWTS 15 - : В УСТРОЙСТВО - Командер для RWTS Выходные данные: текст диагностики на текущем устростве вывода. 2.17. CHOICE - ввод ответа на запрос Запрашивает с клавиатуры один из вариантов ответа на не- который запрос и определяет код ответа. Входные данные: X = 22, (AY)-> таблица возможных ответов (клавиш) в виде: <группа_ответа_0, .. группа_ответа_N> , где группа_ ответа_K - список символов, вырабатывающих код отве- та K: <0х0ххххх, .. 0х0ххххх, 1х0ххххх> (бит [7] = 1 только у последнего символа списка). Выходные данные: вводится код клавиши с клавиатуры, берется по маске 5F (отождествление по регистру и алфавиту) и сравнивает- ся поочередно с символами списка ответов: код ответа увеличивается на 1 при переходе к новой группе; A - число K (для группы_ответа_K); неверный ответ ведет к перезапросу. 2.18. LOAD - загрузка файлов Загружает файл по шаблону имени и открытому FCB отчего каталога. Ищется следующий(!) подходящий файл, начиная с последнего найденного вызовом SEARCH ДОС. Входные данные: X = 25 (24+1), (CURFILE)-> FCB открытого каталога с шаблоном имени файла (FCB в памяти Командера!); заданы параметры A,L,P,S с теми же смыслом и умолчания- ми, что и в директиве LOAD командного режима. Выходные данные: файл загружен; каталог НЕ закрыт. Возможен выход на вектор обработки ошибки Командера по ошибке ДОС или отсутствию файла. 2.19. SAVE - запись файла Записывает файл из памяти по имени и FCB отчего каталога. Входные данные: X = 26/27, (CURFILE)-> FCB открытого каталога с именем файла (при X=26 CURFILE задает пользовательский FCB, при X=27 - текущий из памяти Командера); заданы параметры A,L,P,S с теми же смыслом и умолчания- ми, что и в директиве SAVE командного режима. Выходные данные: файл записан; каталог закрыт. Возможен выход на вектор обработки ошибки Командера по ошибке ДОС. 2.20. EXEC - запуск командного файла Открывает командный файл по имени и FCB отчего каталога и настраивает текущий ввод на чтение из этого файла. Закры- тие файла происходит при исчерпании файла. Входные данные: X = 29 (28+1), (CURFILE)-> FCB открытого каталога с именем файла (FCB в памяти Командера!). Выходные данные: при непосредственном окончании вызова: - файл открыт в памяти Командера, уровень FCB увеличен; - текущий ввод включен из файла. при исчерпании файла: - уровень FCB уменьшен, файл и каталог закрыты; - восстановлено состояние текущего ввода до открытия. Возможен выход на вектор обработки ошибки Командера по ошибке. 2.21. GROUP - обработка групповой команды Инициализирующий вызов для групповой обработки файлов. ( Под групповой обработкой понимается выполнение одного и того же действия над несколькими файлами в каталоге, задан- ных групповым шаблоном имени. Серия вызовов групповой обра- ботки позволяет организовать сквозной просмотр файлов по подкаталогам с выдачей имен и запросом подтверждений, как это сделано для некоторых директив в командном диалоге. ) Входные данные: X = 2B (2A+1), (CURFILE)-> FCB открытого каталога (в памяти Командера!) с шаблоном целевых файлов; (AY)-> программа обработки отдельного файла; ключи и значения параметров в KEYS и PARVALS. Инициализирует поиск файлов, вызывает GROUPX для даль- нейшей обработки, подсчитывает и выдает количество обрабо- танных файлов, если шаблон не определял имя файла однознач- но. После обработки каталог закрывается. 2.22. GROUPX - цикл групповой обработки Осуществляет поиск файлов по текущему каталогу и вызыва- ет для каждого найденного по шаблону файла пользовательский обработчик с информацией о режиме работы. При обработке нескольких файлов по неоднозначному шабло- ну учитываются ключи: N - без подтверждения, H - с поиском скрытых файлов, X - вглубь по подкаталогам. Работают стандартные варианты ответов на запросы. Входные данные: X = 2D (2C+1), (CURFILE)-> FCB открытого каталога (после GROUP) с шаб- лоном целевых файлов и текущей позицией. Выходные данные: C=0/1 - целевой файл был задан однозначно/нет; вызывает программу обработки (адрес передается через AY в GROUP) для каждого найденного файла с входными дан- ными: - N=0/1 - идет 1/2 просмотр каталога (2 просмотр устра- ивается только для обработки каталогов по ключу X); - C=0/1 - обрабатывается файл/ФК; - FCB настроен на позицию обрабатываемого файла в ката- логе и содержит шаблон поиска; - (DMA)->(зд:CATBUF=9F00) - FPB файла с полным именем; однозначно заданный файл обрабатывается без запроса; FCB найденного файла в обработчике изменять нельзя! Возможен выход на вектор обработки ошибки Командера по ошибке ДОС. 2.23. GROUPFK - рекурсивное погружение в подкаталог Реализует погружение в подкаталог для рекурсивной обра- ботки файлов. Следует вызывать из пользовательского обра- ботчика только на 2 проходе (ключ X) для всех файлов (на 2 проходе находятся обработчик вызывается только для ФК). Входные данные: X = 2F (2E+1), CURFILE -> FCB каталога для погружения в файл (в памяти Командера) с шаблоном целевых файлов; C - peжим пoгpужeния в ФK: 0 - шaблoн='*', 1 - шaблoн - то же самое имя. (Режим C=0 используется, например, в копировании подкаталога, а C=1 - в поиске с ключом X). Вызывает рекурсивно GROUPX. Возможен выход на вектор обработки ошибки Командера по ошибке ДОС. 2.24. RUN_SET - запуск файла / выбор каталога Разбирает командную строку, содержащую в начале путь, и, в зависимости от наличия имени в конце пути, запускает про- граммный или командный файл или устанавливает текущий ката- лог. Соответствует аналогичным действиям Командера. Входные данные: X = 31 (30+1), (INBUF)-> командная строка с путем доступа к файлу или каталогу, входными параметрами программ. Выходные данные: запущен нужный программный файл или включен ввод из командного файла или установлен текущий каталог. Возможен выход на вектор обработки ошибки Командера по ошибке ДОС или во входной строке. 2.25. PROCCALL - исполнение директивы Командера Разбирает командную строку, содержащую спецификацию внут- ренней директивы Командера, и исполняет ее. Соответствует аналогичным действиям Командера. Входные данные: X = 33 (32+1), A - номер директивы: 00 - DIR - выдать каталог 02 - DEL - стереть файл(ы) 04 - RD - стереть каталог(и) 06 - LOCK - поставить защиту файла(ов) 08 - UNLOCK - снять защиту файла(ов) 0A - REN - переименовать файл(ы) 0C - PATH - запомнить список путей для поиска 0E - CD - установить текущий каталог 10 - LOAD - загрузить файл(ы) 12 - SAVE - записать файл 14 - COPY - копировать файл(ы), каталог(и) 16 - TYPE - выдать файл(ы) в тексте 18 - DUMP - выдать дамп файла(ов) 1A - DATE - выдать/установить дату 1C - SCRN - установить экран 1E - BOOT - перезапуск системы 20 - VFY - установка режима контроля записи 22 - : - выдать память в тексте 24 - - - выдать дамп памяти 26 - ? - выдать значение переменной 28 - WHEN - условная директива 2A - IF - начало условного исполнения 2C - ELSE - инвертирование условного исполнения 2E - ELIF - условное инвертирование 30 - ENDIF - конец условного исполнения 32 - EXIT - пропуск исполнения; (INBUF)-> командная строка, SAVPOS - позиция сканир-я - должна указывать на начало имени директивы; параметры и ключи могут быть как заданы в передаваемой строке, так и уже занесены в таблицы KEYS и PARVALS. Выходные данные: директива исполнена. Возможен выход на вектор обработки ошибки Командера по ошибке ДОС или во входной строке. 2.26. PROCLINE - исполнение командной строки Выполняет полную интерпретацию командной строки: испол- няет вызов PROCCMD и при возврате им C=1 - вызов RUN_SET. Входные данные: X = 35 (34+1), (INBUF)-> командная строка с директивой и ее входными параметрами. Возможен выход на вектор обработки ошибки Командера по ошибке ДОС или во входной строке. 2.27. PROCCMD - исполнение директивы по командной строке Исполняет вызов SCANCMD и, если найдена внутрення дирек- тива, вызов PROCCALL по входной строке. Входные данные: X = 37 (36+1), (INBUF)-> командная строка с внутренней директивой Ко- мандера, ее ключами и параметрами. Выходные данные: C=0/1 - директива исполнена / не найдена. Возможен выход на вектор обработки ошибки Командера по ошибке ДОС или во входной строке. 2.28. RSTVECTS - восстановление системных векторов Восстанавливает стандартные обработчики для всех систем- ных векторов (см. 3). Входные данные: X = 38. 2.29. RESETIO - установка стандартного ввода-вывода Устанавливает стандартные устройства ввода-вывода (кла- виатуру и экран). Входные данные: X = 3A, C=0 - установка стандартных векторов ввода-вывода RDKEY и CHAROUT ; C=1 - то же + сброс ввода из текущих командных файлов: закрытие всех файлов с FCB во внутренней памяти Ко- мандера; 3. Установка системных векторов B системе есть ряд выделенных векторов, содержащих вызо- вы подпрограмм-реакций на различные исключительные ситуации при работе системы. Настройкой векторов можно задать иную системную реакцию на каждую из них. Ниже даны стандартные названия, нумерация, местоположе- ние и описание стандартных обработчиков: 0: ERRVECT ($FFF7) => ECMHAND: вектор ошибки ДОС для Ко- мандера. Выдает сообщение об ошибке и выполняет RESETIO с C=1. 2: H_INSTDR (RWTS ) => IDRHAND: установка диска RWTS. Если два логических устройства ассоциированы с одним и тем же физическим, то при обращении к одному из них сразу после обращения к другому вызывается данный об- работчик. На входе: X - N физического у-ва, Y - N логического. Выдается сообщение "ВСТАВЬТЕ ДИСК Y: В УСТРОЙСТВО X" и ожидается нажатие любой клавиши. 4: H_CHKERR (RWTS ) => ERWHAND: ошибка RWTS. Вызывается на выходе из RWTS в случае ошибки обмена. На входе: A=1..3 - N ошибки ДОС. На выходе: Z=1 - повторить попытку обмена, Z=0,C=0,Y=0 - игнорировать ошибку, Z=0,C=1,Y=2 - возврат с "ошибкой обмена". Выдает сообщение об ошибке и запрашивает продолжение (продолжить, повторить, ошибка). Другой обработчик должен обеспечивать тот же выход. 6: RSTVECT ($0311) => RSTHAND: аппаратный сброс. Восстанавливает стандартную конфигурацию памяти, вы- ключает текущее устройство, сбрасывает (без закрытия) все файлы в памяти Командера и передает управление Командеру вызовом CALLDOS(0). 8: BRKVECT ($0301) => BRKHAND: команда BRK. Выдает сообщение "СТОП ПО АДРЕСУ <адрес BRK>" и пере- дает управление Командеру CALLDOS(0). A: RDKEY ($0347) => KEYIN: станд. ввод с клавиатуры. C: CHAROUT ($0374) => SCROUT: станд. вывод на экран. Все стандартные обработчики находятся в области ROM1 ПЗУ Командера (кроме ввода-вывода, который находится в IOSUB), поэтому вектора работают корректно только когда эта область доступна. Установка векторов производится обращением по вектору SETVECT ($FFF1) с параметрами: X - номер вектора (четный!), C=0, AY - адрес новой программы обработки с адресом, C=1 - установить стандартный вектор Командера. На выходе в AY возвращается адрес стандартной программы об- работки (для удобства подстройки под него). Вызов RSTVECTS Командера настраивает все вектора на стандартные обработчики.