- 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>
53 KiB
2. BIOS Sprinter Sp2000 — полный справочник
2.1 Общие сведения
BIOS Sprinter — набор системных функций, доступных через три способа вызова:
| Способ | Применение | Прерывания |
|---|---|---|
CALL 3D13h |
Из любой точки, через системный вход | Отключает (DI) |
RST 8 |
Из EXE (обработчик в DSS), код в #0008 | Не отключает |
RST 18h |
При подключённом ПЗУ в W0 | Не отключает |
Для CALL 3D13h после вызова программа сама включает прерывания (EI). Если прерывания нужны постоянно — использовать RST 18h/RST 8 с обработчиком и стеком в #8000..#BFFF в режиме IM 2.
Конвенция регистров
- C — номер функции
- Остальные регистры — входные параметры (по функции)
- CF=0 — успех, выходные данные в регистрах
- CF=1 — ошибка, код ошибки в A
Включение/отключение ПЗУ в W0
LD A,0
OUT (07Ch),A ; включить ПЗУ BIOS в окно 0
; ... вызовы RST 18h ...
LD A,0
OUT (03Ch),A ; отключить ПЗУ, вернуть ОЗУ
Ограничения
- Стек — обязательно в
#8000..#BFFF(W2), так как часть функций переключает W1 и W3 - HL, IX обычно сохраняются в функциях вывода текста, но не гарантируется во всех
- Некоторые функции окно́вых операций (WIN_COPY_WIN, WIN_RESTORE_WIN, WIN_MOVE_WIN) требуют DI при вызове через RST 18h/8 — используют стек для ускорения
2.2 Системные функции (00h–0Fh)
00h — BOOT
Перезагрузка системы. Параметров нет. Не возвращается (полный ресет).
01h — INIT
Инициализация BIOS. Параметров нет. Вызывается автоматически при старте. Повторный вызов сбрасывает состояние окон, палитр и системных переменных к умолчаниям.
02h — GET_KEY (A=0)
Ожидание и получение нажатой клавиши.
| Регистр | Описание | |
|---|---|---|
| Вход | A=0 | (зарезервировано) |
| Выход | A | ASCII-код нажатой клавиши |
Блокирует выполнение до нажатия. Не эхо-печатает символ на экран. Возвращает расширенный ASCII (8-бит), для F-клавиш и стрелок — смотри GET_EXT_KEY.
03h — GET_EXT_KEY
Получение расширенной клавиши (без ожидания, опрос).
| Регистр | Описание | |
|---|---|---|
| Вход | — | |
| Выход | D | Скан-код клавиатуры |
| Выход | E | ASCII-символ (0 если нет символа) |
Если нет нажатия — возвращает D=E=0 (или неопределённое значение — проверять). Для F-клавиш, стрелок и других не-ASCII клавиш E=0, D=скан-код.
04h — PR_OK
Проверка готовности к вводу. Параметров нет. Назначение точно не документировано.
05h — IS_EXT_KEY
Проверка, есть ли в буфере расширенная клавиша.
| Регистр | Описание | |
|---|---|---|
| Вход | — | |
| Выход | A | 0 = нет клавиши, 1 = есть |
Не блокирует, не считывает. После A=1 вызывает GET_EXT_KEY.
06h
Зарезервировано.
08Fh — FN_TURBO
Управление режимом турбо и режимом FDD.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 08Fh |
| Вход | A | 2 = turbo off, 3 = turbo on, 12h = FDD 720K, 13h = FDD 1.44M |
| Выход | CF=0 | Успех |
| Выход | CF=1 | Неверный режим |
Переключение турбо может не произойти, если прошивка ППЛМ не поддерживает его. Ошибки при этом нет (CF=0).
2.3 Управление памятью (0C0h–0C7h, 09Eh, 09Dh)
0C0h — EMM_FN0
Определение объёмов ОЗУ.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0C0h |
| Выход | HL | Общий объём ОЗУ в страницах по 16 КБ |
| Выход | BC | Свободный объём ОЗУ в страницах по 16 КБ |
0C1h — EMM_FN1
Инициализация распределения памяти. Стирает всю информацию о выделенных ранее блоках ОЗУ. Блоки с системной информацией и первые 256 КБ ОЗУ помечаются занятыми.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0C1h |
| Выход | — | Нет |
0C2h — EMM_FN2
Выделение блока ОЗУ.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0C2h |
| Вход | B | Число запрашиваемых страниц (16 КБ каждая) |
| Выход (CF=0) | A | Идентификатор блока |
| Выход (CF=1) | A | 1 = не хватает памяти |
0C3h — EMM_FN3
Освобождение блока ОЗУ.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0C3h |
| Вход | A | Идентификатор блока |
| Выход (CF=1) | C | Неверный идентификатор |
Правильность идентификатора отслеживается не всегда.
0C4h — EMM_FN4
Получение физического номера страницы из блока по логическому номеру.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0C4h |
| Вход | A | Идентификатор блока |
| Вход | B | Логический номер страницы в блоке |
| Выход (CF=0) | A | Физический номер страницы |
| Выход (CF=1) | A | 0 = блок не существует, 255 = страница за пределами блока |
0C5h — EMM_FN5
Получение списка всех физических страниц блока.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0C5h |
| Вход | A | Идентификатор блока |
| Вход | HL | Адрес буфера (256 байт) |
| Выход (CF=0) | B | Число страниц в блоке |
| Выход (CF=0) | HL | Тот же буфер; в нём — список физических страниц по порядку, завершающийся байтом 0FFh |
| Выход (CF=1) | — | Неверный ID блока; данные в буфере могут быть затерты |
Буфер должен быть на 1 байт больше числа страниц в блоке.
0C6h — EMM_FN6
Получение адреса порта окна и текущей подключённой страницы.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0C6h |
| Вход | A | Номер окна (0, 1, 2 или 3) |
| Выход (CF=0) | C | 8-битный адрес порта окна |
| Выход (CF=0) | B | Физический номер текущей страницы |
| Выход (CF=1) | — | Неверный номер окна |
Примечание: функция практически не используется — адреса портов окон фиксированы с начала разработки:
PAGE0=82h,PAGE1=0A2h,PAGE2=0C2h,PAGE3=0E2h. Рекомендуется вызвать её один раз для верификации.
0C7h — EMM_FN7
Получение следующей страницы в блоке по физическому номеру.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0C7h |
| Вход | A | Физическая страница |
| Выход (CF=0) | A | Следующая физическая страница того же блока; 0FFh = конец блока |
| Выход (CF=1) | — | Страница не принадлежит никакому блоку (свободна) |
Информация о распределении памяти хранится в RAM Allocation Table (FAT-подобная), поэтому переход по «следующей» странице быстрее, чем поиск по логическому номеру.
09Eh — EMM_FN8
Слияние двух блоков памяти в один.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 09Eh |
| Вход | A | Идентификатор блока 1 |
| Вход | B | Идентификатор блока 2 |
| Выход (CF=0) | A | Идентификатор объединённого блока |
| Выход (CF=1) | A | Неверный идентификатор |
09Dh — EMM_FN9
Разделение блока на две части.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 09Dh |
| Вход | A | Идентификатор блока |
| Вход | B | Новая длина первой части (в страницах) |
| Выход (CF=0) | A | Идентификатор блока-результата (первая часть) |
| Выход (CF=0) | B | Идентификатор блока-остатка (вторая часть) |
| Выход (CF=1) | — | Неверный идентификатор |
2.4 Функции «железа» (0EFh, 0F2h, 0F5h–0F7h)
0EFh — FN_VERSION
Выдача информации о версии BIOS и модели компьютера.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0EFh |
| Вход | HL | Адрес буфера для строки (результат — ASCII, поля разделены, конец — двойной ноль) |
| Выход (CF=0) | HL | Тот же буфер с заполненной строкой |
| Выход (CF=0) | DE | Версия BIOS |
| Выход (CF=0) | BC | Версия железа (см. таблицу) |
| Выход (CF=0) | A | Количество полей в буфере (всегда 2) |
| Выход (CF=1) | — | Очень старая версия BIOS, нет функции |
Значения BC (версия железа):
| BC | BIOS_v3.txt | IvanMak.txt |
|---|---|---|
FFFF |
Не определено | Не определено |
FFFE |
Spectrum, режим Sprinter ZX | Sprinter-1 |
FFFD |
Конфигурация Sprinter | Sprinter-2 |
FFFC |
Зарезервировано | Spectrum+AY8910 |
FFFB |
Зарезервировано | Game-1 |
FFFA |
Зарезервировано | Video-1 |
FFF9 |
Зарезервировано | DooM |
| иные | Новые прошивки | Новые прошивки |
Примечание: BIOS_v3.txt помечает
FFF9–FFFCкак «зарезервировано», IvanMak присваивает им конкретные конфигурации. Исходный код BIOS v3.04 (FUNC_BIOS_MAIN.ASM) возвращаетID_SPRINTERс тремя полями:"Firmware vX.Y","Sprinter", версия битстрима. Версия дискового ПЗУ — v2.56, CPLD — v3.05 (определяются в_BIOS.REVи сборке). Реальные возвращаемые коды BC зависят от прошивки ППЛМ.
Поля в буфере HL (через HL): первое — версия BIOS, второе — название модели компьютера.
0F2h — FN_SICF
Установка режима синхронизации и очистка страниц режима экрана.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0F2h |
| Вход | A | 0 — режим по умолчанию (очистка страниц режима), 1 — Scorpion (312 строк, INT как в Scorpion-256), 2 — Pentagon (320 строк, INT как в Pentagon-128) |
| Выход (CF=0) | — | Успех |
| Выход (CF=1) | — | Неверный номер режима |
При A=0 происходит полная очистка страниц режима — на всём экране остаётся только бордер. Смена режима синхронизации может привести к временному сбою монитора.
0F5h — CMOS_TEST
Проверка наличия микросхемы CMOS (часы реального времени).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0F5h |
| Выход (CF=0) | — | Часы есть (физическая микросхема DS12887A или эмуляция) |
| Выход (CF=1) | — | Часов нет |
Функции CMOS работают всегда — если микросхемы нет, BIOS эмулирует её память.
0F6h — CMOS_RD
Чтение регистра CMOS.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0F6h |
| Вход | D | Номер регистра CMOS |
| Выход | A | Прочитанные данные |
| Выход (CF=0) | — | Часы есть |
| Выход (CF=1) | — | Часов нет |
0F7h — CMOS_WR
Запись в регистр CMOS.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0F7h |
| Вход | D | Номер регистра CMOS |
| Вход | A | Записываемые данные |
| Выход (CF=0) | — | Часы есть |
| Выход (CF=1) | — | Часов нет |
2.5 Функции управления окнами (0B0h–0B8h)
Важно: в текущей версии BIOS идентификатор окна (
A) для всех оконных функций обязан быть0. Возможность работы с несколькими окнами не реализована — при открытии нового окна старый описатель теряется. Единственный валидный идентификатор —0.
Дескриптор окна (для WIN_OPEN)
32-байтовый блок, адрес в IX:
| Смещение | Размер | Описание |
|---|---|---|
| IX+0 | 1 | Горизонтальный размер окна (в знакоместах) |
| IX+1 | 1 | Вертикальный размер окна (в знакоместах) |
| IX+2 | 1 | Положение окна по горизонтали на экране (знакоместа) |
| IX+3 | 1 | Положение окна по вертикали на экране (знакоместа) |
| IX+4 | 1 | Режим знакоместа |
Бит 4: 1 = text mode, 0 = graf mode |
||
Бит 5: 0 = 16 точек/знакоместо, 1 = 8 точек |
||
| graf mode: биты 7–6 = номер палитры, биты 3–0 несущественны | ||
text mode: биты 7–6,3–0 = номер знакогенератора; 11xxxxxx = бордер |
||
| IX+5 | 1 | Бит 0: 1 = включить спектрумовскую адресацию экрана |
| IX+6 | 1 | Положение X в поле графики (в знакоместах) |
| IX+7 | 1 | Положение Y в поле графики (в знакоместах) |
| IX+8..31 | 24 | Зарезервировано (должны быть нулями) |
При открытии окна дескриптор копируется в системную страницу ОЗУ — программа может не сохранять его. Вместо этого используется идентификатор окна (возвращается WIN_OPEN).
Важно: в текущей версии BIOS хранится только один описатель окна. Идентификатор всегда 0. При открытии нового окна старый описатель теряется.
0B0h — WIN_OPEN
Открытие окна.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0B0h |
| Вход | IX | Адрес 32-байтового дескриптора окна |
| Вход | E | Бит 0: какую страницу режима включать; бит 4: на какой странице открывать |
| Выход (CF=0) | A | Идентификатор окна |
| Выход (CF=1) | — | Слишком много окон |
0B1h — WIN_CLOSE
Закрытие окна.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0B1h |
| Вход | A | Идентификатор окна |
| Выход (CF=1) | — | Неверный идентификатор |
Окно с номером 0 никогда не закрывается — попытка закрыть его возвращает CF=1.
0B2h — WIN_COPY_WIN
Копирование текстового окна в буфер (запоминание).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0B2h |
| Вход | A | Идентификатор глобального окна |
| Вход | H | Размер по вертикали (в символах) |
| Вход | L | Размер по горизонтали (в символах) |
| Вход | D | Вертикальное положение в глобальном окне |
| Вход | E | Горизонтальное положение в глобальном окне |
| Вход | IX | Адрес буфера (относительно #C000; если от #8000 — страница недействительна) |
| Вход | A' | Страница буфера (должна принадлежать программе) |
| Выход (CF=1) | — | Неверный идентификатор |
Требует DI при вызове через RST 18h/8 — использует стек для ускорения.
0B3h — WIN_RESTORE_WIN
Восстановление окна из буфера.
Параметры — полностью идентичны WIN_COPY_WIN.
Требует DI при вызове через RST 18h/8.
0B4h — WIN_GET_SYM
Получение символа и атрибута с экрана.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0B4h |
| Вход | A | Идентификатор окна |
| Вход | D | Вертикальная позиция символа |
| Вход | E | Горизонтальная позиция символа |
| Выход (CF=0) | L | Символ |
| Выход (CF=0) | H | Атрибут |
| Выход (CF=0) | B | Номер знакогенератора |
| Выход (CF=1) | — | Неверный идентификатор окна |
Важно: анализ исходного кода BIOS v3.04 (FUNC_LOW_PRINT.ASM) подтверждает:
Aобязан быть 0. Реализация начинается сAND A / SCF / RET NZ— приA ≠ 0сразу возвращается CF=1. Многооконная поддержка не реализована.
0B5h — WIN_PUT_SYM
Вывод символа на экран.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0B5h |
| Вход | A | Идентификатор окна |
| Вход | D | Вертикальная позиция |
| Вход | E | Горизонтальная позиция |
| Вход | L | Символ |
| Вход | H | Атрибут символа |
| Вход | B | Номер знакогенератора |
| Выход (CF=1) | — | Неверный идентификатор окна |
0B6h — WIN_SET_ZG
Установка знакогенератора.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0B6h |
| Вход | A | Системный номер знакогенератора |
| Вход | DE | Указатель на 2 КБ данных знакогенератора |
| Выход (CF=1) | — | Старая версия, нет функции |
0B7h — WIN_MOVE_WIN
Перемещение окна.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0B7h |
| Вход | A | Идентификатор глобального окна |
| Вход | H | Размер локального окна по вертикали (символы) |
| Вход | L | Размер локального окна по горизонтали (символы) |
| Вход | D | Положение локального окна по вертикали (символы) |
| Вход | E | Положение локального окна по горизонтали (символы) |
| Вход | IX | Новое положение локального окна (как DE — D=верт, E=гор) |
| Выход (CF=1) | — | Неверный идентификатор |
Требует DI при вызове через RST 18h/8.
0B8h — WIN_GET_ZG
Получение знакогенератора.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0B8h |
| Вход | DE | Адрес буфера (2 КБ) |
| Выход (CF=1) | — | Старая версия, нет функции |
2.6 Функции вывода текста (081h–08Eh)
Все функции этого раздела работают с текущим окном (последнее открытое). К графическому экрану не применимы. CF=0 на выходе — всегда успех (кроме особо оговоренных).
081h — LP_PRINT_ALL
Печать B одинаковых символов с атрибутом.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 081h |
| Вход | A | Символ |
| Вход | E | Атрибут |
| Вход | B | Количество символов |
HL, IX сохраняются.
082h — LP_PRINT_SYM
Печать B одинаковых символов без изменения атрибута.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 082h |
| Вход | A | Символ |
| Вход | B | Количество символов |
HL, IX сохраняются.
083h — LP_PRINT_ATR
Печать B одинаковых атрибутов. Символы на экране не меняются.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 083h |
| Вход | E | Атрибут |
| Вход | B | Количество символов |
HL, IX сохраняются.
084h — LP_SET_PLACE
Установка текущей позиции печати в окне.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 084h |
| Вход | E | Горизонтальная позиция (столбец) |
| Вход | D | Вертикальная позиция (строка) |
Превышение границ окна приводит к переустановке позиции с начала (за вычетом полного размера окна) — не ошибка.
085h — LP_PRINT_LN
Вывод строки символов с атрибутом с текущей позиции.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 085h |
| Вход | HL | Адрес строки (обязательно в #4000..#BFFF) |
| Вход | E | Атрибут |
| Вход | B | Длина строки |
086h — LP_PRINT_LN2
Вывод строки символов без атрибутов с текущей позиции.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 086h |
| Вход | HL | Адрес строки (#4000..#BFFF) |
| Вход | B | Длина строки |
087h — LP_PRINT_LN3
Вывод строки до разделителя, с атрибутом. После разделителя — пробелы до длины B.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 087h |
| Вход | HL | Адрес строки (#4000..#BFFF) |
| Вход | E | Атрибут |
| Вход | B | Максимальная длина |
| Вход | D | Символ-разделитель |
088h — LP_PRINT_LN4
Вывод строки до разделителя, без атрибутов. После разделителя — пробелы.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 088h |
| Вход | HL | Адрес строки (#4000..#BFFF) |
| Вход | B | Максимальная длина |
| Вход | D | Символ-разделитель |
089h — LP_CLS_WIN
Очистка экрана (заполнение пробелами с заданным атрибутом).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 089h |
| Вход | D | Вертикальное положение локального окна |
| Вход | E | Горизонтальное положение локального окна |
| Вход | H | Размер по вертикали |
| Вход | L | Размер по горизонтали |
| Вход | B | Атрибут очистки |
08Ah — LP_SCROLL_UD
Скроллинг части глобального окна вверх/вниз.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 08Ah |
| Вход | B | 1 = вверх, 2 = вниз |
| Вход | D | Начальная строка скроллинга |
| Вход | E | Число скроллируемых строк |
Скроллируются полные строки глобального окна.
08Bh — LP_PRINT_LN5
Вывод строки до разделителя с атрибутом. После разделителя вывод останавливается (не заполняется пробелами).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 08Bh |
| Вход | HL | Адрес строки (#4000..#BFFF) |
| Вход | E | Атрибут |
| Вход | B | Максимальная длина |
| Вход | D | Символ-разделитель |
08Ch — LP_PRINT_LN6
Вывод строки до разделителя без атрибутов. Останов на разделителе.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 08Ch |
| Вход | HL | Адрес строки (#4000..#BFFF) |
| Вход | B | Максимальная длина |
| Вход | D | Символ-разделитель |
08Dh — LP_CLS_WIN2
Очистка экрана с указанием символа заполнения.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 08Dh |
| Вход | D | Вертикальное положение локального окна |
| Вход | E | Горизонтальное положение локального окна |
| Вход | H | Размер по вертикали |
| Вход | L | Размер по горизонтали |
| Вход | B | Атрибут очистки |
| Вход | A | Символ заполнения |
08Eh — LP_GET_PLACE
Получение текущей позиции печати.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 08Eh |
| Выход | D | Текущая строка (вертикаль) |
| Выход | E | Текущий столбец (горизонталь) |
2.7 Графические функции (0A0h–0A8h)
0A0h — PIC_OPEN_WIN
Открытие окна в пиксельных координатах (в отличие от WIN_OPEN, работающего в знакоместах).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0A0h |
| Вход | IX | Адрес 32-байтового дескриптора окна (формат как у WIN_OPEN) |
| Вход | HL | Упакованные пиксельные координаты: X + Y×64 + #4000 + #1000×RGMOD |
| Вход | E | Бит 0: страница режима |
| Выход (CF=0) | — | Успех |
0A1h — PIC_POINT
Установка точки (пикселя) на экране.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0A1h |
| Вход | DE | Координата Y (вертикаль, пиксели) |
| Вход | HL | Координата X (горизонталь, пиксели) |
| Вход | A | Идентификатор окна |
| Вход | B | Цвет точки |
| Выход (CF=1) | — | Неверный идентификатор окна |
Координаты отсчитываются от верхнего левого угла экрана.
0A2h — PIC_FN2
Заполнение или копирование блока.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0A2h |
| Вход | DE | Координата Y (вертикаль, пиксели) |
| Вход | HL | Координата X (горизонталь, пиксели) |
| Вход | IX | Размеры: IXH = вертикальный размер, IXL = горизонтальный |
| Вход | A | Цвет заполнения |
| Вход | B | Бит 0: 1 = вторая страница режима |
| Выход (CF=0) | — | Успех |
0A3h — PIC_FN3
Копирование блока между страницами.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0A3h |
| Вход | DE | Координата Y назначения |
| Вход | HL | Координата X назначения |
| Вход | A'HL' | Адрес источника (теневые регистры) |
| Вход | BC' | Длина в байтах |
| Вход | B | Бит 0: 1 = вторая страница режима |
| Выход (CF=0) | — | Успех |
0A4h — PIC_SET_PAL
Установка палитры.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0A4h |
| Вход | HL | Указатель на данные палитры (B,R,G,0 для каждого цвета) |
| Вход | E | Номер начального цвета |
| Вход | D | Количество устанавливаемых цветов |
| Вход | B | Маска (для нормального режима — 0FFh) |
| Вход | A | Бит 0–3: номер палитры (0..7; 8..15 зарезервированы). Бит 7: 0 = установить, 1 = загрузить палитру в память. Биты 4–6: зарезервированы (0). |
Формат данных палитры по адресу HL:
DB blue1, green1, red1, 0
DB blue2, green2, red2, 0
...
DB blueN, greenN, redN, 0
N = количество цветов. 0 соответствует 256 цветам. Перед записью в VRAM данные проходят AND с маской B.
Примечание: исходный код BIOS v3.04 (FUNC_SCREEN.ASM:190-261) подтверждает бит 7:
ADD A,Aсдвигает A влево, устанавливая CF из бита 7; при CF=1 выполняетсяPIC_GET_PAL(чтение палитры в память), при CF=0 — установка. IvanMak и Parinov описывают регистр неполно (бит 7 опущен).
Страницы палитры:
- 0–3 — графические режимы (выбор через биты 7–6 байта режима знакоместа)
- 4 — PAPER (текстовый и спектрумовский режимы)
- 5 — INK
- 6 — PAPER в режиме FLASH
- 7 — INK в режиме FLASH Для отключения FLASH в конкретном атрибуте: установить цвета палитры 4 = 6 и 5 = 7. Для включения FLASH в режиме IBM-CGA: 6 = 7 = 4 (PAPER мерцает в INK).
0A5h — PIC_FN5
Установка страницы режима (RGMOD).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0A5h |
| Вход | E | Режим: бит 0 = RGMOD |
| Выход | — | Нет |
0A6h — SET_PAL_INIT
Установка внутренней палитры (инициализация).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0A6h |
| Вход | A | Страница палитры |
| Вход | B | 1 = графическая палитра, 2 = спектрумовская, 3 = текстовая CGA |
| Выход (CF=1) | — | Неверный номер палитры |
0A7h — PIC_FN7
Рисование линии.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0A7h |
| Вход | DE | Координата Y начала |
| Вход | HL | Координата X начала |
| Вход | H' | Длина линии (приращение по X) |
| Вход | A | Цвет линии |
| Вход | B | Бит 0: 1 = вторая страница режима |
| Выход (CF=0) | — | Успех |
0A8h — PIC_FN8
Рисование линии с массивом цветов.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0A8h |
| Вход | DE | Координата Y начала |
| Вход | HL | Координата X начала |
| Вход | H' | Длина линии |
| Вход | IX | Массив цветов (последовательность байт цвета для каждого пикселя) |
| Вход | B | Бит 0: 1 = вторая страница режима |
| Выход (CF=0) | — | Успех |
2.8 Функции диска (50h–5Fh)
Кодировка номера устройства (для всех DRV-функций)
Регистр A = биты 7..4 (тип) + биты 3..0 (номер):
| Тип (биты 7..4) | Устройство |
|---|---|
0x |
FDD (дисковод) |
6x |
RAM-DISK |
8x |
HDD |
Cx |
CD-ROM |
Номер сектора: HL:IX — HL = старшая часть, IX = младшая.
50h, 52h, 53h — зарезервированы
Не реализованы. Вызов без параметров, возврата нет.
51h — DRV_RESET
Сброс контроллера и настройка на указанное устройство.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 51h |
| Вход | A | Номер и тип устройства |
| Выход (CF=1) | — | Нет диска или нет устройства |
54h — DRV_VERIFY
Проверка секторов (внутренняя, на совпадение ECC).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 54h |
| Вход | A | Номер и тип устройства |
| Вход | HL:IX | Номер сектора |
| Вход | B | Количество секторов |
| Выход (CF=1) | — | Ошибка проверки |
Примечание: функция реализована только для ATA/HDD (ATA_5x_VERIFY в ATA_DRV.asm:472). Для FDD, RAM-диска и CD-ROM не поддерживается — возвращает CF=1. В ранних версиях (до v3.0x) действительно отсутствовала.
55h — DRV_READ
Чтение секторов с устройства.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 55h |
| Вход | A | Номер и тип устройства |
| Вход | HL:IX | Номер сектора |
| Вход | B | Количество секторов |
| Вход | DE | Адрес буфера для данных |
| Выход (CF=0) | HL:IX | Номер сектора + количество прочитанных |
| Выход (CF=0) | DE | Адрес буфера + (количество × размер сектора) |
| Выход (CF=1) | — | Ошибка чтения |
56h — DRV_WRITE
Запись секторов на устройство.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 56h |
| Вход | A | Номер и тип устройства |
| Вход | HL:IX | Номер сектора |
| Вход | B | Количество секторов |
| Вход | DE | Адрес буфера с данными |
| Выход (CF=0) | HL:IX | Номер сектора + количество записанных |
| Выход (CF=0) | DE | Адрес буфера + (количество × размер сектора) |
| Выход (CF=1) | — | Ошибка записи |
57h — DRV_DETECT
Определение параметров устройства (тип носителя).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 57h |
| Вход | A | Номер и тип устройства |
| Выход (CF=0) | A | Биты: bit7=0 = 720 КБ, bit7=1 = 1.44 МБ |
| Выход (CF=1) | — | Нет устройства или носителя |
58h — DRV_GET_PAR
Получение параметров носителя.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 58h |
| Вход | A | Номер и тип устройства |
| Выход (CF=0) | L | Число секторов на дорожке |
| Выход (CF=0) | H | Число головок |
| Выход (CF=0) | DE | Количество цилиндров |
| Выход (CF=0) | IX | Размер сектора в байтах |
| Выход (CF=0) | B | Доп. параметры: bit7 = тип 1.44/720 |
| Выход (CF=1) | — | Нет устройства |
Если HL=DE=0FFFFh — устройства нет.
59h — DRV_SET_PAR
Установка параметров носителя.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 59h |
| Вход | A | Номер и тип устройства |
| Вход | L | Число секторов на дорожке |
| Вход | H | Число головок |
| Вход | DE | Количество цилиндров |
| Вход | IX | Размер сектора в байтах |
| Вход | B | Доп. параметры: bit7 = тип 1.44/720 |
| Выход (CF=0) | — | Успех |
5Ah — EXT_VERSION
Версия дисковой спецификации.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 5Ah |
| Выход (CF=0) | D | Версия |
| Выход (CF=0) | E | Модификация |
| Выход (CF=1) | — | Ошибка |
5Fh — DRV_LIST
Список дисковых устройств.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 5Fh |
| Вход | IX | Буфер для списка |
| Выход (CF=0) | — | Буфер заполнен |
Формат списка в буфере:
IX+0 — размер заполненного буфера
IX+1 — количество FDD
IX+2 — количество HDD
IX+3 — количество CD-ROM
IX+4 — #00 = конец списка, иначе количество устройств нового типа
2.9 Дополнительные функции (из IvanMak.txt)
80h — LP_OPEN_S
Открытие стандартных окон. Вход: A = номер окна (см. таблицу). Выход: CF=1 = ошибка.
Типы стандартных окон:
| A | Описание |
|---|---|
| 0 | 32×24 ZX Spectrum |
| 1 | 64×24 текстовое |
| 2 | 40×32 текстовое |
| 3 | 80×32 текстовое |
| 4 | 32×24 ZX Spectrum, HL = положение на экране |
| 5 | 64×24 текстовое, HL = положение |
| 6 | 40×32 текстовое, HL = положение |
| 7 | 80×32 текстовое, HL = положение |
| 8 | Графическое окно 0, HL = положение |
| 9 | Графическое окно 1, HL = положение |
0F0h — SPRINTER_1
Переключение конфигурации ППЛМ в Sprinter-1.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0F0h |
| Выход (CF=1) | — | Фатальная ошибка, требуется RESET |
Если текущая прошивка уже Sprinter-1 — перезагрузка ПЛМ не производится.
0F1h — SPRINTER_2
Переключение в Sprinter-2. Аналогично SPRINTER_1, C=0F1h.
0F3h — SPRINTER_ALL
Переключение на пользовательскую конфигурацию.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0F3h |
| Вход | A | Страница с файлом прошивки ПЛМ (≤127) |
| Выход (CF=1) | — | Фатальная ошибка, требуется RESET |
Файл прошивки должен быть предварительно загружен в указанную страницу.
Важно: во время переключения конфигурации (0F0h–0F3h) происходят сбой синхронизации монитора и перестройка всей схемы. Перед вызовом — DI, после — полная реинициализация периферии.
Функции с пометкой «в разработке» (из IvanMak.txt)
Эти функции перечислены в исходнике, но явно помечены как неготовые:
- 0F4h — DCP_FN0: управление дешифратором портов. Позволит открывать/закрывать дополнительные порты. «В данный момент не доделана».
- 0F8h — SET_PORTS: глобальная установка порта по внутреннему номеру. Позволяет читать/писать любые порты независимо от того, открыты ли они.
- 0F9h — READ_PORTS: глобальное чтение порта.
- 0FAh — WRITE_PORTS: глобальная запись порта.
Из комментариев: «В данный момент функции недоступны и находятся в разработке». Позволят читать/писать закрытые системные порты (1FFD, 7FFD) и эмулировать отсутствующие устройства.
HDD-функции (40h–47h)
Подтверждены в исходниках BIOS v3.04 — добавлены к версии 3.06. Перечень:
| Номер | Название |
|---|---|
| 40h | HDD_INIT |
| 41h | HDD_RECAL |
| 42h | HDD_TEST_IDE |
| 43h | HDD_PREPARE |
| 44h | HDD_READ_BPB |
| 45h | HDD_READ |
| 46h | HDD_WRITE |
| 47h | HDD_PART |
RAM-Disk функции (0C8h–0CFh)
Подтверждены в исходниках BIOS v3.04 — добавлены к версии 3.06:
| Номер | Название |
|---|---|
| 0C8h | BLK_RD_WR — чтение/запись блока секторами (256 байт) |
| 0C9h | BLK_TO_RAMD — загрузить блок в RAM-disk |
| 0CAh | RAMD_CLEAR — очистить RAM-disk |
| 0CBh | RAMD_TO_DRV — скопировать RAM-disk на диск |
| 0CCh | FDD_TO_DRV — скопировать FDD на устройство |
| 0CDh | HDD_TO_DRV — скопировать HDD на устройство |
| 0CEh | GET_RAMD_ST — получить статус RAM-disk |
| 0CFh | GET_DRV_ST — получить статус устройства |
2.10 Функции, добавленные к версии 3.06
Следующие функции отсутствуют в документации BIOS_v3.txt и IvanMak, но реализованы в исходных кодах BIOS v3.04.
Управление памятью и RAM-disk (96h–9Ch)
96h — EMM.GetBanksPorts
Получение адреса порта окна и текущей страницы (аналог 0C6h с другим форматом вызова).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 96h |
| Вход | A | Номер окна (0–3: 0→SLOT0, 1→SLOT1, 2→SLOT2, 3→SLOT3) |
| Выход (CF=0) | C | Адрес порта окна |
| Выход (CF=0) | B | Текущая физическая страница |
| Выход (CF=1) | — | Неверный номер окна |
97h — EMM.CheckColdInit
Проверка необходимости холодной инициализации (используется при загрузке).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 97h |
Если системная страница содержит корректный ID_SPRINTER — тёплый старт (возврат к caller). Если ID не совпадает — переход на полную инициализацию, которая не возвращается.
98h — RAMD_CALC_PAGE
Расчёт физического адреса сектора RAM-disk.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 98h |
| Вход | DE | Track/sector RAM-disk |
| Вход | A | Номер RAM-disk (0–15) |
| Выход (CF=0) | HL | Физический адрес |
| Выход (CF=0) | A | Физическая страница |
| Выход (CF=1) | — | Номер RAM-disk ≥ 16 |
99h — SET_DISK_REDIR
Установка перенаправления диска TR-DOS на указанное устройство.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 99h |
| Вход | E | Тип устройства: 0=FDD, 1–3=FDD, 4=RAMD0, 5=RAMD1, 6=RAMD2, 7=RAMD3, 8=HDD |
| Выход | A | Предыдущее значение перенаправления |
9Ah — GET_DISK_REDIR
Получение текущего перенаправления диска.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 9Ah |
| Выход (CF=0) | A | Текущий тип устройства (0=FDD, 4=RAMD0, 8=HDD) |
9Bh — GET_RAMD_NUM
Получение номера RAM-disk по его ID.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 9Bh |
| Вход | A | ID RAM-disk |
| Выход (CF=0) | A | Номер RAM-disk (0–15) |
| Выход (CF=1) | — | RAM-disk с таким ID не найден |
9Ch — SWAP_RAM_DRIVES
Переключение между наборами Sprinter и ZX RAM-дисков.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 9Ch |
| Вход | B | 0 = переключить на Sprinter, 0FFh = переключить на ZX, 0FEh = только получить инфо |
| Выход | A | Текущий набор RAM-дисков |
Терминальный вывод (0E0h)
0E0h — LP_PR_LINE_DIR
Терминальный вывод строки с обработкой управляющих символов (BELL, Backspace, LF, CR).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0E0h |
| Вход | HL | Адрес строки |
| Вход | DE | Координаты: D=позиция Y, E=позиция X |
| Вход | B | Цвет атрибута |
| Вход | A | Управляющий байт |
PC-link (0E8h–0E9h)
0E8h — FN_SEND_BYTE
Отправка байта через PC-link (LPT1 параллельный порт, протокол Kempston PC-Link).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0E8h |
| Вход | A | Байт для отправки |
| Выход (CF=0) | — | Успех |
| Выход (CF=1) | — | Таймаут — PC не отвечает |
0E9h — FN_RECEIVE_B
Приём байта через PC-link.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0E9h |
| Выход (CF=0) | A | Полученный байт |
| Выход (CF=1) | — | Таймаут |
Клавиатура (0EAh)
0EAh — FN_KBD_OUT
Посылка байта на внешнюю AT-клавиатуру (через SIO канал A, микросхема Z80182).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0EAh |
| Вход | A | Байт данных |
| Вход | B | Параметр скорости |
| Выход (CF=0) | — | Успех |
Микросхема ACEX (0EDh)
0EDh — FN_CRIPT
Чтение информации о кристалле ACEX CPLD.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0EDh |
| Вход | B | 0 = board ID, 1 = chip version |
| Выход (B=0, CF=0) | HL | Номер платы |
| Выход (B=0, CF=0) | A | Тип платы |
| Выход (B=0, CF=0) | BC | BoardID.start |
| Выход (B=0, CF=0) | DE | BoardID.end |
| Выход (B=1, CF=0) | A | Версия кристалла (chip_version) |
Конфигурация AY8910 (0EEh)
0EEh — RST_CONF.AY8910
Переключение конфигурации ППЛМ в режим ZX Spectrum + AY8910.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0EEh |
| Выход (CF=0) | — | Успех |
Режим Spectrum (0FBh–0FCh)
0FBh — GOTO_SPEC
Переход в режим ZX Spectrum. Устанавливает FDD 720K, переключает ПЗУ, переводит систему в режим совместимости со Spectrum.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0FBh |
0FCh — ZX_MEMORY_MANAGER
Переключение на ZX-менеджер страниц памяти (стандартный ZX Spectrum порт 7FFD).
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0FCh |
REINIT (0FDh)
0FDh — REINIT
Перезапуск системы с выбором режима.
| Регистр | Описание | |
|---|---|---|
| Вход | C | 0FDh |
| Вход | B | 1 = RESTART (полный перезапуск), 2 = Soft reset, 3 = Hard reset, 4 = освобождение всей памяти кроме ZX-страниц |
2.11 Быстрый вызов RST 8
Для вызова BIOS из EXE-файла через RST 8 в #0008 устанавливается код:
PUSH AF
LD A,0
OUT (7Ch),A ; включить ПЗУ BIOS в W0
POP AF
RET
Этот код уже присутствует в блоке ОС Estex при загрузке EXE.
Ограничение: адресное пространство #0000..#3FFF во время работы BIOS занято ПЗУ — данные для функций не могут там располагаться. Оптимизация кода для RST 8 недопустима (в ПЗУ стоит обратное переключение через порт #3Ch).
2.12 Кросс-ссылки
- DSS/ESTEX:
03-dss.md - Видеорежимы и палитра:
05-graphics.md - Порты:
11-ports.md - Баги BIOS:
12-bugs.md - Управление окнами DSS (SETWIN/SETWIN1/SETWIN2):
03-dss.md §3.6 - Функции DSS (GET_DRV_ST, SET_DISK_REDIR, EMM):
03-dss.md - Дескрипторы окон: проектный
libc-reference.md