📂 Документ: orion128-soft-cpm80-v241-osdos_clean.html


 

OS DOS V2.41 Орион-128, CP/M-80, описание

Орион Софт OS-DOS V2.41

Продаю платы и наборы микросхем, куплю микросхемы

Все версии CP/M-80

Все версии ORDOS

Все программы ORDOS

CMP/80 авторская cpm/80 2.41

OS DOS от Орион СОФТ,  CP/M-80, дискеты 3,5 и 5,25 дюйма - 720 к, эмулятор Готек

 Авторский контроллер НГМД. Мы собираем именно такой и на нем работаем.  Читайте про пакет Атлас. Также дискеты можно работать из ORDOS с пакетом программ Атлас. Атлас понимает формат файлов BRU.

Дискеты должны быть отформатированы в OS DOS (CP/M-80) программой FORMAT.COM

CPM.TX

 OrionSoft - Disk Operating System "OS-DOS" Версия V2.41,  1993г

OS DOS V2.41 Орион-128, CP/M-80, описание

Отличительные особенности от предыдущей версии - 2.30/1- внутренние комманды bios, доступные при непосредственном вводе и пакетном режиме.

- "не исчезающий курсор" на экран дисплея- "псевдо-аппаратный" ввод с клавиатуры
- высокая скорость и надежность доступа к диску
- драйвер печати подключается по принципу "lpt-ordos"
- autoexec.bat - пакетное выполнение команд при начальной загрузке системы ( "холодном" старте )
- выполнение ват-файлов наравне с сом-файлами

Внутренние команды "BIOS"

OS-DOS V2.41 предоставляет возможность выполнения внутренних команд bios, как в непосредственном режиме, так и в пакетном - autoexec.bat в непосредственном режиме внутренние команды активизируются через клавишу-ключ {f1}. при этом на экране появится символ "*" (промпт режима), и рядом с ним мигающий  курсор. Далее вводится команда, нажатием на соответствующую клавишу. для возврата кода самой клавиши - {f1} необходимо нажать ее повторно. Выключается режим повторным вводом соответствующей команды, или командой общего сброса режимов - "reset".

BIOS поддерживает 8 команд:

1. Вывод информации в кодировке кои-8 - клавиша {s} (simbol). Данная команда не выполняет полное эмулирование "кои-8", но позволяет оперативно работать с программами (просматривать тексты) без загрузки дополнительных знакогенератов и драйверов. В этом режиме латинские и русские строчные буквы кои-8 отображаются, соответственно, латинскими и русскими прописными буквами.

2. Обслуживание управляющих кодов компьютера "robotron-1715" - клавиша {т} (тv). Программы "robotron-1715", в качестве управляющих кодов дисплея (очистка экрана, установка курсора и др.), используют коды, которые в большинстве случаев отличаются от кодов, применяемых в "Орионе-128". Команду следует включать перед запуском "роботроновских" программ. Эта проблема может решаться также и с помощью загрузки дополнительных драйверов.

3. Форма курсора - клавиша {м} (marker). Команда позволяет выбрать две формы курсора - в виде инвертированного знакоместа или привычной черточки. По умолчанию устанавливается последняя.

4. Вывод информации об установленных режимах - клавиша {?} (what ..??) информацию можно запрашивать в любой текущий момент заполнения командной строки операционной системы или
пользовательской программы. последующее нажатие любой клавиши вытирает информацию об установленных режимах и восстанавливает положение курсора для продолжения ввода.

5. Сброс установленных режимов в исходное состояние - клавиша {r} (reset). Оперативно выключает все ранее установленные режимы. Команда "reset" не распространяется на команду "indic". Выключить установленные режимы можно и повторным вводом команды.

6. Выход по "горячему" старту OS-DOS - клавиша {q} (quit). Применяется в ситуациях (в основном при запуске новых программ), когда вы не знаете как вернуться в операционную систему, а нажатие {f4} или {ус}/{c} не помогает. В этом случае ввод команды "quit" позволяет завершить работу с программой без нажатия клавиши {сброс}. Следует помнить, что команда доступна только в тех ситуациях, когда программа пользователя не блокирует доступ к клавиатуре. После холодной загрузки системы включены: цвет и устанавливается режим клавиатуры - ввод латинских букв. Остальные команды bios находятся в выключенном состоянии.

Вывод курсора на экран.

Работая с нашей предыдущей версией os-dos 2.3x, вы уже заметили, что во многих программах курсор исчезал и появлялся только в момент нажатия на клавишу. Этот недостаток значительно усложнял работу со многими программами. В новых версия os-dos мы устранили этот недостаток, и курсор сохраняется на экране постоянно, правда, в некоторые моменты он перестает мигать, но в любом случае показывает местоположение будущего символа. Указанные доработки не снижают скорость вывода информации на экран.

Автозапуск при "холодном" старте.

Если при запуске os-dos вам приходится постоянно запускать вспомогательные программы (драйверы клавиатуры, экрана, дисководов, квазидисков и т.д. ), или выполнять одну и ту же последовательность команд os-dos, то можно занести их в текстовый файл, названный autoexec.bat, и разместить его на загрузочной дискете.
Принцип вам уже знаком по файлу "setup.tx" для "ordos" v4.xx. Прерывается выполнение командного файла удерживанием нажатой любой символьной клавиши.
Пакетный файл (в том числе и autoexec.bat) можно  запустить на выполнение также как и сом-файл. Разница лишь в том, что при запуске сом-файла расширение опускается, а при запуске на выполнение ват-файла расширение обязательно вводится.
Наличие возможности выполнять ват-файлы в командном режиме позволяет упростить процесс запуска сложных программ, а так же упростить сложные, монотонно повторяющиеся управленческие операции.
К примеру, пользователь пишет программы на ассемблере под управлением ср/m. Процесс получения обьектового кода (кода пригодного для выполнения процессором) значительно сложнее, чем под "ordos" и состоит из нескольких этапов.
Во-первых, вызывается редактор, где в командной строке указывается имя файла для редактирования. После написания программы запускается транслятор ассемблера и в командной строке также указывается имя ранее созданного редактором файла (некоторые трансляторы требуют указать еще и имена файлов, которые будут созданы в процессе работы) и ключи управления. после трансляции получается всего лишь промежуточный код, который преобразовывается в исполняемый (обьектовый) с помощью программы "link". "link" так же имеет свой синтаксис вызова. если учесть, что программу приходится многократно исправлять, то становится очевидно - какую рутинную работу выполняет программист.
Все это можно автоматизировать, если создать ват-файл для каждого этапа - написания (или редактирования) и трансляции файла.
Следует только иметь в виду, что данная ват-система не позволяет создавать многократно вложенные ват-файлы, т.е вызывать дополнительные ват-файлы как подпрограммы в основном ват-файле. В данном варианте, при выполнении дополнительного  ват-файла управление к оставшейся части основного ват-файла не происходит. тем не менее это ограничение не мешает создавать ват-файлы для большинства случаев. Если же потребуются более сложные варианты - необходимо применять программу "submit.com". Пакетный файл можно написать любым текстовым редактором. В том числе и "edit$" или "avi$" (в этом случае файл на диск  записывается директивой "save" и используется os-dos48k).
Каждая командная строка пишется отдельной строчкой и  заканчивается - {вк}. Ват-файл может состоять из двух типов строк - команды bios и команды консольного процессора.
Перечень команд bios и их назначение мы приводили ранее и  сейчас рассмотрим синтаксис.

*simbol - вкл/выкл. кои-8
*tv - вкл/выкл. управление r1715
*marker - изменить форму курсора
*reset - сброс (выкл) режимов
*? - текущая индик.режимов
*quit - возврат в програм.пользователя

Начинается команда bios с символа "*". значащей является только первый символ команды. остальные символы можно опускать или вводить для улучшения читабельности.
Синтаксис команд ccp ни чем не отличаются от ручного их ввода. к примеру: ват-файл для ассемблирования и создания com-файла.

asm prog.aaa
dir prog.* (вторая и четвертая строки
load prog могут отсутствовать)
type prog.prn

Порядок размещения команд bios и команд ccp в ват-файле не имеет ограничений и определяется логикой выполняемых  действий.
Если ват-файл создается редактором под ordos, то необходимо изменить адрес посадки текстового файла на 100н и "сбросить его в озу. Записывают на диск ват-файл директивой "save" с  расширением ".bat". Понятно, что это можно сделать только под os-dos v2.41, которая не конфликтует с "ORDOS".
Если вы используете редакторы "wm.сом", "ws.сом" или "med.com", то проблем не будет с любой версией os-dos. Директивой "type" вы можете посмотреть на диске содержимое нашего ват-файла, с тем, чтобы лучше понять его порядок построения.

Редактирование и управление выводом

os-dos v2.41 имеет упорядоченное количество управляющих символов. упразднены ctrl-коды, потерявшие актуальность в современных компьютерных системах.

{вк} - конец ввода ком.строки
{влево} - стирание последнего символа. курсор влево
{забой} - стереть строку
{ус}/{p} - копировать весь дальнейший вывод на консоль на
печатующее устройство
{ус}/{s} - временная приостановка вывода на консоль
{ус}/{c} - "горячий" старт ( перезагрузка bdos и ccp )
{f4} - -------"------

Изменена директива "type". В сравнении со стандартной CP/M-80 текст выводится по странично. Для продолжения вывода следующей страницы текста необходимо нажать любую символьную клавишу. Выход из дерективы - ctrl/c или {f4}. В именах файлов недопустимо использовать следующие знаки пунктуации:

< > . , ; : = ? * { }

Исключение составляет символ "" (подчеркивание). Он может использоваться как составной символ в имени файла, что не допускала стандартная ср/м.

Сообщения об ошибках BDOS

консольный процессор - сср может выводить следующие  сообщения:

- all (y/n)? - "все?" - выводится при уничтожении файлов оптом в директиве "era".
- disk full!! - диск полон!!
- file exists - повторный файл
- read error! - ошибка чтения
- no file - нет файла

сообщения, выводимые bdos, начинаются с сообщения:

"bdos err on d:"  где d - имя диска. Далее, в той же строке выводится тип ошибки:

- bad sector - ошибка при чтении/записи.
- select - неверная адресация дисковода (буква вне диапазона a-в).
- file r/o - данный файл командой stat назначен 'только для чтения'.

CPM1.TX Системные функции BDOS

Системные функции BDOS доступны пользователю только на логическом уровне ввода/вывода информации на диск и осуществляются через буфер обмена. Системный буфер обмена (по умолчанию) располагается по адресу 0080Н. Этот адрес может быть изменен функцией "Установить адрес буфера обмена" (Функция 26).
Операции с каталогом выполняются в резервном буфере, расположенном в теле BIOS, и не оказывают влияния на буфер обмена, за исключением функции "Поиск первого" и "Поиск следующего".

Функция 0. Процедура "горячий старт".
Вход: Регистр С=00Н
Процедура "горячий старт" загружает в память компьютера модули ССР и BDOS OS-DOS. Управление передается ССР, при этом активным становится диск "А". Действие функции эквивалентно
переходу по адресу 0000Н.

Функция 1. Консольный ввод.
Вход: Регистр С=01Н
Выход:Регистр А= код символа
Функция вводит с клавиатуры символ и возвращает его программе в регистр "А". Отображаемые символы и управляющие - CR
(Возврат каретки), LF (Перевод строки), BSP (Забой) выводятся с эхом на экран. Ввод управляющего символа CTRL/I (ТАВ) перемещает курсор на 8 позиций вправо. Осуществляется проверка на включение или выключение режима параллельной печати - CTRL/P (если загружен драйвер обслуживания принтера) и останов/пуск вывода информации на экран - CTRL/S. Функция находится в режиме ожидания до тех пор, пока не будет повторно нажата клавиша.

Функция 2. Вывод символа на консоль.
Вход: Регистр С=02Н
Выход:Регистр Е= код выводимого символа Заданный в регистре "Е" символ (в пределах таблицы ASCII) выводится на экран дисплея. Аналогично функции 1 осуществляется проверка в наличии управляющих символов CTRL/I, CTRL/S, CTRL/P и др.

Функция 3. Ввод символа с логического устройства READER - перфосчитывателя.
Вход: Регистр С=03Н
Выход: Регистр А= код введенного символа В разработанных авторами до настоящего версиях OS-DOS функция не выполняется и имеет "заглушку" на уровне вектора BIOS.
Запланировано функции 3 и 4 переопределить для драйверов работы с сетью посредством загружаемого драйвера.

Функция 4. Вывод символа на логическое устройство PUSCH - перфоратор.
Вход: Регистр С=04Н
Регистр Е= код выводимого символа
Также как и функция 3 не выполняется и имеет "заглушку" на уровне вектора BIOS.

Функция 5. Вывод символа на логическое устройство
LIST - принтер
Вход: Регистр С=05Н
Регистр Е= код выводимого символа
До загрузки внешнего драйвера обслуживания принтера функция не выполняется и имеет "заглушку" на уровне вектора BIOS.

Функция 6. Ввод/вывод символа с консоли без эха (без отображения на дисплее).
Вход: Регистр С=06Н
Регистр Е= 0FFH или 0FEH - при вводе
E= код выводимого символа - при выводе
Выход:Регистр А= введенный символ или статус консоли
Если в регистре "Е" задано 0FFH (ввод символа без эха/ опрос статуса),то в регистре "А" возвращается:
- 00Н, если консоль не готова к вводу символа;
- введенный символ при готовности консоли.
Если в регистре "Е" задано 0FEH (только опрос статуса), то в регистре "А" возвращается:
- 00Н, если консоль не готова;
- ненулевое значение при готовности консоли.
Если в регистре "Е" задан код, отличный от 0FFH или 0FEH, педполагается, что это код выводимого символа. Проверка на наличие, ранее указанных управляющих символов, не производится.

Функция 7. Получить байт назначения устройств (БНУ)
Вход: Регистр С=07Н
Выход:Регистр А= значение БНУ

Функция 8. Установка байта назначения устройств
Вход: Регистр С=08Н
Регистр Е= новое значения БНУ

Функция 9. Вывод символьной строки
Вход: Регистр С= 09Н
Регистр DЕ= адрес выводимой строки
Эта функция выводит на консоль символьную строку, находящуюся по адресу, указанному в DE. Строка должна заканчиваться символом "$", который сам не выводится, а является признаком конца строки. При выполнении этой функции осуществляется проверка на управляющие символы CTRL/S, CTRL/P, CTRL/I.

Функция 10Системные функции BDOS. Чтение в консольный буфер
Вход: Регистр С=0АН
Регистр DЕ= адрес буфера
Выход: Введенные символы в консольном буфере
Эта функция читает набираемую на консоли последовательность символов (строку) в буфер по адресу, указанному в регистровой паре DE.
Буфер для чтения имеет следующий формат:

DE:
..............................................
: MX : NC : C1 : C2 : Cn . . . . . ????:
:....:....:....:....:........................:

Где "МХ" - максимальное число символов, которые могут быть введены в данный буфер (задается программой пользователя от 1 до 255);
"NC" - число записанных символов в буфер, производится самой функцией.
С1,С2... - символы, прочитанные с консоли. Символы "?" изображают неинициализированный остаток буфера.
Выход из функции происходит:
- при вводе управляющего символа CR или LF.
- при вводе максимального числа символов.
В процессе записи набираемой строки содержимое буфера может быть отредактировано путем ввода следующих управляющих сиволов:
CTRL/C - вызов процедуры "горячий старт" (если CTRL/C в начале строки);
CTRL/Р - включение/выключение режима параллельной печати;
ЗАБОЙ - стирание буфера и введенной строки на экране.
Курсор возвращается в ту позицию строки, в которой был окончен запрос на ввод в буфер.

Функция 11. Опрос статуса консоли (клавиатуры)
Вход: Регистр С=0ВН
Регистр А= статус консоли
Функция опроса статуса консоли позволяет проверить факт ввода символа с клавиатуры. Если символ введен, в регистре "А" возвращается значение 01Н. В противном случае - А=00Н.

Функция 12. Запрос номера версии системы
Вход: Регистр С=0СН
Выход: Регистр HL= 0022Н - номер версии - СРМ 2.2
С=24 - OS-DOS V2.4X
С=26 - OS-DOS V2.6X

Функция 13. Сброс всех дисководов
Вход: Регистр С=0DН
Применяется при замене дискеты без "теплого старта"
(CTRL/C), который приводит к прерыванию программы. Смена дискеты без "теплого старта" или выполнения функции 13 приводит к ошибке ввода/вывода, а в некоторых случаях к порче каталога дискеты. После выполнения функции активным становится дисковод "А", при этом со всех дисководов снимается статус "R/O"
(см.функцию 28), текущий адрес буфера обмена (DMA) равен 0080Н.

Функция 14. Активизировать диск
Вход: Регистр С= 0ЕН
Регистр Е= номер диска (0-диск "А", 1-диск "В")
После активизации диск считается установленным до следующего "холодного/горячего старта" или "сброс дисков" (функция 13). Дальнейшие файловые операции будут производиться с активизированным диском, если номер диска в буфере FCB равен нулю.
Номера дисков 1 и 2 в буфере FCB ссылаются соответственно на диски А и В.
Если установленный диск заменяется в процесс работы, то он автоматически переводится в режим "R/O" (только чтение).

Функция 15. Открытие файла
Вход: Регистр С=0FН
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция используется для записи в буфер информации о размещении заданного файла. Перед обращением программист должен заполнить с 0 по 12 байт буфера FCB. При выполнении функции информация из описателя каталога копируется в соответствующие байты буфера FCB, а регистре "А" возвращается индекс найденного описателя.
Если совпадающий описатель не найден (а проще - имя в каталоге), то в регистре "А" возвращается 0FFH.
Таким образом открытие файла обеспечивает доступ к нему для всех операций. При последовательном обращении к файлу, поле текущего номера записи (байт 32 буфера FCB) должно сбрасываться в 0.

Функция 16. Закрытие файла
Вход: Регистр С=10Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция осуществляет запись текущей информации из буфера FCB в соответствующий описатель файла в каталоге диска. При успешном завершении операции в регистре "А" возвращается индекс описателя в записи каталога. В противном случае А=0FFH.
При выполнении только операции чтения закрывать файл необязательно. Если использовалась операция записи в файл, то выполнение функции "Закрытие файла" обязательно для занесения
полной информации о файле в каталог диска.

Функция 17. Поиск первого
Вход: Регистр С=11Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция осуществляет поиск в каталоге заданного диска первого описателя, соответствующего заданному в буфере FCB. Если такой описатель найден, то в регистре "А" возвращается его индекс, а в буфере обмена (по DMA) - запись каталога, содержащая найденный описатель. Таким образом относительный начальный адрес найденного описателя в буфере обмена будет равен А*32.
Если соответствующий описатель не найден, то в регистре "А" возвращается 0FFH. Если буфер FCB в позиции соответствующей номеру диска, содержит символ "?"(код 3FH), то выбирается первый описатель каталога активизированного диска. Этот случай используется для просмотра текущего состояния всех описателей каталога активизированного диска (см.функцию 18).

Функция 18. Поиск следующего
Вход: Регистр С=12Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция "поиск следующего" аналогична функции "поиск первого", за исключением того, что просмотр каталога начинается с последнего описателя, совпавшего с заданным буфером FCB. Если
соответствующий элемент не найден, то в регистре "А" возвращается 0FFH.

Функция 19. Стирание файла
Вход: Регистр С=13Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция стирает в каталоге диска все описатели файла (файлов), имя которого задано в буфере FCB. Поле номера диска не может содержать символ "?" (код 3FH).
Если соответствующий описатель найден в каталоге, в регистре "А" возвращается его индекс, подтверждающий выполнение операции, в противном случае возвращается 0FFH.

Функция 20. Последовательное чтение
Вход: Регистр С=14Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция читает 128 байтовую запись из файла, имя которого задано в буфере FCB, в буфер обмена. Буфер FCB должен содержать информацию о размещении файла на диске, для чего необходимо предварительно открыть файл (функция 15).
Чтение записи происходит из текущего екстента с текущим номером, с последующим прибавлением единицы, т.е. устанавливается номер следующей записи. Если поле текущего номера записи переполняется, то следующая операция чтения автоматически открывает следующий экстент и поле текущего номера записи обнуляется.
Если операция чтения прошла успешно, в регистре "А" возвращается 00Н, в противном случае значение отличное от нуля.

Функция 21. Последовательная запись
Вход: Регистр С=15Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция заносит 128-байтовую запись из буфера обмена в файл, имя которого указано в буфере FCB. Буфер FCB должен содержать информацию о размещении файла (предварительное выполнение функции 15 или 22). Запись помещается в текущий экстентс текущим номером и к полю текущего номера записи прибавляется единица, т.е. устанавливается номер следующей записи. Если поле текущего номера записи переполняется, то для следующей записи автоматически открывается следующий экстент, а поле текущего номера записи обнуляется. Операция записи может происходить в ранее созданный файл, в этом случае вновь занесенные записи помещаются в те же блоки, что и ранее существовавшие в файле.
Если операция прошла успешно, то в регистре "А" возвращается 00Н, в противном случае - ненулевое значение.

Функция 22. Создание файла.
Вход: Регистр С=16Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция заполняет описатель файла нулями байты с 13 по 31 буфера FCB и записывает в каталог диска. Таким образом, функция "создание файла" так же, как и функция 15, обеспечивает доступ к файлу для всех операций. Байты с 0 по 12 буфера FCB заполняет пользователь. Они включают номер диска, имя и расширение файла. Следует помнить, что дублирование имен на одном диске не допускается. В этом необходимо убедиться, выполнив предварительно функцию 17.
При успешном окончании операции А=00Н, если в каталоге нет места (на диске записано уже 128 описателей), то в регистре "А" возвращается 0FFH.

Функция 23. Переименование файла.
Вход: Регистр С=17Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция заменяет имя файла (с расширением), заданное в байтах с 0 по 12 в буфере FCB, адрес которого указан в DE, на имя, заданное в байтах с 16 по 28 того же буфера FCB. Номер диска задается только в нулевом байте буфера FCB, байт 16 - всегда содержит 00Н.
Если переименование прошло успешно, в регистре "А" возвращается индекс описателя в каталоге, в противном случае - 0FFH.

Функция 24. Получить вектор активных дисков
Вход: Регистр С=18Н
Выход:Регистр HL= вектор действующих дисков
Вектор активных дисков представляет собой 16-битную величину и возвращается в регистре HL. Первый значащий бит регистра "L" соответствует диску "А", второй бит - диску "В". Нулевое значение бита означает, что соответствующий диск не установлен (не активизирован), единица - установлен функцией "Активизация диска" или одной из операций над файлом с явным заданием номера диска в поле номера диска буфера FCB.

Функция 25. Получить номер (имя) текущего диска
Вход: Регистр С=19Н
Выход:Регистр А= номер текущего диска
Функция возвращает в регистре "А" номер активного диска.
А=00Н - диск "А", А=01Н - диск "В".

Функция 26. Установить адрес буфера обмена (DMA)
Вход: Регистр С=1АН
Регистр DЕ= Адрес буфера обмена
Буфер обмена представляет собой 128-байтовую область памяти, через которую осуществляется чтение/запись информации файла. Процедура "горячий/холодный старт" устанавливает буфер обмена по адресу 0080Н. Установленный адрес сохраняется до повторного вызова функции 26 с новым значением или выполнения процедуры "горячий/холодный старт".
Установив адрес буфера обмена и в цикле вызывая функцию "последовательное чтение", можно считать весь файл в память компьютера. Следует только не забывать после чтения каждой записи увеличивать адрес буфера обмена на 128 единиц.

Функция 27. Получить адрес вектора размещения блоков
Вход: Регистр С=1ВН
Выход:Регистр HL= начальный адрес вектора размещения
блоков для активизированного диска.
Вектор размещения блоков формируется в основной памяти для каждого установленного диска. Различные системные программы используют информацию, содержащуюся в векторе размещения блоков для определения величины свободной памяти на диске.

Функция 28. Записать ключ защиты записи на диска
Вход: Регистр С=1СН
Функция устанавливает временное запрещение записи на активизированный диск. В результате, вплоть до выполнения "горячего/холодного старта", любая попытка записи на активизированный диск вызовет сообщение об ошибке: BDOS ERR ON D: R/O, где D - имя диска

Функция 29. Получить вектор " R/O".
Вход: Регистр С=1DН
Выход:Регистр HL= значение вектора R/O
Функция возвращает в паре регистров HL битовый вектор, указывающий на диски, для которых установлен бит защиты записи R/O (только чтение). Младший значащий бит соответствует диску "А", второй - "В".

Функция 30. Установить атрибуты файла.
Вход: Регистр С=1ЕН
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= индекс описателя
Функция позволяет программно работать с индикатором доступа файла. Для файла, имя которого задано в буфере FCB, устанавливается индикатор доступа R/O (только чтение), если старший бит байта 9 буфера FCB содержит "1", или R/W (чтение/ запись), если этот бит содержит "0".

Функция 31. Получение адреса параметров дисковода
Вход: Регистр С=1FН
Выход:Регистр HL= адрес параметров дисковода.
Функция используется для получения адреса блока параметров активного дисковода. Блок параметров (количество дорожек, секторов на дорожке и т.д.) размещается в BIOS.

Функция 32. Установка/опрос кода пользователя (USER)
Вход: Регистр С=20Н
Регистр Е= 0FFH (опрос) или код пользователя
Выход:Регистр А= фактический код пользователя (при опросе) или без значения (при установке).

Функция 33. Прямое чтение
Вход: Регистр С=21Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= код ошибки
Прямое чтение аналогично последовательному чтению файла, за исключением того, что прямое чтение позволяет производить записи с произвольно указанным номером. Для обращения к функции необходимо предварительно открыть файл и занести номер записи в поле номера записи при прямом доступе (буфер FCB - байты 33 и 34, байт 35 должен быть предварительно обнулен, т.к. ненулевое значение этого байта означает переполнение диска). В регистре "А" возвращается либо код ошибки, либо 00Н, что означает благополучное завершение операции. В этом случае в буфере обмена содержится считанная запись.
В отличии от последовательного чтения при прямом чтении после ввода записи поле номера записи прямого доступа в буфере FCB не изменяется и при повторном чтении произведет повторный ввод записи в буфер обмена с тем же номером. Ошибки, возвращаемые в регистре "А" после выполнения операции прямого чтения, приведены ниже:
01 - чтение отсутсвующих записей;
03 - ошибка при закрытии текущего экстента;
04 - попытка открыть несуществующий экстент;
05 - переполнение каталога (при прямой записи);
06 - физический конец диска.
Коды ошибок 01 и 04 встречаются в случае, когда при операции прямого чтения достигнут блок данных, который до этого не был записан, или экстент, который до этого не был организован.
Код ошибки 03 обычно не появляется при нормальной работе системы. Она может быть снята при повторном чтении или открытии файла.
Код 06 встречается при ненулевом значении 35-го байта в буфере FCB.

Функция 34. Прямая запись
Вход: Регистр С=22Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= код ошибки
Функция записывает на диск данные, находящиеся в буфере обмена. Если экстент на диске или блок данных, в которые поизводится запись, еще не отведены, осуществляется их выделение на диске. Как и при прямом чтении, номер записи (33 и 34 байт в буфере FCB) не меняется в результате выполнения прямой записи. Текущий номер экстента и текущий номер записи в экстенте вычисляются по заданному номеру прямой записи и заносятся в соответствующие байты буфера FCB. Коды ошибок, возвращаемые функцией при прямой записи, идентичны кодам ошибок при прямом чтении, за исключением кода 05.

Функция 35. Вычисление размера файла.
Вход: Регистр С=23Н
Регистр DЕ= Адрес буфера FCB
Выход: Установка значения в номере поля записи при прямом доступе
Функция вычисляет размер файла, имя которого задано в буфере FCB, и возвращает его в байтах 33-35. Возвращаемый размер файла на самом деле на единицу меньше указанного значения.  Значение представляется в записях, т.е по 128 байт. Используя эту функцию, можно в конец существующего файла добавить дополнительные записи. Для этого следует:
 - получить номер (он уже увеличен на единицу) последней  записи при помощи функции 35;
- выполнить функцию "прямая запись" с этим номером;
- затем выполнить функцию "прямая запись" нужное количество раз, увеличивая каждый раз номер записи на единицу.
Если файл записан последовательно, действительный размер файла совпадает с числом записей в нем. Если файл создан в режиме прямого доступа, и в области размещения файла существуют "дырки", то фактическое число записей меньше, чем указано в его размере.

Функция 36. Установить номер записи для прямого доступа
Вход: Регистр С=24Н
Регистр DЕ= Адрес буфера FCB
Выход: Установка поля номера прямой записи
Функция является подготовительной и устанавливает номер записи прямого доступа (байты 33 и 34) по номеру текущего экстента и номеру текущей записи. Применяется при переходе из режима последовательного доступа в режим прямого.
К примеру, в процессе работы к файлу осуществляется последовательный доступ (чтение/запись) до соответствующей записи.
Затем вызывается функция 36 и вычисляется номер прямой записи, и, начиная с этой записи выполняют операции прямой записи/чтения.

Функции 37-39 в СР/М-80 версии 2.2 отсутствуют.

Функция 40. Прямая запись с заполнением нулями
Вход: Регистр С=28Н
Регистр DЕ= Адрес буфера FCB
Выход:Регистр А= код ошибки
Функция аналогична "прямой записи" за исключением того, что при выделении нового блока, он предварительно на диске заполняется нулями.
Функции, начиная со 160 (около двух десятков) используются в операционной среде WINDOWS, являющейся дальнейшим развитием авторского варианта СР/М для ПК "Орион-128". Новые функции включают средства работы с графическими спрайтами и экранными окнами, управление оверлейной памятью, набором знакогенераторов и шрифтов.

Структура файлов OS-DOS

В OS-DOS под диском подразумевается логическое устройство представляющее собой некоторую внешнюю запоминающую среду с прямим доступом, допускающую как чтение, так и запись.
Мы уже отмечали, что для "Ориона" установился "стандарт" на дисковод и дискеты - 80 дорожек (с каждой стороны дискеты) и двойная плотность записи. Напомним, что это относится к дисководам и дискетам формата 5.25 дюйма. Следует добавить, что авторский контроллер и OS-DOS поддерживают работу дисковода 3.5 дюйма (в режиме 720 Кбайт IBM PC). При этом сохраняются все "стандарты" дискеты 5.25 дюйма. Все дорожки дискеты размечены (это выполняет программа форматирования) на секторы по 1 Кбайту. Каждая дорожка (за дорожку будем считать обе стороны дискеты) содержит 10 секторов (т.е. 5 + 5 секторов с каждой стороны дискеты). Отсчет на до рожке начинается с сектора N1. Несложно вычислить, что полная емкость дискеты составит 800 Кбайт.
Однако не все пространство диска отведено пользователю. Логически диск разбивается на три составных области: - системная область. В ней размещается BOOT-сектор, ССР, BDOS и BIOS как единый блок, предназначенный для загрузки в память компьютера. Она занимает нулевую и первую дорожки, т.е. 20 Кбайт.
- область каталога, для размещения описателей файлов. Занимает первых четыре сектора на второй дорожке.
- область файлов. Все оставшееся пространство диска.
Пространство диска, отведенное под каталог и файлы, организовано блоками постоянной длины размером в два сектора, т.е  2 Кбайта. Это минимальная, логически учитываемая BDOS, единица измерения диска. Если сказать проще, то при записи файла даже размером в один байт - на диске для него будет отведен блок, т.е 2 Кбайта.
BDOS осуществляет обмен с диском (только посредством BIOS) по записям. Длина записи составляет 128 байт. В один сектор вмещается 8 записей. Только BIOS "знает" как в секторе расположены записи. Из-за такой двойной бухгалтерии "запись- сектор" конечно замедляется скорость обмена информацией с диском, но за то более рационально упаковывается информация, а следовательно и увеличилась полезная емкость дискеты. В области каталога размещаются описатели файлов. Размер описателя (блок управления файлом - FCB) - 32 байта. Он содержит имя файла, расширение и номера блоков в которые операционная система разместила файл и другую служебную информацию.

Пример размещения описателей файлов каталога приведен в таблице

2. Таблица условно разбита на две записи.
Один описатель расчитан на 16 Кбайт записываемой информации. Следовательно если файл дольше 16 Кбайт, то используется несколько описателей. Часть файла в 16 Кбайт называется экстентом. Поэтому если файл большой, то он состоит из нескольких экстентов, пронумерованных в порядке их создания. Несложно посчитать, что отведенное пространство под каталог допускает разместить 128 описателей. Однако этим невозможно гарантировать запись такого же количества файлов на дискету, если они имеют размер более 16 килобайт. В тоже время из-за блочного (по 2 Кбайта) принципа учета емкости диска, сохранение малых файлов приводит к его нерациональному использованию. Тем не менее со всем этим приходится мириться, с тем, чтобы иметь возможность создавать файлы с любым количеством записей - от нуля до полного использования диска (независимо от емкости диска, даже если это "Винчестер" на несколько десятков Мбайт).

Таблица 2.

0000 0041 5649 3130 3424 2042 5255 0000 0030 .AVI104$ BRU...0
0010 0200 0300 0400 0000 0000 0000 0000 0000 ................
0020 004B 4559 414C 5424 2042 5255 0000 0010 .KEYALT$ BRU....
0030 0500 0000 0000 0000 0000 0000 0000 0000 ................
0040 0046 5430 3120 2020 2042 5255 0000 0008 .FT01 BRU....
0050 0600 0000 0000 0000 0000 0000 0000 0000 ................
0060 0031 5F54 5820 2020 2042 5255 0000 0010 .1_ТХ BRU....
0070 0700 0000 0000 0000 0000 0000 0000 0000 ................

0080 0044 4F53 525F 5458 2042 5255 0000 0080 .DOSR_TX BRU....
0090 0800 0900 0A00 0B00 0C00 0D00 0E00 0F00 ................
00A0 0044 4F53 525F 5458 2042 5255 0100 0008 .DOSR_TX BRU....
00B0 1000 0000 0000 0000 0000 0000 0000 0000 ................
00C0 0044 4F53 525F 5458 2042 5255 0200 0080 .DOSR_TX BRU....
00D0 1100 1200 1300 1400 1500 1600 1700 1800 ................
00E0 E546 4344 525F 5458 2042 5255 0100 0060 .FCDR_TX BRU...`
00F0 1900 1A00 1B00 1C00 1D00 1E00 0000 0000 ................

При считывании одной записи каталога, в ней располагается четыре описателя. По месту положения описателя в записи, он имеет номер от 0 до 3 и называется индексом описателя, который и возвращается при выполнении ряда функций BDOS. При выполнении функции "открыть файл", операционная система переносит информацию из описателя (по данному файлу) в буфер, расположенный в памяти компьтера, при этом он, дополнительно увеличивается еще на несколько ячеек. Этот буфер мы будем называть - буфер управления файлом или буфер FCB, который размещается по общепринятому адресу 005С-007FH. Если открывается несколько файлов для доступа к ним (чтение/запись), необходимо организовать несколько буферов FCB в других областях памяти компьютера.
Буфер FCB состоит из 33 байт (32 байта описателя и один "свой") в случае организации последовательного доступа, и из 36 (32+4) байт при прямом доступе. Структура буфера FCB приведена в таблице 3.

Таблица 3

┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
│DR│ F1│ F2 │  // │F8 │T1  │T2 │T3 │EX │S1 │S2 │RC │D0│  //  │DN│CR│R0 │R1 │R2│
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
00 01 02 .. 08 09 10 11 12 13 14 15 16 .. 31 32 33 34 35 D
────────────────────────────────────────────────────────
00 01 02 .. 08 09 0A 0B 0C 0D 0E 0F 10 .. 1F 20 21 22 23 H
Где:
DR - номер диска. Может иметь значение: 0,1,2. При этом: 0 - соответствует активизированному (текущему) диску,
1 - соответствует диску "А"
2 - соответствует диску "В"
В описателе этот байт выполняет другие функции. Если байт имеет значение 0Е5Н - описатель (и файл) - уничтожен, если - 0-F, то это номер  USER, к которому относится файл;
F1..F8 - имя файла, состоящее из 1-8 больших латинских букв/цифр с нулевыми старшими битами. Имена короче 8 символов дополняются справа пробелами;
T1,T2,T3 - тип файла, состоящий из 1-3 больших латинских букв/цифр с нулевыми старшими битами. Если символов меньше - заполняется нулями.
Старший бит (D7) поля Т1 используется как индикатор доступа к файлу. Если он равен 1, то файл R/O (только чтение), если - 0, то R/W (чтение/запись). Старший бит поля Т2 (D7=1) указывает на принадлежность файла к группе - системный. Такой файл не просматривается директивой DIR;
EX - текущий номер экстента. Пользователем обычно устанавливается в ноль;
S1,S2 - зарезервировано для внутреннего использования;
RC - число записей в текущем экстенте, принимает значение от 0 до 128;
D0..DN - номера блоков в экстенте, заполняются OS-DOS;
CR - текущий номер записи в экстенте. В операциях последовательного чтения/записи обычно устанавливается в ноль;
R0,R1 - номер записи при прямом доступе. Содержит 16-битное значени (R0-младший байт, R1-старший);
R2 - байт переполнения

Для осуществления доступа к файлу, пользователь заполняет в буфере FCB байты с 0 по 12, т.е. указывает номер диска (0 -если обращается к уже активизированному, 1-2 - к дискам "А","В" -соответственно), имя и тип файла и номер открываемого или создаваемого экстента (обычно - 0, т.е. начать с начала). Затем необходимо выполнить функцию "открыть файл" или "создать  файл", и операционная система заполнит остальные поля буфера FCB.
При выполнении последующих операций ввода/вывода BDOS корректирует содержимое буфера FCB, осуществляя автоматическое открытие/закрытие текущих экстентов файла.
По окончанию работы с файлом текущую информацию из буфера FCB необходимо записать в каталог, выполнив функцию "закрытие файла".

В.СУГОНЯКО 142440 Московская обл. п.Обухово, а/я 13. "ОРИОНСОФТ"

    

 

Полезные и интересные статьи

На предыдущую страницу  На главную страницу  На следующую страницу