ZX News #01
31 января 1995 |
|
ОБМЕН ОПЫТОМ. В этом разделе будет расска- зано о создании демонстрационной программы 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:
|
|
|
|
|
|
|
|
|
|
|
Similar articles:
В этот день... 21 November