通过现成的反编译工具,变成 汇编码:
$0600 20 06 06 JSR $0606 $0603 20 38 06 JSR $0638 $0606 20 0d 06 JSR $060d $0609 20 2a 06 JSR $062a $060c 60 RTS $060d a9 02 LDA #$02 .... $0731 ca DEX $0732 d0 fb BNE $072f $0734 60 RTS然后通过小脚本的正则替换,变成符合 C 语法的 代码:
L_0600: JSR(0606, 0600) L_0603: JSR(0638, 0603) L_0606: JSR(060d, 0606) L_0609: JSR(062a, 0609) L_060c: RTS() L_060d: LDA_IMM(0x02) .... L_0731: DEX() L_0732: BNE(072f) L_0734: RTS()
最后使用 emscripten 将 C 代码编译成 JS 代码:
在线演示(ASDW 控制方向,请用 Chrome 浏览器)
当然,这种方式虽然很简单,但生成的 JS 很大。而且所有的 6502 指令对应的 JS 最终都在一个 function 里面,对浏览器优化也不利。
后记后来还考虑用类似的思路,做一个带 JIT 功能的红白机模拟器。不过了解下 NES 的功能后就基本放弃了,因为远不止 6502 CPU 那么简单,还要考虑硬件中断、卡带 Mapper 等各种复杂的情况,所以就没做了。
大家有什么好的想法,也可以聊聊。