а ты уверен в этом ? если мне не изменяет склероз, во время DMA Z80 вполне себе продолжает работать, разумеется в это время обращаться к области картриджа нельзя.
Да, во время DMA Z80 может спокойно работать, пока он не обратиться к РОМу.
Обращаться к РОМу можно, но как раз при этом Z80 останавливается вместе с 68K, пока DMA не будет завершен (только тогда 68K даст Z80 ответ).
В моем представлении, написать хороший DAC-драйвер, который бы не обращался постоянно к РОМу, нереально.
Когда-то я рассматривал идею использования буферов, но по моим прикидкам, это выходит нереально невыгодно.
Использование буферов требует намного больше ресурсов, как памяти Z80, так и времени на его наполнение. В случае с прямым чтением из РОМа надо просто прочитать, а в случае с буфером, нужно прочитать, сохранить, чтобы потом прочитать. Скажем, чтобы воспроизводить сэмпл на частоте дискретизации ~26 kHz, нужно за один кадр заносить в буфер примерно 433 байта. Такой объем памяти будет переноситься очень долго (к тому же речь идет о Z80 и его 8-битной шине), а это выливается в задержки в воспроизведении. Качество будет хуже некуда.
то есть если Z80 будет играть PCM из буфера в своей памяти (который периодически должен наполняться M68K) вывод звука будет постоянным и равномерным.
Наполнение со стороны 68K еще хуже. Замучаешься с синхронизацией. Z80 не может сгенерировать прерывание для 68K, чтобы пополнить буфер в нужный момент. Т.е. 68K понятия не имеет, когда наполнить буфер, и сколько z80 успеет проиграть за определенный интервал времени.
И Z80 все равно придется останавливать во время выполнения, а значит - от какой проблемы пытались уйти, к тому и придем.
и я кстати не уверен, что нормальные эмуляторы типа Regen или GenesisPlusGX не эмулируют это дело.
Да, эмуляторы остановку Z80 при DMA не эмулируют. В этом я сам убедился.
Я также сомневаюсь, что они эмулируют так называемый 'cycle stealing' между процессорами. Когда Z80 обращается к РОМу через шину 68K, он крадет у 68K по 4 цикла на каждый акт чтения или записи (да, Z80 может даже писать в 68K RAM, проверено на железе).
vladikcomper, твой драйвер что ли не только в Z80 работает? он ещё и жрёт постоянно такты M68k?
У меня лишь DAC-драйвер. Все, что он делает - проигрывает PCM-ки (но делает это он профессионально =Р).
В Соник 1 используется звуковой движок SMPS, и он работает на стороне 68K. Все такие движки состоят из двух частей: сам движок, обновляющий FM/PSG (со стороны 68k), и собственно DAC-драйвер (со стороны Z80). Mega PCM - это мой новый драйвер, который может заменить родной драйвер в Соник 1, чтобы расширить возможности и качество воспроизведения цифровых сэмплов в игре.
Да, когда звуковой движок работает на стороне 68k, это отнимает немного времени от работы движка самой игры. Но у них есть одно преимущество. Только с ними можно добиться максимально возможного качества воспроизведения DAC-сэмплов (что я и делаю =Р). Ведь Z80 может непрерывно выдавать звук, не отвлекаясь ни на что. А в движках полностью на Z80, Z80 должен отвлекаться на обновление FM/PSG.