【问题标题】:GameBoy color emulator opcodes automationGameBoy 颜色模拟器操作码自动化
【发布时间】:2011-07-22 18:43:07
【问题描述】:

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

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

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

【问题讨论】:

  • +1 我现在正在开发一个 JVM,在花了几个小时实现 add 指令的每个变体之后,我真的希望有人能够说“为什么这当然可以自动化!”希望……
  • 100% 同意,我在搜索后发现了这个...

标签: c emulation opcodes gameboy


【解决方案1】:

我知道这是一个古老且已回答的问题,但为了记录,如果有人最终遇到同样的问题:

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

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

代码和生成的 JSON:

【讨论】:

  • 我自己正在写一个 GB 模拟器,刚刚看到你的帖子。应该会有所帮助,谢谢。有趣的是,您在我看到它的前几天才发布了它!
  • Aurélien Vallée 的 GB 操作码 JSON 文件有几个问题,而自己找出这些问题相当耗时。这是一个带有固定 JSON 文件的仓库:github.com/Prehistoricman/GBEmulatorStuffPrehistoricman 评论)
【解决方案2】:

这就是为什么到目前为止,我只为 msp430、6502 和 thumb... 少打字做过模拟器或静态重新编译器。为了打破单调,我通常会做一个我想查看并执行的程序/游戏,直到它遇到我尚未实现的操作码,然后实现该操作码并重试。

更糟糕的是,您可能需要两到三个仿真器,或者对这个仿真器进行两到三次重写,然后才能体会到如何节省大量打字和/或如何做得更好设计重用/逻辑。通过尝试执行最喜欢的 rom,您会得到一个随机指令组合,将您放入操作码表的各个部分,并且当您为这些操作码重用代码时,您可能...可能...能够用更少的资源改进您的设计重写。

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

【讨论】:

    【解决方案3】:

    我以前做过这种事情,我做的方式是使用宏,但这样做会导致大量代码重复,这会溢出 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[...] = ...; 一样。

    【讨论】:

    • 这绝对是邪恶的(从好的意义上说),但是如果目标指令集包括除法,那么主机、乱序处理器是否足够聪明以避免在一系列这些指令上停顿,未使用其结果。或者除法应该是晦涩/罕见的操作码之一?
    • 我认为除法是非基本算术指令之一。实际上在像 Z80 这样的古老 cpu 上,如果他们甚至有乘法,我也会认为它很少见。
    猜你喜欢
    • 2013-08-01
    • 2015-02-04
    • 2016-07-14
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2013-05-17
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多