Использование кода эмулятора SNES с открытым исходным кодом для превращения файла rom в автономную исполняемую игру - PullRequest
2 голосов
/ 14 июня 2010

Можно ли взять исходный код из эмулятора SNES (или любого другого эмулятора игровой системы в этом отношении) и игрового ПЗУ для системы и каким-то образом создать отдельный автономный исполняемый файл, который позволит вам играть в этот конкретный ПЗУ без необходимости использования отдельного диска или самого эмулятора для воспроизведения? Будет ли это трудно, если вы уже получили исходный код rom и эмулятора для работы?

Ответы [ 2 ]

3 голосов
/ 14 июня 2010

Это не должно быть слишком сложно, если у вас есть исходный код эмулятора.Вы можете использовать метод, который часто используется для хранения изображений в исходных файлах c.

По сути, вам нужно создать переменную char * в заголовочном файле и сохранить содержимое файла rom.в этой переменной.Возможно, вы захотите написать сценарий, чтобы автоматизировать это для вас.

Затем вам нужно будет изменить исходный код, чтобы вместо чтения файла из файла он использовал версию памяти в памяти.хранится в вашей переменной и включается в ваш заголовочный файл.

Может потребоваться немного усилий, если вам нужно эмулировать указатели файлов и тому подобное, или вам может повезти и вы обнаружите, что функция загрузки ROM просто загружаетсявесь файл сразу.В этом случае это, вероятно, будет так же просто, как замена функции загрузки файла функцией, возвращающей ваш указатель.

Однако будьте осторожны с вопросами лицензирования.Если эмулятор лицензирован по лицензии GPL, вам может быть не разрешено юридически хранить собственный файл в исполняемом файле, поэтому стоит проверить это, особенно перед тем, как выпустить / распространить его (если вы планируете это сделать).

1 голос
/ 15 июня 2010

Да, более чем возможно, было сделано много раз. Google: статический двоичный перевод. У Грэма Тоала есть хорошая статья на эту тему, которая должна появиться на первых порах. Там может быть какой-то код, возможно, я оставил некоторый код там.

Полное удаление диска может быть немного больше работы, чем вы думаете, но без использования эмулятора, безусловно, возможно. На самом деле, оба требования возможны, и вы можете быть удивлены тем, сколько игр для портативных консолей или игровых приставок переведено и не эмулировано. Esp платформы, такие как от Nintendo, где не хватает вычислительной мощности для эмуляции в реальном времени.

Вам нужен хороший эмулятор в качестве ссылки и / или написать свой собственный эмулятор в качестве ссылки. Затем вам нужно написать дизассемблер, затем у вас есть этот дизассемблер, сгенерирующий код C (пожалуйста, не пытайтесь переводить непосредственно на другую цель, я однажды допустил эту ошибку, C переносим, ​​и компиляторы позаботятся об устранении большого количества мертвого кода для вы). Таким образом, инструкция набора инструкций может быть:

add r0,r0,#2

И это может привести к:

//add r0,r0,#2
r0=r0+2;
do_zflag(r0);
do_nflag(r0);

Похоже, что SNES связан с 6502, и это то, что использовали астероиды, это перевод, над которым я работал время от времени, теперь как хобби. Используемый вами эмулятор, вероятно, написан и настроен для производительности во время выполнения, и в лучшем случае его будет сложно использовать в качестве справочного материала и проверять на шаге блокировки переведенный код. 6502 хорош, потому что по сравнению с z80 инструкций не так уж и много. Как и в случае с любой другой инструкцией с переменной длиной слова, дизассемблер - это ваше первое большое препятствие. Не думайте линейно, думайте о порядке выполнения, думайте как эмулятор, вы не можете линейно переводить инструкции с нуля на N или N на ноль. Вы должны следовать всем возможным путям выполнения, помечая байты в rom как первый байт инструкции, а не как первый байт инструкции. Некоторые байты вы можете декодировать как данные, и если вы выберете пометить их, в противном случае предположите, что все остальные байты являются данными или заполнением. Выяснение того, что делать с этими данными, чтобы избавиться от рома, является проблемой избавления от рома. Некоторые коды обращаются к данным напрямую, другие используют косвенное значение регистра во время перевода, когда вы не представляете, где эти данные или сколько их там. После того, как вы отметили все начальные байты для инструкций, это тривиальная задача - перебрать ром от нуля до N, разбирая и / или переводя.

Удачи, наслаждайтесь, этот опыт стоит того.

...