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

NeoGS software and hardware

Postby Grey » 19 Sep 2018, 21:19

Добрый день. Мне интересно было бы взяться за написание плеера на 8 каналов. Есть опыт написания s3m плеера на PC ещё на 386, на 16 каналов и своего редактора на 24 канала.
В общем с форматом файлов, и с алгоритмом плеера проблем не возникнет.
Единственно, для начала написания нужен настроенный эмулятор с поддержкой NeoGS . Не люблю конфигурировать unreal , искать ромы, библиотеки.
Среда разработки если, что посоветуете, то тоже не плохо будет. 5 лет назад настраивал, себе, но надо искать и вспоминать. что и как делал

(добавка)
Среду разработку настроил : Sublime Text 2 + sjasm + Unreal
Но настроенный Unreal с NeoGS нужен. У меня в эмуляторе либо только обычный GS либо закладка NGS но в ней ничего нельзя выбрать.
А то начну писать под Covox на 15,625 кгц под строчные прерывания TS-Conf-а и тогда меня не остановить, пока не добью. Это не угроза а предупреждение.
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby lvd » 20 Sep 2018, 19:12

Grey wrote:Но настроенный Unreal с NeoGS нужен. У меня в эмуляторе либо только обычный GS либо закладка NGS но в ней ничего нельзя выбрать.

us 0.38.4 отсюда имеет вот такую вкладку NGS:
us0384_ngs.png
us0384_ngs.png (9.76 KB) Viewed 1073 times


Вроде всё что надо есть?

NGS отличается еще от GS тем, что работает на 24 мгц, имеет DMA в/из своей памяти для хоста, доп пейджинг памяти и т.д.
Короче как по доке :)

Можно, кстати, накодить всякие фишки типа таймерных прерываний (с нужной частотой) и т.д. -- имею в виду в прошивку FPGA. Дело облегчается тем, что прошивка в NGS 'искаропки' изменяемая простым способом (любая программа может загрузить свою и рестартнуть НГС под ее управлением), но тут правда возникает нюанс -- кто это сэмулирует для комфортной разработки :)
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1678
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby Grey » 23 Sep 2018, 01:19

Спасибо, буду пробовать. Жаль что там только pentevo и TSConf не эмулируются. Думал сразу под pentevo делать, Ну может это и к лучшему, .
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby Grey » 23 Sep 2018, 01:43

Вот изучаю документацию по NeoGS и понимаю какой я был наивный.
Думал что в ней аппаратно из памяти идет чтение в цап на частоте 37500. А оказывается надо висеть процессором на прерывании и читать из памяти.
Почему ? Понятно, что для совместимости с прошивкой GS в режиме 4 каналов так нужно, но в режиме 8 каналов зачем такой изврат? Сколько тактов процессора в пустую. Можно же было дма сделать, а потом, пусть не сразу, каналов добавить. Через ДМА их складывать можно было бы внутри альтеры, хот 8 каналов, хоть 16, хоть 32.
Получается, сэмпл посчитай, в память положи, а потом трать драгоценные такты - в прерывании из памяти повторно прочитай, да и на обработку прерывания такты потрать. Можно же было сделать для режима 8 каналов проигрывание через дма, а прерывание сделать только по окончании проигрывания 1/2 буфера , ну и порт статуса сделать, какая половина буфера сейчас воспроизводится.
Как было бы все быстро, красиво и просто.
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby lvd » 23 Sep 2018, 23:33

Grey wrote:Думал сразу под pentevo делать, Ну может это и к лучшему, .

http://svn.zxevo.ru/listing.php?repname=UnrealSpeccy
вот тут эмулируется. Вроде в нгс давно изменений никаких не было (в эмуляции в т.ч.)
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1678
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby lvd » 23 Sep 2018, 23:39

Grey wrote:Думал что в ней аппаратно из памяти идет чтение в цап на частоте 37500. А оказывается надо висеть процессором на прерывании и читать из памяти.

Можно сделать DMA.
Это чревато следующим:
1. ДМА на НГС работает только через BUSRQ/BUSACK, будет жрать такты процессора (в принципе если бёрстом вычитывать сразу несколько байт, то меньше, чем если по 1 байту отдельно, дёргая BUSRQ столько же раз, сколько и байтов)
2. Придётся вколхоживать это в эмулятор, и скорее всего съедания тактов процессора там не будет.
3. По сути это целый новый девайс, потому что к ДМА добавятся таймеры и прерывания, счётчики позиции сэмпла и т.д.

в общем, стоит мне этим заняться или как? :)


Кстати, я правильно понял, что ты хочешь микшировать каждый канал на его собственной частоте проигрывания и потом получать по буферу на каждый канал на частоте 37500 Гц? То есть минус вычитка буферов в прерывании, а в остальном будет точно так же, как в текущей прошивке ГС?
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1678
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby Grey » 24 Sep 2018, 02:49

Да. просто что бы буфер аппаратно читался. Ну и прерывание по середине и по концу приходило.

НО если ДМА это гемор , и если это будет новый режим и все равно под него что то писать то можно и даже лучше и проще без ДМА, по принципу, как в Спринтере было сделано.
Например. В альтере так же 8 (а лучше 16) буферов по 256 (а лучше по 512) байт. но заполняются они записью в 8 или 16 (или 16 или 32) отдельных портов , асинхронно, как угодно проигрывателю.
Т.е. проигрыватель посчитал байт сэмпла и тут же без всякой памяти в порт канала его отправил, посчитал следующий байт, его отправил, половину буфера заполнил, перешел на обсчет следующего канала.
все каналы через порт в буфер загнал и ждет , опрашивая в цикле статус буфера, когда половина буфера проиграет, что бы другую половину можно было заполнять. Прерывания вообще не нужны при таком алгоритме.

если буфер будет в 512 байт, то для одного канала будет 2 порта , в старшем байте адреса порта номер ячейки буфера

например так, условно если буфер 512 байт то
порты с 00А0 по FFA0 - первый буфер первого канала
порты с 00B0 по FFB0 - второй буфер первого канала
порты с 00А1 по FFA1 - первый буфер второго канала
порты с 00B1 по FFB1 - второй буфер второго канала
порты с 00AF по FFAF - первый буфер 16-го канала
порты с 00BF по FFBF - второй буфер 16-го канала

запись сэмла в буфер будет выглядеть так
в HL - адрес семпла, в `HL - дробная часть адреса для масштабирования
в DE целая часть, в `DE дробная часть коэффициента
в BC - 00A0

_loop
DUP 128 (или 256 - размер одного буфера)
EXX
ADD HL,DE
EXX
ADC HL,DE
LD A,(HL) - прочитали байт сэмпла
OUT (С),A - и сразу его в буфер альтеры
INC B
ENDDUP
загрузка в hl,de,`hl.`de данных другого канала
переключение страницы, и цикл на начало заполнения буфера
в BC - 00A1
и цикл на _loop

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

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

Если проигрывание буфера сделать с конца от 255 до 0 тогда можно кусок кода
LD A,(HL) - прочитали байт сэмпла
OUT (С),A - и сразу его в буфер альтеры
INC B
заменить на
OUTI
INC HL
и ещё сэкономить несколько (вроде 4) тактов z80
а на буфер в 256 байт - это тысяча тактов на канал, 8000 тактов на цикл проигрывателя что не мало.
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby lvd » 24 Sep 2018, 19:20

С буфером на каждый канал немножечко облом, всего в той альтере 6 (шесть) кусков памяти по 512 байт.
Так что более разумным выглядит вариант, когда скажем 1024 байта на ВСЕ 8 каналов.
Например по 128 байт на канал. Или же так: процессор пишет 8 байт на 8 каналов, после конца записи железка их микширует и пихает в буфер (но буфер теперь 16битный, по разрядности ЦАПа, итого 256 отсчётов в нём лежит).

И тут еще вопрос -- если я наколхожу что-то такое, ты готов прям взять и проверять? Ну там тесты простые слабать, убедиться что гудит и т.д.
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1678
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby Grey » 24 Sep 2018, 20:06

у меня железки нет. Давай я пока под то что в эмуляторе есть, что нибудь навояю, а потом будем пробовать. А пока думать.

128 байт на канал - очень мало - рассчитывать же надо по половине - а за 64 тика ничего не успеешь просчитать.
Записать за один раз все 8 каналов - тоже не вариант - дольше потрачу время на переключения счетчиков сэмплов.
Это только через запись в память а потом отдельным циклом делать запись в порты - опять время тратится.

Подумай, над двумя вариантами -
1 вариант через ДМА есть читать буфер из памяти.
2 вариант - вообще сказка. Подумай над ним, может возможно.
В альтере 2 буфера 16 битных по 512 байт на 256 тиков (а лучше 4 буфера по 2 на канал по 256 тиков),
но писать в них не сразу 8 каналов, а последовательно по 256 байт (с умножениием на громкость канала и перевод в 16 бит), что бы при записи в порты буфера он аппаратно складывался с уже записанным ранее каналом. сэмплы можно со знаком хранить, что бы легче аппаратно их складывать. Первую запись как то выделять что бы при ней не сложение шло, а просто запись (для обнуленея буфера) с переводом в бесзнак - в 32768 . а остальные каналы со знаком, и пусть аппаратно складываются .
При этом варианте к тому же количество каналов вообще не будет иметь значения - хоть 32 заливай, если успеешь обсчитать. Запись же будет идти через один и тот же порт , и порт громкости канала один (или 2 порта громкость в правом и в левом - сразу панинг получится).
Единственно нужно учесть что при сложении не должно произойти оборачивание канала, т.е. перескок через 0 и 65535 обрезать как перегрузку(запирание) канала.
Grey
 
Posts: 89
Joined: 01 Mar 2011, 21:07
Group: Registered users

Postby lvd » 24 Sep 2018, 23:11

Ух, вариант с сложением в буфере 16битных отсчётов -- огонь! А если его с ДМА соединить, типа дма читает и то что прочитано масштабируется и складывается?
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1678
Joined: 07 Apr 2007, 22:28
Group: Registered users

PreviousNext

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

Who is online

Users browsing this forum: No registered users and 1 guest

cron