|
Spectrum Progress
#01
30 сентября 1996 |
|
Записки программиста - унивкрсальная библиотека для работы с графикой от Вячеслава Медноногова - Graphic Library v1.1

Graphic Library v1.1
(C) Вячеслав Медноногов, 1991,1992.
(C) описание - Вячеслав Медноногов, 1996.
Растущая популярность ZX Spectrum привела к
тому, что многие из тех, кто воспринимал этот
компьютер только как игрушку, сейчас с удо-
вольствием осваивают его как мощное средство
программирования. И если ещё год-два назад речь
могла идти только о бейсике, то сегодня интерес
вызывает ассемблер. Это не слишком сложный язык
однако для некоторых, особенно начинающих прог-
раммистов препятствием становится вывод графики
в разрабатываемых ими системных и прикладных
программах.
Чтобы помочь им, я предлагаю свою графическую
библиотеку, ставшую ядром игры "Танкодром". Она
же вошла и в игру "Буратино". С некоторыми из-
менениями эта библиотека вошла, в качестве
вспомогательной, в игру "НЛО. Враг неизвестен".
Отличительными чертами Graphic Library
(GrLib1.1) являются малый размер (880 байт),
универсальность, возможность работы всех проце-
дур с обычным и теневыми экранами, вывод спрай-
тов и атрибутов всеми возможными способами на-
ложения, построение точек и отрезков. Кроме то-
го, в неё вошли процедуры целочисленного умно-
жения и деления.
Ещё одним важным достоинством является то,
что все процедуры (кроме GETSIM и GETSCR) рабо-
тают корректно с любыми входными параметрами,
поэтому, даже если вы ошибётесь в задании коор-
динат точек, отрезков, спрайтов или размеров
примитивов, по моей вине ваша программа не вы-
летит (правда, в том случае, если правильно ис-
пользовали процедуру настройки экрана SELSCR).
К недостаткам можно отнести лишь то, что, как
и любая универсальная и компактная библиотека
она имеет быстродействие, недостаточное для на-
писания серьёзных динамических игр (типа "ELI-
TE" или "НЛО"). Тем не мение её быстродействия
с лихвой хватит, чтобы повторить большинство из
существующих сейчас игр.
Итак, что же входит в GrLib1.1:
a) Математическая подбиблиотека:
MULB2 HL*E->DE Умножение
MULB L*E->DE флаг C-переполнение
MUL HL*DE->DE
DIVB E/L->E Деление
DIVB2 DE/L->E D-остаток.
При переполнении
или делении на ноль
E->D; 255->E
б) Векторная графика:
LINE - линия между (X1=E;Y1=D) и (X2=L;Y2=H)
PLOT - вывод точки (X=E;Y=D)
в) Печать символов:
PRINT - вывод стоки символов:
A - количество
D - начальная координата по вертика-
ли (в знакоместах).
E - по горизонтали
HL- адрес начала текста
BC- адрес используемой таблицы сим-
волов.
SIMBOL - печать одного символа несколько раз
A - количество повторений
L - код символа
BC и DE - как в PRINT
STRLEN - найти длину строки до разделителя
0 или 13
HL - начало строки
на выходе:
A - количество символов в строке
пример: LD HL,TEXT
PUSH HL
CALL STRLEN
POP HL
LD BC,#3C00;набор символов в ПЗУ
LD DE,#0502
CALL PRINT
RET
TEXT DEFM "Hello, World"
DEFB 0
г) Работа со спрайтами:
для ниже приведенных процедур
H - координата Y
L - координата X
B - ширина в знакоместах
C - высота в знакоместах
DE - адрес изображения в памяти
- Вывод спрайтов X Y
PUTSPR в пикселах в знакоместах
PUTSCR в пикселах в пикселах
PUTSIM в знакоместах в пикселах
- Заполнение окна байтом из регистра А
SIMBAR координаты X и Y в знакоместах
- Сохранить изображение спрайта в памяти
DE - адрес буфера для сохранения спрайта
GETSIM координаты X и Y в знакоместах
- Вывести атрибуты спрайта на экран
PUTATR (параметры как и у PUTSIM)
- Сохранть атрибуты спрайта в буфере с адреса
регистра DE
GETATR (параметры как и у GETSIM)
- Заполнить окно атрибутами одного цвета из
регистра A
ATRBAR (параметры как у SIMBAR)
д) Установить способ наложения примитивов
Вызывается :
LD A,<режим>
CALL CHNGRG
где <режим> имеет следующие мнемоники:
* NOP_ - копирование
OR_ - наложение по принцыпу "ИЛИ"
XOR_ - по принцыпу "исключающее ИЛИ"
* AND_ - по принцыпу "И"
* INV_ - инверсия
* - только для PRINT, PUTSIM, PUTSPR
- Выбор экрана (SELSCR)
Во всех своих играх я редко формирую изоб-
ражения в основном экране: сначала я строю
его в "теневом" экране, а затем быстро
пересылаю его в основной.
Теневой экран - какая-либо область в па-
мяти длинной 6 Кбайт (6912 байт).
GrLib накладывает ограничения, согласно
которому адрес начала "теневого" экрана
должен быть кратен #0800 (2048).
Выбор экрана осуществляется так:
LD A,<адрес экрана/256>
CALL SELSCR
Для вывода в обычный экран используйте:
LD A,#40
CALL SELSCR
Если не вызывать SELSCR, по умолчанию все
процедуры выводят изображения в основной
экран.
Если не вызывать CHNGRG, по умолчанию уста-
новлен режим OR_.
Остальные процедуры являются вспомогатель-
ными.
GrLib 1.1 находится в играх "Танкодром" и
"Буратино" (в "Буратино"- после декомпрессии с
адреса 64640). Вы сможете сами посмотреть, как
они используются в этих играх с помощью отлад-
чика или теневого монитора.
За три года эксплуатации я обнаружил только
два недочёта:
MULB, MULB2, MUL - не всегда правильно
выставляют флаг переноса, поэтому, если вы за-
хотите построить на их основе умножение 4-8
байтовых чисел, их надо будет изменить.
PUTATR, GETATR - работают только с атрибута-
ми основного экрана. До появления игр на 128K
это не имело большого значения. В качестве
практикума по программированию вы можете попы-
таться самостоятельно устранить этот недочёт.
Откомпилируйте и запустите GrDemo и вы полу-
чите некоторое представление о GrLib 1.1.
Всего хорошего, успехов в написании игр,
дорогие коллеги !
──══──
От редакции SP:
В приложении к журналу вы найдёте графичес-
кую библиотеку и демонстрационную программу.
Напоминаем вам о необходимости инициализации
приложения для свободного доступа к файлам.
Другие статьи номера:
Похожие статьи:
В этот день... 28 октября