0x7*_*77D 2 c emulation opcodes gameboy
我正在用C编写一个GameBoy颜色模拟器,只是为了介绍自己进入这个世界,它被解释,没有动态或静态重新编译:P
现在我正在执行C代码中所有CPU操作码的繁琐工作,我必须写下所有这些:http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html我不想从另一个模拟器中取出它们.
问题是,是否有某种方法可以自动执行操作码?也许这是一个愚蠢的问题,它会有一个愚蠢的答案,但我希望尽可能少地工作.:)
我以前做过这种事情,我做的方式是使用宏,但是这样做你最终会导致大量的代码重复,它会溢出cpu缓存并使事情变得缓慢.如果我今天要做的话,除了模糊/罕见的操作码之外,我将摆脱整个"操作码开关/跳转"习惯,并使用一些基于的小型查找表为所有正常的算术/逻辑运算编写通用的无分支代码操作码编号.想想像:
operand1 = regs[operand1_table[opcode]];
operand2 = regs[operand2_table[opcode]];
res[ADD] = operand1+operand2;
res[SUB] = operand1-operand2;
res[OR] = operand1|operand2;
/* ... */
regs[dest_table[opcode]] = res[optype_table[opcode]];
Run Code Online (Sandbox Code Playgroud)
这个代码当然过于简化,但可以扩展以处理内存操作数等.另请注意,跳转指令只是一个添加指令,程序计数器作为其操作数之一.
对于像Z80(或其GB变体)或x86这样的CISC拱门,您还必须处理条件代码标志.然而,它们可以作为第二组计算完成res[...] = ...;,如上所述.
我知道这是一个古老且有答案的问题,但为了记录,如果有人最终遇到同样的问题:
我编写了一个快速脚本来解析这个文档页面并生成一个带有操作码描述的 JSON。
您只需加载此 JSON 并从中生成 GB [dis] 汇编程序代码的样板,这显然可以节省时间,因为 JSON 易于通过大多数脚本语言进行操作。
代码和结果 JSON:
| 归档时间: |
|
| 查看次数: |
5374 次 |
| 最近记录: |