Автор Тема: Sega MD Sound (Yamaha 2612/PSG) - Что оно такое и с чем его едят  (Прочитано 13071 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Цитата
8бит 26кГц нежатый pcm это жирно слишком. да и где такой объем хранить ? карика не хватит же
в идеале нужно чтобы хватало 256б буфера, например пользовать 4бит ADPCM (или другое сжатие) и/или меньшую частоту.
В одном своем хаке я играл с Mega PCM целые песни, почти у всех частота была 22 kHz. Умудрился запихнуть пять штук (правда некоторые были коротки). Хотя песни занимали почти весь РОМ, качество на такой частоте было превосходное.

Цитата
в идеале нужно чтобы хватало 256б буфера, например пользовать 4бит ADPCM (или другое сжатие) и/или меньшую частоту.
Буфер все равно же наполнять придется. Так что остановки в выводе звука неизбежны.

По времени выходит так: самый быстрый способ для загрузки буфера на Z80 - использовать LDIR, тогда на загрузку каждого байта уйдет 21 цикл + 16 циклов по окончанию переноса.
Получается 21*256+16 = 5392 цикла (не считая дополнительного кода на инициализацию регистров для LDIR, загрузку банка и т.д и т.п.)
По времени: 5392 / 3,58*10^6 = 0,0015 с, что составляет примерно 9% времени отображения одного NTSС-кадра (и это не считая времени задержки ответа 68k!). Дак тут все DMA в разы быстрее пройдут, чем наполнится буфер, а если вдруг наполнение буфера придется на работу DMA, время ожидания удвоится.

Чтобы воспроизводить PCM хотя бы на частоте ~15 kHz, неизбежно придется наполнять 256-байтный буфер каждый кадр. Учитывая вышесказанное, очень затратно получается.
Если использовать DPCM (не путать с ADPCM, этот алгоритм и 68K едва ли потянет), тут слегка получше: для той же частоты ~15 kHz придется наполнять буфер примерно раз в два кадра, но это тоже не очень-то выгодно выходит.

В общем, как ни крути - никакой выгоды в буферах в случае с воспроизведением DAC-сэмплов на Сеге нет.

Цитата
vladikcomper, ты случайно не эмукодер?
Нет, но железо и некоторые нюансы знаю неплохо =)

Оффлайн feos

  • Пользователь
  • Сообщений: 785
  • Пол: Мужской
    • Просмотр профиля
vladikcomper,  а нет желания присоединиться к одному буйно развивающемуся проекту? Там практически готово само ядро, но звук еще в разработке.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9364
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Цитата: vladikcomper
По времени выходит так: самый быстрый способ для загрузки буфера на Z80 - использовать LDIR, тогда на загрузку каждого байта уйдет 21 цикл + 16 циклов по окончанию переноса.

самый быстрый способ LDIR  :lol: :lol: :lol: Z80-чайник детектед
давно так не смеялся, тебе еще кодингу на Z80 учиться и учиться
ощутимо быстрее будет в цикле подряд по несколько штук LDI (16 тактов вместо аж 21)
а еще быстрее стеком типа
ld sp, откуда
pop hl
pop de
pop bc
exx
и тп
ld sp, куда
push bc
push de
push hl

я думаю идея понятна
быстрее чем стеком перенос данных на зилоге не сделаешь, короче тебе еще нужно изобретать велосипеды уже использовавшиеся в демках и игрушках на спектруме аж двадцать лет назад ;)
Добавлено позже:
Цитата: vladikcomper
(не путать с ADPCM, этот алгоритм и 68K едва ли потянет

ты видел демку BadApple!!!9 в соседней теме ? так там Z80 вполне себе играет 4bit 13kHz ADPCM

более того, глянь вот этот mod-плеер для Спектрума, там на том же 3,5Мгц Z80 играются четыре канала на 10кГц с разным pitch каждого, да еще и с различными эффектами.
в общем много чего можно сделать на зилоге с такой частотой, талант только нужно иметь.
« Последнее редактирование: 18 Ноябрь 2012, 01:31:33 от MetalliC »

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Цитата
Z80-чайник детектед
Серьезно, в чем смысл такого утверждения? Особенно в рамках ответа на мой предыдущий пост.
Я постарался во всех деталях описать все плюсы и минусы использования буферов, но вместо этого ты разглядел одно лишь предложение про LDIR и ответил в духе "ой-ты-ваще-чайник-рассмешил-меня, потому что вот в этом предложении описан не самый крутой способ, можно извращаться и получше".

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

К слову, Mega PCM - это вообще первое, что я написал на Z80. Когда приступал, был чайником, конечно, ведь опыта программирования конкретно на Z80 было ноль. В конце же работы над проектом я уже приобрел немало опыта. Моей задачей было написать серьезный и функциональный драйвер, с оптимальным кодом. И думаю, со своей задачей я справился, ведь то, что мой драйвер, с огромным количеством новых возможностей, работает быстрее оригинального драйвера Соник 1, в котором почти ничего нет, уже о чем-то говорит.

Цитата
ощутимо быстрее будет в цикле подряд по несколько штук LDI

Ну, допустим, ты будешь использовать LDI, да. Ну быстрее, да. Ощутимо. К черту цикл, давай рассмотрим самый наилучший способ - 256 таких инструкций, идущих подряд. (Что кстати займет целых пол-кило памяти).
Ну получится в итоге, что исполнение занимает 7% от времени отображения NTSC-кадра. И все равно не выгодно.

Цитата
а еще быстрее стеком типа
Ты уверен? Способ-то остроумный. Для переноса 6 байт прокатит (лучше не придумаешь), но нашем случае - сомневаюсь.

Скажем, как ты будешь оперировать оффсетами "куда" и "откуда"? Если оффсеты "куда" статичные и их можно каждый раз загружать как ld sp, xxxx, то в РОМе каждый раз приходится читать с разных мест. В таком случае, по когда ты получил 6 байт из буфера, лучшее, что ты можешь сделать - сохранить значение sp в память, потом записать буфер, заново загрузить sp из памяти. И так каждый раз. А это уже выливается в 40 циклов (20 на ld (xxxx),sp и 20 на ld sp, (xxxxx)). Ну в лучшем случае, это будет на 1-2% быстрее, но, думаю, очевидно, что пляски с сохранением и загрузкой значения стека сводят на нет всю гениальность этого метода + жирный размер кода.
Добавлено позже:
Цитата
ты видел демку BadApple!!!9 в соседней теме ? так там Z80 вполне себе играет 4bit 13kHz ADPCM
Ты хотя бы видел сам алгоритм ADPCM? Аддаптивная Диференциальная Импульсно Кодовая модуляция.
Алгоритм подразумевает изменение шага квантования (шаг квантования "аддаптируется" под изменения волны), причем для предсказания следующего положения волны требуется умножать значение разности волн на величину шага.
Я знаю одного человека, великолепного программиста и разработчика алгоритмов, который написал свою, упрощенную реализацию ADPCM на 68K. Насколько помню, частота звука была 22 kHz. И это на 68K!

Мало того, что Z80 в два раза медленнее, так там еще нет операции умножения, а работа с 16-битными числами предоставляет некоторые трудности (в стандартной реализации 4-bit ADPCM все расчеты идут в 16-битных числах, разрядность выходного сигнала - тоже 16 бит). Это сложно, очень сложно. На гране возможного.

У меня есть мечта. Может когда-нибудь, я попробую реализовать ADPCM на Z80. Может быть, использование большего количества таблиц для промежуточных рассчетов поможет с этим. В любом случае, реализовать такой алгоритм на приемлимой частоте дискретизации, а я хочу более 8 kHz, очень сложно в поем представлении. Если кто-то написал реализацию ADPCM на Z80, то я снимаю перед ним шляпу - это действительно верх мастерства.
« Последнее редактирование: 18 Ноябрь 2012, 03:36:20 от vladikcomper »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Я вставлю свои пять копеек, собственно по сути темы. Хочу понять и разобрать работу одного звукового драйвера на Z80: адреса, работа с 68k. Но какие-то все доки по Z80 сухие, ограниченные коротким описанием команды. А что оно делает, что получается и т.д. - хз.
Поэтому, кто имеет хорошие доки по Z80, выложите, или дайте ссылки, плиз. Важно именно сочетание 68k<->Z80. Переписывать драйвер у меня нет намерений, я лишь хочу понять как оно работает.

Оффлайн r57shell

  • Пользователь
  • Сообщений: 1402
    • Просмотр профиля
DrMefistO, пробовал отлаживать z80 прям во время игры?

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Да, и твоим дебаггером кстати, но, не помню что, но что-то меня не получилось сделать в нем. Поэтому забил на такой способ. Лучше отладка+анализ дизазма.

Оффлайн r57shell

  • Пользователь
  • Сообщений: 1402
    • Просмотр профиля
надо помнить что у меня он глючно показывает регистры. не удалось воткнуться лучше, да и мне этого хватило, вот и забил.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Цитата: r57shell
надо помнить что у меня он глючно показывает регистры.

Во, точно!) Именно по этому я и забил. А другого норм дебагера пошагового и нету( Так что ищу гуд доки)

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9364
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Цитата: DrMefistO
Поэтому, кто имеет хорошие доки по Z80, выложите, или дайте ссылки, плиз.

я учил асм Z80 по вот этой книжке, большая часть книги тебе не нужна, только с стр. 18 общее описание проца и с стр. 38 система команд.
Добавлено позже:
Цитата: DrMefistO
А другого норм дебагера пошагового и нету

в MESS/UME есть же, в консоли дебагера пишешь "focus 1" и он переключится на Z80, focus 0 переключает назад на Моторолу.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Пасибо) Дока действительно грамотно написана. Начал с азов с 18-й страницы.)
Добавлено позже:
Глупый вопрос, но, как войти в дебагер-консоль? Чето жмякаю кнопки, которые в конфиге (`) и не канает. Вылезает Master Volume.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9364
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
эмулятор надо запускать с ключиком -debug, т.е. что-то вроде
mess.exe genesis -cart "blablabla.rom" -debug
можно еще в настройках включить -  в mess.ini найти и изменить строчку debug 0 на debug 1, либо если используешь UI-версию Default Game Options - Debug - Activate Internal Debugger

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Ага, галку нашел, и дебагер ваще чоткий) Даже трейслог есть (жаль, что без получения значений регистров).

Правда не понятка с бряком на Z80 RAM 0000. Не брякается туда. У меня там сразу идет прыжок на команду.

Еще бы доку по YM2612 на английском, или на русском. Та, что в сега-тех-рус тоже неплохая, но про таймеры A и B там написано совсем мало. Мол, их никто не использует, а у меня как-раз драйвер, который использует эти таймеры.

Еще хотелось бы узнать про банки: что в них за данные в РОМе, минимальный размер, и максимальный размер?

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9364
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Цитата: DrMefistO
Правда не понятка с бряком на Z80 RAM 0000. Не брякается туда. У меня там сразу идет прыжок на команду.

есть там косяк/особенность - бряки срабатывают только на текущем процессоре

Цитата: DrMefistO
Еще хотелось бы узнать про банки: что в них за данные в РОМе, минимальный размер, и максимальный размер?

в смысле ?

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Цитата: MetalliC
есть там косяк/особенность - бряки срабатывают только на текущем процессоре

Ну я перехожу фокусом на нужный процессор. И затем ставлю бряк. Что значит на текущем процессоре?
Банк я имею ввиду, который адресуется через 0x6000, подавая биты 23-15.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9364
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Цитата: DrMefistO
Ну я перехожу фокусом на нужный процессор. И затем ставлю бряк. Что значит на текущем процессоре?

уфф, break/watch point-ы срабатывают только для того процессора, который в данный момент включен командой focus, а для остальных - нет.
т.е. если сделать типа так:
focus 1
bpset 0x0000
focus 0
бряка срабатывать не будет

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Цитата: MetalliC
focus 1
bpset 0x0000
focus 0
бряка срабатывать не будет

Ну это я понимаю. Я вроде так и делал.
Добавлено позже:
А банки что?

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Еще хотелось бы узнать про банки: что в них за данные в РОМе, минимальный размер, и максимальный размер?
Банк для Z80 - зеркало размером в 32 кб из памяти 68к из области 000000-FF8000. Номер банка может быть то 0 до 511. Для Z80 банк виден в адресах 8000-FFFF.

Еще бы доку по YM2612 на английском, или на русском. Та, что в сега-тех-рус тоже неплохая, но про таймеры A и B там написано совсем мало. Мол, их никто не использует, а у меня как-раз драйвер, который использует эти таймеры.
http://gendev.spritesmind.net/forum/viewtopic.php?t=386
Ссылка в конце первого поста. Дока довольно сумбурная, поэтому с первого прочтения всё не поймёшь :) Я 3 года назад делал свои тесты на чипе и написал эмуль Ямахи, он рабочий, но очень сырой и некоторые блоки не реализованы. Забросил я его. А позже стал доку клепать, описаывающую работу Ямахи, но тоже быстро забросил. Если интересно, вот. Просьба не плеваться, это всего лишь наброски.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Цитата: GManiac
Банк для Z80 - зеркало размером в 32 кб из памяти 68к из области 000000-FF8000. Номер банка может быть то 0 до 511. Для Z80 банк виден в адресах 8000-FFFF.

Я так понял, что в роме в каждом банке лежат сэмплы? А уж сам драйвер распоряжается, как их читать/воспроизводить?
Цитата: GManiac
Ссылка в конце первого поста. Дока довольно сумбурная, поэтому с первого прочтения всё не поймёшь  Я 3 года назад делал свои тесты на чипе и написал эмуль Ямахи, он рабочий, но очень сырой и некоторые блоки не реализованы. Забросил я его. А позже стал доку клепать, описаывающую работу Ямахи, но тоже быстро забросил. Если интересно, вот. Просьба не плеваться, это всего лишь наброски.

Все равно благодарствую)

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Драйвер пишет номер банка в спец. регистр в памяти Z80 и выбирает, какую область рома в 32 кб ему видеть. А что он оттуда будет читать, дело частное. Если ты про PCM, то да, в роме могут лежать семплы.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9364
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
стоит отметить, что номер/офсет банка устанавливается довольно извращенно -
по адресу 6000 (или 6001) последовательно пишутся 9 байт, младшие биты (D0) всех их образуют наш номер банка, т.е. адрес вида %dddddddd d0000000 00000000

Оффлайн vladikcomper

  • Пользователь
  • Сообщений: 57
  • Пол: Мужской
    • Просмотр профиля
Цитата
Банк для Z80 - зеркало размером в 32 кб из памяти 68к из области 000000-FF8000. Номер банка может быть то 0 до 511. Для Z80 банк виден в адресах 8000-FFFF.
Небольшая поправка: банками можно обхватить всю область памяти 68K, т.е. $00000-$FFFFFF. Ведь если выбрать банк $1FF (511), стартовый адрес 68K будет как раз FF8000 ($1FF<<15), и это охватит диапозон $FF8000-$FFFFFF.
Но в общем-то, интерес представляет только чтение РОМа ($00000-$3FFFFF), насколько я знаю (по информации от ребят, которые проверяли это на железе), Z80 не может читать 68K RAM ($FF0000-$FFFFFF), но он может записывать в нее.

Цитата
Я так понял, что в роме в каждом банке лежат сэмплы? А уж сам драйвер распоряжается, как их читать/воспроизводить?
По большому счету, сэмплы можно расположить в любом месте, но обычно, чтобы Z80 драйверу было удобнее с ними работать, их и другие данные выравнивают по границе в $8000 байт (т.е. преславутые 32 кб), чтобы, когда ты подключишь нужный банк, они располагались в самом начале (с адреса 8000h со стороны Z80).

Хотя, если сделать в драйвере систему автоматического переключения банков (как я сделал в своем), можно вообще забыть о банках - достаточно указать драйверу место, он сам все найдет, подключит нужный банк, и поставит следующий банк, когда сэмпл доиграет до конца текущего. Правда, это несколько затратно в плане программинга, и сделать такое в полноценном звуковом движке на Z80 будет не слишком то просто и приятно.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Цитата: vladikcomper
Небольшая поправка: банками можно обхватить всю область памяти 68K, т.е. $00000-$FFFFFF

$FF8000 - это начальный адрес последнего банка, я просто решил не писать $FFFFFF, чтобы понятней было, что банк всегда выравнивается по 32 кб границе.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Т.е. если номер банка - 0, то мы имеем доступной область 0x000000 - 0x008000, и т.д. до 0xFFFFFF?

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9364
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
ага

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2498
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
а коим образом процессору втолковать, что я хочу проиграть сэмпл?
repeat
OPN_Write(0, $2A, адресбайтасэмпла)
адресбайтасэмпла = адресбайтасэмпла + 1
until сэмлнекончится

так? регистр $2A? чот у меня хрипения и пердения только выходят...

упс... точнее не адрес байта, а значение байта по адресу +1?

Оффлайн the_Sorrow

  • Пользователь
  • Сообщений: 313
    • Просмотр профиля
Если цель - получить сего-звучную композицию, берите любую удобную daw, качайте-ставьте бесплатный vst - YM2612 и творите с комфортом. Там практически весь спектр воспроизводится. Сигнал тот же самый. 21 век на дворе, к чему этим мученичеством заниматься?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2498
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
цель понять какой регистр и что ему слать и в какой очереди, чтоб оно запело сэмпл :)

Оффлайн the_Sorrow

  • Пользователь
  • Сообщений: 313
    • Просмотр профиля
цель понять какой регистр и что ему слать и в какой очереди, чтоб оно запело сэмпл :)

а конечная цель?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2498
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конечная просто эпическая :) раскрывать все карты не буду... но задумка очень хорошая.