"Во времена всеобщей лжи говорить правду - это экстремизм" - афоризм.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Заодно сюда напишу как тут сделана примитивная музыка и звук:
Хорошая статья кстати: https://www.gamejournal.it/the-sound...r-zx-spectrum/
Собственно в УКНЦ как и на спеке и прочих биперных компах звуки извлекаются переключением 1/0 в регистре бипера (хотя есть и другие способы, но ну их в баню, будем придерживаться стандартов - 1/0 и все тут
Регистр в периферийном (!) процессоре @#177716
Чтобы туда послать бит 1 в динамик надо сделать mov #200, @#177716 (а нефиг париться с bis/bic - поверьте прокатит и так, mov быстрее, а другие биты в этом регистре нам не нужны, пусть будут нулями и зшб)
Чтобы послать 0 в динамик соответственно clr @#177716
Итого весь звук состоит из переключений 1/0 в определенной последовательности.
Можно заюзать ВЕСЬ периферийный проц чтобы издавать звуки (ведь у нас фактически два компа в одном, но блин периферийный проц нужен чтобы рисовать в "синий" план видеопамяти поэтому ну нафиг его полностью юзать под звук)
И тут ведь в УКНЦ в периферийном проце есть таймер который может генерить прерывания по заданной длительности. Вся идея музыки тупо переключать 1/0 и менять длительности этого переключения.
Сначала инициализируем (отключаем) таймер:
Затем его надо включить будет однажды (при звучании эффекта или очередной ноте музыки)Код:; pp timer ready wait PptIni: clr @#177710 tst @#177714 tst @#177710 bne PPTINI return
Срабатывает прерывание например по вектору таймера 304 - вот обработчик бита 1Код:10$: clr @#177716 ; low signal to speaker mov #SndIntHi, @#304 ; set next sound interrupt to high signal proc mov SndLLo, @#177712 ; low signal duration 30$: tst @#177714 tst @#177714 bis #^B01000101, @#177710 ; allow int, start, timer = 8mks 99$: mtps #0
Тут-же устанавливается вектор прерывания на другой адрес (а там включится бит 0), заносится длительность бита 1 в таймер 177712 и два раза считывается регистр 177714 чтобы подтвердить изменение таймера (поверьте - это для надежности! я сам не знаю зачем ДВА раза считывать регистр, вроде одного должно хватать, но так надо и все тут)Код:SndIntHi: mov #200, @#177716 ; set high level mov #SndIntLo, @#304 ; next interrupt addr - set to low tick mov SndLHi, @#177712 tst @#177714 tst @#177714 rti
Для одноголосной музыки все банально. Делаем "ровные" переключения 1/0, но для более комфортного звучания лучше сразу менять duty у сигнала и например уменьшать таймер переключения динамика в 1 на скажем некоторую величину, а таймер переключения в 0 соответственно увеличивать. Получится более весело.
-- тут сообщение из лички с S_V_B ---
За саму идею я взял спектрумовский BeepFX (редактор под винду конечно). Под мои звуки там надо параметры пересчитывать будет.
Сам его код на прерываниях УКНЦ реализовать разумеется нет воозможности. Он там написан под 100% зажирания процессора, а у меня на прерываниях таймера.
Смысл такой. Есть N "фреймов" звука. (это не экранные фреймы, просто цикл)
Есть изначальные параметры "длительность циклов переключения 1/0 во фрейме, длительность 1 в динамике, длительность 0 в динамике"
Также есть дополнительные параметры при смене фрейма мол изменить длительность переключения 1/0, изменить длительность 1, изменить длительность 0"
Врубилось прерывание от таймера 4мкс допустим. Врубаешь 1 в динамике, ставишь длительность 1 в таймер, переставляешь вектор прерывания на другой где будет дальше 0 идти.
Врубилось очередное прерывание, там ставишь 0, ставишь длительность нуля в таймер. Проверяешь что не закончилась длительность локального переключения 1/0
Если закончилась - пошел новый фрейм. Добавляешь к длительностям всем некие числа которые прописаны и по-новой.
Минусы такие что чаще чем сколько-то циклов процессора - прерывания не обслужишь и есть некий минимум на длительности 1/0
Код сам собственно имеется в том-же descent на гитхабе в файле descnt_ppu.mac по метке SNDSTA: но там разбираться долго. Итого весь эффект описывается такими например вещами:
SND005:
.word SND_TONE ; звук (еще есть пауза например и должен быть шум)
.word 04 ; четыре "фрейма"
.word 8*256 ; тут используется только старший байт - 8 циклов смены 1/0 изначально
.word 2*256 ; при смене "фрейма" добавить это к предыдущему мол каждый фрейм длительность смены 1/0 общая будет увеличиваться на 2
.word 124, -20 ; 124 тика таймера для 1 в динамике и каждый фрейм уменьшаем на 20
.word 114, -18 ; 114 тика таймера для 0 в динамике и каждый фрейм уменьшаем на 18 (теперь понятно зачем прибавлять к длительности фрейма 2 чтобы не терять в общей длительности)
.word 0 ; конец хорош звучать
---
Еще можно добавить что таймер в счетчик который пишется 177712 юзает только 12 бит, и не байт и не слово но как сделали так сделали
Последний раз редактировалось BlaireCas; 22.09.2022 в 15:48.
Шедевр портирования на УКНЦ - игра Highway Encounter
Эмуляторы: UKNCBTL, EmuStudio (респект авторам)
Нет к сожалению, но он оперирует похожими вещами. Мол частота переключения 0/1, duty у 1, их изменение каждый фрейм. На прерывания придется разумеется пересчитывать его числа. А полностью отдавать проц на звук нууууу.. неохота, он еще и клаву обслуживает и рисовать только он умеет в "синем" цвете.
Там поэкспериментируй в винде - поймешь кст![]()
Шедевр портирования на УКНЦ - игра Highway Encounter
Эмуляторы: UKNCBTL, EmuStudio (респект авторам)
Будем копать
Мне звук лифта нарыть нужно.
- - - Добавлено - - -
Я в ПП только лабиринт рисую (статику), спрайты скорости не хватает.
БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
Есть ещё вариант использовать AY-3-8910, чтобы не грузить ПП, да и музыку можно проигрывать)
https://github.com/aberranthacker/aberrant_sound_module
Для пробы в своё время заказал три платы, сначала хотел вообще одну, но человек который делал разводку, настоял чтобы я заказал как минимум три, на случай производственных дефектов.
В общем есть ещё две платы, планировал предложить устройство тем кто разрабатывает игры.
Только на какое-то время отошёл от все этой темы.
Но сейчас, если есть интерес, готов передать эти две платы, в том числе и со смонтированными компонентами. Чтобы в играх начала появляться поддержка)
- - - Добавлено - - -
Или отнесу в Яндекс музей)
aberrant_hacker
BlaireCas(23.09.2022)
Не сказал бы, что отсутствие поддержки в эмуляторах как то мешает.
Наоборот приятней на реальной машинке играть, со звуком и музыкой.
Да и когда проигрыватель портировал, это тоже никак не мешало.
Для Союз-Неона например, нет эмулятора с отладчиком, но всё равно что-то пишут под него.
А здесь же, есть необходимые инструменты.
Ну да ладно, пока буду оставаться единственным обладателем уникального устройства![]()
aberrant_hacker
БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)