@Verm-V нашел шикарный глюк в игре.
Он заметил, что если бегать по верхушкам леса, то очки прибавляются не по 1000 за каждую комнату, а повторно и повторно, причем, не совсем понятно когда и как.
Я стал разбираться в коде, и выяснил, что битовый массив, в котором записывается, какая комната уже была посещена, а какая нет, состоит всего из 16 байт, по одному биту на комнату, и охватывает всего 128 комнат.
Тогда как индексы комнат в игре лежат во всем диапазоне от 0..255.
И когда человек посещает комнаты с номером >128, алгоритм вычисления бита в массиве превращается в тыкву. Мало того, что неправильно определяется, посещена комната или нет, так еще и команды BIT n,(HL), и SET n,(HL), которые являются самомодифицирующимися, из-за переполнения превращаются вообще в другие комнады)
- - - Добавлено - - -
Но это еще не все беды со счетом)
1. При посещении каждого экрана счет увеличивается на 1000. Однако, чтобы на заставочном экране такого не происходило, при очистке счета специально помечаются биты, что заставочный экран уже посещен. Но биты помечаются, а процедура вызывается уже после того, как заставочный экран показан) Своевременно)
2. Ошибка в функции начисления счета приводит к тому, что не работает перенос из 5 в 6 разряд, если перенос был каскадным.
Ну и наконец, обратил внимание, что в качестве габаритов Диззи (для сравнения коллизий спрайтов) используется спрайт листвы деревьев 3x3 знакоместа. А что, похоже. Да и в Диззи-1 примерно так же делали)
Bedazzle(07.02.2023), Black Cat / Era CG(07.02.2023), Digitizer(08.02.2023), Oleg N. Cher(07.02.2023), Reobne(07.02.2023)
Я вот заметил, что если у края экрана нажать огонь для выкладывания предмета и в этот момент перейти на другой экран, то предмет появится в нужном месте, но на предыдущем экране... и вообще может застрять в текстурах.
- - - Добавлено - - -
У братьев не было такого ресурса тестеровОдна попытка для релиза, потом только кассеты изымать, а это убытки колоссальные)
Oleg N. Cher(09.02.2023), Reobne(09.02.2023)
Классный глюк)
До такого я даже не догадался, попробовать так сделать)
Это происходит потому, что движок самого диззи висит на прерываниях и работает асинхронно. Человек нажимает 'выстрел', и от движка поступает основной программе сигнал, что нажат выстрел, надо выложить предмет. Однако, если Диззи успел выйти за пределы экрана, то его координаты будут уже в начале другого экрана, вот предмет и выкладывается в тех координатах, куда Диззи вышел.
Oleg N. Cher(09.02.2023), Reobne(09.02.2023)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Обзор музыкального плеера под биппер Дэвида Уиттакера.
Плеер достаточно массивный, имеет много кода и возможностей. Тогда как сами мелодии достаточно компактны, и занимают мало места.
По словам Гудбоя, Дэвид достаточно хороший кодер, и свои плееры писал сам, a музыку писал безо всякого редактора прямо ассемблере.
На счет хорошего кодера - да, код достаточно оптимален, изощерен, пестрит самомодификациями и интересными решениями. Вместе с этим, немало ляпов и глюков влияющих на качество музыки.
Также весьма похоже, что мелодии написаны именно в коде, а не в редакторе. Хотя, тут могут быть варианты.
Плеер трехголосый, с каналами A, B и C.
Каналы A и B играют в основном цикле, формируя звук посредством упрощенного ШИМ.
Канал C предназначен для спецэффектов (барабаны), и играется из обработчика прерываний.
Каналы A и B отличаются тем, что громкость звука (зависящая от скважности ШИМ) для канала A в два раза меньше, чем для канала B.
По всей видимости, это сделано для того, чтобы басовые ноты, которые во всех мелодиях играются на канале A не забивали мелодию, играющуюся на канале B.
В таблице плеера 60 нот (5 октав по 12 нот), причем чем ниже нота (басовее), тем громче она звучит. Это связано с тем, что активная фаза ШИМ вычисляется как небольшой процент от длительности периода ноты. Следовательно, чем больше период (ниже нота), тем длиннее активная фаза ШИМ, а следовательно и громкость.
Каждая нота начинает звучать на максимальной громкости, после чего громкость спадает со скоростью, установленной специальной командой (о командах ниже).
В основном цикле плеера постоянно крутится проигрывание нот для каналов A и B.
50 раз в секунду отрабатывает прерывание, в обработчики которого во-первых, уменьшается длительность ноты для каждого из трех каналов (счетчики расположены в регистрах B,C,C'), после чего отрабаытвается звуковой эффект (какой-либо барабан, если есть), после этого вызывается дополнительный обработчик пользователя (например, опрос выбора клавиш для заставочного экрана), после чего обработчик прерывания устанавливает флаг C в регистре флагов (!) и возвращается в основной цикл.
Основной цикл периодически проверяет, установлен ли флаг C, и если да, то проверяется окончание длительности нот для каналов A и B, а также вызывается обработчик пересчета громкости для плавного затухания нот в каналах.
Во всей этой хитроумной структуре есть несколько недочетов, главный из которых состоит в том, что обработчик прерываний может вызваться в любой момент, и сам при этом достаточно тяжеловесный, даже если не играются барабаны. В результате, если он вызван, когда ШИМ находится в активной фазе, то эта фаза растягивается на ~2000 тактов, что для слушателя проявляется в хаотичных щелчках в музыке наподобие звука с царапанных грампластинок (эффект называется Click).
Кроме того, автор плеера не учел, что некоторые команды основного цикла сбрасывают флаг C, при этом пропуская квант времени, о котором сигнализировал обработчик прерываний. Это может давать хаотичную неравномерность мелодии.
Интересно, что эмулятор EmuZWin с настройками по умолчанию, когда установлена оптимизация 'Fast loop emulation', плохо относится к задержкам плеера, и даже может потерять флаг C. Из-за чего если включить модель Pentagon 128, музыка подтормаживает. Но это чисто глюки эмулятора, поэтому идем далее.
Теперь о возможностях проигрывателя.
У каждого канала (A, B, C) свой трек проигрывания, не зависимый от других.
Для всей мелодии устанавливается скорость, где такт музыки - n * 20ms.
Трек состоит из списка паттернов, а в каждом паттерне может быть произвольное количество нот и команд.
Нота - это код от 0..59 (60 нот),
Команда начинается с кода $80. Для каналов A, B имеется 6 команд, для канала C - 8 команд.
Следует заметить, что ноты самой верхней октавы плохо перевариваются проигрывателем, и практически непригодны к использованию.
Команды для каналов A и B:
Команды для канала C:Код:$80 - конец паттерна (перейти на следующий паттерн) $81 - выключить ноту (звук) в канале $82, nn - скорость затухания ноты 1..255 (1 - самое быстрое затухание, используется чаще всего) $83, nn - длительность ноты (шага) в тактах $84, nn - транспонирования мелодии. Повышение или понижение последующих нот на заданное число полутонов. $85 - конец мелодии, выход из плеера (для незацикленных мелодий)
В звуковых эффектах тоже имеются свои глюки.Код:$80 - конец паттерна (перейти на следующий паттерн) $81 - нет команды (отсутствие звука) $82 - низкий барабан (не используется ни в Dizzy 1, ни в Dizzy 2) $83, nn - длительность шага в тактах $84 - короткий барабан (не используется ни в Dizzy 1, ни в Dizzy 2) $85 - нет команды (не используется) $86 - шум из ПЗУ с адреса $005C до первого байта $00 (область токенов Бейсика) (используется в Диззи 1, в Dizzy 2 не используется) $87, nn - 30 периодов ударника определенного тона (не используется) (используется в Диззи 1, в Dizzy 2 не используется) (хорошо звучит только $87,$1E)
Например, барабаны $82 и $84 используют в виде паттерна шума код части плейера. Мало того, что энтропия кода далека от случайной, так еще и счетчик указателя используется однобайтный (L вместо HL), поэтому звучать барабаны будут по разному, в зависимости от расположения кода плейера после компиляции.
Кроме того, если звук основной мелодии играется одновременно и в порт бипера, и в порт магнитофона, то звук этих барабанов будет разные для бипера и магнитофона, что, впрочем, может добавить разнообразия в спектр барабана, если порт бипера и магнитофона на конкретном клоне имеют разную громкость.
Барабан с кодом $86 в виде своего паттерна случайных чисел использует часть содержимого ПЗУ Бейсика. Поэтому, если эта область у вас нестандартная, не только звук может звучать иначе, но также барабан может изменить свою длительность, т.к. в виде стоп-байта используется первое встретившееся в ПЗУ значение $00.
Учитывая то, что ни одна из 5 мелодий для Диззи-2 не использует канал C (ударники), можно обрезать часть плеера, высвободив некоторое количество байт, если понадобится.
На этом обзор плеера закончен)
Oleg N. Cher(22.02.2023)
Индексная адресация, относительные переходы, блочные команды, обращения к портам на 48/128 тормознее. А вообще зависит от набора команд теста, и их наложения на паттерн тормозов.
Тест TactMeter почему-то выдает одинаковые тормоза для всех фирменных 128х, причем меньшие, чем на 48, хотя казалось бы.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)