Как-то спонтанно все завертелось на форуме tasvideos.org (см.ветки про разработку FCEUX и BizHawk)
Выяснилось, что BizHawk уже на данный момент имеет отличный и идеально работающий денди-режим, но его нельзя включить (без некоторых неочевидных манипуляций).
Приятная новость, я попробовал - действительно работает отлично.
FCEUX же не имеет денди-режима. Но очень хочется его сделать, потому что множество в том числе андроидных эмуляторов основаны на коде fceux-svn.
Как известно, разработчиков FCEUX несколько: наши AnS, feos и Санч и зарубежные - adelikat и zeromus.
Никто из них не заинтересован в денди-режиме, отчасти из-за старого кода FCEU, который в свою очередь форк FCE 1998 года.
Там сплошной хардкод. Увы, так вышло, что самый популярный эмулятор NES основан на таком вот наследии.
Вселяет надежду наличие ядра NEW_PPU, написанного зеромусом в середине 2000х на более-менее внятном синтаксисе, где можно легко отследить и поменять ключевые константы.
Вот что мы имеем:
AnS писал(а):
Personally I don't care about the mode, as I've been playing NES emulators for more than decade, while I was playing Dendy only for a few years in 90s, so I'm long accustomed to 60FPS instead of sluggish 50FPS.
Adelikat писал(а):
I no longer actively develop FCEUX, please talk to AnS about this.
Zeromus писал(а):
I have little interest in FCEUX and especially not things like this. FCEUX is a difficult codebase to work with when it comes to changing core things. Maybe someone else will fix it if you continue to add info to the bugtracker.
Феос отнесся к затее скорее положительно, но нужно знать, куда копать. Он тоже не знает.
Я сам попытался сделать денди-режим из ПАЛа, но моя попытка провалилась.
1) Сначала я заменил ПАЛ тайминги на дендевские в NEW PPU (и заодно поломал NTSC, это очевидно):
http://diffchecker.com/1fw2dxhl (строка 1968 и далее)
2) Потом поменял таблицы звука, чтобы DPCM и тоновые каналы играли на одной высоте тона при запуске НТСЦ-игр на пале:
http://diffchecker.com/qb6e9kz1После этих процедур большинство НТСЦ-игр, которые глючили в пале, стали работать нормально. Даже Батлтоадс/БТиДД перестали наглухо зависать. БТиДД даже дёргается где надо))
Но все равно проскакивают мелкие глюки то там, то здесь (например первый батлтоадс). Я подумал, что это оттого, что частота ЦП до сих пор низкая, и равна 1.66 МГц
3) Нашел частоту ЦП
http://diffchecker.com/5o5l8hidНо когда ее меняю, эти мелкие глюки не исчезают (что уже странно), а звук сильно портится, так что я не могу на слух определить - изменилась ли высота тона - а следовательно, повысилась ли в реальности частота ЦП.
Тогда я попытался пойти другим путем и просто замедлить классический NTSC режим до 50 гц (фактически тот же денди-режим, но сделанный искусственно):
Все работает действительно на 50 гц, но звук намертво портится
http://diffchecker.com/5m5ej1t9 (строка 934)
Если кто-нибудь заинтересован - пишите сюда. На разработчиков надеяться бесполезно, а я совершенно не умею программировать. На что мозгов хватило, то и осилил.
Здесь не обойтись простой заменой ненужных констант на нужные, как в нестопии.
Сделать настоящий денди-режим скорее всего не получится, а если размер аудиобуфера хардкодом завязан на частоту ЦП - это полный мрак (здравствуй, ядро FCEU).
Было бы здорово хотя бы просто реализовать замедление: замедлить NTSC режим до 50 гц при сохранении высоты тона NTSC для всех каналов (включая DPCM)
Для конечного пользователя отличий от настоящего денди режима практически не будет.