首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GameBoy色彩仿真器操作码自动化

GameBoy色彩仿真器操作码自动化
EN

Stack Overflow用户
提问于 2011-03-25 17:19:37
回答 3查看 5.9K关注 0票数 3

我正在用C语言写一个GameBoy颜色模拟器,只是为了介绍自己进入这个世界,它是被解释的,没有动态或静态重新编译:P

现在,我正处于用C代码实现所有CPU操作码的繁琐任务中,我必须编写所有这些代码:http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html,并且我不想从另一个仿真器中获取它们。

问题是,有什么方法可以自动化操作码的编写吗?也许这是一个愚蠢的问题,它会有一个愚蠢的答案,但我想尽可能少工作。:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-25 20:49:04

我以前做过这种事情,我用宏的方式做过,但这样做会导致大量的代码重复,导致cpu缓存溢出,速度变慢。如果我现在这样做,我会去掉除了晦涩/稀有操作码之外的整个“操作码切换/跳转”习惯用法,并使用一些基于操作码编号的小查找表为所有正常的算术/逻辑操作编写通用的无分支代码。你可以这样想:

代码语言:javascript
复制
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[...] = ...;计算一样。

票数 7
EN

Stack Overflow用户

发布于 2014-02-12 07:39:32

我知道这是一个老生常谈的问题,但根据记录,如果有人最终遇到了同样的问题:

我编写了一个快速脚本来解析这个文档页面,并生成一个带有操作码描述的JSON。

您可以加载此JSON并从中生成GB反汇编程序代码的样板,这显然可以节省时间,因为JSON很容易在大多数脚本语言中操作。

代码和生成的JSON:

票数 5
EN

Stack Overflow用户

发布于 2011-03-26 02:26:29

这就是为什么到目前为止,我只为msp430、6502和thumb...less类型编写了模拟器或静态重新编译器。为了打破单调,我通常会做的是让我想要看到的程序/游戏工作并执行,直到它达到我还没有实现的操作码,然后实现该操作码并重试。

更糟糕的是,您可能需要两个或三个仿真器,或者重写这个仿真器,然后才能感受到如何节省大量输入和/或如何更好地设计重用/逻辑。通过尝试执行你喜欢的rom,你会得到一个随机的指令混合,它把你放入操作码表的不同部分,当你为这些操作码重新使用代码时,你might...might...be能够以更少的重写来改进你的设计。

正如R.所描述的,如果您改为创建电子表格或其他软件可解析的表,则可以从该表编写和重写模拟器代码生成器。同样,你可以从小处开始,你不必制作一个完整的表,尝试几种不同风格的操作码,看看你是否找不出一种允许解析器为模拟器生成代码的表格式。您可以稍后添加标志和其他内容,并使整个过程随着改进而增长。但最终,无论是表还是实际代码,您最终都必须输入所有这些操作码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5430545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档