			  СОДЕРЖАНИЕ

1.Введение.............................................2
2.Структура BIOS.......................................3
3.Функции BIOS.........................................5
4.Дополнительные компоненты BIOS......................10


	     ОПИСАНИЕ БАЗОВОЙ СИСТЕМЫ ВВОДА-ВЫВОДА
		      версия от 3.1988г.

			   ВВЕДЕНИЕ

1.1 Организация CP/M.
	Операционная  система  CP/M  версии 2.2 включает в себя
три системных модуля: CCP (Consol Command Processor - процессор
команд консоли), BDOS ( Basic Disk Operating System  -  базовая
дисковая  операционная  система)  и  BIOS  (Basic  Input Output
System  -  базовую  систему  ввода-вывода).   BDOS  и   CCP   -
аппаратно-независимые  компоненеты  ОС.   При  постановке ОС на
конкретную ЭВМ изменяется только одна  компонента  ОС  - BIOS.
Положение  компонент  CP/M  в адресном пространстве показано на
рис.1 (в текущей реализации).

           |------------------| 0FFFFH
           |     BIOS         |
           |------------------| XXXXH+1600H (0DA00H)
           |     BDOS         |
           |------------------| XXXXH+0806H (0CC06H)
           |     CCP          |
           |------------------| XXXXH (0C400H)
           |     TPA          |
           |------------------| 0100H
           | Базовая страница |
           |------------------| 0000H

                 рис.1

Далее кратко опишем каждую компоненту ОС.

1.2 CCP.
	Процессор команд консоли - CCP - обеспечивает интерфейс
между пользователем и ОС в режиме диалога с ОС.  Он осущестляет
чтение  и  интерпретацию  команд  пользователя.  CCP при работе
использует   функции    BDOS.    При    теплом    старте    CCP
перезагружается,    поэтому    программы   пользователя   могут
использовать область памяти, занимаемую  CCP.   Нижняя  граница
CCP  определяется  конкретной  реализацией ОС.  В данном случае
CCP начинается с адреса  0C400H.   Этот  адрес  можно  косвенно
определить  из  адреса  начала  BDOS  (см.   п.1.3),  поскольку
известен размер этого модуля для каждой версии  CP/M.   В  CP/M
версии 2.2 CCP занимает 806H байт.

1.3 BDOS.
	Базовая дисковая операционная система - BDOS - содержит
ряд  функций ОС, используемых прикладными программами и CCP.  В
частности,    BDOS    обеспечивает    работу     с     файлами,
последовательными    устройствами   и   ряд   других   функций.
Фактически  BDOS  стандартизует  интерфейс  между   логическими
устройствами   и   прикладной   программой.   BDOS  при  работе
использует функции BIOS.  
	Нижняя  граница  BDOS  располагается сразу за CCP.  При
теплом старте область BDOS перезагружается,  поэтому  программа
пользователя,   если   не   используются  функции  BDOS,  может
использовать область памяти, занимаемую BDOS.  Можно определить
адрес  начала  BDOS,  поскольку  известно,  что  по  адресу   5
находится  команда перехода к BDOS.  Другими словами, в ячейках
6 и 7 находится адрес начала BDOS.   Отметим,  что  большинство
программ  BDOS  не  разрушают  и  по  ячейкам  6 и 7 определяют
верхнюю границу памяти, которую можно использовать.

1.4 BIOS.
	Базовая   система   ввода-вывода  -  BIOS  -   является
аппаратно-зависимой компонентой ОС  и  обеспечивает   интерфейс
BDOS с устройствами ввода-вывода (дисплеем, принтером, дисками,
и  т.д.).   BIOS  включает  в  себя  ряд  драйверов  физических
устройств  с  оговоренным  программным   интерфейсом,   таблицу
переходов к функциям  BIOS, таблицы, описывающие характеристики
дисковых  устройств,  и  некоторую  зарезервированную   область
памяти,  которую  использует BDOS при выполнении своих функций.
BIOS,  в  отличии  от  CCP  и  BDOS,  при  теплом   старте   не
перезагружается,   в   памяти   находится  резидентно,  поэтому
перекрытие программ пользователя с областью BIOS не допустимо.
	Нижнюю  границу  BIOS  можно  определить из содержимого
ячеек 1  и  2,  поскольку  по  адресу  ноль  находится  команда
перехода  теплого  старта (BIOS начинается с команды перехода
функции 0).
	Далее будут подробно описаны все стандартные компоненты
BIOS и некоторые дополнительные, связанные с данной реализацией
ОС.   Программистам, использующим в своих программах аппаратные
особенности компьютера (прерывания, графика и т.д.), необходимо
ознакомится с особенностями построения BIOS.
	Раздел  2  описывает общее построение BIOS, интерфейс с
ОС.   Раздел  3  содержит  описание  функций.    Дополнительные
компоненты  BIOS  описаны  в  разделе  4.   Подробное  описание
драйверов BIOS'а приведено в разделе 5.

1.5 TPA.
	Область  транзитных  программ - TPA (Transient Programm
Area) - в операционнoй  системе  CP/M-80  начинается  с  адреса
100H.   Конец  ее  определяется  нижней  границей  BIOS.  В эту
область  ОС  загружает  прикладные   программы   и   транзитные
(загружаемые) команды ОС (PIP,STAT и др.).

1.6 Базовая страница.
	 Базовая    страница   содержит   некоторую   служебную
информацию, команды переходов функций теплого  старта  и  BDOS,
буфер  обмена данными с дисковыми накопителями, устанавливаемый
по умолчанию  и  область  памяти  для  двух  блоков  управления
файлами.   Подробнее  формат базовой страницы дается в описании
BDOS.  


			 СТРУКТУРА BIOS.

2.1  Как  уже  упоминалось,  BIOS  осуществляет интерфейс между
аппаратно-независимой  частью  ОС  и  физическими  устройствами
ввода-вывода.   BIOS  является  единственной резидентной частью
ОС.   Для  правильной  работы  ОС  BIOS  должна   удовлетворять
определенным   требованиям,   оговоренным   далее.    На  рис.2
приведена организация памяти данной версии ОС.

      |-------------------------------| 0FFFFH
      |Память А/Ц дисплея             |
      |-------------------------------| 0FC00H
      |Ввод/вывод                     |
      |-------------------------------| 0FB00H
      |Область служебных регистров    | 
      |-------------------------------| 0FA00H
      |Дополнительное поле клавиатуры |
      |-------------------------------| 0F900H
      |Основное поле  клавиатуры      |
      |-------------------------------| 0F800H
      |Область памяти,зарезервирован- |
      |ная для параметров и констант  |
      |драйверов BIOS'а               |
      |-------------------------------| 0F600H
      |Область кода, таблиц  и буферов|
      |BIOS                           |
      |-------------------------------| 0DA33H
      |Вектор переходов функций       |
      |-------------------------------| 0DA00H

                    РИС.2.

2.2.   Связь  между  BIOS  и  ОС  осущестляется  через  таблицу
переходов функций  BIOS.   Таблица  переходов  располагается  в
начале  модуля  BIOS,  сразу  же  за  модулем BDOS.   Параметры
функций передаются через регистровую  пару  <BC>.   Собственное
значение  функция возвращает (если требуется) через регистр <A>
либо  регистровую  пару  <HL>.    Помимо   таблицы   переходов,
интерфейс   BIOS   включает  в  себя  ряд  таблиц,  описывающих
параметры дисковой системы и области зарезервированной памяти.

2.3. Таблица  переходов  функций BIOS состоит из набора команд
типа JMP, т.е.  на одну функцию в  таблице  отводится  3  байта
(код  команды  JMP  и  адрес  перехода).  Положение перехода в
таблице определяет номер соответствующей функции.  В таблице  1
приведены  функции  BIOS  и  соответствующие  им  точки входа и
краткие   входные/выходные    параметры    функций.     Следует
отметить,что  приводимые  точки  входов  функций  действительны
только в данной реализации ОС.  Поэтому  обычно  их  вычисляют,
принимая  за  точку  отсчета  вектор, расположенный по адресу 1
(адрес перехода функции "теплого старта").
	Более подробно функции BIOS описаны в секции 3.

          Таблица 1. Функции BIOS.
|--------|-------|--------------------------------------------|
|#функции| адрес |          функция                           |
|--------|-------|--------------------------------------------|
|    0   |  DA00 |BOOT   | Начальная инициализация (холодный  |
|        |       |       | старт)                             |
|    1   |  DA03 |WBOOT  | Возвращает некоторые устройства в  |
|        |       |       | исходное состояние, перезагружает  |
|        |       |       | систему (теплый старт)             |
|    2   |  DA06 |CONST  | Опрос состояния консоли            |
|    3   |  DA09 |CONIN  | Ввод   символа с консоли           |
|    4   |  DA0C |CONOUT | Вывод символа на консоль           |
|    5   |  DA0F |LIST   | Вывод символа на печать            |
|    6   |  DA12 |AUXOUT | Вывод символа на  дополнительное   |
|        |       |       | устройство                         |
|    7   |  DA15 |AUXIN  | Ввод символа с дополнительного     |
|        |       |       | устройства                         |
|    8   |  DA18 |HOME   | Установка номера трека 0           |
|    9   |  DA1B |SELDSK | Выбор дискового устройства         |
|   10   |  DA1E |SETTRK | Установка номера трека             |
|   11   |  DA21 |SETSEC | Установка номера сектора           |
|   12   |  DA24 |SETDMA | Установка адреса буфера обмена     |
|        |       |       | данных при дисковых операциях      |
|   13   |  DA27 |READ   | Чтение выбранного  сектора         |
|   14   |  DA2A |WRITE  | Запись выбранного  сектора         |
|   15   |  DA2D |LISTST | Опрос состояния устройства печати  |
|   16   |  DA30 |SECTRAN| Преобразование номера сектора      |
|-------------------------------------------------------------|

2.4   Особенностью  данной  реализации  BIOS  является  наличие
системных ячеек (системной  области),  содержащих  параметры  и
константы функций BIOS, таблицу векторов обработки прерываний и
др.   Положение  этих  ячеек  в  памяти  фиксировано,  что дает
возможность  менять  параметры  функций   BIOS   из   программы
пользователя,  подключать процедуры пользователя к прерываниям,
и т.д.  Под системные ячейки зарезервирована область  0F600H  -
0F7FFH.   Использовать  эту область памяти под какие-либо нужды
не рекомендуется.
	Подробное  описание  системных ячеек дается в описаниях
функций, использующих эту область, и в секции  5,  где  описаны
дополнительные компоненты BIOS.


			 ФУНКЦИИ BIOS

3.1.   Каждая  функция  BIOS  имеет  фиксированную точку входа,
основное тело, и  завершается  ,  как  правило,командой  <RET>.
Параметры  функциям  передаются  через  через  регистровую пару
<BC>.  Собственное 1-байтовое  значение  функции  возвращают  в
регистре   <A>,   2-х  байтовое  -  в  регистровой  паре  <HL>.
Каких-либо  соглашений  о  сохранении   содержимого   регистров
функциями  BIOS  нет.   Далее  будет  подробно описано действие
каждой функции.

		       ФУНКЦИЯ 0: BOOT.
   Входные параметры:  НЕТ.
   Выходные параметры: НЕТ.
   Действие:  осущестляет инициализацию всех устройств;
            - осущестляет инициализацию системной области;
	    - осущестляет инициализацию внутренних переменных;
	    - выводит на консоль начальное сообщение;
	    - устанавливает <user 0> и диск по умочанию "A:".
Эта функция вызывается обычно только один раз, при холодном 
старте системы. Управление после этой функции передается 
функции 1 (WBOOT).

		      ФУНКЦИЯ 1:  WBOOT.
   Входные параметры:  НЕТ.
   Выходные параметры: НЕТ.
   Действие:  реинициализация :
               - контроллера прерываний;
	       - последовательного интерфейса;
	       - таймера;
	       - графического контроллера;
	       - алфавитно-цифрового контроллера;
	       - просмотровой таблицы;
               - части системной области, связанной с 
	         прерываниями;
	      сброс дисковой системы;
	      очистка графического экрана;
	      разрешение подтверждения нажатия клавиши звуком;
	      перезагрузка CCP и BDOS;
	      инициализация команд перехода функций
	       теплого старта и BDOS;
	      установка адреса буфера обмена по умолчанию;
	      передает управление CCP.
Эта функция вызывается обычно при  завершении работы текущей 
программы, либо при вызове с  клавиатуры "теплого старта" (^C).

		      ФУНКЦИЯ 2:   CONST.
   Входные параметры:  НЕТ.
   Выходные параметры: регистр <A> содержит 0FFH, если в буфере
                       консоли имеется введенный символ, и 0,
		       если буфер пуст.
   Действие: НЕТ.

		       ФУНКЦИЯ 3: CONIN.
   Входные параметры:  НЕТ.
   Выходные параметры: регистр <A> содержит код символа,
                       введенного с консоли.
   Действие: функция  ожидает ввода  символа  с клавиатуры.
	      Подробнее см. описание драйвера  клавиатуры.

		      ФУНКЦИЯ 4: CONOUT.
   Входные параметры:  регистр <C> содержит код символа,
                       выводимого на консоль.
   Выходные параметры: НЕТ.
   Действие: выводится символ из регистра <C> на 
             дисплей. Значение кода символа может принимать 
	     значения от 0  до 255. Действие кода или 
	     последовательности кодов приводится в описании 
	     драйвера дисплея.

		       ФУНКЦИЯ 5: LIST.
   Входные параметры:  регистр <C> содержит код символа,
                       выводимого  на печатающее устройство.
   Выходные параметры: НЕТ.
   Действие: выводится  символ из регистра <C> 
             на параллельный интерфейс "CENTRONICS" в 
	     соответствии с протоколом. В случае неготовности
	     периферийного устройства функция находится  в 
	     состоянии ожидания. Код символа может принимать
	     значения от 0 до 255 (подробнее см. описание 
	     драйвера печатающего устройства).

		      ФУНКЦИЯ 6: AUXOUT.
   Входные параметры:  регистр <C> содержит код символа,
                       выводимого  на последовательный 
		       интерфейс.
   Выходные параметры: НЕТ.
   Действие: выводится символ из регистра <C> 
             на  последовательный интерфейс  в соответствии с 
	     протоколом. В случае неготовности периферийного 
	     устройства функция находится в состоянии ожидания.
	     Код символа может принимать значения от 0 до 255 
	     (подробнее см.описание драйвера последовательного 
	     интерфейса).

		      ФУНКЦИЯ 7: AUXIN.
   Входные параметры:  НЕТ.
   Выходные параметры: регистр <A> содержит код символа,
                       введенного с последовательного 
		       интерфейса.
   Действие: функция ожидает прием символа с последовательного
             интерфейса. Значение кода символа может принимать 
	     значения  от 0 до 255. (подробнее см.описание 
	     драйвера последовательного интерфейса).

		      ФУНКЦИЯ 8: HOME.

   Входные параметры:  НЕТ.
   Выходные параметры: НЕТ.
   Действие: устанавливает текущую дорожку в нулевую позицию. 

		      ФУНКЦИЯ 9: SELDSK.

   Входные параметры: регистр <C> содержит номер селектируемого
                      дисковода.
   Выходные параметры: регистровая пара <HL> содержит адрес 
                       блока параметров выбранного дисковода,
		       если содержимое <C> равно 0,1,2,3,4 и
		       считывание информационного сектора 
		       прошло успешно. В противном случае 
		       <HL> содержит 0.
   Действие: если ранее информационный сектор не был считан,
             при селектировании дисковода  считывается 
	     информационный сектор, в соответствии с которым 
	     формируется таблица  дисковых параметров и
	     происходит преобразование логического адреса
	     (сектор и трек диска)  в физический. В случае
	     неудачного считывания  информационного сектора,
	     а также при попытке выбрать несуществующее
	     устройство, функция возвращает нулевое значение.
	     
		      ФУНКЦИЯ 10: SETTRK.

   Входные параметры:  регистр <C> содержит номер текущей
                       дорожки.
   Выходные параметры: НЕТ.
   Действие: устанавливает текущую дорожку в соответствии  с
             содержимым регистра <C>.

		      ФУНКЦИЯ 11: SETSEC.

   Входные параметры:  регистр <C> содержит номер текущего
                       сектора.
   Выходные параметры: НЕТ.
   Действие: устанавливает текущий сектор в соответствии  с
             содержимым регистра <C>.

		      ФУНКЦИЯ 12: SETDMA.

   Входные параметры: регистовая пара <BC> содержит новый адрес
                      буфера  обмена.
   Выходные параметры: НЕТ.
   Действие: устанавливает адрес текущего 128-байтового буфера 
             обмена в соответствии с содержимым  регистровой 
	     пары <BC>.

		      ФУНКЦИЯ 13: READ.

   Входные параметры:  НЕТ.
   Выходные параметры: регистр <A> содержит 0, если операция
                       прошла успешно, и не ноль в противном
		       случае.
   Действие: при успешном  завершении операции 128-байтовый
             сектор, заданный функциями SELDSK, SETTRK, SETSEC,
	     считывается в область памяти, заданную функцией 
	     SETDMA.

		      ФУНКЦИЯ 14: WRITE.

   Входные параметры: содержимое  регистра <C> указывает на
                      тип записи: 0 - обычная запись.
		      1 - запись в директорию.
		      2 - запись в новый  блок .
   Выходные параметры: регистр <A> содержит 0, если операция
                       прошла успешно, и не ноль в противном
		       случае.
   Действие: при успешном завершении операции происходит запись
             128-байтового сектора, заданного функциями SELDSK,
	     SETTRK, SETSEC, из области памяти, заданной  
	     функцией SETDMA.

		      ФУНКЦИЯ 15: LISTST.

   Входные параметры:  НЕТ.
   Выходные параметры: регистр <A> содержит 255,если печатающее
                       готово принять символ, и 0, если нет.
   Действие: НЕТ. 

		     ФУНКЦИЯ 16: SECTRAN.

   Входные параметры:  регистровая пара <BC> содержит номер
                       логического сектора, а <DE> - адрес
		       таблицы перевода логических векторов
		       в физический. Если содержимое <DE>
		       равно нулю, таблицы не существует.
   Выходные параметры: регистровая пара <HL> содержит номер
                       физического сектора.
   Действие: функция преобразует номер логического сектора (
             от 0 до n) в физический (от 1 до k). В данной 
	     реализации таблицы перевода секторов не 
	     используются (в связи с используемым форматом 
	     записи на диск), поэтому <HL>=<BC>+1.


		Дополнительные компоненты BIOS.

4.1.    ОС   типа   CP/M  имеет  хорошо  описанный  стандартный
программный интерфейс,  позволяющий  обращаться  к  устройствам
ввода-вывода.   Это  большое достоинство ОС имеет вытекающие из
него  недостатки,  поскольку  описанный   заранее   программный
интерфейс   не  позволяет  эффективно  использовать  аппаратные
особенности  машины.   Кроме  того,  ОС  CP/M  не  описывает  в
достаточной  степени  работу  с прерываниями.  В связи с этим в
BIOS  оговаривается   ряд   элементов,   отражающие   некоторые
аппаратные и программные особенности реализации ОС.  

4.2.  Программа пользователя может непосредственно обращаться к
следующим элементам ввода-ввывода, непосредственно включенным в
карту   памяти   ЭВМ   (рис.2):   алфавитно-цифровой   дисплей,
клавиатура, просмотровая таблица,  системный  регистр,  регистр
цвета,   контроллер   прерываний,   таймер,   локальная   сеть,
последовательный интерфейс, контроллер  диска,  порт  принтера,
джойстики  и  т.д.   Подробнее  правила работы с перечисленными
устройствами описаны в руководстве  системного   программиста.
Следует  отметить,  что  вмешательство  в  работу на физическом
уровне  обычно  нарушает  нормальную   работу   соответствующих
драйверов, поэтому делать это нужно очень внимательно, и только
в случае необходимости.

4.3.   ПК8020  содержит  встроенный  контроллер прерываний типа
КР580ВН59,   обслуживающий   следующие   устройства:    

	уровень прерываний 0: прерывание пользователя, выведено
                              на разъем XS1:33.
	уровень прерываний 1: приемник последовательного
	                      интерфейса.   
	уровень прерываний 2: передатчик посл.  интерфейса.   
	уровень прерываний 3: приемник локальной сети.  
	уровень прерываний 4:прерывание от начала вертикального
	                      бланка (системное прерывание с 
			      периодом около  20 мсек.).
	уровень прерываний 5: прерывание от таймера.
	уровень прерываний 6: печатающее устройство.
	уровень прерываний 7: прерывание от сигнала выключения
                              двигателя НГМД.

4.3.1.   Контроллер  прерываний  инициализирован таким образом,
что разность между стартовыми адресами  составляет  4  байта  и
начальный  адрес  подпрограмм  обработки  прерываний составляет
0F7E0H, т.е.  таблица  стартовых  адресов  прерываний  выглядит
таким образом (рис.3) :

	ORG 	0F7E0H
F7E0H:	JMP 	INT0
	DB	0
F7E4H:	JMP 	INT1
	DB	0
F7E8H:	JMP 	INT2
	DB	0
F7ECH:	JMP 	INT3
	DB	0
F7F0H:	JMP 	INT4
	DB	0
F7F4H:	JMP 	INT5
	DB	0
F7F8H:	JMP 	INT6
	DB	0
F7FCH:	JMP 	INT7
	DB	0
	рис. 3

4.3.2.   Из-за  аппаратных особенностей компьютера, связанных с
переключением карты памяти, прерывания в  ряде  случаев  должны
быть  запрещены.   Чтобы частично преодолеть этот недостаток, в
BIOS введена предварительная обработка прерываний, в результате
которой  таблица  стартовых  адресов  (рис.3)  преобразуется  в
таблицу векторов прерываний:

; Аппаратные прерывания.
VTRAP0:	DW DOINT0
VTRAP1:	DW DOINT1
VTRAP2:	DW DOINT2
VTRAP3:	DW DOINT3
VTRAP4:	DW DOINT4
VTRAP5:	DW DOINT5
VTRAP6:	DW DOINT6
VTRAP7:	DW DOINT7
; Псевдопрерывания.
VTRAP8:	DW AUXI0
VTRAP9:	DW AUXI1
VTRAP10:DW AUXI2
VTRAP11:DW AUXI3

    рис.4

4.3.3.     Процесс    предварительной    обработки   прерываний
заключается   в   следующем.    Нормализуется   карта    памяти
(устанавливается значение системного регистра 1CH), сохраняются
регистры  <HL>  и  <PSW>, затем управление передается процедуре
обработки прерывания, адрес которой находится в  ячейке  VTRAPi
(рис.4).  Отметим, что системные процедуры обработки прерываний
имеют  стандартный  выход из прерываний,  т.е.  восстанавливают
содержимое   спасенных   регистров,    сбрасывают    контроллер
прерываний, разрешают прерывания и выполняют команду RET.

4.3.4.    Таблица   векторов   прерываний  имеет  фиксированное
положение.  Адрес ячейки VTRAP0 0F7C8H. 

4.3.5.   Таблица  векторов прерываний (рис.4), кроме 8 векторов
аппаратных прерываний (VTRAP0-VTRAP7), дополнительно содержит 4
вектора псевдопрерываний.   В  данной  реализации  используется
только псевдопрерывание 8 - псевдопрерывание клавиатуры.

4.3.6. Правила подключения к прерываниям. Если пользователь
хочет подключить свою процедуру  к (i) прерыванию, он должен 
совершить следующие действия:
   1. Получить адрес VTRAP0.
   2. Вычислить адрес VTRAPi.
   3. Запретить прерывания.
   4. Считать значение TRAPi из VTRAPi и запомнить его.
   5. Записать по адресу VTRAPi адрес процедуры обработки
      прерываний.
   6. Разрешить прерывания.

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

4.3.7. Ограничения на процедуры обработки прерывания:
  1. Все регистры, кроме <HL> и <PSW>, должны быть сохранены.
  2. На выходе процедуры управление должно передаваться
     по адресу TRAPi, полученному при подключении процедуры
     к прерыванию (п.4.3.6).
  3. Внутри процедуры нельзя вызывать функции BDOS и BIOS.
  4. Нельзя разрешать прерывания (в данной реализации не
     допускаются вложенные прерывания).
  5. Глубина стека - одно вложение.

4.3.8. Отключение процедуры пользователя от прерывания:
  1. Вычислить адрес VTRAPi.
  2. Запретить прерывания.
  3. Восстановить содержимое VTRAPi, поместив туда 
     первоначальное значение TRAPi.
  4. Разрешить прерывания.
Следует отметить, что "теплый" старт полностью восстанавливает
все, что связано с  прерываниями, в первоначальный вид.

4.4  В  персональных  компьютерах  различные  функции  обмена с
периферийными устройствами, такие как опрос  клавиатуры,  вывод
на  дисплей  и  т.д.   часто  выполняются самим компьютером.  В
связи  с  этим  появляется   возможность   непосредственно   из
программы   пользователя  изменять  параметры  и  режим  работы
некоторых драйверов, выполняющих отдельные функции  BIOS.   Это
позволяет  значительно  повысить  эффективность работы программ
пользователя с системами BIOS.
	В   этом   разделе   приводится  список  ячеек  памяти,
содержащих те или иные  параметры  или  задающие  режим  работы
отдельных драйверов.  При изменении версии системы расположение
и назначение отдельных ячеек изменяться не будет, однако это не
исключает  возможность  использования новых ячеек для развития.
Поэтому не рекомендуется использовать область  системных  ячеек
0F600H - 0F7FFH для каких либо целей.
	Ниже  приведен список используемых ячеек с обозначением
функций.  Более  подробные  сведения  приводятся  при  описании
соответствующих   драйверов.

4.4.1.  Системные ячейки.
		ORG 0F700H
		DS  3
  SYSCOPY:  	DB 1CH	;0F703H - Копия системного регистра
  COLCOPY:	DB  0	;0F704H - Копия регистра цвета

4.4.2.  Ячейки драйвера экрана

  CARD:		DW 0FC00H ;0F705H - Адрес курсора
  CSRFLAG:	DB 0	  ;0F707H - Флаг отображения курсора
  CURSOR:	DB 0	  ;0F708H - Символ курсора
  CSRATTR:	DB 00010000B ;0F709H - Атрибут символа курсора
  BUFCHAR:	DB 0	  ;0F70AH - Символ из позиции курсора
  BUFATTR:	DB 0;0F70BH-Атрибут символа из позиции курсора
  AUTOFLAG:	DB 0FFH	  ;0F70CH - Флаг автоперевода строки
  ESCFLAG:	DB 0	  ;0F70DH - Флаг ESC-последовательности
  FNUM:		DB 0	  ;0F70EH - Рабочая ячейка
  ADRTAB:	DW ADRT	;0F70FH - Адрес таблицы П/П CTRL-симв.
  ESCTAB:	DW ESCT	;0F711H - Адрес таблицы П/П ESC-посл.
  MINESC:	DB '0'	;0F713H - Начало таблицы ESC-симв.
  LIMESC:	DB 'Y'	;0F714H - Конец таблицы ESC-симв.
  BELLDIV:	DW 0B00H;0F715H - Высота сигнала BELL
  BELLDEL:	DW 1000Х;0F717H - Длительность сигнала BELL

4.4.3. Ячейки драйвера клавиатуры.
		DS 1
  SETFLAG:	DB 0	;0F71AH -Флаг набора символов (0 осн.)
  		DS 5
  LONGVAL:	DB 0	;0F720H - Задержка автоповтора
  AUTOVAL:	DB 0	;0F721H - Период автоповтора
		DS 1
  GETPNT:	DW KEYBUF ;
  PUTPNT:	DW KEYBUF ;указатель буфера скан-кода
		DS 2
  CONTAB:	DW CONT ;0F729H - Адрес табл. доп. клавиш
  FUNTAB:	DW FUNT ;0F72BH - Адрес табл. функ.клавиш
  FSHIFT:	DB 0FFH ;0F72DH - Флаг регистра (0-нижний)
  FALF:		DB 2H	;0F72EH - Флаг алфавита (0-русский)
  FGRAPH:	DB 0	;0F72FH - Флаг графический (4-граф.)
  FSEL:		DB 0	;0F730H - Флаг цифр (10H - цифры)
  SNDFLG:	DB 0FFH ;0F731H - Флаг подтв. нажатия (0-нет)
  
  CONT:		DW C0	;0F736H - Таблица адресов для доп.кл.
  		DW C1
		DW C2
		DW C3
		DW C4
		DW C5
		DW C6
		DW C7
		DW C8
		DW C9
		DW CCOMMA
		DW CDEL
		DW CINS
		DW CCLS
  FUNT: 	DW F1	;0F752H - Таблица адр.для функц.кл.
  		DW F2
		DW F3
		DW F4
		DW F5
		DW F6
		DW F7
		DW F8
		DW F9
		DW F10

4.4.4. Ячейки драйвера накопителя на  кассете
  
  WAVE1F:	DB 61	;0F766H Длительность записи импульса
  		DB 68
  WAVE2F:	DB 27	;0F768H
  		DB 33	;
  STMES:	DB 0	;0F76AH - рабочие ячейки
  BITMES:	DB 0	;НКМЛ

		DS 2
4.4.5. Ячейки для работы с таблицей цветов

  LUTFL:	DB 0	;0F76EH - Флаг изменения таблицы LUT
  ADRLUT:	DW TABLUT;0F76FH - Адрес таблицы LUT
  TABLUT:	DB 00H	;0F771H - Копия системной табл.LUT
  		DB 91H
		DB 0A2H
		DB 0B3H
		DB 0C4H
		DB 0D5H
		DB 0E6H
		DB 0F7H
		DB 0F8H
		DB 0F9H
		DB 0FAH
		DB 0FBH
		DB 0FCH
		DB 0FDH
		DB 0FEH
		DB 0FFH

4.4.6. Ячейки  драйвера принтера

  FLGINT:	DB 0 ; 0F781H тип интерфейса принтера
  PRNTAB:  DW LSTTAB ; 0F782H таблица кодировки  LST 128 байт

4.4.7. Ячейки системы прерываний.

  HINTTAB:	DW DOINT0 ;0F7C8H - таблица П/П обр.прерываний
  		DW DOINT1 ;0F7CAH
  		DW DOINT2 ;0F7CCH
  		DW DOINT3 ;0F7CEH
  		DW DOINT4 ;0F7D0H
  		DW DOINT5 ;0F7D2H
  		DW DOINT6 ;0F7D4H
  		DW DOINT7 ;0F7D6H
  		DW AUXI0  ;0F7D8H
  		DW AUXI1  ;0F7DAH
  		DW AUXI2  ;0F7DCH
  		DW AUXI3  ;0F7DEH

Вектора  переходов  по  прерыванию

		JMP INT0  ; 0F7E0H - уровень прерываний  0
		DS 1
		JMP INT1  ; 0F7E4H
		DS 1
		JMP INT2  ; 0F7E8H
		DS 1
		JMP INT3  ; 0F7ECH
		DS 1
		JMP INT4  ; 0F7F0H
		DS 1
		JMP INT5  ; 0F7F4H
		DS 1
		JMP INT6  ; 0F7F8H
		DS 1
		JMP INT7  ; 0F7FCH
		DS 1

4.5.   Ряд  устройств, такие как джойстики, порт расширения, не
имеют  драйверов  в  BIOS.   Кроме  того,  пользователь   может
применять   некоторые   устройства  непредусмотренным  образом.
Например,  к  последовательному  интерфейсу  можно   подключить
"мышь".   Работу  с  этими  устройствами программа пользователя
должна организовывать сама.  Необходимые сведения  о  том,  как
это   сделать,   можно   почерпнуть   из   описания  системного
программиста.

4.6.   Имеются  драйверы,  встроенные  в  BIOS,  но  не имеющие
непосредственного выхода в  систему.   Сюда  относится  драйвер
просмотровой   таблицы.    Поскольку   в   диалоге  с  системой
просмотровая  таблица  должна   быть   настроена   определенным
образом,  управление  ею  заложено в BIOS.  Применение драйвера
просмотровой   таблицы,   находящегося   в   BIOS,    сохраняет
совместимость   на   программном   уровне   при   модернизации
аппаратуры.

4.6.1.   Имеется  копия  системной  просмотровой  таблицы.  Эта
таблица располагается в ячейках 0F771H - 0F780H, всего 16 байт.
При каждом теплом старте эта  копия  заносится  в  просмотровую
таблицу.   Таким  образом, меняя содержимое этой таблицы, можно
получить желаемые сочетания цветов символов и фона при выходе в
систему.

4.6.2.   Имеется  ячейка  памяти  (0F76FH),  где хранится адрес
рабочей копии просмотровой таблицы.  По умолчанию -  это  адрес
системной копии.  Если пользователь желает использовать драйвер
просмотровой  таблицы,  находящийся  в  BIOS, он должен сначала
поменять этот адрес на адрес своей копии таблицы.  Отметим, что
при теплом старте значение адреса системной копии  просмотровой
таблицы восстанавливается.

4.6.3.    Собственно  драйвер  просмотровой  таблицы  в  данной
реализации работает по прерыванию 4 (период 20 мс).   Признаком
требования  запуска  драйвера  служит содержимое ячейки 0F76EH.
Если содержимое этой ячейки отлично от нуля, драйвер  во  время
ближайшего  обратного  хода  по  кадрам  выдает  в просмотровую
таблицу последовательно 16 байтов, начиная с адреса, считанного
из ячейки 0F76FH.  После окончания  операции  в  ячейку  0F76EH
заносится ноль.  По этому признаку программа пользователя может
проверить, выполнена ли реинициализация просмотровой таблицы.

	5. ОПИСАНИЕ ДРАЙВЕРОВ
	5.1.   Драйвер  дисплея обеспечивает выполнение функции
CONOUT  в  BIOS.   Собственно  BIOS  осущестляет  только  вызов
драйвера,   находящегося   в  ПЗУ.   Описание  работы  драйвера
приведено  в  Руководстве  Системного  Программиста,   куда   и
отсылаем любопытных.
	5.2. Драйвер клавиатуры  обеспечивает работу функций
BIOS CONIN и CONST. Он состоит из нескольких частей.
	5.2.1.     Непосредственный   опрос   поля   клавиатуры
выполняет  функция  INKEY.   На  выходе  эта   функция   имеет,
во-первых,  в  регистрах  <C>  и  <B>  соответственно  скан-код
нажатой клавиши и текущее значение строки  модификаторов  кода,
и,  во-вторых,  совершает  небходимые  изменения значений ячеек
FALPH, FSHIFT, FGRAPH и  FSEL.   Если  нажата  одна  из  клавиш
SHIFT, ALPH, GRAPH или SEL, и одновременно нажать клавишу LOCK,
то  текущее  состояние указанных модификаторов кода заносится в
соответствующие им ячейки.  
	Функция INKEY осуществляет автоповтор.  Задержка начала
автоповтора  определяется содержимым ячейки LONGVAL, умноженным
на 20 мс, период  автоповтора  определяется  содержимым  ячейки
AUTOVAL,   умноженным   на  20  мс  (значение  0  соответствует
наибольшей задержке - 20*256 мс, т.е.  около 5 сек).  
	Функция   INKEY   вызывается   из  процедуры  обработки
прерывания номер 4 (период 20 мс).  Результат заносится в буфер
клавиатуры -  ячейки  SYMBUF  и  CNTRKEY  (скан-код  и  текущее
значение строки клавиш-модификаторов кода.
	На  рис.   5.1  приведена  схема  расположения  клавиш.
Отметим,  что  скан-код   соответствует   расположению   клавиш
(считать  нужно  слева  направо  и  сверху  вниз, начиная с 1).
Таблица скан-кодов клавиш приведев приложении 1.

 		       D0  D1  D2  D3  D4  D5  D6  D7
		     |---|---|---|---|---|---|---|---|
  основное поле:     |   |   |   |   |   |   |   |   |

    KB00    01H	       Ю   А   Б   Ц   Д   Е   Ф   Г
    KB01    02H        Х   И   Й   К   Л   М   Н   О
    KB02    04H	       П   Я   Р   С   Т   У   Ж   В
    KB03    08H        Ь   Ы   З   Ш   Э   Щ   Ч   ъ
    KB04    10H        0   1   2   3   4   5   6   7
    KB05    20H        8   9   *   +   <   =   >   /
    KB06    40H	      ВК   ТР СТП  ИЗ  ВЗ  ВШ ТАБ ПРОБЕЛ
    KB07    80H	      РГЛ АЛФ ГРФ ПРФ СЕЛ УПР ФКС РГП
[   KB07    80H	      SHT ALP GRP ESC SEL CNT LCK SHT ]

  дополн. поля:

    KB08   101H	       0   1   2   3   4   5   6   7
    KB09   102H	       8   9                   .
    KB10   104H	       F1  F2  F3  F4  F5  F6  F7  F8
    KB11   108H	       F9  F10

             рис.5.1.

	5.2.2.   Функция  BIOS  CONIN требует выдачи кода КОИ-8
клавиши.  Для его получения имеется  специальный  драйвер  ASC,
преобразующий    скан-код   в   код   символа   КОИ-8   или   в
последовательность кодов (для некоторых клавиш) в  соответствии
с   ячейками-модификаторами  CNTRKEY,  FGRAPH,  FALPH,  FSEL  и
FSHIFT.  Драйвер ASC интерпретирует клавиши следующим образом.

	5.2.2.1.    Клавиши   с   скан-кодом   от   1   до   32
интерпретируются в зависимости от ячеек FALPH,FGRAPH,CNTRKEY  и
FSHIFT.  Если в ячейке CNTRKEY установлен бит CNTR, формируется
контрольный код (от 0 до 31), независимо от остальных ячеек.
	Если  в  ячейке FGRAPH установлен бит 2 и не установлен
бит GRAPH в ячейке CNTRKEY (или наоборот), то  формируется  код
графического символа, в зависимости от состояния SHIFT, либо от
128 до 159, либо от 160 до 191.
	Если  установлен  бит  1 в ячейке FALPH и не установлен
бит ALPH в ячейке CNTRKEY (или наоборот), то  формируются  коды
латинского  алфавита  и  некоторых  специальных  символов  (см.
таблицу кодов КОИ-8), в зависимости от состояния SHIFT, либо от
64 до 95, либо от 96 до 127.
	В  остальных  случаях  формируются  коды КОИ-8 русского
алфавита.  Если содержимое ячейки SETFLAG отлично от  нуля,  то
коды КОИ-8 соответствуют ГОСТу 1988 г., иначе ГОСТу 1974 г.
	Состояние  SHIFT  определяется  одновременно содержимым
ячейки FSHIFT и битов 0 и 7 ячейки  CNTRKEY.   Если  содержимое
ячейки  FSHIFT  не  равно  нулю и не установлены биты 0 или 7 в
ячейке CNTRKEY, (или наоборот), то  формируются  коды  строчных
символов.

	5.2.2.2.    Клавиши   с   скан-кодом   от   33   до  48
интерпретируются как цифры и некоторые знаки (коды от 33 до 63,
см.  таблицу кодов).   На  формирование  этих  кодов  оказывают
влияние только биты 0 и 7 ячейки CNTRKEY (клавиши SHIFT).

	5.2.2.3.   Клавиши с скан-кодом от 49 до 56.  Клавиша с
скан-кодом 60 интерпретируется как  ESC  (код  27).   Остальные
клавиши  этой  группы  собственных  кодов  не  имеют и являются
модификаторами  кодов,  т.е.   эти  скан-коды  в  драйвер   ASC
попадать не должны.

	5.2.2.4.   Клавиши  с  скан-кодом от 57 до 64 формируют
коды управляющих символов.  Сюда  относятся  клавиши  ВК,  ТАБ,
ПРОБЕЛ,  BS,  СТОП.   Помимо этого, есть еще три клавиши - DEL,
INS и CLS.  Эти клавиши обрабатываются отдельно, в ответ на них
формируются последовательности (подробнее описано ниже).
	5.2.2.5.    Клавиши   с   скан-кодом   от   65   до  80
интерпретируются  в  зависимости  от  состояния  ячеек  FSEL  и
CNTRKEY.   Если  установлен  бит  4 ячейки FSEL и не установлен
соответствующий бит  ячейки  CNTRKEY  (или  наоборот),  то  эти
клавиши  интерпретируются  как  цифровые и выдаются коды цифр и
знаков.  В противном случае выдается последовательность  кодов.
Под  последовательностью кодов имеется ввиду следующее.  Где-то
в памяти машины последовательно располагаются набор кодов,  для
каждой  клавиши  свой.   Если  драйвер  ASC  обнаруживает,  что
входному  скан-коду  соответствует  последовательность,  он   в
соответствии   с   скан-кодом   определяет  адрес  начала  этой
последовательности и запоминает его,  устанавливает  внутренний
флаг последовательности, и возвращает вызывающей функции первый
символ    последовательности    (если   это   ноль,   то   флаг
последовательности  не   устанавливается).    При   последующих
обращениях   к   функции   CONIN  проверяется  состояние  флага
последовательности.  Если он установлен, то  извлекается  адрес
последовательности,   увеличивается   на   один,   запоминается
обратно,  и  извлекается   следующий  байт  последовательности.
Если   извлеченный   байт  равен  нулю,  то  сбрасывается  флаг
последовательности.
	Теперь   о   том,   как   определяется   адрес   нужной
последовательности.  Известно, что в  ячейке  0F729H  находится
адрес  таблицы  векторов последовательностей.  Таблица векторов
последовательностей представляет из  себя  набор  2-х  байтовых
адресов,  указывающих  на начало последовательности.  В текущей
реализации   каждому   скан-коду   этой   группы   ставится   в
соответствие  одна  последовательность.   Помимо  этих клавиш к
этой же группе относены клавиши DEL, INS и CLS.   Т.о.   всего
имеется  14 векторов.  По умолчанию таблица векторов начинается
с адреса 0F736H, а сами последовательности находятся в  ячейках
0F6A0H-0F6F3H,  т.е.  на каждую последовательность отводится по
6 байт.
	Отметим, что в последствии предполагается удвоить число
последовательностей этой группы клавиш за счет использования
модификатора SHIFT.

	5.2.2.6.    Клавиши   с   скан-кодом  от  81  до  91  -
интерпретируются  как  функциональные,  и  в   ответ   выдаются
последовательности.   Механизм  формирования последовательности
идентичен описанному в п.5.2.2.5.  Адрес таблицы адресов начала
последовательностей расположен в ячейке  0F72BH  (FUNTAB).   По
умолчанию  эти  адреса  расположены  в ячейках 0F752H-0F764H, а
сами последовательности располагаются в ячейках  0F600H-0F69FH,
по  16  байт  на  одну последовательность.  При нажатой клавише
SHIFT скан-коды 81-85 интерпретирутся как клавиши F6-F10.

	5.2.2.7. Клавиши с скан-кодами 97-112 интерпретируются
как аналоги клавиш 65-80 в режиме управляющих клавиш (выдаются
последовательности, описанные в п.5.2.2.5).

	5.2.2.8. При  получении драйвером ASC скан-кода, не
попадающего ни в одну из описанных групп, возвращается значение
кода ноль.

	5.2.3. Функция CONST возвращает в регистре <A> 0FFH,
если драйвер клавиатуры готов выдать очередной символ, и 0 в
противном случае.

	5.2.4.  Подробнее опишем процесс опроса клавиатуры.  Во
время работы подпрограммы обработки прерывания 4 (период 20 мс)
производится   анализ  буфера  клавиатуры.   Если  буфер полон,
клавиатура не  опрашивается.   В  противном  случае  вызывается
функция  INKEY.  Если нажата какая-либо клавиша (за исключением
клавиш-модификаторов), ее скан-код  заносится  в  регистр  <C>,
содержимое  ячейки  CNTRKEY  -  в  регистр  <B>,  и  управление
передается  вектору  псевдопрерывания  8  (AUXI0).   На  выходе
псевдопрерывания проверяется содержимое регистра <C>.  Если оно
равно  нулю,  считается,  что  клавиша  не нажата.  В противном
случае содержимое регистра <C> заносится  в  буфер  клавиатуры,
содержимое  ячейки <B> - в ячейку CNTRKEY.  Далее анализируется
содержимое  ячейки  SNDFLG.   Если  оно  не  равно   нулю,   то
инициируется   нужным   образом   звуковой   канал   таймера  и
запускается щелчок.

	5.2.5. Адреса системных ячеек клавиатуры, не указанные
в разделе 5, приведены в п.4.4.3.

	5.3. Драйвер печатающего устройства обеспечивает работу
функций BIOS LIST и LISTST.
	5.3.1. Функция LISTST возвращает  в регистре <A> 0FFH,
если печатающее устройство готово принять следующий символ, и
ноль в противном случае. Протокол обмена с печатающим
устройством соответствует интерфейсу CENTRONIX (ИРПР-М).
Отсутствие сигнала BUSY (см. описание интерфейса) считается 
признаком готовности печатающего устройства.
	5.3.2.  Функция LIST обеспечиает передачу кода, который
требуется  напечатать, на принтер.  Процедура обмена следующая.
Сначала ожидается  готовность  печатающего  устройства  принять
символ.   Затем  требуемый  код  выставляется  на  шину  данных
интерфейса и  формируется  строб  записи  данных  отрицательной
полярности длительностью приблизительно 20 мкс.
	Печатаемые  символы могут иметь коды от 0 до 255.  Коды
0-127 достаточно стандартны - это ASCII.   Коды  128-255  могут
использоваться для  различных  целей  -  национальные алфавиты,
псевдографика и  т.д.   Чтобы  обеспечить  наибольшую  гибкость
работы,  коды  128-255  при  выводе  на  печатающее  устройство
преобразуются  через  перекодировочную  таблицу.   Адрес   этой
таблицы расположен в системной области, в ячейке 0F781H.

	5.4. Драйвер последовательного интерфейса поддерживает
работу функций  BIOS PUNCH и  READER.
	5.4.1.   Функция  PUNCH  обеспечивает  вывод символа на
последовательный интерфейс.  Передаваемые символы  могут  иметь
коды  от  0  до  255.  При передаче коды не модифицируются.
	Прежде, чем начать передачу, драйвер ожидает разрешения
передачи.    Считается,  что  передача  разрешена,  если  буфер
передатчика пуст (передан предыдущий байт) и активен сигнал DSR
(см.  описание интерфейса RS-232).
	5.4.2. Функция READER вводит символ с последовательного
интерфейса. Вводимый символ может иметь код от 0 до 255.
	Считается, что символ может  передаваться партнером,
если  подан сигнал DTR (см. описание интерфейса RS-232).
	Последовательность  работы  драйвера  READER следующая.
Сначала проверяется, есть ли символ в буфере  приемника.   Если
есть, этот символ возвращается.  Если нет, то включается сигнал
DTR  и  ожидается прием символа.  Как только принимаемый символ
оказывается  в  буфере  приемника,  выключается  сигнал  DTR  и
возвращается код принятого символа.
	5.4.3.    Отметим,   что   драйверы   последовательного
интерфейса предполагают, что аппаратура настроена заранее, т.е.
установлена скорость передачи, разрешена передача и т.д.  Кроме
того,    драйверы    последовательного    интерфейса     ошибки
приема/передачи  не  анализируют  и,  соответственно,  о них не
сообщают.  Правила настройки аппаратуры  приведены  в  описании
системного программиста.

	5.5. Драйверы работы с диском реализуют следующие
функции BIOS:
   8. HOME   - установка нулевой дорожки текущего дисковода .
   9. SELDSK - выбор текущего дисковода.
  10. SETTRK - установка дорожки текущего дисковода.
  11. SETSEC - установка сектора, с которым производится обмен.
  12. SETDMA - установка адреса буфера обмена.
  13. READ   - операция чтения сектора, заданного функцией 
               SETSEC, с дорожки, заданной функцией SETTRK или
	       HOME, с дисковода, заданного функцией SELDSK в
	       буфер, заданный функцией SETDMA.
  14. WRITE  - операция записи сектора, заданного функцией 
               SETSEC,на дорожку, заданную функцией SETTRK или
	       HOME,на дисковод, заданный функцией SELDSK, из
	       буфера, заданного функцией SETDMA.
  16. SECTRAN- операция перевода логического сектора в 
               физический.

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

	5.5.1.   Прежде,  чем  приступить  к  описанию дисковых
операций, дадим необходимые сведения об устройстве диска.
	С   точки  зрения  ОС  CP/M  важно  знать  общий  объем
информации, который  можно  записать  на  диск,  и  как  искать
информацию (адрес).  
	Физическим адресом информации является номер дорожки,
номер сектора и сторона диска.
	В    силу    разных   обстоятельств   имеется   большое
разнообразие таких существенных параметров используемых дисков,
как  число  используемых  сторон  (одна  или  две   головки   в
дисководе), число дорожек, информационный размер дорожки, число
секторов на дорожке, способ записи на диск и др..
	Чтобы  иметь  возможность  работать  с разными дисками,
CP/M предполагает наличие  таблицы,  называемой  Блок  Дисковых
Параметров  (DPB).  Подробное описание этой таблицы приведено в
описании функции SELDSK.  Здесь  укажем  только,  что  из  этой
таблицы   CP/M  может  извлечь  информационный  объем  диска  и
дорожки, расположение и размер директории  (CP/M  считает,  что
размер сектора возможен ТОЛЬКО 128 байт и сторона у диска может
быть  ТОЛЬКО одна).  Из сказанного ясно, что CP/M может указать
адрес  нахождения  информации:  номер  дорожки  и   номер   128
байтового сектора.
	Реальный,  физический  размер  сектора,  используемый в
различных системах, может составлять 128,256,512 и 1024  байта.
Соответственно  увеличению  размера  сектора  уменьшается число
физических  секторов  на  дорожке.   Запись   каждого   сектора
сопровождается  некоторой  служебной информацией, причем размер
этой  информации  не  зависит  от  размера  сектора.    Другими
словами,  при  увеличении  размера  физического  сектора  число
физических секторов уменьшается,  при  этом  уменьшаются  общие
накладные  расходы,  и емкость одной дорожки  может возрастать.
Кроме того, одновременно растет скорость  обмена,  поскольку  в
один прием обмен происходит большей  порцией.  Продемонстрируем
сказанное  реальными  форматами  дисков  при  двойной плотности
(MFM) для дисков 5.25"(или 3.5"):

  Размер сектора     число секторов/трек     размер трека
    128                    26                   3.25 Кб
    256                    16                   4.00 Кб
    512                     9                   4.50 Кб
   1024                     5                   5.00 Кб

Из  таблицы  видно,  что выгодно увеличивать размер физического
сектора.  По этой  причине  рекомендуемый  размер  сектора  при
двойной  плотности  -  1024  байта.   Однако при этом возникает
проблемма разбиения большого физического сектора  на  несколько
128   байтовых   логических.    Подробно   этот   вопрос  будет
обсуждаться позднее.
	Если  дисковод  способен  работать  с  обоими сторонами
диска, число физических дорожек  удваивается.   В  этом  случае
обычно  четные  логические  (передаваемые  ОС)  номера  дорожек
соответствуют стороне 0, а нечетные - стороне 1.
	Сопоставление    физического   и   логического   адреса
полностью лежит на BIOS.
	Чтобы  BIOS  правильно  определял  требуемый физический
адрес из логического, он должен точно знать, какой диск в  него
вставлен  (с какими параметрами).  Вообще говоря, можно было бы
выбрать один формат и жестко требовать только его.   Данные  об
этом  формате  зашить в BIOS, и больше ни о чем не беспокоится.
Однако при этом потеряется возможность читать  диски  с  других
CP/M машин.  По этой причине сделано так, что каждый диск несет
на  себе полную информацию, как он устроен, при этом описан как
физический,  так  и   логический   формат.    Для   этой   цели
используются  первые  32  байта первого сектора нулевой дорожки
стороны ноль каждого диска.  Чтобы отличить диск  с  правильной
информацией  от  случайной,  эта  служебная  информация закрыта
контрольной суммой.  
	BIOS  при  первом обращении к диску считывает служебную
информацию, и далее обращается к диску  уже  сообразно  с  этой
информацией.
	Содержимое   первых  32  байт  информационного  сектора
приведено на рис.  5.5.1.   Первые  6  байт  -  информация  для
загрузчика.   Если  они  равны  нулю,  значит  диск не содержит
информацию для загрузки, т.е.  диск не системный.   Байты  7-16
содержат   информацию   о   физическом  устройстве  диска.   Их
назначение  понятно  из  рис.5.5.1.    Байты   17-31   содержат
информацию  о  логическом  устройстве диска.  Хотя некоторые из
приведенных логических параметров могли бы быть вычислены,  для
простоты  весь  блок логических параметров приведен в том виде,
каком CP/M требует таблицу дисковых параметров.  Подробнее  эта
таблица  будет расписана ниже.
	Байт 32 содержит контрольную сумму со смещением 66H
(т.е. КС[1-31] + 66H = [содержимое байта 32].
	В завершение этого пункта отметим, что существует
стандартный формат диска в CP/M. Параметры стандартного диска
следующие: 8", одинарная плотность, одна сторона, 77 дорожек,
26 128-ми байтовых секторов на дорожке, две системных дорожки,
64 входа в директорию, фактор смещения - 6. Этот стандарт
распространяется только на диски 8". Для дисков 5.25" такого
стандарта  нет.

Nо байта обозначение ; комментарий
;физические параметры диска
 1:    DW LoadAdress ; адрес, с которого начинается загрузка
 3:    DW RunAdress  ; адрес,куда передается управление после
                     ; загрузки
 5:    DW Count      ; число загружаемых физических секторов
 7:    DB SizeDisk   ; если значение байта 1 -8" диск, если 0
                     ; - 5.25"
 8:    DB Density    ; способ записи: 0 - FM; 1 - MFM
 9:    DB TpI        ; число дорожек  на дюйм: 0 - 48 TpI
                     ; 1 - 96 TpI, 2 - 135 TpI
10:    DB SkewFactor ; если значение байта 1 - фактора смещения
                     ; нет. Если <> 1 - байты 33-128
                     ; информационного сектора содержат таблицу
                     ; перевода секторов, причем значение байта
		     ; равно размеру таблицы.
11:    DB SecSize    ; размер физического сектора:0 - 128 байт,
                     ; 1 - 256 байт, 2 - 512 байт и  3 - 1024
12:    DB InSide     ; информация о сторонах диска: 0 -
                     ; односторонний диск, 1 - двухсторонний,
		     ; причем сектора нумеруются от 1 до n 
		     ; с каждой стороны, четные логические
		     ; дорожки с нулевой стороны, нечетные с
		     ; первой.
13:    DW SecPerTrack; число физических секторов на дорожке
15:    DW TrkPerDisk ; число дорожек на диске (с одной стороны)

;логические параметры диска
17:    DW SPT        ; число логических секторов на дорожке
19:    DB BSH        ; фактор сдвига блока распределения данных
20:    DB BLM        ; маска блока распределения данных
21:    DB EXM        ; маска размера
22:    DW DSM        ; объем памяти на диске в блоках минус 1
24:    DW DRM        ; число входов в директорию диска минус 1
26:    DB AL0        ; определяет, какие блоки зарезервированы
27:    DB AL1        ; под директорию
28:    DW CKS        ; размер вектора контроля директории
30:    DW OFS        ; число системных дорожек на диске

32:    DB CheckSum   ;контрольная сумма служебной информации

                рис. 5.5.1

	5.5.2.    Функции   HOME,   SETTRK,  SETSEC  и  SETDMA
формируют блок  параметров,  данные  из  которого  впоследствии
используются  операциями  READ  и  WRITE.   Эта группа операций
выходных параметров не имеет и никаких физических  действий  не
производит.   Функции  SETTRK  и  SETSEC  предполагают  входные
параметры   в   регистре   <C>   (номер   дорожки   и   сектора
соответственно).   Функция  SETDMA  -  в регистровой паре <BC>.
Функция  HOME  входных  параметров  не  имеет  и  по   действию
аналогична функции SETTRK с обнуленным регистром <C>.
	5.5.3.   Функция SECTRAN производит перевод логического
сектора в физический.  Логический сектор  приходит  в  регистре
<C>,   физический   возвращается   в   регистровой  паре  <HL>.
Поскольку в данной реализации BIOS таблица перевода секторов не
используется, эта функция просто увеличивает номер  сектора  на
1.
	5.5.4.  Функция SELDSK производит выбор диска.  Входной
параметр  -  регистр <C> - содержит номер выбираемого диска.  В
данной версии системы приемлемыми устройствами являются A:, B:,
C:,  D:   и   E:   (номера   соответственно   0,1,2,3   и   4).
Предполагается,  что  устройства A:, B:, C: и D: - дисководы, а
устройство E: - электронный имитатор  диска.   Если  происходит
попытка  задать  номер  устройства, не перечисленный здесь, при
выходе из функции регистровая пара <HL> будет содержать 0.  При
выборе устройств A:, B:, C: и  D:,  если  обращение  происходит
первый  раз, производится попытка считать информационный сектор
(см.  п.5.5.1), при этом делаются попытки читать диск  как  5",
записанный   с   двойной  плотностью,  затем  одинарной,  затем
одинарной 8".  В случае  неудачи  физического  чтения  выдается
сообщение  "Can'т  read  info  sector".   Если физически сектор
считан, но не совпадает контрольная сумма,  выдается  сообщение
"Wrong   checksum".   В  обоих  этих  случаях  операция  выбора
прерывается и регистровая пара <HL> на выходе функции  содержит
0.   Если чтение информационного сектора прошло успешно, данный
из него переносятся  в  дисковую  таблицу  (описана  ниже).   В
случае  успешного  завершения  (правильно считан информационный
сектор  либо  выбрано  устройство  E:)  функция  возвращает   в
регистровой паре <HL> адрес головной таблицы диска.
	5.5.4.1.   Данные информационного сектора переносятся в
дисковуе  таблицу  следующим   образом.    Часть,   описывающая
логическое  устройство  диска,  переписывается  один к одному в
таблицу параметров соответствующего диска.  Часть,  описывающая
физическое   устройство,  преобразуется,  при  этом  выделяются
следующие  данные.   Число  физических  секторов  на   дорожке,
информация  о  сторонах  диска,  размер сектора.  Дополнительно
таблица  физических  параметров  содержит   параметр   скорости
перемещения  головки  дисковода,  номер  текущей дорожки, номер
устройства как степень двух и флаг  считывания  информационного
сектора.   Вид  этой таблицы и значения ее параметров приведены
на  рис.   5.5.2.   Отметим,  что  эта  таблица   располагается
непосредственно   перед   соответствующей  таблицей  параметров
дисков.

#байта обозначение   ; комментарий

1:     DB HeadSpeed  ; константа скорости движения головки.
                     ; 3 - 30 мс на шаг, 2 - 20 мс, 1 - 12 мс,
		     ; 0 - 6 мс и 80H - 3 мс.
2:     DB SecPerTrack; число физических секторов на дорожке
3:     DB InSec      ; число сторон диска ( 1 - две стороны,
                     ; 0 - одна сторона)
4:     DB SecSize    ; Размер физического сектора.0 - 128 байт,
                     ; 1 - 256, 2 - 512 и 3 - 1024 байта.
5:     DB Track      ; номер текущей дорожки.
6:     DB Drive      ; позиционный номер устройства (00000100)
7:     DB Info       ; флаг успешного считывания
                     ; информационного сектора

             рис. 5.5.2.

	5.5.4.2.   Распишем  подробно  все  таблицы  и  области
памяти, требуемые для работы BDOS.
	Как  уже упоминалось, функция SELDSK в случае успешного
завершения возвращает адрес головной таблицы выбранного  диска.
Такая таблица индивидуальна для каждого  дискового  устройства.
Вид таблицы и назначение ее элементов приведены на рис.  5.5.3.

DPH:   DW XLT     ; адрес таблицы перевода логических секторов
                  ; в физические. Если таблица перевода
                  ; секторов не используется, эти байты сод. 0
       DS 6       ; вспомагательные байты для BDOS
       DW DIRBUF  ; адрес 128 байтовой области памяти,
                  ; используемой BDOS для операций с
                  ; директорией. DIRBUF один для всех устройств
       DW DPB     ; адрес таблицы параметров дисков. Таблица
                  ; для одинаковых дисков может быть одна.
       DW CSV     ; адрес выделенной области памяти,
                  ; используемой для проверки смены диска.
		  ; если диск не может менятся, то CSV = 0.
		  ; Для каждого устройства эта область памяти
		  ; своя. Размер этой области в байтах равен
		  ; числу секторов, занятых директорией.
       DW ALV     ; адрес выделенной области памяти для
                  ; хранения информации о распределении памяти
		  ; на диске. Для каждого устройства эта
                  ; область памяти своя. Размер этой области
		  ; определяется общим размером диска. 
		  ; Резервируется по 1 биту на каждый блок.

              рис. 5.5.3.

Четвертый  элемент  таблицы  - адрес таблицы параметров дисков.
Именно эта таблица содержится в информационном  секторе  диска.
Хотя  при  одинаковых дисках эта таблица может быть одна на все
дисковые  устройства,  в  данной  реализации  имеется   столько
таблиц, сколько дисковых устройств.
	Вид  таблицы  параметров диска и назачение ее элементов
приведены на рис.  5.5.4.

DPB:   DW SPT  ; число 128-байтовых секторов на дорожке
       DB BSH  ; фактор сдвига блока распределения данных
               ; определяется размером блока данных. Блок 
	       ; данных - минимально возможная частица файла.
	       ; Размер блока - 1, 2, 4, 8 или 16 Кбайт. Если
	       ; блок имеет большой размер, в каждом файле 
	       ; теряется значительное число неиспользуемых
	       ; секторов. При уменьшении размера блока
	       ; увеличивается размер директории, описывающий
	       ; расположение частей файла. BSH = log2[число
	       ; логических секторов в блоке].
       DB BLM  ; маска блока распределения данных.
               ; 
               ; BLM = (число логических секторов в блоке)-1.
       DB EXM  ; = (BLM+1)*128/1024 - 1 - [DSM/256]. EXM - 
               ; вспомогательная величина для определения
	       ; номера extent'а.
	       ; extent - часть файла, описываемая одним 
	       ; входом в директорию.
       DW DSM  ; объем памяти на диске в блоках минус 1
       DW DRM  ; число входов в директорию диска минус 1
       DB AL0  ; определяет, какие блоки зарезервированы
       DB AL1  ; под директорию. Каждый  бит AL0,AL1, 
               ; начиная со старшего бита AL0 и кончая 
	       ; младшим битом AL1, значением 1 резервирует
	       ; один блок данных для директории. Нужно
	       ; резервировать необходимое число блоков
	       ; для хранения входов в директорию: 32*DRM/BLS
       DW CKS  ; размер вектора контроля директории. 
               ; CKS=(DRM+1)/4. Если диск не сменяем, CKS=0.
       DW OFS  ; число системных дорожек на диске

                 рис. 5.5.4.

	5.5.4.3.   Опишем  возможные  форматы дисков, пригодные
для данной реализации BIOS.  Как уже упоминалось, при операциях
с дисками ОС задает адрес требуемой порции информации  в  виде
номера  трека  и номера 128-байтового сектора.  Из этого адреса
необходимо выделить реальный, физический адрес  в  соответствии
с  устройством диска.  Функцию преобразования адреса  выполняет
специальная процедура LTOF.  Эта  процедура  вызывается  каждый
раз,  когда  происходит  обращение  к  функциям  READ  и WRITE.
Результат работы функции  -  физический  номер  трека,  сторона
диска,  номер  дисковода,  номер  физического  сектора  и, если
физический  сектор  больше  128   байт,   смещение   (положение
логического  сектора внутри физического).  Т.о., процедура LTOF
определяет набор возможных форматов диска.  Текущая  реализация
BIOS поддерживает следующие параметры диска:

   1. Размер диска:    3.5", 5.25" и 8".
   2. Способ записи:   FM, MFM (одинарная и двойная плотность).
   3. Число дорожек на диске:  1 - 255.
   4. Число секторов на дорожке: 1 - 255.
   5. Число сторон диска: одна или две. Если у диска две
      стороны, предполагается, что четные логические дорожки
      расположены на стороне 0, нечетные на стороне 1.
      Сектора нумеруются с каждой стороны от 1 до n,
      дорожки  - от 0 до k.
   6. Размер сектора: 128, 256, 512 или 1024 байта.

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

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

  1. Количество дорожек. Встречается 35, 40, 77 и 80.
  2. Число головок (сторон). Одна или две.
  3. Плотность записи. Одинарная или двойная.
  4. Время, требуемое для перемещения головки на один шаг.
  5. Размер используемых дисков. 3.5", 5.25" и 8".

Наиболее  удобны для использования дисководы для 3.5" или 5.25"
дисков, имеющие две головки, 80 дорожек, способные  работать  с
двойной  плотностью  записи и имеющие время перемещения головки
на один шаг 3 мс.  Эти дисководы позволяют записывать  на  диск
большой объем информации (до 800 Кбайт), имеют наименьшее время
доступа к данным и обладают высокой надежностью.
	Значительно  хуже дисководы типа 6022.  Они имеют вдвое
меньшую емкость  за  счет  меньшего  количества  дорожек  (40).
Кроме  того,  они  ненадежно работают с двойной плотностью, что
потенциально уменьшает емкость еще в два раза.  Кроме того, эти
дисководы медленно двигают головкой - время шага около 30 мс.
	Дисководы  типа  5088??   имеют  35 дорожек, и в данной
реализации  BIOS  не  пригодны  вовсе,  поскольку  имеют  время
перемещения головки на шаг 40 мс, а максимально-возможное -  30
мс.
	Формат   записи   на   диск  также  может  быть  весьма
различным.  Некоторые параметры определяются типом дисковода  и
качеством  диска  -  число  сторон,  число  дорожек,  плотность
записи.  Единственный параметр, полностью отданный  на  совесть
пользователя  (разработчика  системы), это размер сектора (или,
иначе, их количество  на  дорожке.   Эти  два  параметра  тесно
связаны   между   собой   информационной   емкостью  дорожки.).
Поскольку система поддерживает емкость сектора до  1024  байта,
для большей емкости диска и уменьшения среднего времени доступа
рекомендуется  использовать при двойной плотности 1024-байтовый
сектор  и  при  одинарной  плотности  512-байтовый.   При  этом
количество  секторов  на дорожку в обоих случаях одинаковое - 5
секторов/дорожку.
	Содержимое  информационного  сектора для рекомендуемого
формата приведено на рис.  5.5.5.

;    Содержимое информационного сектора для  5.25" (или 3.5")
; двухстороннего диска, расформатированного на 80 дорожек
; при двойной плотности.

;физические параметры диска
 1:    DW LoadAdress ; адрес, с которого начинается загрузка
 3:    DW RunAdress  ; адрес,куда передается управление после
                     ; загрузки
 5:    DW Count      ; число загружаемых физических секторов
 7:    DB 0          ; если значение байта 1 -8" диск, если 0
                     ; - 5.25"
 8:    DB 1          ; способ записи: 0 - FM; 1 - MFM
 9:    DB 96(135)    ; число дорожек  на дюйм: 0 - 48 TpI
                     ; 1 - 96 TpI, 2 - 135 TpI
10:    DB 1          ; если значение байта 1 - фактора смещения
                     ; нет. Если <> 1 - байты 33-128
                     ; информационного сектора содержат таблицу
                     ; перевода секторов, причем значение байта
		     ; равно размеру таблицы.
11:    DB 3          ; размер физического сектора:0 - 128 байт,
                     ; 1 - 256 байт, 2 - 512 байт и  3 - 1024
12:    DB 1          ; информация о сторонах диска: 0 -
                     ; односторонний диск, 1 - двухсторонний,
		     ; причем сектора нумеруются от 1 до n 
		     ; с каждой стороны, четные логические
		     ; дорожки с нулевой стороны, нечетные с
		     ; первой.
13:    DW 5          ; число физических секторов на дорожке
15:    DW 80         ; число дорожек на диске (с одной стороны)

;логические параметры диска
17:    DW 40         ; число логических секторов на дорожке
19:    DB  4         ; фактор сдвига блока распределения данных
20:    DB 15         ; маска блока распределения данных
21:    DB  0         ; маска размера
22:    DW 394        ; объем памяти на диске в блоках минус 1
24:    DW 127        ; число входов в директорию диска минус 1
26:    DB 192        ; показывает, какие блоки зарезервированы
27:    DB  0         ; под директорию
28:    DW 32         ; размер вектора контроля директории
30:    DW  2         ; число системных дорожек на диске

32:    DB CheckSum   ;контрольная сумма служебной информации

                рис. 5.5.5.

	5.5.5. Электронный имитатор диска.
	Функцию   устройства  E:  выполняет  имитатор  диска  -
электронный диск.  В качестве запоминающей  среды  электронного
диска  используется  графическая  память  (страницы  1,2  и  3.
Страница  0   используется   как   графическая).Общая   емкость
электронного   диска   -   144  Кбайта.   Этого  обычно  вполне
достаточно   для   большинства   видов   работ   с   диском   -
редактирования,  компиляции  программ, работы с базами данных и
др.  Использование  электронного  диска  позволяет  значительно
увеличить  скорость работы машины, уменьшить износ дисководов и
дисков.
	При  выключении  машины информация на электронном диске
теряется.   Поэтому  перед  началом   работы   его   необходимо
расформатировать    специальной    программой    форматирования
электронного диска (FE.COM), переписать в него с обычного диска
необходимые для работы  файлы  любыми  стандартными  средствами
CP/M.    По  окончании  работы  необходимо  наработанные  файлы
сбросить обратно на обычный диск (иначе после выключения машины
произведенная информация будет утеряна).
	Отметим,  что  электронный  диск возможен только на тех
машинах,  где  в  графической  памяти  использованы  микросхемы
емкостью 64 Кбита.
	На  рис.5.5.6 приведена таблица параметров электронного
диска.  Эта таблица встроена в BIOS и менятся не может.

EDPB:  DW 128        ; число логических секторов на дорожке
       DB  3         ; фактор сдвига блока распределения данных
       DB  7         ; маска блока распределения данных
       DB  0         ; маска размера
       DW 143        ; объем памяти на диске в блоках минус 1
       DW 31         ; число входов в директорию диска минус 1
       DB 128        ; показывает, какие блоки зарезервированы
       DB  0         ; под директорию
       DW  0         ; размер вектора контроля директории
       DW  0         ; число системных дорожек на диске

             рис.5.5.6.

	5.5.6.    Функция   READ  производит  чтение  требуемой
информации с диска (или имитатора диска)  и  перенесение  ее  в
буфер DMA.  Эта операция выполняется различно для устройств A:,
B:, C:, D: и E:.
	В  случае  чтения из устройства E: требуемая информация
считывается из графической памяти в промежуточный буфер,  затем
- в буфер DMA.  Считается, что операция чтения из устройства E:
происходит всегда успешно.
	В   случае   чтения   с   остальных  устройств  сначала
логический адрес преобразуется в физический.  Затем  происходит
анализ,  имеется  ли требуемая информация в буфере чтения или в
буфере  записи  (для   дисковых   операций   используются   два
вспомогательных  буфера  размером в 1024 байта каждый).  Нужная
информация могла оказатся там в результате предыдущих операций,
поскольку размер физического сектора больше 128 байт.
	Если  требуемая  информация  находится  в  буфере,  она
переносится в  буфер  DMA,  и  операция  заканчивается,  причем
возвращается   флаг   завершения   операции,   полученный   при
физическом чтении.  Если требуемой информации  в  буферах  нет,
производится  физическое  чтение в буфер чтения, и затем данные
переносятся в буфер DMA.  Флаг успешности операции  физического
чтения  возвращается  вызывающей  функции в регистре <A>.  Если
содержимое регистра <A> равно нулю, то операция прошла успешно,
если не ноль,  значит  данные  требуемого  сектора  считать  не
удалось.
	Физическое  чтение  происходит  в  два  этапа - сначала
вызывается  функция  DSETUP,  которая  настраивает  аппаратуру,
проверяет  готовность  устройства.  Затем вызывается собственно
функция чтения  с  диска  -  DTOM.   Информация  об  успешности
операции  заносится  во внутреннюю ячейку памяти и используется
при следующих обращениях к этому же физическому адресу.

	5.5.7.   Функция  WRITE  осущестляет  запись  данных из
буфера DMA на диск.   Эта  операция,  как  и  операция  чтения,
различна для устройства E: и остальных.
	В   случае  записи  на  устройство  E:  данные  сначала
переносятся в вспомогательный буфер.  Затем  очищается  область
графической  памяти,  предназаченная  для  этих данных, и далее
данные переписываются из вспомогательного буфера в  графическую
память.   Эта  ветвь  операции,  как  и при чтении, завершается
всегда успешно.
	В  случае обращения к другим устройствам процесс записи
происходит   сложнее.     Рассмотрим    подробнее    проблеммы,
возникающие в процессе записи из-за разного размера физического
и логического секторов.
	Допустим, физический сектор имеет размер 1024 байта.  В
этом  случае,  чтобы  записать  на  диск  128  байт информации,
требуется проделать в общем случае следующие операции.  Сначала
надо  считать  физический  сектор,  затем  переписать  в   него
требуемые  128  байт  информации (в соответствующим смещением),
затем физический  сектор  поместить  обратно  на  диск.   Таким
образом,  вместо  ускорения  процедуры  обмена  при  увеличении
размера сектора получается замедление в два-три раза (поскольку
на одно логическое обращение требуется сделать два физических).
	К  счастью,  BDOS  редко  производит посекторный обмен.
Как правило, посекторный обмен происходит при обмене с областью
директории.   При  обмене  данными  файлов  ипользуется   более
крупная  единица  информации  -  группа (блок), которая состоит
обычно из 16 логических секторов,  причем  сектора  в  пределах
группы   расположены   подряд.    Это   свойство  ОС  позволяет
значительно  ускорить  процедуру  записи.    Для   этого   BDOS
информирует BIOS о том, какой тип записи требуется совершить.  
	Если содержимое регистра <C> равно 1 при вызове функции
WRITE,   то   это  запись  в  директорию.   Запись  этого  типа
характеризует то,  что  информация  в  подсекторах  физического
сектора  не  должна  быть  разрушена,  и содержимое физического
сектора  необходимо  сразу  занести  на   диск,   т.е.    обмен
происходит так, как описывалось выше.
	Если  содержимое  регистра  <C> равно 0, то это обычная
запись.  Ее характеризует  то,  что  информация  в  подсекторах
физического  сектора не должна быть разрушена (т.е.  необходимо
предварительное чтение сектора), но физически сбрасывать  буфер
записи  на  диск  требуется только после заполнения буфера, или
когда требуется освободить буфер для  других  данных.   В  этом
типе записи уже есть экономия обращений к диску - в случае 1024
байтного   физического   сектора   на  8  логических  обращений
происходит два физических.
	Если  содержимое  регистра  <C>  2,  то  блок данных, к
которому происходит  обращение,  выбирается  первый  раз,  т.е.
систему  не  интересует  информация  в  подсекторах физического
сектора  (не  требуется   предварительное   чтение).    Другими
словами,  в этом случае на 8 логических обменов происходит один
физический обмен с диском.
	В  остальном  функция  WRITE идентична функции READ, за
исключением  того,  что  для  физического   обмена   с   диском
используется  функция MTOD, и после сброса буфера на диск буфер
"выключается", т.е.  забывается, какая в нем информация.

