Вход

Просмотр полной версии : реалтайм обновление экрана во время 1-бит музона



ALKO
27.03.2013, 17:24
Допустим склепаю я музон на биполе (движок savage)
Как сделать так что б во время проигрывания музона срабатывала подпрограмма на прорисовку атрибутов (768 байт)?
Под прорисовкой атрибутов я имею ввиду банальную перегонку байтов посредством LDIR'a.

(не после каждой ноты , а после определённого кол-ва паттернов)

jerri
27.03.2013, 18:38
ALKO, я бы порекомендовал посмотреть как сделан движок,
благо он в исходниках.
там можно отследить переход и по нотам и по паттернам

Alex Rider
27.03.2013, 19:37
Бипола позволяет выгрузить музон в asm. Найди в нем чтение из порта fe или 1f (если в опциях задал прерывание по кнопкам или джойстику соответственно). Рядом с опросом можно вызывать твои изменялки экрана. Но! Вывод бузыки через бипер жестко тактирован. Если ты своим кодом вмешаешься в поток исполнения, испортишь мелодию (ldir 768 байт с инициализацией - 16153 такта, или 23% тишины с частотой 50 раз в секунду). Темп мелодии опять же упадет. Вместо чистого тона будут хрипы. В общем, не надо так делать.

jerri
27.03.2013, 19:49
Alex Rider, если делать раз в паттерн то можно.

AER
27.03.2013, 19:54
можно и музон разбить на паттерны как музоны.и между ними тыркай.заметно не будет.а если так сделать и паттерн укоротить на ноту в конце то и компресс экраны можно каллить , ну чеб мелодию не рвало придумываем спецмузычку в которой конец паттерна должен стакатится.

ALKO
27.03.2013, 21:02
можно и музон разбить на паттерны как музоны.и между ними тыркай
отдельные музоны будут включать в себя помимо таблицы нот, сам движок, то есть это лишний расход памити.

Alex Rider
27.03.2013, 22:37
отдельные музоны будут включать в себя помимо таблицы нот, сам движок, то есть это лишний расход памити.
Бипола для некоторых движков позволяет инициализить их разными мелодиями, передавая адрес начала в регистрах. Есть и универсальный метод, позволяющий использовать несколько разных мелодий с одной копией движка. Если надо, поделюсь.

ALKO
02.04.2013, 15:32
Музон в данный момент стряпаю, но вопрос по-прежнему остаётся в силе.
Исходя из темпа музона, походу придётся не только между паттернами вызывать подпрограмму, но и посреди паттерна.
Паттернов многовато , разбивать их на отдельные таблицы будет довольно сложно.

---------- Post added at 14:32 ---------- Previous post was at 14:27 ----------

Правильно ли я понял, вызов подпрограммы выполнять в процедуре PATTERN_STEP ?

ALKO
02.04.2013, 19:39
есть одна мысля:
-занести в ячейку памяти определённое число (кол-во итераций, после которых вызывать подпрограмму)
-после каждого проигрывания ноты декрементировать содержимое этой ячейки.
-если содержимое равно нулю, прыгнуть на подпрограмму, после выполнения которой заново установить значение той ячейки памяти.

У меня гуманитарный склад ума, поэтому на практике в ассемблерном коде сомневаюсь, что осилю задуманное.
Если это сообщенице читают ZX-программисты, которым не составит особого труда уделить пару секунд\минут на помощь в изменении исходника savage-движка, буду премного благодарен.

Хочу внести свою мизерную лепту в zx-демострой.

jerri
02.04.2013, 21:59
исходник где?

AAA
02.04.2013, 22:35
была недавно какая то польская демка там играла музыка бипера и эффекты летали. Название запамятовал год 2011-12

Rindex
02.04.2013, 22:47
была недавно какая то польская демка там играла музыка бипера и эффекты летали. Название запамятовал год 2011-12

Оно? http://zxaaa.untergrund.net/view_demo.php?id=4199

AAA
02.04.2013, 22:59
Оно? http://zxaaa.untergrund.net/view_demo.php?id=4199

да

ALKO
02.04.2013, 23:28
исходник где?
вот например.
Только это не конкретно тот музон , который мне нужно (ибо не доделал ещё).
Но исходник движка везде одинаков, разница в инициализации музыки и таблицах нот.

ALKO
02.04.2013, 23:30
была недавно какая то польская демка там играла музыка бипера и эффекты летали. Название запамятовал год 2011-12
это проще, так как там сам движок адаптирован под проигрывание совместно с внешними подпрограммами.

Это ж не сэвэйдж, а обычний монофонический бикающий, встроенной в ПЗУ, процедурой последовательно двумя тонами.(в играх подобное было, например jet set willy, three weeks in paradise , или nosferatu)

jerri
03.04.2013, 09:15
ALKO,
ну да все правильно

FUNC_82_PATTERN_END:

здесь сохраняешь регистры и делаешь то что тебе нужно

ALKO
03.04.2013, 17:44
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;
.... ; и тд.

?

jerri
03.04.2013, 21:44
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

ALKO
03.04.2013, 23:12
не могу нащупать, где же всё таки проигрывается нота по отдельности.
В начало каждой процедуры пробовал пихать ЭТО

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-байтного буфера.

ALKO
06.04.2013, 00:54
Всё равно виснет.

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:
музон шпарит невероятно шустро (ритм ударных при этом остаётся прежним)
Странный этот движок

jerri
06.04.2013, 10:54
Всё равно виснет.

в районе этих адресов вниз и вверх сплошные 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
06.04.2013, 11:27
смотри процедуру проверки нажатия кнопок
так то прерывание срабатывает чуть ли не при каждом изменении положения динамика.

Я уже окончательно решил, что лучше после каждого паттерна выводить картинку (иначе будет тормозить темп)

jerri
06.04.2013, 21:37
ALKO, там есть еще одна проблема.
там для каждого канала своя команда окончания паттерна

ALKO
06.04.2013, 21:54
Эххх... буду наверное делать, как предложил AER.
Разобью на "отдельные музоны".

Но как бы сделать так что б один движок был в программе, а то помимо того, что в памяти копии будут место занимать, так ещё и время будет тратиться на инициализацию.

jerri
07.04.2013, 14:20
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 не смотрел.

Rindex
07.04.2013, 16:40
Вы мне обьясните, а для чего делать демку с бипперной музыкой? Ну ладно ещё игру, где она играет в меню в 48к, раз мозгов не хватило достать музыку и запихнуть её в 128к, но в дему-то зачем? AER, вон их уже кучу сделал, но хоть один человек вспомнит, кроме автора, хоть одно название из его демок и что там такого крутого в эффектах сделано?

ALKO
07.04.2013, 16:56
Rindex, я в своей демке и не планирую крутые эффекты делать.
Лишь банальную смену картинок во время музыки, только и всего.
Арты уже нарисованы, музон готов, осталось собрать это воедино.

Rindex
07.04.2013, 17:08
Rindex, я в своей демке и не планирую крутые эффекты делать.
Лишь банальную смену картинок во время музыки, только и всего.
Арты уже нарисованы, музон готов, осталось собрать это воедино.

Ну возьми туда AY-музыку вставь. Музыки нет? У ААА попроси, у него полно нерелиженной. Просто делаешь, стараешься, а на выходе выйдет ноль.

Вон, та же ААА патя, там нет разделения на бипперную музыку и AY. Там вообще не на какую нет. Ну и будет этот биппер как всегда в конце списка. Для спец-эффектов он сделан, больше не для чего.

Последнее, что мне действительно понравилось из этой музыки - это мелодия в игре Pariboro (http://zx.pk.ru/showthread.php?t=20285). Всё, остальное шлак. И мне кажется, что типа такого, как в этой игре, из наших бипперных музыкантов, никто не осилит.

ALKO
07.04.2013, 17:31
Последнее, что мне действительно понравилось из этой музыки - это мелодия в игре Pariboro. Всё, остальное шлак. И мне кажется, что типа такого, как в этой игре, из наших бипперных музыкантов, никто не осилит.
ну тут уже дело вкуса, лично мне в целом вся музыка на спектруме не нравится, будь то AY или бипер. Уж больно она попсовая и няшная.
Среди восмибитных музонов я являюсь ярым поклонником музла на сегу мегадрайв, но я же не кричу, что :" ВСЯ СПЕКТРУМОВСКАЯ МУЗЫКА ШЛАК!!!", ибо я уважаю деятельность каждого, кто внёс некий вклад в данный вид творчества.

Rindex
07.04.2013, 17:37
Среди восмибитных музонов я являюсь ярым поклонником музла на сегу мегадрайв, но я же не кричу, что :" ВСЯ СПЕКТРУМОВСКАЯ МУЗЫКА ШЛАК!!!", ибо я уважаю деятельность каждого, кто внёс некий вклад в данный вид творчества.

Ну делай, мне то что. Особенно хочется взглянуть на эффекты, что ты там задумал сделать под бипперную музыку.

ALKO
08.04.2013, 02:25
вот моя подпрограмма готова, но работает она не так как хотелось бы, а как всегда.
Почему-то за каждый её вызов картинка вырисовывается дважды и итерация номеров картинки соответственно. То есть проскакивает каждую вторую (отрисовывает мельком, за считанные микросекунды)

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). Не работает.
Где тут может быть ошибка?

ALKO
08.04.2013, 15:03
А всё. Дошло, надо было делать переход по 'zero' , а не по 'no zero'.
Забыл как работает compare просто.

ALKO
08.04.2013, 21:32
Странный баг.
изначально все картинки нормально отображаются ЛДИР-ом, стоит мне только доабвить плеер с музоном, так в каждой картинке появляется битый пиксель по адресу 22528, то есть он всё время установлен в чёрный цвет.

---------- Post added at 20:32 ---------- Previous post was at 20:31 ----------

Уже всё готово, но вот этот баг всё портит.

Alex Rider
08.04.2013, 21:45
После ldir по метке ziga командой ld (hl),0 портится левое верхнее знакоместо следующей картинки.

ALKO
08.04.2013, 22:02
спасибо. Вечно как дело касается ассемблера(та и программирования в целом) , я туплю по-чёрному.
Я ж гуманитарий... диванный философ, не более того.

AER
12.04.2013, 15:36
AER, вон их уже кучу сделал, но хоть один человек вспомнит, кроме автора, хоть одно название из его демок и что там такого крутого в эффектах сделано?
увлекаясь уходишь в свой мир с своими сложностями и их победами, делая эффекты крутые понятные только автору. Но по крайней мере оно интересно. было интересно в ограничениях бипера, в сложности смешать ударники с мелодией, написать в двух ЗАВИСИМЫХ каналах разные инструменты, а то и сделать в двух каналах псевдотрехканальную мелодию жертвуя качеством пика, инвертировать звук наложить гладкий переход от ноты к ноте, и обосратся от мучительной радости.