我正在用C编写一个GameBoy色彩模拟器,只是为了将自己介绍到这个世界,它被解释,没有动态或静态重新编译:P
现在我正在完成在C代码中实现所有CPU操作码的繁琐任务,我必须编写所有这些:http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html并且我不想从另一个模拟器中获取它们。
问题是,是否有某种方法可以自动执行操作码?也许这是一个愚蠢的问题,它会有一个愚蠢的答案,但我希望尽可能少地工作。 :)
答案 0 :(得分:6)
我以前做过这种事情,我做的方式是使用宏,但是这样做会导致大量的代码重复,这会溢出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拱门,您还必须处理条件代码标志。但是,它们可以作为第二组计算完成,如上面的res[...] = ...;
。
答案 1 :(得分:4)
我知道这是一个陈旧且回答的问题,但是为了记录,如果有人最终遇到同样的问题:
我编写了一个快速脚本来解析此文档页面并生成带有操作码描述的JSON。
您可以加载此JSON并从中生成GB [dis]汇编程序代码的样板,这样可以明显节省时间,因为JSON很容易从大多数脚本语言中操作。
代码和生成的JSON:
答案 2 :(得分:3)
这就是为什么到目前为止,我只为msp430,6502和拇指做了模拟器或静态重新编译......减少输入。打破单调我经常做的是拿一个程序/游戏我想看到工作并执行,直到它碰到我没有实现的操作码,然后实现该操作码并再试一次。
更糟糕的是,在您了解如何节省大量打字和/或如何更好地完成打字之前,可能需要两到三个模拟器或两次或三次重写此模拟器设计重用/逻辑。通过尝试执行一个喜欢的rom,你得到一个随机的指令组合,将你带入操作码表的各个部分,当你重新使用那些操作码的代码时,你可能......可以用更少的代码改进你的设计重新写入。
正如R.可能描述的那样,如果您改为创建电子表格或其他软件可解析表,您可以从该表编写并重写一个模拟器代码生成器。在这里,你可以从小开始,你不必制作一个完整的表,尝试一些不同风格的操作码,看看你是否无法找出一个表格格式,允许你的解析器生成模拟器的代码。您可以稍后添加标志和其他内容,并使整个过程随着改进而增长。但是,在一天结束时,无论是表格还是实际代码,您最终都必须输入所有这些操作码。