ZX-News #01: Обмен опытом: Создание YES DEMO

Упомянутые программы

ОБМЕН ОПЫТОМ.

В этом разделе будет рассказано о создании демонстрационной программы YES DEMO. Мы разберем всю программу: от бейсиковских вспомогательных процедур до загрузчика. Но перед изучением нижеизложенного материала запустите эту программу и внимательно изучите ее в работе.

ВНИМАНИЕ!!! Для понимания материала читатель должен обладать некоторыми знаниями.

Изготовление любой программы начинается с планирования экрана. На экране, по возможности, не должно быть пустого места. Расположение всех элементов заставки должно подчиняться определенным правилам (это в частности связано с неудобной организацией области атрибутики). Например, рамка, так же как и рисунок в центре, находятся строго в знакоместах. Следует отметить и то, что движущиеся элементы программы (индикаторы, бегущая строка, летающая "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 координату, заданную в системе X,Y. Таким образом таблица занимает 202 байта. Признаком окончания таблицы являются два нуля. Окончательная длина таблицы - 204 байта, имя ELIPS.

Для написания текста были использованы 300-380 строки программы BASIC. В конце текста стоит нуль - признак окончания. Все сообщение имеет длину 516 байт и имя TEXT. Музыка была написана в редакторе SOUND TRACKER. Длина мелодии - 3336 байт, адрес размещения - 34458, имя - MUSIC.

Переходим к рассмотрению кодовой части программы. Если у Вас фирменная версия журнала, то к диску прилагалась распечатка ассемблера демонстрации. Написание программы начиналось с изготовления отдельных подпроцедур (в дальнейшем п/п). Каждую в отдельности п/п удобно писать и отлаживать. Первой рассмотрим п/п бегущей строки, ее начало - строка 1820. При обращении к этой п/п происходит следующее: 1. сдвиг всей строки на один пиксель при помощи п/п SCROLL; 2. проверка на окончание текста (1830-1900); 3. нахождение начала буквы в знакогенераторе (1910-1960); 4. установка адреса вывода бита буквы и количества выводимых строк (1970-1980); 5. вывод одного бита буквы (1990-2180); 5.1. проверка сколько нужно сдвинуть раз байт буквы (2000-2040); Счетчик количества сдвигов - SCHET7; 5.2. строки 2060-2070 сдвиг байта; 5.3. непосредственный вывод бита буквы (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).

Следующей рассмотренной п/п будет п/п рисования индикаторов (2300-2680). Сама п/п использует один и тот же фрагмент (2470-2680) шесть раз (для рисования шести уровней индикаторов). Для правильной работы этой части п/п требуется задать в HL адрес низа индикатора, а в A - номер регистра музыкального сопроцессора, с которого нужно считывать текущую амплитуду канала. В строках (2300-2460) шесть раз производится установка этих параметров и используется фрагмент INDIC. Строки 2470-2500 считывают значения амплитуды, а 2510-2670 непосредственно выводят индикатор, высотой, указанной в регистре A.

П/п сдвигания цвета по рамке (2690-3140). Эта п/п вызывается не в каждое прерывание, а через раз, так как в переменной SCHET6 устанавливается двойка. Но в начале выполнения вместо двойки стоит число 190 и поэтому цвет начинает перемешиваться через несколько секунд. Перемешение происходит так: сдвиг вправо верхней горизонтали (2770-2810), сдвиг вниз правой вертикали (2850-2950), сдвиг влево нижней горизонтали (2970-3010), сдвиг вверх левой вертикали (3070-3120).

П/п мерцания изображения в центре экрана (3150-3330). В начале этой процедуры стоит RET, но он убирается, когда начнет перемешиваться цвет по рамке (2740). Но после замены RET на NOP мерцание начнется не сразу, так как в переменной SCHETS стоит цифра 190, а не 2.

В переменной (3450) хранится номер цвета, которым будет окрашиваться изображение. Значение этой переменной циклически изменяется от 7 до 0. В строках 3280 - 3290 происходит установка высоты изображения B=5 и адреса левого верхнего угла. Процедура (3300-3420) производит закрашивание прямоугольника 5 на 7 знакомест.

Теперь о двух п/п-ах, которые работают в паре. Это RESTOR и WRITE. Эти две п/п служат для вывода перемешивающегося спрайта. Этот процесс выглядит так: 1. Затирание ранее нарисованной "YES" (RESTOR); 2. Вывод спрайта по новым координатам траектории (WRITE); 3. Задержка и переход на 1.

В начале п/п RESTOR (1080-1380) устанавливается высота затираемого спрайта (1080). В цикле (1090-1370) повторяется следующее: перевод координат, заданных в DE в адрес (1110-1240) с помощью таблицы адресов второй трети; нахождение адреса буфера (1250-1280), из которого будет браться информация для восстановления экрана; восстановление строки в пять байт (1290-1320); увеличение вертикальной координаты (1340-1350); закольцовка, пока не будут восстановлены все 16 строк. П/п WRITE имеет структуру, похожую на п/п RESTOR. Точно также входными данными является регистра пара DE с вертикальной и горизонтальной координатами. Только в строках 700-770 происходит вычисление, какой спрайт из восьми будет использован, а далее все идет по тому же сценарию. Строки 960-990 - непосредственный вывод спрайта на экран.

А теперь последняя и самая простая п/п обработки прерывания. П/п начинается с запрета прерывания и занесения всех регистров в стек (1390-1510). Затем вызываются п/п-мы перемешения цвета, вывода следующей части музыки и мерцания (1520-1540). После этого восстанавливаются все регистры, разрешается прерывание и осуществляется возврат из п/п. Наступило время рассмотреть "сердцевину" программы (180 - 690). В начале происходит настройка программы к работе (180-340), а именно, инициализация музыки, очистка и зачернение экрана, вывод заставки, формирование буфера второй трети экрана, установка нового знакогенератора и параметров прерывания. Затем идет основной цикл программы (350 - 580):

1. Восстановление той части экрана, на которую был наложен спрайт (350-360);
2. Вычисление следующей координаты траектории (370-450);
3. Установка координат следующего восстановления (460);
4. Вызов п/п-ам рисования спрайта бегущей строки и индикаторов (470-490);
5. Задержка и синхронизация (500);
6. Установка следующего адреса таблицы траектории (510-540);
7. Проверка на нажатие пробела. Если пробел не нажат, то весь процесс повторяется с первого пункта. Если пробел нажат, то происходит возврат всех параметров системы (590-660) и переход на нулевой адрес ПЗУ TR-DOS (670-690), т.е. сброс и запуск boot.

После ассемблирования машинный код имеет длину 660 байт и адрес размещения 37794, имя CODE+. На диске имеется два файла: один с именем CODE, который можно загрузить в GENS (который также прилагается) и файл с именем CODE+, который уже готов для использования.

Итак, все для работы демонстрации готово. Загружаем последовательно в память файлы:

адрес длина имя

З0000 204 ELIPS
З0204 128 TABL01$
З0332 1280 SPRITE+
З1612 768 ABC.fnt
З2380 1562 SCREEN+
З3994 516 TEXT
З4458 3336 MUSIC
З7794 660 CODE+

Отгружаем файл с адреса З0000, длиной 8424 байта (имя LIBRARY), который включает в себя все необходимое для работы. Теперь если файл LIBRARY загрузить под адрес З0000 и запустить с адреса З7794, то демонстрация начнет работать, но таким способом запускать программу неудобно и поэтому нужно сделать загрузчик. Загрузчик сделаем моноблоком (одним файлом). Для этого загружаем кодовый файл GENS под адрес З0000; в бейсике набиваем две строки: 1 REM ... 2 RANDOMIZE USR VAL "23872". Под "..." понимать 34 пробела (именно столько байт требуется для размещения загрузчика). Запускаем 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 "YES DEMO" LINE 2.

Оглавление издания: ZX-News #01

  • Экспертиза
    Введение в игру HERO QUEST-1, разработанную GREMLIN GRAPHICS LIMITED в 1991 году. Игра предполагает сбор магических предметов для остановки сил хаоса. Включает описания персонажей и инструкции по игре.
  • Экспертиза
    Обзор игры Seymour at the Movies от Code Masters, продолжение серии Dizzy. Главный герой в роли режиссера Голливуда. Опубликовано в ZX-News #01, 1995.
  • Дебют
    Игровой процесс эльфа, проходящего лабиринты и использующего магию и заклинания для решения головоломок. Описываются заклинания, такие как LIGHTING, FIRE BALL и REVIVAL. Обсуждаются стратегии сбора насекомых и использования магических предметов для прогресса.
  • Дебют
    Обзор польской логической игры 1990 года под названием LOGO. Описание механики игры и стратегии прохождения уровней. Включает список кодов уровней для облегчения прогресса.
  • Задание
    Задание найти оскар в SEYMOUR AT THE MOVIE и сосчитать экраны в лабиринте SPOOKED.
  • Фантазия
    Компьютерная новелла по игре 'Last Ninja 2' сочетает драки и головоломки. Самурай Уира отправляется на поиски похищенного шара могущества. История описывает его приключения и препятствия на пути.
  • Хит-парад
    Анализ популярных программ среди пользователей Спектрума в Луганске. Выделяются ELITE и адвентюрные игры. Переход к умным играм и интерес к музыкальным демонстрационным программам.
  • Система
    Рассмотрение двух системных программ: ADM 7.08 для дизассемблирования программ и ADS 2.00p для управления дисководами. ADM полезен для модификации и анализа программ. ADS оптимизирует работу дисковода и восстанавливает сектора диска.
  • Обмен опытом
    Подробное руководство по созданию YES DEMO для ZX Spectrum, от базовых вспомогательных процедур до загрузчиков. Ключевые техники включают планирование экрана, работу со спрайтами и интеграцию звука. Демонстрация сочетает программирование на ассемблере и BASIC для эффективного показа.
  • Электроника
    Описание устройства для прохождения игр типа 'дергалок' с иллюстрацией схемы.
  • Реклама
    Представление журнала ZX-News группой ACTION с извинениями за ошибки и предложением создать клуб ZX-SPECTRUM в Луганске.
  • Macro-Modem v2.1
    Представление Macro-Modem v2.1, терминальной программы для Vicomm. Особенности: работа с файлами, поддержка макросов и улучшения для Scorpion. Работает автономно при обмене файлами.
  • Enlight '96
    Обзор участников и результатов мероприятия Enlight '96, обсуждение основных моментов демопати в музыкальных и графических конкурсах. Размышления о будущем технологий демосцены и художественных достижениях. Инсайты в организационные трудности и заметные выступления.
  • FIDO
    Статья обсуждает роль FIDO и терминологию в модемных коммуникациях и использовании BBS.
  • Авторы
    Информация об авторах ZX-NEWS №02, способах распространения и контактные данные для отправки материалов.
  • Конкурс!
    ZX-News продлевает конкурс на три номера, призывая участников прислать сохранение из UFO-2. Победитель определяется по самому быстрому игровому времени. Приз — 20 дискет ГМД-130 или TDK.
  • Объявления
    Статья описывает платные объявления в ZX-News, включая цены, способы связи и примеры текущих объявлений.
  • От редакции
    Редакционные размышления о мнениях читателей, улучшениях журнала и изменениях рубрик.
  • Письма
    Обсуждение отзывов о демопати Enlight через два противоположных письма. Наблюдения за предпочтениями платформ: Amiga, ZX Spectrum и IBM. Подчёркнуты трудности в организации крупных мероприятий.
  • Хит-парад
    Рейтинг лучших игр и демо на основе еженедельного спроса. В центре внимания популярные названия, такие как 'НЛО-2' и 'Vibration'. Отражает изменяющиеся интересы энтузиастов ZX Spectrum.