# Функции BIOS v3.00

### Вызов функций BIOS

**Вызов функций BIOS осуществляется из ассемблерного кода.**

Номер функции задается в регистре C процессора. В остальные
регистры, при необходимости, загружаются входные параметры функции.
После исполнения функции происходит возврат в программу, из которой
произошел вызов функции. Установленный флаг CF (CF=1) означает, что
работа функции произошла с ошибкой. В некоторых регистрах передаются
выходные параметры.

Ниже приведены таблицы входных и выходных параметров для каждой функции:

- Функции работы с памятью
- Функции управления 'железом'
- Функции управления окнами и режимами экрана
- Функции вывода текста на экран
- Графические функции
- Функции работы с жесткими дисками и дисководами

При работе функций BIOS необходимо что бы стек находился в области
8000h..0BFFFh, так как часть функций использует переключение страниц
PAGE1 и PAGE3.

Вызов функций BIOS возможен в различных конфигурациях компьютера
Sprinter.

**Конфигурация Spectrum:** вызов функций BIOS осуществляется через
3D13h. При этом работают и все функции TR-DOS.

**Конфигурации Sprinter:** вызов функций BIOS осуществляется через RST
18h при подключенном системном ПЗУ.

Для постоянного подключения системного ПЗУ можно воспользоваться такой
последовательностью команд:

```asm
        LD A,0
        OUT (07Ch),A
```

После ее исполнения в 0-м окне Z80 будет включено ПЗУ BIOSа и программа
может вызывать функции BIOSа через RST 18h.

Отключение ПЗУ BIOSа из нулевого окна Z80 производится следующей
последовательностью команд:

```asm
        LD A,0
        OUT (03Ch),A
```        

При необходимости, функции BIOSа могут быть вызваны программой,
находящейся в ОЗУ непосредственно в нулевом окне Z80. Для этого надо
установить в адресе 0008h следующий код:

```asm
ADDRESS_0008h:
        PUSH AF
        LD A,0
        OUT (7Ch),A
        POP AF
        RET
```

После этого BIOS можно вызывать командой RST 8. (Функции TR-DOS, так
же как и в случае RST 18 остаются недоступны.) Вызывая программы таким
образом, через RST 8, следует помнить что адреса 3FFFh..0000h после
входа в BIOS будут содержать код ПЗУ, поэтому, если фунция использует
данные в ОЗУ, они должны находиться в других адресах.

Оптимизация программы для RST 8 недопустима, так как в ПЗУ, для
обратного переключения, стоит такая же программа, только порт 3Ch для
отключения ПЗУ BIOSа.

Вызов функций BIOS в exe-файлах, вызываемых с помощью операционной
системы Estex, производится командой RST 8. Необходимая программа в
адресе 0008h уже имеется в блоке кода ОС Estex.

### Функции работы с памятью


**0C0h (192) EMM_FN0 Определение объемов ОЗУ**

    Значение регистров на входе:
      C=0C0h 	
    Значение регистров на выходе:
      HL - общий объем ОЗУ в страницах по 16k
      BC - объем свободного ОЗУ в страницах по 16k

**0C1h (193) EMM_FN1 Инициализация распределения памяти**
Стирается вся информация о выделенных ранее блоках ОЗУ.
Блоки с системной информацией и первые 256K ОЗУ объявляются занятыми.

    Значение регистров на входе:
      C=0C1h 	
    Значение регистров на выходе:  
      нет 

**0C2h (194) EMM_FN2 Выделение блока ОЗУ**

    Значение регистров на входе:
      C=0C2h
      B - число запрашиваемых страниц	
    Значение регистров на выходе:
      CF=0 - нормальное завершение - A - идентификатор блока
      CF=1 - ошибка - A=1 - не хватает памяти

**0C3h (195) EMM_FN3 Освободить блок ОЗУ**

    Значение регистров на входе:
      C=0C3h 
      A - идентификатор блока 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение
      CF=1 - неправильный идентификатор
             идентификатор не всегда отслеживается правильно


**0C4h (196) EMM_FN4 Получить физический номер страницы из блока памяти**

    Значение регистров на входе:
      C=0C4h
      A - идентификатор блока
      B - логическая номер страницы в блоке	
    Значение регистров на выходе:
      CF=0 - A - логический номер страницы
      CF=1 - ошибка:
          A=0 - блок не существует
          A=255 - запрашиваемый номер страницы слишком велик

**0C5h (197) EMM_FN5 Получить список физических страниц блока**

    Значение регистров на входе:
      C=0C5h 
      A - идентификатор блока 
      HL - буфер 256 байт для размещения списка страниц 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение:
          B - число страниц в блоке
          HL - тот же адрес буфера, в буфере список физических 
               страниц по порядку, заканчивающийся байтом 0FFh
      CF=1 - неверный идентификатор блока; старая информация в буфере 
             может быть затерта

**0C6h (198) EMM_FN6 Получение адресов портов окон**

Примечание по использованию функции получения адресов портов окон (0C6h):
>Cледует хотя бы один раз вызвать эти функции и сравнить адреса 
>портов с теми, что используются в программе и, если они не совпадают, 
>выдать соответствующее предупреждение. В данный момент эти порты 
>таковы: PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, PAGE3=0E2h 

    Значение регистров на входе:
      C=0C6h 
      A - номер окна процессора - 0,1,2 или 3	
    Значение регистров на выходе:
      CF=0 - нормальное завершение
          C - 8-битный адрес порта окна
          B - физический номер подключенной в окно страницы
      CF=1 - ошибка - неверный номер окна

**0C7h (199) EMM_FN7 Получить номер следующей страницы блока**

Примечание по использованию функции EMM_FN7 (0C7h):
> Информация о распределении памяти хранится в виде RAM Allocation Table, 
> похожей на дисковый FAT. Поэтому нахождение физического номера 
> следующей страницы по предыдущему физическому номеру происходит 
> значительно быстрее, чем поиск по увеличенному на единицу логическому 
> номеру. 

    Значение регистров на входе:
      C=0C7h
      A - физическая страница	
    Значение регистров на выходе:
      CF=0 - нормальное завершение
          A - следуюшая физическая страница блока
          A=0FFh - индицирует конец блока
      CF=1 - ошибка - страница не принадлежит никакому блоку. 
          фактически, это означает, что она свободна. 

**09Eh (158) EMM_FN8 Слияние блоков**

    Значение регистров на входе:
      A - идентификатор блока 1
      B - идентификатор блока 2	
    Значение регистров на выходе:
      CF=0 - нормальное завершение
          A - идентификатор объединенного блока
      CF=1 - ошибка - неверный идентификатор блока

**09Dh (157) EMM_FN9 Разделение блока**

    Значение регистров на входе:
      C=09Dh 
      A - идентификатор блока 
      B - новая длина блока 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
          A - идентификатор блока результата 
          B - идентификатор блока остатка 
      CF=1 - ошибка - неверный идентификатор блока 

### Функции управления 'железом' 

**0EFh (239) FN_VERSION Выдача информации о версии BIOSа и железа.**

    Значение регистров на входе:
      C=0EFh 
      HL - буфер, куда будет помещена ASCII строка с несколькими 
          полями, номером версии BIOS и названием модели 
          компьютера. Конец строки отмечен двойным нулем.	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
          HL - тот же буфер с записанной строкой. 
          DE - версия BIOSа 
          BC - версия железа подробности ниже 
          A - количество полей в буфере (в данный момент - 2) 
              Первое поле - версия BIOS. 
              Второе - название модели компьютера. 
      CF=1 - ошибка - Очень старая версия, 
          не имеющая данной функции 

**0F2h (242) FN_SICF=0 Установка синхронизации, очистка страницы режима экрана**

    Значение регистров на входе:
      C=0F2h 
      A - режим синхронизации 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - неверный номер режима синхронизации 

### Функции работы с CMOS данными и Turbo режимом

Комментарий к функциям CMOS (0F5h-0F7h):
> Функции CMOS_RD, CMOS_WR, CMOS_TEST работают всегда. Если в машине нет 
> микросхемы CMOS, то эмулируется ее память. Наличие микросхемы 
> определяется функцией CMOS_TEST.

**0F5h (245) CMOS_TEST Проверить наличие CMOS**

    Значение регистров на входе:
      C=0F5h 	
    Значение регистров на выходе:
      CF=0 - часы есть 
      CF=1 - часов нет 

**0F6h (246) CMOS_RD Читать из регистра CMOS**

    Значение регистров на входе:
      C=0F6h 
      D - номер регистра CMOS 	
    Значение регистров на выходе:
      A - считанные данные 
      CF=0 - часы есть 
      CF=1 - часов нет 

**0F7h (247) CMOS_WR Писать в регистр CMOS**

    Значение регистров на входе:
      C=0F7h 
      D - номер регистра CMOS 
      A - записываемые данные 	
    Значение регистров на выходе:
      CF=0 - часы есть 
      CF=1 - часов нет 

**08Fh (143) FN_TURBO Функция управления турбо режимом.**

    Комментарий к функции FN_TURBO (08Fh):
      Переключение режима турбо может не произойти, если прошивка не 
      поддерживает это переключение. При этом ошибки не происходит. Так 
      же, переключение режима TURBO блокируется кнопкой "Turbo" в 
      режиме Turbo-OFF
    Значение регистров на входе:
      C=08Fh 
      A - режим турбо: 2 - off, 3 - on 	
      A - режим FDD: 12h - 720Kb, 13h - 1.44Mb
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - неверный режим турбо 

### Функции управления окнами и режимами экрана 

**0B0h (176) WIN_OPEN Функция открытия окна.**

    Значение регистров на входе:
      C=0B0h 
      IX - описатель окна 
      E - флаги окна: 
          бит 0 указывает какую страницу режима включать после 
            исполнения функции;
          бит 4 указывает на какой странице режима открывать окно 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение: 
          A - идентификатор окна 
      CF=1 - ошибка слишком много окон 

**0B1h (177) WIN_CLOSE закрытие окна**

    Значение регистров на входе:
      C=0B1h 
      A - идентификатор окна 	
    Значение регистров на выходе:
      CF=0 - успешное завершение 
      CF=1 - ошибка - неверный идентификатор 
          Окно с номером 0 никогда не закрывается и попытка 
          закрытия приводит к ошибке 

**0B2h (178) WIN_COPY_WIN Копирование данных текстового окна в память (запоминание окна)**

  При работе этой функции через RST 18h или RST 8, обязателен запрет 
  прерываний, так как функция пользуется стеком для ускорения своей работы. 

    Значение регистров на входе:
      C=0B2h 
      A - идентификатор глобального окна 
      H - размер окна в символах по вертикали 
      L - размер окна в символах по горизонтали 
      D - вертикальное положение окна в глобальном окне 
      E - горизонтальное положение окна в глобальном окне 
      IX - адрес буфера для запоминания данных 
          адрес буфера указывается для окна 0C000h если адрес 
          указан с 8000h, номер страницы буфера не действителен 
          ниже 8000h адрес указывать нельзя
      A' - страница буфера для данных окна эта страница должна 
          принадлежать программе 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - ошибка - неверный идентификатор окна 

**0B3h (179) WIN_RESTORE_WIN Копирование из памяти в текстовое окно (восстановление окна)**

  При работе этой функции через RST 18h или RST 8, обязателен запрет 
  прерываний, так как функция пользуется стеком для ускорения своей работы. 

    Значение регистров на входе:
      C=0B2h 
      A - идентификатор глобального окна 
      H - размер окна в символах по вертикали 
      L - размер окна в символах по горизонтали 
      D - вертикальное положение окна в глобальном окне 
      E - горизонтальное положение окна в глобальном окне 
      IX - адрес буфера для запоминания данных 
          адрес буфера указывается для окна 0C000h если адрес 
          указан с 8000h, номер страницы буфера не действителен 
          ниже 8000h адрес указывать нельзя
      A' - страница буфера для данных окна эта страница должна 
          принадлежать программе 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - ошибка - неверный идентификатор окна 

**0B4h (180) WIN_GET_SYM Взять символ с экрана**

    Значение регистров на входе:
      C=0B4h 
      A - идентификатор окна 
      DE - положение символа в окне: 
          D - вертикаль, E - горизонталь 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
          L - символ, H - атрибут, 
          B - знакогенератор 
      CF=1 - ошибка неверный идентификатор окна 

**0B5h (181) WIN_PUT_SYM Положить символ на экран**

    Значение регистров на входе:
      C=0B5h 
      A - идентификатор окна 
      DE - положение символа в окне: 
          D - вертикаль, E - горизонталь 
      L - символ, H - атрибут символа 
      B - знакогенератор 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - ошибка неверный идентификатор окна 

**0B6h (182) WIN_SET_ZG установка знакогенератора**

    Значение регистров на входе:
      C=0B6h 
      A - системный номер знакогенератора 
      DE - указатель на 2Kb блок данных знакогенератора 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - ошибка (старая версия, нет функции) 

**0B7h (183) WIN_MOVE_WIN Перемещение окна**

  При работе этой функции через RST 18h или RST 8, обязателен запрет 
  прерываний, так как функция пользуется стеком для ускорения своей работы. 

    Значение регистров на входе:
      C=0B7h 
      A - идентификатор глобального окна 
      H - размер локального окна по вертикали в символах 
      L - размер локального окна по горизонтали в символах 
      D - положение локального окна по вертикали в символах 
      E - положение локального окна по горизонтали в символах 
      IX - новое положение локального окна (подобно DE) 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - ошибка - неверный идентификатор окна 

**0B8h (184) WIN_GET_ZG Получение знакогенератора**

    Значение регистров на входе:
      C=0B8h 
      DE - адрес, куда будет загружено 2kb знакогенератора 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - ошибка (старая версия, нет функции) 

### Функции вывода текста на экран

**081h (129) LP_PRINT_ALL Печать символов с атрибутом**

  На экран выводится строка из B одинаковых символов 

    Значение регистров на входе:
      C=081h 
      A - символ 
      E - атрибут 
      B - число выводимых символов 
          регистры HL,IX - сохраняются 	
    Значение регистров на выходе:
      CF=0 - всегда 

**082h (131) LP_PRINT_SYM Вывод символов на экран без атрибута**

  На экран выводится строка из B одинаковых символов атрибут 
  остается тот, который был на экране 

    Значение регистров на входе:
      C=082h 
      A - символ 
      B - число выводимых символов 
          регистры HL,IX - сохраняются 	
    Значение регистров на выходе:
      CF=0 - всегда 

**083h (131) LP_PRINT_ATR печать атрибутов**

  На экран выводится строка из B одинаковых атрибутов. 
  Символы не меняются. 

    Значение регистров на входе:
      C=083h 
      E - атрибут 
      B - число выводимых символов 
          регистры HL,IX - сохраняются 	
    Значение регистров на выходе:
      CF=0 - всегда 

**084h (132) LP_SET_PLACE Установка текущего знакоместа в окне**

  Позиция печати устанавливается в соответстии с регистром DE 

    Значение регистров на входе:
      C=084h 
      E - положение символа по горизонтали 
      D - номер символа по вертикали 
          Превышение границ приводит не к ошибке, а к переустановке 
          с начала, за вычетом полного размера окна 	
    Значение регистров на выходе:
      CF=0 - всегда 

**085h (133) LP_PRINT_LN Вывод строки символов на экран с текущего знакоместа**

    Значение регистров на входе:
      C=085h 
      HL - адрес строки должен быть между 04000h и 0BFFFh 
      E - атрибут, с которым будет выведена строка 
      B - длина выводимой строки 	
    Значение регистров на выходе:
      CF=0 - всегда 

**086h (134) LP_PRINT_LN2 Вывод строки символов на экран без атрибутов**

    Значение регистров на входе:
      C=086h 
      HL - адрес строки должен быть между 04000h и 0BFFFh 
      B - длина выводимой строки 	
    Значение регистров на выходе:
      CF=0 - всегда 

**087h (135) LP_PRINT_LN3 Вывод строки символов до разделителя**

  После разделителя выводятся пробелы, что бы вывести B символов 

    Значение регистров на входе:
      C=087h 
      HL - адрес строки должен быть между 04000h и 0BFFFh 
      E - атрибут, с которым будет выведена строка 
      B - длина выводимой строки 
      D - символ-разделитель, указывающий конец строки 	
    Значение регистров на выходе:
      CF=0 - всегда 

**088h (136) LP_PRINT_LN4 Вывод строки символов до разделителя, без атрибутов**

  символы из выводятся на экран, пока не встретится символ равный D, 
  далее печатаются пробелы, как дополнение строки до B символов. 
  Атрибуты не изменяются. 

    Значение регистров на входе:
      C=088h 
      HL - адрес строки должен быть между 04000h и 0BFFFh 
      B - длина выводимой строки 
      D - символ-разделитель, указывающий конец строки 	
    Значение регистров на выходе:
      CF=0 - всегда 

**089h (137) LP_CLS_WIN Очистка экрана**

  Выполнение производится выводом пробелов с заданным атрибутом 

    Значение регистров на входе:
      C=089h 
      DE - положение локального окна 
      H - размер в символах локального окна по вертикали 
      L - размер в символах локального окна по горизонтали 
      B - атрибут очистки 	
    Значение регистров на выходе:
      CF=0 - всегда 

**08Ah (138) LP_SCROLL_UD Скроллинг части глобального окна вверх/вниз**

  Скроллируются полные строки глобального окна 

    Значение регистров на входе:
      C=08Ah 
      B - тип скроллинга: 1 - вверх; 2 - вниз 
      D - начальная строка скроллинга 
      E - число скроллируемых строк 	
    Значение регистров на выходе:
      CF=0 - всегда 

**08Bh (139) LP_PRINT_LN5 Вывод строки символов на экран до разделителя**

  После разделителя вывод останавливается 

    Значение регистров на входе:
      HL - адрес строки должен быть между 04000h и 0BFFFh 
      E - атрибут, с которым будет выведена строка 
      B - максимальная длина выводимой строки 
      D - символ-разделитель, указывающий конец строки 	
    Значение регистров на выходе:
      CF=0 - всегда 

**08Ch (140) LP_PRINT_LN6 Вывод строки символов на экран до разделителя без атрибутов**

  После разделителя вывод останавливается. 

    Значение регистров на входе:
      C=08Ch 
      HL - адрес строки должен быть между 04000h и 0BFFFh 
      B - максимальная длина выводимой строки 
      D - символ-разделитель, указывающий конец строки 	
    Значение регистров на выходе:
      CF=0 - всегда 

**08Dh (141) LP_CLS_WIN2 Очистка экрана с указанием символа заполнения**

    Значение регистров на входе:
      C=08Dh 
      DE - положение локального окна 
      H - размер в символах локального окна по вертикали 
      L - размер в символах локального окна по горизонтали 
      B - атрибут очистки 
      A - символ очистки 	
    Значение регистров на выходе:
      CF=0 - всегда 

**08Eh (142) LP_GET_PLACE Получить текущее положение вывода на экран**

    Значение регистров на входе:
      C=08Eh 	
    Значение регистров на выходе:
      CF=0 - всегда 
      DE - координаты, в которых будет напечатан 
          следующий символ: 
          D - вертикаль, E - горизонталь 

### Графические функции

**0A1h (161) PIC_POINT Установить точку**

    Значение регистров на входе:
      C=0A1h 
      DE - координата по вертикали (пиксели) 
      HL - координата по горизонтали (пиксели) 
          Координаты считаются от верхнего левого угла экрана 
      A - идентификатор окна 
      B - цвет точки 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - неверный идентификатор окна 

**0A4h (164) PIC_SET_PAL Установка палитры**

    Значение регистров на входе:
      C=0A4h 
      HL - данные палитры 
      E - номер начального цвета 
      D - количество устанавливаемых цветов 
      B - маска при установке палитры. 
          Для нормального режима должнa быть 0FFh 
      A - 
        0..3 биты - значения 0..7 - номер палитры
                  - значения 8..15 - зарезервированы
        4..6 биты - зарезервированы (установить в 0)
        7 бит -
            - значение 0 - установить
            - значение 1 - загрузить палитру в память
    Значение регистров на выходе:
      CF=0 - всегда 

**0A6h (166) SET_PAL_INIT Установка внутренней палитры**

    Значение регистров на входе:
      C=0A6h 
      A - страница палитры 
      B - номер палитры: 
          B=3 - установка текстовой палитры CGA
          B=2 - установка спектрумовской палитры 
          B=1 - установка графической плаитры 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - неверный номер палитры 

### Функции работы с жесткими дисками и дисководами 

**50h,52h,53h (80,82,83) Зарезервированы**

    Значение регистров на входе и на выходе:
      нет 

**51h (81) DRV_RESET Сброс контроллера и настройка на диск**

    Значение регистров на входе:
      C=51h 
      A - номер и тип устройства
          бит 7..4 - тип устройства:
            #0x - FDD
            #6x - RAM-DISK
            #8x - HDD
            #Cx - CD-ROM
          бит 3..0 - номер устройства	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - ошибка, нет диска или нет устройства 

**54h (84) DRV_VERIFY Проверка секторов**

  Проверка внутренняя на совпадение ECC 

    Значение регистров на входе:
      C=54h 
      A - номер и тип устройства (см. выше) 
      HL:IX - номер сектора (IX - младшая часть номера сектора)
      B - количество проверяемых секторов	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - проверка с ошибкой 

**55h (85) DRV_READ Чтение с устройства**

    Значение регистров на входе:
      C=55h 
      A - номер и тип устройства (см. выше) 
      HL:IX - номер сектора (IX - младшая часть номера сектора) 
      B - количество секторов 
      DE - адрес буфера для данных 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - ошибка чтения 
      HL:IX - номер сектора + кол-во прочитанных секторов 
      DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) 

**56h (86) DRV_WRITE Запись на устройства**

    Значение регистров на входе:
      C=56h 
      A - номер и тип устройства (см. выше) 
      HL:IX - номер сектора (IX - младшая часть номера сектора) 
      B - количество секторов 
      DE - адрес буфера данных для записи 	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
      CF=1 - ошибка записи 
      HL:IX - номер сектора + кол-во прочитанных секторов 
      DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) 

**57h (87) DRV_DETECT Определение параметров устройства**

    Значение регистров на входе:
      C=57h 
      A - номер и тип устройства (см. выше) 
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
          A - bit7=0 диск 720Кb 
              bit7=1 диск 1.44Mb 
      CF=1 - нет устройства или нет носителя 

**58h (88) DRV_GET_PAR Получить параметры носителя**

    Значение регистров на входе:
      C=58h 
      A - номер и тип устройства (см. выше) 
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
          L - число секторов 
          H - число головок 
          DE - количество цилиндров 
              если HL=DE=0FFFFh - устройства нет 
          IX - размер сектора в байтах 
          B - доп. параметры для дискет: 
              бит7 - тип 1.44Mb/720Kb
      CF=1 - нет устройства 

**59h (89) DRV_SET_PAR Установить параметры носителя**

    Значение регистров на входе:
      A - номер и тип устройства (см. выше) 
      L - число секторов 
      H - число головок 
      DE - количество цилиндров 
      IX - размер сектора в байтах 
      B - доп. параметры для дискет 
          бит7 - тип 1.44Mb/720Kb
    Значение регистров на выходе:
      CF=0 - нормальное завершение 

**5Ah (90) EXT_VERSION Номер версии дисковой спецификации.**

    Значение регистров на входе:
      C=5Ah	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 
          D - версия
          E - модификация
      CF=1 - ошибка

**5Fh (95) DRV_LIST Список дисковых устройств**

    Значение регистров на входе:
      C=5Fh
      IX - буфер для списка устройств	
    Значение регистров на выходе:
      CF=0 - нормальное завершение 

В буфере список дисков в формате:

    IX+0 - размер заполненого буфера
    IX+1 - кол-во устройств FDD
    IX+2 - кол-во устройств HDD
    IX+3 - кол-во устройств CD DRIVE
    IX+4 - #00 - конец списка, иначе кол-во устройств нового типа


### Примечания и комментарии. 

##### *Примечание по использованию функции получения адресов портов окон (0C6h).*
Cледует хотя бы один раз вызвать эти функции и сравнить адреса портов с 
теми, что используются в программе и, если они не совпадают, выдать 
соответствующее предупреждение. В данный момент эти порты таковы: 
PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, PAGE3=0E2h 

##### *Примечание по использованию функции EMM_FN7 (0C7h).*
Информация о распределении памяти хранится в виде RAM Allocation Table, 
похожей на дисковый FAT. Поэтому нахождение физического номера следующей 
страницы по предыдущему физическому номеру происходит значительно быстрее, 
чем поиск по увеличенному на единицу логическому номеру. 

##### *Комментарий к функции FN_VERSION (0EFh).*
Значения регистра BC на выходе и соответствующая ему конфигурация
    BC=FFFF - Не определено
    BC=FFFE - Конфигурация Spectrum, режим Sprinter ZX
    BC=FFFD - Конфигурация Sprinter
    BC=FFFC - Зарезервировано
    BC=FFFB - Зарезервировано
    BC=FFFA - Зарезервировано
    BC=FFF9 - Зарезервировано
Иные значения BC - новые прошивки. 

##### *Комментарий к функциям CMOS (0F5h-0F7h)*
Функции CMOS_RD, CMOS_WR, CMOS_TEST работают всегда. Если в машине нет 
микросхемы CMOS, то эмулируется ее память. Наличие микросхемы 
определяется функцией CMOS_TEST.

##### *Комментарий к функции FN_TURBO (08Fh)*
Переключение режима турбо может не произойти, если прошивка не 
поддерживает это переключение. При этом ошибки не происходит. Так же, 
переключение режима TURBO блокируется кнопкой "Turbo" в режиме Turbo-OFF 

##### *Комментарий к функциям печати текста.*
Эти функции работают с текущим окном, которым всегда является последнее 
открытое окно. К графическому экрану функции печати текста не применимы.

##### *Описатель окна.*
Для открытия окон используется 32-хбайтовый описатель окна (дескриптор), 
адрес которого указывается в регистре IX. 

    IX      - 32-хбайтовый описатель окна
    (IX+0)  - горизонтальный размер окна в знакоместах
    (IX+1)  - вертикальный размер в знакоместах
    (IX+2)  - положение окна по горизонтали на экране в знакоместах
    (IX+3)  - положение окна по вертикали на экране в знакоместах
    (IX+4)  - режим знакоместа
              bit4=1  - text_mode  bit4=0 - graf_mode
              bit5=0  - 16, bit5=1 - 8 точек в знакоместе
              graf_mode bit3..0 - не существенны
                        bit7..6 - номер палитры
              text_mode bit7..6,3..0 - номер знакогенератора
                        исключение: bit7..6=B"11" - бордер
    (IX+5)  - дополнительный режим знакоместа
              bit0=1  - указывает на включение спектрумовской
                        адресации экрана
    (IX+6)  - положение по X в поле графики (по знакоместам)
    (IX+7)  - положение по Y в поле графики (по знакоместам)
              разъяснения о положении в поле графики - ниже
    (IX+8..31) - зарезервировано (переменные окна)
      в этих байтах должны быть нули

При открытии окна описатель копируется в системную страницу ОЗУ и 
программа может не сохранять его. Что бы описатель окна не потерялся, 
программа получает идентификатор окна. Он же идентификатор глобального 
окна. В функциях запоминания, восстановления, перемещения, а так же 
функциях стирания, скроллинга и т.п. идентификатор окна определяет 
область экрана, относительно которой производится работа с локальными 
окнами. Подразумеваются локальные окна в смысле "окно в окне". 
Идентификатор окна определяет глобальное окно, отнoсительно которого 
адресуются локальные. В части функций глобальное окно определяется по 
умолчанию, как последнее, с которым производились действия с явным 
указанием идентификатора.

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

    Типы стандартных окон: 
      0 - окно 32x24 в формате ZX Spectrum
      1 - текстовое окно 64x24
      2 - текстовое окно 40x32
      3 - текстовое окно 80x32
      4 - окно в формате ZX Spectrum, HL - положение окна на экране в знакоместах
      5 - текстовое окно 64x24, HL - положение окна на экране в знакоместах
      6 - текстовое окно 40x32, HL - положение окна на экране в знакоместах
      7 - текстовое окно 80x32, HL - положение окна на экране в знакоместах
      8 - графическое окно 0, HL - положение окна на экране
      9 - графическое окно 1, HL - положение окна на экране

Данные палитры должны представлять собой список приблизительно такого вида: 

        DB blue1,green1,red1,0
        DB blue2,green2,red2,0
        .....................
        DB blueN,greenN,redN,0

N - количество цветов. Значеное равное 0 соответствует 256-ти цветам. 
При записи в видео-ОЗУ все данные предварительно проходят функцию AND 
со значением регистра маски - B.

Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в 
соответствующей палитре нужно задать соответствующее значение bit7..6 в 
байте режима знакоместа

Страницы 4..7 соответствуют текстовому режиму и спектрумовскому режиму. 
В странице 4 задается цвет PAPER для каждого атрибута. В странице 5 
задается цвет INK для каждого атрибута. В странице 6 задается цвет PAPER, 
которым он будет моргать в режиме FLASH В странице 7 задается цвет INK, 
которым он будет моргать в режиме FLASH. Таким образом, для каждого из 
256-ти атрибутов задается четыре цвета если цвета 4,5 совпадают с 
цветами 6,7 то режим FLASH оказывается отключенным. Для его включения 
в спектрумовском режиме надо поменять местами цвета 6 и 7. Если надо 
включить FLASH в режим IBM-CGA, следует установить цвета 6 и 7 
одинаковыми и равными цвету 4. По сути режим FLASH всегда включен, и 
на экране постоянно меняются цвета PAPER с 4-го на 6-й, а цвета INK с 
5 на 7-й. Если эти пары цветов для атрибута знакоместа устанавливаются 
одинаковыми, то FLASH в этом месте не виден.

##### *Комментарий к функциям работы с устройствами хранения информации.*

В этих функциях в регистре A обычно задается номер и тип устройства: 

    бит 0..3 - номер устройства
    бит 4..7 - тип устройства:
            0 - дисковод
            6 - ram-disk
            8 - HDD
            C - CD-ROM

остальные номера не используются
