Pull to refresh

Comments 32

На хабре раньше был цикл статей про эмуляцию GameBoy на JavaScript. Почему-тo сейчас уже не находит, но если кому-то интересно, то вот оригинал: imrannazar.com/GameBoy-Emulation-in-JavaScript:-The-CPU
Хорошая, статья, только: image. Хотелось запустить посмотреть. DirectX что ли нужен или что это за библиотечка?
Спасибо. Да, я использую Direct3D 9, это как раз одна из его библиотек.
При написании эмулятора лучше сразу думать о переносимости. Можно выделить ядро эмуляции и делать разный интерфейс для разных фронтэндов и платформ. А можно использовать SDL в качестве переносимого фронтэнда.
Несмотря на то, что в мои планы переносимость не входила (как и доведение эмулятора до презентабельного состояния), я обеспокоился об отделении ядра эмулятора от всего остального заранее. По сути, наружу торчать лишь три вещи — буфер кадра, буфер сэмплов, состояние кнопок, соответственно, видео, аудио, пользовательский ввод. А уж распоряжаться ими можно как угодно.
Сколько времени потратили на изучение и разработку?
Сложно сказать. Начал я в где-то в начале этого года. Закончил буквально неделю назад. Естественно писал я его не целыми днями, а по вечерам. Иногда делал перерыв на пару недель. Большего всего времени отняли процессор и звук. Процессор долго писать сам по себе, да и отлаживать его то еще удовольствие. Звук — коварная штука со скудной документацией, один раз пришлось переделывать с нуля из-за неудачного подхода к эмуляции. О звуке я обязательно напишу в будущих статьях.
Если не секрет на кого вы учились? ))
Закончил ИТМО как инженер по специальности информационные системы и технологии
Вы намекнули на проблему программы, но увы, проблема именно у вас — нужно найти эту библиотеку direct x (элементарно ищется через гугл) и положить в %systemroot%\system32
«Спасение утопающих дело самих утопающих» — не ново. Решил проблему следующим образом — переименовал имеющийся у меня файл D3DX9_42.dll в D3DX9_43.dll, и программа запустилась. Она при загрузке спрашивает еще какой-то файл. Что ей надо подсунуть? Наверное файл картриджа? Не подскажет ли уважаемый автор, где эти файлы картриджей можно найти?
>>переименовал имеющийся у меня файл D3DX9_42.dll в D3DX9_43.dll
facepalm
А что не так? Тупо сделал копию, положил её в папку программы, переименовал. Вы как будто с луны упали.
А скачать свежий DirectX c сайта производителя не?
Не предлагает сайт производителя для Windows XP ничего новее, увы. Вроде как самый свежий у меня Direct X, который существует в природе для моей системы. Вот что показал dxdiag.exe: DirectX 9.0c (4.09.0000.0904).

Проблема в том, что сама Windows XP у меня считается уже устаревшей, но пока устраивает по всем параметрам. Не советуйте пожалуйста переустановить Windows на более новую версию, или купить новый компьютер =).
А вы читали что я писал вообще в своём ответе на ваш скриншот?
Читал конечно. Но ничего полезного там не почерпнул.
void Write(WORD addr, BYTE value);

Что-то я не припомню, что бы в С++ были типы данных WORD и BYTE…
Зачем использовать платформо-зависимый диалект языка, там где не идет на прямую работа с системыми API?
Типы могут быть любые, если их определить. Это просто потому, что так удобнее программисту. Возможно, использовался готовый код. Наверняка человек раньше писал в основном на C.
Я бы взял вас на работу… если бы хватило денег.
А нельзя просто взять эмулятор ZX-Spectrum'а под названием QAOP, написанный на JS/HTML, и выпилить из него всё лишнее?)
Конечно можно, все таки и там и там довольно похожие процессоры, но так мы получим только эмуляцию инструкций процессора, к тому же между Z80 и процессором Gameboy есть существенные отличия. Все остальное все равно придется писать самому. Я одно время хотел так же поступить, но моей целью было получение опыта в деле эмуляции, а тут уж лучше все самому.
Исходники не смотрел, лучше спрошу.
Интересно как происходит синхронизация времени исполнения с реальной скоростью работы геймбоя? На современных компьютерах каждая эмулируемая инструкция будет исполняться значительно быстрее оригинала. Вы как-то меряете время исполнения инструкции и добавляете паузу?
Одно время я использовал паузы, но время исполнения отдельных инструкций измерять не требуется. Ядро эмулятора крутится в бесконечном цикле. На каждой итерации я жду, пока эмулятор не произведет полное обновление «экрана», что равняется строго определенному числу тактов процессора Gameboy. Мне достаточно измерить, сколько ушло времени на эмуляцию одного полного обновления «экрана» Gameboy, а там уже делаю паузу, чтобы уложиться в 60 Гц частоту обновления.

Когда я наконец-то сделал адекватную эмуляцию звука, то получилось отказаться от ручной синхронизации (так что правильно, что не смотрели исходники), но обо всем по порядку. Объяснять все сейчас, значит пересказывать куски будущих статей. О синхронизации тоже пойдет речь, это довольно существенная проблема, особенно, когда есть звук.
Спасибо вам за работу, буду ждать с нетерпением продолжения цикла статей.
У разработчиков MAME был цикл статей про тайминг — там описывался правильный подход.
Но он далеко не прост, действительно проще привязаться к обновлениям экрана.

CPU Scheduling in MAME
part 1 aarongiles.com/?p=137
part 2 aarongiles.com/?p=138
part 3 aarongiles.com/?p=139
part 4 aarongiles.com/?p=140
Понятно, что не прост, я по-этому и спросил.
Спасибо за ссылки, обязательно почитаю.
> следующим шагом является документация

Не увидел ссылки на «Pan Docs» — для программиста под GameBoy это в общем-то основной справочный источник: nocash.emubase.de/pandocs.htm
Gameboy CPU manual содержит Pan Docs наряду с другими документами. Одними Pan Docs все таки не обойдешься.
интересная статья. я бы наверное использовал jump table для опкодов, вместо множества кейсов.
Sign up to leave a comment.

Articles

Change theme settings