问题标签 [gameboy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
486 浏览

c# - GameBoy 模拟器中的相对跳转没有跳转到应有的位置

我正在 C# 上开发 GameBoy 模拟器,并使用 Blargg 的测试 ROM(来自此处的 cpu_instrs )对其进行测试。我正在单独进行测试,现在我正在使用07-jr, jp, call, ret, and rst。我正在将我的结果与 bgb 的调试器进行比较。现在,当我到达0209运行 opcode 的位置时0x20 (JR NZ),bgb 会跳转到0x206,但我的模拟器会跳转到0x306.

这是我当前对该指令的代码:

ReadNextByte()从内存返回下一个字节(从 PC + 1 读取),在这种情况下它是 FB(根据 bgb,它是正确的)。据我了解,我必须将 FB 添加到当前 PC,以及指令的长度 (2),但这样做我最终会得到 306,正如我已经解释的那样。

这里有什么我遗漏的东西吗——我的代码中有一些我看不到的错误?

0 投票
0 回答
1117 浏览

c - 我在 Visual Studio Code 中不断收到“解析错误”和“找不到”错误

我正在尝试从教程中学习一点 C 来为 Game Boy 编写游戏,但我不断收到两个错误:“解析错误”和“找不到”错误。谁能告诉发生了什么以及如何解决它?

我只尝试过运行我所拥有的,因为我对 C 语言非常陌生,并且了解不多。

我的主文件:

我试图用这个 .bat 文件将其转换为 .gb:

这是上面代码的结果:

0 投票
1 回答
140 浏览

emulation - 拥有多个调色板的 GameBoy 有什么意义?

每个像素由两位组成,最多允许 4 种灰度。从pandocs 的 LCD Monochrome Palettes 部分,我们可以开发获取颜色的算法(在我理解正确的情况下):

但是仅仅看函数签名我们就可以推断出相同的颜色数字可能会导致不同的颜色;这取决于我们使用的调色板。

我的问题是,当其中两个相同时,为什么我们需要多个调色板,而与第三个的唯一区别0是透明而不是白色?为什么调色板定义会发生变化,而不是用于从调色板中获取颜色的颜色编号?

0 投票
2 回答
2748 浏览

assembly - Game Boy:半进位标志和 16 位指令(尤其是操作码 0xE8)

像许多其他人一样,我正在编写一个 Game Boy 模拟器,并且我对指令 0xE8(ADD SP, n带有 8 位立即数)有几个问题。

这里声称,在 16 位指令中,如果从位 7 到位 8 发生进位,则设置半进位标志,而这里说半进位标志指示从位 11 到位 12 的进位。 Reddit 线程似乎对这个问题有些困惑,而且(我听说是臭名昭著的缺陷)Game Boy CPU 手册似乎也没有什么有用的说法。

我的问题如下:

  1. 半进位标志在操作码 0xE8 中的行为如何?
  2. opcode 0xE8 是如何在物理硬件中实现的?
  3. 哪个是正确的,半进位是从第 7 位到第 8 位,还是半进位是从第 11 位到第 12 位(在 16 位指令的情况下)?
0 投票
1 回答
149 浏览

graphics - 将调色板分配给图像的图块以适合每个 K 种颜色的 N 个调色板

我正在编写一个用于处理平铺图像的工具。一个特点是将整个图像转换为瓦片集和瓦片图,例如,160x144 像素的图像将具有一组唯一的 8x8 瓦片和 20x18 瓦片 ID 的地图。

下一个目标是支持调色板。在一些使用平铺图形的旧平台上,您可能有 8 个调色板,每个调色板 4 种颜色,或者每个 16 种颜色中的 16 种。我想使用尽可能少的调色板自动创建一组符合 N-by-K 限制的调色板;并将这些调色板分配给瓷砖地图,如果不可能,则发出警报。

有一些明显的第一步:如果任何单个图块使用超过 K 种颜色,这是不可能的;一旦被选中,任何颜色是另一个子集的图块都可以轻松地共享其调色板。困难在于处理部分重叠的调色板。考虑 17 块瓷砖,每块有 15 种独特的颜色;如果有足够的重叠,它们可以适应 16x16 的调色板,但这可能是不可能的。

我希望动态编程解决方案可以在这里工作。在问题的任何阶段,都有部分瓷砖分配给调色板;并且决定将下一个图块分配给 N 个调色板中的哪一个。(瓷砖可能甚至没有任何颜色与当时的最佳调色板选择相同;考虑 4 块瓷砖,每块有 4 种独特的颜色,它们都可以使用一个 16 色调色板。)

这个特殊问题已经解决了吗?是否有已知的算法,或者只是所有动态编程的一般技巧?

0 投票
0 回答
58 浏览

emulation - 在 GameBoy 模拟器中实现 LinkCable 时出现问题

我在gameboy模拟器中添加了一个linkcable模拟器:https ://github.com/maxbit89/GBEmulator

链接电缆在https://github.com/maxbit89/GBEmulator/blob/master/serial2sock.c中实现

主要的是我不移动 SB(0xff01) 我只是交换它,当传输完成时我清除 SC 标志 (0xff02) 并触发串行中断 0x58。(从技术上讲,我认为它应该等于移位和触发中断。)

我使用了 gbdev 的 comm.c 示例。(https://github.com/maxbit89/GBEmulator/blob/master/test/roms/free/linkcable.gb)示例工作正常。但是当我用我的实现启动俄罗斯方块时,游戏菜单工作正常(两个实例中都显示了选择)但是当游戏开始时,游戏冻结并挂起循环。

模拟器可以这样开始测试:

GBemulator 实例 1:

GBemulator 实例 2:

注意:当前源没有在 Windows(MinGW) 中编译,因为我没有实现 winsock。(代码是 Debian Buster 的 Testet)

有人能告诉我为什么俄罗斯方块会这样吗?

0 投票
1 回答
172 浏览

emulation - 加减法如何影响 GameBoy 中的寄存器状态?

我目前正在开发一个 GameBoy 模拟器。在编码时,我开始质疑添加到寄存器如何影响它。

cpu上有8个8位寄存器和4个16位寄存器。8 位寄存器可以组合成 16 位寄存器。这是我在代码中表示它们的方式。

问题:

  1. 如果较低的寄存器的值为 0b11111111,我将其加 1。该位是否继续到较高的寄存器,或者它是否环绕到较低的 8 位寄存器的开头。

  2. 如果低位寄存器的值为 0b00000000 并且 I sub 1 从它开始,它是否保持为零,或者该位是否回绕到寄存器的顶部。

  3. 如果一个高位寄存器的值是 0b00000000 并且 I sub 1 从它,它会影响低位寄存器吗?

0 投票
3 回答
82 浏览

c - 位:搜索和替换位序列

作为一名高级程序员,我在位运算方面遇到了很多困难。我希望我想要实现的目标是可行的?

假设我有一个无符号 8 位整数 - 它可以是任何值。让我们处理两个示例:0xe4(11100100) 和0xa5(10100101)。

硬件将它们解释为 4 个:11 10 01 00 和 10 10 01 01。

我正在尝试用纯 C 编写 3 种方法:

  • 用 01 块替换所有00 块。(结果:11 10 01 01 和 10 10 01 01)
  • 所有01 块替换为 10 个块。(结果:11 10 10 10 和 10 10 10 10)
  • 用 11 个块替换所有10 个块。(结果:11 11 11 11 和 11 11 11 11)

试图搜索位替换方法,但无法解决这个特殊要求。我应该从哪里开始?

0 投票
1 回答
252 浏览

assembly - 我怎样才能为这个墨盒头生成校验和?

我正在尝试为 Game Boy 购物车生成墨盒标题校验和。磁带头校验和定义为类似 C 的伪代码:

或者:

该数据从地址开始0x0104。地址0x0134对应于title. 地址0x014D对应于header_checksum.

请注意,出于演示目的,我在.ascii字符串中使用了十六进制转义序列。这实际上不起作用,因为\xGNU 无法识别as

我如何计算这个校验和?如果可能的话,有没有办法使用汇编指令来做到这一点?

0 投票
3 回答
184 浏览

assembly - 有人可以帮我理解一些汇编语言吗?

很抱歉,这不是正确的地方,但我正拼命地试图理解这个汇编脚本中发生的事情(我假设就是这样,基于我已经完成的谷歌搜索时间。)它是口袋妖怪黄色版的rom,我了解一些但不是全部。我想如果我能得到一些帮助来理解这一段在做什么,我可以弄清楚其余的。代码如下所示:

我的理解是第一行只是将其余部分放入名为“PalletTownScript”的标签中,只是稍后引用的名称。第二行检查是否发生了某个事件,详细信息在另一个文件中。到目前为止一切都很好。第三行是对我来说变得复杂的地方。我确定“jr”跳转到脚本的另一部分,然后返回这里?我认为?但是,据我所见,每个示例只有一个参数,而这一行有两个。是跳到z吗?什么是z?我已经搜索了这个文件的其余部分,并且没有名为 z 的部分。z 是另一个函数吗?另一个参数是 .next,据我所知,它是 PalletTownScript 部分的一个子部分。所以它跳到那里是有道理的(但为什么要跳呢?如果它 s 就在那里,它不就是这样做吗?)但我仍然不知道“z”在那里做什么。在.next中,它调用了一些东西并加载了一些其他东西,这很好,但最后,它跳转到另一个文件中的JumpTable(我假设它全部编译后都没有关系,所以我'我不关心那个),但它仍然跳转到.next,然后再次跳转到JumpTable吗?它什么时候回去做那个 SetEvent?之后它会去哪里?m 不关心),但它仍然跳转到 .next,然后再次跳转到 JumpTable?它什么时候回去做那个 SetEvent?之后它会去哪里?m 不关心),但它仍然跳转到 .next,然后再次跳转到 JumpTable?它什么时候回去做那个 SetEvent?之后它会去哪里?

我以前从未处理过大会,这对我来说非常困惑,所以如果有人可以在这方面给我一些帮助,我将不胜感激。谢谢!