Files
Sprinter-SDCC/docs/converted/IvanMak.txt
T
snark13 c71e249a4e 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>
2026-06-03 16:13:21 +03:00

2515 lines
204 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
===== PAGE 1 =====
Sprinter
Руководство по программированию Sp2000
Ivan Mak
15 августа 2003 г.
Содержание
I Введение 4
1 Архитектура компьютера 4
1.1 Краткие данные платы Sp2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Техническая реализация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Возможности машины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Загрузка конфигураций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Краткое описание конфигураций 6
2.1 Конфигурация Sprinter-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Конфигурация Sprinter-2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Конфигурация ZX-Spectrum+AY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Конфигурация Game-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5 Kонфигурация DooM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.6 Конфигурация Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.7 Особенности платы Sp2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
II Блоки конфигураций компьютера 7
3 Основная Память 7
3.1 Страницы, распределение памяти . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 Видео-область, спектрумовский и графический режим адресации . . . . . . . . . . . . . . . . . 9
4 Видео-память 9
4.1 Спектрумовский режим адресации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2 Графический режим адресации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.3 Подрежимы вывода графической адресации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.4 Распределение Video-RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.5 Структура экрана, режимы экрана . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.6 Спектрумовский режим, он же текстовый . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.7 Графический режим . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.8 Палитра . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.9 Процесс вывода на экран . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1
===== PAGE 2 =====
СОДЕРЖАНИЕ 2
5 Звуковой выход 16
5.1 AY-3-8910 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.2 Бипер/Covox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.3 COVOX-Blaster (CBL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.4 Sprinter-Sound-Card (SSC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6 Акселератор операций с ОЗУ 19
7 КЭШ-ОЗУ 21
7.1 Загрузка новых прошивок в ПЛМ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
8 ISA, порт A20 21
9 Внутренние порты Z84C15 21
9.1 Мышь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
9.2 Принтер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
9.3 Прерывания от ISA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
9.4 AT-Клавиатура . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
9.5 Таймеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
10 Контроллер FDD 26
10.1 720/1.44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
11 Контроллер HDD 26
12 CMOS 27
12.1 Описание регистров CMOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
13 Дешифрация ПЗУ/КЭШ/Контроллеры/и т.п. 27
13.1 Схема распределения портов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
13.2 Конкретные адреса портов, используемые в Sprinter-е . . . . . . . . . . . . . . . . . . . . . . . . 31
14 Сброс. 32
14.1 Старт машины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
14.2 Доступ к HDD через память. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
III Прошивки ПЛМ 32
15 Sprinter-1 33
15.1 Режимы Spectrum-128/Scorpion-256/Pentagon-512 . . . . . . . . . . . . . . . . . . . . . . . . . . 33
15.2 Доступ к функциям биоса и портам. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
16 Sprinter-2 33
16.1 Акселератор, блочные операции AND, OR, XOR . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
17 Game-1 33
17.1 Акселератор + Covox-Blaster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
18 Doom 33
18.1 Акселератор с растяжением линий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
19 Video 33
19.1 Режим экрана 160x128 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
IV Программирование с использованием функций БИОС-а. 33
===== PAGE 3 =====
СОДЕРЖАНИЕ 3
20 Функции биоса 34
20.1 Работа с памятью . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
20.2 Работа с блоками как с RAM-Disk-ами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
20.3 Управление назначением на дисководы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
20.4 Функции управления железом и определение версии . . . . . . . . . . . . . . . . . . . . . . . . 38
20.5 Функции печати и управления режимом экрана . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
20.6 Графические функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
20.7 Работа с винчестером и дисками MS-DOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
21 Дополнительные сведения по программированию 51
21.1 Вывод на графический экран . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
21.2 Особые режимы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
21.3 Вывод палитр . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
V Программирование в TR-DOS (дополнительные команды) 52
22 Работа с HDD и RAM-Disk через TR-DOS 52
22.1 /HDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
22.2 /HDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
22.3 /CAT, /DIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
22.4 /LOAD, /SAVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
22.5 /FDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
22.6 /RMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
22.7 /CLEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
22.8 Команды переключения конфигураций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
22.9 Дополнительные сервисные команды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
23 Дополнения TR-DOS 5.04Em 54
24 Копирование файлов с TR-DOS дискет в RAM-Disk 55
25 Сохранение содержимого RAM-Disk на винчестере 56
VI Программирование в Sprinter-DOS 56
===== PAGE 4 =====
4
Часть I
Введение
Данное описание предполагает наличие определенных знаний читателя, а именно знание архитектуры
компьютера ZX-Spectrum и их разновидностей, в частности Pentagon-128 и Scorpion-256, а так же знание
языка BASIC и некоторое знакомство с языком ассемблера Z80. В описании почти не приводятся сведения,
относящиеся к программированию на стандартном ZX-Spectrum. Подразумевается, что эти описания уже
имеются или читатель достаточно хорошо знаком с компьютером ZX-Spectrum, что бы знать основные
данные, необходимые для понимания излагаемой информации.
Большая часть описания относится к стандартной конфигурации компьютера Sprinter. Там же, где раз-
говор пойдет об иных конфигурациях, я буду это указывать.
1 Архитектура компьютера
Я буду называть конфигурацией машины – конкретную реализацию конкретной схемы в перепрограм-
мируемой логической микросхеме (ППЛМ). Это означает, что машина имеет множество конфигураций,
каждая из которых имеет свою схему.
Я так же использую понятие КЭШ-ОЗУ. Это не КЭШ в формальном смысле, а быстрое ОЗУ, в котором
процессор может работать на высокой частоте без тактов ожидания. КЭШ-ем это ОЗУ называется только
по традиции, подобно КЭШ-у на КР537РУ10 в компьютерах Pentagon-128.
1.1 Краткие данные платы Sp2000
Пpоцессоp . . . . . . . . . . . Z84C15 Контpоллеp винчестеpа . . . . . IDE/AT
Тактовая частота . . . . 21MHz/3.5MHz Контpоллеp клавиатуpы . . . 101key/AT
ОЗУ . . . . . . . . . . от 4Mb до 64Mb Контpоллеp мыши . . . . . . . MS-Mouse
КЭШ ОЗУ . . . . . . . . . . . . . 64Kb Два слота . . . . . . . стандаpт ISA-8
ПЗУ . . . . . . . . . . . . . . .256Kb Аналог AY-3-8910 в ПЛМ . . stereo-OUT
Видео-ОЗУ . . . . . . . . 256Kb(512Kb) COVOX . . . . . . . . . . stereo-16bit
Контpоллеp дисков . . . . . Кp1818ВГ93 Выход видео на TV или CGA монитоp, RGB
Поддеpжка 1.44Mb фоpмата . . 3.5"диска Видео-pежимы: . . . Spectrum standart
CMOS-часы . . . . . . . . . . . DALLAS GRAF 320x256x256,640x256x16, TXT 80x32
1.2 Техническая реализация
Ядром машины являются процессор Z84C15 и ППЛМ фирмы ALTERA - EP1K30QC208-3. Кроме них
на плате присутствуют микросхемa ПЗУ, слот под 72х-пиновый SIMM на 4-64Mb, 256Kb видео-ОЗУ, 64Kb
КЭШ-ОЗУ, схема контроллера дисковода на БИС КР1818ВГ93, буферы для подключения джойстика, маг-
нитофона, принтера, клавиатуры, дисководов, винчестера, мыши, буферные микросхемы шины ISA-8 и еще
одна ППЛМ фирмы ALTERA EPM7064SLC100. Эта ППЛМ не меняет своей конфигурации и предназна-
чена для обеспечения синхронизации и начального запуска компьютера. На плате так же предусмотрена
возможность подключения CMOS часов – микросхемы DALLAS. Кроме периферии и буферов имеются
микросхемы дешифрации, входы которых подключаются к процессору через ППЛМ. Это позволяет легко
менять адресацию устройств без какого либо изменения разводки печатной платы.
1.3 Возможности машины
Схема компьютеpа основана на большой пеpепpогpаммиpуемой логической микpосхеме. Подключение
периферийных устройств через ППЛМ позволяет получить высокую гибкость машины по конфигурациям.
Пpогpаммиpование ППЛМ осуществляется непосpедственно в момент включения, а так же пpи пеpеза-
гpузке, что позволяет каpдинально менять схему в ППЛМ непосpедственно во вpемя pаботы. Это сильно
===== PAGE 5 =====
1 АРХИТЕКТУРА КОМПЬЮТЕРА 5
выделяет архитектуру Sprinter-а из ряда существующих компьютеров, и многие понятия, присущие обыч-
ным машинам, меняют свой смысл. Фактически компьютер имеет гибкую архитектуру, в которой возможны
изменения во многих частях схемы. Например, нельзя говорить о конкретных адресах портов подключе-
ния периферии, так как они могут быть изменены в одну секунду путем перепрограммирования ППЛМ и
данных в ОЗУ, отвечающих за конфигурацию портов. Конкретные адреса появляются только в конкретных
конфигурациях, например, в конфигурации ZX-Spectrum.
Перепрограммируемость схемы дает большую свободу фантазии программиста по конфигурации маши-
ны. Задумывая конкретную работу программист может определить в какой конфигурации ее можно сделать
лучше, а, возможно, и придумать свою конфигурацию, которую затем можно реализовать в ППЛМ и вклю-
чить перед запуском этой программы.
Блок-схема компьютера Sprinter:
Для простоты некоторые буферы и дешифраторы на схеме не указаны. Количество проводов в шинах
так же условны.
Дальнейшее описание архитектуры является описанием конкретных конфигураций и их частей. Но перед
этим следует сказать несколько слов о переключении конфигураций.
1.4 Загрузка конфигураций
В момент включения компьютера, а так же после нажатия на RESET вся информация, находившаяся
в ППЛМ отвечающая за конкретную конфигурацию, стирается. ППЛМ переходит в режим ожидания
загрузки блока данных схемы.
В этот момент процессор полностью отключен от какой либо периферии. В его адресное пространство
памяти оказывается включено только ПЗУ и возможно подключение КЭШ ОЗУ. Любая запись в адресное
пространство памяти процессора в этот момент приводит к записи данных в ППЛМ и программа в подклю-
ченной странице ПЗУ имеет только одну единственную цель – загрузить в ППЛМ данные конфигурации.
В этой же странице ПЗУ находятся данные начальной конфигурации. Программа загрузки конфигурации
проверяет флаг в КЭШ-памяти и, если он установлен, загружает в ППЛМ данные из КЭШ, если сброшен,
то данные из ПЗУ. На этом основано переконфигурирование схемы компьютера.
===== PAGE 6 =====
2 КРАТКОЕ ОПИСАНИЕ КОНФИГУРАЦИЙ 6
Для изменения схемы используется функция BIOS, которая загружает в КЭШ-память блок данных
конфигурации выставляет флаг, которым является текстовая строка «ACEX_30K_LOADING», после чего
производится полный сброс, который осуществляется программно записью в специальную страницу памяти
RESET_PAGE. Программа в ПЗУ, запускаемая по сбросу находит флаг «ACEX_30K_LOADING» и начинает
загрузку данных в ППЛМ. Oдновременно она затирает флаг, что предотвращает повторную загрузку новой
конфигурации при нажатии на кнопку RESET и позволяет вернуться после «ручного» сброса в начальную
конфигурацию. Затирание флага так же избавляет от мучений в случае подключения неправильной кон-
фигурации во время экспериментов с программами. Нажатие на RESET всегда вернет схему в начальную
конфигурацию.
Примечание: Внутренняя информация блока данных ППЛМ является закрытой информацией фирмы
ALTERA. Кроме самих микросхем ППЛМ ALTERA поставляет и программное обеспечение для разводки
схем внутри ППЛМ. К сожалению, эта программа не может работать на компьютере типа ZX-Spectrum
и в ближайшем обозримом будущем не предвидится ее версия для Sprinter-а. Поэтому разработка но-
вых конфигураций может производится только при наличии достаточно мощной машины (все делалось на
Pentium-166) и программы разводки схем в ППЛМ – MAX-Plus II.
В связи с этим, в данный момент Sprinter имеет несколько конкретных конфигураций, три из которых
(Sprinter-2, Sprinter-1, ZX-Spectrum+AY) записаны в ПЗУ, а остальные могут быть подгружены с дискеты
или винчестера. Постоянно ведется совершенствование конкретных конфигураций и разработка новых. В
плате Sp2000 эти конфигурации объединены в одной прошивке ППЛМ.
2 Краткое описание конфигураций
В этом параграфе дано краткое описание конфигураций компьютера Sprinter-97. Более полное описание с
примерами программирования будет дано в части III. Для платы Sp2000 так же имеются эти конфигурации,
поэтому описание приводится без изменений.
2.1 Конфигурация Sprinter-1
Включает в себя конфигурацию Spectrum-128/256, распределение памяти до 4Mb, расширенный экран
с режимами Spectrum, Text-80x32, Graf-320x256x256, контроллер дисковода, контроллер IDE винчестера,
контроллер клавиатуры AT, подключенной как ZX-Keyboard, 8-bit COVOX.
Эта конфигурация приближена к конфигурации ZX-Spectrum и позволяет работать на обычных спек-
трумовских программах и постепенно менять их под расширенные режимы экрана и памяти, а так же для
работы с новыми устройствами.
2.2 Конфигурация Sprinter-2
Включает в себя конфигурацию Spectrum-128/256, распределение памяти до 4Mb, расширенный экран
с режимами Spectrum, Text-80x32, Graf-320x256x256, контроллер дисковода, контроллер IDE винчестера,
контроллер клавиатуры AT (построенный на внутреннем последовательном порте процессора), Accelerator,
COVOX.
Конфигурация, как и Sprinter-1 приближена к спектрумовской, но имеет более жесткие требования к
программам по совместимости. Позволяет использовать акселератор операций с основным и видео-ОЗУ.
Акселератор ускоряет операции пересылки блоков данных и заполнения ОЗУ одним байтом до физического
предела скорости основного ОЗУ. В последней версии он так же позволяет ускорить логическую обработку
блоков данных по функциям AND, OR, XOR.
2.3 Конфигурация ZX-Spectrum+AY
Эта конфигурация максимально приближена к ZX-Spectrum-128/256 и включает в себя схему музыкаль-
ного сопроцессора AY-3-8910. В этой конфигурации отсутствуют расширенные режимы экрана.
Третья версия схемы AY в соответствии с реальным сопроцессором включает в себя три генератора
голосов, генератор шума и регуляторы амплитуды, генератор огибающей.
===== PAGE 7 =====
7
На данный момент в схеме формирователя огибающей обнаружена небольшая ошибка. В следующей
версии AY предполагается данный недостаток исключить.
2.4 Конфигурация Game-1
Похожа на конфигурацию Sprinter-2. Акселератор не имеет логических функций. Для вывода звука
имеет COVOX-Blaster (15KHz), позволяющим выводить звук поблочно и освобождать процессорное время
для другой работы. Конфигурация ориентирована на использование в играх для Sprinter-а.
2.5 Kонфигурация DooM
Является дальнейшим развитием конфигурации Game-1. Акселератор имеет дополнительную функцию
по аппаратному растяжению/сжатию вертикальных и горизонтальных линий.
2.6 Конфигурация Video
Конфигурация Video похожа на Game-1, но имеет дополнительную возможность по передачи данных с
HDD прямо в видео-память в момент чтения из HDD. В последней версии добавлен режимGR − 256 − 4x4,
позволяющий выводить видео-ролики с разрешением 160x128 на весь экран (аппаратное удвоение размера
пикселя).
2.7 Особенности платы Sp2000
В плате Sp2000 описанные выше конфигурации сведены в две прошивки. Первая содержит Sprinter-1,
Sprinter-2 и ZX-Spectrum+AY. Переключение между Sprinter-1 и Sprinter-2 осуществляется через системный
порт, а ZX-Spectrum+AY фактически совпадает с конфигурацией Sprinter-1. Схема музыкального сопроцес-
сора присутствует и доступна, как в Sprinter-1, так и в Sprinter-2.
Конфигурации Game-1, DooM, Video, так же будут сведены в одну прошивку и будут переключаться
через системный порт.
Часть II
Блоки конфигураций компьютера
В этой части описываются блоки конфигураций. В каждой конфигурации возможно использование тех
или иных блоков. О том, какие блоки в каких конфигурациях используются, будет сказано ниже.
3 Основная Память
3.1 Страницы, распределение памяти
Здесь так же приведено описание схемы распределения памяти Sprinter-97. (Для Sp2000 в данный
момент она такая же.)
Структура схемы распределения основной памяти Спринтера является двухуровневой.
Основная память компьютера – 4Mb – разделена на блоки по 16kb, задаваемые однобайтовым номе-
ром. Эти блоки подключаются к логическим блокам Спектрумовской схемы распределения памяти. Что
бы не путать понятия я буду называть блоки основной памяти физическими и писать их номера шестна-
дцатеричными цифрами – #00..#FF. Блоки спектрумовской схемы распределения памяти я буду называть
логическими блоками и писать их номера в десятичной системе – 0..15.
Адресное пространство процессора Z80 разделено на 4 окна с адресами #0000..#3FFF, #4000..#7FFF,
#8000..#BFFF и #C000..#FFFF, которые для краткости я буду называть окнами с номерами 0, 1, 2 и 3. В
каждом окне процессора располагается логический блок памяти согласно Спектрумовскому распределению.
В окно 0 подключено ПЗУ, в окно 1 – страница 5, в окно 2 – страница 2, в окно 3 любая из страниц 0..7
===== PAGE 8 =====
3 ОСНОВНАЯ ПАМЯТЬ 8
для режима Spectrum-128, 0..15 для режима Scorpion-256 и 0..31 для режима Pentagon-512. Кроме этого, в
режиме Scorpion-256 вместо ПЗУ может быть подключена логическая страница с номером 0.
Каждый логический блок имеет свой собственный физический номер подключаемой в него страницы
ОЗУ. Логические страницы с номерами 0, 2 и 5 имеют дублированные номера, один для жесткого подклю-
чения в окна 0, 1, 2 процессора, второй для подключения в окно 3. В режиме Спектрума номера физических
страниц, выставленные в этих блоках, совпадают.
Аналогичным образом на 16kb блоки разделено ПЗУ и КЭШ-ОЗУ. Физический номер страницы ПЗУ
имеет значения #E0..#EF, а КЭШ #F0..#FF. Реально на данный момент для адресации КЭШ ОЗУ
используются только 2..1 биты из этого номера.
Каждая страница ПЗУ или ОЗУ имеет свой порт, в котором указывается физический номер страницы.
Всего таких портов страниц памяти 32 (в режиме Pentagon-512 добавляются еще 16 портов). 16 портов
отвечают за номера страниц ОЗУ, подключаемые в третье окно процессора. Еще три порта отвечают за
подключение страниц ОЗУ в окна 0..2 Восемь портов используются для подключения различных страниц
ПЗУ. Один порт – для подключения страницы КЭШ-а вместо ПЗУ. И один порт – это порт системной
страницы, подключаемой на место ПЗУ сразу после сброса машины по клавишам Ctrl+Alt+Del.
Оставшиеся 3 порта страниц памяти остаются на данный момент в резерве. Схема распределения памяти
позволяет подключить в адресное пространство процессора не только ОЗУ или ПЗУ, но и порты и память
ISA карт, вставляемых в слот.
При подключении в адреса #C000..#FFFF скорпионовских расширенных страниц ОЗУ, на их место
можно переадресовать слоты. Для этого надо просто записать в порт одной из этих страниц значение,
соответствующее ISA-слоту, к которому необходимо произвести обращение. Это значение так же указывает
===== PAGE 9 =====
4 ВИДЕО-ПАМЯТЬ 9
к чему ведется обращение, к портам или памяти слота (конкретные номера будут расписаны ниже).
В некоторых конфигурациях схема распределения памяти упрощается для освобождения ресурсов
ППЛМ. Могут отсутствовать порты #1FFD и #7FFD, а так же упрощается схема работы с устройствами,
отображаемыми на память.
3.2 Видео-область, спектрумовский и графический режим адресации
Запись в видео-ОЗУ может осуществляться двумя способами – через два режима адресации видеопа-
мяти. Это графический и спектрумовский режимы адресации. Графический режим адресации кроме вывода
графики используется и для вывода на текстовый экран. Спектрумовский режим используется для вывода
в режиме Спектрума, а так же для задания знакогенераторов.
Видео-область основного ОЗУ и видео-ОЗУ – суть две различных области памяти. О видео-ОЗУ будет
сказано ниже, а сейчас речь о видео-области основной памяти.
Графическая видео-область в основной памяти составляет 256Kb ОЗУ и соответствует страницам
#50..#5F. При подключении этих страниц в любое окно процессора и при обращении к адресам этого
окна мультиплексор адреса переключается в режим графической адресации. В этом режиме биты 3..0 но-
мера страницы не влияют на адрес памяти, а определяют особый режим вывода, о котором будет сказано
ниже. Адрес памяти в графическом режиме задается номером, засылаемым в RGADR (он же PORT_Y),
о котором так же будет сказано ниже, и десятью младшими битами адреса процессора. В графической
видео-области содержится копия видеоданных, посылаемых на экран в графическом режиме (как будет
ясно далее, копия не точная).
В спектрумовском режиме адресации видео-область основного ОЗУ располагается в адресах
#4000..#5FFF и #C000..#DFFF для спектрумовских страниц 5 и 7. Любая физическая страница основно-
го ОЗУ (кроме #50..#5F) подключенная к этим областям памяти процессора может стать видео-областью.
В этом режиме нет привязки страницы основного ОЗУ к странице видео-ОЗУ. Последняя определяется
через RGADR.
4 Видео-память
Видео-память Спринтера является теневой памятью. Весь вывод в видео-память производится парал-
лельно с выводом в основную (за исключением некоторых особых случаев). При считывании из области
видео-данных считывается информация из основной памяти, а видео остается недоступной.
Недоступность видео-памяти не является принципиальным ограничением и есть признак конфигура-
ции. Перепрограммирование ПЛМ в позволяет получить доступ к видео-ОЗУ, но на данный момент эта
возможность не используется ни в одной прошивке, так как практически не особо требуется.
В работе видеоконтроллера используются два основных режима адресации - спектрумовский и графиче-
ский. В спектрумовском режиме видео-ОЗУ может оказаться тенью любой страницы основного ОЗУ, кроме
страниц #50..#5F. Это позволяет при необходимости иметь множество копий спектрумовского экрана,
например, для случая разработки многозадачного Спектрума.
В графическом режиме видео-ОЗУ является тенью одного 256-килобайтного блока – страниц #50..#5F.
Жесткое закрепление графического образа видео-памяти в основном ОЗУ обусловлено необходимостью
иметь точные копии данных видеорежимов для работы компьютера.
4.1 Спектрумовский режим адресации
В Спектрумовском режиме вся видеопамять разбивается на 32 блока по 8 килобайт. Адрес блока опре-
деляется номером, записываемым в RGADR. Биты 4..0 являются номером блока, бит 7 разрешает использо-
вание 16-килобайтовых страниц, бит 6 запрещает вывод на экран в спектрумовском режиме. Бит 0 вместе
с битом 1 порта #7FFD определяет младший бит номера спектрумовского блока видео-ОЗУ. Таким образом
достигается подключение двух блоков спектрумовского экрана для страниц 5 и 7.
Для примера, запись в RGADR номера #0C приведет к подключению к адресам #4000..#5FFF блока
номер 12, а к адресам #C000..#DFFF (при условии, что установлена спектрумовская страница 7) блока
номер 13. Запись в RGADR нечетного значения #0D приведет к подключению в #4000..#5FFF блока
номер 13, а в #C000..#DFFF (к 7-й странице) блока номер 12.
===== PAGE 10 =====
4 ВИДЕО-ПАМЯТЬ 10
Запись в RGADR значения #80 приведет возможности иметь доступ в спектрумовском режиме сразу
к 16kb – двум блокам видео-ОЗУ с номерами 0 и 1 в адресах #4000..#7FFF. Реально этот режим не
использовался и не проверялся. Он был сделан для возможной совместимости со спектрумовским режимом
512 точек в строке, но остался невостребован.
Если при работе какой либо программы требуется больше памяти, но не требуется вывод в спектру-
мовском режиме, RGADR рекомендуется устанавливать в значение #C0..#FF. В этом случае вывод в
видео-ОЗУ в Спектрумовском режиме не производится.
4.2 Графический режим адресации
В графическом режиме адресации видео-ОЗУ используется тот же RGADR. Подобная реализация при-
знана неудобной и в следующем варианте Sprinter-а предполагается разделить порты для графической и
спектрумовской адресации. Неудобство заключается в том, что закрытие спектрумовского режима вывода
осуществляется только при значениях этого порта больше #C0, а в графическом выводе используются
все значения порта. Из-за этого приходится постоянно следить за положением RGADR и перед записью в
адреса #4000..#7FFF устанавливать его в #C0, либо использовать для графического вывода первое окно,
что так же не всегда удобно.
Видео-ОЗУ в графическом режиме адресации разбивается на 256 строк по 1024 байта. Байты в строках
адресуются линейно младшими битами адреса процессора, а номер строки записывается в RGADR.
Расположение строк видео-ОЗУ таково, что спектрумовская адресация оказыватся как бы "попе-
рек"строк. Это сделано для возможности вывода как горизонтальных, так и вертикальных линий с помощью
команды типа LDIR. В графической адресации выводятся горизонтальные линии, в спектрумовской - вер-
тикальные. Реально подобный вывод не использовался, так как оказалось проще выводить вертикальные
линии с помощью акселератора (об этом ниже).
4.3 Подрежимы вывода графической адресации
Как было указано, страницы #50..#5F являются графическими. Адрес данных видео-ОЗУ, а так же
основного ОЗУ в графической адресации зависит от порта RGADR (PORT_Y), и при установке любого
значения из диапазона #50..#5F не меняется. Это используется для введения дополнительных подрежимов
вывода, которые используются для ускорения работы со спрайтовой графикой, а так же для удобства
программирования в некоторых иных случаях.
Два подрежима задается 2-м и 3-м битами номера страницы из #50..#5F.
Бит 3 отвечает за разрешение записи байта #FF. Если при выводе на экран использовать страницy
#58..#5F, то в процессе записи проверятся, не равен ли записываемый байт значению #FF. Если равен,
то запись не производится.
Этот режим можно использовать для вывода спрайтов с «прозрачным» цветом (прозрачный цвет #FF).
Фигурный спрайт выводится как прямоугольник, а все точки, которые не принадлежат спрайту в этом
прямоугольнике записаны байтами #FF.
Бит 2 отвечает за разрешение записи в основное ОЗУ параллельно с видео. Если при выводе использо-
вать страницы #54..#57 или #5C..#5F, то вывод будет осуществляться только в видео-ОЗУ. В основном
останутся те данные, которые были записаны туда ранее.
Этот режим используется для временного вывода на экран, например для вывода курсора мыши без
необходимости запоминания данных под курсором. Они остаются в основном ОЗУ.
Как видно, биты 2 и 3 действуют независимо. Это позволяет комбинировать оба подрежима так как
необходимо программисту.
ВНИМАНИЕ! При программировании вывода на графический экран стоит придерживаться правила, что
в биты 0 и 1 номера страницы записываются нули. Это позволит в будущем беспрепятственно использовать
эти программы в конфигурациях, где эти биты будут выполнять новые дополнительные функции.
4.4 Распределение Video-RAM
Распределение видео-ОЗУ является частично жестким, частично программным. Жеская часть распреде-
ления отвечает где находятся данные видео-режима и данные палитры (более конкретно о них будет сказано
===== PAGE 11 =====
4 ВИДЕО-ПАМЯТЬ 11
ниже). Программное распределени отвечает, где находятся данные для вывода в графических, текстовых и
спектрумовском режимах, открываемых функциями биоса.
Пока для дальнейшего объяснения пока достаточно примерного распределения видео-ОЗУ. Данные па-
литры находятся в блоках 30-31 спектрумовской адресации или, что то же самое, на концах линий графи-
ческой адресации – в адресах #03E0..#03FF. Данные режимов экрана находятся в блоках 24..29, или в
терминах линий – в адресах #0300..#039F. Область линий #03A0..#03DF является зарезарвированной
и ее использование в программах не рекомендуется.
Блоки 0..23 или линии по адресам #0000..#02FF обявляются свободно используемыми в программах.
При использовании функций биоса именно в этой области располагаются данные графических и спектру-
мовских экранов. Спектрумовский экран использует блоки 0 и 1 (#0000..#003F). Первый графический
экран использует блоки 2..11 (#0040..#017F). Второй графический – блоки 12..21 (#0180..#02BF). Блоки
22 и 23 (#02C0..#02FF) используются для хранения знакогенераторов текстового режима. Сами же данные
текстового режима находятся в области режима экрана и об этом будет сказано ниже.
4.5 Структура экрана, режимы экрана
Выше была описана адресация видео-ОЗУ так, как оно выглядит для процессора. Вывод же изображения
на телевизор осуществляется с помощью записаной в ПЛМ видео-карты, которая позволяет менять режимы
вывода простой перезаписью информации в видео-ОЗУ. Единственный порт, который меняет выводимое
изображение – порт RGMOD, бит 0 которого переключает страницу режима и таким образом полностью
меняет содержимое видео-экрана.
Режим экрана задается данными в видео-ОЗУ. Весь экран представляет собой набор квадратов раз-
мером 8x8 точек режимa разрешения 320x256. При увеличении разрешения количество точек в квадрате
увеличивается до 16x8.
Режим экрана для каждого квадратика прописывается в области 24..29 блоков видео-ОЗУ. Весь экран
описывается страницей режима, которая может быть переключена битом 0 порта RGMOD. Каждому квадра-
тику на одной странице режима соответствует 8 байт, часть из которых не используется (зарезервировано).
Реально используется от 2-х до 6-ти байт.
Весь экран представляет собой набор из 56x39 (56x40) квадратиков, что соответствует телевизионным
режимам 312(320) полных линий на кадр. Видимая область составляет 40x32 квадратика. Остальные соот-
ветствуют квадратикам, попадающим в область бордера, обратного хода луча и синхроимпульсов. Приници-
пиально возможно использование бордерных квадратиков для вывода изображения, но это не рекомендуется,
так как не все телевизоры способны показывать эту область.
Для подробного объяснения адресов режима я воспользуюсь следующими обозначениями:
P M – страница режима (значения 0 или 1).
SQab – квадратик с номером по горизонтали a и номером по вертикали b.
Line1 – номер графической линии для режима.
Line2 – номер графической линии для подрежима.
LA – адрес точки в графической линии.
M ode0 – первый байт режима.
M ode1 – второй байт режима.
M ode2 – третий байт режима.
M ode4 – четвертый байт режима.
Для каждого квадратика SQab:
Line1 = 1 + 2 ·a + #80 ·P M; Line2 = Line1 + 1; LA = #0300 + 4 ·b.
Параметры a и b принимают значения от 0 до 55 и от 0 до 39 соответственно. SQ0.0 – квадратик в
верхнем левом углу видимой области графического экрана экрана.SQ4.4 – самый верхний левый квадратик
спектрумовского экрана.SQ39.31 – нижний правый квадратик графического экрана. Как уже и было сказано,
квадратики с номерами a больше 39 и b больше 31 соответствуют бордеру и области синхроимпульсов.
Левый и верхний бордер соответствует квадратикам сa = 55 и b = 38(39) соответственно.
Положение байтов M odei в видео-ОЗУ соотстветсуют одинаковому Line и адресу в строке LA + i.
Основной режим определяется в Line1, а подрежим используется при определении основного режима с
===== PAGE 12 =====
4 ВИДЕО-ПАМЯТЬ 12
разрешением 640 точек по горизонтали. Если в основном режиме появилось указание на 640 точек, то
после вывода первых 8-ми точек, производится считывание дополнительного режима, с Line2, которое
переопределяет режим второй половинки квадратика. Это позволяет в текстовом 80-символьном режиме
иметь независимое программирование символа и знакогенератора.
Режим вывода в каждый момент времени полностью определяется считанными байтамиM ode0..3. Байт
M ode3 реально не используется и зарезервирован, поэтому режим определяется тремя байтами.
Собственно, сам режим определяется байтом M ode0, байт M ode1 является просто байтом адреса
данных, а M ode2 используется в спектрумовском режиме как адрес атрибутов, а в текстовом собственно
как атрибут символа.
Распишу все режимы:
ZX − 40 – текстовый режим 40 символов в строке или 1 символ на знакоместо. Используется в спектру-
мовском режиме. На экране оказываются три различных знакогенератора, которые расположены в памяти
ровно так, как полагается для Спектрума.
ZX − 80 – текстовый режим 80 символов в строке или 2 символа на знакоместо. Отличительной особен-
ностью является возможность на одном экране иметь до 36 знакогенераторов, указываемых для каждого
символа.
GR − 256 − 8 – графический режим 320x256 точек, 256 цветов. Он же 8x8 точек 256 цветов на одно
знакоместо. В этом режиме (а так же в GR-16-16) экран можно представить как «текстовый»40-символьный,
в котором каждый символ имеет графический образ в 64 байта. Всего таких символов 3072. При опреде-
ленном задании режима графические символы сливаются в одно графическое поле, на котором достаточно
просто рисуются линии и другие графические примитивы.
GR − 16 − 16 – графический режим 640x256 точек, 16 цветов. Он же 16x8 точек 16 цветов на одно
знакоместо.
Следует отметить, что любой из вышеуказанных режимов устанавливается в каждый квадратик инди-
видуально. Таким образом на разных частях экрана могут одновременно присутствовать различные режимы
вывода.
4.6 Спектрумовский режим, он же текстовый
M ode0:
bits 3..0 старшие биты (4..1) адреса блока, откуда выводятся данные. Младший бит определяется 3-м
битом порта #7FFD.
bit 4 "1"признак режима. Значение "0"соответствует графическому режиму.
bit 5 – признак разрешения "0"для 640 точек, "1"для 320 точек.
bit 6..7 – старшие биты адреса в блоке (bit 12..11). Они одинаковы как для байта пикселей так и для
байта атрибутов.
Так как в спектрумовском экране используется только три комбинации битов 6..7, четвертая комбинация
определяет особый режим – вывод бордера и синхросигналов. Таким образом комбинация "1111"в старших
битах режима M ode0 особая. При такой комбинации назначения младших битов изменяется, так как для
вывода бордера не требуется никакого адреса данных:
bit 3..2 значение "11"генерирует в этом квадратике сигнал Blank - гашение.
bit 0 значение "1"в присутствии сигнала Blank генерирует прерывание для процессора на восьмой
линии квадратика. Именно программированием этого бита в нужном квадратике осуществляется "подгон-
ка"сигнала INT под стандарт Pentagon или Scorpion.
M ode1:
Как уже было сказано, этот байт определяет адрес данных в видео-ОЗУ, выводимых в текущий квад-
ратик. В спектрумовском режиме он соответствует восьми младшим битам адреса в блоке и совместно с
битами 6..7 байта M ode0 определяет адрес спектрумовского символа в блоке. Недостающие 3 бита (bit 10..8)
берутся из счетчика линий в квадратике.
M ode2:
===== PAGE 13 =====
4 ВИДЕО-ПАМЯТЬ 13
Определяет младшие восемь бит адреса атрибута. В спектрумовском режиме устанавливается равным
M ode1, а в текстовом используется как байт атрибута символа. При выборке атрибута производится
специальное замешивание битов 6..7 байта M ode0 таким образом, что бы атрибуты оказались в старших
адресах блока по известному спектрумовскому закону.
Как использовать этот режим для текстового режима?
Для этого в один из спектрумовских экранов записывается знакогенератор. Прописывается так, что на
спектрумовском экране он выглядит как набор ASCII из 256-ти символов, выведенных последовательно в
256 знакомест. У этих символов прописывается атрибут просто равный номеру символа. После этого байты
M ode1 и M ode2 оказываются просто равными ASCII коду и атрибуту выводимого символа соответственно. А
байт M ode0 указывает на знакогенератор и в в принципе может определить 36 различных знакогенераторов.
3 за счет битов 7..6, еще 3 за счет битов 3..2 (комбинация "11"в этом месте попадает в область режима экрана
и палитры, куда не стоит вписывать знакогенератор), и еще 4 за счет битов 1..0. Простым премножением
получается 3 ·3 ·4 = 36 знакогенераторов.
Страница режима устроена таким образом, что бы при выводе линии байты атрибута и цвета одного
символа оказались рядом, и символы, расположенные в одной строке выводятся подобно выводу вер-
тикальной линии символов и рядом расположенной вертикальной линии атрибутов. При использовании
акселератора вывод строки оказывается очень быстрым (около миллиона символов в секунду).
4.7 Графический режим
Прежде чем расписывать байты режима объясню, как адресуются графические квадратики. Все видео-
ОЗУ, разбитое на блоки или линии, можно представить в виде квадратиков 8x8 точек. На линии в 1024
байта умещается 128 квадратиков, каждый из которых по вертикали занимает 8 линий и, таким образом, по
вертикали все видео-ОЗУ разбирается на 32 квадратика. Всего 4096 квадратиков, для адресации которых
необходимо 12 бит. Они берутся из M ode0 (четыре младших бита) и M ode1 после того, как битом 4 байта
M ode0 определен графический режим.
M ode0:
bits 3..0 старшие биты (4..1) адреса блока, так же как и в спектрумовском, но младший бит номера
блока берется из 2-го битаM ode1. Они же формально представляют собой старшие биты номера квадратика
по горизонтали.
bit 4 "0"признак режима (графический режим).
bit 5 – признак разрешения "0"для 640 точек, "1"для 320 точек.
bit 6..7 – номер палитры. В каждом квадратике можно задать одну из четырех графических палитр.
M ode1:
bit 1..0 – Дополнительный адрес данных в блоке. Адрес квадратика по горизонтали.
bit 2 – младший бит блока.
bit 7..3 – Адрес квадратика по вертикали.
Подобное "неправильное"разбиение адреса квадратиков возникло в результате оптимизации схемы "по
объему ПЛМ". Ввиду нехватки места было решено, что лучше пожертвовать линейностью адресации в
режиме экрана в пользу возможности иметь дополнительные возможности. В новой версии компьютера
возможно устранение этой нелинейности.
Графический режим 640 точек использует ту же схему адресации квадратиков. при этом каждый байт
рабивается на две точки и таким образом из режима 8x8 256-ти цветных точек получается режим 16x8
16-ти цветных. Первыми выводятся младшие 4 бита, вторыми – старшие.
4.8 Палитра
Устройство палитры достаточно просто. Каждый момент при выводе точки, с одной из линий считывается
3 байта и выводится в 3 регистра с 3-мя ЦАП-ами на выходе. Таким образом, образуется 3 цвета Red, Greeb
& Blue, которые определяют один из 16 млн. возможных цветов.
===== PAGE 14 =====
4 ВИДЕО-ПАМЯТЬ 14
Какие именно три байта выводить определяется схемой видео-карты. Все три байта выводятся всегда из
одной области – с концов линий – адресов #03E0..#03FF. Номер линии соответствуют номеру цвета для
256-ти графического цветного режима или номеру атрибута для текстового и спектрумовского режима. В
указанных адресах умещается 8 палитр по 256 цветов, считая по 1kb на каждую палитру. Реально из этого
килобайта используется только 768 байт. Каждый четвертый байт никуда не выводится и принципиально
схемотехнически не может попасть на регистр ЦАП-а. Четыре из этих восьми палитр используются для
графических режимов и оставшиеся четыре для текстовой палитры.
Про палитру в тексте следует сказать отдельно. Атрибут формально задает один цвет из палитры и,
соответственно, четыре цвета из четырех палитр. из этих четырех цветов на каждую точку попадает только
один. Выбор производится по двум битам – FLASH и биту из регистра сдвига в котором находятся восемь
точек, считанные из знакогенератора. Таким образом, для каждого атрибута задается цвет бумаги, цвет
символа, цвет мерцания бумаги и цвет мерцания символа. Если, например, цвет мерцания бумаги совпадает
цветом бумаги, то мерцания на экране не наблюдается. Аналогично для цвета символа. Подобное решение
позволяет любую кодировку цвета для каждого атрибута и разрешить проблему с различиями атрибутов в
спектрумовском и IBM-ском вариантах. Просто в момент перехода с одного стандарта на другой в палитру
загружаются необходимые данные.
С графической палитрой все просто. Байт точки попадает на адрес линии для конкретной палитры и
соответствующий ей цвет попадает на ЦАП-ы. В 16-ти цветном режиме используются 16 младших цветов
палитры.
#03E0..#03E2 – графическая палитра 0
#03E4..#03E6 – графическая палитра 1
#03E8..#03EA – графическая палитра 2
#03EC..#03EE – графическая палитра 3
#03F0..#03F2 – текстовая палитра 0 – цвет бумаги
#03F4..#03F6 – текстовая палитра 1 – цвет символа
#03F8..#03FA – текстовая палитра 2 – цвет мерцания бумаги
#03FC..#03FE – текстовая палитра 3 – цвет мерцания символа
Байты расположены в порядке Blue Green Red.
4.9 Процесс вывода на экран
Что бы связать воедино все, что было сказано выше, распишу процесс вывода на экран, происходящий
внутри ПЛМ.
Упрощенная блок-схема видео-контроллера:
===== PAGE 15 =====
4 ВИДЕО-ПАМЯТЬ 15
Тактовый генератор задает частоту 42MHz. Первым делом эта частота делится на 3, а затем на 2,
получая 14 и 7 MHz для вывода пикселей. 14MHz в режиме 640 точек и 7MHz в режиме 320 точек.
7MHz делится еще раз на 8 получая номер точки в квадратике. Затем получившаяся частота делится на
56. Этот делитель является и счетчиком знакомест, номер которого подается как часть адреса режима
экрана. Полученная после деления на 56 частота является частотой синхронизации строк. Она делится на
8 вертикальным счетчиком строк знакоместа. Далее деление частоты продолжается и для получения 312
или 320 линий на кадр используется управляемый счетчик – он же счетчик знакомест по вертикали и часть
адреса режима экрана. И последний счетчик делит полученную частоту кадров на 32 что бы получить
сигнал FLASH.
Данные счетчиков знакомест по горизонтали и вертикали подаются как часть адреса на видео-ОЗУ.
Остальная часть адреса соответствует тому положению, где находятся данные видео-режима. И, таким
образом, из видео-ОЗУ считываются данные режима, а именно 4 байта M odei. Эти байты определяют
в каком режиме выводить данные на экран и из какого места их брать. В соответствии со считанными
байтами M odei из видео-ОЗУ производится следующая выборка, а именно выборка байта знакогенератора
и атрибута для текстового режима или выборка байта цвета для графического. Из этих байтов (а в случае
необходимости и из сигнала FLASH) формируется необходимый адрес цвета в палитре и производится
следующий цикл считывания из памяти, при котором данные сразу же записываются в цветовые регистры
с ЦАП-ами, которые и формируют сигнал цвета для монитора.
Еще раз распишу немного подробнее, по тактам.
Тактовая частота – 42MHz. Период одного пикселя – 6 однотактовых циклов.
Циклы распределяются следующим образом:
T AKT 1 – выборка байта пикселей текстового режима в графическом режиме – холостой ход;
T AKT 2 – выборка текстового атрибутa, он же выборка байта пикселя для GRAF-Modes;
T AKT 3 – выборка 3-х байтов палитры для режимов 640 точек, в 320 - холостой ход;
T AKT 4 – выборка слова режима экрана выборка производится один раз в четыре периода;
T AKT 5 – цикл записи от процессора, данные пишутся только когда нужно;
T AKT 6 – выборка 3-х байт палитры с записью в RGB регистры.
Все начинается с такта 4. Адрес для режима определяется счетчиком вертикали и горизонтали. Счита-
===== PAGE 16 =====
5 ЗВУКОВОЙ ВЫХОД 16
ются по 8 точек 320-го режима по вертикали и по 8 строк по горизонтали. Считанные данные помещаются
в регистры режима M odei, описанные выше.
С пятым тактом все ясно. За исключением того, что для графического и текстового режимов изменяется
адресация ОЗУ Изменение задается номером страницы Страницы 50..5F считаются графическим ОЗУ.
Следует отметить, что понятие графического и текстового режима адресации не совсем верно отражает суть.
Вывод данных в экранное ОЗУ может осуществляться в обоих режимах независимо от действительного
режима экрана.
6-й такт. Чтение палитры. В текстовом режиме адрес палитры составляет 10 бит. 8 бит – байт атрибута.
1 бит – пиксель. 1 бит – FLASH. Этот бит фактически переключает две палитры с частотой FLASH. Если
палитры для данного атрибута совпадают то FLASH не наблюдается.
В графическом режиме адрес палитры составляет 8 бит байта пикселя и 2 бита номера палитры, считан-
ного в 4-м такте, но задержанного на 1 период для синхронного изменения режима и палитры в знакоместе.
Еще один бит адреса используется для разделения палитр текстового и графического режимов. Остав-
шиеся адреса ОЗУ устанавливаются в "1"и вся палитра оказывается на концах 1024-х байтовых линий
графического режима.
Такт 1. Здесь начинает действовать новый режим, считанный в такте 4. Адрес ОЗУ является адресом
байта пикселей текстового режима. Байт пикселей записывается в сдвиговый регистр и первый выдвинутый
бит начинает действовать в 6-м такте.
Такт 2. Выбирается байт атрибута. Адрес отличается от адреса байта пикселей по известному Спек-
трумовскому закону. Если перед этим в 4-м такте был считан графический режим, то Адрес атрибута
становится другим и соответствует байту пикселя графического режима. Регистр атрибута в графическом
режиме является регистром байта пикселя.
Такт 3. Чтение палитры для режима 640 точек. Следует заметить что в графическом режим 640 точек, 4
старших бита регистра пикселя маскируются нулями и в этом такте в младших битах адреса оказываются
те четыре бита, которые были замаскированы в 6-м такте. Так организуется 16 цветов на точку.
5 Звуковой выход
Звуковой выход платы Sp2000 представляет собой двухканальный 16-тибитный ЦАП - TDA1543, под-
ключенный к ППЛМ. В данный момент реально используется 10 бит, для одновременного вывода 8-bit
COVOX-а и сигнала AY-3-8910.
5.1 AY-3-8910
В ППЛМ платы Sp2000 вписывается схема, содержащая в себе схему аналога музыкального сопроцес-
сора AY-3-8910/8912. Его программирование осуществляется по стандартным описаниям.
5.2 Бипер/Covox
Стандартный спектрумовский бипер (бит 5 порта #FE) выведен через ту же схему, что и Covox, и AY.
(TDA1543) Программируется стандартно.
Covox – 8-бит – позволяет выводить WAV сигналы. В стандартной конфигурации Covox подключен на
порт #FB и #4F. Вывод последовательности байтов в любой из этих портов приведет появлению сигнала
на звуковом выходе.
В стандартной конфигурации на выходы левого и правого канала выдается один и тот же сигнал (моно-
фоническое звучание).
5.3 COVOX-Blaster (CBL)
Covox-Blaster (CBL) Covox с буферным ОЗУ.
Подключение буферного ОЗУ осуществляется по следующей схеме:
===== PAGE 17 =====
5 ЗВУКОВОЙ ВЫХОД 17
Счетчик работает на частоте 15 или 22 килогерца, в зависимости от состояния порта конфигурации
Covox-а. Адрес мультиплексируется на момент записи в порт из процессора, все остальное время данные
из ОЗУ записываются в регистр ЦАП-а.
Ввод байтов в буферное ОЗУ осуществляется командой OTIR (OUTI), что позволяет ускорить вывод
звука и создать достаточно большие паузы для работы других частей программы. Так как при использовании
команды OTIR регистр B (который попадает на A15..A8 процессора) уменьшается, для нормальной работы
CBL счетчик считает «назад».
Для контроля за работой Covox-Blaster-а используется бит 7 порта #FE, в который выводится старший
бит счетчика. Блок ОЗУ 256 байт условно разбит на две банки по 128 байт, и бит 7 порта #FE указывает
какая из банок ОЗУ выводится в ЦАП в конкретный момент времени. Это используется программой вывода
для определения, нужно ли подгружать следующие 128 байт в буфер.
В плате Sp2000 COVOX-Blaster включен в основную прошивку и включается через порт управления
CBL - #4E. Запись в этот порт значения #80 приводит к включению режима CBL, #00 - включение
обычного COVOX-а. Другие биты порта #4E имеют значение и их следует выставлять в 0 для получения
описанного выше режима CBL. В дальнейшем этот порт будет устанавливать режимы Stereo, 8/16-bit и
частоту.
;***********************************************************************
;
; Пример программы для Covox-Blaster-a.
;
;***********************************************************************
CLEAR_COVOX: ; программа для очистки буфера ОЗУ и
; отключения звука
LD A,80H ; значение, эквивалентное нулю на выходе Covox
LD BC,0FBH ; порт Covox-Blaster-а
CLEAR_CBL:
OUT (C),A
DJNZ CLEAR_CBL
XOR A
LD (SND_P),A ; установить в страницу звука 0 (нет звука)
RET
;***********************************************************************
SOUND_START: ; программа инициализации Covox-Blaster-а
;=======================================================================
; здесь должна располагаться программа, которая
; произведет рассчет первой страницы данных для COVOX-бластера и
===== PAGE 18 =====
5 ЗВУКОВОЙ ВЫХОД 18
; адреса данных. Страница и адрес соответственно в регистры A и HL
;=======================================================================
LD (SND_A),HL ; запомнить состояние адреса звука
LD (SND_P),A ; запомнить новую страницу WAV-данных
RET
SND_A DB 0
SND_P DW 0
;***********************************************************************
SOUND:
PUSH AF
LD A,(SND_P) ; проверка, что страница WAV-данных не равна 0
AND A
JR Z,RET_ALL ; иначе выход -- нет звука
PUSH HL
SND_MORE:
IN A,(0FEH) ; бит 7 порта #FE указывает состояние 7-го бита
; счетчика выводимого байта (банк 0/1)
XOR 0 ; запомненное состояние Covox адреса
COV_ADR EQU $-1
AND 80H ; проверить, переключение банки 128 байт
JP NZ,NO_LD_SND ; если изменения не было, вернуться.
LD A,(SND_P)
AND A
JR Z,RET_ALL
PUSH DE
PUSH BC
LD A,(COV_ADR) ; взять адрес Covox-а.
CPL ; инвертировать
LD B,A ; запомнить в B
LD HL,(SND_A) ; взять адрес WAV-данных
LD C,0FBH ; порт Covox-Blaster-а
IN A,(PAGE3) ; запомнить состояние PAGE3
LD E,A
LD A,(SND_P) ; взять номер страницы WAV-данных
OUT (PAGE3),A ; переключить PAGE3
LD D,16 ; повторять 16 раз
L_DDX:
OUTI ; выводить в Covox-Blaster
OUTI ; (OUTI работает несколько быстрее, чем OTIR)
OUTI
OUTI
OUTI
OUTI
OUTI
OUTI
DEC D
JR NZ,L_DDX
===== PAGE 19 =====
6 АКСЕЛЕРАТОР ОПЕРАЦИЙ С ОЗУ 19
LD (SND_A),HL ; запомнить состояние адреса звука
LD A,H ; проверить, что адрес не дошел до конца страницы
AND A
JP NZ,NO_SNDP ; если не дошел, идти на выход
LD A,E ; вспомнить страницу PAGE3
OUT (PAGE3),A
;=======================================================================
; здесь должна располагаться программа, которая
; произведет рассчет новой страницы данных для COVOX-бластера и
; адреса данных. Страница и адрес соответственно в регистры A и HL
;=======================================================================
LD (SND_A),HL ; запомнить состояние адреса звука
LD (SND_P),A ; запомнить новую страницу WAV-данных
JR NO_SNDP1
NO_SNDP:
LD A,E ; вспомнить страницу PAGE3
OUT (PAGE3),A
NO_SNDP1:
POP BC
POP DE
NO_LD_SND:
POP HL
RET_ALL:
POP AF
RET
5.4 Sprinter-Sound-Card (SSC)
Разработанная на данный момент Sound-Card для Спринтера не поддерживается ни в одной прошивке
ввиду довольно большого занимаемого объема ПЛМ. В плате Sp2000 объем уже достаточен и конкретная
прошивка с SSC находится в планах.
Основные параметры SSC:
2 выходных канала (Stereo-OUT)
Шестнадцать 8-битных голосов
256-byte Wave-Tables своя для каждого голоса
8-bit регулятор амплитуды для каждого голоса и каждого канала
Программирование в данном описании не приводится ввиду возможной полной переработки схемы SSC.
6 Акселератор операций с ОЗУ
Акселератор операций с ОЗУ предназначен для ускорения операций по пересылке данных или по за-
полнению ОЗУ одним байтом. Акселератор присутствует в чисто Sprinter-овских конфигурациях и поэтому
никак не мешает работе обычных Spectrum-овских программ.
Основой акселератора является быстрое внутреннее ОЗУ в ППЛМ. Операции по пересылке данных
производятся путем записи блока данных в это внутреннее ОЗУ, а затем копировании его в нужное место
памяти из этого ОЗУ. После одной записи копирование может производиться несколько раз и таким образом
можно производить заполнение экрана текстурами.
===== PAGE 20 =====
6 АКСЕЛЕРАТОР ОПЕРАЦИЙ С ОЗУ 20
Для заполнения экрана одним цветом используется другой режим акселератора. В нем вместо копиру-
емого блока данных из внутреннего ОЗУ производится запись данных с шины процессора, которые в этот
момент не изменяются.
Блок данных, записываемый в ОЗУ акселератора может иметь различную длинну из диапазона 1..256
байт.
Управление акселератором производится непосредственно из программы. Для этого изпользуются ко-
манды процессора, которые фактически являются операциями типа NOP. Это команды LD A,A; LD B,B;
LD C,C; LD D,D; LD E,E; LD H,H, LD L,L
Назначение команд следующее:
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 ; включить прерывания
Этот отрезок программы произведет копирование всего экрана с одного экрана на другой. Время его
исполения составляет примерно 1.2 инта.
Дополнительные функции акселератора (AND, OR, XOR) работают подобным же образом. Для выпол-
нения логических функций используются команды XOR (HL); OR (HL); AND (HL).
Пример кодирования блока в 256 байт.
LD HL,ADRES_1
LD DE,XOR_DAT
DI
LD D,D
===== PAGE 21 =====
7 КЭШ-ОЗУ 21
LD A,0 ; число байт, которые надо закодировать
LD L,L
LD A,(DE) ; взять блок данных в ОЗУ акселератора
XOR (HL) ; произвести операцию XOR с данными акселератора
LD (HL),A ; запомнить в ОЗУ результат операции
LD B,B
EI
Скорость работы акселератора ограничивается только физической скоростью работы основного ОЗУ.
Определить время работы команды с акселератором можно по такой примерной формуле:
Время работы = время работы команды без акселератора + время работы акселератора
Время работы акселератора = число пересылаемых байт /7000000 (секунд)
Отключение прерываний во время работы акселератора необходимо, так как в этот момент сильно ме-
няется система команд процессора и программа на прерывании не сможет работать нормально. В данный
момент применяется прошивка, в которой акселератор может работать в режиме со включенными прерыва-
ниями. В момент прихода прерывания он отключается и включается обратно по команде RETI. Использовать
этот режим следует с осторожностью.
7 КЭШ-ОЗУ
Кэш-ОЗУ подключается двумя способами – через порт #FB стандартно по Pentagon-овски и как подобно
ПЗУ через спец-порт...
7.1 Загрузка новых прошивок в ПЛМ
Описание загрузки прошивок с использованием функции BIOS...
8 ISA, порт A20
Доступ к устройствам, подключенным к ISA шине осуществляется через страницы памяти. Для полу-
чения этого доступа достаточно установить расширенную Scorpion-овскую страницу и установить в нее
номер страницы ОЗУ – #D0..#DF. Бит 1 номера означает выбор доступа к порту или памяти ISA, а бит 2
определяет к какому из двух слотов осуществляется доступ.
9 Внутренние порты Z84C15
Ссылка на описание PIO, SIO и т.д. от Zilog.
Один момент. Конфликт #1F с джойстиком и ВГ93 С джойстиком все пpосто. Ему вывод в #1F не ме-
шает, а ввод из #1F для pаботы с поpтом не тpебуется. Пpи отключенном TR-DOS, с ВГ93 нет конфликтов,
когда же он включен, то SP-DOS вместо #1F использует #0F, это избавляет от конфликта с паpаллельным
поpтом. Для ноpмальной pаботы пpогpамм использующих #1F в пpошивке сделано аппаpатное пеpенапpав-
ление поpта #1F в поpт #0F. Следовательно команды OUT (#1F),A пpосто не сpаботают.
Что бы записать во внутpенний поpт пpоцессоpа, надо использовать вывод чеpез BC, т.е. LD BC,#1F :
OUT (C),A. Эта команда не пеpенапpавляется. Это пpичина того, почему некотоpые пpогpаммы могут не
увидеть джойстика. Они используют IN A,(C)...
===== PAGE 22 =====
9 ВНУТРЕННИЕ ПОРТЫ Z84C15 22
9.1 Мышь
; (c) Denis Parinov
CMOUSE EQU #1B
DMOUSE EQU #1A
VSIZEX EQU 256 ;X SIZE SCREEN
VSIZEY EQU 192 ;Y SIZE SCREEN
;INTERUPT
CALL READ_M
CALL C,MCORECT
RET
;READING MOUSE
; HL - X COORD
; DE - Y COORD
; A - BUTTONS
; D0 - LEFT
; D1 - RIGHT
MS_READ LD HL,(PIX_X)
LD DE,(PIX_Y)
LD A,(MB)
RET
;INITIALIZING COM PORT
MS_INIT DI
LD A,85
OUT (#10),A
LD A,45
OUT (#10),A
LD A,0
OUT (CMOUSE),A
LD A,1
OUT (CMOUSE),A
LD A,0
OUT (CMOUSE),A
LD A,3
OUT (CMOUSE),A
LD A,#41
OUT (CMOUSE),A
LD A,4
OUT (CMOUSE),A
LD A,#47
OUT (CMOUSE),A
LD A,5
OUT (CMOUSE),A
LD A,#E0
OUT (CMOUSE),A
EI
RET
READ_M IN A,(CMOUSE)
RRCA
===== PAGE 23 =====
9 ВНУТРЕННИЕ ПОРТЫ Z84C15 23
RET NC
IN A,(DMOUSE)
LD L,A
BIT 6,A
CCF
RET Z
TST_01 IN A,(CMOUSE)
RRCA
JP NC,TST_01
IN A,(DMOUSE)
LD E,A
BIT 6,A
CCF
RET NZ
TST_02 IN A,(CMOUSE)
RRCA
JP NC,TST_02
IN A,(DMOUSE)
LD D,A
BIT 6,A
CCF
RET NZ
LD A,E
AND #3F
LD E,A
LD A,L
AND #03
RRCA
RRCA
OR E
LD E,A
LD A,D
AND #3F
LD D,A
LD A,L
AND #0C
RRCA
RRCA
RRCA
RRCA
OR D
LD D,A
LD A,L
RLCA
RLCA
RLCA
RES 6,A
JR NC,STBU
SET 6,A
STBU RLCA
RLCA
AND #03
LD (MB),A
LD A,E
===== PAGE 24 =====
9 ВНУТРЕННИЕ ПОРТЫ Z84C15 24
LD (MX),A
LD A,D
LD (MY),A
SCF
RET
MCORECT LD HL,(PIX_X)
LD DE,(MX)
LD D,0
BIT 7,E
JP NZ,DECX
ADD HL,DE
LD (PIX_X),HL
EX DE,HL
LD HL,VSIZEX-1
AND A
SBC HL,DE
JP NC,YCOO
LD HL,VSIZEX-1
LD (PIX_X),HL
JP YCOO
DECX LD A,E
NEG
LD E,A
AND A
SBC HL,DE
LD (PIX_X),HL
JP NC,YCOO
LD HL,0
LD (PIX_X),HL
YCOO LD HL,(PIX_Y)
LD DE,(MY)
LD D,0
BIT 7,E
JP NZ,DECY
ADD HL,DE
LD (PIX_Y),HL
EX DE,HL
LD HL,VSIZEY-1
AND A
SBC HL,DE
RET NC
LD HL,VSIZEY-1
LD (PIX_Y),HL
RET
DECY LD A,E
NEG
LD E,A
AND A
SBC HL,DE
LD (PIX_Y),HL
RET NC
LD HL,0
===== PAGE 25 =====
9 ВНУТРЕННИЕ ПОРТЫ Z84C15 25
LD (PIX_Y),HL
RET
PIX_X DEFW 128
PIX_Y DEFW 96
MX DEFB #00
MY DEFB #00
MB DEFB #00
9.2 Принтер
Простой драйвер принтера...
9.3 Прерывания от ISA
Режим прерываний от ISA устанавливается через программирование PIO Z84C15 (управление портом B
– 1Fh), описанное выше. Назначение битов самого порта следующее (внутренний порт Z84C15 1Eh, port B
PIO):
Bit0 - IRQ1 вход прерываний с первого слова
Bit1 - IRQ2 вход прерываний со сторого слова
Bit2 - DRQ2 вход
Bit3 - DACK2 выход
Bit4 - DRQ1 вход
Bit5 - DACK1 выход
Bit6,7 - используются для Printer-а
9.4 AT-Клавиатура
При программировании AT-клавиатуры следует помнить, что последовательный порт имеет FIFO буфер
на 3 байта. После того, как принят и обработан один байт, стоит проверить нет ли еще принятых байтов и
возвращаться из программы обработки клавиатуры только если этих байтов нет.
Программа инициализации клавиатуры и считывания байта.
;***********************************************************
; Процедура инициализации клавиатуры
;***********************************************************
COM_A EQU 19h
DAT_A EQU 18h
KBD_INIT:
LD A,0 ; установка портов режима
OUT (COM_A),A ; в соответствии с описанием
LD A,1 ; последовательного порта Z84C15
OUT (COM_A),A ;
LD A,0
OUT (COM_A),A
LD A,3
OUT (COM_A),A
LD A,0C1h
OUT (COM_A),A
LD A,4
OUT (COM_A),A
LD A,5h
===== PAGE 26 =====
10 КОНТРОЛЛЕР FDD 26
OUT (COM_A),A
LD A,5
OUT (COM_A),A
LD A,062H
OUT (COM_A),A
RET
;***********************************************************
; Процедура считывания байта с клавиатуры
;***********************************************************
READ_KBD: ; считывание с клавиатуры
IN A,(COM_A)
BIT 0,A ; проверить наличие байта
SCF ; установить флаг C
RET Z ; и вернуться, если не было байта
IN A,(DAT_A) ; считать байт
AND A ; сбросить C
RET ; и вернуться
Особенности спектрумовской реализации (доп бит для F1..F10)
9.5 Таймеры
Как пример, программа вывода Wav (от Алексея Гавриленко?)
10 Контроллер FDD
Все программирование ВГ93 стандартно. Следует обратить внимание только на замену порта #1F на
#0F в программе ПЗУ. В случае использования своих программ, этот порт так же должен быть #0F.
10.1 720/1.44
Программа переключения 720/1.44 для платы Sp2000. Обе должны выполняться в режиме TR-DOS и
или при специально открытых портах 00BDh и 20BDh.
Set_1440:
LD A,21h
OUT (0BDh),A
RET
Set_720:
LD A,01h
OUT (0BDh),A
RET
Использовать напрямую не рекомендуется, лучше пользоваться функциями BIOS для работы с дискета-
ми.
11 Контроллер HDD
Краткое описание контроллера, чтение/запись секторов через BIOS. Ссылка на документ по IDE...
===== PAGE 27 =====
12 CMOS 27
12 CMOS
Порты CMOS:
#FFBD Data Read
#BFBD Data Write
#DFBD Adress Write
Записывать какие либо данные в CMOS без ведома BIOS-а не рекомендуется. Исключение – установка
регистров времени/будильника.
12.1 Описание регистров CMOS
PDF от Dallas 12887A...
13 Дешифрация ПЗУ/КЭШ/Контроллеры/и т.п.
Особенности обращения к ПЗУ/КЭШ/ISA...
13.1 Схема распределения портов
Sprinter имеет две обособленные группы портов. Первая группа, это внутренние порты процессора
Z84C15, вторая – внешние порты. Адресация портов первой группы не может быть изменена, так как
эти порты на одном кристалле с процессором. Вторая группа погключается через ППЛМ и их адреса могут
изменяться как угодно, с единственным условием, непересечения с адресами первой группы.
О том какие порты имеются на кристалле Z84C15 можно прочитать в документации по этому процессору
и здесь я упомяну некоторые из них. Один из последовательных портов используется для ввода данных
с активной мыши. Один из параллельных используется для вывода данных, на второй параллельный порт
заведены сигналы прерываний и запросов прямого доступа со слотов ISA. Параллельный порт процессора
Z84C15 устроен таким образом, что на нем возможна организация прерываний по сигналам приходящим
через параллельный порт. Фактически второй параллельный порт используется как контроллер прерываний.
Схема распределения портов второй группы имеет свою особенность. Главной идеей было получение воз-
можности бысро изменять конфигурацию портов без перегрузки ППЛМ. Это достигнуто путем применения
карты распределения портов, располагающейся на специальной странице ОЗУ.
При появлении цикла обращения к порту сначала происходит обращение к ОЗУ карты портов. В карте
портов записано какой именно порт подключен к данному адресу. Далее происходит внутренняя дешифрация
по байту из карты портов и обращение к выбранному порту. В режиме нетурбо это происходит без каких
либо задержек, а в режиме турбо процессору выставляется сигнал WAIT в зависимости от необходимой
длины цикла обращения к порту.
Для подключения к какому либо адресу или отключения от него какого либо порта достаточно открыть
карту портов и вписать в нужное место один байт.
В странице карты портов содержится четыре карты, которые могут переключаться через системный порт.
Таким образом можно осуществить быстрое переключение конфигурации портов, что может быть полезно
при работе Spectrum-овских программ совместно со Sprinter-овским биосом.
Карты портов расположена в странице 40h. Переключение производится через системный порт (адрес
7Ch/3Ch). При записи в системный порт значений 04h,0Ch,14h,1Ch происходит переключение на одну из
четырех карт. Начальное значение 04h.
Номер карты соответсвует адресам A12,A13 в странице (блоки по 4kb). На остальные адреса подаются
следующие сигналы:
A0 - A0
A1 - A1
A2 - A2
A3 - A7
A4 - A13
===== PAGE 28 =====
13 ДЕШИФРАЦИЯ ПЗУ/КЭШ/КОНТРОЛЛЕРЫ/И Т.П. 28
A5 - A5
A6 - A6
A7 - A14
A8 - A15
A9 - /WR - сигнал записи
A10 - /DOS - 0 - дос включен, 1 - выключен
A11 - PN5 - сигнал блокировки порта Пентагона (может отсутствовать)
Таким образом порт выбирается именно по указанным сигналам, т.е. например, нельзя назначить на ад-
реса 0050h и 0058h различные порты. Участие в дешифрации сигнала /WR позволяет назначать различные
порты на один и тот же адрес на чтение и запись. Так, например, в схеме контроллера дисковода на порт
0FFh на чтение назначено чтение порта джойстика и сигналов DRQ, INTRQ контроллера дисковода, а на
запись - запись в микросхему ТМ9 - системный порт TR-DOS.
Назначение порта производится записью соответствующего байта в карту памяти. Так, для того что
бы назначить на некий адрес, скажем, на 7785h некий порт, первым делом следует удостовериться, что
этот порт не пересекается ни с какими другими портами. Проще всего, это узнать, прочитав карту памяти
из адреса, соответсывющего этому порту. Если в этом месте оказался нуль, значит, порт не занят и его
возможно использовать (надо помнить, что не все незанятые порты стоит использовать, так как есть еще и
внутренние порты Z84C15).
Как определить адрес, откуда читать байт?
Для этого надо из 7785h выделить биты 0, 1, 2, 5, 6, 7, 13, 14, 15, и установить соответсвенно им биты
адреса карты памяти:
A0=p_A0=1, A1=p_A1=0, A2=p_A2=1, A3=p_A7=1, A4=p_A13=1, A5=p_A5=0,
A6=p_A6=0, A7=p_A14=1, A8=p_A15=0, A9=xxx, A10=xxx, A11=xxx.
Значениe xxx имеeтся в виду «не определено» . Это означает, что в карте памяти по всем адресам,
у которых из A[11..0] биты A[8..0] равны 010011101b=09Dh следует прописать один и тот же байт, соот-
ветсвующий номеру порта. Биты A[15..A12] адреса устанавливаются соответсвенно номеру окна и номеру
карты (обычно 1100b для окна C000-FFFF и нулевой карты), таким образом, рассчитанный адрес равен
C09Dh, если xxx заменить на нули, а весь набор - C09Dh, C29Dh, C49Dh, C69Dh, C89Dh, CA9Dh, CC9Dh,
CE9Dh.
Если необходимо, что бы порт был «виден» только на запись, то A9 устанавливается в 0, если только на
чтение - A9=1. Аналогично с битами DOS и PN5. Если нужно, что бы порт был виден только в DOS или
только при открытом порте «Пентагона», необходимо устанавливать соответсувующие биты в адресе карты
в конкретные значения.
С другой стороны, при необходимости неполной дешифрации (например, порт 8-мибитный), надо уста-
новить в «не определено» значения для A13,A14,A15, то есть биты 4,7 и 8 адреса карты портов и рассчитать
соответствующий набор адресов.
Ввиду отсутствия дешифрации по части адресам, естественно, открытый для 7785h будет виден и по
всем другим адресам, различающимся в битах A[12..8] и A[4..3].
Для наглядности напишу програму, которая откроет на чтение и запись порт 7785h некий виртуальный
порт с номером 0D0h.
OPEN_PORT:
LD B,0D0 ; номер виртуального порта
OPEN_P1:
DI ; запретить прерывания! Не дай бог нагадить в 40h
; все полетит к чертям.
IN A,(PAGE3)
EX AF,AF’ ; сохранить адрес окна C000h
; стеком не пользуюсь намеренно, бог его знает, где
; он, a я страницами щелкаю
LD A,40h
OUT (PAGE3),A ; установить новый адрес окна на страницу 40h
===== PAGE 29 =====
13 ДЕШИФРАЦИЯ ПЗУ/КЭШ/КОНТРОЛЛЕРЫ/И Т.П. 29
; Здесь я не буду проверять, что было записано в том месте,
; считая, что там были нули (но в реальном Спринтере стоит проверить,
; не занят ли он). Для проверки этой программы, лучше всего воспользоваться
; портом 0000h, для которого в следующей команде константа
; равна 0C000h, и он точно не зянят. Но здесь так для наглядности.
LD HL,0C09Dh ; адрес в карте памяти для порта 7785h на запись
; это адрес, биты которого рассчитаны немного выше. Aдрес для карты 0,
; которая и устанавливается при обычной работе.
LD (HL),B ; установить порт на чтение в режиме DOS
SET 1,H ; включить A9 в 1 (сигнал /WR)
LD (HL),B ; установить порт на запись в режиме DOS
SET 2,H ; включить A10 в 1 (сигнал DOS)
LD (HL),B ; установить порт на запись в режиме не-DOS
RES 1,H ;
LD (HL),B ; установить порт на чтение в режиме не-DOS
; порт установлен открывать его в режиме отключенного порта пентагона я не
; стал, собственно, и не обязательно, если программа работает в 128-м
; режиме.
EX AF,AF
OUT (PAGE3),A ; восстановить страницу
EI
RET
CLOSE_PORT:
LD B,0 ; значение 0 - порт закрыт
JR OPEN_P1 ; все остальное так же как при открытии
; теперь, что бы пользоваться портом 0, достаточно сделать так
CALL OPEN_PORT
.....
LD BC,0
OUT (C),A
.....
LD BC,0
IN A,(C)
.....
CALL CLOSE_PORT
; можно вызывать и OPEN_P1, например
LD B,0D1h ; открыть виртуальный порт 0D1h
CALL OPEN_P1
; Естественно, можно вызывать открытие нового виртуального
; порта и не закрывая старый. Надо только помнить, что порт
; стоит закрыть при выходе из программы.
О виртуальных портах.
===== PAGE 30 =====
13 ДЕШИФРАЦИЯ ПЗУ/КЭШ/КОНТРОЛЛЕРЫ/И Т.П. 30
В Спринтере есть набор нескольких дополнительных портов, которые никак нигде не используются, но
просто являются некими ячейками памяти. Это порты с номeрами D0h..DFh. Они используются при работе
в режиме Pentagon-512 как адреса дополнительных страниц, но в режиме Pentagon-128/Scorpion-256 могут
использоваться программистом для каких нибудь особых целей, например, эмуляции какого либо порта для
уже написанных программ. А в некоторых случаях могут стать передатчиком дополнительных параметров
(хотя и несколько извращенным).
Байты номеров портов для карты памяти (для sp-97):
00 - Нет порта
01h..0Fh - reserved
10h - порт ВГ93 (1F)
11h - порт ВГ93 (3F)
12h - порт ВГ93 (5F)
13h - порт ВГ93 (7F)
14h - порт на запись - состояние контроллера дисковода (FF)
15h - порт на чтение - джойстик и IRQ/INTRQ контроллера
16h..1Fh - reserved
20h - HDD - регистр данных
21h - HDD - регистр состояния/ошибок
22h - HDD - регистр количества секторов для операций R/W
23h - HDD - регистр сектора
24h - HDD - регистр дорожки-low
25h - HDD - регистр дорожки-high
26h - HDD - регистр головок/выбора мастер-слэйв
27h - HDD - регистр команд
28h - HDD - дополнительный регистр управления 3F6
29h - HDD - дополнительный регистр состояния 3F7
2Ah..2Fh - reserved
30h - ISA-SLOT 1 - memory R/W
31h - ISA-SLOT 2 - memory R/W
32h - ISA-SLOT 1 - ports R/W
33h - ISA-SLOT 2 - ports R/W
34h..3Fh - reserved
40h - ZX-Keyboard (порт FE)
41h..7Fh - reserved
80h..87h - reserved
88h - COVOX/COVOX-Blaster
89h..8Fh - reserved
90h - AY-8910-port (BFFD)
91h - AY-8910-port (FFFD)
92..BFh - reserved
C0h - Scorpion-256 port (1FFD)
C1h - Pentagon-128 port (7FFD)
C2h - Border, write only (FE)
C3h - reserved
C4h - port RGADR, PORT_Y (89)
C5h - port RGMOD (C9)
C6h..C7h - reserved
C8h..CFh - копии C0..C7h (not used!)
D0h..DFh - Virtual Ports (USER ports)
E0h - ROM page EXRANSION
E1h - ROM page TR-DOS
E2h - ROM page BASIC-128
E3h - ROM page BASIC-48
E4h - ROM page EXRANSION
===== PAGE 31 =====
13 ДЕШИФРАЦИЯ ПЗУ/КЭШ/КОНТРОЛЛЕРЫ/И Т.П. 31
E5h - ROM page TR-DOS
E6h - ROM page BASIC-128
E7h - ROM page BASIC-48
E8h - RAM page (окно 0000-3FFF)
E9h - RAM page (окно 4000-7FFF)
EAh - RAM page (окно 8000-BFFF)
EBh - ROM page SYSTEM
ECh - RAM page CASHE
EDh..EEh - reserved
EFh - ROM page SYSTEM
F0h..FFh - RAM pages (окно C000-FFFF)
О последних 16-ти номерах поподробнее. Установка в какой либо порт значения от F0h до FFh приве-
дет к одному и тому же результату, что и просто установка в этот порт значения F0h. В схеме сделана
переадресация номера порта так, что при значении FXh номер порта берется как F0h+SpectrumPAGE, где
SpectrumPAGE - номер спектрумовской страницы, адресуемой по портам 7FFD и 1FFD. Таким образом
достигается совместимость с Пентагоном и Скорпионом по распределению памяти и делается возможным
установка любого номера страницы спринтеровской памяти для любой страницы Спектрума.
13.2 Конкретные адреса портов, используемые в Sprinter-е
В предыдущей секции было рассказано, как устанавливать порты. Здесь же приводятся данные по уже
установленным портам в в конкретных конфигурациях.
Здесь я приведу адресацию портов для конфигураций Sprinter-1 и Sprinter-2. Сразу отмечу, что эти
адреса легко могут быть изменены простой программой, в случае появления такой необходимости.
Стандартные порты.
#FE – RD_KBD – порт клавиатуры
#FE – WR_BRD – порт бордюра
#7FFD – порт расширения ZX-Spectrum 128k
#1FFD – порт расширения Scorpion ZS-256
#1F,#0F RD_KEMPS – порт джойстика. В конфигурации Sprinter-1 порт #1F аппаратно переадресу-
ется на порт #0F #BFFD, #FFFD AY-PORTS порты AY-сопроцессора (ZX-Spectrum-256/AY)
Не совсем стандартные порты.
#FB, #4F порт COVOX-а.
Дополнительные 8-битные порты Sprinter-а.
#82 – PAGE0 – страница ОЗУ, подключаемая вместо ПЗУ через порт #1FFD
#A2 – PAGE1 – страница ОЗУ, подключенная по адресу #4000
#C2 – PAGE2 – страница ОЗУ, подключенная по адресу #8000
#E2 – PAGE2 – страница ОЗУ, подключенная по адресу #C000 Здесь надо отметить особо, через порт
#E2 можно изменить любую из 16-ти страниц скорпионовского распределения памяти.
#89 RGADR и PORT_Y – вертикальная координата точки на графическом экране или страница
VIDEO-RAM для спектрумовского режима
#C9 – RGMOD – порт режима экрана. Переключает страницы режима экрана.
#3C, #7C SYS_PORT – системный порт трогать не рекомендуется
#10..#1F,#EE,#EF,#F0,#F1,#F4 внутренние порты Z84C15. В отличие от остальных, эти адреса
изменить невозможно, так как они находятся вне ПЛМ.
Порты страниц ОЗУ открыты как на запись, так и на чтение. Это позволяет легко выполнять программы,
использующие переключение страниц, а затем возвращать эти страницы назад. При работе BIOS-а все
страницы сохраняются.
Дополнительные 16-тибитные порты Sprinter-а.
===== PAGE 32 =====
14 СБРОС. 32
#xx50..#xx55 порты HDD – использовать внешними программами не рекомендуется. Функции
работы с HDD записаны в ПЗУ.
Скрытые порты Sprinter-а.
Скрытыми являются порты которые недоступны в конкретный момент времени, но могут стать доступ-
ными после проведения изменений в карте портов. Их адреса не указываются, так как они могут быть
выставлены в любое место.
Порт ПЗУ BASIC48
Порт ПЗУ BASIC128
Порт ПЗУ TR-DOS
Порт ПЗУ EXPANSION
Порт ПЗУ SYSTEM
Через эти порты можно установить новые прошивки ПЗУ. Для этого их достаточно записать в ОЗУ
с номерами страниц меньше #80 и записать в соответствующий порт номер этой страницы. При таком
подключении страницы Эти страницы будут защищены от записи.
Частично скрытыми, так же являются и порты #7FFD, #1FFD в обычном состоянии они доступны
только на запись, но значения, записываемые в эти порты можно прочитать, открыв соответствующие
порты на чтение.
В других конфигурациях может отсутствовать часть портов или присутствовать новые порты.
14 Сброс.
Простой сброса может быть осуществлен записью в страницу #A0, установленную в расширенную
страницу Scorpion-овского распределения портов, т.е. следующей программой:
SOFT_RESET:
DI
LD A,16
LD BC,1FFDh
OUT (C),A
LD A,0A0h
OUT (PAGE3),A
LD (0C000h),A ; в этот момент подается RESET
DI ; глюкоуловитель
HALT
Более сложные варианты сброса, с перегрузкой прошивок, осуществляются через BIOS.
14.1 Старт машины
Описание старта на программном уровне (часть от Дениса)...
14.2 Доступ к HDD через память.
Доступ через память, как пример, программа Video...
В данный момент на плате sp2000 отсутствует.
Часть III
Прошивки ПЛМ
Перегузка через BIOS
===== PAGE 33 =====
15 SPRINTER-1 33
15 Sprinter-1
Перечисление всего что есть. Описание возможностей.
15.1 Режимы Spectrum-128/Scorpion-256/Pentagon-512
Соответственно. Пример программного переключения.
15.2 Доступ к функциям биоса и портам.
Список портов доступных/недоступных в конктретных конфигурациях.
16 Sprinter-2
Добавления/убавления относительно Sprinter-1
16.1 Акселератор, блочные операции AND, OR, XOR
Описание акселератора с примерами.
17 Game-1
Описание прошивки, добавление/убавление относительно Sprinter-2
17.1 Акселератор + Covox-Blaster
Использование COVOX-Blaster-а совместно с акселератором.
18 Doom
Добавление относительно Game-1
18.1 Акселератор с растяжением линий
Описание акселератора с растяжениями. Пример программые растяжениями, плюс ссылка на исходник
Doom-Demo.
19 Video
Особенности прошивки Video. Использование считывания с HDD прямо в экран.
19.1 Режим экрана 160x128
Дополнения к описанию режимов экрана...
===== PAGE 34 =====
34
Часть IV
Программирование с использованием функций
БИОС-а.
20 Функции биоса
Вызов функций производится через вход в TR-DOS 3D13h. Номер команды задается в регистре C.
Установленный на выходе флаг C означает завершение работы функции с ошибкой.
При работе части функций биоса необходимо что бы стек находился в области 8000h..0BFFFh, так как
они используют для своей работы переключение страниц PAGE1 и PAGE3. Для устранения каких либо
неприятностей связанных со стеком его следует всегда устанавливать в этот диапазон при вызове функций
биоса Спринтера.
Вызов функций биос так же может быть осуществлен через вход по RST 18h при подключенном систем-
ном ПЗУ, а так же через RST 8 при подключенном ОЗУ в нулевой банке путем установки на адрес RST 8
небольшой программы, переключающейся в ПЗУ биоса
Для подключения системного ПЗУ можно воспользоваться такой последовательностью команд:
DI
LD A,0
OUT (07Ch),A ; после этого в 0-м адресе будет включена ПЗУ биоса
; и программа может вызывать функции через RST 18h,
; просто заменяя этим вызовом вызов CALL 3D13h
; * Обычные функции TR-DOS в этот момент не доступны
Что бы вернуться к обычному ПЗУ следует выполнить программу:
LD A,0
OUT (03Ch),A
Вызов из ОЗУ осуществляется через RST 8. При этом на адресе 8 должна располагаться такая програм-
ма:
PUSH AF
LD A,0
OUT (07Ch),A ; в этом месте вместо ОЗУ подключится ПЗУ биоса и
; программа уйдет в него.
POP AF ; На эту команду происходит возврат при таком
; вызове биоса.
RET
; Оптимизация кода в этом месте недопустима. Вместо LD A,0 можно установить
; две команды XOR A и DI
Далее вызов функций осуществляется аналогично RST 18h, но следует помнить, что адресное пстранство
0000..3FFF во время работы биоса занято ПЗУ и в нем не могут располагаться данные для работы функций.
Вызов новых функций через 3D13h автоматически отключает прерывания. После исполнения функции
программа должна включить их при необходимости. Если необходимо что бы прерывания были включены
все время, следует использовать режим IM 2, с таблицей, стеком и обработчиком расположенным в области
8000h..BFFFh и пользоваться вызовом через RST 18h или RST 8 В этом случае прерывания в биосе не
отключаются.
===== PAGE 35 =====
20 ФУНКЦИИ БИОСА 35
20.1 Работа с памятью
EMM_FN0: ; определение объемов ОЗУ
LD C,0C0h ; функция номер 0C0h
CALL 3D13h ; HL - общий объем памяти в страницах по 16kb
; BC - объем свободной памяти в страницах по 16kb
EMM_FN1: ; инициализация распределения памяти
; стирается вся информация о выделенных ранее блоках
; ОЗУ. Устанавливаются как занятые блоки с
; системной информацией, а так же первые 256kb ОЗУ
LD C,0C1h ; функция номер 0C1h
CALL 3D13h ; выходных параметров нет
EMM_FN2: ; выделение блока ОЗУ
LD B,num_pages ; запрашиваемое число страниц ОЗУ
LD C,0C2h ; номер функции
CALL 3D13h ; NC -> А - идентификатор блока
; CF -> A=1 - нет памяти
EMM_FN3: ; освободить блок ОЗУ
LD A,id_blk ; идентификатор блока
LD C,0C3h ; номер функции
CALL 3D13h ; NC - нормальное завершение
; CF - неверный идентификатор блока
; правильность идентификатора отслеживается не всегда
EMM_FN4: ; получить физический номер страницы из блока
LD A,id_blk ; идентификатор блока
LD B,page ; логическая страница в блоке
LD C,0C4h ; номер функции
CALL 3D13h ; NC -> А - физический номер страницы
; CF -> А=0 - нет такого блока, A=FF - конец блока
EMM_FN5: ; получить список физических страниц блока
LD A,id_blk ; идентификатор блока
LD HL,bufer ; буфер длиной 256 байт для размещения списка
; буфер должен быть длиной на единицу больше числа
; страниц в блоке
LD C,0C5h ; номер функции
CALL 3D13h ; NC -> HL - тот же буфер, B - число страниц в блоке
; данные по адресу HL - список физических страниц по
; порядку. Список заканчивается байтом FF
; CF -> неверный идентификатор блока. Старая
; информация в буфере может быть затерта
EMM_FN6: ; Получение адресов портов окон
LD A,win_num ; номер окна проецирования 0,1,2 или 3
LD C,0C6h ; номер функции
CALL 3D13h ; NC -> C - 8-мибитный адрес порта, B - номер
; подключенной в данный момент страницы ОЗУ
; CF -> ошибка номера окна
; Функция фактически не используется в данный момент. Адреса портов окон
; не изменялись с самого начала разработки компьютера и, надеюсь, не будут
; меняться. Для соблюдения приличий программисту следует хотя бы один раз
===== PAGE 36 =====
20 ФУНКЦИИ БИОСА 36
; вызвать эти функции и сравнить адреса портов с теми, что используются в
; программе и, если они не совпадают, выдать соответствующее предупреждение.
; В данный момент эти порты таковы: PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h,
; PAGE3=0E2h
EMM_FN7: ; получить следующую страницу блока по предыдущему
LD A,page ; физическая страница блока
LD C,0C7h ; номер функции
CALL 3D13h ; NC -> A - следующая физическая страница блока
; A=FF - индицирует конец блока
; CF -> ошибка номера страницы
; Информация о распределении памяти хранится в виде RAM Allocation Table,
; похожей на дисковый FAT. Поэтому нахождение физического номера следующей
; страницы по предыдущему физическому номеру происходит значительно быстрее,
; чем поиск по увеличенному на единицу логическому номеру.
EMM_FN8: ; слияние блоков
LD A,id_blk1 ; блок номер 1
LD B,id_blk2 ; блок номер 2
LD C,9Eh ; номер функции
CALL 3D13h ; NC -> A - блок результата
; CF -> ошибка, неверный номер блока
EMM_FN9: ; разделение блока
LD A,id_blk1 ; блок
LD B,len_blk ; новая длина блока
LD C,9Dh ; номер функции
CALL 3D13h ; NC -> A - блок результата, B - блок остатка
; CF -> ошибка, неверный номер блока
20.2 Работа с блоками как с RAM-Disk-ами
BLK_RD_WR: ; чтение/запись из/в блок(а) памяти секторами
; по 256 байт
LD HL,bufer ; адрес буфера данных
LD DE,sector ; абсолютный номер сектора
LD B,sec_num ; число секторов
EX AF,AF
LD A,command ; команда 0 - чтение, FF - запись
EX AF,AF
LD A,id_blk ; идентификатор блока
LD C,0C8h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> ошибка идентификатора
; * функция на бета-тестировании...
BLK_TO_RAMD: ; назначить блок памяти RAM-Disk-у
; любой блок памяти может содержать данные
; RAM-Disk-а в формате TR-DOS для подключения этих
; данных в качестве диска и служит эта функция
LD A,ram_disk ; номер RAM-Disk-а 0..15 - соответствует
; RAM-Disk-ам от e: до t:
LD B,id_blk ; идентификатор блока
===== PAGE 37 =====
20 ФУНКЦИИ БИОСА 37
LD C,0C9h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> ошибка: неверный номер RAM-Disk-а или
; RAM-Disk занят
RAMD_CLEAR: ; освободить RAM-Disk
; освобождение RAM-Disk-а не есть освобождение
; блока ОЗУ. Это просто отключение блока ОЗУ от
; RAM-Disk-а
LD A,ram_disk ; номер RAM-Disk-а - 0..15
LD C,0CAh ; номер функции
CALL 3D13h ; NC -> нормальное завершение, B - идентификатор
; блока отключенного от RAM-Disk-а
; CF -> ошибка: неверный номер RAM-Disk-а или
; RAM-Disk был свободен
GET_RAMD_ST: ; получение идентификатора блока, назначенного на
; RAM-Disk
LD A,ram_disk ; номер RAM-Disk-а 0..15
LD C,0CEh ; номер функции
CALL 3D13h ; NC -> A - идентификатор блока.
; A=0 - блок не назначен.
; CF -> ошибка номера RAM-Disk-а
20.3 Управление назначением на дисководы
Каждый из 4-х дисководов TR-DOS может быть переназначен для работы с RAM-Disk-ами, винчестером
и реальными дисководами.
RAMD_TO_DRV: ; назначение RAM-Disk на дисковод.
LD A,ram_disk ; номер RAM-Disk-а
LD B,drive ; номер дисковода 0..3 - соответствует дисководам
; A:, B:, C:, D:
LD C,0CBh ; номер функции
CALL 3D13h ; NC -> нормальние завершение
; CF -> ошибка: неверный номер драйва или рамдиска
FDD_TO_DRV: ; назначение реального дисковода
LD А,disk_drive ; номер физического дисковода 0..3
LD B,drive ; номер драйва 0..3
; Номер физического дисковода и номер драйва должны
; совпадать, так как компьютер не имеет
; электрической схемы переключения дисководов на
; разные буквы. В будущих версиях железа, возможно,
; это появится.
LD C,0CCh ; номер функции
CALL 3D13h ; NC -> нормальние завершение
; CF -> ошибка: неверный номер драйва или дисковода
HDD_TO_DRV: ; назначение винчестера на дисковод
LD A,hdd_drive ; Номер винчестера. Должен быть 0. В дальнейшем
; будет иметь значения от 0 до 15 для подключения
; различных разделов и master/slave
LD B,drive ; номер драйва 0..3
LD C,0CDh ; номер функции
===== PAGE 38 =====
20 ФУНКЦИИ БИОСА 38
CALL 3D13h ; NC -> нормальние завершение
; CF -> ошибка: неверный номер драйва или винчестера
GET_DRV_ST: ; получить тип назначения на драйв
LD A,drive ; номер драйва 0..3
LD C,0CFh ; номер функции
CALL 3D13h ; NC -> нормальние завершение. A - тип назначения
; A=0..3 - назначен реальный дисковод A:, B:, C:, D:
; A=4..19 - назначен RAM-Disk - A = ram_disk + 4
; A=40h..4Fh - назначен винчестер (40h+hdd_drive)
; CF -> ошибка номера драйва
20.4 Функции управления железом и определение версии
FN_VERSION: ; выдача информации о версии биоса и железа
LD HL,bufer ; буфер, куда будет помещена ASCIIZ строка с
; названием и номером версии, конец строки отмечен
; нулем.
LD C,0EFh ; номер функции
CALL 3D13h ; NC -> HL - тот же буфер с записанной строкой.
; DE - версия биоса
; BC - версия железа
; BC=FFFF - not identifyed
; BC=FFFE - Sprinter-1
; BC=FFFD - Sprinter-2
; BC=FFFC - Spectrum + AY8910
; BC=FFFB - Game-1
; BC=FFFA - Video-1
; BC=FFF9 - DooM
; Иные значения BC - новые прошивки
; версия железа выдается только
; в биосах версий 1.16 и выше
; CF -> ошибка. Очень старая версия, не имеющая
; данной функции
SPRINTER_1: ; переключение в конфигурацию Sprinter-1
LD C,0F0h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> функция не исполнена, фатальная ошибка
; машину следует перезапустить по RESET
SPRINTER_2: ; переключение в конфигурацию Sprinter-2
LD C,0F1h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> функция не исполнена, фатальная ошибка
; машину следует перезапустить по RESET
SPRINTER_ALL: ; переключение конфигурации пользователя
LD A,page_cnf ; страница с файлом прошивки для ПЛМ EPF10K10
; страница не может иметь номер больше 127
; Файл прошивки, естественно должен быть уже
; загружен в эту страницу
LD C,0F3h ; номер функции
CALL 3D13h ; NC -> нормальние завершение
===== PAGE 39 =====
20 ФУНКЦИИ БИОСА 39
; CF -> функция не исполнена, фатальная ошибка
; машину следует перезапустить по RESET
; Перед исполнением функций SPRINTER_1, SPRINTER_2 и SPRINTER_ALL биос
; проверяет загруженную прошивку по идентификатору. Если требуемая
; прошивка совпадает с текущей, то операция перезагрузки ПЛМ не
; производится.
; Во время исполнения этих функций наблюдается сбой синхронизации монитора,
; так как в этот момент происходит изменение всей схемы компьютера и
; сигналы синхронизации монитора просто отсутствуют.
FN_SINC: ; установка синхронизации, очистка режима экрана
; функция может быть отнесена и к группе функций
; вывода на экран, так как полностью очищает
; страницы режима экрана. На всем экране остается
; только бордер
LD A,sinc_mode ; режим синхронизации
; A=0 режим по умолчанию - используется для очистки
; страниц режима (отключения вывода всех окон)
; A=1 режим Scorpion - 312 строк в экране,
; положение INT-а, как в Scorpion-256
; A=2 режим Pentagon - 320 строк в экране,
; положение INT-a как в Pentagon-128
LD C,0F2h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> неверный номер режима синхронизации
; изменение режима синхронизации может привести к временному сбою
; синхронизации монитора.
; DCP_FN0: ; функция управления дешифратором портов.
; LD C,0F4h ; В данный момент не доделана
; Функция позволит открывать/закрывать дополнительные порты компьютера
SET_PORTS: ; глобальная установка портов
LD A,port_num ; внутренний номер порта
; F0..FF - страницы Scorpion 0..15, подключаемые в
; адрес 0C000h, страница именно та, которая
; подключена в данный момент через 7FFD,1FFD
; E0=EXPANSION, Е1=TR-DOS, E2=BASIC-128, E3=BASIC-48
; E4=EXPANSION,Е5=TR-DOS,E6=BASIC-128,E7=BASIC-48
; E8=RAM0, E9=RAM1, EA=RAM2, EB=SYS0, EC=CASH
; ED,EE - reserv, EF=SYS1
; C0=COPY_1FFD, C1=COPY_7FFD, C2=COPY_BRD, C3-reserv
; C4-reserv, C5=COPY_V_MODE, C6=COPY_SYS, C7-reserv
; C8..CF - альтернативный набор для C0..C7
; D0..DF-reserv - доп. страницы для Pentagon-512
; 80..BF-user_ports!
; 00..7F-внешние порты, использовать не рекомендуется
LD B,port_data ; данные, записываемые в страницу
LD C,0F8h ; номер функции
CALL 3D13h ; B - предыдущее содержание порта
READ_PORTS: ; глобальное чтение портов
LD A,port_num ; внутренний номер порта
===== PAGE 40 =====
20 ФУНКЦИИ БИОСА 40
LD C,0F9h ; номер функции
CALL 3D13h ; B - содержание порта
WRITE_PORTS: ; глобальная запись портов
LD A,port_num ; внутренний номер порта
LD B,data_port ; записываемые данные
LD C,0FАh ; номер функции
CALL 3D13h ;
; Функции SET_PORTS, READ_PORTS и WRITE_PORTS позволяют иметь доступ
; к любым портам компьютера независимо от того, открыты они или нет.
; В данный момент функции недоступны и находятся в разработке
; С помощью этих функций будет возможно прочитать содержимое портов 1FFD и
; 7FFD, например, а так же установить нужные значения в закрытые системные
; порты. Порты User-а позволят эмулировать некоторые устройства,
; отсутствующие в Спринтере, а так же могут дать особый способ
; передачи данных между программами, минуя ОЗУ.
CMOS_RD: ; читать из регистра CMOS
LD C,0F6h ; номер функции
LD D,cmos_reg ; номер регистра CMOS
CALL 3D13h ; NC - часы есть
; CF - часов нет
CMOS_WR: ; писать в регистр CMOS
LD C,0F7h ; номер функции
LD D,cmos_reg ; номер регистра CMOS
CALL 3D13h ; NC - часы есть
; CF - часов нет
Функции CMOS_RD,CMOS_WR работают всегда. Если в машине нет микросхемы CMOS,
она эмулируется. Наличие микросхемы определяется функцие CMOS_TEST.
CMOS_TEST: ; проверить наличие CMOS
LD C,0F5h ; номер функции
CALL 3D13h ; NC - часы есть
; CF - часов нет
FN_TURBO: ; функция управления турбо режимом.
LD A,turbo_mode ; режим турбо: 2 - off, 3 - on
LD C,08Fh ; номер функции
CALL 3D13h ; NC -> исполнение
; CF -> неверный режим турбо
; * переключение режима турбо может не произойти, если прошивка не
; поддерживает это переключение. При этом ошибки не происходит.
20.5 Функции печати и управления режимом экрана
WIN_OPEN: ; функция открытия окна.
LD IX,win_descriptor ; описатель окна
; IX - 32-хбайтовый описатель окна
; (IX+0) - горизонтальный размер окна в знакоместах
; (IX+1) - вертикальный размер в знакоместах
; (IX+2) - положение окна по горизонтали на экране
===== PAGE 41 =====
20 ФУНКЦИИ БИОСА 41
; (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) - зарезервировано (переменные окна)
LD E,win_flag ; флаги окна
; бит 0 указывает какую страницу режима включать
; после исполнения функции
; бит 4 указывает на какой странице режима
; открывать окно
LD HL,win_place ; HL - место на экране по знакоместам
; (копия в IX+2,3), в новых версиях биоса значение
; HL не существенно
LD C,0B0h ; номер функции
CALL 3D13h ; NC -> A - номер окна
; CF -> ошибка слишком много окон
LD (id_win),A ; сохранить идентификатор окна
; * При открытии окна описатель копируется в системную страницу ОЗУ и
; программа может не сохранять его.
; ** В данный момент идентификатор окна всегда равен 0
Видео-ОЗУ Спринтера можно представить как одно сплошное поле графики размером 1024 точки по
горизонтали на 256 точек по вертикали Положение в поле графики показывает где будет находиться в этом
поле верхний левый угол окна. Положение исчисляется в знакоместах. Т.е. Если указано положение по X
– 2, по Y – 6, это означает, что верхний угол окна будет расположен по координатам X=16, Y=48 в поле
графики видео-ОЗУ Таким образом, если, например, открыть два окна в разных местах, но с одинаковыми
координатами в поле графики, на экране окажутся два идентичных окна, данные в которые будут попадать
одновременно.
Знакогенераторы текстовых режимов так же располагаются в видео-ОЗУ и имеют конкретные адреса
в поле графики. При необходимости иметь на экране как графическое, так и текстовое изображение надо
следить, что бы данные графических окон не попадали в поле графики, где расположены знакогенераторы
При использовании какого либо знакогенератора, он занимает часть поля графики по координатам (ко-
ординаты в знакоместах, т.е. в значениях байта IX+6 описателя окна)
X = (8 (bit3..0 of mode))..(8 (bit3..0 of mode) + 7)
По Y занимаются все положения. Таким образом, при использовании нескольких знакогенераторов сна-
чала следует использовать знакогенераторы с номерами меняющимися в Bit7..6, так как они попадают в
одни и те же координаты поля графики
При открытии графических окон следует помнить, что в этот момент информация текстового экрана
находящаяся в этом месте будет утеряна. При открытии текстового окна изменяется информация только
в поле графики знакогенератора соответствующему этому текствовому экрану. Если эта информация и
информация графического окна не пересекались, то при повторном открытии графического экрана, на нем
автоматически восстановится графическая картинка
===== PAGE 42 =====
20 ФУНКЦИИ БИОСА 42
WIN_CLOSE: ; закрытие окна
LD A,(id_win) ; идентификатор окна (пока должен быть 0)
LD C,0B1h ; номер функции
CALL 3D13h ; NC -> успешное завершение
; CF -> ошибка - неверный идентификатор
; Окно с номером 0 никогда не закрывается и попытка
; закрытия приводит к ошибке
LP_OPEN_S: ; Открытие стандартных окон.
LD E,win_flag ; флаги окна
; bit 0 определяет страницу режима, которая будет
; открыта после исполнения функции
LD C,080h ; номер функции
LD B,win_type ; тип открываемого окна
; 0 - спектрумовское окно 32x24
; 1 - текстовое окно 64x24
; 3 - текстовое окно 80x32
; 4 - спектрумовское окно, HL - положение окна
; 5 - текстовое окно 64x24, HL - положение окна
; 7 - текстовое окно 80x32, HL - положение окна
; 8 - графическое окно 0, HL - положение окна
; 9 - графическое окно 1, HL - положение окна
LD HL,win_place ; положение окна для 4..9 типов
CALL 3D13h ; выполнить функцию
; ** Функция старая, использовать не рекомендуется.
; Далее, в функциях запоминания, восстановления, перемещения и стирания
; подразумеваются локальные окна в смысле "окно в окне". Идентификатор окна
; относится к глобальному окну, отнисительно которого адресуются локальные
WIN_COPY_WIN: ; копирование данных текстового окна в память
; запоминание окна
LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0)
LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь
LD L,hor_size ; размер в символах
LD D,ver_place ; DE - положение локального окна в глобальном окне
LD E,hor_place ; положение по горизонтали в символах
LD IX,bufer ; адрес буфера для запоминания данных локального окна
EX AF,AF
LD A,bufer_page ; страница буфера для данных окна
EX AF,AF’ ; адрес буфера указывается для окна 0C000h
; если адрес указан с 8000h, номер страницы буфера
; не действителен
LD C,0B2h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> ошибка - неверный идентификатор окна
; при работе этой функции через RST 18h или RST 8, обязательна установка
; DI, так как функция пользуется стеком для ускорения своей работы.
WIN_RESTORE_WIN: ; копирование данных из памяти в текстовое окно
; восстановление окна
LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0)
===== PAGE 43 =====
20 ФУНКЦИИ БИОСА 43
LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь
LD L,hor_size ; размер в символах
LD D,ver_place ; DE - положение локального окна
LD E,hor_place ; положение по горизонтали в символах
LD IX,bufer ; адрес буфера данных для локального окна
EX AF,AF
LD A,bufer_page ; страница буфера данных окна
EX AF,AF’ ; адрес буфера указывается для окна 0C000h
; если адрес указан с 8000h, номер страницы буфера
; не действителен
LD C,0B3h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> ошибка - неверный идентификатор окна
; при работе этой функции через RST 18h или RST 8, обязательна установка
; DI, так как функция пользуется стеком для ускорения работы.
; Данные для функций WIN_COPY_WIN и WIN_RESTORE_WIN имеют одинаковую
; структуру В данный момент эта структура похожа на структуру текстового
; экрана IBM, т.е. данные идут в формате sym1,atr1,sym2,atr2,.. сплошным
; массивом. Сначала данные для первой строки, затем сразу для второй и т.д.
WIN_GET_SYM: ; взять символ с экрана
LD A,(id_win) ; идентификатор окна (пока должен быть 0)
LD DE,place ; положение символа: D - вертикаль, E - горизонталь
LD C,0B4h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; L - символ, H - атрибут, B - знакогенератор
; CF -> ошибка неверный идентификатор окна
WIN_PUT_SYM: ; положить символ на экран
LD A,(id_win) ; идентификатор окна (пока должен быть 0)
LD DE,place ; положение символа: D - вертикаль, E - горизонталь
LD B,sym_zg ; знакогенератор
LD L,symbol ; символ
LD H,atribute ; атрибут символа
LD C,0B5h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> ошибка неверный идентификатор окна
WIN_SET_ZG: ; установка знакогенератора
LD A,sym_zg ; системный номер знакогенератора
LD DE,zg_form ; указатель на 2Kb данных знакогенератора
; Данные знакогенератора должны располагаться в таком виде, в каком они
; выглядели бы как набор символов на спектрумовском экране при переносе 2Kb
; LDIR-om в адрес 4000h
; * В будущем возможно изменение этого расположения на обычное
LD C,0B6h ; номер функции
CALL 3D13h ; NC -> завершение
; CF -> ошибка (старая версия, нет функции)
WIN_MOVE_WIN: ; перемещение окна
LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0)
LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь
===== PAGE 44 =====
20 ФУНКЦИИ БИОСА 44
LD L,hor_size ; размер в символах
LD D,ver_place ; DE - положение локального окна
LD E,hor_place ; положение по горизонтали в символах
LD IX,new_place ; новое положение локального окна
LD C,0B2h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> ошибка - неверный идентификатор окна
; при работе этой функции через RST 18h или RST 8, обязательна установка
; DI, так как функция пользуется стеком для ускорения работы.
; Даллее следуют функции печати для работы с _текущим_ глобальным окном.
; В данный момент текущим всегда является последнее открытое окно
; На графическом экране функция не работает
LP_PRINT_ALL: ; печать символов с атрибутом
LD A,symbol ; символ
LD E,atribute ; атрибут
LD B,num_sym ; число выводимых символов
LD C,081h ; номер функции
CALL 3D13h ; на экран выводится строка из B одинаковых
; символов
; регистры HL,IX - сохраняются
LP_PRINT_SYM: ; Вывод символов на экран с текущего
; знакоместа без атрибута
LD A,symbol ; символ
LD B,num_sym ; число выводимых символов
LD C,082h ; номер функции
CALL 3D13h ; на экран выводится строка из B одинаковых символов
; атрибут остается тот, который был на экране
; регистры HL,IX - сохраняются
LP_PRINT_ATR: ; печать атрибутов
LD E,atribute ; атрибут
LD B,num_sym ; число выводимых символов
LD C,083h ; номер функции
CALL 3D13h ; на экран выводится строка из B одинаковых
; атрибутов. Символы не меняются.
; регистры HL,IX - сохраняются
LP_SET_PLACE: ; Установка текущего знакоместа в окне
LD E,hor_place ; номер символа по горизонтали
LD D,ver_place ; номер символа по вертикали
; ** Превышение границ приводит не к ошибке, а к
; переустановке сначала, за вычетом полного
; размера окна
LD C,084h ; номер функции
CALL 3D13h ; позиция печати устанавливается в соответстии с
; регистром DE
LP_PRINT_LN: ; Вывод строки символов на экран с текущего
; знакоместа
LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh
LD E,atribute ; атрибут, с которым будет выведена строка
===== PAGE 45 =====
20 ФУНКЦИИ БИОСА 45
LD B,num_sym ; длина выводимой строки
LD C,085h ; номер функции
CALL 3D13h ; "исполнение желаний"
LP_PRINT_LN2: ; Вывод строки символов на экран с текущего
; знакоместа без атрибутов
LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh
LD B,num_sym ; длина выводимой строки
LD C,086h ; номер функции
CALL 3D13h ; строка будет выведена без изменения атрибутов в
; месте печати
LP_PRINT_LN3: ; Вывод строки символов на экран с текущего
; знакоместа до разделителя. После разделителя
; выводятся пробелы что бы вывести B символов
LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh
LD E,atribute ; атрибут, с которым будет выведена строка
LD D,delimiter ; разделитель
LD B,num_sym ; длина выводимой строки
LD C,087h ; номер функции
CALL 3D13h ; символы из (HL) выводятся на экран, пока не
; встретится символ равный D, далее печатаются
; пробелы, как дополнение строки до B символов
LP_PRINT_LN4: ; Вывод строки символов длиной B на экран с текущего
; знакоместа до разделителя D, без атрибутов.
LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh
LD D,delimiter ; разделитель
LD B,num_sym ; длина выводимой строки
LD C,088h ; номер функции
CALL 3D13h ; символы из (HL) выводятся на экран, пока не
; встретится символ равный D, далее печатаются
; пробелы, как дополнение строки до B символов
; атрибуты не изменяются
LP_CLS_WIN: ; очистка экрана
LD DE,place ; положение локального окна (глобальное = текущее)
LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь
LD L,hor_size ; размер в символах
LD B,atribute ; атрибут очистки
LC C,089h ; номер фунции
CALL 3D13h ; выполнение. Произворится выводом пробелов с
; заданным атрибутом
LP_SCROLL_UD: ; Скроллинг части глобального окна вверх/вниз
LD B,scroll_type; тип скроллинга 1 - вверх/ 2 - вниз
LD D,beg_line ; начальная строка скроллинга
LD E,num_lines ; число скроллируемых строк
LD C,08Ah ; номер функции
CALL 3D13h ; выполнение. Скроллируются полные строки
; глобального окна
===== PAGE 46 =====
20 ФУНКЦИИ БИОСА 46
LP_PRINT_LN5: ; Вывод строки символов на экран с текущего
; знакоместа до разделителя после разделителя
; вывод останавливается
LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh
LD E,atribute ; атрибут, с которым будет выведена строка
LD B,num_sym ; максимальная длина выводимой строки
LD C,08Bh ; номер функции
CALL 3D13h ; символы из (HL) выводятся на экран, пока не
; встретится символ равный D или количество
; символов не превысило B. Далее происходит
; возврат
LP_PRINT_LN6: ; Вывод строки символов на экран с текущего
; знакоместа до разделителя после разделителя
; вывод останавливается, без атрибутов
LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh
LD B,num_sym ; максимальная длина выводимой строки
LD C,08Ch ; номер функции
CALL 3D13h ; символы из (HL) выводятся на экран, пока не
; встретится символ равный D или количество
; символов не превысило B. Далее происходит
; возврат. Атрибуты не выводятся
LP_CLS_WIN2: ; очистка экрана, указанием символа заполнения
LD DE,place ; положение локального окна (глобальное = текущее)
LD H,ver_size ; HL - размер окна вертикаль/горизонталь
LD L,hor_size ; размер в символах
LD A,symbol ; символ очистки
LD B,atribute ; атрибут очистки
LC C,08Dh ; номер фунции
CALL 3D13h ; Выполнение. Произворится выводом пробелов с
; заданным атрибутом и символом
LP_GET_PLACE: ; получить текущее положение вывода на экран
; в глобальном окне
LD C,08Eh ; номер функции
CALL 3D13h ; в регистр DE будут положены координаты,
; в которых будет напечатан следующий символ
; D - вертикаль, E - горизонталь
20.6 Графические функции
; Координаты считаются от верхнего левого угла экрана
PIC_POINT: ; установить точку
LD DE,Y_coord ; координата по вертикали
LD HL,X_coord ; координата по горизонтали
LD A,(id_win) ; идентификатор граф. окна (пока должен быть 0)
LD B,color ; цвет точки
LD C,0A1h ; номер функции
CALL 3D13h ; поставить точку
===== PAGE 47 =====
20 ФУНКЦИИ БИОСА 47
; В действительности ставить точки на экране с помощью функции биоса,
; слишком медленно. Для этого лучше пользоваться прямым выводом данных
; на графический экран. Устройство экрана и способы прямого вывода
; графических данных описаны в файле архитектуры Спринтера.
PIC_SET_PAL: ; установка палитры
LD HL,pal_data ; данные палитры:
; список цветов по четыре байта B,G,R,Y
LD E,beg_color ; начальный цвет
LD D,num_colors ; количество устанавливаемых цветов
LD B,pal_mask ; маска при установке палитры. Для нормального
; режима должнa быть FF
LD A,page_pal ; номер палитры 0..15 значения от 8 до 15 резервные
LD C,0A4h ; номер функции
CALL 3D13h ; установка палитры
; данные палитры должны представлять собой список приблизительно такого вида:
DB blue1,green1,red1,0
DB blue2,green2,red2,0
.....................
DB blueN,greenN,redN,0
; N = num_colors. Значение num_colors равное 0 соответствует 256-ти цветам
; при записи в видео-ОЗУ все данные предварительно проходят функцию AND со
; значением pal_mask
Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в соответствующей палитре
нужно задать соответствующее значение bit7..6 в байте режима знакоместа
Страницы 4..7 соответствуют текстовому режиму и режиму «Spectrum» В странице 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 в этом месте не виден. Используя подобное задание
цветов текстового режима можно легко добиться совместимости по цветам как со Спектрумом, так и с IBM
SET_PAL_INIT: ; установка внутренней палитры.
LD A,PAL_PAGE ; страница палитры
LD B,PAL_N ; номер палитры
; 2 - установка спектрумовской палитры
; 1 - установка графической плаитры
LD C,0A6h ; номер функции
CALL 3D13h ; установка палитры
20.7 Работа с винчестером и дисками MS-DOS
HDD_INIT: ; инициализация винчестера
LD C,040h ; номер функции
CALL 3D13h ; NC -> нормальное завершение
; CF -> винчестер не найден
===== PAGE 48 =====
20 ФУНКЦИИ БИОСА 48
HDD_RECAL: ; рекалибровка винчестера
LD C,041h ; номер функции
; * Функция зарезервирована для дальнейшего использования
HDD_TEST_IDE: ; Тест наличия интерфейса IDE
LD C,042h ; номер функции
CALL 3D13h ; NC -> нормальние завершение
; в регистре B информация о наличии устройств
; bit0=1 - есть устройство "master"
; bit1=1 - есть устройство "slave"
; CF -> ошибка, аппаратная неисправность
HDD_PREPARE: ; подготовка винчестера к операции чтения/записи
LD C,043h ; номер функции
LD HL,bufer_adr ; адрес буфера данных
LD A,bufer_page ; страница буфера, если адрес в окне 0C000h
LD B,sec_num ; число секторов
LD DE,sec_low ; абсолютный номер сектора младшая часть
LD IX,sec_high ; абсолютный номер сектора старшая часть
CALL 3D13h ; При исполнении производится вся подготовка к
; операциям чтения/записи вычисление
; цилиндров/головок/секторов и занесение их в регистры винчестера
; далее программа может сама только подать команду читать/писать и
; самостоятельно производить считывание/запись данных в винчестер.
; Команда удобна для работы программ в реальном времени, когда необходимо
; кроме чтения/записи данных производить какие либо иные действия.
HDD_READ_BPB: ; читать BPB
LD C,044h ; номер функции
LD HL,bufer_adr ; адрес буфера для BPB
LD A,bufer_page ; страница буфера, если адрес в окне 0C000h
CALL 3D13h ; NC -> нормальное завершение
; CF -> ошибка
HDD_READ: ; читать сектора с винчестера
LD C,045h ; номер команды
LD HL,bufer_adr ; адрес буфера данных
LD A,bufer_page ; страница буфера, если адрес в окне 0C000h
LD B,sec_num ; число читаемых секторов
LD DE,sec_low ; абсолютный номер сектора младшая часть
LD IX,sec_high ; абсолютный номер сектора старшая часть
CALL 3D13h ; NC -> нормальное завершение
; CF -> ошибка
; ** При попадании межсекторного промежутка на адрес 0000h
; производится автоматическое переключение страницы ОЗУ по
; RAM Allocation Table.
HDD_WRITE: ; писать сектора на винчестер
LD C,046h ; номер команды
LD HL,bufer_adr ; адрес буфера данных
LD A,bufer_page ; страница буфера, если адрес в окне 0C000h
LD B,sec_num ; число записываемых секторов
LD DE,sec_low ; абсолютный номер сектора младшая часть
===== PAGE 49 =====
20 ФУНКЦИИ БИОСА 49
LD IX,sec_high ; абсолютный номер сектора старшая часть
CALL 3D13h ; NC -> нормальное завершение
; CF -> ошибка
; ** При попадании межсекторного промежутка на адрес 0000h
; производится автоматическое переключение страницы ОЗУ по RAM
; Allocation Table.
HDD_PART: ; настройка партиций и master/slave
LD C,047h
; * функция зарезервирована
; В ближайшее время в описание биоса будут добавлены функции работы с FDD и
; CD-ROM
; * В данный момент они имеются, но предполагается их серьезная переделка.
; Некоторые функции зарезервированы для дальнейшего развития. Так же не
; описана часть графических функций, так как они в данный момент подвергаются
; серьезным переделкам.
LD C,50H ; зарезервирована
DRV_RESET: ; Сброс контроллера и настройка на диск
LD A,drv_type ; бит 0..3 - номер устройства
; бит 4..7 - тип устройства
; 0 - дисковод
; 6 - ram-disk
; 8 - HDD
; C - CD-ROM
; остальные номера резервные
LD C,51h ;
CALL 3D13H ; NC - нормальное завершение
; CF - нет диска или нет устройства
LD C,52h ; зарезервировано
LD C,53h ; зарезервировано
DRV_VERIFY: ; проверка секторов
LD A,drv_type ; бит 0..3 - номер устройства
; бит 4..7 - тип устройства
; 0 - дисковод
; 6 - ram-disk
; 8 - HDD
; C - CD-ROM
LD HL,sec_h ; страшая часть номера сектора
LD IX,sec_l ; младшая часть номера сектора
LD B,n_sec ; количество секторов
LD C,54h ;
CALL 3D13h ; NC - нормальное завершение
; CF - проверка с ошибкой или нет устройства
DRV_READ: ; чтение с устройства
LD A,drv_type ; бит 0..3 - номер устройства
; бит 4..7 - тип устройства
; 0 - дисковод
===== PAGE 50 =====
20 ФУНКЦИИ БИОСА 50
; 6 - ram-disk
; 8 - HDD
; C - CD-ROM
LD HL,sec_h ; страшая часть номера сектора
LD IX,sec_l ; младшая часть номера сектора
LD B,n_sec ; количество секторов
LD DE,bufer_adr ; адрес буфер для чтения
LD C,55h ;
CALL 3D13h ; NC - нормальное завершение
; CF - ошибка чтения или нет устройства
DRV_READ: ; запись на устройства
LD A,drv_type ; бит 0..3 - номер устройства
; бит 4..7 - тип устройства
; 0 - дисковод
; 6 - ram-disk
; 8 - HDD
; C - CD-ROM
LD HL,sec_h ; страшая часть номера сектора
LD IX,sec_l ; младшая часть номера сектора
LD B,n_sec ; количество секторов
LD DE,bufer_adr ; адрес буфер для чтения
LD C,56h ;
CALL 3D13h ; NC - нормальное завершение
; CF - ошибка чтения или нет устройства
DRV_DETECT: ; определение параметров устройства
LD A,drv_type ; бит 0..3 - номер устройства
; бит 4..7 - тип устройства
; 0 - дисковод
; 6 - ram-disk
; 8 - HDD
; C - CD-ROM
LD C,57h ;
CALL 3D13h ; NC - нормальное завершение
; A - bit7 - 0 диск 720Кb
; 1 диск 1.44Mb
; CF - нет устройства или нет носителя
DRV_GET_PAR: ; получить параметры носителя
LD A,drv_type ; бит 0..3 - номер устройства
; бит 4..7 - тип устройства
; 0 - дисковод
; 6 - ram-disk
; 8 - HDD
; C - CD-ROM
LD C,58h ;
CALL 3D13h ; NC - нормальное завершение
; L - число секторов
; H - число головок
; DE - количество цилиндров
; IX - размер сектора в байтах
; B - доп. параметры
; для дискет бит7 - тип 1.44/720
===== PAGE 51 =====
21 ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ ПО ПРОГРАММИРОВАНИЮ 51
; если в HL,DE все FF - устройства нет
; CF - нет устройства
DRV_SET_PAR: ; установить параметры носителя
LD A,drv_type ; бит 0..3 - номер устройства
; бит 4..7 - тип устройства
; 0 - дисковод
; 6 - ram-disk
; 8 - HDD
; C - CD-ROM
LD L,n_secs ; L - число секторов
LD H,n_heads ; H - число головок
LD DE,n_cyls ; DE - количество цилиндров
LD IX,sec_size ; IX - размер сектора в байтах
LD B,ext_par ; B - доп. параметры
; для дискет бит7 - тип 1.44/720
LD C,59h ;
CALL 3D13h ; NC - нормальное завершение
; Функции не отмеченные как зарезервированные, старые или тестируемые,
; меняться скорее всего не будут.
21 Дополнительные сведения по программированию
21.1 Вывод на графический экран
В биосе имеются функции открытия графического экрана на весь экран 320x256 точек. После открытия
этого режима экран представляет собой. набор из 256-ти линий, длиной по 320 байт. Соседние точки в
линии - это соседние байты. Переключение линий производится через PORT_Y, в котором устанавливается
номер линии, выводимой на экран. Номера линий считаются сверху экрана, начиная с нулевой.
Для вывода в графический экран так же требуется открыть соответствующую страницу основного ОЗУ.
В этой странице будет содержаться копия видеоизображения.
Видео-ОЗУ является теневым ОЗУ, поэтому информация, находящаяся в основном ОЗУ, под которым
находится видео-ОЗУ не обязательно будет совпадать с информацией, находящейся в этом видео-ОЗУ.
Запись видео-данных может производиться и без перезаписи данных в оснвном ОЗУ, что оказывается
полезным при работе, например, со спрайтами. Для работы со спрайтами так же предусмотрен режим записи
в видео-ОЗУ с прозрачным цветом. В этом режиме информация, передаваемая в видео-ОЗУ проверяется на
наличие байта #FF. Если этот байт обнаруживается, то цикл записи пропускается и на экране в этом месте
остается те данные, какие были ранее. Таким образом на экране можно быстро прорисовывать спрайты,
представляющие из себя прямоугольные картинки с «прозрачными» цветами.
Пример программы вывода прямоугольной картинки на экран:
PAGE3 EQU #E2
RGADR EQU #89
LD A,#50 ; страница графического видеоэкрана
OUT (PAGE3),A ; установить в PAGE3
LD HL,Pucture ; адрес картинки (Прямые Данные)
LD DE,#C040+HorPlace ; положение картинки на экране по горизонтали
LD A,VerPlace ; положение картинки на экране по вертикали
OUT (RGADR),A
LD B,VerSize ; высота картинки
LOOP: PUSH DE ; запомнить положение на линии
PUSH BC ; запомнить счетчик высоты
===== PAGE 52 =====
52
LD BC,HorSize ; длина картинки
LDIR ; копировать линию
POP BC
POP DE
INC A ; следующая координата по Y
OUT (RGADR),A
DJNZ LOOP ; повторять нужное количество раз
Управление режимом вывода на экран (включение вывода с прозрачными цветами, отключение копиро-
вания в основное ОЗУ) осуществляется через младшие биты порта страницы графического экрана.
21.2 Особые режимы
Режим Bound, программирование режимом экрана (быстрые скроллинги).
21.3 Вывод палитр
Вывод палитры – функция БИОС.
Часть V
Программирование в TR-DOS (дополнительные
команды)
22 Работа с HDD и RAM-Disk через TR-DOS
Команды вводятся как обычно в TR-DOS строке побуквенно. Все команды доступные из командной
строки работают и из BASIC-а через:
RANDOMIZE USR 15619: REM:comand
При наборе команд через знак "/"следует иметь в виду, что лишние пробелы в начале мешают ее
исполнению (система распознает новую команду по знаку "/"в начале команды).
При наборе имен файлов MS-DOS допускаются звездочки и вопросики, по правилам: * – любой набор
символов, ? – один любой символ.
22.1 /HDT
/HDT – тест винчестера. Определяет тип винчестера и выводит на экран его марку. Если этого не
происходит, это значит, что винчестер либо неверно подключен, либо незовместим (бывает с очень старыми
моделями).
22.2 /HDD
/HDD – подключение винчестера к текущему диску A,B,C или D – к тому, на который указывает
TR-DOS в начале в командной строки.
22.3 /CAT, /DIR
/CAT /DIR – выдача каталога. Команды /CAT и /DIR идентичны по исполнению. Работают так же
команды типа:
/DIR *.trd – выдача каталога файлов с расширением .trd
===== PAGE 53 =====
22 РАБОТА С HDD И RAM-DISK ЧЕРЕЗ TR-DOS 53
/DIR a*.dm* – выдача файлов, имена которых начинаются на a, а расширения на dm
/DIR ??xm.* – выдача файлов, имена которых имеют четыре буквы и оканчиваются на xm
22.4 /LOAD, /SAVE
/LOAD x file.ext загрузка в RAM-Disk x файла file.ext RAM-Disk будет автоматически создан (или
пересоздан, если такой был)
Сокращенная команда:/file.ext – загрузка файла в RAM-Disk E
/SAVE x file.ext сохранение RAM-Disk-а в файла file.ext. При сохранении происходит замещение
содержания существующего файла. Новый не создается, длина файла не меняется.
При загрузке и сохранении работают и команды со звездочками и вопросиками, но выполняется толь-
ко с первым найденым файлом. Например, команда /*.* загрузит в RAM-Disk E самый первый файл с
винчестера.
ВНИМАНИЕ: Команда /SAVE на данный момент является единственной командой TR-DOS, которая
меняет содержимое винчестера. При своей работе она ЗАМЕЩАЕТ содержимое файла образом RAM-Disk-а.
Если длина файла меньше длины RAM-Disk, то запишется лишь часть данных RAM-Disk-а, по количеству
секторов файла.
22.5 /FDD
/FDD – подключение к текущему диску обычного дисковода. Если к этому диску был подключен
винчестер или RAM-Disk, то они будут отключены и доступ с этого диска будет осуществляться к обычной
дискете.
После команды /FDD работают все команды /SAVE, /LOAD, /DIR с дискетами в формате MS-DOS.
1.44 или 720 диск распознается автоматически.
После нее же работают и все стандартные команды TR-DOS, а так же расширенные команды из TR-
DOS-5.04Em.
22.6 /RMD
/RMD X – подключение к текущему диску рамдиска X (буквы от Е до S). После этой команды текущий
дисковод работает с RAM-Disk-ом в только формате TR-DOS. Выполняются все TR-DOS команды, в том
числе и FORMAT. При форматировании старое содержимое диска уничтожается, диск приобретает размер
640Kb и в него прописывается пустой каталог.
ВНИМАНИЕ! Если RAM-Disk не был создан или подгружен с винчестера или дискеты, все попытки
чтения каталога, файлов и т.п. приведут к появлению ошибки.
Создать RAM-Disk можно командой: FORMAT "name". Обязательно после того, как командой /RMD
X был подсоединен нужный RAM-Disk.
Подгрузка RAM-Disk-а осуществляется командой /LOAD. При этом RAM-Disk создается автоматиче-
ски. Работа с TR-DOS на этом RAM-Disk-е будет возможна только если подгруженный файл был образом
RAM-Disk-а. Если же это не так, то доступ к RAM-Disk-у все равно останется через команды чтения/записи
секторов, вызываемые через точку #3D13. Таким образом можно подгружать и использовать в программах
любые файлы.
22.7 /CLEAR
После того как RAM-Disk X сохранен (и не обязательно после этого) он может быть удален из памяти
командой.
/CLEAR x
Объем памяти компьютера ограничен, поэтому не обязательно все 16 RAM-Disk-ов могут в нем уместить-
ся. Кроме того, размер RAM-Disk определяется с точностью до 16Kb и может занимать все пространство
памяти т.е. до 3.4Mb (Остальная память – 256K видео, 256K спектрумовская память и 80K системной
памяти всегда заняты.)
===== PAGE 54 =====
23 ДОПОЛНЕНИЯ TR-DOS 5.04EM 54
22.8 Команды переключения конфигураций
TR-DOS предоставляет простое средство для преключения трех конфигураций, зашитых в ПЗУ непо-
средственно из командной строки. Для этого служат команды: /Sprinter 1, /Sprinter 2 и /AY. Следует
иметь в виду, что после переключения в Sprinter-2 спектрумовская клавиатура перестанет работать, и в
случае вызова этой команды с консоли произойдет «подвисание». Использование этой команды может быть
целесообразно в BASIC программах, которые переключат режим, выполнят некоторые действия и вернут
режим в Sprinter 1 или AY, когда вновь возможно использование спектрумовской клавиатуры.
22.9 Дополнительные сервисные команды
Кроме описанных есть еще несколько сервисных команд:
/A: /B: /C: /D: – переключение текущих дисководов без проверки их начичия. Удобно использовать
из бейсика при работе с рамдисками, когда надо убрать возникновение ошибок из-за переключения на
дисковод, к которому еще ничего не подключено.
/RD – тестовая команда. Выводит внутреннюю таблицу Ram Allocation Table (подобна FAT), по которой
можно увидеть какие страницы ОЗУ заняты, какие свободны. Таблица выводится сплошными цифрами в
HEX формате. Каждая пара это номер, соответстующий некой странице. Если этот номер равен 00, это
означает, что страница свободна. Таблица 16x16 двухбуквенных номеров соответствует 256-ти страницам
основного ОЗУ.
Создание новых файлов на HDD или дискетах MS-DOS на данный момент возможно только через ко-
мандеры или функции DOS, вызываемые из ассемблера. Аналогично, копирование, удаление, перемещение,
создание/удаление каталогов и т.д.
Из TR-DOS можно работать только с файлами корневого каталога. Единственная команда TR-DOS
меняющая содержимое HDD – команда /SAVE, замещающая содержимое файла, в который производится
сохранение RAM-Disk-а.
Большие и маленькие буквы в названиях MS-DOS файлов считаются одинаковыми.
23 Дополнения TR-DOS 5.04Em
TR-DOS 5.04Em, на основе которого написан TR-DOS Спринтера, использовался в компьютерах
Peters-256.
TR-DOS 5.04Em является дальнейшим развитием версий 5.04Е, 5.04Е+. По сравнению с версией 5.03
в ней имеются следующие дополнения:
Форматирование дискет в 3-х вариантах:
ORIGINAL – обычный формат TR-DOS;
TURBO – форматирование диска с другим расположением секторов, что приводит к ускорению операций
чтения/записи диска примерно в 2 раза. однако, применение этого формата замедляет выполнение команды
VERIFY, но эта команда реально почти не используется.
TURBO-FAST – форматирование аналогично TURBO, но без операции проверки. Этот режим стоит
применять только если есть уверенность в качестве дискет. Применение команды немного ускоряет саму
операция форматирования.
QUICK – быстрый формат. Команду можно применять, в случае, если диск уже отформатирован и надо
просто удалить с него все файлы. TR-DOS не проводит физического форматирования, а просто прописывает
в первых секторах пустой каталог. Следует отметить, что этот формат не годится для односторонних
и 40-дорожечных дисководов, так как диск не проверяется и в него прописываются данные, что он
двухсторонний, имеет 80 дорожек и 2544 свободных сектора. QUICK-формат автоматически используется
для форматирования RAM-Disk-ов.
Bыбор формата производится по запросу DOS после ввода обычной команды FORMAT "name" кла-
вишами <1>, <2>, <3> или <4>. Kлавиша <SPACE> отменяет команду. Если необходимо форматировать
===== PAGE 55 =====
24 КОПИРОВАНИЕ ФАЙЛОВ С TR-DOS ДИСКЕТ В RAM-DISK 55
диск из программы, так что бы TR-DOS не запрашивал тип формата, вслед за именем диска, сразу после
кавычки надо поставить цифру 1, 2, 3 или 4, в соответствии с необходимым типом формата.
При форматировании на экран выдается сообщение о номере форматируемой в данный момент дорожки
и стороны диска.
При записи файла на диск в случае если файл с таким именем на диске есть DOS выдает запрос о
стирании старого файла. Если ответить <Enter> или <Y>, то старый файл будет стерт и на его место
будет записан новый файл, если он не длиннее старого. Если же новый файл длиннее, то он будет записан
как обычно с первого свободного сектора диска, а в каталоге появится еще один стертый файл. B версии
5.03 такой случай просто приводит к остановке программы с ошибкой.
При включении DOS сразу устанавливает, что дисководы A: и B: имеют тип 2x80.. Это приводит к
отсутствию начальной проверки дисковода (нет звука "др-др-др"при первом выборе нового дискла). В
процессе работы диск проверяется на тип, и DOS работает с ним как надо.
Ускорeнная команда MOVE. В обычной версии 5.03 команда MOVE наиболее длинная по времени
работы, кроме того создается впечатление, что дисковод больше стоит чем работает. Это объясняется тем
что каждый раз при перемещении файла производится чтение каталога и запись в него. В данной версии
чтение и запись каталога производятся один раз. Информация каталога сохраняется в ОЗУ и все операции
с каталогом (только в команде MOVE) производятся в ОЗУ, что значительно ускоряет работу команды, в
среднем в 3 – 4 раза, а в некоторых случаях и более.
Введена новая команда – переименование диска: MOVE "name". При этом команда MOVE не выпол-
няется, а просто имя диска заменяется на "name".
В TR-DOS 5.04Em изменен редактор командной строки. Во-первых, устранена неприятность которая
возникает при входе в DOS в 128 режиме. Во-вторых, устранено влияние клавиш редактирования, которые
перемещают курсор строки в 48-м режиме. И, наиболее важная часть, - возможность вызова предыдущей
команды с помощью клавиши <EDIT>. Если Вы хотите повторить операцию или повторить ее с немного
изменнеными параметрами, то можно вызвать ее сразу после выполнения нажав клавишу <EDIT>. Если
же Вы что-то набрали в командной строке, то клавиша <EDIT> не сработает (в 5.03 версии это приводит
к вызову строки из BASIC программы).
TR-DOS 5.04Em поддерживает работу с RAM-диском, основанном на дополнительном ОЗУ – 128k. Эта
функция заменена на более модернизированные функции работы с RAM-Disk-ами Спринтера, описанные
выше.
24 Копирование файлов с TR-DOS дискет в RAM-Disk
Последовательность команд для достижения эффекта копирования в RAM-Disk E содержимого дискеты
A:
*"A:" – переключение на диск A
/FDD – подключение к диску A обычного дисковода
*"B:" – переключение на диск B
/RMD E – подключение к диску B рамдиска E
FORMAT "name" форматирование RAM-Disk-а (можно не форматировать, а подгрузить файл с HDD
командой /LOAD E file.trd)
COPY "b:*","a:*" стандартная команда TR-DOS копирования всех файлов с A: на B:
Действия собственно по копированию с дискет на RAM-Disk могут быть совершены стандартными
спектрумовскими командерами, работающими с TR-DOS через точку входа #3D13.
После этих команд на диске B: будет виден обычный каталог (команда TR-DOS:CAT) и с этими файлами
можно работать как с обычными TR-DOS файлами.
===== PAGE 56 =====
25 СОХРАНЕНИЕ СОДЕРЖИМОГО RAM-DISK НА ВИНЧЕСТЕРЕ 56
После того, как нужные файлы скопированы на RAM-Disk, его следует сохранить, как описано в сле-
дующей секции.
25 Сохранение содержимого RAM-Disk на винчестере
Для примера – RAM-Disk E.
К какому дисководу был подключен RAM-Disk (и был ли подключен вообще) не имеет значения. Име-
ет значение, что этот RAM-Disk существует в памяти, т.е. был либо создан командой FORMAT, либо
подгружен ранее с HDD.
Последовательность команд:
/HDD – подключение винчестера (какой диск стоял по умолчанию не имеет значения сработает на
любом)
/SAVE E file.trd сохранение RAM-Disk-а E в файл file.trd
Сохранение подгруженного с HDD RAM-Disk обратно, естветственно, стоит делать только в том случае,
если в образе диска произошли изменения. Для избежания возможных глюков рабочие программы стоит
держать в отдельном RAM-Disk-е, а изменяемые файлы на другом и иметь резервные копии файлов .trd с
важными данными (это общая рекомендация для любых компьютерных систем).
Часть VI
Программирование в Sprinter-DOS
(от Дениса)
А этот текст для того что быLATEXне ругался на пустоту в параграфе. А то, блин, развели тут, панимашь,
пустых парахрафов, как мух нерезаных!