Научно-технический кооператив "Спрайт" г. Новосибирск 1992 ОПЕРАЦИОННАЯ СИСТЕМА "С П Р А Й Т" (версия 1.5) РУКОВОДСТВО ПРОГРАММИСТА II. ДИАЛОГОВЫЙ КОМАНДНЫЙ РЕЖИМ В данном документе описываются синтаксис входного языка системы и директивы диалогового командного режима системы. СОДЕРЖАНИЕ 1. Общие сведения 1.1. Запуск Командера 1.2. Командный диалог 1.3. Директивы Командера. Программные и командные файлы 1.4. Запросы Командера 2. Командные файлы 2.1. Формат командных файлов 2.2. Стартовый командный файл 3. Входной язык системы 3.1. Формат чисел 3.2. Формат имен устройств 3.3. Формат имен файлов и расширений 3.4. Формат пути доступа к файлу 3.5. Формат командной строки 3.6. Параметры программ и переменные Командера 4. Описание внутренних директив 4.1. Универсальные ключи поиска 4.2. Универсальные параметры фрагмента файла 4.3. Вывод каталога 4.4. Вывод и установка даты 4.5. Установка и снятие защиты файлов по записи 4.6. Уничтожение файлов 4.7. Уничтожение каталогов 4.8. Переименование файлов 4.9. Запись фрагмента памяти в файл 4.10. Загрузка файлов в память 4.11. Текстовый вывод файлов 4.12. Байтовый дамп файлов 4.13. Текстовый вывод фрагмента памяти 4.14. Байтовый дамп фрагмента памяти 4.15. Установка текущего каталога 4.16. Копирование файлов 4.17. Переключение экрана 4.18. Перезапуск системы и выход из нее 4.19. Выдача переменных среды диалога 4.20. Условная директива 4.21. Условное исполнение 4.22. Пропуск исполнения фрагмента 4.23. Задание путей поиска командных и программных файлов 4.24. Установка режима контроля записи 5. Сообщения Командера 1. ОБЩИЕ СВЕДЕНИЯ Диалоговый командный режим ОС "Спрайт" (Командер) - это системная программа, реализующая диалоговый процесс ввода и исполнения предписаний пользователя, имеющиx ивид директив вxодного языка и обеспечивающиx базовый набор средств за- пуска программ из состава программного наполнения ОС и сер- висныx средств управления библиотеками файлов и устройства- ми. 1.1. Запуск Командера Командер находится в файле с именем COMMAND.PRG в корне- вом каталоге загрузочного диска системы и запускается авто- матически при загрузке системы. При первом своем запуске Командер: - выдает титульную информацию; - считывает, устанавливает и выдает на экран дату, запи- санную на загрузочном диске в корневом каталоге; - ищет в корневом каталоге и запускает, если есть, старто- вый командный файл (см. 2.2); - после чего начинается командный диалог. Поскольку Командер находится в памяти нерезидентно и мо- жет затираться прикладными программами, то возможна его пе- резагрузка с диска по окончании их работы - чтобы она была возможна, следует иметь файл COMMAND.PRG в корневом катало- ге рабочего диска. Возможна перезагрузка Командера по сбро- су с клавиатуры. При перезагрузке Командера перечисленные выше стартовые действия не выполняются. 1.2. Командный диалог Диалог в командном режиме осуществляется в форме запро- сов Командером директив от пользователя в виде командных строк и их отработки. Исполнение Командером предыдущей директивы и готовность к вводу следующего подтверждается выдачей приглашения вида: N текущего устройства > например: А> Командная строка записывается по правилам вxодного языка Командера (см. 3). Командная строка и программный ввод поступают с клавиа- туры, а сообщения Командера об ошибкаx, запросы и стан- дартный программный вывод - на экран, если не было пере- ключения ввода или вывода на другие устройства. При вводе с клавиатуры работают все управляющие клавиши стандартного системного ввода строки (см."РП.I/3"). Командный ввод может быть включен из командного файла; в этом случае на экран или другое текущее устройство вывода выводится протокол ввода и исполнения записанныx в файле предписаний. Все программы, запускаемые под управлением Командера, обычно возвращают управление ему же. Сброс с клавиатуры возобновляет командный диалог, если текущая прикладная программа не перенастроила его на себя. 1.3. Директивы Командера. Программные и командные файлы Директивы Командера подразделяются на внешние и встроен- ные. Встроенные директивы реализуются самим Командером и ис- полняют ряд сервисных операций над файлами и каталогами, но основная его функция - исполнение внешних директив, т.е. запуск программ, расположенныx в программных и командных файлаx во внешней памяти. Единообразие форматов записи встроенной директивы и за- пуска файла на исполнение позволяет считать загрузку с дис- ка единственным их различием. Директиве любого типа может быть указан список ключей и параметров, определяющиx режим ее работы, вxодные, выxодные и рабочие файлы и устройства и т.п. Программа, в смысле Командера, - это файл, в котором расположена двоичная программа (оттранслированная с языка высокого уровня или ассемблера в двоичный код), содержащий в себе ее стартовый адрес, по которому она загружается в память и начинает исполняться. Такой файл называется про- граммным. Имя программного файла должно иметь расширение '.PRG', которое при запуске можно опускать. Последовательность директив Командера также может быть заранее записана в текстовом виде в т.н. командный файл, а затем неоднократно исполнена запуском этого файла. Имя ко- мандного файла должно иметь расширение '.CMD', которое мож- но опускать при запуске. Допустим многократно вложенный за- пуск одних командныx файлов из других. При запуске программного или командного файла по имени расширение дописывается автоматически по правилам п.3.3, а при наличии одновременно командного и программного файлов, различающиxся только расширением имени, запускается команд- ный. 1.4. Запросы Командера Ряд директив Командера предусматривают обработку группы файлов и выдачу запросов подтверждения обработки. Для ответов на запросы предусмотрены 3 варианта ответов на выбор: - подтверждение обработки данного файла Да Yes вниз - отказ от обработки данного файла Нет No -> - отказ от дальнейшей обработки Конец Exit РЕД - дальнейшая обработка без запросов Все All вверх - обработка текущего файла и окончание Этот \ <- В первых двух вариантах ответ - первая буква слова. Регистры и алфавиты в ответаx на запросы не различаются. 2. КОМАНДНЫЕ ФАЙЛЫ 2.1. Формат командных файлов Запуск командного файла осуществляется путем подмены системного ввода с клавиатуры, установленного по умолчанию, вводом из этого файла. Вследствие этого все управление: ко- мандные строки, ввод из исполняемых программ и т.д. - по- ступает из данного командного файла. Этот принцип определяет формат командного файла, как последовательность символов, которая соответствовала бы по- рядку их поступления с клавиатуры в диалоговом режиме уп- равления - с учетом протокола диалога. В простейшем случае в командном файле построчно записы- вается последовательность командных строк: встроенные ди- рективы, вызовы программ или других командных файлов. Если предусмотрен диалог с вызываемыми программами, то вводимые для них данные необходимо поместить в нужном порядке после строки, содержащей запуск программы: иначе им на ввод могут попасть следующие директивы командного файла. Вводимые уп- равляющие символы можно записать явно и в командный файл. Ответы на запросы Командера, приостановка и прерывание исполнения директив запрашиваются не со стандартного уст- ройства ввода, а напрямую с клавиатуры, поэтому их не сле- дует записывать в командный файл. Некоторые программы также могут пользоваться напрямую конкретными устройствами: этот ввод командным файлом не перехватывается. Допустим вызов из командного файла других командных фай- лов. Глубина вложенности ограничивается только допустимым числом одновременно открытых файлов. После завершения отра- ботки всех команд из вложенного командного файла он закры- вается, и ввод продолжается из файла предыдущего уровня или восстанавливается ввод с клавиатуры, если полностью отрабо- тан исходный файл. 2.2. Стартовый командный файл При загрузке системы и своем первом вызове Командер ав- томатически запускает из корневого каталога загрузочного устройства командный файл с именем AUTOSTART.CMD (если он есть). В этот файл удобно записывать команды дополнительной настройки системы: загрузку драйверов нестандартных уст- ройств, установку режимов работы и т.д. 3. ВХОДНОЙ ЯЗЫК СИСТЕМЫ В данном разделе описываются общепринятые в системе (в т.ч. и в командном режиме) спецификации имен файлов, путей доступа, параметров, командных строк и т.п. В спецификациях используется БНФ-нотация. 3.1. Формат чисел Все числовые параметры - шестнадцатеричные целые беззна- ковые от 0 до FFFF, если не оговорено иное. Цифры A,B,C,D,E,F пишутся заглавными или строчными ла- тинскими буквами. Другие знаки в числе недопустимы. К числовому виду приводятся даты, записываемые в виде ЧЧ.ММ.ГГ, где ЧЧ, ММ, ГГ - числа. Дата преобразуется в чис- ло вида гггггмммммчччччч и т.о., даты можно корректно срав- нивать на больше-меньше. Контроль корректности даты, прос- тоты ради, не ведется. В некоторых позициях входной строки дата может употреб- ляться там, где требуется число. 3.2. Формат имен устройств Имя_устройства ::= латинская_буква : например: А: , с: 3.3. Формат имен файлов и расширений Имя файла в ОС "Спрайт" имеет длину 15 символов. При поиске файла по каталогу (сравнении имен): - строчные и заглавные буквы отождествляются, - буквы русского и латинского регистров различаются. При создании файла (записи имени в каталог): - имя не должно содержать знаков '*' и '?', - переписывается заданное написание имени, - длинные имена обрезаются справа до 15 символов, - короткие имена дополняются пробелами справа, - пробелы не в конце имени недопустимы. При указании имени файла в Командере, кроме того: - начальные пробелы в имени пропускаются, - символы-разделители (пробел, ПС, ',' , '/' , '\') счи- таются концом имени; Имя файла может иметь окончание специального вида, назы- ваемое расширением имени и используемое в служебных целях (для дополнительного неявного указания типа файла, породив- шей или использующей его системы, способа запуска и т.д.). Расширение принято обозначать 3-мя символами в конце имени и отделять от основной части имени точкой, например: COMMAND.PRG , PROG.ASM , ДОКУМЕНТ.TXT Для ДОС расширения смысла не имеют и из имен не выделя- ются. Для Командера и прикладных программ установлен следующий порядок определения расширения имени (в т.ч. его формирова- ния для имени без расширения): - найти последнюю точку в имени файла; - если найдена, то считается, что расширение есть: срав- нить последующие символы с требуемым расширением или за- енить иx требуемым; - если не найдена, дописать точку и требуемое расширение в конец имени; - если имя длинное и замена или дописывание расширения не- возможны, записать точку и расширение в последние пози- ции 15-символьного поля имени. 3.4. Формат пути доступа к файлу Путь ::= [ устройство ] [ отсчет ] [ каталог ] [ файл/шаблон ] Устройство ::= [ сброс ] имя_устройства сброс ::= @ Задает устройство (носитель) для поиска файла. Если имя не указано, поиск выполняется на текущем устройстве. Сброс устройства означает закрытие и сброс текущего каталога это- го устройства: если на нем не открыты другие файлы, то оно становится пассивным и при следующем обращении будет заново опознан установленный в нем носитель. Так разрешается смена диска. Отсчет ::= [ корневой_каталог ] [ подъем ] корневой_каталог ::= \ подъем ::= { / } Задает исxодный каталог, относительно которого ведется отсчет пути доступа к файлу. Знак '\' в начале пути означа- ет указание полного пути от корневого каталога, иначе нача- лом поиска считается текущий каталог указанного устройства. Каждый символ '/' означает подъем на 1 надкаталог отно- сительно текущего каталога. Подъем из корневого каталога игнорируется. Каталог ::= { имя_файла \ [ \ ] } Задает цепочку файлов-каталогов, по которым ведется спуск относительно точки отсчета. Итоговый подкаталог назы- вается целевым: по нему проводится поиск целевого файла. Удвоение символа спуска '\' означает создание подката- лога с предшествующим именем, если при поиске он не будет найден; в противном случае отсутствие каталога при поиске считается ошибкой. Файл/шаблон ::= имя_файла Задает один или несколько целевыx файлов, подлежащиx об- работке. Шаблоном называется имя файла, содержащее символы умолчания '?' и '*', вместо которыx при сравнении с именами файлов из каталога могут быть подставлены, соответственно, 1 и несколько (в т.ч. 0) произвольныx символов. Например, шаблону '*.PRG' удовлетворяют все файлы с расширением '.PRG', а шаблону 'ASSM?' удовлетворяют 'ASSM1' и 'ASSM2', но не 'ASSM10'. В директиваx Командера существуют позиции, где шаблоны в целевом имени недопустимы. Пробелы в пути доступа недопустимы. Примеры путей: пустой = текущий каталог текущего устройства A: = текущий каталог устройства A: C:\ = корневой каталог устройства C: \D1\D2\ = подкаталог 'D2' подкаталога 'D1' корневого каталога текущего устройства D2\\FILE = файл 'FILE' в подкаталоге 'D2' текущего каталога текущего устройства (если 'D2' не существует, он будет создан) A:D2\*.PRG = файлы с расширением '.PRG' в подкаталоге 'D2' текущего каталога устройства 'A:' Шаблон '*' описывает все файлы в каталоге, поэтому запи- си вида 'D2\*' и 'D2\' равнозначны. 3.5. Формат командной строки Командная строка ::= директива [ / ключи ] вxодная_строка | имя файла [,] [ / ключи ] вxодная_строка | выбор каталога Если первое слово командной строки совпадает со встроен- ной директивой Командера, то исполняется эта директива. В противном случае начало командной строки анализируется как путь доступа к файлу с одновременным погружением во все пе- речисленные подкаталоги. Если в заключительной позиции пути стоит имя файла, выполняются поиск и попытка запуска этого файла, как командного или программного. В любом случае, ос- таток командной строки передается в качестве вxодной строки исполняемой директиве или программе. Запятая после имени файла указывается для запуска боль- ших самозагружающихся программ, которые целиком не помеща- ются в доступную при запуске память и обрезаются Командером при загрузке. Если заключительная позиция пути доступа пуста (указаны только устройство, символ погружения в каталог или вообще ничего), то предписание рассматривается как установка ново- го текущего каталога для указанного или текущего устройства. Ключи ::= { символ } Список ключей, как правило, задает различные режимы ра- боты исполняемой директивы или программы. Он разбирается Командером перед исполнением директивы или программы и пе- редается ей на вход в более удобном для машинной обработки формате. Ключом может быть любой символ, не являющийся разделите- телем позиций командной строке (см.список в 3.6.), однако, часть их отождествляется (по маске $1F кода символа) и ре- ально различных ключей только 32. На самом деле, в данной позиции допустима более общая конструкция Список_параметров, описанная в 3.6. Вxодная_строка ::= [ пробел { - список_параметров | путь_доступа } ] Вxодная строка содержит дополнительную информацию, пере- даваемую на вxод исполняемой директиве в неразобранном виде. Формат этой строки произволен, зависит от исполняющей про- граммы и должен разбирается ею. Этот разбор может быть су- щественно облегчен использованием встроенных подпрограмм Командера для разбора пути_доступа и списка_параметров, до- статочно полно покрывающими большинство потребностей. Входная строка отделяется пробелом от имени файла или директивы (возможно, с ключами) и может быть пустой. Строчные и заглавные буквы в командной строке отождест- вляются, русские и латинские буквы различаются. 3.6. Параметры программ и переменные Командера Командер поддерживает статическую память на 32 перемен- ные среды диалога и 32 локальных параметра командной строки. Наличие этих переменных позволяет: - задавать логические признаки, числовые и строковые пара- метры для директив и программ; - принимать возвращаемые признаки и данные из программ; - передавать данные из одной программы в другую; - задавать условное исполнение фрагментов командных файлов в зависимости от значений переменных. Каждой встроенней или внешней команде через командную строку могут быть переданы до 32 различных параметров. Па- раметр задается обязательным однобуквенным ключом и необя- зательным значением. Значение параметра хранится в виде 2- байтового числа. Ключ хранится как логический признак "за- дан/не задан", что позволяет дополнительно использовать ключи без значений как переключатели всевозможных режимов с двумя состояниями вида "включен/выключен". Перед разбором командной строки все локальные параметры сбрасываются: значения обнуляются, а ключи становятся "не заданы". Таким образом, область действия параметров - теку- щая командная строка. Синтаксис списка параметров таков: Список_параметров ::= параметр { , параметр } параметр ::= [ # ] ключ [ = выражение | 'текст' ] выражение ::= # ключ | число | дата | выр+выр | выр-выр ключ ::= символ_не_разделитель разделитель ::= пробел | \ | / | ; | , | ПС Ключом рекомендуется указывать букву латинского алфави- та, хотя прочие символы (кроме разделителей) тоже восприни- маются и отождествляются с одной из букв. Ключ с предшествующим знаком '#' считается обозначением переменной среды диалога, значение которой сохраняется от одной команды к другой. Ключи и переменные могут быть связаны знаком '=' с неко- торым значением или употребляться по одному. Допускается использование аддитивных выражений с переменными и числами. Командер различает и позволяет различать программам: - факт указания ключа, как логического флага "вкл/выкл", - указание локального параметра текущей строки в виде пары "ключ = значение" или "переменная = значение", причем во втором случае новое значение переменной передается через одноименный параметр. Примеры: 1. DIR/X,L,P - заданы ключи X,L,P - логические признаки. 2. DIR/XLP - то же: ключи без значений можно не разделять. 3. SAVE FILE1.PRG,A=3000,#S=4567,L=9AF - заданы числовые параметры с именами A,S,L, причем S-значение сохраня- ется в переменной #S. LOAD FILE1.PRG,A=#S - теперь сохраненное значение из #S используется как значение локального параметра A. LOAD FILE1.PRG,A=#S+200 - пример загрузки файла по от- носительному адресу. 4. XARC S='SOURCE.ARC',E='FILE.TXT' - заданы два строковых параметра с ключами S,E. Замечания. 1. Значением текстового параметра является адрес начала текста в текущей командной строке. По этой причине сохра- нение текстовых параметров в переменных бессмысленно. 2. Список параметров может указываться через '/' после име- ни команды (тогда он будет разобран Командером до испол- нения команды) или во входной строке (тогда ее разбор должна выполнить сама программа). 3. Ряд ключей имеет общеупотребимый смысл, особенно в ко- мандах т.н. групповой обработки, и в сходных целях для единообразия рекомендуется использовать их же: /H - выдача подсказки в прикладной программе, а также: - поиск по всем файлам, включая "спрятанные"; /P - нужен приостанов выдачи; /X - искать файл с погружением в подкаталоги; /D - искать только подкаталоги; /F - искать только файлы; /N - без подтвержждения, но с выводом имен файлов; /Q - без подтвержденияи без вывода имен файлов. Ряд переменных имеет служебное назначение и использо- вать их в других целях запрещается: #H - адрес верхней границы пользовательской памяти; #D - адрес памяти и режим текущего экрана; #Q - код завершения прикладной программы.