Просмотр полной версии : реалтайм обновление экрана во время 1-бит музона
Допустим склепаю я музон на биполе (движок savage)
Как сделать так что б во время проигрывания музона срабатывала подпрограмма на прорисовку атрибутов (768 байт)?
Под прорисовкой атрибутов я имею ввиду банальную перегонку байтов посредством LDIR'a.
(не после каждой ноты , а после определённого кол-ва паттернов)
ALKO, я бы порекомендовал посмотреть как сделан движок,
благо он в исходниках.
там можно отследить переход и по нотам и по паттернам
Alex Rider
27.03.2013, 19:37
Бипола позволяет выгрузить музон в asm. Найди в нем чтение из порта fe или 1f (если в опциях задал прерывание по кнопкам или джойстику соответственно). Рядом с опросом можно вызывать твои изменялки экрана. Но! Вывод бузыки через бипер жестко тактирован. Если ты своим кодом вмешаешься в поток исполнения, испортишь мелодию (ldir 768 байт с инициализацией - 16153 такта, или 23% тишины с частотой 50 раз в секунду). Темп мелодии опять же упадет. Вместо чистого тона будут хрипы. В общем, не надо так делать.
Alex Rider, если делать раз в паттерн то можно.
можно и музон разбить на паттерны как музоны.и между ними тыркай.заметно не будет.а если так сделать и паттерн укоротить на ноту в конце то и компресс экраны можно каллить , ну чеб мелодию не рвало придумываем спецмузычку в которой конец паттерна должен стакатится.
можно и музон разбить на паттерны как музоны.и между ними тыркай
отдельные музоны будут включать в себя помимо таблицы нот, сам движок, то есть это лишний расход памити.
Alex Rider
27.03.2013, 22:37
отдельные музоны будут включать в себя помимо таблицы нот, сам движок, то есть это лишний расход памити.
Бипола для некоторых движков позволяет инициализить их разными мелодиями, передавая адрес начала в регистрах. Есть и универсальный метод, позволяющий использовать несколько разных мелодий с одной копией движка. Если надо, поделюсь.
Музон в данный момент стряпаю, но вопрос по-прежнему остаётся в силе.
Исходя из темпа музона, походу придётся не только между паттернами вызывать подпрограмму, но и посреди паттерна.
Паттернов многовато , разбивать их на отдельные таблицы будет довольно сложно.
---------- Post added at 14:32 ---------- Previous post was at 14:27 ----------
Правильно ли я понял, вызов подпрограммы выполнять в процедуре PATTERN_STEP ?
есть одна мысля:
-занести в ячейку памяти определённое число (кол-во итераций, после которых вызывать подпрограмму)
-после каждого проигрывания ноты декрементировать содержимое этой ячейки.
-если содержимое равно нулю, прыгнуть на подпрограмму, после выполнения которой заново установить значение той ячейки памяти.
У меня гуманитарный склад ума, поэтому на практике в ассемблерном коде сомневаюсь, что осилю задуманное.
Если это сообщенице читают ZX-программисты, которым не составит особого труда уделить пару секунд\минут на помощь в изменении исходника savage-движка, буду премного благодарен.
Хочу внести свою мизерную лепту в zx-демострой.
была недавно какая то польская демка там играла музыка бипера и эффекты летали. Название запамятовал год 2011-12
была недавно какая то польская демка там играла музыка бипера и эффекты летали. Название запамятовал год 2011-12
Оно? http://zxaaa.untergrund.net/view_demo.php?id=4199
Оно? http://zxaaa.untergrund.net/view_demo.php?id=4199
да
исходник где?
вот например.
Только это не конкретно тот музон , который мне нужно (ибо не доделал ещё).
Но исходник движка везде одинаков, разница в инициализации музыки и таблицах нот.
была недавно какая то польская демка там играла музыка бипера и эффекты летали. Название запамятовал год 2011-12
это проще, так как там сам движок адаптирован под проигрывание совместно с внешними подпрограммами.
Это ж не сэвэйдж, а обычний монофонический бикающий, встроенной в ПЗУ, процедурой последовательно двумя тонами.(в играх подобное было, например jet set willy, three weeks in paradise , или nosferatu)
ALKO,
ну да все правильно
FUNC_82_PATTERN_END:
здесь сохраняешь регистры и делаешь то что тебе нужно
NEXTQUANT_CHK:
Эта функция для воспроизведения каждой ноты?
---------- Post added at 16:10 ---------- Previous post was at 15:42 ----------
NEXTQUANT_CHK:
CALL CHECK_KEY
push AF
push hl
push de
push bc
call shlyapa
pop bc
pop de
pop hl
pop af
shlyapa:
ld hl,16384
ld (hl),10
ret
делаю так
Но после вызова процедуры shlyapa происходит выход в бейсик.(процедура срабатывает, но почему ret возращает в бейсик , а не в цикл движка, не пойму)
---------- Post added at 16:44 ---------- Previous post was at 16:10 ----------
Вроде всё прояснилось.
Нужно было процедуру после вызова прописывать, а я метку влепил наобум, до фразы "call shlyapa" .
Вот вызываю процедуру, затем шаманю там, а как состояние текущих регистров сохранить? В стеке ведь на тот момент состояние регистров движка.
Это что, для сохранения каждого значения делать так:
ld hl,30000 ; адрес второго стека
ld (hl), af ; сохранение регистра
inc hl;
.... ; и тд.
?
ALKO, сначала определись какие регистры тебе надо сохранять и можно ли их сохранить в переменных
напрмер
call old_proc
old_proc
ld a,$
dec a
ld (nn),a
jr z, process completed
ld hl,$
ld de,$
dup 32
ldi
edup
ld (nn),hl
ld (nn),de
ret
process completed
ld hl, new_proc
ld (nn),hl
ret
new_proc
ret
не могу нащупать, где же всё таки проигрывается нота по отдельности.
В начало каждой процедуры пробовал пихать ЭТО
push AF
push hl
push de
push bc
call shlyapa
pop bc
pop de
pop hl
pop af
работает только в NEXTQUANT_CHK:
в остальных случаях зависает. Почему так?
все же необходимые регистры сохранил. инстракшн поинтер вроде должен сам сохраняться при команде call.
сначала определись какие регистры тебе надо сохранять и можно ли их сохранить в переменных
та я так абстрактно представил, что нужен один байт для порядкового номера выводимых картинок, и один для отсчёта количества нот (точнее квантов музыки, так как там и по две ноты за раз проигрываются) , через которое отображать эти самые картинки. С этим проблем не должно возникнуть. Просто поинтересовался какой подход используют с этими самыми вызовами внешних процедур.
Alex Rider
05.04.2013, 10:32
Надо анализировать код плеера. ЕМНИП, он использует стек для выбора данных мелодии из таблиц. Если так, то сохранение регистров на стеке убивает мелодию. Самый простой способ - сохранять регистры так:
ld (old_sp),sp
ld sp,free_mem_block
push af
push bc
push de
push hl
call Shlyapa
pop hl
pop de
pop bc
pop af
ld sp,(old_sp)
---------- Post added at 10:32 ---------- Previous post was at 10:31 ----------
Да, смотрим на направление роста стека и не забываем, что free_mem_block - это конец 8-байтного буфера.
Всё равно виснет.
ld (40000),sp
ld sp,38000
push af
push bc
push de
push hl
call shlyapa
pop hl
pop de
pop bc
pop af
ld sp,(40000)
в районе этих адресов вниз и вверх сплошные NOP'ы.
Чего-то я вообще не соображу почему оно виснет.
---------- Post added at 23:49 ---------- Previous post was at 23:38 ----------
ЗЫ. метку shlyapa я по разному пробовал называть, на результат это не влияет, так что можно отбросить стереотипы.
---------- Post added at 23:54 ---------- Previous post was at 23:49 ----------
При попытке всунуть вызов в процедуру PATTERN_STEP:
музон шпарит невероятно шустро (ритм ударных при этом остаётся прежним)
Странный этот движок
Всё равно виснет.
в районе этих адресов вниз и вверх сплошные NOP'ы.
Чего-то я вообще не соображу почему оно виснет.
---------- Post added at 23:49 ---------- Previous post was at 23:38 ----------
ЗЫ. метку shlyapa я по разному пробовал называть, на результат это не влияет, так что можно отбросить стереотипы.
---------- Post added at 23:54 ---------- Previous post was at 23:49 ----------
При попытке всунуть вызов в процедуру PATTERN_STEP:
музон шпарит невероятно шустро (ритм ударных при этом остаётся прежним)
Странный этот движок
Не туда все-таки :(
смотри процедуру проверки нажатия кнопок
она на прерываниях висит и туда можно что угодно повесить только небольшое
вот например вот с такой фигней звук дребезжать начинает
смотри процедуру проверки нажатия кнопок
так то прерывание срабатывает чуть ли не при каждом изменении положения динамика.
Я уже окончательно решил, что лучше после каждого паттерна выводить картинку (иначе будет тормозить темп)
ALKO, там есть еще одна проблема.
там для каждого канала своя команда окончания паттерна
Эххх... буду наверное делать, как предложил AER.
Разобью на "отдельные музоны".
Но как бы сделать так что б один движок был в программе, а то помимо того, что в памяти копии будут место занимать, так ещё и время будет тратиться на инициализацию.
ALKO, тебе бы асм подучить
там где
CHECK_KEY
;------------------------------------------------------------------
;здесь должен быть опрос клавиатуры
;------------------------------------------------------------------
ld hl,cnt
dec (hl)
call z, process
RET
cnt db 50
;вот эта процедура будет вызываться 1 раз в секунду
process ld (hl),50
ret
Alex Rider
07.04.2013, 16:05
Savage-движок хитрый, но я осилил как заставить его звать твой код после каждого паттерна.
Итак, приступим:
Выгружаем музыку с плеером в asm
Ищем в исходнике FUNC_82_PATTERN_END
Заменяем LD (QNT_VAL + 2),A на CALL MY_CODE
Делаем свою процедуру с именем MY_CODE
Первой командой нашей процедуры делаем LD (QNT_VAL + 2),A
Дальше пишем нужный нам код, заканчиваем RET'ом
Если виснем/глючим при таком раскладе, сохраняем используемые рагистры на стеке.
Компилим, запускаем. Profit!!!
---------- Post added at 16:05 ---------- Previous post was at 16:03 ----------
UPD: не портим точно B, DE, IX. Можно портить A, HL, C. Насчет альтернативных и IY не смотрел.
Вы мне обьясните, а для чего делать демку с бипперной музыкой? Ну ладно ещё игру, где она играет в меню в 48к, раз мозгов не хватило достать музыку и запихнуть её в 128к, но в дему-то зачем? AER, вон их уже кучу сделал, но хоть один человек вспомнит, кроме автора, хоть одно название из его демок и что там такого крутого в эффектах сделано?
Rindex, я в своей демке и не планирую крутые эффекты делать.
Лишь банальную смену картинок во время музыки, только и всего.
Арты уже нарисованы, музон готов, осталось собрать это воедино.
Rindex, я в своей демке и не планирую крутые эффекты делать.
Лишь банальную смену картинок во время музыки, только и всего.
Арты уже нарисованы, музон готов, осталось собрать это воедино.
Ну возьми туда AY-музыку вставь. Музыки нет? У ААА попроси, у него полно нерелиженной. Просто делаешь, стараешься, а на выходе выйдет ноль.
Вон, та же ААА патя, там нет разделения на бипперную музыку и AY. Там вообще не на какую нет. Ну и будет этот биппер как всегда в конце списка. Для спец-эффектов он сделан, больше не для чего.
Последнее, что мне действительно понравилось из этой музыки - это мелодия в игре Pariboro (http://zx.pk.ru/showthread.php?t=20285). Всё, остальное шлак. И мне кажется, что типа такого, как в этой игре, из наших бипперных музыкантов, никто не осилит.
Последнее, что мне действительно понравилось из этой музыки - это мелодия в игре Pariboro. Всё, остальное шлак. И мне кажется, что типа такого, как в этой игре, из наших бипперных музыкантов, никто не осилит.
ну тут уже дело вкуса, лично мне в целом вся музыка на спектруме не нравится, будь то AY или бипер. Уж больно она попсовая и няшная.
Среди восмибитных музонов я являюсь ярым поклонником музла на сегу мегадрайв, но я же не кричу, что :" ВСЯ СПЕКТРУМОВСКАЯ МУЗЫКА ШЛАК!!!", ибо я уважаю деятельность каждого, кто внёс некий вклад в данный вид творчества.
Среди восмибитных музонов я являюсь ярым поклонником музла на сегу мегадрайв, но я же не кричу, что :" ВСЯ СПЕКТРУМОВСКАЯ МУЗЫКА ШЛАК!!!", ибо я уважаю деятельность каждого, кто внёс некий вклад в данный вид творчества.
Ну делай, мне то что. Особенно хочется взглянуть на эффекты, что ты там задумал сделать под бипперную музыку.
вот моя подпрограмма готова, но работает она не так как хотелось бы, а как всегда.
Почему-то за каждый её вызов картинка вырисовывается дважды и итерация номеров картинки соответственно. То есть проскакивает каждую вторую (отрисовывает мельком, за считанные микросекунды)
MY_CODE
LD (QNT_VAL + 2),A
push bc
push de
ld hl,(59900)
ld b, (hl)
inc hl
ld (59900),hl
ld hl, 40000
ld de, 768
LL1 add hl, de
djnz LL1
ld de,22528 ; êóäà
ld bc,768; ñêîêà
ldir
pop de
pop bc
RET
59900 - временное хранение на адрес указателя на номер картинки.
ldir один и inc один , но почему-то они дважды срабатывают... Видать в эту подпрограмму каждый канал по отдельности обращается. Как игнорировать вызов одного из них ?
---------- Post added at 01:00 ---------- Previous post was at 00:59 ----------
что ли создать некий флаг , по которому бы определялась чётность.
---------- Post added at 01:25 ---------- Previous post was at 01:00 ----------
MY_CODE
LD (QNT_VAL + 2),A
push bc
push de
ld hl,59950
ld a,(hl)
CP 1
jp nz , ziga
ld a,1
ld (hl),a
ld hl,(59900)
ld b, (hl)
inc hl
ld (59900),hl
ld hl, 40000
ld de, 768
LL1 add hl, de
djnz LL1
ld de,22528 ; êóäà
ld bc,768; ñêîêà
ldir
ziga:
ld (hl),0
pop de
pop bc
RET
попытался добавить проверку флага (при старте программы 59950 равно 1). Не работает.
Где тут может быть ошибка?
А всё. Дошло, надо было делать переход по 'zero' , а не по 'no zero'.
Забыл как работает compare просто.
Странный баг.
изначально все картинки нормально отображаются ЛДИР-ом, стоит мне только доабвить плеер с музоном, так в каждой картинке появляется битый пиксель по адресу 22528, то есть он всё время установлен в чёрный цвет.
---------- Post added at 20:32 ---------- Previous post was at 20:31 ----------
Уже всё готово, но вот этот баг всё портит.
Alex Rider
08.04.2013, 21:45
После ldir по метке ziga командой ld (hl),0 портится левое верхнее знакоместо следующей картинки.
спасибо. Вечно как дело касается ассемблера(та и программирования в целом) , я туплю по-чёрному.
Я ж гуманитарий... диванный философ, не более того.
AER, вон их уже кучу сделал, но хоть один человек вспомнит, кроме автора, хоть одно название из его демок и что там такого крутого в эффектах сделано?
увлекаясь уходишь в свой мир с своими сложностями и их победами, делая эффекты крутые понятные только автору. Но по крайней мере оно интересно. было интересно в ограничениях бипера, в сложности смешать ударники с мелодией, написать в двух ЗАВИСИМЫХ каналах разные инструменты, а то и сделать в двух каналах псевдотрехканальную мелодию жертвуя качеством пика, инвертировать звук наложить гладкий переход от ноты к ноте, и обосратся от мучительной радости.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot