Есть задачи для программистов для НГС

NeoGS software and hardware

Postby Grey » 08 Oct 2018, 00:40

останови проигрывание в эмуляторе в любой момент ESC и Ctrl+~ и посмотри в памяти адреса с 6000-7FFF - там весь диапазон проходит и часто запирает - ряд 00000 , ряд FFFFFF
Grey
 
Posts: 93
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby deathsoft » 08 Oct 2018, 01:53

Ну значит часто попадаются нули, которые сводят среднее к 127, т.к. усреднение делается за период 20мс (1 кадр 50Гц). Интересен пример когда в какой либо из каналов, либо во все, всегда выводится FF при громкости 3F, при этом среднее должно получаться тоже FF, и индикатор должен показывать 15, а не 7.

За 20мс в статистике накапливается усреднение за 300-700 записей в ЦАП (это я в счетчиках статистики посмотрел).
User avatar
deathsoft
 
Posts: 358
Joined: 07 Apr 2007, 01:58
Group: Registered users

Postby deathsoft » 08 Oct 2018, 23:26

Выкинул усрднение, сделал вывод последнего выведенного в ЦАП байта раз в кадр, как это сделано для AY и для gs в режиме hle/bass. Теперь уровни громкости показываются правильно 0-15. Выложил в тот же пост на dlcorp.
User avatar
deathsoft
 
Posts: 358
Joined: 07 Apr 2007, 01:58
Group: Registered users

Postby Grey » 09 Oct 2018, 00:30

Ну и правильно. А то синусоиду усреднять, и ждать от неё максимального значения, неблагодарное занятие
Grey
 
Posts: 93
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 13 Oct 2018, 03:32

lvd wrote:36 каналов получается

ответы на вопросы. Ни каких стоп битов не надо. За 1/37500 тик успеем запустить 9- 10 каналов, если на 3-4 тика будет отставание - не смертельно. Макс. длинна сэмпла 65535. Бит на период все же 18 = 6+12

Смотри - я набрасал алгоритм программирования дма машинки. Постарайся под него делать.

в прерывании будет подготавливаться последовательность для записи в порты через LDI в зависимости от изменений в каналах.

У нас 3 порта на запись. где старший байт от 0 до 147 указывает на номер канала и 148 149 служебные ячейки. Да , не прдряд - думаю можно шагать по 150 байт при записи в память ДМА машинки. и вообще внтури памяти распределить их как угодно и удобно.

В служебные ячейки 148-149 первого порта кидаются 2 байта, через сколько тиков (отсчеты по 37500 кгц) должно прийти следующее прерывание, если не менялось, то, остается предыдущее. По умолчанию там 1 - для обычного режима GS. Подразумевается, что это число взято в соответствии с BPM по таблице в стандартной прошивке, но возможно понадобится вызвать промежуточное прерывание, например за 10 тиков до конца BMP, что бы что то подготовить, заранее загрузить в ДМА, и запустить следующее прерывание на 10 тиков. Пока необходимости не вижу но пусть будет.
Еще 2 служебные ячейки второго порта - под глобальную громкость. На неё умножается громкость каналов в момент записи. При изменении глобальной громкости ничего не нужно делать - просто следующие записи в громкости канала будут умножатся на новое значение.

1. Первый порт - кидаются 4 байта: 2-адрес, 2-коэффициент (период), для каждого изменившегося канала, не изменившиеся сами играют дальше. Запись адреса сразу запускает канал ДМА. При этом автоматом, по факту записи, коэфициент - ставится в 0 ( ДМА стоит на месте, ждет следующей записи 2 байта), счетчик длинны ставится в максимум 65535, счетчик смещения и дробная часть адреса обнуляются, значение LoopBegin ставится в 65535, loop в выключен (я надеюсь, что бит loop не понадобится, если проверять аппаратно что LoopBegin=LoopEnd). Бит направления loop - прямой от начала к концу. Хорошо бы, если эти адреса для всех каналов шли подряд - как 148 адресов для 36 каналов. Ненужные пропущу через LD B,адрес , но если подряд несколько программируется то такты с экономятся.
Формат этих 4 байт: 14 бит адрес сегмента, 6 бит целая, 12 бит дробная часть периода. Запись 0 в адрес или период - останавливает канал (либо он сам останавливается при достижении конца, если LoopBegin=LoopEnd)
И так забросив все эти данные всех каналов можно кидать уточнения.
Т.е. у нас первый порт со страшим разрядом 0-147 занят под карту по 4 байта адрес/коэффициент.

2. Второй порт - 4 байт, независимая друг от друга запись. Должна быть возможность записать 2 байта - счетчик смещения. Редко, но бывает, что сэмпл запускают не с начала, а со смещением. Что бы это быстро сделать, можно поменять порт INC С в первом шаге, записать смещение и обратно DEC C в старшей части остается тот же канал что был. Так же в этом порту будет 2 байта Length. При записи в него LoopEnd приравнивается Length и цикл пока выключен.
Т.е. у нас второй порт со страшим разрядом 0-147 занят под карту по 4 байта смещение/длинна (что не пишем, то не меняется)

3. Третий порт 4 байта: 2 байта громкость, в момент записи громкости она сразу умножается на глобальную и хранится уже в таком виде. Старшие 2+2 бита: суроунд, loop только вперед , только назад , Ping-Pong, (и того 3 служебных бита. Ну если ни как без отдельного бита под loop то +1 бит). И 2 байта LoopBegin, и если он <> LoopEnd то включается режим loop.


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

По идее всё - внутренние ячейки с информацией о дробной части или ещё какая то служебная информация снаружи не нужна.

P.S. Пока семимильными шагами продолжаю писать под 8 программных каналов. Основное ядро готово - в теме пример выложен. Хотелось бы на железе что бы кто проверил. Но очень надеюсь на появление 36 канального ДМА . Иначе смысла развивать проект до чего то серьезного нету. просто игралка S3M на 8 каналов и так уже работает.
Grey
 
Posts: 93
Joined: 01 Mar 2011, 21:07
Group: Registered users

Previous

Return to NeoGS - софт и железо

Who is online

Users browsing this forum: No registered users and 1 guest

cron