问题标签 [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.
byte - CHIP-8 游戏的字节数为奇数
我一直在研究 CHIP8 仿真器,并且正在使用 notepad++ 中的十六进制编辑器来查看十六进制值。我碰巧注意到,像 David Winter 的“Blitz”这样的游戏有奇数字节数。
在 CHIP8 中,每个操作码都是 2 个字节长,所以应该有偶数个字节,对吧?
javascript - 芯片8模拟器上的碰撞检测
我做了一个chip8模拟器,但是在绘图时遇到了一些检测碰撞的问题。Chip8 通过对屏幕上的单个像素进行异或运算来绘制屏幕,并在像素关闭时设置一个标志。我的代码如下:
graphics
是一维整数数组,每个整数对应于屏幕上的一个像素。如果一个像素在数组中对应的整数为 1,则该像素为开启,关闭它为 0。该cpu
对象包含所有方法,包括此方法以及寄存器。X
是寄存器的操作码参数,它包含要绘制的精灵的 x 坐标,Y
是寄存器的操作码参数,带有 y 坐标。I
寄存器是内存中要读取的位置。cpu.getBits
功能如下:
完整的代码可以在 github 上找到:https ://github.com/ichub/Chip8 在 chip8cpu.js 中查找实现。
javascript - CHIP 8 图形如何在屏幕上呈现?
操作码 DXYN:在坐标 (VX, VY) 处绘制一个宽度为 8 像素,高度为 N 像素的精灵。从内存位置 I 开始,每行 8 个像素被读取为位编码(每个字节的最高有效位显示在左侧);执行此指令后,我的值不会改变。如上所述,如果任何屏幕像素在绘制精灵时从设置翻转为未设置,则 VF 设置为 1,如果没有发生,则设置为 0。
基本上我有一个名为 graphics 的数组,它是一个双数组,由 64 行新数组构成,每个数组有 32 列。
在这些数组中,我存储了如上所述的图形数据。我的问题是,我是否只需要在数组元素为 1 时绘制一个正方形并在它为 0 时清空该空间?根据 CHIP8 上的一篇博客文章,字体集有一个额外的数组,但它的用途是什么?
我上面提到的博客文章
http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter/
谢谢你。
javascript - 根据规范,我的chip8实现与互联网上的开源代码不同。需要澄清
我正在研究 CHIP8 的实施,我正在阅读
作为参考。我确信这是一个精确的规范,因为它也被几个讨论 CHIP8 的博客推荐。我的问题是,我已经实现了用于处理代码“7xkk”的操作码
这是我的代码
但其他开源 CHIP8 有完全不同的实现
//这个人也检查Vx是否大于255,规范中没有描述。
链接 - https://github.com/loktar00/chip8/blob/master/chip8.js#L181
和我在网上找到的 C++ 实现
//此人添加“opCode & 0x00FF”并应用和操作“0x00FF”。
如果我正在查看一个太旧的规范或者我做得正确,我会感到困惑。
emulation - 芯片 8 LD Vx, K (Fx0A) 操作码行为
我最近决定对一些 Chip8 仿真进行另一次重击。我正在阅读Cowgod 的技术参考资料,并注意到操作码LD Vx, K (Fx0A)的行为略有歧义。
Cowgod 的文档指出All execution stops until a key is pressed
,但没有说明这是否会影响定时器寄存器的行为。
谁能澄清定时器寄存器的递减和被认为是异步的主程序执行?即计时器是否应该在主要执行等待按键时继续倒计时,或者计时器是否应该在继续递减之前等待按键?
我的直觉是,如果定时器在理论上是单独电路的一部分,那么计时应该独立进行,但是定时器也可能需要等待(即蜂鸣器继续发声,直到用户按下任何键)所以我决定问而不是假设。
hex - 如何处理“不可能”的 Chip-8 指令
因此,我一直在将 Chip-8 仿真器作为我的 CompSci 课程的最终项目,并且遇到了一个似乎超出我的代码的问题。我下载的大量演示(我确信它们是真正的 Chip-8 程序,而不是 SuperChip 或类似的东西)包含不符合任何 Chip-8 操作码格式的机器指令。
http://mattmik.com/files/chip8/mastering/chip8.html
页面底部是所有操作码的列表,每个操作码长 2 个字节,以及其中的每个半字节数据代表什么。但是,相当多的程序具有不符合任何指令格式的指令。例如,这是其中一个的十六进制转储 - 我将在其中指出一些个别情况
在 0x154,有
但是任何以 8 开头的指令都不能以 8 结尾——唯一以 8 结尾的合法指令必须以 1、2、3、4、5、6、7 或 e 结尾。另一个,在 0x158,
也没有指令与这种格式匹配。任何以 e 开头的指令的第二个字节必须是 9E 或 A1。
这只是错误的一小部分 - 在整个代码中还有更多这些“不可能”的指令
我做错了什么吗?我应该如何处理这些指示?跳过它们?我用作 Chip-8 资源的页面是否不完整?非常感谢有关如何处理此问题的任何建议。谢谢!
c# - Chip-8 仿真器:降低时钟速度
我打算写一个nes模拟器。但首先,要了解仿真的工作原理,我将编写一个 Chip-8 仿真器。
模拟器快完成了。我在游戏中有一些错误,但很快就会修复。我的问题 1 是将仿真器与 Chip-8 的时钟速度同步。在我经常阅读的互联网上,一般时钟速度应该是〜540Hz。芯片的定时器应以 60Hz 的频率计时。
为了使我的模拟器与 Chip-8 同步,我编写了以下逻辑:
有关更多详细信息,请查看我的仓库:https ://github.com/Marcel-Hoffmann/Chip-8-Emulator
如您所见,对于每个 cpu 周期,我将等待 1852 微秒。结果将是每秒约 540 个周期,等于 540Hz。但我对这个逻辑不是很满意。
有人有更好的想法,如何同步时钟速度?
java - 用 java/libgdx 编写的 CHIP8 模拟器运行太慢
我对 libgdx 有很大的问题。我写了一个小小的 CHIP8 模拟器来学习如何使用 libgdx,但我仍在试图弄清楚如何让它运行得更快。我使用 Pixmap 更新屏幕,然后将其渲染为纹理,但这似乎不是最好的解决方案,因为它运行非常缓慢。这是代码:
有谁知道如何使它更快?
c - C 中的 CHIP8 - 如何正确处理延迟计时器?
TL;DR我需要在 C 中模拟一个计时器,它允许并发写入和读取,同时保持 60 Hz 的恒定递减(不完全准确,但大致准确)。它将成为 Linux CHIP8 仿真器的一部分。使用共享内存和信号量的基于线程的方法会引发一些准确性问题,以及取决于主线程如何使用计时器的竞争条件。
设计和实现这种计时器的最佳方法是什么?
我正在用 C 语言编写一个 Linux CHIP8 解释器,一个模块一个模块,以便深入仿真世界。
我希望我的实现尽可能准确地符合规范。在这方面,计时器已被证明是我最困难的模块。
以延迟计时器为例。在规范中,它是一个“特殊”寄存器,最初设置为 0。有特定的操作码可以设置一个值,并从寄存器中获取它。
如果将非零值输入到寄存器中,它将以 60 Hz 的频率自动开始递减,一旦达到零就停止。
我对其实施的想法包括以下内容:
使用辅助线程自动递减,频率接近 60 Hz,使用
nanosleep()
. 我fork()
暂时用来创建线程。通过使用共享内存
mmap()
来分配定时器寄存器并将其值存储在上面。这种方法允许辅助线程和主线程读取和写入寄存器。使用信号量来同步两个线程的访问。我
sem_open()
用来创建它,并sem_wait()
分别sem_post()
锁定和解锁共享资源。
下面的代码片段说明了这个概念:
我在这种实现中看到的一个潜在问题取决于第三点。如果一个程序碰巧在定时器寄存器达到一个不为零的值时更新它,那么辅助线程一定不能等待主线程解锁资源,否则 60 Hz 延迟将无法实现。这意味着两个线程都可以自由地更新和/或读取寄存器(在辅助线程的情况下持续写入),这显然会引入竞争条件。
一旦我解释了我在做什么以及我试图实现的目标,我的问题是:
设计和模拟允许并发写入和读取同时保持可接受的固定频率的计时器的最佳方法是什么?
keypress - 芯片 8 中的 FX0A 操作码(等待按键)。如果一个键已被按下,我是否需要将其视为按键?
操作码FX0A的描述为:
我的问题是,如果在调用操作码时已经按下某个键,它是否被视为按键?还是在释放键然后再次按下之前不会将其视为按键?
换句话说,我是否需要等到一个键的值被按下,或者直到一个值从 not_pressed 设置为按下?