docs: справочники по железу Sprinter + правка gfx_scroll_h

- docs/new/ — сводные справочники (архитектура, BIOS, DSS, память,
  графика, акселератор, IRQ, порты, ввод, звук, известные баги);
- docs/Original/ — первоисточники, из которых они собраны (BIOS, Estex
  DSS, мануалы, описание акселератора), + Форум.doc/.docx в reference;
- libbgi/common/gfx_scroll_h.c — обход бага скролла при ширине >256
  (правка автора: шаг банды 255 и продвижение указателей на cw; старый
  вариант с 256 оставлен закомментированным с TODO);
- удалён applications/PoP/roomtest/hang_variants.png — рабочая раскладка
  из разбора позы виса, в репозитории ей не место.

Большие архивы (docs/extra ~568 МБ, docs/sources с вложенными git-репо
~68 МБ) в коммит НЕ включены — см. обсуждение.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-29 18:26:31 +03:00
parent 1214785a56
commit 64ce6339eb
32 changed files with 23762 additions and 3 deletions
Binary file not shown.
+893
View File
@@ -0,0 +1,893 @@
# Функции BIOS v2.12
### Вызов функций 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
Значение регистров на выходе:
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..15; от 8 до 15 - резервные
Значение регистров на выходе:
CF=0 - всегда
**0A6h (166) SET_PAL_INIT Установка внутренней палитры**
Значение регистров на входе:
C=0A6h
A - страница палитры
B - номер палитры:
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
остальные номера не используются
А так же задаются: старшая часть номера сектора в регисте HL,
младшая часть номера сектора в регистре IX.
@@ -0,0 +1,901 @@
# Функции 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
остальные номера не используются