Вход

Просмотр полной версии : AY и такты. Предельные возможности.



SfS
01.08.2017, 06:00
На последнем CSP возникла дискуссия по поводу того, а можно ли сделать плеер для в 300 тактов. К сожалению, мои надежды на лучшее разбились. В 300 тактов никак не укладывается. Поделюсь своими мыслями, если кому интересно.

Как известно, AY представлен в виде двух портов - FFFD (регистр адреса) и BFFD - (регистр данных).

Как бы я не извращался - самый быстрый вывод такой:

ld c,#FD ; один раз, 7 тактов
;-----------------
; Вывод в один регистр
ld b,#FF ; BC = FFFD ; 7
ld A, <номер регистра> ; 7
out (c),a ; 12
ld b,#BF ; BC = BFFD ; 7
ld A, <данные, записываемые в регистр> ; 7
out (c),a ; 12
;-----------------------------------ВСЕГО: 52 такта

То есть для записи одного регистра AY меньше 52 тактов не получишь (если кто знает как - то прошу поправить меня).

Для воспроизведения одного канала, надо как минимум запись в 2 регистра управления частотой. То есть 104 такта.

То есть имеем следующие предельные (минимальные) параметры вывода звука:

Полное управление AY (11 регистров, без управления огибающей): 52*11 = 572 такта.

Управление тремя каналами. (6 регистров, только частота без громкости и шума): 52*6 = 312 тактов.

Управление двумя каналами. (4 регистра, только частота без громкости и шума): 52*4 = 208 тактов.

Управление одним каналом + шум. (4 регистра, частота и шум ): 52*4 = 208 тактов.


В принципе, два последних варианта вполне укладываются в 300 тактов. Только музыканты будут не в восторге)


Недостатки такого способа вывода звука очевидны: очень большой объем кода. Ну и конвертор писать надо.

Достоинства тоже есть - минимально возможно время и постоянное время выполнения.

DenisGrachev
01.08.2017, 07:07
Самое главное зачем? Ради пары линии которые никто не увидет на реальной машине? :))
Какой-нибудь самый кривой PSG плеер около 1200 тактов, что за проблема? :)

Не вникал, про АУ ничего не знаю почти, наверняка у тебя есть неучтённые моменты. Просто в лоб:


ld c,#FD ; один раз, 7 тактов
ld de,#BFFF; 10 тактов

;-----------------
; Вывод в один регистр
ld hl, <номер регистра + данные, записываемые в регистр>;10
ld b,e ; BC = FFFD ; 4
out (c),l ; 12
ld b,d ; BC = BFFD ; 4
out (c),h ; 12
;-----------------------------------ВСЕГО: 42 такта

SfS
01.08.2017, 07:22
Да. Давно я не кодил на спеке) 42 - уже куда лучше)


Зачем? А чтобы было:)

Дискуссия началась с того, что одному товарищу надо было в деме уложиться в 300 тактов.



Полное управление AY (11 регистров, без управления огибающей): 42*11 = 462 такта.

Управление тремя каналами. (6 регистров, только частота без громкости и шума): 42*6 = 252 такта. (УКЛАДЫВАЕМСЯ в 300 тактов с запасом! Два канала + шум или три канала без шума)

DenisGrachev
01.08.2017, 07:26
Да. Давно я не кодил на спеке) 42 - уже куда лучше)

Дискуссия началась с того, что одному товарищу надо было в деме уложиться в 300 тактов.



Знаем товарища, второй год уже пытается доделать :) Просто практически никакой пользы, ну сделай ты линию не так низко да и всё.

Ну да ладно, спортивный интерес тоже хорошо!

SfS
01.08.2017, 07:35
Другой вопрос, что при выводе 6 регистров за кадр, 1 секунда звука будет занимать 9*6*50 = 2700 байт.
То есть на страничку войдет всего 6 секунд такой "музыки")

- - - Добавлено - - -

Насчет линии и товарища.

Я бы просто побил экран на две части и если вывод на борюдюр в нижней части, то выводил бы звук ДО вывода на бордюр. Если вывод на экран в верхней части - то выводил бы звук после вывода на бордюр. Но я наверное плохо понял, что ему надо и почему так критичны 300 тактов.

DenisGrachev
01.08.2017, 07:37
Другой вопрос, что при выводе 6 регистров за кадр, 1 секунда звука будет занимать 9*6*50 = 2700 байт.
То есть на страничку войдет всего 6 секунд такой "музыки")

есть же какое-то время сразу с начала прерывания (около 3584 тактов на пентагоне), пока ещё луч не начал рисовать ;) вот там и надо сделать постоянную по времени процедуру которая всех спасёт.

SfS
01.08.2017, 07:41
есть же какое-то время сразу с начала прерывания (около 3584 тактов на пентагоне), пока ещё луч не начал рисовать ;) вот там и надо сделать постоянную по времени процедуру которая всех спасёт.

Имеется ввиду кадровый гасящий импульс?

DenisGrachev
01.08.2017, 07:44
Имеется ввиду кадровый гасящий импульс?

Скорее всего да :) Вообще, сейчас проснуться и придут нормальные кодеры, не как я и ещё что-нибудь предложат :)

SfS
01.08.2017, 08:02
Ну я на асме 100 лет не кодировал посерьезному)
Так что пусть кодеры резвятся)

goodboy
01.08.2017, 09:34
заранее подготовленные данные часто выводят таким способом

outi
ld b,e
outi / outd
ld b,d
outi
...

ещё возможно похимичить с неполной дешифрацией

;bc=#c0fd
;de=#090a
LD A,#08
OUT (C),A
OUTI
INC B
INC H
OUT (C),D
OUTD
INC B
INC H
OUT (C),E
OUTI

Hacker VBI
01.08.2017, 09:43
несколько моментов.
1. учёт и выборка потока данных для psg
2. потактовая чётность плеера
...
3. 300 тактов не нужны

SfS
01.08.2017, 11:00
О как активизировались то)

- - - Добавлено - - -

ld c,#FD ; один раз, 7 тактов
ld de,#BFFF ; 10 тактов

;-----------------
; Вывод в один регистр HL = данные в формате <1байт номер регистра>, <1байт данные>;<1байт номер регистра>, <1байт данные>;<1байт номер регистра>, <1байт данные>;....
ld b,e ; 4
outi ; 16
ld b,d ; 4
outi ; 16
;----------ВСЕГО: 40 тактов

Запись в 11 регистров - всего 440 тактов. И данные с кодом мешать не надо! Класс!
Мозги вы тут собрались!)

Если не управлять громкостью - то достаточно 8 регистров, то есть 320 тактов.

А если учесть, что не каждые 1/50 секунды меняются все регистры, то достаточно ограничиться изменением
6 регистров за раз (240 тактов). И все.

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

- - - Добавлено - - -


несколько моментов.
1. учёт и выборка потока данных для psg
2. потактовая чётность плеера
...
3. 300 тактов не нужны

Задача чисто "ради интереса" :)

Shiny
01.08.2017, 12:39
О как активизировались то)


Запись в 11 регистров - всего 440 тактов. И данные с кодом мешать не надо! Класс!

еще бы не собраться - то ли толсто, то ли глупо.

SfS
01.08.2017, 14:34
Ну вот. Меня в троллинге обвиняют чтоли?) Ну стало мне интересно - написал. Заодно и более-менее оптимальное решение быстренько выяснилось.

Shiny
01.08.2017, 14:39
и что выйдет из решения? пердеж и бэквокал в виде огибающей? .psg проигрывателя иногда хватало за глаза

NEO SPECTRUMAN
01.08.2017, 16:12
Полное управление AY (11 регистров, без управления огибающей): 42*11 = 462 такта.

Управление тремя каналами. (6 регистров, только частота без громкости и шума): 42*6 = 252 такта. (УКЛАДЫВАЕМСЯ в 300 тактов с запасом! Два канала + шум или три канала без шума)

не обязательно обновляеть все регистры за один фрейм (одна строка звучит от 3 фреймов и более...)
это критично только для орнаментов
но и они тоже могут быть на пониженной частоте 25ГЦ и не плохо звучить

качество инструментов конечно снизится но не на столько уж прям


правда могут всплыть дополнительные щелчки и булькания
изза того что в этом фрейме не успели обновится 2-й рег частоты или если должен был быть большой перепад громкости и включение шума
само же отставание в обновлении разных групп регистров услышать не реально
сильно короткий интервал

SfS
01.08.2017, 18:20
не обязательно обновляеть все регистры за один фрейм (одна строка звучит от 3 фреймов и более...)

Я об этом уже чуть раньше писал.
Врядли регистры частоты будут меняться каждые 1/50 сек.

Надеюсь товарищу, который хотел уложиться в 300 тактов не нужна музыка с супернаворотами)

NEO SPECTRUMAN
01.08.2017, 18:37
Врядли регистры частоты будут меняться каждые 1/50 сек.
в орнаментах они меняются с частотой 50Гц
сами инструменты тоже могут менять частоту каждый фрейм так же как и громкость

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

а супер навороты чувствительны к времянкам настолько что
сами будут через раз работать на реале (тк нет переинициализации счетчиков у тона)
не говоря уже о разных машинах с разными частотами процов\интов и Ау-ков

Barmaley_m
06.10.2017, 01:15
Есть еще вариант - перемежение кода отрисовки графики и звука. Например: рисуем одну линию - выводим один канал; рисуем вторую - выводим второй канал и т.д. В таком случае не очень важно, сколько тактов займет работа с AY в сумме; достаточно, чтобы эти такты хотя бы во фрагментированном виде были в наличии. В программах, выравненных по времянкам, часто встречаются задержки. Вот можно часть задержек перепилить на работу со звуком.

- - - Добавлено - - -

Во многих играх встречалась музыка с обновлением не каждый кадр. Например: во время игры Marauder выводит один раз за 3 кадра. А по музыке и не скажешь, что она технически ограничена. Хорошо постарался композитор, грамотно распорядился возможностями. Также один раз за 3 кадра обслуживается музыка на 4-м уровне Batman The Movie (уровень называется "Gotham City Parade"). И здесь музыка весьма неплохая.

- - - Добавлено - - -

Можно еще представить себе такой плеер, который каждый кадр обновляет только один канал. Музыка останется трехканальной. Композиторы вздохнут свободнее, а программист - уложится в 100 тактов за кадр:)