大多数仿真器存储特定指令在查找表中占用的周期数,然后根据需要添加任何条件周期(例如,当跨越页边界时)。
我想知道是否有办法在程序上确定指令仅基于寻址模式和内存读/写的周期数。
举一个例子,我注意到所有使用立即或相对寻址的指令都需要2个周期。
如果就地改变存储器,所有零页指令需要3个周期,再加上2个周期。
所有索引的零页指令需要4个周期,如果就地改变存储器,则需要额外的2个周期。
......等等。
那么,是否有一些完整记录的,程序性的方法来确定上述指令的周期数?是否存在会破坏这种公式中的决定论的例外情况?
答案 0 :(得分:6)
是的 - 这就是几乎所有精确模拟器的编写方式*;请参阅64doc.txt等文档。它并不比简单的存储器访问计数复杂得多 - 6502将在每个周期执行一次存储器访问,它通常可以在访问后的剩余周期内获得有意义的结果(即I' m尽量避免讨论什么是流水线,什么不是;请参阅文档。
所以,例如对于ADC #54
,处理器必须(i)读取操作码; (ii)阅读操作数。这是两个周期。
对于ADC ($32), Y
来说:
所以它是5个或6个周期。
您可以随时更多地模拟内存访问,并将其作为正交步骤执行实际操作。它也很容易使用相同的逻辑进行读,写或读 - 修改 - 写:读和写具有相同的时序,但最后会进行不同的内存访问,tead-modify-writes都写入读取值在计算出真实结果的同时回到一个循环,然后写出真实的结果。
*)因为同时执行所有内存访问,不包括任何冗余内存访问,然后稍微扭曲一点时间绝对不像真正的硬件。一旦存储器访问任何具有独立时间概念的东西 - 定时器或任何可能产生中断的东西,或者只是RAM本身(如果机器扫描RAM用于其视频输出),它就会绊倒你;不要紧,它要求您在CLI
和SEI
**等说明中添加特殊情况。仿真器不再像20世纪90年代那样结构化。
**)IRQ状态在每次操作的倒数第二个周期进行采样。 CLI
和SEI
在最后一个周期内调整该位。因此,即使中断处于未决状态,CLI
也会在CLI
之后的指令之后产生中断。这可能是SEI
。因此,当中断处于挂起状态时,CLI
/ SEI
对将导致在执行SEI
之后跳转到中断处理程序,并设置中断标志。如果您正在模拟6502的逐周期行为,那么这种情况自然会发生,如果您正在进行逐个操作和时间扭曲,这往往是一个巨大的黑客攻击。或者,更有可能的是,这样的模拟器只是简单地弄错了行为。