Вернуться на ГЛАВНУЮ страницу

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.


1. Назначение и условия применения.

Система управления вводом/выводом является частью СР/М. Она предоставляет в распоряжение программиста набор функций, позволяющих выполнять ряд стандартных действий при работе с периферийными устройствами и с файлами на дисках. При использовании функций 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): получить байт назначения устройств (БНУ).

Входные параметры: регистр С: 07h.

Выходные параметры: регистр А: значение БНУ.

Эта функция возвращает текущее значение БНУ в регистре А [1]. <НАЗАД>

4.9. Функция #08 (8 dec): установка байта назначения устройств (БНУ).

Входные параметры: регистр С: 08h, регистр Е: новое значение БНУ. Эта функция меняет системное значение БНУ на значение, заданное в регистре DЕ. <НАЗАД>

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): опрос статуса консоли.

Входные параметры: регистр С: 0Bh.

Выходные параметры: регистр А: статус консоли.

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

В пп. 4.13-4.35 Описаны функции DOS, осуществляющие доступ к файлам на дисках. Описания структуры дисков, каталога, файлов, блока управления файлом (БУФ), файловой ссылки, системного буфера обмена (СБО) приведены в разделе 5. <НАЗАД>

4.13. Функция #0D (13 dec): сброс дисковой системы.

Входные параметры : регистр С: 0Dh.

Производится сброс векторов контрольных сумм по директориям дисков, кроме того A=FFh, если на системном диске имеется файл $$$.SUB и A=00h в противном случае. <НАЗАД>

4.14. Функция #0E (14 dec): активизировать диск.

Входные параметры: регистр С: 0Eh, регистр Е: номер диска.

Эта функция активизирует диск с заданным номером. Номер диска задается в регистре Е. E=00h соответствует диску A, E=01h - В.

После активизации диск считается установленным до следующего "холодного/горячего старта". Дальнейшие файловые операции будут производиться с активизированным диском, если номер диска в БУФ равен нулю. Номера дисков #01 (1 dec) и #02 (2 dec) в БУФ ссылаются соответственно на диски А или В.

Если установленный диск заменяется в процессе работы, то диск автоматически переводится в режим R/O (только чтение). <НАЗАД>

4.15. Функция #0F (15 dec): открытие файла.

Входные параметры: регистр С: 0Fh, регистр DE: адрес БУФ.

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

Функция используется для записи в БУФ информации о размещении задан­ного файла. Перед обращением программист должен заполнить с 0 по 12 байт БУФ, то есть задать номер диска, имя и тип файла и номер открываемого экстента (обычно открывается нулевой экстент). Описатели в каталоге диска просматрива­ются на совпадение с 1-12 позициями БУФ, адрес которого указан в регистре DE.

Если найден совпадающий описатель, то информация о размещении экстен­та файла копируется из описателя в соответствующие байты БУФ и в регистре A возвращается индекс найденного описателя.

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

При последовательном обращении к файлу, поле текущего номера записи (байт 32 БУФ) должно содержать 0. <НАЗАД>

4.16. Функция #10 (16 dec): закрытие файла.

Входные параметры: регистр С: 10h, регистр DE: адрес БУФ.

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

Функция осуществляет запись текущей информации из БУФ в соответствующий описатель файла в каталоге диска. При успешном завершении операции в регистре A возвращается индекс описателя в записи каталога. В противном случае в регистре А возвращается FFh.

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

4.17. Функция #11 (17 dec): поиск первого.

Входные параметры: регистр С: 11h, регистр DE: адрес БУФ.

Выходные параметры: регистр А: индекс описателя (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): стирание файла.

Входные параметры: регистр С: 13h, регистр DE: адрес БУФ.

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

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

Если соответствующий описатель найден в каталоге, в регистре А возвращается его индекс в записи каталога.

Если соответствующий описатель не найден в каталоге, в регистре А возвращается FFh. <НАЗАД>

4.20. Функция #14 (20 dec): последовательное чтение.

Входные параметры: регистр С: 14h, регистр DE: адрес БУФ.

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

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

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

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

Если операция чтения прошла успешно, в регистре А возвращается 00h. В противном случае содержимое регистра А отличается от нуля. <НАЗАД>

4.21. Функция #15 (21 dec): последовательная запись.

Входные параметры: регистр C: 15h, регистр DE: адрес БУФ.

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

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

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

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

Если операция записи прошла успешно, то в регистре А возвращается 00h. В противном случае содержимое регистра А отлично от нуля. <НАЗАД>

4.22. Функция #16 (22 dec): создание файла.

Входные параметры: регистр С: 16h, регистр DE: адрес БУФ.

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

Функция заполняет нулями байты с 13 по 31 БУФ и записывает в каталог диска описатель файла, формируя его по заданному БУФ. Таким образом, создание файла так же, как и функция "открытие файла" обеспечивает доступ к файлу для всех операций.

Пользователь должен предварительно заполнить с 0 по 12 байты БУФ, то есть задать номер диска, имя и тип файла, не забывая при этом, что дублирование имен файла на одном диске не допускается.

Если операция прошла успешно, в регистре А возвращается индекс описателя в записи каталога. Если в каталоге нет свободного места, то в регистре а возвращается FFh. <НАЗАД>

4.23. Функция #17 (23 dec): переименование файла.

Входные параметры: регистр С: 17h, регистр DE: адрес БУФ.

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

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

Если переименование прошло удачно, в регистре А возвращается индекс описателя в каталоге, в противном случае - FFh. <НАЗАД>

4.24. Функция #18 (24 dec): получить вектор установленных дисков.

Входные параметры: регистр С: 18h.

Выходные параметры: регистр HL: вектор действующих дисковых устройств.

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

4.25. Функция #19 (25 dec): получить номер активизированного диска.

Входные параметры: регистр С: 19h.

Выходные параметры: регистр А: номер активизированного диска. Функция возвращает в регистре А номер активизированного диска. A=00h соответствует диску A, a A=01h - диску В. <НАЗАД>

4.26. Функция #1A (26 dec): установить адрес буфера обмена.

Входные параметры: регистр С: 1Ah, регистр DE: адрес буфера обмена.

Буфер обмена представляет собой 128 байтов оперативной памяти, через которые осуществляется ввод/вывод записей файлов. Процедурой "горячий/холодный старт" адрес буфера обмена устанавливается равным 0080h. функция "установить адрес буфера обмена" используется для изменения адреса системного буфера обмена на адрес, заданный в регистрах DE. Вновь установленный адрес буфера обмена сохраняется до тех пор, пока он не будет изменен либо функцией "установить адрес буфера обмена", либо процедурой "горячий/холодный старт". <НАЗАД>

4.27. Функция #1B (27 dec): получить адрес вектора размещения блоков.

Входные параметры: регистр С: 1Bh.

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

Вектор размещения блоков формируется в основной памяти для каждого установленного диска. Различные системные программы используют информацию, содержащуюся в векторе размещения блоков для определения величины свободной памяти на диске. Функция возвращает в регистрах HL начальный адрес вектора размещения блоков для активизированного диска. <НАЗАД>

4.28. Функция #1C (28 dec): записать ключ защиты диска.

Входные параметры: регистр С: 1Ch.

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

DOS ERR ON D: R/O (ошибка ввода/вывода на диске D: только чтение, где D - имя диска). <НАЗАД>

4.29. Функция #1D (29 dec): получить вектор R/O.

Входные параметры: регистр C: 1Dh.

Выходные параметры: регистры HL: значение вектора R/O.

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

4.30. Функция #1E (30 dec): установить индикатор доступа файла.

Входные параметры: регистр С: 1Eh, регистр DE: адрес БУФ.

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

Функция позволяет программно работать с индикатором доступа файла. Для файла, имя которого задано в БУФ, устанавливается индикатор доступа R/O (только чтение), если старший бит байта 9 БУФ содержит 1, или R/W (чтение/запись), если этот бит содержит 0. <НАЗАД>

4.31. Функция #20 (32 dec): считать/установить номер пользователя.

Входные параметры: регистр C: 20h, регистр E=FFh или номер пользователя. Если E=FFh, то в регистре А возвращается номер текущего пользователя. В противном случае устанавливается номер пользователя, заданный в регистре Е. <НАЗАД>

4.32. Функция #21 (33 dec): прямое чтение.

Входные параметры: регистр С: 21h, регистр DE: адрес БУФ.

Выходные параметры: регистр А: код ошибки.

Прямое чтение аналогично последовательному чтению файла, за исклю­чением того, что прямое чтение позволяет вводить записи с произвольным указанным номером. Для обращения к функции необходимо предварительно открыть файл и занести номер записи в поле номера записи при прямом доступе БУФ (байты 33 и 34), байт 35 должен быть предварительно обнулен, так как ненулевое значение этого байта означает переполнение диска.

В регистре А возвращается либо код ошибки (возможные коды ошибок приведены ниже), либо 00h, что означает благополучное завершение операции. В этом случае в буфере обмена содержится введенная запись.

В отличие от последовательного чтения при прямом чтении после ввода записи поле номера записи прямого доступа в БУФ не изменяется и повторение прямого чтения вызовет повторный ввод записи c тем же номером.

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

01h - чтение отсутствующих записей;
02h - не используется при прямом доступе;
03h - ошибка при закрытии текущего экстента;
04h - попытка открыть несуществующий экстент;
05h - не используется при прямом чтении;
06h - физический конец диска.

Коды ошибок 01h и 04h встречаются в случае, когда при операции прямого чтения достигнут блок данных, который до этого не был записан, или экстент, ко­торый не был до этого организован.
Код ошибки 03h обычно не появляется при нормальной работе системы. Она может быть снята при помощи повторного чтения или повторного открытия.
Код ошибки 06h встречается в случае, если 35-й байт БУФ не равен нулю. <НАЗАД>

4.33. Функция #22 (34 dec): прямая запись.

Входные параметры: регистр С: 22h, регистр DE: адрес БУФ.

Выходные параметры: регистр А: код ошибки.

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

Коды ошибок, возвращаемых при прямой записи, идентичны кодам ошибок при прямом чтении кроме кода 05h, который означает, что новый экстент не может быть создан из-за переполнения каталога. <НАЗАД>

4.34. Функция #23 (35 dec): вычислить размер файла.

Входные параметры: регистр С: 23h, регистр DE: адрес БУФ.

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

Функция вычисляет размер файла, имя которого задано в БУФ, и возвращает его в байтах 33, 34 и 35 БУФ. Возвращаемый размер файла на самом деле является продвинутым номером последней записи файла.

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

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

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

4.35. Функция #24 (36 dec): установить номер записи для прямого доступа.

Входные параметры: регистр С: 24h, регистр DE: адрес БУФ

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

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

Функция применяется при переключении с режима последовательного доступа в режим прямого доступа. К файлу осуществляется последовательный доступ до соответствующей записи, вызывается функция #24 (36 dec), устанавливающая номер прямой записи, и, начиная с выбранной точки файла, выполняются операции прямого чтения или записи. <НАЗАД>

4.36. Функция #25 (37 dec): сбросить защиту записи.

Входные параметры : регистр C=25h, регистр DE - вектор сброса защиты записи (аналогично функции #18 (24 dec)).

Функция сбрасывает защиту записи на диске, если соответствующий ему бит в векторе сброса установлен в 1, либо не изменяет статус защиты, если соответствующий бит установлен в 0. <НАЗАД>

4.37. Функция #28 (40 dec): прямая запись с заполнением нулями.

Входные параметры: регистр С: 28h, регистр DE: адрес БУФ. Выходные параметры: регистр А: код ошибки.

Функция аналогична прямой записи за исключением того, что при выделении нового блока, он заполняется нулями перед записью в него данных. <НАЗАД>

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 байт в случае прямого доступа.

Формат первых 32 байтов БУФ совпадает с форматом описателя каталога. Ниже приведена структура БУФ:

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.

BDOS и ССР вызывают BIOS для проведения операций ввода/вывода посредством вектора переходов, расположенных в начале BlOSa. Их краткое описание:

Адрес:

Имя:

Назначение:

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

 

 

 

 

назначить канал и диск. Входная информация : В - номер диска, С - номер канала, DE - указатель на канальный описатель. Выходная информация : А - статус. Внимание(!) : после этого вызова происходит перестройка дисковой системы, поэтому необходимо выполнить перезапуск СР/М или функцию 13 BDOS (сброс дисковой системы).

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 в системе может совпадать.

DPB - адрес таблицы параметров диска (см. ниже). Допускается совместное использование одной и той же таблицы разными DPH.

CSV - адрес области используемой для контроля смены диска. Для каждого DPH в системе должна быть своя область.

ALV - адрес области для контроля за заполнением диска. Для каждого DPH в системе должна быть своя область.

Формат DPB:

SPT
BSH
BLM
EXM
DSM
DRM
AL0
AL1
CKS
OFF
w
b
b
b
w
w
b
b
w
w

SPT - количество секторов (по 128 байт) на дорожку;
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, а остальная часть - в ПЗУ. <НАЗАД>

8.Сообщения об ошибках BIOS.

При работе BIOSa возможно возникновение ошибок дискового монитора. При этом на экран выводится сообщение об ошибке в виде:

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 Экранный драйвер.

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

Символы с кодами не менее пробела (32 десятичное) выводятся на экран (если они не являются частями управляющей последовательности). Остальные символы не печатаются, а часть из них отрабатываются специальным образом:

Код Имя
Реакция
7 BELL
генерируется звуковой сигнал.

8

BS
курсор перемещается на одну позицию назад;
9 TAB
курсор перемещается на ближайшую справа позицию, кратную 8;

0Ah

 

LF

 

перевод строки (курсор перемещается вниз на 1 строку, если курсор находится на последней строке текущего окна то производится ролик);

0Dh

 

CR

 

возврат каретки  (курсор перемещается в начало строки, но пределах текущего окна) ;
0Eh SI
переключение на латинский знакогенератор
0Fh SO
переключение на русский знакогенератор;

1Bh

 

ESC

 

следующие   несколько  символов воспринимаются как управляющая последовательность.
<НАЗАД>

9.2 Управляющие последовательности.

При описании управляющих последовательностей применяются следующие сокращения:

<ESC> - символ Escape (1Bh).

Другие символы в угловых скобках обозначают параметры.

Конструкция {<число>х<параметр>...} (например {Зх<у>}) обозначает пов­торение <параметров> заданное число раз - ({3x<y><q>} эквивалентно (<у><q><y><q><y><q>).

Тип параметра SpShifted означает что код символа, задающего параметр, равен числовой величине параметра плюс код пробела (32). Например, чтобы передать параметр 10 (число 10!), необходимо напечатать символ '*' (код 42 = 32 + 10)

Экранный драйвер воспринимает следующие последовательности:

<ESС>@<символ(SpShifted)> - Прямая печать символа. Параметр этой команды не обрабатывается драйвером экрана, а печатается напрямую (после вычитания кода пробела). Например: последовательность <ESC>@( печатает символ 'стрелка вверх'.

<ESC>A - Перемещение курсора вверх на одну строку.
<ESC>B - Перемещение курсора вниз на одну строку.
<ESC>C - Перемещение курсора вправо на одно знакоместо.
<ESC>D - Перемещение курсора влево на одно знакоместо.
<ESC>E - Стирание экрана (в пределах текущего окна). Курсор перемещается в левый верхний угол окна.

SС>F<цвет букв><цвет фона> - Установка текущего цвета. Параметры, задающие цвет, передаются в виде шестнадцатиричных цифр или одной из букв: N - данный цвет не меняется, I - цвет устанавливается контрастным к 2-му заданному параметру  (недопустимо подавать оба параметра  I). Например: последовательность <ESC>F1N устанавливает печать синими буквами, цвет фона остается тем, какой был задав ранее.

<ESC>G - Зарезервировано для графического интерпретатора.
<ESC>H - Перемещение курсора в левый верхний угол текущего окна.
<ESC>I - Обратный перевод строки. Выполняется симметрично обычному переводу строки (т.е. курсор перемещается вверх а ролик производится вниз).
<ESC>J - Очистка экрана от курсора до конца экрана (в пределах окна).
<ESC>K - Очистка экрана от курсора до конца строки (в пределах окна).
<ESC>M1 - Сброс экранного драйвера. Производится очиска экрана, текущее окно устанавливается во весь экран, курсор перемещается в левый верхний угол экрана и
устанавливается цвет вывода 'белым по черному'.

Это не совсем, однако,так. На самом деле этоа функция переключается между разными экранными режимами (TXT, 640x200 и 320x200), соответственно меняя драйвер вывода символов на экран, если таковой имеется.

В частности, на ATM-turbo 1:

<ESC>M1 (и любое нечетное число после "M") - режим 640х200 и вывод текста в масштабе 80х25.

<ESC>M0 (и любое четное число после "M") - режим 320х200 и вывод текста в масштабе 40х25.

на ATM-turbo 2(+):

<ESC>M1 - режим текстовой консоли 80х25 и, соответственно, вывод текста в масштабе 80х25.

<ESC>M0 - режим 320х200. Драйвер печати в этом режиме не реализован, поэтому печать будет производиться старым драйвером, в результате чего на экране будут появляться только разноцветные точки.

<ESC>M2 - режим 640х200. Драйвер печати в этом режиме не реализован, поэтому печать будет производиться старым драйвером, в результате чего на экране будут появляться только разноцветные точки.

Все остальные цифры после буквы "M" приведут к эффекту, аналогичному цифре "0".

<ESC>N<цвет><GRB> - Установка палитры для заданного цвета. Цвет - шестнадцатиричное  число,   GRB -  3  цифры   (от  0 до  3)  для   задания интенсивности зеленой, красной и синей составляющей соответственно. Например: последовательность <ESC>N0003 установит 0 цвет (первоначально черный) ярко синим.

Разновидность этой последовательности:
<ESC>NT{16x<GRB>} - Установка палитры для всех цветов.
<ESC>O - Зарезервировано для управления музыкальным сопроцессором.
<ESC>P - Вставка символа. Под текущую позицию курсора вставляется про­бел. Остаток строки (в пределах окна) сдвигается вправо.
<ESC>Q - Удаление символа. Удаляется символ в текущей позиции курсора. Остаток строки (в пределах окна) сдвигается влево. В освободившуюся справа позицию прописывается пробел.

SС>R<таблица>{8х<номер>} - Установка таблицы перекодировки. Так как СР/М оперирует 7ми битным кодом ASCII а полный знакогенератор состоит из 256 символов, экранный драйвер производит перекодировку ко­дов символов при печати. Полный набор символов разбит на 16 групп, пере­нумерованных с 0 до F. Так же разбит и перенумерованы возможный диапазон входных ASCII кодов, и каждому из 8 входных интервалов может быть поставлен в соответствие любой из 16 интервалов полного знакогенератора.

Параметр <таблица> (это цифра) задает одну из 3х возможных таблиц перекодировки: 0 - текущая (реально используемая в данное время), 1 - русская (устанавливается по коду SO), 2 - латинская (устанавливается по коду SI).

Внимание: при попытке вывода символа с кодом более 127 для его перекодировки будет использована таблица 1 (русская), т.е. в этом случае ее можно рассматривать как вторые 8 входов в текущей таблице перекодировки.

<ESC>S - Вставка строки. Под текущую строку вставляется строка из пробелов. Остаток экрана смещается вниз (в пределах окна).

<ESC>T - Удаление строки. Удаляется текущая строка. Остаток экрана сме­щается вверх (в пределах окна), освободившаяся снизу строка стирается пробелами.

<ЕSС>U<цвет русский><цвет латинский> - Установка цвета бордюра. В зависимости от текущего режима русский/латинский (переключается ко­дами SO/SI соответственно) устанавливается и, в дальнейшем, поддерживается цвет бордюра (<цвет> - шестнадцатиричная цифра).

<ESC>V - Зарезервированно под запрос статуса экранного драйвера.

<ESC>W<x1><у1><x2><у2> - Установка окна. Все параметры типа SpShifted. Устанавливается текущее окно на координаты х1 (левая грань), х2 (правая грань), y1 (верх), у2 (низ). Левый верхний угол экрана считается точкой с координатами 0,0. Курсор перемещается в левый верхний угол окна.

SС>Х<направление> - Сдвиг окна на 1 позицию. <Направление> обозначается числом: 0 - вверх, 1 - вниз, 2 - вправо, 3 - влево.

<ESC>Y<y><x> - Перемещение курсора. Параметры - SpShifted координаты. Левый верхний угол окна - 0,0.

SС>Z<тип курсора> - Установить тип курсора. Тип курсора: 0 - курсор выключен, 1 - курсор включен (состояние курсора - счетчик, т.е. после нескольких вызовов <ESC>Z0 необходимо столько же раз вызвать <ESC>Z1 для включения курсора), 2 - гибкий курсор (появляется только на время ожидания нажатия клавиши, для выключения режима включить курсор, т.к. эта функция увеличивает счетчик состояния курсора).

SС>[<скорость> - Установка скорости мигания курсора. Параметр -расширенное шестнадцатиричное число (от 0 до 'V'). При увеличении параметра скорость мигания падает.

<ESC>\<arep><adel> - Установка скорости авторепитора клавиатуры (arep), и задержки перед его включением (adel). Типы параметров аналогичны типу параметра в последовательности <ESC>[.

<ESC> ]<начало><конец> - Установка начальной и конечной линии курсора в знакоместе. Параметры - цифры от 0 до 7 (0 - низ знакоместа, 7 - верх). Например: последовательность <ESC>]00 устанавливает курсор типа 'подчеркивание', а последовательность <ESC>]07 - типа 'блок'.

<ЕSС>^<имя флага><0|1> - Установка или сброс флагов. Некоторые аспекты поведения экранного драйвера управляются специальным набором фла­гов. Эта функция устанавливает (2й параметр '1') или сбрасывает ('0') их. Определены следующие флаги:

Т - при установленном флаге 'Т' при выводе и ролике не производится никаких операций с атрибутами (что повышает скорость, но заставляет работать в монохромном режиме);
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.

<НАЗАД>