我正在用C语言写一个GameBoy颜色模拟器,只是为了介绍自己进入这个世界,它是被解释的,没有动态或静态重新编译:P
现在,我正处于用C代码实现所有CPU操作码的繁琐任务中,我必须编写所有这些代码:http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html,并且我不想从另一个仿真器中获取它们。
问题是,有什么方法可以自动化操作码的编写吗?也许这是一个愚蠢的问题,它会有一个愚蠢的答案,但我想尽可能少工作。:)
发布于 2011-03-25 20:49:04
我以前做过这种事情,我用宏的方式做过,但这样做会导致大量的代码重复,导致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]];该代码当然是过度简化的,但是可以扩展以处理存储器操作数等。还应注意,跳转指令仅仅是将程序计数器作为其操作数之一的加法指令。
对于像Z80 (或其GB变体)或x86这样的CISC archs,您还必须处理条件代码标志。但是,它们可以作为第二组计算来完成,就像上面的res[...] = ...;计算一样。
发布于 2014-02-12 07:39:32
我知道这是一个老生常谈的问题,但根据记录,如果有人最终遇到了同样的问题:
我编写了一个快速脚本来解析这个文档页面,并生成一个带有操作码描述的JSON。
您可以加载此JSON并从中生成GB反汇编程序代码的样板,这显然可以节省时间,因为JSON很容易在大多数脚本语言中操作。
代码和生成的JSON:
发布于 2011-03-26 02:26:29
这就是为什么到目前为止,我只为msp430、6502和thumb...less类型编写了模拟器或静态重新编译器。为了打破单调,我通常会做的是让我想要看到的程序/游戏工作并执行,直到它达到我还没有实现的操作码,然后实现该操作码并重试。
更糟糕的是,您可能需要两个或三个仿真器,或者重写这个仿真器,然后才能感受到如何节省大量输入和/或如何更好地设计重用/逻辑。通过尝试执行你喜欢的rom,你会得到一个随机的指令混合,它把你放入操作码表的不同部分,当你为这些操作码重新使用代码时,你might...might...be能够以更少的重写来改进你的设计。
正如R.所描述的,如果您改为创建电子表格或其他软件可解析的表,则可以从该表编写和重写模拟器代码生成器。同样,你可以从小处开始,你不必制作一个完整的表,尝试几种不同风格的操作码,看看你是否找不出一种允许解析器为模拟器生成代码的表格式。您可以稍后添加标志和其他内容,并使整个过程随着改进而增长。但最终,无论是表还是实际代码,您最终都必须输入所有这些操作码。
https://stackoverflow.com/questions/5430545
复制相似问题