На хабре раньше был цикл статей про эмуляцию GameBoy на JavaScript. Почему-тo сейчас уже не находит, но если кому-то интересно, то вот оригинал: imrannazar.com/GameBoy-Emulation-in-JavaScript:-The-CPU
При написании эмулятора лучше сразу думать о переносимости. Можно выделить ядро эмуляции и делать разный интерфейс для разных фронтэндов и платформ. А можно использовать SDL в качестве переносимого фронтэнда.
Несмотря на то, что в мои планы переносимость не входила (как и доведение эмулятора до презентабельного состояния), я обеспокоился об отделении ядра эмулятора от всего остального заранее. По сути, наружу торчать лишь три вещи — буфер кадра, буфер сэмплов, состояние кнопок, соответственно, видео, аудио, пользовательский ввод. А уж распоряжаться ими можно как угодно.
Сложно сказать. Начал я в где-то в начале этого года. Закончил буквально неделю назад. Естественно писал я его не целыми днями, а по вечерам. Иногда делал перерыв на пару недель. Большего всего времени отняли процессор и звук. Процессор долго писать сам по себе, да и отлаживать его то еще удовольствие. Звук — коварная штука со скудной документацией, один раз пришлось переделывать с нуля из-за неудачного подхода к эмуляции. О звуке я обязательно напишу в будущих статьях.
Вы намекнули на проблему программы, но увы, проблема именно у вас — нужно найти эту библиотеку direct x (элементарно ищется через гугл) и положить в %systemroot%\system32
«Спасение утопающих дело самих утопающих» — не ново. Решил проблему следующим образом — переименовал имеющийся у меня файл D3DX9_42.dll в D3DX9_43.dll, и программа запустилась. Она при загрузке спрашивает еще какой-то файл. Что ей надо подсунуть? Наверное файл картриджа? Не подскажет ли уважаемый автор, где эти файлы картриджей можно найти?
Не предлагает сайт производителя для Windows XP ничего новее, увы. Вроде как самый свежий у меня Direct X, который существует в природе для моей системы. Вот что показал dxdiag.exe: DirectX 9.0c (4.09.0000.0904).
Проблема в том, что сама Windows XP у меня считается уже устаревшей, но пока устраивает по всем параметрам. Не советуйте пожалуйста переустановить Windows на более новую версию, или купить новый компьютер =).
Что-то я не припомню, что бы в С++ были типы данных WORD и BYTE…
Зачем использовать платформо-зависимый диалект языка, там где не идет на прямую работа с системыми API?
Типы могут быть любые, если их определить. Это просто потому, что так удобнее программисту. Возможно, использовался готовый код. Наверняка человек раньше писал в основном на C.
Конечно можно, все таки и там и там довольно похожие процессоры, но так мы получим только эмуляцию инструкций процессора, к тому же между Z80 и процессором Gameboy есть существенные отличия. Все остальное все равно придется писать самому. Я одно время хотел так же поступить, но моей целью было получение опыта в деле эмуляции, а тут уж лучше все самому.
Исходники не смотрел, лучше спрошу.
Интересно как происходит синхронизация времени исполнения с реальной скоростью работы геймбоя? На современных компьютерах каждая эмулируемая инструкция будет исполняться значительно быстрее оригинала. Вы как-то меряете время исполнения инструкции и добавляете паузу?
Одно время я использовал паузы, но время исполнения отдельных инструкций измерять не требуется. Ядро эмулятора крутится в бесконечном цикле. На каждой итерации я жду, пока эмулятор не произведет полное обновление «экрана», что равняется строго определенному числу тактов процессора Gameboy. Мне достаточно измерить, сколько ушло времени на эмуляцию одного полного обновления «экрана» Gameboy, а там уже делаю паузу, чтобы уложиться в 60 Гц частоту обновления.
Когда я наконец-то сделал адекватную эмуляцию звука, то получилось отказаться от ручной синхронизации (так что правильно, что не смотрели исходники), но обо всем по порядку. Объяснять все сейчас, значит пересказывать куски будущих статей. О синхронизации тоже пойдет речь, это довольно существенная проблема, особенно, когда есть звук.
У разработчиков MAME был цикл статей про тайминг — там описывался правильный подход.
Но он далеко не прост, действительно проще привязаться к обновлениям экрана.
Пишем эмулятор Gameboy, часть 1