c71e249a4e
First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.
What's in here:
bin/sprinter-cc — driver script invoking SDCC + linker + mkexe
libc/ — Sprinter-specific libc layer over ESTEX/BIOS
(conio, gfx, io, mem, stdio + headers)
runtime/ — crt0 variants (default/small/banked/minimal)
+ heap + bank trampolines
toolchain/ — mkexe (SprintEXE packer, C + tests)
examples/ — 30 demo programs (gfx, file I/O, env, time, …)
lib/Makefile — builds the libc archive (sprinter.lib)
docs/ — converted Sprinter manuals + asm reference samples
third_party/ — solid-c reference compiler dump + sdcc setup script
release_docs/ — packaging / release notes
gitignore overhaul:
• Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
on macOS APFS). Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
• Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
INPUT fixtures, not build outputs.
• Collapse the duplicated SDCC/C/Sdcc sections into one section per
concern (build outputs / vendored / OS-junk).
• Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1227 lines
45 KiB
Plaintext
1227 lines
45 KiB
Plaintext
Функции BIOS v2.12
|
||
|
||
Вызов функций BIOS осуществляется из ассемблерного кода.
|
||
|
||
|
||
|
||
Номер функции задается в регистре C процессора. В остальные регистры, при необходимости, загружаются входные параметры функции. После исполнения функции происходит возврат в программу, из которой произошел вызов функции. Установленный флаг CF (CF=1) означает, что работа функции произошла с ошибкой. В некоторых регистрах передаются выходные параметры.
|
||
|
||
|
||
|
||
Ниже приведены таблицы входных и выходных параметров для каждой функции:
|
||
|
||
• Функции работы с памятью
|
||
|
||
• Функции управления 'железом'
|
||
|
||
• Функции управления окнами и режимами экрана
|
||
|
||
• Функции вывода текста на экран
|
||
|
||
• Графические функции
|
||
|
||
• Функции работы с жесткими дисками и дисководами
|
||
|
||
При работе функций BIOS необходимо что бы стек находился в области 8000h..0BFFFh, так как часть функций использует переключение страниц PAGE1 и PAGE3.
|
||
|
||
|
||
|
||
Вызов функций BIOS возможен в различных конфигурациях компьютера Sprinter.
|
||
|
||
|
||
|
||
Конфигурация Spectrum: вызов функций BIOS осуществляется через 3D13h. При этом работают и все функции TR-DOS.
|
||
|
||
|
||
|
||
Конфигурации Sprinter: вызов функций BIOS осуществляется через RST 18h при подключенном системном ПЗУ.
|
||
|
||
|
||
|
||
Для постоянного подключения системного ПЗУ можно воспользоваться такой последовательностью команд:
|
||
|
||
|
||
|
||
LD A,0
|
||
|
||
OUT (07Ch),A
|
||
|
||
После ее исполнения в 0-м окне Z80 будет включено ПЗУ BIOSа и программа может вызывать функции BIOSа через RST 18h.
|
||
|
||
|
||
|
||
Отключение ПЗУ BIOSа из нулевого окна Z80 производится следующей последовательностью команд:
|
||
|
||
|
||
|
||
LD A,0
|
||
|
||
OUT (03Ch),A
|
||
|
||
При необходимости, функции BIOSа могут быть вызваны программой, находящейся в ОЗУ непосредственно в нулевом окне Z80. Для этого надо установить в адресе 0008h следующий код:
|
||
|
||
|
||
|
||
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 - нормальное завершение
|
||
|
||
C - неправильный идентификатор
|
||
|
||
идентификатор не всегда отслеживается правильно
|
||
|
||
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 Получение адресов портов окон
|
||
|
||
примечание по использованию
|
||
|
||
|
||
Значение регистров на входе:
|
||
|
||
C=0C6h
|
||
|
||
A - номер окна процессора - 0,1,2 или 3 Значение регистров на выходе:
|
||
|
||
CF=0 - нормальное завершение
|
||
|
||
C - 8-битный адрес порта окна
|
||
|
||
B - физический номер подключенной в окно страницы
|
||
|
||
CF=1 - ошибка - неверный номер окна
|
||
|
||
0C7h (199) EMM_FN7 Получить номер следующей страницы блока
|
||
|
||
примечание по использованию
|
||
|
||
|
||
Значение регистров на входе:
|
||
|
||
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 - неверный номер режима синхронизации
|
||
|
||
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 Функция управления турбо режимом.
|
||
|
||
комментарий
|
||
|
||
|
||
Значение регистров на входе:
|
||
|
||
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.44/720
|
||
|
||
CF=1 - нет устройства
|
||
|
||
59h (89) DRV_SET_PAR Установить параметры носителя
|
||
|
||
Значение регистров на входе:
|
||
|
||
A - номер и тип устройства (см. выше)
|
||
|
||
L - число секторов
|
||
|
||
H - число головок
|
||
|
||
DE - количество цилиндров
|
||
|
||
IX - размер сектора в байтах
|
||
|
||
B - доп. параметры для дискет
|
||
|
||
бит7 - тип 1.44/720 Значение регистров на выходе:
|
||
|
||
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.
|
||
|