Testing 如何加载nestest ROM?
我完成了6502模拟器的编写,准备开始测试它。我找到了带有一些文档的ROM,但我不确定加载ROM的正确方式。作者说,模拟器应该从0xC000开始,当我加载ROM时,它包含0,所以我一定是做错了什么 现在我的加载过程如下所示:Testing 如何加载nestest ROM?,testing,rom,6502,nintendo,Testing,Rom,6502,Nintendo,我完成了6502模拟器的编写,准备开始测试它。我找到了带有一些文档的ROM,但我不确定加载ROM的正确方式。作者说,模拟器应该从0xC000开始,当我加载ROM时,它包含0,所以我一定是做错了什么 现在我的加载过程如下所示: clear memory set PC to 0x8000 open the file skip first 16 bytes (iNES header) load the rest of the file into RAM (starting at 0x8000) set
clear memory
set PC to 0x8000
open the file
skip first 16 bytes (iNES header)
load the rest of the file into RAM (starting at 0x8000)
set PC to 0xC000
根据Nick Westgate的评论(即即时社区wiki),加载过程: 现在,您可以从偏移量0x0010开始加载0x4000字节,然后映射 将其作为ROM转换为模拟的$8000-$BFFF和$C000-$FFFF 6502的内存映射 “暂时”假设您将要编写一个NES模拟器,因此有一天将正确解析存储测试的NES相关文件格式,并模拟导致内容镜像的NES特定内存映射方案 忽略之前帖子中的评论,即你应该“在每个周期中[记录]你的电脑(和注册表)”,以及该帖子及其后续文章中的相同含义;他的意思是:
开关
表,该操作码在某种程度上不是协程,和/或指令长度的查找表
进一步忠告:
NES实际上没有使用6502。它使用一个省略十进制模式的克隆-十进制标志根本没有效果。因此,如果您正在模拟6502,那么测试结果可能会有所不同
有关其他良好6502测试,请参阅:
- (测试一大堆东西,给你及格或不及格的分数)李>
- (稍微麻烦一点;如果某个特定测试失败,只会在某个地方进入无限循环。您需要检查源代码,以找出您遇到的失败);及
- (一系列单独的测试,最初用于在C64上单独运行,但除了6502之外,不需要任何实现就可以轻松运行,因为它将在PETSCII中提供状态的文本输出,因此您还需要一个快速查找表来将其映射到ASCII)
- 在
处加载0x2900
的内容李>BCDTEST_beeb
- 将
写入地址jsr2900h
李>0x200
- 在
处放置0xffee
,但也要确保您可以捕获该地址李>RTS
- 将程序计数器设置为
,并保持运行,直到其位于0x200
李>0x203
- 然后测试
处的值是否为0x84
。如果是其他原因,则表示失败0
要获得更多反馈,无论何时电脑转到
0xffee
,都要在A寄存器中输出ASCII字符。看起来您需要在加载它。哦,这不叫镜像吗?谢谢您的努力!因此,我加载并运行了nestest,并且我能够记录所有内容,这很好。是的,有一天,当其他组件完全实现后,我将解析iNES头。理光CPU真的有BCD标志吗?我注意到它的nestest测试,这很奇怪,因为nesdevwiki说该标志不应该有任何影响(我认为它甚至不存在)。我不打算实现BCD模式,所以这就是为什么我最初避免了任何测试BCD的测试。我的理解是它有BCD模式,但不尊重它。因此,您可以CLD
/SED
,如果您PHP
,您将能够看到差异,但是ADC
和SBC
将始终作为二进制。假设测试完全适用于NES,那么可能包含的测试是您忽略了它?@bartlomiej.n是的,因此在运行以NES为中心的测试时,这是您的荣幸,因为这些是ROM,一旦打开就直接映射到处理器的地址空间。但其他许多测试,包括BBC测试,都是曾经存在于家用电脑磁带或磁盘上的文件。所以他们假设操作系统会将它们加载到已经运行的机器的内存中,然后做操作系统通常做的任何事情来启动它们。6502在通电时确实去了重置向量,但那是很久以前的事了。哦,不,nestest确实是裸机。但6502实际上并不从FFFC开始,它从FFFC(和FFFD)读取一个16位地址,并从该地址指向的任何地方开始。这是一个向量。使用nestest,您必须将其内存放置两次,一次从8000开始,第二次从C000开始。