Да, более чем возможно, было сделано много раз. 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, разбирая и / или переводя.
Удачи, наслаждайтесь, этот опыт стоит того.