问题标签 [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 回答
842 浏览

emulation - 操作码 0xE9 (JP HL) 和 0xF8 (LD HL,SP+r8) 有什么作用?

我想我正在努力正确定义以下模棱两可的操作码:LD HL,SP+r8JP (HL)操作码(0xE90xF8分别)

在我的实现中,LD HL,SP+r8设置HL为 的值SP+r8,但我感觉这可能与从 RAM 加载内存有关。 JP (HL),我PUSH将 PC 放入堆栈并将程序计数器设置为 HL 的值(如JP a16,除了 HL 的值),但我读过一些论坛似乎说这是错误的。

对这些说明中的任何一个所做的任何澄清都会很棒,因为我现在很迷茫。

0 投票
1 回答
1582 浏览

emulation - Game Boy 和 Game Boy Color 在仿真方面有什么区别?

我正在为游戏男孩颜色编写一个模拟器(为了好玩)。我为原始游戏男孩的硬件找到了大量资源和参考资料,即 Imran Nazar 的教程 ( http://imrannazar.com/GameBoy-Emulation-in-JavaScript ) 和 Zak 的书(Z80 指令参考)。我也一直在寻找一些开源模拟器来填补空白。

我无法弄清楚或找不到任何资源的一件事是 GBC 的内存布局及其 gpu。GBC 的内存是游戏男孩的 3 倍,LCD 显示器支持 15 位颜色而不是 2 位。所以肯定有一些事情需要考虑。

任何帮助将不胜感激。:)

0 投票
3 回答
682 浏览

c - 是否可以创建两个 uint8_t 指针指向 uint16_t 指针指向的值的前半部分和后半部分?

我正在尝试用 C 编写 Gameboy 模拟器,目前正在决定如何实现以下行为:

  • 两个 8 位寄存器可以组合起来当作一个 16 位寄存器处理
  • 更改配对中 8 位寄存器之一的值应更改组合寄存器的值

例如,寄存器 A 和 F 是 8 位寄存器,可以联合用作 16 位寄存器 AF。但是,当寄存器 A 和 F 的内容发生变化时,这些变化应反映在后续对寄存器 AF 的引用中。

如果我将寄存器 AF 实现为 a uint16_t*,我可以将寄存器 A 和 F 的内容存储为uint8_t*分别指向寄存器 AF 的第一个和第二个字节吗?如果没有,任何其他建议将不胜感激:)

编辑:澄清一下,这是与 Z80 非常相似的架构

0 投票
2 回答
792 浏览

assembly - 使用我自己的非 ASCII 字符映射作为十进制,使用 LR35902 程序集将无符号 16 位整数从 HL 转换为文本

我需要弄清楚如何为 LR35902(Game Boy 的类似 Z80 的 CPU)制作一个例程,它将获取 HL 的内容(不是它指向的位置,存储在其中的实际数字)并将其转换为 1 到 5 (实际值范围从 0 到 65,535,因为 HL 是 16 位)使用十进制系统的非 ASCII* 字符。我有要打印的例程,并且可以很容易地找到一种裁剪前导零的方法。

我所需要的只是这个函数的至少一些伪代码和一个实际的RGBDS LR35902 ASM 例程。

*我使用自己的 1-byte-per-character charmap 代替 ASCII,其中字符 0 是十六进制字节 $17,一直增加到 9,即 $20。

0 投票
1 回答
410 浏览

lua - Lua:读取未签名的 DWORD 在 Bizhawk 模拟器中不起作用

当我运行我的代码时,我在这一行得到一个错误:

这是控制台给出的错误消息:

我已经对此进行了一段时间的测试和研究,尽管在其他几个项目中使用了这个概念,但我无法让它工作,例如:https ://projectpokemon.org/forums/showthread.php?16681-Gen -3-Lua 脚本

其他一些信息:
1. 我在 BizHawk 模拟器上运行 lua 脚本。
2. 如果我将行更改为 memory.readbyte() 我会收到一条不同的消息,这使我相信控制台无法将 memory.readdwordunsigned() 识别为函数。
3. 该脚本与模拟器的可执行文件位于同一文件夹中。

预先感谢您的任何帮助

0 投票
1 回答
720 浏览

variables - 如何在 Z80 装配体中创建变量?

我正在尝试创建一个包含十六进制值的简单变量0xffff。我已经能够将它作为一个宏来使用SET,但我无法让它与类似的东西一起使用ld _time,$ffff。如何将值加载到 中_time

0 投票
1 回答
153 浏览

c# - 为我的 GameBoy 模拟器使用 NAudio

我已经开始在我的 GB 模拟器中实现音频,为此我正在使用 NAudio。模拟器将输出计算为字节数组,并在每一帧之后将其加载到 BufferedWaveProvider 中。对于输出,我使用 WaveOut,它是在第一个字节数组加载到 BufferedWaveProvider 之后开始的。

它似乎工作得很好,但因为这是我第一次用音频做东西,所以我想知道这是否是正确的做法。

另外,如果您知道如何使四边形波听起来更好或类似的东西,请告诉我。

0 投票
1 回答
1886 浏览

assembly - gameboy ~Z80 处理器中指令 LD A,(C) 的长度

您好,我正在为 Game Boy 编写模拟器。

我使用这个参考:Gameboy CPU (LR35902) 指令集

该文档指出操作码:

长度为 2。

Game Boy CPU 手册分别说这些说明:

将地址 $FF00 + 寄存器 C 处的值放入 A。

将 A 放入地址 $FF00 + 寄存器 C。

我认为它的长度为 1 因为操作码是自给自足的,它不需要解释另一个值。如果它的长度为 2,那么第二个字节的用途是什么?

0 投票
2 回答
758 浏览

emulation - 我可以在 SUB 指令 gameboy 仿真中使用两个补码吗?

您好,我正在为 Game Boy 编写模拟器。

我正在努力使用 SUB 指令

给定a = 0x90

我正在做的是:

我使用 2 补码方法进行减法。

所以减法等价于下面的加法:

在这个过程中,没有进位,也没有半进位,所以我不设置标志。而且我认为这是一个错误,因为其他仿真器(例如BGB确实如此。请注意,结果是正确的,只有标志不正确。

所以我想真正的处理器不使用 2 补码方法,因为没有免费的方法来检索进位和半进位。

不过,我可以使用两个补码来模拟带有标志处理的 SUB 指令,还是应该依赖“经典”减法逻辑?

0 投票
0 回答
213 浏览

c - 如何在 Game Boy 中显示 Tilemap

我正在尝试使用 Game Boy Developer Kit 显示此图像,但在运行模拟器时没有看到它显示

在此处输入图像描述

我使用的代码是这个

我在这里为同一个项目创建了一个要点