问题标签 [chip-8]

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 回答
283 浏览

emulation - Chip-8 图形使用位还是字节?

我一直在关注本教程: http: //www.codeslinger.co.uk/pages/projects/chip8.html试图制作一个 Chip-8 模拟器,但我不明白 Draw 操作码。链接的教程说要制作一个 64 x 32 字节数组来保存屏幕数据,我在其他地方也看到过同样的情况。

我的问题是,图形是逐位绘制的,而不是逐字节绘制的。这个问题的解释CHIP 8 图形如何在屏幕上呈现?,例如,表示每个字节包含 8 个像素的精灵数据。如果每个字节包含 8 个像素,屏幕是 64 x 32 像素,并且在我看到的所有 Chip-8 仿真器和教程中都有 64 x 32 字节的屏幕,这是否意味着每个像素由 8 个像素组成?此外,由于像素实际上只是按行绘制,这意味着屏幕实际上是 (64*8) x 32。这真的没有意义,我找不到其他人问这个问题。

0 投票
1 回答
1608 浏览

c++ - GDB 不显示完整的回溯

我正在使用 SDL2 用 C++ 编写 CHIP-8 解释器。源代码位于https://github.com/robbie0630/Chip8Emu。存在此 ROM出现分段错误的问题。我尝试用 GDB 调试问题,但是当我输入 时bt,它显示了一个不完整的堆栈跟踪,只显示了前两个函数,使我无法有效地诊断问题。如何获得完整且有用的堆栈跟踪?

编辑:当我运行时bt,GDB 显示:

这是没用的,因为??没有说明什么,第 223 行cpu.cpp是函数调用。

编辑 2:我在程序上运行了 valgrind,这是输出:

编辑 3:我再次运行 GDB,这次是在看GfxDraw,我注意到发生了这种情况:

所以不知何故GfxDraw被修改为无效的函数指针。但是,我无法弄清楚它在哪里被修改。

0 投票
1 回答
73 浏览

c++ - 词法分析器不断跳过最终标记

所以不,我正在使用 C++ 为 Chip-8 程序集创建一个词法分析器,但它总是跳过第三个标记。

EG(我的函数读取一行汇编)

ADD V1,V2

它只找到 ADD , V1 作为令牌,跳过 V2;相同的

DRW V3,V4,2

它只找到 DRW,V3,V4 我哪里错了?

谢谢!

0 投票
1 回答
462 浏览

c - 使用 GLUT 和 C 闪烁 2D 纹理

我正在尝试使用纯 C 制作一个chip8 仿真器。我设置了大部分操作码,所以我只需要在显示器上工作。我决定使用 GLUT 进行显示,因为它看起来很快速设置。主要思想是将chip8精灵显示到2D纹理上。我让它通过一些操作码执行来显示一些数字,但它在闪烁。我正在使用双缓冲,因为从我读到的内容来看,这是确保可以显示某些内容的最佳方法,但我仍然在闪烁。关于什么可能导致它的任何想法?

这是用于显示的 OpenGL 和 GLUT 的所有代码。

编辑:我可能已经想通了。在绘图操作码中,它使用 XOR。因此,当第一次显示精灵的绘制命令时,再次调用它时它会消失,依此类推。

0 投票
1 回答
827 浏览

stack - “从子程序返回”是什么意思?

我正在尝试使用 C 从头开始​​构建我的第一个 CHIP-8 仿真器。在为指令编写必要的代码时,我遇到了这个操作码:

http://devernay.free.fr/hacks/chip8/C8TECH10.HTM

我知道子程序基本上是一个函数,但是从子程序“返回”是什么意思?程序计数器、堆栈和堆栈指针分别发生了什么?

(另外一个问题):如果我创建了一个可以容纳 16 个值来表示堆栈的数组,那么“堆栈顶部”是 STACK[0] 还是 STACK[15]?我的堆栈指针应该在哪里?

0 投票
1 回答
508 浏览

c - CHIP-8 SDL 渲染问题

我编写了一个chip-8模拟器。无论我做什么,似乎我都无法在屏幕上显示任何像素。奇怪的是我已经检查了代码,上下已经2天了,似乎没有有任何问题。它将 .rom 文件读入内存,并正确获取 OP 代码。

这是源代码:

0 投票
0 回答
475 浏览

javascript - Chip8 模拟器错误

我正在使用 JavaScript 创建一个 Chip8 模拟器,而且我已经完成了很多。问题是,它在最初的几秒钟内工作,然后陷入无限循环的操作码中,并且永远不会爆发。

看看: http: //output.jsbin.com/mopireb/

它呈现两个桨,分数,然后当您检查控制台时(我在其中记录所有操作码和寄存器,这 3 个代码永远循环。

我究竟做错了什么?

这是我的源代码(到目前为止的优化很糟糕,但那是以后的事了):

0 投票
2 回答
284 浏览

opcode - 芯片 8 操作码 FX65 中的增量 I

在构建芯片 8 仿真器时,我遇到了芯片 8 信息的 2 个主要来源似乎不同的问题,这对整个芯片 8 解释器都有影响。

一方面,我们有维基百科,它在操作码 FX65 下告诉我们

“用从地址 I 开始的内存中的值填充 V0 到 VX(包括 VX)。每写入一个值,I 就增加 1。”

其中“每写入一个值,I 就增加 1。” 是重要的部分。

遵循这将导致以下代码:

另一方面,我们有cowgod 的 chip-8 参考,几乎每个教程都链接到该参考,它告诉我们以下内容

“解释器从位置 I 开始的内存中读取值到寄存器 V0 到 Vx。”

应用此逻辑会产生以下代码(这也是大多数芯片 8 实现使用的实现):

这两者之间的主要区别是 I 要么增加,要么不增加。由于 I 是仿真器的寄存器索引,因此程序能否正常运行非常重要。

我想知道的是这个操作码的哪个实现是正确的。

0 投票
0 回答
231 浏览

c - CHIP-8 模拟器无法按预期呈现图形

我一直在尝试将 CHIP-8 仿真器作为个人项目编写,但我一直坚持实现它的图形。

到目前为止,我正在尝试将帧缓冲区实现为 8 位元素的数组,其中每个元素的值应该是 1 或 0,并通过将所述元素的前一个值与新元素进行异或来设置。

我还尝试编写一个 SDL2 例程来将其呈现到屏幕上。我显然在某个地方失败了,因为它显示的只是屏幕的一半白色和另一个黑色,此时程序停止响应。

这是我实现时的 DXYN 指令:

这里也是 SDL2 代码

它可能相关也可能不相关,但我也在附加整个程序:

在进行了 ctx 建议的更正后,颜色问题似乎已基本修复。但是,该程序将 hogwash 渲染到屏幕上,或者看起来如此。此外,我通过使其显示随机像素来测试 SDL2 代码,它似乎可以工作,除了下半部分,它仍然是黑色的,但我想它毕竟与问题无关。

如果例程能够自行渲染,则错误一定是在仿真块的某个地方,但我已经看了好几天了,但我仍然没有找到它。

0 投票
1 回答
375 浏览

chip-8 - Chip-8 程序可以跳转到奇数地址吗?

我正在写一个chip-8解释器。我有我的模拟硬件、指令执行、UI 等。一切都很好,所以我开始实际加载和执行真正的chip8 程序。

在我在网上找到的 zip 存档中,有几款游戏似乎有非法跳转调用。

CowGod 的规范中它说:

所有指令都是 2 个字节长,并且首先存储最高有效字节。在内存中,每条指令的第一个字节应该位于偶数地址。如果一个程序包含精灵数据,它应该被填充,以便它后面的任何指令都正确地位于 RAM 中。

这似乎非常坚持,不可能有一条从奇数内存地址执行的指令,因此我将我的解释器编码为失败是我们最终试图去一个奇数内存地址(主要是因为我假设我正在读一些东西如果发生这种情况是错误的)。

然而,我包中的两个游戏(INVADERSBLITZ)似乎立即以跳转调用开始(他们用他们的名字在 ascii 中签署了 rom,所以第一条指令是在签名后调用跳转。

前者以 开头,后者以0x12 0x25开头0x12 0x17。这两个都指向对奇数地址(分别为 0x225 和 0x217)的跳转调用,然后在我的模拟器中失败。查看它们指向的那些地址,它们看起来像是包含有效指令(前者中的字节 25 包含 0x6000(LD V0, 00),而后者中的字节 17 指向 0xA341(LD I, 341)。

我是否只是过于严格地解释规范,并且预计不会填充实际应用程序并且可以在奇数地址上运行?