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:
Amiga Sensor - Viruses on AMIG'e.
Interesting conversation - an interview with Alex Raider / Flash INC
Toy Review - An overview of new gaming software: LAST adventure.

В этот день...   29 April