Статья 2, "С CP/M-80 на ты", все про OS DOS к Ориону-128

Продолжение, как изучить CP/M-80, основы операционной системы СПМ-80.

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

Дата обновления информации 22.06.2023

По Журналу Радиолюбитель № 2 1994 г

Сейчас на 14/07/2022 сделано и запущено 3 вида контроллера дисководов:

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

ОРИОН-128. С СР/М НА "ТЫ"

(Продолжение. Начало в № l 1994r.)

Следующая статья

CMP/80 авторская CPM/80 версия 3.60

Работа с дисководом 3,5 и 5,25 дюйма

Функция 8. Установка байта назначения устройств.

Вход: Регистр С - ОВН;

Регистр Е - новое значение БНУ.

Функция 9. Вывод символьной строки.

Вход: Регистр С - 09Н;

Регистр DE - адрес выводимой строки.

Эта функция выводит на консоль символьную строку, находящуюся по адресу, указанному в DE. Строка должна заканчиваться символом "$", который сам не выводится, а является признаком конца строки. При выполнении этой функции осуществляется проверка на управляющие символы CTRL/S, CTRL/P, CTRL/I.

Функция 10. Чтение в консольный буфер.

Вход: Регистр С-ОЛН;

Регистр DE - адрес буфера;

Выход: Введенные символы в консольном буфере.

Эта функция читает набираемую на консоли последовательность символов (строку) в буфер по адресу, указанному в регистровой паре DE.

Буфер для чтения имеет следующий формат:

DE:

MX NC CI С2 Сп.....????

Где:

"MX" - максимальное число символов, которые могут быть введены в данный буфер (задается программой пользователя от I до 255);

"NC" - число записанных символов в буфер, производится самой функцией.

CI, С2... - символы, прочитанные с консоли. Символы "?" изображают неинициализированный остаток буфера.

Выход из функции происходит:

- при вводе управляющего символа CR или LF;

- при вводе максимального числа символов.

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

CTRL/С - вызов процедуры "горячий старт" (если CTRL/C в начале строки);

CTRL/E - ввод следующего символа с новой строки на экране;

CTRL/P - включение/выключение режима параллельной печати;

CTRL/R - вывод обновленного (отредактированного) содержимого буфера;

CTRL/U - стирание буфера и перевод строки на экране (стертые символы сохраняются на экране);

ЗАБОЙ - стирание последнего символа в буфере и дублирование его на экране;

CTRL/X - стирание буфера и введенной строки на экране.

Курсор возвращается в ту позицию строки, в которой был окончен запрос на ввод в буфер.

Функция 11. Опрос статуса консоли (клавиатуры).

Вход: Регистр С-0ВН;

Регистр А - статус консоли.

Функция опроса статуса консоли позволяет проверить факт ввода символа с клавиатуры. Если символ введен, в регистре "А" возвращается значение 01Н. В противном случае - А - 00Н.

Функция 12. Запрос номера версии системы.

Вход: Регистр С - 0СН;

Регистр HL - номер версии - 0022Н = СРМ 2.2.

Функция 13. Сброс всех дисководов.

Вход: Регистр С-0DH.

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

Функция 14. Активизировать диск.

Вход: Регистр С - 0ЕН;

Регистр Е - номер диска (0 - диск "A", 1 - диск "В", 2 - диск "С").

После активизации диск считается установленным до следующего "холодного/горячего старта" или "сброс дисков" (функция 13). Дальнейшие файловые операции будут производиться с активизированным диском, если номер диска в буфере FCB равен нулю.

Номера дисков 1 и 2 в буфере FCB ссылаются соответственно на диски А и В.

Если установленный диск заменяется в процессе работы, он автоматически переводится в режим "R/О" (только чтение).

Функция 15. Открытие файла.

Вход: Регистр С - 0FH;

Регистр DE - Адрес буфера FCB;

Выход: Регистр Л - индекс описателя.

Функция используется для записи в буфер информации о размещении заданного файла. Перед обращением программист должен заполнить с 0 по 12 байт буфера FCB. При выполнении функции информация из описателя каталога копируется в соответствующие байты буфера FCB, а в регистре "А" возвращается индекс найденного описателя.

Если совпадающий описатель не найден (а проще - имя в каталоге), в регистре "А" возвращается 0FFH.

Таким образом, открытие файла обеспечивает доступ к нему для всех операций. При последовательном обращении к файлу поле текущего номера записи (байт 32 буфера FCB) должно содержать 0.

Функция 16. Закрытие файла.

Вход: Регистре - ЮН;

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - индекс описателя.

Функция осуществляет запись текущей информации из буфера FCB в соответствующий описатель файла в каталоге диска. При успешном завершении операции в регистре "А" возвращается индекс описателя в записи каталога. В противном случае А - 0FFH.

При выполнении только операции чтения закрывать файл необязательно. Если использовалась операция записи в файл, выполнение функции "Закрытие файла" обязательно для занесения полной информации о файле в каталог диска.

Функция 17. Поиск первого.

Вход: Регистр С - 11Н;

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - индекс описателя.

Функция осуществляет поиск в каталоге заданного диска первого описателя, соответствующего заданному в буфере FCB. Если такой описатель найден, в регистре "А" возвращается его индекс, а в буфере обмена (по DMA) - запись каталога, содержащая найденный описатель. Таким образом, относительный начальный адрес найденного описателя в буфере обмена будет равен А*32. Если соответствующий описатель не найден, в регистре "А" возвращается 0FFH.

Если буфер FCB в позиции, соответствующей номеру диска, содержит символ "?" (код 3FH), выбирается первый описатель каталога активизированного диска. Этот случай используется для просмотра текущего состояния всех описателей каталога активизированного диска (см.функцию 18).

Функция 18. Поиск следующего.

Вход: Регистр С - 12Н;

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - индекс описателя.

Функция "поиск следующего" аналогична функции "поиск первого" за исключением того, что просмотр каталога начинается с последнего описателя, совпавшего с заданным буфером FCB. Если соответствующий элемент не найден, в регистре "А" возвращается 0FFH.

Функция 19. Стирание файла.

Вход: Регистр С - 1ЗН;

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - индекс описателя.

Функция стирает в каталоге диска все описатели файла (файлов), имя которого задано в буфере FCB. Поле номера диска не может содержать символ "?" (код 3FH).

Если соответствующий описатель найден в каталоге, в регистре "А" возвращается его индекс, подтверждающий выполнение операции, в противном случае возвращается 0FFH.

Функция 20. Последовательное чтение.

Вход: Регистре - 14Н;

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - индекс описателя.

Функция читает 128 байтовую запись из файла, имя которого задано в буфере FCB, в буфер обмена. Буфер FCB должен содержать информацию о размещении файла на диске, для чего необходимо предварительно открыть файл (функция 15).

Чтение записи происходит из текущего экстента с текущим номером с последующим прибавлением единицы, т.е. устанавливается номер следующей записи. Если поле текущего номера записи переполняется, то следующая операция чтения автоматически открывает следующий экстент и поле текущего номера записи обнуляется.

Если операция чтения прошла успешно, в регистре "А" возвращается ООН, в противном случае значение отлично от нуля.

Функция 21. Последовательная запись.

Вход: Регистр С - 15Н;

Регистр DE - адрес буфера FCB;

Выход: Регистр А - индекс описателя.

Функция заносит 128-байтовую запись из буфера обмена в файл, имя которого указано в буфере FCB. Буфер FCB должен содержать информацию о размещении файла (предварительное выполнение функции 15 или 22). Запись помещается в текущий экстент с текущим номером и к полю текущего номера записи прибавляется единица, т.е. устанавливается номер следующей записи. Если поле текущего номера записи переполняется, для следующей записи автоматически открывается следующий экстент, а поле текущего номера записи обнуляется.

Запись может происходить в ранее созданный файл, в этом случае вновь занесенные записи помещаются в тс же блоки, что существовали в файле раньше.

 

Если операция прошла успешно, в регистре "А" возвращается ООН, в противном случае - ненулевое значение.

Функция 22. Создание файла.

Вход: Регистр С - 16Н;

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - индекс описателя.

Функция заполняет описатель файла нулями (байты с 13 по 31

буфера FCB) и записывает в каталог диска. Таким образом, функция "создание файла", так же как и функция 15, обеспечивает доступ к файлу для всех операций. Байты с 0 по 12 буфера FCB заполняет пользователь. Они включают номер диска, имя и расширение файла. Следует помнить, что дублирование имен на одном диске не допускается. В этом необходимо убедиться, выполнив предварительно функцию 17.

При успешном окончании операции А - ООН, если в каталоге нет места (на диске записано уже 128 описателей), в регистре "А" возвращается 0FFH.

Функция 23. Переименование файла.

Вход: Регистр С - 17Н;

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - индекс описателя.

Функция заменяет имя файла (с расширением), заданное в байтах с 0 по 12 в буфере FCB, адрес которого указан в DE, на имя, заданное в байтах с 16 по 28 того же буфера FCB. Номер диска задается только в нулевом байте буфера FCB, байт 16 всегда содержит ООН.

Если переименование прошло успешно, в регистре "А" возвращается индекс описателя в каталоге, в противном случае - 0FFH.

Функция 24. Получить вектор активных дисков.

Вход: Регистр С - 18Н;

Выход: Регистр HL - вектор действующих дисков.

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

Функция 25. Получить номер (имя) текущего диска.

Вход: Регистр С - 19Н;

Выход: Регистр Л - номер текущего диска.

Функция возвращает в регистре "А" номер активного диска. А -ООН - диск "А", А - 01Н - диск "В", А - 02Н - диск "С".

Функция 26. Установить адрес буфера обмена (DMA).

Вход: Регистр С - 1 АН;

Регистр DE - Адрес буфера обмена.

Буфер обмена представляет собой 128-байтовую область памяти, через которую осуществляется чтение/запись информации файла. Процедура "горячий/холодный старт" устанавливает буфер обмена по адресу 0080Н. Установленный адрес сохраняется до повторного вызова функции 26 с новым значением или выполнения процедуры "горячий/холодный старт".

Установив адрес буфера обмена и вызывая функцию "последовательное чтение" в цикле, можно считать весь файл в память компьютера. Следует только не забывать после чтения каждой записи увеличивать адрес буфера обмена на 128 единиц.

Функция 27. Получить адрес вектора размещения блоков.

Вход: Регистр С - 1ВН;

Выход: Регистр HL- начальный адрес вектора размещения блоков для активизированного диска.

Вектор размещения блоков формируется в основной памяти для каждого установленного диска. Различные системные программы используют информацию, содержащуюся в векторе размещения блоков для определения величины свободной памяти на диске.

Функция 28. Записать ключ зашиты записи на диске.

Вход: Регистр С - 1СН.

Функция устанавливает временное запрещение записи на активизированный диск. В результате, вплоть до выполнения "горячего/холодного старта" любая попытка записи на активизированный диск вызовет сообщение об ошибке:

BDOS ERR ON D: R/O, где D - имя диска.

Функция 29. Получить вектор "R/0".

Вход: Регистр С - 1DH;

Выход: Регистр HL- значение вектора R/0.

Функция возвращает в паре регистров HL битовый вектор, указывающий на диски, для которых установлен бит защиты записи R/0 (только чтение). Младший значащий бит соответствует диску "А", второй - ИВ" и т.д.

Функция 30. Установить атрибуты файла.

Вход: Регистр С - 1ЕН;

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - индекс описателя.

Функция позволяет программно работать с индикатором доступа файла. Для файла, имя которого задано в буфере FCB, устанавливается индикатор доступа R/О (только чтение) если старший бит байта 9 буфера FCB содержит "Iй, или R/W (чтение/запись) если этот бит содержит "0".

Функция 31. Получение адреса параметров дисковода.

Вход: Регистр С - 1FH;

Выход: Регистр HL - адрес параметров дисковода.

Функция используется для получения адреса блока параметров активного дисковода. Блок параметров (количество дорожек, секторов на дорожке и т.д.) размещается в BIOS.

Функция32. Установка/опрос кода пользователя (USER).

Вход: Регистр С - 20Н;

Регистр Е - 0FFH (опрос) или код пользователя;

Выход: Регистр А - фактический код пользователя (при опросе) или без значения (при установке).

Функция 33. Прямое чтение.

Вход: Регистр С - 21Н

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - код ошибки.

Прямое чтение аналогично последовательному чтению файла за исключением того, что прямое чтение позволяет производить записи с произвольно указанным номером. Для обращения к функции необходимо предварительно открыть файл и занести номер записи в поле номера записи при прямом доступе (буфер FCB - байты 33 и 34. байт 35 должен быть предварительно обнулен, т.к. ненулевое значение этого байта означает переполнение диска). В регистре "А" возвращается ли-бокод ошибки, либо ООН, что означает благополучное завершение операции. В этом случае в буфере обмена содержится считанная запись.

В отличие от последовательного чтения, при прямом чтении после ввода записи поле номера записи прямого доступа в буфере FBC не изменяется и при повторном чтении произведет повторный ввод записи в буфер обмена с тем же номером.

Ошибки, возвращаемые в регистре "А" после выполнения операции прямого чтения, приведены ниже:

01 - чтение отсутствующих записей;

03 - ошибка при закрытии текущего экстента;

04 - попытка открыть несуществующий экстент;

05 - переполнение каталога (при прямой записи) ;


06 - физический конец диска.

Коды ошибок 01 и 04 встречаются в случае, когда при операции прямого чтения достигнут блок данных, который до этого не был записан, или экстент, который до этого не был организован.

Код ошибки 03 обычно не появляется при нормальной работе системы. Она может быть снята при повторном чтении или открытии файла.

Код 06 встречается при ненулевом значении 35-го байта в буфере FCB.

Функция 34. Прямая запись.

Вход: Регистр С - 22Н;

Регистр DE - Адрес буфера FCB;

Выход: Регистр Л - код ошибки.

Функция записывает на диск данные, находящиеся в буфере обмена. Если экстент на диске или блок данных, в которые производится запись, еще не отведены, осуществляется их выделение на диске. Как и при прямом чтении, номер записи (33 и 34 байт в буфере FCB) не меняется в результате выполнения прямой записи. Текущий номер экстента и текущий номер записи в экстенте вычисляются по заданному номеру прямой записи и заносятся в соответствующие байты буфера FCB. Коды ошибок, возвращаемые функцией при прямой записи, идентичны кодам ошибок при прямом чтении за исключением кода 05.

Функция 35. Вычисление размера файла.

Вход: Регистр С - 23Н;

Регистр DE - Адрес буфера FCB;

Выход: Установка значения в номере поля записи при прямом доступе.

Функция вычисляет размер файла, имя которого задано в буфере FCB, и возвращает его в байтах 33 - 35. Возвращаемый размер файла на самом деле на единицу меньше указанного значения. Значение представляется в записях, т.е. по 128 байт.

Используя эту функцию, можно в конец существующего файла добавить дополнительные записи. Для этого следует:

- получить номер (он уже увеличен на единицу) последней записи при помощи функции 35;

- выполнить функцию "прямая запись" с этим номером;

- затем выполнить функцию "прямая запись" нужное количество раз, увеличивая каждый раз номер записи на единицу.

Если файл записан последовательно, действительный размер файла совпадает с числом записей в нем. Если файл создан в режиме прямого доступа и в области размещения файла существуют "дырки", фактическое число записей меньше, чем указано в его размере.

Функция 36. Установить номер записи для прямого доступа.

Вход. Регистр С - 24Н;

Регистр DE - Адрес буфера FCB;

Выход: Установка поля номера прямой записи.

Функция является подготовительной и устанавливает номер записи прямого доступа (байты 33 и 34) по номеру текущего экстента и номеру текущей записи. Применяется при переходе из режима последовательного доступа в режим прямого.

К примеру, в процессе работы к файлу осуществляется последовательный доступ (чтение/запись) до соответствующей записи. Затем вызывается функция 36, вычисляется номер прямой записи и, начиная с этой записи, выполняют операции прямой записи/чтения.

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

Функция 40. Прямая запись с заполнением нулями.

Вход: Регистр С - 28Н;

Регистр DE - Адрес буфера FCB;

Выход: Регистр А - код ошибки.

Функция аналогична "прямой записи" за исключением того, чте при выделении нового блока он на диске предварительно заполняется нулями.

(Продолжение. Начало в № l 1994r.)

(Окончание следует).

 

Как подключить z80 в Орион-128

Новая плата Орион-128.2 ревизия 512.3, сборка

Программирование на процессоре z80, документация

Тесты процессоров Z80

 

Купить платы, наборы микросхем на Орион-128, КР565РУ5В, КР565ру7В, к565ру5г AU, к565ру7г Au в позолоте, куплю микросхемы

 

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

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