问题标签 [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.
bit-manipulation - 确定进位时如何应用异或?
我正在开发一个gameboy模拟器。我需要实现的 CPU 操作之一是n
向堆栈指针sp
(操作码E8
)添加一个字节。如果第 7 位有进位,则需要设置进位标志。我查看了此操作的两种实现,它们都遵循相同的进位检测逻辑。其代码大致如下:
我已经用几个例子来研究这个逻辑,它确实有效,但我根本不明白它是如何工作的。我了解它xor
的工作原理,但其应用背后的逻辑是什么?谢谢。
assembly - Gameboy 旋转指令
我目前正在实施gameboy模拟器。在执行循环指令时,我注意到 RL 指令是通过进位循环,而 RLC 指令是不带进位循环。互换名称不是更合乎逻辑吗?为什么会这样称呼,是不是有什么隐情呢?
ios - 使用 Swift 创建 Gameboy 游戏
我正在考虑使用 SpriteKit 为 iOS 创建一个复古风格的游戏,我想知道是否有任何方法可以在 Gameboy Advance 上运行它。
根据我所见,Gameboys 可以运行用任何编程语言编写的任何游戏,只要它“编译为 ARM 汇编”即可。我检查了 Swift 是否编译为 ARM 程序集,并且提到了 Swift 编译为本机代码(即程序集)。这是否意味着可以在真正的 Gameboy 上运行复古风格的 iOS 游戏(请记住艺术品需要的分辨率和其他此类限制)?
如果有任何方法可以为 iOS 创建游戏,但也可以在 Gameboy Advance 上运行,请告诉我。
c++ - 不同计算机上的时钟时序变化
我正在我的 github 上实现 DMG-01(AKA gameboy 1989)。我已经实现了 APU 和 PPU,在我的电脑(和我朋友的电脑)上具有(几乎)完美的时机。然而,当我在我朋友的一台电脑上运行模拟器时,它的运行速度是我或其他朋友的两倍。
同步时钟的代码(在游戏机和运行它的电脑之间)如下:
Clock.h 头文件:
时钟.cpp 文件
像这样在 main.cpp 中调用它:
在这种情况下,chrono 是否会在其他计算机中以不同的方式受到影响?时间是绝对的,我明白为什么在一台电脑上运行模拟器会更慢,但为什么更快呢?我检查了我的时钟类型(high_resolution_clock),但我不明白为什么会这样。谢谢!
emulation - 加倍位 gb-emu
提前道歉,因为这是一个老话题。我正在阅读以下关于任天堂徽标数据如何在引导期间被复制到 v-ram 之前如何解压缩和缩放的帖子,有趣的是,写入的数据确实看起来很乱(正如提问者所指出的那样),我已经尽力了(使用我编写的 gb 模拟器)产生相同的输出......但没有成功。
有问题的汇编代码是引导 rom 的这一部分:
作为对上述帖子的回复,v-ram 的输出显示为:
谁能解释这个输出是如何产生的,如果它确实是正确的?
提前谢谢了。
PS 假设 Nintendo 标志被明确地(在一些 C/Java 代码中)复制到 v-ram,0104h
在引导过程中从地址开始以测试引导程序。
memory - 将 MMIO 请求重定向到另一个地址
我正在尝试修改 GBA/NDS 游戏,以便可以通过网络上的控制器以编程方式控制它们。
游戏通过只读的 0x4000130 设备寄存器读取输入。反正有没有将读取重新路由到这个地址到另一个地址?另一个地址是 R/W 并存储来自控制器的输入。
具体来说,GBA/NDS 是裸机嵌入式设备,所以我不太确定这是否可能。我是否需要以某种方式重定向地址总线内的地址以获取该特定地址?是否需要修改 BIOS 以允许此类重定向?
c++ - Qt C++ 中的精确计时回调没有给出预期的结果
我正在尝试为 Game Boy 模拟器实现高分辨率时序。一个 16-17 毫秒的计时器足以让仿真以大致正确的速度进行,但它最终会失去与 BGB 等精确仿真的同步。
我最初在 while 循环中使用 QElapsedTimer。这给出了预期的结果并与 BGB 保持同步,但感觉真的很草率,并且由于不断运行的 while 循环,它尽可能多地消耗 CPU 时间。它还使程序在关闭后驻留在任务管理器中。我尝试使用一毫秒 QTimer 来实现它,该 QTimer 在执行下一帧之前测试 QElapsedTimer。尽管分辨率降低了,但由于检查了 QElapsedTimer,我认为时间会平均到正确的速度。这是我目前拥有的:
对于 59.73 Hz 的刷新率,nanoSecondsPerFrame 计算为 16742005。speedRegulationTimer 是 QElapsedTimer。emulationUpdateTimer 是一个设置为 Qt:PreciseTimer 的 QTimer,并连接到 executionLoop。仿真确实运行,但运行速度约为 50-51 FPS,而不是预期的 59-60 FPS。这绝对是由于时间问题,因为在没有时间限制的情况下运行它会导致帧速率呈指数级增长。要么我的代码有明显的疏忽,要么计时器没有像我预期的那样工作。如果有人看到明显的问题或可以就此提供一些建议,我将不胜感激。
c++ - 创建新的 Qt OpenGL 纹理似乎比重用旧纹理更快
我一直在使用 Qt 和 OpenGL 开发 Game Boy 模拟器。我对 Qt 和 OpenGL 都很陌生。它处于相当稳定的状态,我从 OpenGL 例程中删除了一些我认为是浪费的代码。我有一个由 Qt 信号每秒调用大约 60 次的例程,以更新模拟屏幕的 OpenGL 纹理。我将其更改为仅使用新屏幕缓冲区设置纹理数据。我遇到的问题是,留下破坏和创建新纹理的浪费代码以某种方式比仅设置新数据运行得更快。这就是我所拥有的:
我把它改成这样:
对我来说,这似乎比每次都破坏和创建新纹理要有效得多,但它不知何故大大减慢了仿真速度。我已经测试了多次而没有更改任何其他内容,并且每次添加破坏/创建都会加快速度。我错过了什么吗?每次只设置数据实际上会更糟吗?
assembly - gbz80 睡眠周期如何
我只是不知道如何在 gbz80“汇编”中编写一个简单的睡眠/延迟周期
我必须承认我的 gbz80 知识几乎没有,但我在想类似的事情:
其背后的想法是,通过修改“bc”寄存器值,一旦调用“WaitCyclEx”函数,该值将被加载到寄存器 FF05,它是定时器计数器,也是 gbz80 的唯一计数器。然后该值递减并且该函数被重复直到该值达到零。
要知道循环是否正常工作,我添加了一些这样的声音......
根据 vasm 的说法,一切正常......但我只听到一种声音而不是两种声音......
考虑到处理器的 4Mhz,重复循环 65535 次至少应该让我有时间注意到两个声音之间的轻微延迟......
任何帮助将不胜感激