Add full compiler toolchain, libc, examples and reference docs
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>
This commit is contained in:
@@ -0,0 +1,219 @@
|
||||
▄▄▄▄▄▄
|
||||
▄█░░░░░░
|
||||
█░░ █░░
|
||||
█░░▄▄▄█░░
|
||||
█░░░░░░░░
|
||||
█░░ █░░
|
||||
█░░ █░░ рхитектура компьютера Sprinter.
|
||||
▀░░ ▀░░
|
||||
|
||||
Введение.
|
||||
|
||||
Данное описание предполагает наличие определенных знаний читателя,
|
||||
а именно знание архитектуры компьютера ZX-Spectrum и их разновидностей, в
|
||||
частности Pentagon-128 и Scorpion-256, а так же знание языка BASIC и
|
||||
некоторое знакомство с языком ассемблера Z80.
|
||||
Здесь я буду называть конфигурацией машины - конкретную реализацию
|
||||
конкретной схемы в перепрограммируемой логической микросхеме (ППЛМ).
|
||||
Это означает, что машина имеет множество конфигураций, каждая из которых
|
||||
имеет свою схему.
|
||||
Я так же использую понятие КЭШ-ОЗУ. Это не КЭШ в формальном
|
||||
смысле, а быстрое ОЗУ, в котором процессор может работать на высокой
|
||||
частоте без ожидания. КЭШ-ем это ОЗУ называется только по традиции,
|
||||
подобно КЭШ-у на КР537РУ10 в компьютерах Pentagon-128.
|
||||
|
||||
|
||||
Краткие данные компьютера Sprinter.
|
||||
|
||||
Пpоцессоp . . . . . . . . . . . Z84C15
|
||||
Тактовая частота . . . . 21MHz/3.5MHz
|
||||
ОЗУ . . . . . . . . . . . . . . 4096Kb
|
||||
КЭШ ОЗУ . . . . . . . . . . . . . 64Kb
|
||||
ПЗУ . . . . . . . . . . . . . . .128Kb
|
||||
Видео-ОЗУ . . . . . . . . . 256Kb(512)
|
||||
Контpоллеp дисков . . . . . Кp1818ВГ93
|
||||
Поддеpжка 1.44Mb фоpмата . . 3.5"диска
|
||||
Контpоллеp винчестеpа . . . . . IDE/AT
|
||||
Контpоллеp клавиатуpы . . . 101key/AT
|
||||
Контpоллеp мыши . . . . . . . MS-Mouse
|
||||
Два слота . . . . . . . стандаpт ISA-8
|
||||
Железная эмуляция AY-3-8910 стерео-OUT
|
||||
COVOX . . . . . . . . . 8bit x 4chanel
|
||||
Видео-pежимы: . . . Spectrum standart
|
||||
GRAF 320x256x256,640x256x16, TXT 80x32
|
||||
Выход видео на TV или CGA монитоp, RGB
|
||||
|
||||
|
||||
Техническая реализация.
|
||||
|
||||
Ядром машины являются процессор Z84C15 и ППЛМ EPF10K10QC208.
|
||||
Кроме них на плате присутствуют микросхемa ПЗУ, 72х-пиновый SIMM
|
||||
на 4Mb, 256Kb видео-ОЗУ, 64Kb КЭШ-ОЗУ, схема контроллера дисковода на
|
||||
БИС КР1818ВГ93, буферы для подключения джойстика, магнитофона, принтера,
|
||||
клавиатуры, дисководов, винчестера, мыши, буферные микросхемы шины ISA-8
|
||||
и еще одна ППЛМ фирмы ALTERA - EPM7032LC44. Эта ППЛМ не меняет своей
|
||||
конфигурации и предназначена для обеспечения синхронизации и начального
|
||||
запуска компьютера. На плате так же предусмотрена возможность подключения
|
||||
CMOS часов на основе микросхемы DALLAS. Кроме периферии и буферов имеются
|
||||
микросхемы дешифрации, входы которых подключаются к процессору через ППЛМ.
|
||||
Это позволяет легко менять адресацию устройств без какого либо изменения
|
||||
разводки печатной платы.
|
||||
|
||||
|
||||
Возможности архитектуры машины.
|
||||
|
||||
Схема компьютеpа основана на большой пеpепpогpаммиpуемой логической
|
||||
микpосхеме. Подключение периферийных устройств через ППЛМ позволяет получить
|
||||
высокую гибкость машины по конфигурациям.
|
||||
Пpогpаммиpование ППЛМ осуществляется непосpедственно в момент
|
||||
включения, а так же пpи пеpезагpузке, что позволяет каpдинально менять
|
||||
схему в ППЛМ непосpедственно во вpемя pаботы. Это сильно выделяет
|
||||
архитектуру компьютера из ряда существующих компьютеров и поэтому многие
|
||||
понятия, присущие обычным машинам, меняют свой смысл. Фактически компьютер
|
||||
имеет изменяемую архитектуру, в которой возможны изменения во многих частях
|
||||
схемы. Так, например, нельзя говорить о конкретных адресах портов
|
||||
подключения периферии, так как они могут быть изменены в одну секунду
|
||||
путем перепрограммирования ППЛМ и данных в ОЗУ, отвечающих за конфигурацию
|
||||
портов. Конкретные адреса появляются только в конкретных конфигурациях,
|
||||
например, такой как конфигурация ZX-Spectrum.
|
||||
Перепрограммируемость схемы дает довольно большую свободу
|
||||
фантазии программиста по конфигурации машины. Задумывая конкретную
|
||||
работу программист может определить в какой конфигурации ее можно
|
||||
сделать лучше, а, возможно, и придумать свою конфигурацию, которую
|
||||
затем можно реализовать в ППЛМ и включить перед запуском этой программы.
|
||||
|
||||
|
||||
Блочная схема компьютера Sprinter.
|
||||
|
||||
┌───────┐ ┌──────────────────────────────┐ ┌────────────>Sinc
|
||||
│Принтер│ │ 2 ISA SLOTS │ │ ┌───────>R
|
||||
├───────┤ └───┬─┬─┬─┬─┬───────┬─┬─┬─┬─┬──┘ │ │ ┌─────>G
|
||||
│ Мышь │ ┌───┴─┴─┴─┴─┴───────┴─┴─┴─┴─┴──┐ │ │ │ ┌───>B
|
||||
└─┬─┬─┬─┘ │ Буферы и дешифраторы │ │ ┌─┴─┴─┴─┐
|
||||
│ │ │ └───┬──────────┬─┬──┬─┬────┬─┬─┘ │ │ ЦАП │
|
||||
│ │ │ │INT │ │ │ │ │ │ │ │ буфер │
|
||||
┌──┴─┴─┴┬─┐ │ │ │ │ │ ┌┴─┴──────┴─┐└──┬─┬──┘ ┌────────┐
|
||||
│ Внутр │ ├────│──────────┘ └──│ │───┤ EPF10K10 ├───┘ └──────┤ видео │
|
||||
│ порты │ ├────│──────────DATA─│ │───┤ ├──V_DATA────┤ │
|
||||
├───────┘ ├────│───┐ ┌─────────│ │───┤ ├────────────┤ ОЗУ │
|
||||
│ ├<───┘ │ │ │ │ │ │ │ │
|
||||
│ ├────────────────────┘ └───┤ ├────────────┤ │
|
||||
│ Z84C15 ├───────────────ADRESS─────┤ ├─V_ADRESS───┤ │
|
||||
│ ├────┐ ┌───────────────────┤ ├────────────┤ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ ├<───│ │─│ │──────────────>┤ ├──WE,CSi───>┤ │
|
||||
│ ├<───│ │─│ │────DIR───────>┤ │ └────────┘
|
||||
│ ├<───│ │─│ │──────────────>┤ ├───────> Audio OUTs
|
||||
│ │ │ │ │ │ │ │ ┌────────┐
|
||||
│ │ ┌─┴─┴─┴─┴───────┐ │ ├────────────┤ MAIN │
|
||||
│ │ │ ПЗУ и КЭШ-ОЗУ ├<─ADR'─┤ ├──DATA──────┤ RAM │
|
||||
└─┬─┬─┬──┬┘ │ CS ├<─CS───┤ ├────────────┤ │
|
||||
│ │ │ │ └───────────────┘ │ │ │ SIMM │
|
||||
│ D │ │ ┌──────────────┐ │ ├────────────┤ │
|
||||
│ A │ │ │ EPM7032 ├───────>┤ ├──ADRESS────┤ │
|
||||
│ T │ └──>┤ Sinchro │ │ ├────────────┤ │
|
||||
│ A │ │ HDD_DIR ├<───────┤ │ │ │
|
||||
│ │ │ │ ФАПЧ ├<───────┤ ├─RAS,CAS,WE─┤ │
|
||||
│ │ │ └─┬─┬─┬─┬─┬────┘ │ │ └────────┘
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
┌─┴─┴─┴────────┴─┴─┴─┴─┴───────┐ │ │
|
||||
│ Периферийные устройства ├<────┤ │
|
||||
│ FDD,HDD,KEMPSTON ├<DIR─┤ │
|
||||
│ ├<────┤ │
|
||||
└──────────────────────────────┘ │ │
|
||||
┌────────────────────>┤ │
|
||||
┌────────┐ │ ┌────────┐ │ │
|
||||
│ TAPE ├<──┘ │Keyboard├─────────>┤ │
|
||||
│ in/out │ ├┬┬┬┬┬┬┬┬┤ │ │
|
||||
└────────┘ └┴┴┴┴┴┴┴┴┘ └───────────┘
|
||||
|
||||
Рисунок 1.
|
||||
|
||||
|
||||
|
||||
Для простоты некоторые буферы и дешифраторы на схеме не указаны.
|
||||
Количество Проводов в шинах так же условны. Часть сигналов управления
|
||||
устройств с ППЛМ смультиплицированы с адресами SIMM-а.
|
||||
|
||||
|
||||
Дальнейшее описание архитектуры является описанием конкретных
|
||||
конфигураций и частей конфигураций. Но перед этим следует сказать несколько
|
||||
слов о переключении самих конфигураций.
|
||||
|
||||
Загрузка конфигураций.
|
||||
|
||||
В момент включения компьютера, а так же после нажатия на RESET вся
|
||||
информация, находившаяся в ППЛМ отвечающая за конкретную конфигурацию,
|
||||
стирается. ППЛМ переходит в режим ожидания загрузки блока данных схемы.
|
||||
В этот момент процессор полностью отключен от какой либо периферии.
|
||||
В его адресное пространство памяти оказывается включена одна страница ПЗУ и
|
||||
одна страница ОЗУ КЭШ-памяти. Любая запись в адресное пространство памяти
|
||||
процессора в этот момент приводит к записи данных в ППЛМ и программа в
|
||||
подключенной странице ПЗУ имеет только одну единственную цель - загрузить
|
||||
в ППЛМ данные конфигурации. В этой же странице ПЗУ находятся данные
|
||||
начальной конфигурации. (В данный момент это конфигурация Sprinter-1.)
|
||||
Программа загрузки конфигурации проверяет флаг в КЭШ-памяти и, если он
|
||||
установлен, загружает в ППЛМ данные из ОЗУ, если сброшен, то данные из
|
||||
ПЗУ. На этом основано переконфигурирование схемы компьютера.
|
||||
Для изменения схемы надо загрузить в последнюю страницу КЭШ-памяти
|
||||
блок данных конфигурации со смещения #100 и выставить флаг, которым является
|
||||
текстовая строка "FLEX_10K_LOADING", записанная по смещению #80 в этой же
|
||||
странице КЭШ-а. После этого надо произвести полный сброс, который
|
||||
осуществляется программно записью в специальную страницу памяти RESET_PAGE.
|
||||
Программа в ПЗУ, запускаемая по сбросу находит флаг FLEX_10K_LOADING и
|
||||
начинает загрузку данных в ППЛМ. При этом она одновременно затирает флаг,
|
||||
что предотвращает повторную загрузку новой конфигурации при нажатии на
|
||||
кнопку RESET и позволяет вернуться после "ручного" сброса в начальную
|
||||
конфигурацию. Затирание флага так же избавляет от мучений в случае
|
||||
подключения неправильной конфигурации во время экспериментов с программами.
|
||||
Нажатие на RESET всегда вернет схему в начальную конфигурацию.
|
||||
|
||||
Примечание:
|
||||
Внутренняя информация блока данных ППЛМ является закрытой
|
||||
информацией фирмы ALTERA. Кроме самих микросхем ППЛМ ALTERA поставляет
|
||||
и программное обеспечение для разводки схем внутри ППЛМ. К сожалению, эта
|
||||
программа не может работать на компьютере типа ZX-Spectrum и в ближайшем
|
||||
обозримом будущем не предвидится ее версия для Sprinter-а. Поэтому
|
||||
разработка новых конфигураций может производится только при наличии
|
||||
достаточно мощной машины (все делалось на Pentium-166) и программы разводки
|
||||
схем в ППЛМ, цена на которую составляет сотни долларов США.
|
||||
В связи с этим, в данный момент Sprinter имеет несколько конкретных
|
||||
конфигураций, две из которых записаны в ПЗУ, а остальные могут быть
|
||||
подгружены с дискеты или винчестера. Постоянно ведется совершенствование
|
||||
конкретных конфигураций и разработка новых.
|
||||
|
||||
Конфигурация Sprinter-1.
|
||||
|
||||
Включает в себя конфигурацию Spectrum-128/256, распределение памяти
|
||||
до 4Mb, расширенный экран с режимами Spectrum, Text-80x32, Graf-320x256x256,
|
||||
контроллер дисковода, контроллер IDE винчестера, контроллер клавиатуры AT,
|
||||
подключенной как ZX-Keyboard, 8-bit COVOX.
|
||||
Эта конфигурация максимально приближена к конфогурации ZX-Spectrum
|
||||
и позволяет работать на обычных спектрумовских программах и постепенно
|
||||
менять их под расширенные режимы экрана и памяти, а так же для работы с
|
||||
новыми устройствами.
|
||||
|
||||
Конфигурация Sprinter-2.
|
||||
|
||||
Включает в себя конфигурацию Spectrum-128/256, распределение памяти
|
||||
до 4Mb, расширенный экран с режимами Spectrum, Text-80x32, Graf-320x256x256,
|
||||
контроллер дисковода, контроллер IDE винчестера, контроллер клавиатуры AT,
|
||||
подключенной как ZX-Keyboard, Accelerator.
|
||||
Конфигурация, как и Sprinter-1 приближена к спектрумовской, но
|
||||
имеет более жесткие требования к программам по совместимости. Позволяет
|
||||
использовать акселератор операций с основным и видео-ОЗУ. Акселератор
|
||||
ускоряет операции пересылки блоков данных и заполнения ОЗУ одним байтом
|
||||
до физического предела скорости основного ОЗУ.
|
||||
В последней версии конфигурация Sprinter-2 не имеет Spectrum-овской
|
||||
клавиатуры. Вместо нее из порта 0FEh считывается сканкод пришедший с
|
||||
AT-клавиатуры.
|
||||
|
||||
Конфигурация ZX-Spectrum-256/AY.
|
||||
|
||||
Эта конфигурация максимально приближена к ZX-Spectrum-128/256
|
||||
и включает в себя схему музыкального сопроцессора AY-3-8910. В этой
|
||||
конфигурации отсутствуют расширенные режимы экрана.
|
||||
Вторая версия схемы AY включает в себя три генератора голосов,
|
||||
генератор шума и регуляторы амплитуды. Генератор огибающей отсутствует.
|
||||
Так же отсутствует возможность чтения из портов данных сопроцессора.
|
||||
В третьей версии AY предполагается данные недостатки исключит
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,357 @@
|
||||
Функции BIOS v3.00
|
||||
Вызов функций BIOS осуществляется из ассемблерного кода.
Номер функции задается в регистре C процессора. В остальные регистры, при необходимости, загружаются входные параметры функции. После исполнения функции происходит возврат в программу, из которой произошел вызов функции. Установленный флаг CF (CF=1) означает, что работа функции произошла с ошибкой. В некоторых регистрах передаются выходные параметры.
Ниже приведены таблицы входных и выходных параметров для каждой функции:
|
||||
HYPERLINK "" \l "t01" Функции работы с памятью
|
||||
HYPERLINK "" \l "t04" Функции управления 'железом'
|
||||
HYPERLINK "" \l "t06" Функции управления окнами и режимами экрана
|
||||
HYPERLINK "" \l "t07" Функции вывода текста на экран
|
||||
HYPERLINK "" \l "t08" Графические функции
|
||||
HYPERLINK "" \l "t11" Функции работы с жесткими дисками и дисководами
|
||||
При работе функций 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 Получение адресов портов окон
HYPERLINK "" \l "02" примечание по использованию
|
||||
|
||||
Значение регистров на входе:
C=0C6h
A - номер окна процессора - 0,1,2 или 3
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
C - 8-битный адрес порта окна
B - физический номер подключенной в окно страницы
CF=1 - ошибка - неверный номер окна
|
||||
|
||||
0C7h (199) EMM_FN7 Получить номер следующей страницы блока
HYPERLINK "" \l "03" примечание по использованию
|
||||
|
||||
Значение регистров на входе:
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 - версия железа HYPERLINK "" \l "04" подробности ниже
A - количество полей в буфере (в данный момент - 2)
Первое поле - версия BIOS.
Второе - название модели компьютера.
CF=1 - ошибка - Очень старая версия,
не имеющая данной функции
|
||||
|
||||
0F2h (242) FN_SICF=0 Установка синхронизации, очистка страницы режима экрана
|
||||
|
||||
Значение регистров на входе:
C=0F2h
A - режим синхронизации
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - неверный номер режима синхронизации
|
||||
|
||||
0F5h (245) CMOS_TEST Проверить наличие CMOS
HYPERLINK "" \l "08" комментарий
|
||||
|
||||
Значение регистров на входе:
C=0F5h
|
||||
Значение регистров на выходе:
CF=0 - часы есть
CF=1 - часов нет
|
||||
|
||||
0F6h (246) CMOS_RD Читать из регистра CMOS
HYPERLINK "" \l "08" комментарий
|
||||
|
||||
Значение регистров на входе:
C=0F6h
D - номер регистра CMOS
|
||||
Значение регистров на выходе:
A - считанные данные
CF=0 - часы есть
CF=1 - часов нет
|
||||
|
||||
0F7h (247) CMOS_WR Писать в регистр CMOS
HYPERLINK "" \l "08" комментарий
|
||||
|
||||
Значение регистров на входе:
C=0F7h
D - номер регистра CMOS
A - записываемые данные
|
||||
Значение регистров на выходе:
CF=0 - часы есть
CF=1 - часов нет
|
||||
|
||||
08Fh (143) FN_TURBO Функция управления турбо режимом.
HYPERLINK "" \l "09" комментарий
|
||||
|
||||
Значение регистров на входе:
C=08Fh
A - режим турбо: 2 - off, 3 - on
A - режим FDD: 12h - 720, 13h - 1.44
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - неверный режим турбо
|
||||
|
||||
Функции управления окнами и режимами экрана
|
||||
|
||||
0B0h (176) WIN_OPEN Функция открытия окна.
|
||||
|
||||
Значение регистров на входе:
C=0B0h
IX - HYPERLINK "" \l "10" описатель окна
E - флаги окна:
бит 0 указывает какую страницу режима включать после исполнения функции;
бит 4 указывает на какой странице режима открывать окно
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение:
A - HYPERLINK "" \l "17" идентификатор окна
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 - HYPERLINK "" \l "17" идентификатор глобального окна
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 - HYPERLINK "" \l "17" идентификатор глобального окна
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 - HYPERLINK "" \l "17" идентификатор глобального окна
H - размер HYPERLINK "" \l "15" локального окна по вертикали в символах
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 положение HYPERLINK "" \l "15" локального окна
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 положение HYPERLINK "" \l "15" локального окна
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 - HYPERLINK "" \l "18" данные палитры
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=1 - установка графической палитры
B=2 - установка спектрумовской палитры
B=3 - установка текстовой палитры CGA
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - неверный номер палитры
|
||||
|
||||
Функции работы с жесткими дисками и дисководами
|
||||
|
||||
50h,52h,53h (80,82,83) Зарезервированы
|
||||
|
||||
Значение регистров на входе:
нет
|
||||
Значение регистров на выходе:
нет
|
||||
|
||||
51h (81) DRV_RESET Сброс контроллера и настройка на диск
|
||||
|
||||
Значение регистров на входе:
C=51h
A - номер и HYPERLINK "" \l "22" тип устройства
бит 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 - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
HL:IX - номер сектора (IX - младшая часть номера сектора)
B - количество проверяемых секторов
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - проверка с ошибкой
|
||||
|
||||
55h (85) DRV_READ Чтение с устройства
|
||||
|
||||
Значение регистров на входе:
C=55h
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
HL:IX - номер сектора (IX - младшая часть номера сектора)
B - количество секторов
DE - адрес буфера для данных
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - ошибка чтения
HL:IX - номер сектора + кол-во прочитанных секторов
DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора)
|
||||
|
||||
56h (86) DRV_WRITE Запись на устройства
|
||||
|
||||
Значение регистров на входе:
C=56h
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
HL:IX - номер сектора (IX - младшая часть номера сектора)
B - количество секторов
DE - адрес буфера данных для записи
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - ошибка записи
HL:IX - номер сектора + кол-во прочитанных секторов
DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора)
|
||||
|
||||
57h (87) DRV_DETECT Определение параметров устройства
|
||||
|
||||
Значение регистров на входе:
C=57h
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
A - bit7=0 диск 720Кb
Bit7=1 диск 1.44Mb
CF=1 - нет устройства или нет носителя
|
||||
|
||||
58h (88) DRV_GET_PAR Получить параметры носителя
|
||||
|
||||
Значение регистров на входе:
C=58h
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
L - число секторов
H - число головок
DE - количество цилиндров
если HL=DE=0FFFFh - устройства нет
IX - размер сектора в байтах
B - доп. параметры для дискет:
бит7 - тип 1.44/720
CF=1 - нет устройства
|
||||
|
||||
59h (89) DRV_SET_PAR Установить параметры носителя
|
||||
|
||||
Значение регистров на входе:
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
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 в байте HYPERLINK "" \l "19" режима знакоместа
Страницы 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,421 @@
|
||||
Системные вызовы дисковой подсистемы (DSS) v1.6
|
||||
Системные вызовы
|
||||
|
||||
|
||||
Если программа выполняет не только некую математическую задачу на ассемблере, то в ней придется столкнуться с такими вещами, как получение ввода пользователя, выполнение вывода результатов и завершение своей работы. Для этого, необходимо обратиться к сервисам DSS. Фактически, программирование на языке ассемблера одинаково для любых систем, если не пользоваться их сервисами.
Вызов функций DSS в системе Estex выполняется из ассемблера. Необходимые параметры указываются в различных регистрах, регистр C используется для указания номера функции.
Так, наша программа для Estex будет выглядеть наподобие:
|
||||
|
||||
ORG #8100 ;адрес точки входа
|
||||
|
||||
LD HL,MSG ;сообщение для вывода
|
||||
LD C,5Ch ;номер системного вызова (PCHARS)
|
||||
RST 10h ;вызов подсистемы
|
||||
|
||||
LD C,41h ;номер системного вызова (EXIT)
|
||||
RST 10h ;вызов подсистемы
|
||||
|
||||
MSG db "Hello, world!",0Dh,0Ah ;наша стока
|
||||
db 0 ;конец строки
|
||||
|
||||
Следом за таблицей есть пояснение по двум новым функциям 0Ch и 0Dh.
|
||||
Далее идет список категорий функций DSS для системы Estex
|
||||
HYPERLINK "" \l "version" Функции идентификации системы
|
||||
HYPERLINK "" \l "disk_io" Функции для работы с диском
|
||||
HYPERLINK "" \l "file_io" Функции для работы с файлами
|
||||
HYPERLINK "" \l "date_time" Функции для работы с датой и временем
|
||||
HYPERLINK "" \l "memory" Функции управления памятью
|
||||
HYPERLINK "" \l "keyboard" Функции ввода с клавиатуры
|
||||
HYPERLINK "" \l "execute" Функции для исполнения программ
|
||||
HYPERLINK "" \l "cmdline" Функции для работы со строками и командной строкой
|
||||
HYPERLINK "" \l "var" Функции для работы с переменными
|
||||
HYPERLINK "" \l "screen" Функции работы с экраном
|
||||
HYPERLINK "" \l "printer" Функции для печати на принтере
|
||||
HYPERLINK "" \l "tocversion" Функции идентификации системы
|
||||
|
||||
00h (00) VERSION (Версия DSS)
|
||||
|
||||
Входные значения:
C - 00h
|
||||
Выходные значения:
D - номер версии
E - модификация
|
||||
|
||||
HYPERLINK "" \l "tocdisk_io" Функции для работы с диском
|
||||
|
||||
01h (01) CHDISK (Смена текущего диска)
|
||||
|
||||
Входные значения:
A - номер диска (0-A,1-B...)
C - 01h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - максимальный номер диска, если CF=0
|
||||
|
||||
02h (02) CURDISK (Номер текущего диска)
|
||||
|
||||
Входные значения:
C - 02h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - текущий номер диска (0-A,1-B...), если CF=0
|
||||
|
||||
03h (03) DSKINFO (Информация о диске)
|
||||
|
||||
Входные значения:
A - номер диска (0-A,1-B...0FFh-текущий)
C - 03h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - размер кластера в секторах, если CF=0
HL - общее кол-во кластеров
DE - свободных кластеров
BC - размер сектора в байтах
|
||||
|
||||
09h (09) BOOTDSK (Номер системного диска)
|
||||
|
||||
Входные значения:
C - 09h
B = 0
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - номер системного диска (0-A,1-B...), если CF=0
|
||||
|
||||
HYPERLINK "" \l "tocfile_io" Функции для работы с файлами
|
||||
|
||||
0Ah (10) CREATE (Создание файла)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Ah
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0
|
||||
|
||||
0Bh (11) CREATE NEW FILE (Создание нового файла)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Bh
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0
|
||||
|
||||
0Eh (14) DELETE (Удаление файла)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
C - 0Eh
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
10h (16) RENAME (Переименование файла)
|
||||
|
||||
Входные значения:
HL - указатель на старое имя файла
DE - указатель на новое имя файла
C - 10h
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
11h (17) OPEN (Открытие файла)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
A - режим доступа
A=0 чтение/запись
A=1 чтение
A=2 запись
C - 11h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0
|
||||
|
||||
12h (18) CLOSE (Закрытие файла)
|
||||
|
||||
Входные значения:
A - файловый манипулятор
C - 12h
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
|
||||
13h (19) READ (Чтение из файла)
|
||||
|
||||
Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество читаемых байт
C - 13h
|
||||
Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество прочитанных байт
если CF=0:
A = 0 прочитаны все байты
A = 0FFh прочитано меньшее число байт
|
||||
|
||||
14h (20) WRITE (Запись в файл)
|
||||
|
||||
Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество записываемых байт
C - 14h
|
||||
Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество записанных байт
|
||||
|
||||
15h (21) MOVE_FP (Перемещение указателя в файле)
|
||||
|
||||
Входные значения:
A - файловый манипулятор
HL:IX - смещение указателя в файле
B - способ перемещения:
B=0 от начала файла
B=1 от текущего значения указателя
B=2 от конца файла
C - 15h
|
||||
Выходные значения:
A - код ошибки
|
||||
если CF=1
HL:IX - новое значение указателя
|
||||
|
||||
16h (22) ATTRIB (Получение/изменение атрибута файла)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
B - режим доступа
B = 0 получить атрибут
B = 1 установить атрибут
A - атрибут файла
C - 16h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - атрибут файла, если CF=0
|
||||
|
||||
17h (23) GET_D_T (Информация о дате и времени файла)
|
||||
|
||||
Входные значения:
A - файловый манипулятор
C - 17h
|
||||
Выходные значения:
A - код ошибки, если CF=1
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
|
||||
|
||||
18h (24) PUT_D_T (Изменение даты и времени файла)
|
||||
|
||||
Входные значения:
A - файловый манипулятор
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - 18h
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
19h (25) F_FIRST (Поиск первого совпадающего файла)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
DE - рабочий буфер 44 байта, если B=0, иначе 256 байт
A - атрибуты, используемые при поиске
B = 0 - имя найденного файла в формате 11 байт "FilenameExt"
B = 1 - имя найденного файла в формате DOS "filename.ext",0
C - 19h
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
1Ah (26) F_NEXT (Поиск следующего совпадающего файла)
|
||||
|
||||
Входные значения:
DE - указатель на рабочий буфер
C - 1Ah
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
|
||||
|
||||
|
||||
1Bh (27) MKDIR (Создание каталога)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
C - 1Bh
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
1Ch (28) RMDIR (Устранение каталога)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
C - 1Ch
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
1Dh (29) CHDIR (Смена текущего каталога)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
C - 1Dh
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
1Eh (30) CURDIR (Информация о текущем каталоге)
|
||||
|
||||
Входные значения:
HL - буфер в памяти 256 байт
C - 1Eh
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
HYPERLINK "" \l "tocdate_time" Функции для работы с датой и временем
|
||||
|
||||
21h (33) SYSTIME (Текущая дата и время)
|
||||
|
||||
Входные значения:
C - 21h
|
||||
Выходные значения:
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - день недели
|
||||
|
||||
22h (34) SETTIME (Установить текущую дату и время)
|
||||
|
||||
Входные значения:
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - 22h
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
HYPERLINK "" \l "tocmemory" Функции управления памятью
|
||||
|
||||
38h (56) SETWIN (Подключение страницы памяти)
|
||||
|
||||
Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
H - биты 6 и 7 задают номер окна, в которое будет подключена страница
C - 38h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0
|
||||
|
||||
39h (57) SETWIN1 (Подключение страницы памяти в первое окно)
|
||||
|
||||
Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 39h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0
|
||||
|
||||
3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно)
|
||||
|
||||
Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 39h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0
|
||||
|
||||
3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно)
|
||||
|
||||
Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 3Bh
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0
|
||||
|
||||
3Ch (60) INFOMEM (Информация о памяти)
|
||||
|
||||
Входные значения:
C - 3Ch
|
||||
Выходные значения:
HL - общее количество страниц
BC - количество свободных страниц
|
||||
|
||||
3Dh (61) GETMEM (Выделение блока памяти)
|
||||
|
||||
Входные значения:
B - размер блока в страницах по 16 килобайт
C - 3Dh
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - идентификатор блока памяти, если CF=0
|
||||
|
||||
3Eh (62) FREEMEM (Освобождение блока памяти)
|
||||
|
||||
Входные значения:
A - идентификатор блока памяти
C - 3Eh
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
3Fh (63) SETMEM (Изменение блока памяти)
|
||||
|
||||
Входные значения:
A - идентификатор блока памяти
B - новый размер блока
C - 3Fh
|
||||
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
HYPERLINK "" \l "tockeyboard" Функции ввода с клавиатуры
|
||||
|
||||
30h (48) WAITKEY (Ожидание символа с клавиатуры)
|
||||
|
||||
Входные значения:
C - 30h
|
||||
Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt
|
||||
31h (49) SCANKEY (Опрос клавиатуры без ожидания)
|
||||
|
||||
Входные значения:
C - 31hВыходные значения:
ZF = 1 - нет клавиш
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt
|
||||
32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью)
|
||||
|
||||
Входные значения:
C - 32h
|
||||
Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt
|
||||
33h (51) CTRLKEY (Получить состояние клавиатуры)
|
||||
|
||||
Входные значения:
C - 33h
|
||||
Выходные значения:
A = 0 - нет символов в буфере
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt
|
||||
35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию)
|
||||
|
||||
Входные значения:
B - номер фун
|
||||
ции 30h, 31h, 32h, 33h или 34h
C - 35h
|
||||
Выходные значения:
В зависимости от указанной функции в регистре B.
|
||||
|
||||
36h (54) K_SETUP (Управление настройками клавиатуры)
|
||||
|
||||
Входные значения:
B - номер подфункции
C - 36h
B = 0, установить раскладку клавиатуры
A - номер раскладки
|
||||
0 - normal
1 - shift
2 - caps lock
3 - caps lock + shift
4 - normal (альтернативная кл.)
5 - shift (альтернативная кл.)
6 - caps lock (альтернативная кл.)
7 - caps lock + shift (альтернативная кл.)
|
||||
B = 1, получить состояние звуковых переменных
B = 2, установить звуковые переменные
A - значение переменной
bit0 - сигнал переполнения буфера клавиатуры
bit1 - сигнал переключения на альтернативную раскладку клавиатуры
|
||||
Выходные значения:
В зависимости от указанной функции в регистре B.
|
||||
|
||||
37h (55) TESTKEY (Опрос буфера клавиатуры)
|
||||
|
||||
Входные значения:
C - 37h
|
||||
Выходные значения:
ZF = 1 - нет символов в буфере
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt
|
||||
|
||||
HYPERLINK "" \l "tocexecute" Функции для исполнения программ
|
||||
|
||||
40h (64) EXEC (Выполнить файл)
|
||||
|
||||
Входные значения:
HL - указатель на файловую спецификацию
B = 0 - загрузить и выполнить программу
C - 40h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0
|
||||
|
||||
41h (65) EXIT (Завершение программы)
|
||||
|
||||
Входные значения:
B - код завершения
C - 41h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0
|
||||
|
||||
42h (66) WAIT (Получить код завершения программы)
|
||||
|
||||
Входные значения:
C - 42h
|
||||
Выходные значения:
A - код завершения
|
||||
|
||||
HYPERLINK "" \l "toccmdline" Функции для работы со строками и командной строкой
|
||||
|
||||
43h (67) GSWITCH (Выделить параметр командной строки)
|
||||
|
||||
Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 43h
|
||||
Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль)
|
||||
|
||||
44h (68) DOSNAME (Преобразовать имя файла)
|
||||
|
||||
Входные значения:
C - 44h
B = 0, преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС
B = 1, преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - 11 символов имени файла
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
45h (69) EXCMDLN (Разбор командной строки)
|
||||
|
||||
Входные значения:
HL - указатель командной строки
DE - указатель на буфер пользователя
C - 45h
B - номер подфункции:
|
||||
0 - Разобрать строку;
1 - Выделить имя диска;
2 - Выделить директорию;
3 - Выделить имя файла;
4 - Выделить расширение файла;
5 - Выделить имя диска, путь к файлу, имя файла и расширение файла;
6 - Зарезервирована;
7 - Выделить параметр командной строки;
8 - Преобразовать из 11 символьного формата в формат ДОС;
9 - Преобразовать из формата ДОС в 11 символьный формат;
|
||||
|
||||
Подфункция 0 - Разобрать строку:
|
||||
|
||||
Входные значения:
HL - указатель командной строки
C - 45h
B = 0 - Разобрать строку
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
|
||||
|
||||
Подфункция 1 - Выделить имя диска:
|
||||
|
||||
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 1 - Выделить имя диска
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - номер диска (0 - A, 1 - B, 2 - C и т.д.), если CF=0
буфер - имя диска "A:",0
|
||||
|
||||
Подфункция 2 - Выделить директорию:
|
||||
|
||||
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 256 байт)
C - 45h
B = 2 - Выделить директорию
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - директория "DIR1\DIR2\DIR3\",0
|
||||
|
||||
Подфункция 3 - Выделить имя файла:
|
||||
|
||||
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 3 - Выделить имя файла
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - имя файла "FILE.EXT",0
|
||||
|
||||
Подфункция 4 - Выделить расширение файла:
|
||||
|
||||
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 4 байт)
C - 45h
B = 4 - Выделить расширение файла
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - расширение "TXT",0 или "C ",0
|
||||
|
||||
Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла:
|
||||
|
||||
Входные значения:
HL - указатель командной строки
DE - буфер (макс. 8 байт)
DE+0 адрес буфера для имени диска (макс. 13 байт)
DE+2 адрес буфера для директории (макс. 256 байт)
DE+3 адрес буфера для имени файла (макс. 13 байт)
DE+4 адрес буфера для расширения файла (макс. 4 байта)
C - 45h
B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
|
||||
|
||||
Подфункция 7 - Выделить параметр командной строки
|
||||
|
||||
Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 45h
B = 7 - Выделить параметр командной строки
|
||||
Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль)
|
||||
|
||||
Подфункция 8 - Преобразовать из 11 символьного формата в формат ДОС
|
||||
|
||||
Входные значения:
C - 45h
B = 8 - преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
Подфункция 9 - Преобразовать из формата ДОС в 11 символьный формат
|
||||
|
||||
Входные значения:
C - 45h
B = 9 - преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - буфер для 11 символов имени файла
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HYPERLINK "" \l "tocvar" Функции для работы с переменными
|
||||
|
||||
46h (70) ENVIRON (Системное окружение)
|
||||
|
||||
Входные значения:
B - номер подфункции
C - 46h
B=0 Получение системного окружения
HL - буфер
B=1 Получить переменную окружения
HL - имя переменной
DE - буфер для значения переменной
B=2 Установить/удалить переменную окружения
HL - имя переменной и значение, разделенные символом '=', (ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ)
|
||||
Выходные значения:
A - состояние, если CF=0
A=0 - переменная обнаружена
A=0FFh - переменная не обнаружена
DE - указывает на конец буфера
A - код ошибки, если CF=1
|
||||
|
||||
47h (71) APPINFO (Получение информации приложения)
|
||||
|
||||
Входные значения:
B - номер подфункции
C - 47h
HL - буфер данных
B=0 - получение параметров командной строки
B=1 - получение полного пути к каталогу программы
B=2 - получение полного пути и имени файла программы
|
||||
Выходные значения::
A - код ошибки, если CF=1
|
||||
|
||||
HYPERLINK "" \l "tocscreen" Функции работы с экраном
|
||||
|
||||
50h (80) SETVMOD (Выбор режима экрана)
|
||||
|
||||
Входные значения:
A - режим экрана
02h - текстовый 40x32x16 цветов
03h - текстовый 80x32x16 цветов
81h - графический 320x256x256 цветов
82h - графический 640x256x16 цветов
B - страница экрана 0/1
C - 50h
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
51h (81) GETVMOD (Получить текущий режим экрана)
|
||||
|
||||
Входные значения:
C - 51h
|
||||
Выходные значения:
A - код ошибки, если CF=1
A - текущий режим экрана, если CF=0
B - страница экрана 0/1
|
||||
|
||||
52h (82) LOCATE (Установить позицию курсора)
|
||||
|
||||
Входные значения:
D - строка курсора
E - столбец курсора
C - 52h
|
||||
Выходные значения:
нет
|
||||
|
||||
53h (83) CURSOR (Получить текущую позицию курсора)
|
||||
|
||||
Входные значения:
C - 53h
|
||||
Выходные значения:
D - строка курсора
E - столбец курсора
|
||||
|
||||
54h (84) SELPAGE (Выбрать активную страницу экрана)
|
||||
|
||||
Входные значения:
B - страница экрана 0/1
C - 54h
|
||||
Выходные значения:
A - код ошибки, если CF=1
|
||||
|
||||
55h (85) SCROLL (Прокрутка окна)
|
||||
|
||||
Входные значения:
D - строка левого верхнего угла окна
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B = 1 - прокрутка вверх
B = 2 - прокрутка вниз
A = 0 - очищать строку
C - 55h
|
||||
Выходные значения:
нет
|
||||
|
||||
56h (86) CLEAR (Очистка окна)
|
||||
|
||||
Входные значения:
D - строка левого верхнего угла окна
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - атрибут заполнитель
A - символ заполнитель
C - 56h
|
||||
Выходные значения:
нет
|
||||
|
||||
57h (87) RDCHAR (Считать символ с экрана)
|
||||
|
||||
Входные значения:
D - строка
E - столбец
C - 57h
|
||||
Выходные значения:
A - символ
B - атрибут
|
||||
|
||||
58h (88) WRCHAR (Напечатать символ на экране)
|
||||
|
||||
Входные значения:
D - строка
E - столбец
A - символ
B - атрибут
C - 58h
|
||||
Выходные значения:
нет
|
||||
|
||||
59h (89) WINCOPY (Запомнить окно экрана)
|
||||
|
||||
Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 59h
|
||||
Выходные значения:
нет
|
||||
|
||||
5Ah (90) WINREST (Восстановить окно экрана)
|
||||
|
||||
Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 5Ah
|
||||
Выходные значения:
нет
|
||||
|
||||
5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора)
|
||||
|
||||
Входные значения:
A - символ
C - 5Bh
|
||||
Выходные значения:
нет
|
||||
|
||||
5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора)
|
||||
|
||||
Входные значения:
HL - указатель на начало строки символов
C - 5Ch
|
||||
Выходные значения:
нет
|
||||
|
||||
HYPERLINK "" \l "tocprinter" Функции для печати на принтере
|
||||
|
||||
5Fh (95) PRINT (Вывод символа на принтер без ожидания)
|
||||
|
||||
Входные значения:
A - символ
C - 5Fh
|
||||
Выходные значения:
B - символ
CF = 1 - принтер не готов
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
Estex: Disk SubSystem (DSS) Programming Guide
|
||||
Table of Contents
|
||||
HYPERLINK "" \l "intro" 1. Introducing
HYPERLINK "" \l "identify" 2. Identification of system functions
HYPERLINK "" \l "diskfunc" 3. Disk devices functions
|
||||
|
||||
1. Introducing
|
||||
This document contains the list of functions and concepts of interaction with a disk subsystem.
DSS is a collection of very useful functions that reside in DSS itself, ready for use by any your programs. These functions are stored in library SYSTEM.DOS and allow management of files, memory allocation, loading and execution of the programs.
File specification
The file specification is a string, containing a names of disk, directories separated by a symbol "\" and name of file. The names of disk drive and directories can be discard.
for example:
C:\TEXT\DOC\text.doc
A:file.txt
\TEXT\info.txt
The DSS used chars with colon suffix as names of disk devices (A:, B:, C: etc.) The name of disk can be written down before filename for specified disk there it placed. For example: command DIR C:DATFILE searches for DATFILE in the current directory of disk C:.
When disk name not specified DSS used current disk. At start DSS, the current disk is a disk whence was loaded DSS.
The filenames consist of two parts. The first part contain 8 chars of file name. The second part is not necessary and contain 3 chars of file type (also known as extentsion). At the writing of filename, both parts are separated by char point.
For example: the names "NAME" and "NAME." is specified same file. In the name don't
allows symbols with codes less 32 and chars . " / \ [ ] : | < > + = ; ,
As the subdirectories files too, their names are formed by same way. The name of root directory always "\". And each subdirectories contain two items with names "." and "..". The name "." specified a current directory and name ".." specified name of parent(uplevel) directory.
Some console commands and DSS functions allow to use global symbols ? and * which can be used
for filename templates.
The symbol ? means that any one char of filename. The symbol * means that it char can be
replaced by any symbols.
For example:
*.txt - means, all files with type "txt"
a??.* - means, files which contain three or less symbols and first symbol is "a"
dc*.exe - means, files with type "exe" and began "dc"
File attributes
The each bit of byte attributes specified various attribute. And It can be changed by DSS function.
bit 0 - Read only
bit 1 - Hidden
bit 2 - System
bit 3 - Volume label
bit 4 - Directory
bit 5 - Archive
bit 6 - Reserved
bit 7 - Reserved
Attribute "read only". When value is 1, file can be read, but can't be written or deleted.
Attribute "hidden". When value is 1, DSS can't manipulate with this file.
Attribute "system". Specified system file.
Attribute "volume label". In old version of MSDOS used for specified volume laben, now it can be used for long filenames. And must be 0 for compatibles.
Attribute "directory". When value is 1, means that this file is directory.
Attribute "archive". This bite sets in 1 when DSS writing in this file. It can be used in backup utilities for detect changed files.
File handle
When any file are opened, DSS build File Control Block in DSS working areas.
The Handle (and assigned file) identified by number which returned DSS to program after file opening and used it in all further DSS calls. In other words, when file is opening, the program informsDSS his name and has taken back file handle. Which used in further file operations.
All necessary information for working with file are placed in DSS working areas.
|
||||
2. Identification of system functions
|
||||
00h (00) VERSION (Version of DSS)
input:
C - 00h
output:
D - version number
E - modification
The function return version number of DSS.
|
||||
3. Disk devices functions
|
||||
01h (01) CHDISK (Change current disk)
input:
A - disk number (0-A,1-B...)
C - 01h
output:
A - error code, if CF=1
A - number of disks, if CF=0
The function changes current disk device.
02h (02) CURDISK (Current disk number)
input:
C - 02h
output:
A - current disk number (0-A,1-B...)
The function returns number of current disk device.
03h (03) DSKINFO (Disk information)
input:
A - disk number (0-A,1-B...0FFh-current)
C - 03h
output:
A - error code, if CF=1
A - sectors per cluster, if CF=0
HL - clusters per disk
DE - free clusters
BC - bytes per sector
The function returns information about disk device (capacity and free space).
for example:
|
||||
LD C,03h ;Function DSKINFO
|
||||
LD A,0FFh ;Information about current disk
|
||||
RST 10h ;Execution of function
|
||||
LD A,D ;There is a free
|
||||
OR E ;space?
|
||||
JR Z,NO_SPACE ;No, the disk is completely filled
|
||||
09h (09) BOOTDSK (Number of boot disk)
input:
C - 09h
B = 0
output:
A - number of boot disk (0-A,1-B...)
The function returns number of boot disk device whence was loaded DSS.
|
||||
@@ -0,0 +1,69 @@
|
||||
Estex: Дисковая подсистема (DSS) – Обзор
|
||||
HYPERLINK "" \l "intro" Введение
|
||||
HYPERLINK "" \l "boot" Загрузка подсистемы
|
||||
HYPERLINK "" \l "console" Системная консоль
|
||||
HYPERLINK "" \l "fs" Файловая система
|
||||
1. Введение
|
||||
Estex - операционная система компьютера Sprinter, включающая в себя различные модули. Данный документ описывает модуль дисковой подсистемы.
В DSS используется та же самая файловая система, как и в MS-DOS FAT16 и полностью с ней совместима.
|
||||
2. Загрузка подсистемы
|
||||
После включения питания или сброса компьютера, BIOS считывает первичный загрузчик с 1-го сектора загрузочного диска.
Если загрузка происходит с HDD или дискеты, то сначала загрузочный сектор считывается в память и ему передается управление по загрузке модуля дисковой подсистемы SYSTEM.DOS.
Затем выполняются следующие действия:
|
||||
инициализация дисковой подсистемы и вывод сообщения "Starting DOS..."
|
||||
загрузка системной консоли SYSTEM.EXE
|
||||
выполнение команд указанных в файле SYSTEM.BAT
|
||||
Обычно файл SYSTEM.BAT содержит путь к программе файловой навигации пользователя или другому часто используемому приложения. Например "c:\fn\fn.exe".
Если во время загрузки вы хотите пропустить выполнение SYSTEM.BAT. То вам следует нажать клавишу "SHIFT", как только появиться сообщение "Starting DOS..." и удерживать пока не появится приглашение консоли ("C:\>").
|
||||
3. Системная консоль
|
||||
В DSS многие задачи могут быть выполнены через интерфейс командной строки называемой системной консолью. Основная задача консоли ввод команд и их исполнение. Также она имеет ряд функций, которые выполняют такие действия как управление файлами, перемещение по файловой структуре каталогов, редактирование командной строки и переменных среды.
Системная консоль позволяет пользователю взаимодействовать с операционной системой. Для DOS системная консоль это SYSTEM.EXE. Если вы видите на экране приглашение командной строки (A:\> или C:\>), то это означает что SYSTEM.EXE загружен и активизирован. Когда вы вводите командную строку, командный процессор интерпретирует команду и выполняет необходимые действия.
На сегодняшний день в консоли доступны следующие команды:
|
||||
CD
|
||||
Displays the name of or changes the current directory.
|
||||
CHDIR
|
||||
Displays the name of or changes the current directory.
|
||||
CLS
|
||||
Clears the screen.
|
||||
DATE
|
||||
Displays or sets the date.
|
||||
DEL
|
||||
Deletes one or more files.
|
||||
DIR
|
||||
Displays a list of files and subdirectories in a directory.
|
||||
ECHO
|
||||
Displays messages, or turns command echoing on or off.
|
||||
ERASE
|
||||
Deletes one or more files.
|
||||
EXIT
|
||||
Quits the SYSTEM.EXE program (command interpreter).
|
||||
HELP
|
||||
Provides Help information for console commands.
|
||||
MD
|
||||
Creates a directory.
|
||||
MKDIR
|
||||
Creates a directory.
|
||||
PAUSE
|
||||
Suspends processing of a batch file and displays a message.
|
||||
RD
|
||||
Removes a directory.
|
||||
REM
|
||||
Records comments (remarks) in batch files or SYSTEM.BAT.
|
||||
REN
|
||||
Renames a file or files.
|
||||
RENAME
|
||||
Renames a file or files.
|
||||
RMDIR
|
||||
Removes a directory.
|
||||
TIME
|
||||
Displays or sets the system time.
|
||||
VER
|
||||
Displays the System version.
|
||||
4. Файловая система
|
||||
Сейчас, в качестве файловой системы Estex использует FAT12 и FAT16. С помощью файловой системы FAT (File Allocation Table) организуются данный на винчестере и дискетах.
Для указания спецификации файла используется следующая форма:
[drive:][directory\]filename[.ext]
Файловая спецификация - это строка символов содержащая наименования диска, директорий отделенных символом "\" и имя файла. Имена диска и директории могут быть опущены, если требуемый файл расположен в текущей директории.
например:
|
||||
|
||||
C:\TEXT\DOC\text.doc
|
||||
|
||||
A:file.txt
|
||||
|
||||
\TEXT\info.txt
|
||||
В DSS в качестве имен дисковых устройств используются буквы с последующим символом двоеточия (A:, B:, C: и.т.д.) Имя диска может быть набрано перед именем файла для указания диска, на котором он расположен. Например: команда DIR C:TESTFILE ищет TESTFILE в текущей директории диска C:. Если имя диска не указанно используется текущий диск. После запуска DSS, текущим диском является диск, с которого была загружена DSS.
Имена файлов состоят из двух частей. Первая часть может содержать 8 букв, цифр или следующие специальные символы: $ % ' – _ @ { } ~ ` ! # ( ). Вторая часть не является обязательной и содержит любую комбинацию из трех букв, цифр или специальных символов с предшествующей точкой (.). Например имена "NAME" и "NAME." указывают на одинаковый файл. В имени файла не допускаются символы с кодом меньше 32, а также символы . " / \ [ ] : | < > + = ; ,
Поскольку директории также являются файлами их имена образуются по тем же правилам.
Имя корневой директории всегда "\". И каждая поддиректория содержит два элемента с именами "." and "..". Имя "." указывает на текущую директория, а имя ".." указывает на родительную (на уровень выше) директорию.
Некоторые команды и функции DSS позволяют использовать глобальные символы * и ? которые могут использоваться для задания шаблона имени файла.
Символ ? означает любой один символ в имени файла. Символ * означает, что он может быть заменен на любое количество любых символов.
for example:
|
||||
|
||||
*.txt - означает, все файлы с типом "txt"
|
||||
a??.* - означает, файлы содержащие три и менее символов и первый символ "a"
|
||||
dc*.exe - означает, файлы с типом "exe" и начинающиеся на "dc"
|
||||
В именах файлов не делается различий между заглавными и прописными символами.
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,38 @@
|
||||
Архитектура компьютера
|
||||
Основные понятия
|
||||
Персональный компьютер Sprinter является универсальным компьютером на базе 8 битного процессора Z80 (Z84C1516PSC) фирмы Zilog. Основой компьютера является перепрограммируемая логическая матрица (ППЛМ) EP1K30QC208-3 фирмы ALTERA.
|
||||
В настоящее время компьютер Sprinter использует плату Sp2000 в качестве материнской платы. Плата Sp2000 была разработана в конце 2000 года специально с возможностью обеспечения поддержки будущих моделей компьютера и имеет ряд конструктивных особенностей, использование которых нашло свое отражение в данном руководстве.
|
||||
Вначале поясним основные понятия, которые вам будут встречаться.
|
||||
Модель компьютера - набор конфигураций, зашитых в ПЗУ и определяющих возможности, доступные для пользователя. Современная модель компьютера Sprinter пока является единственной и носит тоже название.
|
||||
Конфигурация компьютера - реализация конкретной схемы в перепрограммируемой логической микросхеме (ППЛМ).
|
||||
Основная конфигурация - конфигурация активная сразу после включения компьютера и содержащая в себе наиболее важные и часто используемые режимы работы данной модели компьютера.
|
||||
Режим конфигурации - изменение характеристик работы компьютера в рамках конфигурации.
|
||||
Быстрое ОЗУ - дополнительное ОЗУ, в котором процессор может работать на высокой частоте без тактов ожидания (подразумевается турбо-режим процесора).
|
||||
Физический блок памяти - 16K блок основной памяти компьютера. Обозначается шестнадцатеричным числом -- #00..#FF
|
||||
Логический блок памяти - 16K блок спектрумовской схемы распределения памяти. Обозначается десятичным числом - 0..15
|
||||
Краткая характеристика компьютера Sprinter.
|
||||
Процессор Z84C15 (21MHz/3.5MHz)
|
||||
ОЗУ 4Mb
|
||||
Быстрое ОЗУ 64Kb
|
||||
ПЗУ 256Kb
|
||||
ВидеоОЗУ 256Kb (512Kb)
|
||||
Контроллер дисков Кp1818ВГ93 (аналог WD1793)
|
||||
Поддержка дисководов: 3,5" диск (1.44Mb/720Kb)
|
||||
5,25" диск (720Kb)
|
||||
Часы CMOS DALLAS
|
||||
Контpоллеp винчестеpа IDE/AT
|
||||
Контpоллеp клавиатуpы 101key/AT
|
||||
Контpоллеp мыши MS Mouse
|
||||
Два слота стандаpт ISA-8
|
||||
Аудио выход AY-3-8910 в ППЛМ, звуковой ЦАП (16 бит)
|
||||
Видео выход Аналоговый CGA монитоp, RGB, ТВ (SCART)
|
||||
Графические видеорежимы 320x256x256, 640x256x16, ZX стандарт Текстовые видеорежимы 80x32x16, 40х32х16
|
||||
|
||||
Техническая реализация.
|
||||
Ядром машины являются процессор Z84C15 и ППЛМ фирмы ALTERA - EP1K30QC208-3. Кроме них на плате присутствуют: микросхема ПЗУ, слот под 72-х-пиновый SIMM, видео ОЗУ, 64Kb Быстрого ОЗУ, схема контроллера дисковода на БИС КР1818ВГ93 (аналог WD1793), буферы для подключения джойстика, магнитофона, принтера, клавиатуры, дисководов, винчестера, мыши, буферные микросхемы шины ISA-8 и еще одна ППЛМ фирмы ALTERA -- EPM7064SLC100-10. Эта ППЛМ не меняет своей конфигурации и предназначена для обеспечения синхронизации и начального запуска компьютера. На плате так же предусмотрена возможность подключения CMOS часов - микросхемы DALLAS.
Кроме периферии и буферов имеются микросхемы дешифрации, входы которых подключаются к процессору через ППЛМ. Это позволяет легко менять адресацию устройств, без какого-либо изменения разводки печатной платы.
|
||||
Схема компьютера основана на большой перепрограммируемой логической микросхеме (ППЛМ). Подключение периферийных устройств через ППЛМ позволяет получить высокую гибкость машины по конфигурациям.
|
||||
Программирование (загрузка данных) ППЛМ осуществляется непосредственно в момент включения компьютера, а так же при перезагрузке, что позволяет кардинально менять схему в ППЛМ непосредственно во время работы. Это сильно выделяет архитектуру Sprinter-а из ряда существующих компьютеров, и многие понятия, присущие обычным машинам, меняют свой смысл. Фактически компьютер имеет гибкую архитектуру, в которой возможны изменения во многих частях схемы. Например, нельзя говорить о конкретных адресах портов подключения периферии, так как они могут быть изменены в одну секунду путем перепрограммирования ППЛМ и данных в ОЗУ, отвечающих за конфигурацию портов. Конкретные адреса появляются только в конкретных конфигурациях, например, в конфигурации ZX-Spectrum.
|
||||
Перепрограммируемость схемы дает большую свободу фантазии программиста по конфигурации машины. Задумывая конкретный проект, программист может определить в какой конфигурации его можно реализовать лучше, а, возможно, и придумать свою конфигурацию, которую затем можно реализовать в ППЛМ и включить перед запуском этой программы.
|
||||
INCLUDEPICTURE \d "http://www.petersplus.ru/sprinter/pix/fig1.gif" \* MERGEFORMATINET
|
||||
Рисунок SEQ Рисунок \* ARABIC 1. Функциональная схема
|
||||
Для упрощения схемы некоторые буферы и дешифраторы на схеме не указаны. Количество проводов в шинах так же условно.
|
||||
@@ -0,0 +1,97 @@
|
||||
Акселератор компьютера Sprinter.
|
||||
|
||||
Акселератор предназначен для ускорения операций по пересылке блоков данных в ОЗУ и видео-ОЗУ.
|
||||
|
||||
Акселератор позволяет:
|
||||
|
||||
- быстро заполнять горизонтальную или вертикальную линию длиной до 256 точек одним цветом (в режиме 640x256 - одинарную/двойную горизонтальную линию длиной до 512 точек)
|
||||
- быстро копировать горизонтальную или вертикальную линию длиной до 256 точек (в режиме 640x256 - горизонтальную линию до 512 точек)
|
||||
- проводить быстрые операции AND, OR, XOR с блоками памяти.
|
||||
|
||||
Акселератор не может работать с блоками данных ПЗУ и Быстрого-ОЗУ.
|
||||
|
||||
ОЗУ акселератора является частью внутреннего ОЗУ ППЛМ.
|
||||
Операции по пересылке данных производятся путем записи блока данных в это
|
||||
внутреннее ОЗУ, а затем копировании его в нужное место ОЗУ из ОЗУ акселератора.
|
||||
Блок данных, записываемый в ОЗУ акселератора может иметь различную
|
||||
длинну из диапазона 1..256 байт.
|
||||
|
||||
После одной записи копирование может производиться несколько раз и, таким
|
||||
образом, можно производить заполнение экрана текстурами.
|
||||
|
||||
Для заполнения экрана одним цветом используется другой режим
|
||||
акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ
|
||||
производится запись данных с шины процессора, которые в этот момент не
|
||||
изменяются.
|
||||
|
||||
Управление акселератором производится непосредственно из программы.
|
||||
Для этого изпользуются команды процессора, которые, фактически, являются
|
||||
операциями типа NOP.
|
||||
|
||||
LD B,B - выключить акселетарор.
|
||||
LD D,D - включить акселератор в режим приема байта размера блока
|
||||
далее следует команда типа LD A,dat, где dat и будет новым
|
||||
размером блока. Если размер блока был установлен ранее,
|
||||
его можно не устанавливать.
|
||||
LD C,C - Операция Fill - заполнение одним байтом. Последующая
|
||||
команда типа LD (HL),A приведет к заполнению указанного
|
||||
ранее количества байт значением A
|
||||
LD E,E - Операция Fill для графического экрана - заполнение
|
||||
вертикальных линий.
|
||||
LD H,H - rezerved
|
||||
LD L,L - копирование блока. Последующая команда типа LD A,(HL)
|
||||
приведет к заполнению ОЗУ акселератора данными из адреса (HL),
|
||||
а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ
|
||||
акселератора в ОЗУ или видео-ОЗУ.
|
||||
LD A,A - копирование блока для графического экрана подобна команде
|
||||
LD L,L, но работает с вертикальными линиями экрана.
|
||||
|
||||
Пример использования акселератора:
|
||||
|
||||
; Считаем, что экранная страница уже открыта по адресу #C000
|
||||
LD HL,#C040 ; адрес начала линии первого экрана
|
||||
LD DE,#C180 ; адрес начала линии второго экрана
|
||||
LD BC,#140 ; длина экрана по горизонтали
|
||||
DI ; запретить прерывания для работы с акселератором
|
||||
LD D,D ; включить акселератор на установку размера блока
|
||||
LD A,0 ; установить размер блока - 256 байт
|
||||
LD A,A ; установить акселератор на копирование
|
||||
; вертикальных линий.
|
||||
LDIR ; копировать
|
||||
LD B,B ; выключить акселератор
|
||||
EI ; включить прерывания
|
||||
|
||||
|
||||
|
||||
Эта часть программы произведет копирование всего содержимого первого экрана на другой.
|
||||
Время исполения составляет примерно 26 милисекунд.
|
||||
|
||||
Дополнительные функции акселератора (AND, OR, XOR) работают таким же образом.
|
||||
Для выполнения логических функций используются команды XOR (HL); OR (HL); AND (HL).
|
||||
|
||||
Пример кодирования блока в 256 байт.
|
||||
|
||||
LD HL,ADRES_1
|
||||
LD DE,XOR_DAT
|
||||
DI
|
||||
LD D,D
|
||||
LD A,0 ; число байт, которые надо закодировать
|
||||
LD L,L
|
||||
LD A,(DE) ; взять блок данных в ОЗУ акселератора
|
||||
XOR (HL) ; произвести операцию XOR с данными акселератора
|
||||
LD (HL),A ; запомнить в ОЗУ результат операции
|
||||
LD B,B
|
||||
EI
|
||||
|
||||
|
||||
Скорость работы акселератора ограничивается только физической
|
||||
скоростью работы основного ОЗУ. Определить примерное время работы команды с
|
||||
акселератором можно по такой формуле:
|
||||
|
||||
Время работы = время работы команды без акселератора + время работы
|
||||
акселератора
|
||||
|
||||
Время работы акселератора = число пересылаемых байт /7 микросекунд
|
||||
|
||||
Во время работы акселератора необходимо отключать прерывания, так как в этот момент
|
||||
изменяется система команд процессора и программа на прерывании не сможет работать корректно.
|
||||
@@ -0,0 +1,244 @@
|
||||
Функции BIOS v2.12
|
||||
Вызов функций BIOS осуществляется из ассемблерного кода.
Номер функции задается в регистре C процессора. В остальные регистры, при необходимости, загружаются входные параметры функции. После исполнения функции происходит возврат в программу, из которой произошел вызов функции. Установленный флаг CF (CF=1) означает, что работа функции произошла с ошибкой. В некоторых регистрах передаются выходные параметры.
Ниже приведены таблицы входных и выходных параметров для каждой функции:
|
||||
HYPERLINK "" \l "t01" Функции работы с памятью
|
||||
HYPERLINK "" \l "t04" Функции управления 'железом'
|
||||
HYPERLINK "" \l "t06" Функции управления окнами и режимами экрана
|
||||
HYPERLINK "" \l "t07" Функции вывода текста на экран
|
||||
HYPERLINK "" \l "t08" Графические функции
|
||||
HYPERLINK "" \l "t11" Функции работы с жесткими дисками и дисководами
|
||||
При работе функций 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 Получение адресов портов окон
HYPERLINK "" \l "02" примечание по использованию
|
||||
Значение регистров на входе:
C=0C6h
A - номер окна процессора - 0,1,2 или 3
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
C - 8-битный адрес порта окна
B - физический номер подключенной в окно страницы
CF=1 - ошибка - неверный номер окна
|
||||
0C7h (199) EMM_FN7 Получить номер следующей страницы блока
HYPERLINK "" \l "03" примечание по использованию
|
||||
Значение регистров на входе:
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 - версия железа HYPERLINK "" \l "04" подробности ниже
A - количество полей в буфере (в данный момент - 2)
Первое поле - версия BIOS.
Второе - название модели компьютера.
CF=1 - ошибка - Очень старая версия,
не имеющая данной функции
|
||||
0F2h (242) FN_SICF=0 Установка синхронизации, очистка страницы режима экрана
|
||||
Значение регистров на входе:
C=0F2h
A - режим синхронизации
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - неверный номер режима синхронизации
|
||||
0F5h (245) CMOS_TEST Проверить наличие CMOS
HYPERLINK "" \l "08" комментарий
|
||||
Значение регистров на входе:
C=0F5h
|
||||
Значение регистров на выходе:
CF=0 - часы есть
CF=1 - часов нет
|
||||
0F6h (246) CMOS_RD Читать из регистра CMOS
HYPERLINK "" \l "08" комментарий
|
||||
Значение регистров на входе:
C=0F6h
D - номер регистра CMOS
|
||||
Значение регистров на выходе:
A - считанные данные
CF=0 - часы есть
CF=1 - часов нет
|
||||
0F7h (247) CMOS_WR Писать в регистр CMOS
HYPERLINK "" \l "08" комментарий
|
||||
Значение регистров на входе:
C=0F7h
D - номер регистра CMOS
A - записываемые данные
|
||||
Значение регистров на выходе:
CF=0 - часы есть
CF=1 - часов нет
|
||||
08Fh (143) FN_TURBO Функция управления турбо режимом.
HYPERLINK "" \l "09" комментарий
|
||||
Значение регистров на входе:
C=08Fh
A - режим турбо: 2 - off, 3 - on
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - неверный режим турбо
|
||||
Функции управления окнами и режимами экрана
|
||||
0B0h (176) WIN_OPEN Функция открытия окна.
|
||||
Значение регистров на входе:
C=0B0h
IX - HYPERLINK "" \l "10" описатель окна
E - флаги окна:
бит 0 указывает какую страницу режима включать после исполнения функции;
бит 4 указывает на какой странице режима открывать окно Значение регистров на выходе:
CF=0 - нормальное завершение:
A - HYPERLINK "" \l "17" идентификатор окна
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 - HYPERLINK "" \l "17" идентификатор глобального окна
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 - HYPERLINK "" \l "17" идентификатор глобального окна
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 - HYPERLINK "" \l "17" идентификатор глобального окна
H - размер HYPERLINK "" \l "15" локального окна по вертикали в символах
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 положение HYPERLINK "" \l "15" локального окна
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 положение HYPERLINK "" \l "15" локального окна
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 - HYPERLINK "" \l "18" данные палитры
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 - номер и HYPERLINK "" \l "22" тип устройства
бит 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 - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
HL:IX - номер сектора (IX - младшая часть номера сектора)
B - количество проверяемых секторов
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - проверка с ошибкой
|
||||
55h (85) DRV_READ Чтение с устройства
|
||||
Значение регистров на входе:
C=55h
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
HL:IX - номер сектора (IX - младшая часть номера сектора)
B - количество секторов
DE - адрес буфера для данных
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - ошибка чтения
HL:IX - номер сектора + кол-во прочитанных секторов
DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора)
|
||||
56h (86) DRV_WRITE Запись на устройства
|
||||
Значение регистров на входе:
C=56h
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
HL:IX - номер сектора (IX - младшая часть номера сектора)
B - количество секторов
DE - адрес буфера данных для записи
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
CF=1 - ошибка записи
HL:IX - номер сектора + кол-во прочитанных секторов
DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора)
|
||||
57h (87) DRV_DETECT Определение параметров устройства
|
||||
Значение регистров на входе:
C=57h
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
A - bit7=0 диск 720Кb
Bit7=1 диск 1.44Mb
CF=1 - нет устройства или нет носителя
|
||||
58h (88) DRV_GET_PAR Получить параметры носителя
|
||||
Значение регистров на входе:
C=58h
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
|
||||
Значение регистров на выходе:
CF=0 - нормальное завершение
L - число секторов
H - число головок
DE - количество цилиндров
если HL=DE=0FFFFh - устройства нет
IX - размер сектора в байтах
B - доп. параметры для дискет:
бит7 - тип 1.44/720
CF=1 - нет устройства
|
||||
59h (89) DRV_SET_PAR Установить параметры носителя
|
||||
Значение регистров на входе:
A - номер и HYPERLINK "" \l "22" тип устройства (см. выше)
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 в байте HYPERLINK "" \l "19" режима знакоместа
Страницы 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,72 @@
|
||||
Глюки и недостатки ДОС (Биоса)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Дата последнего редактирования: 27.09.2004
|
||||
|
||||
|
||||
|
||||
1. Функция "Сохранить текущий путь" (1Eh) имеет недостаток:
|
||||
а) При сохранении корневого пути запоминает символ "\".
|
||||
б) Но в то же время, при сохранении не корневого пути,
|
||||
не ставит в конце строки символ "\".
|
||||
У MS-DOS такой же глюк, но это не меняет "погоду" ;). Нужно привести
|
||||
к какому-то одному формату.
|
||||
|
||||
2. Функция "Закрыть файл" (12h) не закрывает файл, если он расположен
|
||||
(был открыт/создан) не в тек. пути. Приходится принудительно устанав-
|
||||
ливать диск и путь расположения закрываемого файла и только после этого
|
||||
его закрывать ;(. Это происходит из-за того, что DSS текущей реализации
|
||||
позволяет коppектно pаботать только в пpеделах одного диска. Т.е. пеpед
|
||||
закpытием файла, текущим диском должен быть тот, где этот файл находится.
|
||||
Важное замечание: Доработать DSS, чтобы система, в определенных случаях,
|
||||
не трапалась при переполнении макс. числа (9) открытых дескрипторов.
|
||||
|
||||
3. Функция "Удалить файл" (0Eh) имеет недостаток:
|
||||
Удаляет файл в тек. каталоге, при формате записи "prog.bin", но не уда-
|
||||
ляет файл, указанный с диском и путем расположения, например:
|
||||
"a:\test\prog.bin".
|
||||
|
||||
4. Функции опроса клавиатуры (30h,31h,..) не выдают признак (7,6 биты
|
||||
регистра "B") нажатия "Shift" для клавиш "Home","End","PgUp","PgDn" и
|
||||
клавиш управления курсором. У спец. клавиш, признак нажатия "Shift"
|
||||
(биты 7,6) выдается только для F1..F12.
|
||||
|
||||
5. Не происходит скроллинг экрана, когда идет "переполнение" последней 32-й
|
||||
строки и 80-й символ - не код завершения строки. Происходит просто пере-
|
||||
ход в начало первой строки экрана, с продолжением вывода строки (с нало-
|
||||
жением на старые данные экрана).
|
||||
|
||||
6. Estex не корректно работает с VFAT (которая фактически и используется в
|
||||
Виндах). Трабл в следующем. Если в имени файла присутствует хотя бы одна
|
||||
строчная (маленькая) буква, то для такого имени Винда создает в каталоге
|
||||
две записи: первая для длинного имени, вторая - имя формата 8.3. Т.е. на
|
||||
одно имя файла в каталоге имеется две записи. Если файл с таким именем
|
||||
удалить в Estex, то будет удалено (помечено удаленным) только вторая за-
|
||||
пись файла, имеющая формат 8.3, а первая запись останется не удаленной.
|
||||
p.s. Эта ошибка легко исправляется нортоновским "ndd" или др. утилитой
|
||||
проверки логич. структуры диска.
|
||||
Если имя файла состоит только из одних прописных (больших) букв, то Винда
|
||||
создает в каталоге лишь одну запись для имени файла (как MS-DOS до v6.22
|
||||
включительно). Такой файл корректно удаляется Estex.
|
||||
Вывод: Для корректного удаления файлов под ОС Спринтера, их имена должны
|
||||
содержать только прописные буквы.
|
||||
|
||||
7. При включенном в Биосе пункте "System Disk: 1-st FDD" и при отсутствии
|
||||
дискеты в дисководе, в некоторых случаях не сбрасывается обращение к дис-
|
||||
ководу.
|
||||
|
||||
8. Нет биосной функции "54h" (DRV_VERIFY) верификации секторов, описанной в
|
||||
документации. Поэтому она всегда возвращает установленный флаг "Carry".
|
||||
|
||||
9. Доработать функцию "32h" (DSS_ECHOKEY), чтобы нормально мигал курсор.
|
||||
|
||||
10. Функции ДОС 0Ah (Create) и 0Bh (Create new file) перед созданием файла
|
||||
не проверяют число уже открытых дескрипторов. При переполнении числа
|
||||
открытых дескрипторов, эти функции все-равно создают запись нового файла
|
||||
в каталоге, хотя и выдают признак ошибки.
|
||||
Эти функции также не отслеживают имя файла на недопустимые символы. Если
|
||||
имя файла содержит недопустимый символ - функции просто "зависают".
|
||||
Такая ситуация с именами файлов может возникнуть например при автомати-
|
||||
ческом создании имен.
|
||||
|
||||
11. ДОС (v1.6) корректно выводит максимум 509 записей каталога.
|
||||
Reference in New Issue
Block a user