Making of Border Dash


Посвящено продвижению поребрика в массы :)


Сразу прошу прощения за возможные грамматические, синтаксические, пунктуационные, стилистические и прочие ошибки, ибо чукча не писатель :)

Итак, начнем…
Для начала хочу передать приветы-спасибы людям, без которых интра получилась бы совсем не такой или вовсе не получилась:
bfox — за анси-картинку-заставку, моральную поддержку и разные подсказки.
lvd — за подсказки, бета-тестирование и идею звука.
Alone Coder — за статью в ZX Guide#3 «Синхронизация с точностью до такта».
nyuk — за бета-тестирование и отличное пати :)
Сыну — за то что не мешал сидя у меня на коленях, когда готовил интру к релизу :)

Теперь к сути.

Лирическая часть

О создании интры задумался где-то в середине февраля: 2 года назад написал одну интру и остановился — непорядок, надо исправлять. Начал думать, а что же я могу сделать? Ну сделать-то наверное многое могу, но по факту умею только поребрик — на другое просто бы не хватило времени, ввиду отсутствия знаний и опыта. Собственно выбор сделан — поребрику быть! Но вот что именно? Начал перебирать варианты — что-то слишком простое и неинтересное, что-то мегасложное или не реализуемое, что-то не влезает в 256 байт (поребрик + экшен на папере) или квадратики. Квадратики — что с ними можно сделать интересного? Бегущие? Было… Включение/выключение — уже интереснее, но что-то не то… Fade in/out — опять чего-то не хватает, какой-то изюминки. Переливающиеся — ого, вроде оно! Но как именно? Бегущие цветные полосы — то что надо! Может добавить скролл? Подумал и откинул эту идею — не смог придумать алгоритм, да и в 256 байт не влезу. Остановился просто на цветных полосах, так собственно и родилось название по аналогии с небезызвестной игрой :) Была еще мысль впихнуть AY-звук из игры, но оставил на потом — если место останется, но его не осталось…

Решение принято, засел за писанину. Но пока так, по два байта (утрировано) в день, попутно укладывая алгоритм в голове. 20 февраля в гости приехали bfox с Катей и мы с Олегом плотненько так пообсуждали интру. Буквально за несколько дней до этого я придумал фишку, не противоречащую правилам — аски-картинуку на папере (да, я читер! :) ) и попросил Олега помочь с оной. На что Олег предложил пойти дальше и нарисовать заставку через UDG-символы — сел и практически за вечер выдал готовый результат, чем мне не оставил выбора — хоть убиться, но интру надо сделать! :)
Дальше пошел хардкор-кодинг — я к ужиманию кода подходил раза 4-5, да и алгоритм менял, пусть и незначительно, несколько раз. Еще про ужимание — я последний раз практически ногами утаптывал то, что на первый взгляд уже не ужать — выжимал 30 с лишним байт для внедрения Алоновского синхронизатора. И ведь ужал! :) Можно было бы обойтись и без него, но мне не понравилось, что при запуске из trd поребрик каждый раз съезжает относительно папера на 0-3 тактов — некамильфо…
Еще из интересного: бета-тестирование — изначально я для цвета фона использовал OUT (C), 0, но как оказалось это недокументированная команда (спасибо lvd ) — на реале выдувается FF… т.е. фон внезапно стал белым. Можно было бы и забить на это, но меня аж покоробил тот факт, что на эмуле и на реале интра будет выглядеть по разному… В итоге опять пришлось чуток менять алгоритм — скатываться с инзначальных 6 цветов (для кратности — 24/6 = 8 блоков полос в одном квадрате) в полосах до 5… Мы когда с Фоксом подбирали последовательность цветов на 6, то получилось гораздо симпатичней, чем на 5. Да и 5 цветов в смотрибельную последовательность, как оказалось, сложить гораздо сложнее…
Потом еще lvd предложил идею «бесплатного» звука — а чего бы параллельно не фонить в биты бипера? Собственно фонит каждый из квадратов и, соответственно, в зависимости от количества квадратов на экране меняется уровень звука, т.е. он как бы плавает.
Ну а результат вы видели :)

Место для кидания тапками

Попутно были созданы пара тулзов:
1. Поскольку поребрик это такты, такты и еще раз такты, то я по быстрому накидал справочник команд Z80 + калькулятор тактов цикла.
2. Конвертер scr2udg, нормально работающий с яркостью и флешем. Флеш конечно не нужен был, но раз он есть в атрибутах, то прикрутил и его.
Теперь можете кидаться тапками, ибо эти тулзы были написаны для 1С 8.x!!! :)

Техническая часть

Тут изложу кратко общий принцип работы и некоторые моменты.
Интра загружается и стартует по адресу #8000 (32768).
При запуске строит 2 таблицы вниз и обработчик прерывания вверх начиная с org+#FE.

Таблица t_line_addr содержит адреса первых линий квадратов и состояние включен/выключен. 3 байта на квадрат.

Таблица t_clr_addr содержит 2 набора цветов для каждого из состояний вкл/выкл. На включенное состояние последовательность регистров используемых в OUT (C), x (второй байт команды минус #41), на выключенное состояние нули минус #41. #41 является вторым байтом команды OUT (C), B. В последствии, при установке нужных байт в обработчике прерывания, #41 прибавляется к значению из таблицы цветов и на выходе получается второй байт команды OUT (C), x.

Процедура set_sq на самом деле только включает квадраты, но результат получается разным, в зависимости от того, из какой части таблицы цветов взято значение.

Ах да, чуть не забыл — синхронизатор тактов, наверное, логичнее было бы расположить после процедуры create_paint_code (т.е. перед main_loop), а не в самом начале, но я чего-то поленился переделать :)

Ну вот, вроде, собственно и все. Если есть какие вопросы — постараюсь ответить. У меня зачастую полет мысли такой, что я связанными словами далеко не всегда могу объяснить :)

Хотел вставить исходник сюда, но как-то некрасиво получилось. По этому его можно скачать тут.

upd
Для тех, кто собирается колупать и править код:
На заметку — если будете править и размер вдруг превысит 255 байт, то программа уже не будет работать из-за одной хитрости, экономящей байт при установке обработчика прерывания. при превышении орг надо выставлять 32768-(размер-255)

37 комментариев

avatar
Очень хорошо, решительно одобряем, пиши еще!
avatar
Хочется мелких подробностей, сложностей и выходов из них, уверен, во время создания было множество нервных и забавных моментов! Еще раз поздравляю!
avatar
Фласт, проблема в том, что
У меня зачастую полет мысли такой, что я связанными словами далеко не всегда могу объяснить :)

как-то так))
а забавные моменты были, я даже в чатике глюк показывал, но тут палить не буду — тянет на самостоятельную интру, может на безрыбье сгодится))
avatar
кстати, второе место меня немного расстроило не тем, что оно второе, а тем, что отставание от первого составило всего одну сотую балла :)
avatar
какая ерунда(: лишний стимул написать еще одну работу, которая выйдет в отрыв.
avatar
не спорю, оно именно так и есть. главное правильную бомбу подобрать :)
да и вообще мне грех жаловаться — 2 года назад моя первая работа заняла 6 или 7 место, а вторая работа конкретно наступает на пятки лидеру :)
avatar
тулзы были написаны для 1С 8.x
ШОК! :)
avatar
а то! собсна какой инструмент под рукой есть и который я хорошо знаю :)
avatar
это клёво :)
демка впечатлила.
avatar
спасибо)
avatar
где те времена, когда VBA в Офисе был инструментом?(:
avatar
не, ВБА не креативненько))
avatar
Теперь можете кидаться тапками, ибо эти тулзы были написаны для 1С 8.x!!! :)
какие проблемы-то. Я конвертор из вортекса в бейсик на экселе писал.
avatar
кстати, вроде есть идея о написанию топика по работе с поребриком, для тех кто с ним никогда не работал. вот думаю стоит ли? ибо мой талант что-то объяснять еще хуже (просто в разы) чем мой талант чукчи_не_писателя :)
avatar
Стоит! Мне было бы интересно, особенно вопросы синхронизации и управления выполнением.
avatar
значит буду собирать силы для воплощения :)
avatar
пиши. для общего образования не лишнее.
avatar
Выполнение OUT (C), 0 зависит от процессора: либо 0, либо 255. В эмуле задается в ини.
avatar
На старых клонах будет преимущественно 0, на пентевах — 255.
avatar
зависит от процессора
от реализации, т.е. конкретного исполнения?
avatar
Да. На NMOS — 0, CMOS — 255.
avatar
спасибо, буду знать)
avatar
На заметку: узнать записываемое значение можно через любой рег АУ — записать/прочитать.
avatar
Хех))) хорошо что еще не успел код с использованием этой команды написать, а ведь как органично вписывалась сохраняя регистр свободным)
avatar
а я на эти грабли наступил — тоже раскатал губёнку :)
avatar
Какой делаем вывод? Команда вполне себе годна к использованию для эффектов или процессов где #00 и #ff чередуются с равной вероятностью.
avatar
кстати, хорошая идея — надо сделать зарубрчку в памяти на будущее
avatar
и без релиза не возвращайтесь! :-)
avatar
черт, я попал :)
avatar
Да место для кидания тапками — прямо интрига интриг этого текста. я считаю такие тулзы очень полезными… но 1с… я уже смирился что под руками надо иметь python да perl для работы таких быстрописных полезняшек на ПЦ, однако 1С это вроде уже посерьезнее… просто в папку кинуть и path к бинарнику — не пройдет…
avatar
С 7-кой прокатывает скопировать каталог BIN. Но у него 8-ка, тут не знаю.
avatar
я даже хз. не заморачивался. в конвертере 2 поля, которые мышкой заполняются, так что вызов из коммандной строки не нужен
avatar
а вообще как нить соберусь с духом и перепишу тулзы на человеческих языках.
avatar
sq , не правда ли, set_sq — чудесное название для процедуры
avatar
замечателное) я уже похихикал, когда писал)
avatar
Если говорить о тулзах, то мне пуребасик нравится — читает картинки, рисует. Даже простой алгоритм можно набить с нужными типами данных, а потом перевести готовый на з80.
avatar
Для тех, кто собирается колупать и править код:
На заметку — если будете править и размер вдруг превысит 255 байт, то программа уже не будет работать из-за одной хитрости, экономящей байт при установке обработчика прерывания. при превышении орг надо выставлять 32768-(размер-255)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.