Вернуться на ГЛАВНУЮ страницу
BIOS
& BDOS
Введение.
В данном описании рассматривается система управления
вводом/выводом DOS CP/M, ее назначение, структура и условия применения.
DOS СР/М имеет набор
функций, обеспечивающих удобный доступ к файлам на дисках и позволяющих выполнять
ряд стандартных действий при работе с другими периферийными устройствами. При
работе с дисками за основу берется файловая структура и динамическое распределение
дискового пространства как при последовательном, так и при прямом методе доступа.
Эта организация файлов позволяет хранить на дисках большое количество программ
в исходном виде и в машинных кодах и сохраняет одинаковую структуру для всех
файлов в СР/М.
Доступ программ пользователя к процедурам DOS осуществляется
посредством передачи номера функции и параметра (параметров) через единую точку
входа. DOS выполняет заданную процедуру и передает управление программе пользователя,
возвращая результат операции. В конце руководства приведены возможные сообщения
об ошибках DOS.
Содержание.
1. Назначение и условия применения
2. Характеристики DOS
3. Обращение к DOS. Входная и выходная информация
4. Функции DOS
4.1. #00 (0 dec): Процедура "горячий старт"
4.2. #01 (1 dec): Консольный ввод
4.3. #02 (2 dec): Вывод символа на консоль
4.4. #03 (3 dec): Ввод символа с логического устройства
RDR
4.5. #04 (4 dec): Вывод символа на логическое устройство
PUN
4.6. #05 (5 dec): Вывод символа на логическое устройство
LST
4.7. #06 (6 dec): Ввод/вывод символа с консоли
без эха
4.8. #07 (7 dec): Получить байт назначения устройств
(БНУ)
4.9. #08 (8 dec): Установить байт назначения устройств
(БНУ)
4.10. #09 (9 dec): Вывод символьной строки
4.11. #0A (10 dec): Читать в консольный буфер
4.12. #0B (11 dec): Опрос статуса консоли
4.13. #0D (13 dec) : Сброс дисковой системы
4.14. #0E (14 dec): Активизировать диск
4.15. #0F (15 dec): Открыть файл
4.16. #10 (16 dec): Закрыть файл
4.17. #11 (17 dec): Поиск первого
4.18. #12 (18 dec): Поиск следующего
4.19. #13 (19 dec): Удалить файл
4.20. #14 (20 dec): Последовательное чтение
4.21. #15 (21 dec): Последовательная запись
4.22. #16 (22 dec): Создание файла
4.23. #17 (23 dec): Переименовать файла
4.24. #18 (24 dec): Получить вектор установленных
дисков
4.25. #19 (25 dec): Получить номер активизированного
диска
4.26. #1A (26 dec): Установить адрес буфера обмена
4.27. #1B (27 dec): Получить адрес вектора размещения
блоков
4.28. #1C (28 dec): Записать ключ защиты диска
4.29. #1D (29 dec): Получить вектор R/O для дисков
4.30. #1E (30 dec): Установить индикатор доступа
файла
4.31. #20 (32 dec): Считать/установить номер
пользователя
4.32. #21 (33 dec): Прямое чтение
4.33. #22 (34 dec): Прямая запись
4.34. #23 (35 dec): Вычислить размер файла
4.35. #24 (36 dec): Установить номер записи для
прямого доступа
4.36. #25 (37 dec): Сбросить защиту записи
4.37. #28 (40 dec): Прямая запись с заполнением
нулями
5. Структура файлов в СР/М
5.1. Файловая ссылка
5.2. Блок управления файлом (БУФ)
6. Сообщения об ошибках
7. BIOS
7.1. Интерфейс BIOS
7.2. Дисковые описатели
7.3. Особенности реализации BIOS на ATM-turbo
8. Сообщения об ошибках BIOS
9. Монитор
9.1. Экранный драйвер
9.2. Управляющие последовательности
9.3. Дисковый монитор
9.4. Функциональный вход в монитор
10. Список литературы по продукции MicroART.
Система управления вводом/выводом является частью СР/М. Она предоставляет в распоряжение программиста набор функций, позволяющих выполнять ряд стандартных действий при работе с периферийными устройствами и с файлами на дисках. При использовании функций DOS обязательным условием является знание документа [1], содержащего разъяснение основных понятий и общей организации СР/М, список принятых в документации по СР/М сокращений и условных обозначений, а также таблицу мнемонических обозначений, кодов и способов ввода управляющих и графических символов с консоли.
Состав оборудования, необходимый для работы DOS, совпадает с конфигурацией, приведенной в [1]. <НАЗАД>
2. Характеристики DOS
Загрузка DOS осуществляется при начальной загрузке СР/М [2]. После начальной загрузки память машины имеет следующую структуру:
Адрес
|
Содержание памяти
|
0000h
|
область системных параметров (ОСП)
|
0100h
|
область программ
|
адрес 1
|
процессор консольных команд (CCP)
|
адрес 2
|
система логического ввода/вывода (BDOS) система управления вводом/выводом
|
адрес 3
|
система физического (BIOS) ввода/вывода
|
- адрес3+3 находится в слове по адресу 0001h;
- адрес2 находится в слове по адресу 0006h;
- адрес1 = адрес2 - 0806h.
DOS состоит из двух частей: системы логического ввода/вывода (BDOS) и системы физического ввода/вывода (BIOS). BDOS совместно с процессором консольных команд перезагружается в ОЗУ при выполнении процедуры "горячий старт". BIOS загружается при выполнении процедуры "начальная загрузка".
BDOS состоит из процедур обмена с диском и другими логическими устройствами и является аппаратно-независимой частью DOS.
Логические устройства имеют следующие имена: CON, RDR, PUN, LST и так далее.
Пользователь должен помнить, что:
- ввод/вывод на логическое устройство CON является вводом/выводом на консоль;
- ввод с логического устройства RDR является вводом с перфоленты;
- вывод на логическое устройство PUN является выводом на перфоленту;
- вывод на логическое устройство LST является выводом на печать.
BIOS зависит от конкретных аппаратных средств. BIOS содержит драйверы работы с физическими устройствами и обеспечивает выполнение процедур "горячий/холодный старт".
Область памяти, занимаемая BDOS, может быть использована программами пользователя, не работающими с периферийными устройствами (чисто процессорные задачи). Подобные программы в конце работы должны обратиться к процедуре "горячий старт" (переход к адресу 0000h), в результате чего с диска будут вновь загружены СCР и BDOS, и управление будет передано на командный уровень CCP. <НАЗАД>
3. Обращение к DOS. Входная и выходная информация.
Доступ к процедурам DOS из программ пользователя осуществляется с помощью передачи номера функции и параметров через единую точку входа. Безусловный переход на точку входа DOS стоит по адресу 0005h
При обращении к DOS из программы пользователь должен подготовить следующую информацию:
- номер функции DOS в регистре С;
- параметры заданной функции в паре регистров DE при передаче адреса или в регистре
Е при передаче однобайтного параметра.
При возврате в программу пользователя однобайтный результат возвращается в регистре А, двухбайтный результат - в паре регистров HL.
Кроме того на выходе из DOS содержимое регистров А и L, а также регистров В и Н совпадает.
Перечень функций DOS с указанием их номеров приведен ниже:
#00 (0 dec) - "горячий старт" (перезагрузка ССР и BDOS);
#01 (1 dec) - ввод символа с консоли;
#02 (2 dec) - вывод символа на консоль;
#03 (3 dec) - ввод символа с логического устройства RDR;
#04 (4 dec) - вывод символа на логическое устройство PUN;
#05 (5 dec) - вывод символа на логическое устройство LST;
#06 (6 dec) - прямой ввод/вывод символа с консоли;
#07 (7 dec) - получить байт назначения устройств (БНУ);
#08 (8 dec) - установить байт назначения устройств (БНУ);
#09 (9 dec) - вывод строки символов;
#0A (10 dec) - чтение консольного буфера;
#0B (11 dec) - опрос статуса консоли;
#0D (13 dec) - сброс дисковой системы;
#0E (14 dec) - активизация диска;
#0F (15 dec) - открытие файла;
#10 (16 dec) - закрытие файла;
#11 (17 dec) - поиск первого;
#12 (18 dec) - поиск следующего;
#13 (19 dec)-стирание файла;
#14 (20 dec) - последовательное чтение;
#15 (21 dec) - последовательная запись;
#16 (22 dec) - создание файла;
#17 (23 dec) - переименование файла;
#18 (24 dec) - получить вектор установленных дисков;
#19 (25 dec) - получить номер активизированного диска;
#1A (26 dec) - установить адрес буфера обмена;
#1C (28 dec) - записать ключ защиты диска;
#1D (29 dec) - получить вектор R/O для дисков;
#1E (30 dec) - установить индикатор доступа файла;
#20 (32 dec) - считать/установить номер пользователя;
#21 (33 dec) - прямое чтение;
#22 (34 dec) - прямая запись;
#23 (35 dec) - вычислить размер файла;
#24 (36 dec) - установить номер записи для прямого доступа;
#25 (37 dec) - сбросить защиту записи;
#28 (40 dec) - прямая запись на обнуленный блок.
Функции с номерами #0C (12 dec), #18 (24 dec), #1B (27 dec), #1F (31 dec), #26 (38 dec), #27 (39 dec) и больше #28 (40 dec) не используются. При обращении к функциям с перечисленными номерами управление передается в программу пользователя, состояние регистров не определено. <НАЗАД>
4. Функции DOS.
Далее приводится описание доступных пользователю функций DOS. Пользователю доступен только логический уровень ввода/вывода, то есть функции BDOS.
Операции ввода/вывода осуществляются через буфер обмена. Системный буфер обмена (СБО) расположен по адресу 0080h. Этот адрес может быть изменен функцией "установить адрес буфера обмена" (функция 26).
Все операции с каталогом выполняются в резервной области и таким образом не оказывают влияния на буфер обмена за исключением функции "поиск первого" и "поиск следующего". <НАЗАД>
4.1. Функция #00 (0 dec): "горячий старт".
Входные параметры: регистр С: 00h.
Процедура "горячий старт" загружает в О3У ССР и BDOS и передает управление операционной системе СР/М на уровень CCP. CCP активизирует диск А. Действие этой функции эквивалентно безусловному переходу по адресу 0000h. <НАЗАД>
4.2. Функция #01 (1 dec): консольный ввод.
Входные параметры: регистр С: 01h.
Выходные параметры: регистр А: код символа.
Функция вводит с консоли символ в регистр А. Печатные символы и символы CR, LF, BSP вводятся с эхом на экран. Ввод управляющего символа ^I перемещает курсор на 8 позиций вправо. Осуществляется проверка на задание/снятие режима параллельной печати (управляющий символ ^Р) и приостанов/запуск вывода протокола (управляющий символ ^S. Пока символ не будет введен с консоли DOS не возвращает управления в вызывающую программу. <НАЗАД>
4.3. Функция #02 (2 dec): вывод символа на консоль.
Входные параметры: регистр С: 02h, регистр Е: код выводимого символа. Заданный символ выводится на консоль. Аналогично функции "консольный ввод" осуществляется обработка управляющих символов ^I, ^S и ^Р. <НАЗАД>
4.4. Функция #03 (3 dec): ввод символа с логического устройства RDR.
Входные параметры: регистр С: 03h.
Выходные параметры: регистр А: код введенного символа. Функция вводит символ с логического устройства RDR и помещает его код в регистр А. Лишь после этого управление передается в вызывающую программу. <НАЗАД>
4.5. Функция #04 (4 dec): вывод символа на логическое устройство PUN.
Входные параметры: регистр С: 04h, регистр Е: код выводимого символа.
Эта функция выводит символ, код которого находится в регистре Е на логическое устройство PUN. <НАЗАД>
4.6. Функция #05 (5 dec): вывод символа на логическое устройство LST.
Входные параметры: регистр С: 05h, регистр Е: код выводимого символа. Эта функция выводит символ, код которого задается в регистре Е, на LST. <НАЗАД>
4.7. Функция #06 (6 dec): ввод/вывод символа с консоли без эха.
Входные параметры: регистр С: 06h регистр Е: 0FF или 0FE - при вводе выводимый символ - при выводе.Выходные параметры: регистр А: введенный символ или статус консоли. Если в регистре Е задано 0FFh(ввод символа без эха / опрос статуса), то регистре А возвращается:
- 0, если консоль не готова к вводу символа;
введенный символ, в случае готовности консоли.
Если в регистре Е задано 0Eh (только опрос статуса), то в регистре A возвращается:
- 0, если консоль не готова;
- ненулевое значение при готовности консоли.
Если в регистре Е задан код, отличный от 0FEh или 0FFh, предполагается, что это код выводимого символа.
При использовании данной функции никаких действий по редактированию при вводе соответствующих управляющих символов не производится (сравните с функцией #0A (10 dec)). <НАЗАД>
4.8. Функция #07 (7 dec): получить байт назначения
устройств (БНУ).
Выходные параметры: регистр А: значение БНУ.
Эта функция возвращает текущее значение БНУ в регистре А [1]. <НАЗАД>
4.9. Функция #08 (8 dec): установка байта назначения
устройств (БНУ).
4.10. Функция #09 (9 dec): вывод символьной строки.
Входные параметры: регистр С: 09h, регистры DE: адрес выводимой строки.
Эта функция выводит на консоль символьную строку, находящуюся по адресу, указанному в DE. Строка должна заканчиваться символом $, который сам не выводится, а является признаком конца строки. При выполнении этой функции осуществляется проверка на управляющие символы ^S,^P,^I. <НАЗАД>
4.11. Функция #0A (10 dec): чтение в консольный буфер.
Входные параметры: регистр С: 0Ah, регистр E: адрес буфера. Выходные параметры: введенные символы в консольном буфере. Эта функция читает набираемую на консоли последовательность символов (строку) в буфер по адресу, указанному в регистрах DE. Буфер для чтения имеет следующий формат: DE:
MX
|
NC
|
C1
|
C2
|
C3
|
... ...
|
??
|
Где "MX" - максимальное число символов, которые могут быть введены в данный буфер, задается пользователем (от #01 (1 dec) до #FF (255 dec)); "NC" - число прочитанных символов, определенных функцией #0A (10 dec); C1, C2, ... - Символы, прочитанные с консоли. Символы"??" изображают неинициализированный остаток буфера.
Выход из функции происходит:
- при вводе управляющего символа CR или LF;
- при вводе максимального числа символов.
В процессе чтения набираемой строки содержимое буфера может быть отредактировано путем ввода следующих управляющих символов:
^С - вызов процедуры "горячий старт" (если ^С в начале строки);
^Е - ввод следующего символа с новой строки (CR/LF);
^J - влечет выход из функции (CR);
^М - влечет выход из функции (LF);
^Р - установка/снятие режима параллельной печати;
^R - вывод текущего отредактированного содержимого консольного буфера;
^U - стирание консольного буфера и перевод строки на экране (стертые символы
сохраняются на экране);
DEL - стирание одного символа из консольного буфера и дублирование его
на экране;
^X - стирание консольного буфера и введенной строки на экране и возврат курсора
в ту позицию строки, в которой был окончен запрос на ввод консольного буфера.
<НАЗАД>
4.12 Функция #0B (11 dec): опрос статуса консоли.
Выходные параметры: регистр А: статус консоли.
Функция опроса статуса консоли позволяет проверить факт ввода символа с консоли. Если символ введен, в регистре А возвращается значение 01h. В противном случае возвращается значение 00h.
В пп. 4.13-4.35 Описаны функции DOS, осуществляющие доступ к файлам на дисках. Описания структуры дисков, каталога, файлов, блока управления файлом (БУФ), файловой ссылки, системного буфера обмена (СБО) приведены в разделе 5. <НАЗАД>
4.13. Функция #0D (13 dec): сброс дисковой системы.
Производится сброс векторов контрольных сумм по директориям дисков, кроме того A=FFh, если на системном диске имеется файл $$$.SUB и A=00h в противном случае. <НАЗАД>
4.14. Функция #0E (14 dec): активизировать диск.
Эта функция активизирует диск с заданным номером. Номер диска задается в регистре Е. E=00h соответствует диску A, E=01h - В.
После активизации диск считается установленным до следующего "холодного/горячего старта". Дальнейшие файловые операции будут производиться с активизированным диском, если номер диска в БУФ равен нулю. Номера дисков #01 (1 dec) и #02 (2 dec) в БУФ ссылаются соответственно на диски А или В.
Если установленный диск заменяется в процессе работы, то диск автоматически
переводится в режим R/O (только чтение).
Выходные значения: регистр А: индекс описателя.
Функция используется для записи в БУФ информации о размещении заданного файла. Перед обращением программист должен заполнить с 0 по 12 байт БУФ, то есть задать номер диска, имя и тип файла и номер открываемого экстента (обычно открывается нулевой экстент). Описатели в каталоге диска просматриваются на совпадение с 1-12 позициями БУФ, адрес которого указан в регистре DE.
Если найден совпадающий описатель, то информация о размещении экстента файла копируется из описателя в соответствующие байты БУФ и в регистре A возвращается индекс найденного описателя.
Если совпадающий описатель не найден, то в регистре А возвращается FFh. Таким образом открытие файла обеспечивает доступ к нему для всех операций.
При последовательном обращении к файлу, поле текущего номера записи (байт 32 БУФ) должно содержать 0. <НАЗАД>
4.16. Функция #10 (16 dec): закрытие файла.
Выходные значения: регистр А: индекс описателя.
Функция осуществляет запись текущей информации из БУФ в соответствующий описатель файла в каталоге диска. При успешном завершении операции в регистре A возвращается индекс описателя в записи каталога. В противном случае в регистре А возвращается FFh.
При использовании только чтения закрывать файл необязательно. Если использовалась операция записи в файл, то выполнение функции "закрытие файла" обязательно для занесения полной информации о файле в каталог диска. <НАЗАД>
4.17. Функция #11 (17 dec): поиск первого.
Выходные параметры: регистр А: индекс описателя (A=0-3).
Функция осуществляет поиск в каталоге заданного диска первого описателя, соответствующего заданному БУФ. Если такой описатель найден, то в регистре А возвращается его индекс, а в буфере обмена - запись каталога, содержащая найденный описатель. Таким образом относительный начальный адрес найденного описателя в буфере обмена будет равен А*32. Если соответствующий описатель не найден, то в регистре А возвращается FFh. Если БУФ в позиции, соответствующей номеру диска, содержит символ "?"(код 3Fh), то выбирается первый (заполненный или свободный) описатель каталога активизированного диска. Этот случай используется для просмотра текущего состояния всех описателей каталога активизированного диска (см. Функцию 18).
В имени файла, расширении и в номере экстента можно использовать символ"?". <НАЗАД>
4.18. Функция #12 (18 dec): поиск следующего.
Входные параметры: регистр С: 12h, регистр DE: адрес БУФ.
Выходные параметры: регистр А: индекс описателя.
Функция "поиск следующего" аналогична функции "поиск первого", за исключением того, что просмотр каталога начинается с последнего описателя, совпавшего с заданным БУФ.
Если соответствующий элемент не найден, в регистре A возвращается FFh.
При совместном использовании функции #11 (17 dec) и #12 (18 dec) необязательно в функции 18 задавать адрес БУФ, т.к. он сохраняется в DE после выполнения функции #11 (17 dec).
Поиск файлов по директории осуществляется по следующей схеме:
ПОИСК ПЕРВОГО - найден первый описатель;
ПОИСК СЛЕДУЮЩЕГО - найден второй описатель;
ПОИСК СЛЕДУЮЩЕГО - найден третий описатель;
... - и т.д.;
ПОИСК СЛЕДУЮЩЕГО - описатель не найден;
КОНЕЦ ПОИСКА. <НАЗАД>
4.19. Функция #13 (19 dec): стирание файла.
Выходные параметры: регистр А: индекс описателя.
Функция стирает в каталоге диска все описатели файла (файлов), имя которого задано в БУФ. Поле номера диска не может содержать символ "?" (код 3Fh).
Если соответствующий описатель найден в каталоге, в регистре А возвращается его индекс в записи каталога.
Если соответствующий описатель не найден в каталоге, в регистре А возвращается FFh. <НАЗАД>
4.20. Функция #14 (20 dec): последовательное чтение.
Выходные параметры: регистр А: индекс описателя.
Функция вводит 128-байтную запись из файла, заданного в БУФ, в буфер обмена. Заданный БУФ должен содержать информацию о размещении файла на диске, для чего необходимо предварительно открыть файл (функция #0F (15 dec)).
Из текущего экстента вводится запись с текущим номером, и к текущему номеру записи автоматически прибавляется единица, то есть устанавливается номер следующей записи.
Если поле текущего номера записи переполняется, то следующая операция чтения автоматически открывает следующий экстент и поле текущего номера записи обнуляется.
Если операция чтения прошла успешно, в регистре А возвращается 00h. В противном случае содержимое регистра А отличается от нуля. <НАЗАД>
4.21. Функция #15 (21 dec): последовательная
запись.
Выходные параметры: регистр А: индекс описателя.
Функция заносит 128-байтную запись из буфера обмена в файл, имя которого указано в БУФ. БУФ должен содержать информацию о размещении файла, для чего необходимо предварительно открыть или создать файл (функции #0F (15 dec) или #16 (22 dec)). Запись помещается в текущий экстент с текущим номером и к полю текущего номера записи прибавляется единица, то есть устанавливается номер следующей записи.
Если поле текущего номера записи переполняется, то для следующей операции записи автоматически открывается следующий экстент и поле текущего номера записи устанавливается в 0.
Операция записи может происходить на ранее заполненном файле, в этом случае вновь занесенные записи помещаются в те же блоки, что и ранее существовавшие в файле.
Если операция записи прошла успешно, то в регистре А возвращается 00h. В противном случае содержимое регистра А отлично от нуля. <НАЗАД>
4.22. Функция #16 (22 dec): создание файла.
Выходные параметры: регистр А: индекс описателя.
Функция заполняет нулями байты с 13 по 31 БУФ и записывает в каталог диска описатель файла, формируя его по заданному БУФ. Таким образом, создание файла так же, как и функция "открытие файла" обеспечивает доступ к файлу для всех операций.
Пользователь должен предварительно заполнить с 0 по 12 байты БУФ, то есть задать номер диска, имя и тип файла, не забывая при этом, что дублирование имен файла на одном диске не допускается.
Если операция прошла успешно, в регистре А возвращается индекс описателя в записи каталога. Если в каталоге нет свободного места, то в регистре а возвращается FFh. <НАЗАД>
4.23. Функция #17 (23 dec): переименование файла.
Выходные параметры: регистр А: индекс описателя.
Функция заменяет имя файла, заданное в байтах с 0 по 12 БУФ, адрес которого задан в DE, на имя файла, заданное в байтах с 16 по 28 БУФ. Номер диска задается только в нулевом байте БУФ, байт 16 всегда содержит 0.
Если переименование прошло удачно, в регистре А возвращается индекс описателя в каталоге, в противном случае - FFh. <НАЗАД>
4.24. Функция #18 (24 dec): получить вектор
установленных дисков.
Выходные параметры: регистр HL: вектор действующих дисковых устройств.
Вектор установленных дисков представляет собой 16 битную величину и возвращается в регистрах HL. Первый значащий бит регистра L соответствует диску А, второй бит - диску В. Нулевое значение бита означает, что соответствующий диск не установлен, единица означает, что диск установлен в результате выполнения функции "активизация диска" или одной из операций над файлом с явным заданием номера диска в поле номера диска. <НАЗАД>
4.25. Функция #19 (25 dec): получить номер активизированного диска.
Входные параметры: регистр С: 19h.
Выходные параметры: регистр А: номер активизированного диска. Функция возвращает в регистре А номер активизированного диска. A=00h соответствует диску A, a A=01h - диску В. <НАЗАД>
4.26. Функция #1A (26 dec): установить адрес
буфера обмена.
Буфер обмена представляет собой 128 байтов оперативной памяти, через которые осуществляется ввод/вывод записей файлов. Процедурой "горячий/холодный старт" адрес буфера обмена устанавливается равным 0080h. функция "установить адрес буфера обмена" используется для изменения адреса системного буфера обмена на адрес, заданный в регистрах DE. Вновь установленный адрес буфера обмена сохраняется до тех пор, пока он не будет изменен либо функцией "установить адрес буфера обмена", либо процедурой "горячий/холодный старт". <НАЗАД>
4.27. Функция #1B (27 dec): получить адрес вектора
размещения блоков.
Выходные параметры: регистры HL: адрес вектора размещения блоков.
Вектор размещения блоков формируется в основной памяти для каждого установленного диска. Различные системные программы используют информацию, содержащуюся в векторе размещения блоков для определения величины свободной памяти на диске. Функция возвращает в регистрах HL начальный адрес вектора размещения блоков для активизированного диска. <НАЗАД>
4.28. Функция #1C (28 dec): записать ключ защиты
диска.
Функция устанавливает временное запрещение записи на активизированный диск. В результате вплоть до выполнения "горячего/холодного старта" любая попытка записи на активизированный диск вызовет сообщение об ошибке:
DOS ERR ON D: R/O (ошибка ввода/вывода на диске D: только чтение, где D - имя диска). <НАЗАД>
4.29. Функция #1D (29 dec): получить вектор
R/O.
Выходные параметры: регистры HL: значение вектора R/O.
Функция возвращает в паре регистров HL битовый вектор, указывающий на диски, для которых установлен бит R/O (только чтение). Младший значащий бит соответствует диску А, второй - диску В. <НАЗАД>
4.30. Функция #1E (30 dec): установить индикатор
доступа файла.
Выходное значение: регистр А: индекс описателя.
Функция позволяет программно работать с индикатором доступа файла. Для файла, имя которого задано в БУФ, устанавливается индикатор доступа R/O (только чтение), если старший бит байта 9 БУФ содержит 1, или R/W (чтение/запись), если этот бит содержит 0. <НАЗАД>
4.31. Функция #20 (32 dec): считать/установить
номер пользователя.
4.32. Функция #21 (33 dec): прямое чтение.
Выходные параметры: регистр А: код ошибки.
Прямое чтение аналогично последовательному чтению файла, за исключением того, что прямое чтение позволяет вводить записи с произвольным указанным номером. Для обращения к функции необходимо предварительно открыть файл и занести номер записи в поле номера записи при прямом доступе БУФ (байты 33 и 34), байт 35 должен быть предварительно обнулен, так как ненулевое значение этого байта означает переполнение диска.
В регистре А возвращается либо код ошибки (возможные коды ошибок приведены ниже), либо 00h, что означает благополучное завершение операции. В этом случае в буфере обмена содержится введенная запись.
В отличие от последовательного чтения при прямом чтении после ввода записи поле номера записи прямого доступа в БУФ не изменяется и повторение прямого чтения вызовет повторный ввод записи c тем же номером.
Далее приводятся коды ошибок, возвращаемые в регистре А после операции прямого чтения:
01h - чтение отсутствующих записей;
02h - не используется при прямом доступе;
03h - ошибка при закрытии текущего экстента;
04h - попытка открыть несуществующий экстент;
05h - не используется при прямом чтении;
06h - физический конец диска.
Коды ошибок 01h и 04h встречаются в случае, когда при операции прямого чтения
достигнут блок данных, который до этого не был записан, или экстент, который
не был до этого организован.
Код ошибки 03h обычно не появляется при нормальной работе системы. Она может
быть снята при помощи повторного чтения или повторного открытия.
Код ошибки 06h встречается в случае, если 35-й байт БУФ не равен нулю. <НАЗАД>
4.33. Функция #22 (34 dec): прямая запись.
Выходные параметры: регистр А: код ошибки.
Функция записывает на диск данные, находящиеся в буфере обмена. Если экстент на диске или блок данных, в которые производится запись, еще не отведены, осуществляется выделение области на диске. Как и при прямом чтении, номер записи (33 и 34 байт БУФ) не меняется в результате выполнения прямой записи. Текущий номер экстента и текущий номер записи в экстенте вычисляются по заданному номеру прямой записи и записываются в соответствующие байты БУФ.
Коды ошибок, возвращаемых при прямой записи, идентичны кодам ошибок при прямом чтении кроме кода 05h, который означает, что новый экстент не может быть создан из-за переполнения каталога. <НАЗАД>
4.34. Функция #23 (35 dec): вычислить размер файла.
Выходные параметры: установка поля номера записи при прямом доступе.
Функция вычисляет размер файла, имя которого задано в БУФ, и возвращает его в байтах 33, 34 и 35 БУФ. Возвращаемый размер файла на самом деле является продвинутым номером последней записи файла.
В конце существующего файла могут быть добавлены записи. Для этого следует:
- получить продвинутый номер последней записи файла при помощи функции 35;
- выполнить функцию "прямая запись" с этим номером;
- затем выполнять функцию "прямая запись" нужное число раз, увеличивая
каждый раз номер записи на единицу.
Если файл записан последовательно, действительный размер файла совпадает с числом записей в нем. Если же файл создан в режиме прямого доступа, и в области размещения файла существуют "дырки", то фактическое число записей меньше, чем указано в его размере. <НАЗАД>
4.35. Функция #24 (36 dec): установить номер записи для прямого
доступа.
Выходные
параметры: установка поля номера прямой записи
Функция устанавливает номер записи прямого доступа (байты 33 и 34) по номеру текущего экстента и номеру текущей записи.
Функция применяется при переключении с режима последовательного доступа в режим прямого доступа. К файлу осуществляется последовательный доступ до соответствующей записи, вызывается функция #24 (36 dec), устанавливающая номер прямой записи, и, начиная с выбранной точки файла, выполняются операции прямого чтения или записи. <НАЗАД>
4.36. Функция #25 (37 dec): сбросить защиту
записи.
Функция сбрасывает защиту записи на диске, если соответствующий ему бит в векторе сброса установлен в 1, либо не изменяет статус защиты, если соответствующий бит установлен в 0. <НАЗАД>
4.37. Функция #28 (40 dec): прямая запись с
заполнением нулями.
Функция аналогична прямой записи за исключением того, что при выделении нового блока, он заполняется нулями перед записью в него данных. <НАЗАД>
5. Структура файлов СР/М.
Диск логически разбивается на три области:
- резервируемую область, содержащую ССР и BDOS;
- область каталога;
- область файлов.
Пространство диска, отведенное под каталог и файлы, организовано блоками постоянной длины. Каждый блок состоит из кратного 8-ми числа записей.
BDOS осуществляет обмен с диском по записям. Длина записи составляет 128 байт. Каждый файл состоит из последовательности записей. Нумерация записей начинается с нуля.
Несколько начальных блоков резервируется под каталог диска. Каталог состоит из описателей, содержащих имена файлов и информацию о размещении файлов, расположенных на диске.
Каждый описатель определяет область диска (экстент), отведенную под данный файл или часть файла. Длина описателя составляет 32 байта. Описатель содержит имя и тип файла, номер экстента, число записей в экстенте и список номеров блоков, отведенных под данный экстент. Структура описателя совпадает со структурой 0-31 байтов блока управления файлом (БУФ) (см. п. 5.2). Пустые описатели содержат код E5h в нулевом байте.
Четыре описателя блокируются в одну запись каталога. Номер описателя в записи называется индексом описателя и принимает значения от 0 до 3.
Файлы на диске могут состоять из одного или нескольких экстентов, и, таким образом, иметь один или несколько описателей в каталоге. Каждый экстент файла доступен через его описатель в режиме как последовательного, так и прямого ввода/вывода.
Файлы в СР/М могут содержать любое число записей от нуля до полного использования емкости диска. <НАЗАД>
5.1. Файловая ссылка.
Имя диска используется для указания требуемого диска и принимает значение A
или B.
Имя файла содержит от 1 до 8 символов не равных пробелу.
Тип файла содержит от 1 до 3 символов и определяет назначение файла. Далее приведены
типы файлов, обычно резервируемые системой.
Тип назначение файла:
MAC - исходный текст на языке макроассемблера;
BAS - исходный текст на языке Бейсик;
FOR - исходный текст на языке Фортран;
СОВ - исходный текст на языке Кобол;
PLM - исходный текст на языке PL/M;
PRN - протокол компиляции/ассемблирования;
HEX - шестнадцатеричный машинный код в символьном виде;
СОМ - машинные коды программы в абсолютных адресах (имя таких файлов без указания
типа задается в командной строке ССР);
REL - перемещаемые машинные коды;
ВАК - запасной исходный текст редактора;
SUB - командный файл CCP;
LIB - вспомогательный исходный текст редактора;
$$$ - промежуточный исходный текст редактора.
Для групповых операций над файлами используется файловая ссылка. Файловая ссылка представляет собой указание номера диска, псевдоимени файла и псевдотипа файла в буф и служит образцом, по которому осуществляется поиск соответствующих описателей в каталоге диска.
Описатель удовлетворяет образцу, если все символы, входящие в имя и тип файла, совпадают с соответствующими символами в псевдоимени и псевдотипе файла, за исключением позиций, содержащих символ "?"(код 3Fh). <НАЗАД>
5.2 Блок управления файлом (БУФ).
Для работы функций BDOS необходимо, чтобы каждый файл, к которому осуществляется доступ, имел соответствующий БУФ, содержащий информацию об имени и размещении файла.
Буф состоит из 33
байт в случае последовательного доступа и из 36 байт в случае прямого доступа.
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
|
Где:
DR - номер диска принимает значения от 0 до 2. При этом: 0 - соответствует активизированному диску, 1 - соответствует диску с именем А, 2 - соответствует диску с именем В;
F1...F8 - имя файла, состоящее из 1-8 больших латинских букв/цифр с нулевыми старшими битами. Имена короче 8 символов дополняются справа пробелами;
T1 T2 Т3 - тип файла, состоящий из 1-3 больших латинских букв/цифр с нулевыми старшими битами. Тип, состоящий менее чем из 3 символов дополняется справа пробелами. Старший бит поля Т1 используется как индикатор доступа файла. Если он равен 1, то файл находится в состоянии R/O (только чтение), если - 0, то файл находится в состоянии R/W (чтение/запись); старшие биты полей Т2 и Т3 не используются, зарезервированы системой;
ЕХ - текущий номер экстента, пользователем обычно устанавливается в 0;
S1 - зарезервировано для внутреннего использования;
S2 - зарезервировано для внутреннего использования;
RC - число записей в текущем экстенте, принимает значения от 0 до 128;
D0...DN - номера блоков в экстенте, заполняются системой;
CR - текущий номер записи в экстенте, в операциях последовательного чтения/записи
пользователем обычно устанавливается в 0;
R0,R1,R2 - номер записи при прямом доступе, R2 - байт переполнения, R0,R1 -содержат
16-битное значение с младшим байтом в R0 и старшим в R1.
Для осуществления доступа к файлам программист должен заполнить с 0 по 12 байты БУФ, т.е. указать номер диска, имя и тип файла и номер открываемого/создаваемого экстента. Затем необходимо выполнить функцию "открытие файла" или "создание файла" для заполнения остальных полей БУФ.
При выполнении последующих операций ввода/вывода ВDOS корректирует содержимое БУФ, осуществляя автоматическое открытие/создание и закрытие текущих экстентов файла.
По окончании работы с файлом текущая информация из БУФ записывается в каталог функцией "закрытие файла". <НАЗАД>
6. Сообщения об ошибках BDOS.
При работе DOS может выдавать следующие сообщения об ошибках:
DOS ERR ON D: BAD SECTOR - ошибка при чтении/записи на диск;
DOS ERR ON D: SELECT - несуществующий номер устройства;
DOS ERR ON D: R/O - попытка записи на диск R/O;
DOS ERR ON D: FILE R/O - попытка записи в файл R/O; <НАЗАД>
7. BIOS
7.1 Интерфейс BIOS.
Адрес: |
Имя: |
Назначение: |
bios |
BOOT |
Холодный старт. Устанавливается IObyte, текущий диск и
вызывается WBOOT.
|
bios+03h
|
WBOOT
|
Горячий старт. Перезагружается BDOS и ССР. По адресам - 0
помещается
команда JP bios+3 (WBOOT), 5 - команда JP BDOS. В регистр С помещается номер активного
диска (обычно копия содержимого RAM по адресу 4) и управление передается
ССР.
|
bios+06h |
CONST |
Запрос статуса консоли. В регистре
А возвращается
статус:0FFh - есть символ для ввода с консоли, 0 - нет символа.
|
bios+09h
|
CONIN
|
Чтение символа с консоли. Введенный
символ помещается в
регистр
А. Возврат из этой функции выполняется только после ввода символа.
|
bios+0Ch |
CONOUT |
Вывод символа на консоль. Символ
для вывода должен быть
помещен в регистр С.
|
bios+0Fh |
LIST |
Вывод символа на принтер. Символ
для вывода должен быть
помещен в регистр С.
|
bios+12h |
PUNCH |
Вывод символа на перфоратор. Символ
для вывода должен |
bios+15h |
READER |
Чтение символа с перфоленты. Введенный
символ помещается
в регистр A.
|
bios+18h |
HOME |
Выполняется позиционирование текущего
выбранного диска
на 0 дорожку.
|
bios+1Bh
|
SELDSK
|
Выбор диска. В регистре С передается
номер диска (0 – диск
А,
1 - диск В и т.д.). 0 бит регистра Е будет установлен если этот диск
уже был выбран со времени последнего сброса дисковой системы. Функция
должна вернуть в регистрах HL адрес таблицы DPH (см. ниже), или 0 в случае отсутствия требуемого диска.
|
bios+1Eh
|
SETTRK
|
Установить дорожку. В регистрах ВС
передается номер
дорожки
диска (0 - начальная дорожка) для последующих операций чтения и записи
на диск.
|
bios+21h
|
SETSEC
|
Установить сектор. В регистрах ВС
передается номер сектора
диска
(1 - начальный сектор) для последующих операций чтения и записи на диск.
|
bios+24h
|
SETDMA
|
Установить адрес буфера для обмена
с диском. В регистрах ВС
передается
адрес буфера для последующих операций чтения и записи на диск.
|
bios+27h
|
READ
|
Чтение сектора. Читается сектор с
диска, определенный
предыдущими
вызовами SELDSK, SETTRK и SETSEC, в RAM по адресу, определенному предыдущим вызовом SETDMA. В регистре А возвращается 0 если
операция чтения прошла успешно или 1 в случае ошибок. (BIOS должен произвести необходимое число
попыток, перед возвратом с ошибкой, так как это немедленно вызовет ошибку
BDOSa)
|
bios+2Ah
|
WRITE
|
Запись сектора. Производится запись
сектора на диск.
Адресация
и ошибки обрабатываются аналогично функции READ. При вызове этой функции в регистре
С передается дополнительный флаг, обозначающий тип записываемого сектора:
0 - обычный сектор, 1 -сектор из области директория, 2 - первый сектор
нового блока данных (начальное значение данного блока неважно).
|
bios+2Dh
|
LISTST
|
Запрос статуса принтера. В регистре
А возвращается
статус:0FFh - принтер готов для вывода следующего
символа, 0 - принтер не готов.
|
bios+30h
|
SECTRAN
|
Трансляция логического номера сектора
в физический. В
регистрах
ВС передается номер сектора (начиная с 0), DE - адрес таблицы перекодировки; в
регистрах HL возвращается номер сектора (начиная с 1).
|
В версии 1.01 к BlOSy добавлены 3 дополнительных входа:
bios+33h
|
ASSIGN
|
назначить канал и диск. Входная информация
: В - номер |
bios+36h
|
GETCH
|
получить назначение диска. Входная
информация: С - номер
диска,
DE - указатель
на буфер для канального описателя. Выходная информация : А - статус,
С - номер канала, присоединенного к заданному диску.
|
bios+39h
|
BMUXBIOS
|
мультиплексный вход. Входная информация
: С - номер
функции
(функции с номером больше 127 переадресовываются к вызовам функций 0..127
монитора). Выходная информация : А - статус. Функции : 0 - получить / установить обработчик критических ошибок. Входная информация : HL - адрес подпрограммы обработки критических ошибок. Выходная информация : HL - адрес предыдущей подпрограммы обработки. При вызове подпрограммы обработки критических ошибок : Входная информация : А - код ошибки, ВС - указатель на блок запроса. Выходная информация : А - код реакции (0 -ABORT, 1 - RETRY, 2 - IGNORE, 3 - FAIL). |
7.2 Дисковые описатели.
СР/М способна работать с различными дисковыми устройствами. Параметры этих устройств задаются посредством специальных таблиц DPH (Disk Parameter Header) и DPB (Disk Parameter Buffer). Такой механизм позволяет задавать количество дорожек на диске и блоков (по 128 байт) на дорожке. На каждое дисковое устройство существует 1 DPH (его адрес BDOS получает посредством вызова SELDSK BIOSa). Формат DPH:
XLT
|
0
|
0
|
0
|
DiBuf
|
DPB
|
CSV
|
ALV
|
(все поля словные)
XLT - адрес таблицы трансляции логических секторов в физические (передается функции SECTRAN в DE) или 0 если трансляция не нужна. Допускается совместное использование одной и той же таблицы разными DPH.
0 - зарезервировано СР/М.
DirBuf - адрес 128 байтного буфера для
операций с директорием. Это поле у всех DPH в системе может совпадать.
CSV - адрес области используемой для контроля смены диска. Для каждого DPH в системе должна быть своя область.
ALV - адрес области для контроля за заполнением диска. Для каждого
DPH в системе должна быть своя область.
SPT
|
BSH
|
BLM
|
EXM
|
DSM
|
DRM
|
AL0
|
AL1
|
CKS
|
OFF
|
w
|
b
|
b
|
b
|
w
|
w
|
b
|
b
|
w
|
w
|
BSH - количество бит, на которое необходимо сдвинуть размер логического сектора,
чтобы получить размер кластера;
BLM - маска кластера - (размер_кластера/128)-1;
ЕХМ - маска директорной записи : если ЕХМ=0), то максимальный размер, адресуемый
одной директорной записью, равен 16К; если ЕХМ=1, то - 32К и т.д.
Если DSM < 256, то размер кластера в директорной записи задается байтом,
а если DSM > 256, то словом.
BLS
|
BSH
|
BLM
|
EXM(DSM<256)
|
EXM(DSM>256)
|
1024
|
3
|
7
|
0
|
-
|
2048
|
4
|
15
|
1
|
0
|
4096
|
5
|
31
|
3
|
1
|
8192
|
6
|
63
|
7
|
3
|
16384
|
7
|
127
|
15
|
7
|
DSM - количество BLS -1 (не считая системных дорожек)
DRM - количество входов в директорию -1
AL0,1 - битовая шкала занятости BLS директорией. Начало шкалы - бит 7 AL0,
конец - бит 0 AL1. Количество единиц, заполняющих AL0,1 (от начала шкалы)
- (DRM+BLS/32)/(BLS/32).
CKS - размер области CSV в DPH. Для сменных дисков - (DRM+1)/4, для не сменных
- 0.
OFF - количество зарезервированных дорожек на диске (с системой например).
Размер области ALV в DPH - (DSM/8)+1. <НАЗАД>
7.3 Особенности реализации BIOS на ATM-turbo.
Данная версия BIOS не учитывает байт IObyte. Для выполнения
операций ввода/вывода BIOS обращается к монитору, интерфейс которого находится
после BIOS, а остальная часть - в ПЗУ.
BIOS ERROR <num> AT <chan>: <com>: <track>:
<block>
SELECT ((R)ETRY, (I)GNORE, (A)BORT, (F)AIL):
В этом сообщении (все параметры - шестнадцатеричные числа):
<num> - обозначает номер ошибки (см. ниже),
<chan> - номер канала дискового монитора (соответсвующий диск СР/М не
выводится, но его легко можно узнать, например, с помощью утилиты ASS),
<соm> - команда дискового монитора, которая привела к этой ошибке,
<track> - номер дорожки из переданной команды,
<block> - номер блока (по этому параметру легко можно узнать номер сектора,
из расчета: 1 блок - 128 байт).
Например:
BIOS ERROR 08 AT 00:01:60:01
Означает : ошибка адресации на команде "позиционирование канала 0 на 60h
(96) дорожку" - очевидно, что у устройства, присоединенному к каналу 0,
нет 96ой дорожки.
Далее BIOS ожидает реакции пользователя, воспринимая только следующие символы:
R (Retry) - производится повторная попытка выполнить команду.
I (Ignore) - ошибка, возникшая при выполнении команды, игнорируется (будьте
осторожны при использовании этой возможности - данные, возвращенные монитором,
ошибочны и могут привести к развалу системы.
A(Abort) - прервать, СР/М перезапускается по "горячему перезапуску".
F(Fail) - BIOS возвращает ошибку СР/М (обычно это приводит к сообщению типа
BDOS error on С: bad sector, и перезапуску СР/М).
Список команд:
00 - Сброс драйвера устройства.
01 - Поиск (позиционирования).
02 - Форматирование дорожки.
03 - Чтение сектора.
04 - Рекалибровка драйвера.
05 - эта команда не используется.
06 - Запись сектора.
07 - Назначение канала дискового монитора.
08 - Запрос назначения канала дискового монитора.
Список ошибок:
08 (#08) - Ошибка адресации (нет такой дорожки или сектора).
09 (#09) - Канал не назначен.
40 (#28) - Ошибка аппаратуры.
41 (#29) - Несоответствие драйвера аппаратуре.
50 (#32) - Недопустимый номер драйвера в канале.
51 (#33) - Драйвер отсутствует.
52 (#34) - Запрещенная команда.
53 (#35) - Ошибка ввода/вывода.
54 (#36) - Защита записи.
56 (#38) - Необработанная фатальная ошибка.
59 (#3B) - Нет готовности аппаратуры (TIMEOUT).
81 (#51) - Сектор не найден (ошибка чтения).
82 (#52) - Адресный маркер не найден (ошибка чтения).
83 (#53) - Потеря данных (быстродействие процессора недостаточно).
84 (#54) - Ошибка в CRC (ошибка чтения).
Другие ошибки не являются стандартными, и, при нормальной работе, возникать не должны. <НАЗАД>
9.Монитор.
Монитор осуществляет
операции обмена с экраном, клавиатурой и дисками. Монитор размещен в ПЗУ, а
интерфейс к нему - в ОЗУ с адреса F800h. Метод вызова монитора такой же,
как и у BIOSa.
Адрес:
|
Имя:
|
Назначение:
|
F800h
|
RUN
|
полный сброс (выход в меню загрузчика);
|
F803h |
CIN |
ввод с консоли в регистр A (сюда перенаправляется функция
CONIN BIOSа);
|
F806h
|
RIN
|
ввод
с перфокарт (не реализован);
|
F809h
|
COUT
|
вывод
на консоль из регистра С (функция CONOUT BIOSa);
|
F80Ch
|
POUT
|
вывод на перфоратор (не реализован);
|
F80Fh
|
LOUT
|
вывод
на принтер из регистра С (функция LIST BIOSa);
|
F812h
|
CSTS
|
запрос
статуса консоли в регистр А (функция CONST BIOSa);
|
F815h
|
IOCHK
|
запрос
статуса ввода/вывода в регистр А (копия IObyte);
|
F818h
|
IOSET
|
установка
статуса ввода/вывода из регистра С;
|
F81Bh
|
MEMCK
|
Top of RAM (не используется);
|
F81Eh
|
USRIO
|
установка программ пользовательского
ввода/вывода (не реализован);
|
F821h
|
IRUN
|
перезапуск СР/М;
|
F824h
|
RQDIO
|
вызов дискового монитора;
|
F827h
|
RQRES
|
сброс буферов дискового монитора;
|
F82Ah
|
RQSET
|
назначение канала дискового монитора;
|
F82Dh
|
RQCHK
|
запрос назначения канала дискового
монитора;
|
F830h
|
MUX
|
функциональный
вход в монитор.
|
9.1 Экранный драйвер.
Символы с кодами не менее
пробела (32 десятичное) выводятся на экран (если они не являются частями управляющей
последовательности). Остальные символы не печатаются, а часть из них отрабатываются
специальным образом:
Код | Имя | Реакция |
7 | BELL | генерируется
звуковой сигнал. |
8 |
BS | курсор
перемещается на одну позицию назад; |
9 | TAB | курсор
перемещается на ближайшую справа позицию, кратную 8; |
0Ah
|
LF
|
перевод
строки (курсор перемещается вниз на 1 строку, если курсор находится на последней
строке текущего окна то производится ролик); |
0Dh
|
CR
|
возврат
каретки (курсор перемещается в начало
строки, но пределах текущего окна) ; |
0Eh | SI | переключение
на латинский знакогенератор |
0Fh | SO | переключение
на русский знакогенератор; |
1Bh
|
ESC
|
следующие несколько символов воспринимаются как управляющая последовательность. |
9.2 Управляющие последовательности.
При описании управляющих
последовательностей применяются следующие сокращения:
Другие символы в угловых
скобках обозначают параметры.
Тип параметра
SpShifted означает что код символа, задающего параметр, равен числовой величине
параметра плюс код пробела (32). Например, чтобы передать параметр 10 (число
10!), необходимо напечатать символ '*' (код 42 = 32 + 10)
<ESC>A - Перемещение курсора вверх на одну строку.
<ESC>B - Перемещение курсора вниз на одну строку.
<ESC>C - Перемещение курсора вправо на одно знакоместо.
<ESC>D - Перемещение курсора влево на одно знакоместо.
<ESC>E - Стирание экрана (в пределах текущего окна). Курсор перемещается
в левый верхний угол окна.
<ESC>H - Перемещение курсора в левый верхний угол текущего окна.
<ESC>I - Обратный перевод строки. Выполняется симметрично обычному
переводу строки (т.е. курсор перемещается вверх а ролик производится вниз).
<ESC>J - Очистка экрана от курсора до конца экрана (в пределах
окна).
<ESC>K - Очистка экрана от курсора до конца строки (в пределах
окна).
<ESC>M1 - Сброс экранного драйвера. Производится очиска экрана,
текущее окно устанавливается во весь экран, курсор перемещается в левый верхний
угол экрана и
<ESC>NT{16x<GRB>} - Установка палитры для всех цветов.
<ESC>O - Зарезервировано для управления музыкальным сопроцессором.
<ESC>P - Вставка символа. Под текущую позицию курсора вставляется
пробел. Остаток строки (в пределах окна) сдвигается вправо.
<ESC>Q - Удаление символа. Удаляется символ в текущей позиции курсора.
Остаток строки (в пределах окна) сдвигается влево. В освободившуюся справа позицию
прописывается пробел.
Параметр <таблица> (это цифра) задает одну из 3х возможных таблиц перекодировки: 0 - текущая (реально используемая в данное время), 1 - русская (устанавливается по коду SO), 2 - латинская (устанавливается по коду SI).
Внимание: при попытке вывода символа с кодом более 127 для его перекодировки будет использована таблица 1 (русская), т.е. в этом случае ее можно рассматривать как вторые 8 входов в текущей таблице перекодировки.
<ESC>S - Вставка строки.
Под текущую строку вставляется строка из пробелов. Остаток экрана смещается
вниз (в пределах окна).
<ЕSС>U<цвет русский><цвет латинский>
- Установка цвета бордюра. В зависимости от текущего режима русский/латинский
(переключается кодами SO/SI соответственно) устанавливается и, в дальнейшем,
поддерживается цвет бордюра (<цвет> - шестнадцатиричная цифра).
<ЕSС>Z<тип курсора> - Установить тип курсора. Тип курсора:
0 - курсор выключен, 1 - курсор включен (состояние курсора - счетчик, т.е. после
нескольких вызовов <ESC>Z0 необходимо столько же раз вызвать
<ESC>Z1 для включения курсора), 2 - гибкий
курсор (появляется только на время ожидания нажатия клавиши, для выключения
режима включить курсор, т.к. эта функция увеличивает счетчик состояния курсора).
<ESC>\<arep><adel> - Установка скорости авторепитора клавиатуры (arep), и задержки перед его включением (adel). Типы параметров аналогичны типу параметра в последовательности <ESC>[.
<ESC> ]<начало><конец> - Установка начальной и конечной
линии курсора в знакоместе. Параметры - цифры от 0 до 7 (0 - низ знакоместа,
7 - верх). Например: последовательность <ESC>]00 устанавливает курсор типа 'подчеркивание',
а последовательность <ESC>]07 - типа 'блок'.
Т - при установленном флаге 'Т' при выводе и ролике не производится
никаких операций с атрибутами (что повышает скорость, но заставляет работать
в монохромном режиме);
F - этот флаг в определенных случаях ускоряет ролик, но при этом в процессе
ролика наблюдается эффект 'расслаивания' экрана;
O - этот флаг заставляет выводимые символы налагаться на. старое содержимое
экрана.
<ESC>_ - Сброс экрана. Производится очиска экрана, текущее окно устанавливается во весь экран, курсор перемещается в левый верхний угол экрана.
<ЕSC>'{16х<символ>} - Функция предназначена для внутреннего использования. Устанавливает палитру.
<ЕSC>a<символ> - Функция предназначена для внутреннего использования. Устанавливает скорость мигания курсора.
<ЕSС>b<символ><символ> - Функция предназначена для внутреннего использования. Устанавливает скорость авторепитора и задержки клавиатуры.
<ESC>^B1/0 - Разрешает / запрещает прерывать программы по <EXT><SPACE>.
<ESC>NR - Восстанавливает палитру по умолчанию.
<ЕSС>^R1/0 - Разрешает / запрещает ролик экрана. Во всех, приведенных выше, последовательностях используются только печатаемые символы (не менее пробела) и символ <ESC>, в случае обнаружения драйвером экрана в специальной последовательности какого либо символа, не относящегося к этому набору, прием этой последовательности немедленно прекращается, а принятая часть аннулируется (за исключением последовательности
<ESC>NT... - в этом случае принятая часть палитры сохраняется, но реальная установка ее в этот раз не производится). <НАЗАД>
9.3. Дисковый монитор.
СР/М обращается к дисковым устройствам посредством части мониторной системы, называемой "дисковым монитором". В дисковом мониторе каждому возможному дисковому устройству соответсвует определенный "канал" (в данной версии дискового монитора возможно одновременное открытие до 10 каналов). BIOS связывает диски СР/М с соответствующими каналами дискового монитора.
Параметры дискового устройства определяются "канальным описателем".
Обращение к ДМ происходит через вход монитора RQDIO.
Входная информация : в регистре С - номер канала, в регистре DE - указатель на блок запроса.
Выходная информация : в
регистре А - статус (0 - ошибки нет, иначе номер ошибки).
RQCOM
|
DS1
|
;команда
|
RQBLN
|
DS1
|
;счетчик блоков для чтения / записи
|
RQTRACK
|
DS2
|
;дорожка
|
RQBLOCK
|
DS2
|
;блок
|
RQBADR
|
DS2
|
;адрес буфера
|
Команды ДМ:
_RESET
|
EQU 0
|
;сброс канала
|
_SEEK |
EQU 1
|
;позиционирование (на RQTRACK)
|
_FORMT
|
EQU 2
|
;форматирование дорожки ;(RQBLN - заполнитель, RQBADR ; - interlive factor) |
_RECAL |
EQU 3
|
;рекалибровка
|
_READ |
EQU 4
|
;чтение RQBLN блоков
|
_WRITE |
EQU 5
|
;команда запрещена
|
_WSECT |
EQU 6
|
;запись RQBLN блоков
|
_SETCH
|
EQU 7
|
;установить канальный
;описатель (RQBADR ; - адрес описателя) |
_GETCH
|
EQU 8
|
;получить канальный
;описатель (RQBADR ; - адрес описателя) |
Два последних вызова доступны
так же через вызовы RQSET и RQCHK. При этом в регистре С - номер канала,
в регистре DE - адрес канального описателя для RQSET и буфер под канальный описатель
для RQCHK.
Канальный
описатель для дискового монитора:
|
aseg
|
ORG 0
|
DVALID:
|
DS 1
|
;+ПРИЗНАК ДЕЙСТВИТЕЛЬНОСТИ
|
DTYP: |
DS 1
|
;+КОД УСТРОЙСТВА |
DUS: |
DS 1
|
;+HOMEP ПРИВОДА |
DDTYP: |
DS 1
|
;-КОД ПРИВОДА |
DHEADF: |
DS 1
|
;+ЧИСЛО ФИКСИРОВАННЫХ ГОЛОВОК |
DHEADR: |
DS 1
|
;+ЧИСЛО СМЕННЫХ ГОЛОВОК |
DCYLN: |
DS 2
|
;+ЧИСЛО ЦИЛИНДРОВ НА ДИСКЕ |
DSECTT: |
DS 1
|
;+ЧИСЛО СЕКТОРОВ НА ДОРОЖКЕ |
DBYTES: |
DS 2
|
;+ЧИСЛО БАЙТОВ В СЕКТОРЕ |
DALTCYL: |
DS 1
|
;+ЧИСЛО СИСТЕМНЫХ ДОРОЖЕК |
DBEGCYL: |
DS 2
|
;+НОМЕР НАЧАЛЬНОГО ЦИЛИНДРА |
DBLDR: |
DS 2
|
;+ЧИСЛО БЛОКОВ НА ДИСКЕ |
DBLTR: |
DS 2
|
;+ЧИСЛО БЛОКОВ НА ДОРОЖКЕ |
DTRACK: |
DS 2
|
;+ЧИСЛО ДОРОЖЕК НА ДИСКЕ |
DSECTL: |
DS 1
|
;+ДЛИНА НОМЕРА БЛОКА В СЕКТОРЕ |
DDIRENT: |
DS 2
|
;+ЧИСЛО ЗАПИСЕЙ В ДИРЕКТОРИИ |
DIF0: |
DS 1
|
;+PA3METKA ПЕРВОЙ ДОРОЖКИ |
DIF1: |
DS 1
|
;+РАЗМЕТКА ВТОРОЙ ДОРОЖКИ |
DIF2: |
DS 1
|
;+РАЗМЕТКА ВСЕХ ОСТАВШИХСЯ ДОРОЖЕК |
DTIF: |
DS 1
|
;?СМЕЩЕНИЕ ПЕРВОГО СЕКТОРА |
DF8: |
DS 1
|
;+ПРИЗНАК 8-ДЮЙМОВОГО ДИСКА ;ИЛИ НОМЕР НАЧАЛЬНОЙ ГОЛОВКИ |
DFMFM: |
DS 1
|
;+ПЛОТНОСТЬ
ЗАПИСИ |
DFN: |
DS 1
|
;+РАЗМЕР СЕКТОРА |
DFGPL: |
DS 1
|
;+GAP3 ДЛЯ ЧТЕНИЯ/ЗАПИСИ |
DFGPF: |
DS 1
|
;+GAP3 ДЛЯ ФОРМАТА |
DFSRHUT: |
DS 1
|
;+ВРЕМЯ ШАГА ;ИЛИ ВРЕМЯ ШАГА ПРИ SEEK |
DFHLT: |
DS 1
|
;+ВРЕМЯ ОПУСКАНИЯ ГОЛОВКИ ;ИЛИ ВРЕМЯ ШАГА ПРИ ;RECALIBRATE |
DFMOTOR |
DS 1
|
;+ПРИЗНАК ВКЛЮЧЕНИЯ ;МОТОРА |
Назначение некоторых полей канального описателя:
DVALID - это поле не учитывается и не передается при запросе
/ присваивании канального описателя.
DTYP - тип драйвера. На данной версии ДМ реализованы два типа : 2 -электронный
диск, 3 - НГМД.
Это справедливо по отношению к ATM-turbo 1 (BIOS 1.03). В ATM-turbo 2(+) (BIOS 1.07.12) реализован еще: 4 - HDD. Кроме того, авторами BIOS планировались но так и не были реализованы еще следующие драйвера: 1 - ROM-диск (для загрузки дополнительного ПО, прошиваемого в ПЗУ при использовании в качестве оного м/с 271000(27010)); 5 - NET ("сетевой диск", для подключения ATM к локальной сети и скачивания файлов с другой машины как с некоего дискового устройства). Всего же данный BIOS (на всех ATM) позволяет адресовать восемь драйверов, с номерами 0 - 7.
DBEGCYL - применяется для секционирования дисков типа "винчестер".
DIF0,1,2 - коэффициент перекрытия секторов (interlive factor).
DFN - длина сектора: 0 - 128 байт, 1 - 256, 2 - 512 и т.д.
Параметры указанные в "блоках" пересчитываются исходя из основных
параметров устройства и из расчета 1 блок - 128 байт.
Коды ошибок, возвращаемые дисковой
системой:
_ADRERR
|
EQU 08H
|
;ОШИБКА АДРЕСАЦИИ
|
_CHNFND
|
EQU 09H
|
;КАНАЛ НЕ ПРИСОЕДИНЕН
|
_HRDERR
|
EQU 40H
|
;ОШИБКА АППАРАТУРЫ
|
_INVALID
|
EQU 41H
|
;НЕСООТВЕТСТВИЕ ДРАЙВЕРА АППАРАТУРЕ
|
_DTYPER
|
EQU 50H
|
;НЕДОПУСТИМЫЙ НОМЕР ДРАЙВЕРА В КАНАЛЕ
|
_DRNFND
|
EQU 51H
|
;ДРАЙВЕР ОТСУТСТВУЕТ
|
_COMERR
|
EQU 52H
|
;ЗАПРЕЩЕННАЯ КОМАНДА
|
_IOERR
|
EQU 53H
|
;ОШИБКА ВВОДА/ВЫВОДА
|
_WR$PROT
|
EQU 54H
|
;ЗАЩИТА ОТ ЗАПИСИ
|
_FATAL$ERROR
|
EQU 56H
|
;НЕ ОБРАБОТАННАЯ ФАТАЛЬНАЯ ОШИБКА
|
_NRDY
|
EQU 59H
|
;НЕТ ГОТОВНОСТИ АППАРАТУРЫ (TIMEOUT)
|
_NO$DATA
|
EQU 81H
|
;СЕКТОР НЕ НАЙДЕН
|
_NO$ADDR$MARK
|
EQU 82H
|
;АДРЕСНЫЙ МАРКЕР НЕ НАЙДЕН
|
_OVERRUN
|
EQU 83H
|
;OVERRUN
|
_CRC$ERR
|
EQU 84H
|
;ОШИБКА B CRC
|
MAXDRVN
|
EQU 07H
|
;МАКСИМАЛЬНЫЙ НОМЕР ДРАЙВЕРА
|
9.4.Функциональный вход в монитор.
Вход MUX:
Вход: в регистре С - номер функции.
Выход: в регистре А - статус (0 - ошибки нет, иначе номер ошибки).
Функции:
0 - получить версию монитора (в HL - номер версии)
1 - загрузка СР/М
2 - установка адреса перезагрузки СР/М (в HL - адрес процедура перезапуска WBOOT)
3 - чтение клавиатуры. Выходная информация :
а) в буфере клавиатуры есть символ : А - 0, С - код символа, Н - SCAN код, L
- тип клавиатуры (всегда 0), D - биты 7 и б это состояние флагов CapsShift (CS)
и SymbolShift(SS);
б) в буфере нет символа : Н -1, D - флаги CS и SS.
4 - опрос статуса клавиатуры. Выходная информация:
а) в буфере клавиатуры есть символ : А - 0, L - тип клавиатуры, (всегда 0),
D - флаги CS и SS.
б) в буфере нет символа: А - 1, L - тип клавиатуры, D - флаги CS и SS.
5 - получить
текущее время. Время в 20 ms тиках возвращается в HL:DE.
Функции 3 и 4 доступны для мониторов начиная с версии 1.01 и выше, а функция 5 с версии 1.02 и выше.
6 - реализована в версиях BIOS 1.03 и выше. Описание ищется.
7 - реализована в версиях BIOS 1.03 и выше. Описание ищется.
8 - реализована в версиях BIOS 1.03 и выше. Описание ищется.
9 - реализована в версиях BIOS 1.03 и выше. Описание ищется.
<НАЗАД>
Список литературы по продукции MicroART:
[1] Описание "Описание, схема ПК ATM-turbo 2", 1993г.
[2] Описание "ОС CP/M", 1993г.
[3] Описание "BIOS и BDOS", 1993г.
[4] Описание программатора UniProg.