ОБМЕН ОПЫТОМ.
В этом разделе будет расска-
зано о создании демонстрационной
программы YES DEMO.
Мы разберем всю программу : от
бейсиковских вспомогательных
процедур до загрузчика. Но перед
изучением нижеизложенного мате-
риала, запустите эту программу и
внимательно изучите ее в работе.
ВНИМАНИЕ!!! Для понимания мате-
риала, читатель должен обладать
некоторыми знаниями.
Изготовление любой программы
начинается с планирования экрана
На экране , по возможности , не
должно быть пустого места.Pacno-
ложение всех элементов заставки
должны подчиняться определенным
правилам (это в частности связа-
но с неудобной организацией
области атрибутики). Например ,
рамка, так же как и рисунок в
центре, находятся строго в зна-
коместах. Следует отметить и то,
что движушиеся элементы програм-
мы (индикаторы, бегушая строка,
летаюшая "YES") не накладываются
друг на друга, так как это не
предусмотренно.
Заставка была нарисована в
ART STUDIO. Файл в формате A.S.
имеет имя SCREEN. Для уменьшения
объема памяти, занимаемой заста-
вкой, она была скомпрессирована
и имеет имя SCREEN+ .
Длина файла SCREEN+ равна 1562
байта, притом, что файл SCREEN
имеет длину 6912 байт.
Знакогенератор (шрифт) был
также нарисован в ART STUDIO.
Длина знакогенератора - 768 байт
96 знаков по восемь байт каждый
Этот файл имеет имя ABC.fnt.
Теперь переходим к рассмотреню
бейсик блока BASIC.
Так как адресация экранной
области ZX-SPECTRUM не очень
удобна и программа тратила бы
много времени на пересчет
координат, то создается таблица
адресов для второй трети экрана.
Эту таблицу создают 100 - 110
строки программы BASIC (во время
выполнения этих строк, программа
показывает, какие адреса занося-
тся в таблицу). Таблица содержит
64 двухбайтных адреса и,следова-
тельно, имеет длину 128 байт.
Имя файла таблицы - TABL 01$ .
Теперь немного о летаюшем YES
(в дальнейшем спрайт). Положение
спрайта на экране (по горизо-
нтали) заранее предугадать нево-
зможно, и поэтому он был нарисо-
ван (опять же в ART STUDIO, файл
SPRITE) во всех восьми возможных
Каждый спрайт имеет размер 2 на
5 знакоммест и длину 80 байт.
После каждого спрайта идет его

маска. Маска необхо-

дима для того, чтобы

вся окрестность

спрайта оставалась
нетронутой. Маска как бы выреза-
ет место под спрайт.
Этот прием, кстати, используется
во всех игровых программах.
И опять же, все восемь спрайтов
и масок неудобно расположены для
применения, поэтому при помоши
строк 10-40 программы BASIC все
это было переведено в другой фо-
рмат,записано под именем SPRITE+
Спрайт перемешается по трае-
ктории эллипса.Каждый раз высчи-
тывать следуюшую координату
траектории требовало бы много
машинного времени, поэтому стро-
ки 200-210 все той же программы
BASIC, создают таблицу координат
траектории. В рассмотренной про-
грамме таблица координат соде-
ржит 101 координату , заданную
в системе Х,Y. Таким образом та-
блица занимает 202 байта.Призна-
ком окончания таблицы являются
два нуля . Окончательная длина
таблицы - 204 байта, имя ELIPS.
Для написания текста были
использованы З00-З80 строки про-
граммы BASIC. В конце текста
стоит нуль - признак окончания.
Все сообшение имеет длину 516
байт и имя TEXT. Музыка была на-
писана в редакторе SOUND TRACKER
Длина мелодии - ЗЗЗб байт, адрес
размешения - З4458, имя - MUSIC.
Переходим к рассмотрению ко-
довой части программы.Если у Вас
фирменная версия журнала , то
к диску прилагалась распечатка
ассемблера демонстрации.
Написание программы начиналось с
изготовления отдельных подпро-
грамм (в дальнейшем п/п). Каждую
в отдельности п/п удобно писать
и отлаживать. Первой рассмотрим
п/п бегушей строки , ее начало-
строка 1820.При обрашении к этой
п/п происходит следуюшее:
1.сдвиг всей строки на один пи-
ксель при помоши п/п SCROLL;
2.проверка на окончание
текста (18З0-1900);
З.нахождения начала буквы в зна-
когенераторе (1910-1960);
4.установка адреса вывода бита
буквы и количества выводимых
строк (1970-1980);
5.вывод одного бита буквы (1990-
2180);
5.1.проверка сколько нужно сдви-
нуть раз байт буквы(2000-2040)
Счетчик количества сдвигов -
SCHET7;
5.2.строки 2060-2070 сдвиг байта
5.З.непосредственный вывод бита
буквы (2100-2140);
5.4.установка следуюшего адреса
экранной области (2150) и сле-
дуюшего адр.байта буквы(2160);
5.5.проверка на окончание вывода
восьмого бита буквы(2170-2180)
6.проверка SCHET7 на нуль (2190-
2210). Если не нуль,то SCHET7=
SCHET7-1 и выход (2280-2290) .
Если нуль, то устанавливается
следуюший адрес буквы (2220 -
2240)и переменная SCHET7(2250-
2260).
П/п SCROLL (1690-1810)начинается
с установки адреса правого ве-
рхнего угла бегушей строки и ко-
личества сдвигаемых строк (1690-
1700).Сдвиг строки (1710-1800) .
Следуюшей рассмотренной п/п
будет п/п рисования индикаторов
(2З00-2680). Сама п/п использует
один и тот же фрагмент (2470-
2680) шесть раз ( для рисования
шести уровней индикаторов ). Для
правильной работы этой части п/п
требуется задать в HL адрес низа
индикатора, а в A-номер регистра
музыкального сопроцессора, с ко-
торого нужно считывать текушую
амплитуду канала.В строках(2З00-
2460) шесть раз производится
установка этих параметров и
используется фрагмент INDIC.
Строки 2470-2500 считывают значе
ния амплитуды, а 2510-2670 непо-
средственно выводят индикатор,
высотой, указанной в регистре A.
П/п сдвигания цвета по рамке
(2690-З140). Эта п/п вызывается
не в каждое прерывание, а через
раз, так как в переменной SCHETб
устанавливается двойка. Но в на-
чале выполнения вместо двойки
стоит число 190 и поэтому цвет
начинает перемешаться через не-
сколько секунд. Перемешение про-
исходит так:сдвиг вправо верхней
горизонтали (2770-2810) , сдвиг
вниз правой вертикали(2850-2950)
сдвиг влево нижней горизонтали
(2970-З010), сдвиг вверх левой
вертикали (З070-З120).
П/п мерцания изображения в
центре экрана (З150-ЗЧЗO). В на-
чале этой процедуры стоит RET,но
он убирается, когда начнет пере-
мешаться цвет по рамке (2740).Но
после замены RET на NOP мерцание
начнется не сразу, так как в пе-
ременной SCHETS стоит цифра 190
а не 2.
В переменной (З450) хранится
номер цвета, которым будет окра-
шиваться изображение. Значение
этой переменной циклически изме-
няется от 7 до 0.
В строках З280 - З290 происходит
установка высоты изображения В=5
и адреса левого верхнего угла.
Процедура (ЗЗOO-З420) производит
закрашивание прямоугольника 5 на
7 знакомест.
Теперь о двух п/п-ах,которые
работают в паре. Это RESTOR и
WRITE. Эти две п/п служат для
вывода перемешаюшегося спрайта .
Этот процесс выглядит так:
1.Затирание ранее нарисованной
"YES" (RESTOR);
2.Вывод спрайта по новым коорди-
натам траектории (WRITE);
З.Задержка и переход на 1.
В начале п/п RESTOR (1080-1З80)
устанавливается высота затирае-
мого спрайта (1080) . В цикле
(1090-1З70)повторяется следуюшее
перевод координат, заданных в DE
в адрес (1110-1240) с помошью
таблицы адресов второй трети;
нахождение адреса буфера (1250-
1280) из которого будет браться
информация для восстановления
экрана; восстановление строки в
пять байт (1290-1ЗЗO); увеличе-
ние вертикальной координаты(1З40
-1З50); закольцовка, пока не бу-
дут восстановлены все 16 строк.
П/п WRITE имеет структуру, похо-
жую на п/п RESTOR . Точно также
входными данными является реги-
стровая пара DE с вертикальной и
горизонтальной координатами.
Только в строках 700-770 проис-
ходит вычисление,какой спрайт из
восьми будет использован,а далее
все идет по тому-же сценарию.
Строки 960-990 -непосредственный
вывод спрайта на экран.
A теперь последняя и самая про-
стая п/п обработки прерывания.
П/п начинается с запрета прерыва
ния и занесения всех регистров в
стек (1З90-1510). Затем вызываю-
тся п/п-мы перемешения цвета,вы-
вода следуюшей части музыки и
мерцания (1520-1540).После этого
восстанавливаются все регистры,
разрешается прерывание и осуше-
ствляется возврат из п/п.
Наступило время рассмотреть "се-
рдцевину" программы (1З0 - 690).
В начале происходит настройка
программы к работе (1З0-З40) , а
именно , инициализация музыки,
очистка и зачернение экрана, вы-
вод заставки, формирование буфе-
ра второй трети экрана,установка
нового знакогенератора и параме-
тров прерывания.Затем идет осно-
вной цикл программы (З50 - 580):
1.Восстановление той части экра-
на, на которую был наложен
спрайт (З50-З60);
2.Вычисление следуюшей координа-
ты траектории (З70-450);
З.Установка координат следуюшего
восстановления (460);
4.Вызов п/п-ам рисования спрайта
бегушей строки и индикаторов
(470-490);
5.Задержка и синхронизация (500)
6.Установка следуюшего адреса
таблицы траектории (510-540);
7.Проверка на нажатие пробела.
Если пробел не нажат, то весь
процесс повторяется с первого
пункта.
Если пробел нажат, то происходит
возврат всех параметров системы
(590-660) и переход на нулевой
адрес ПЗУ TR-DOS (670-690), т.е.
сброс и запуск boot.
После ассемблирования, машин-
ный код имеет длину 6З0 байт и
адрес размешения З7794,имя CODE+
На диске имеется два файла: один
с именем CODE, который можно за-
грузить в GENS ( который также
прилагается ) и файл с именем
CODE+ , который уже готов для
использования.
Итак,все для работы демонстрации
готово.Загружаем последовательно
в память файлы:
адрес длина имя
З0000 204 ELIPS
З0204 128 TABLO1$
ЗOЗЗ2 1280 SPRITE+
З1612 768 ABC.fnt
З2З80 1562 SCREEN+
ЗЗ942 516 TEXT
З4458 ЗЗЗб MUSIC
З7794 6З0 CODE+
Отгружаем файл с адреса З0000,
длиною 8424 байта (имя LIBRARY),
который включает в себя все нео-
бходимое для работы.
Теперь если файл LIBRARY загру-
зить под адрес З0000 и запустить
с адреса З7794, то демонстрация
начнет работать , но таким спо-
собом запускать программу неудо-
бно и поэтому нужно сделать за-
грузчик. Загрузчик сделаем моно-
блоком (одним файлом). Для этого
загружаем кодовый файл GENS под
адрес З0000; в бейсике набиваем
две строки:
1 REM ...
2 RANDOMIZE USR VAL "23872"
под "..." понимать З4 пробела
(именно столько байт требуется
для размешения загрузчика).
Запускаем GENS ( RANDOMIZE USR
30000) и пишем программу загру-
зчика:
10 ORG 23872
20 ENT $
30 LD SP,29999
40 XOR A
50 LD BC,6911
60 LD DE,16385
70 LD HL,16384
80 LD (HL),A
90 LDIR
100 OUT (254),A
110 LD BC,#2105
120 LD DE,(23796)
130 LD HL,30000
140 CALL 15635
150 JP 37794
Ассемблируем и выходим из ассем-
блера. Теперь в бейсике видно,
что после REM написан какой-то
бред , это и есть машинокодовая
часть загрузчика . Берем чистый
диск и в бейсике набираем:
RANDOMIZE USR 15619:REM:SAVE "YE
S DEMO" LINE 2

Other articles: