我目前正在为我的下一个仿真项目学习C,这是一个精确的68000核心循环(我的上一个项目是一个用Java编写的非循环精确的Sega Master System仿真器,现在已经发布了第三个版本)。我的问题是关于周期水平的准确性,因为把事情带到这个水平对我来说是一件新事。
要将内容分解为1个CPU周期的粒度,大概我需要知道内存访问需要多长时间,等等,但我的问题是,对于在内存提取/写入阶段需要多个周期的指令,什么是CPU执行每个循环 - 例如是每个周期复制的x位数。
使用我的短信模拟器,我不必太担心M1阶段等,因为它只是为每条指令使用循环计数 - 换句话说,它只能精确到指令级别,而不是循环级别。我不是在寻找特定于体系结构的细节,只是想知道在达到这种粒度级别时我应该注意哪些事情。
欢迎68k细节。基本上我想知道如果视频芯片从内存区域读取而CPU仍然在指令的那个阶段和其他类似情况中将数据写入其中时应该发生什么。我希望我已经说清楚了,谢谢。
答案 0 :(得分:1)
我的猜测是,你不必为获得足够好的结果来获得足够的结果以获得这种事情。如果您不想了解架构的具体细节,那么您无法做到这一点。
您的主要问题似乎是“如果视频芯片从内存区域读取而CPU仍在向其写入数据时应该发生什么”。通常在这些较旧的芯片上,总线协议非常简单(它们不是打包的)并且通常有一个引脚指示总线正忙。因此,如果CPU正在写入内存,则视频芯片只需要等到CPU完成。由于存在这些限制,双端口ram很受欢迎,因此帧缓冲区可以由CPU同时写入并由RAMDAC读取。
答案 1 :(得分:1)
对于真正的周期精确仿真,您首先要确定要用作参考的主时钟。这应该是最快的时钟,在该时钟,软件运行的粒度可以按发生的顺序检测差异。这个可以通过CPU时钟,但在大多数情况下,总线周期时间决定可以识别哪些粒度事件(通常只是CPU时钟的一小部分)
然后您需要找出连接到该总线的不同设备(IC)的优先顺序(如果有多个总线主控器)。一个例子是视频DMA是否(和如何)可以延迟CPU。
通常没有同时事件。要么在DMA读取之前写入CPU,要么相反(在双端口设备的情况下仍然如此),您只需要考虑设备固有的预先存在的机制。
一旦您充分了解哪个时钟有效控制可识别事件的粒度,您就可以考虑如何构建模拟器以完全重现该行为。
这样,您就可以创建100%周期精确仿真,只要您有足够的有关所有设备行为的信息。
抱歉,我无法向您提供更详细的信息,我对Sega硬件的细节一无所知。