是否有可能在程序上确定特定指令在6502上的周期数?

时间:2016-12-21 04:47:57

标签: emulation 6502

大多数仿真器存储特定指令在查找表中占用的周期数,然后根据需要添加任何条件周期(例如,当跨越页边界时)。

我想知道是否有办法在程序上确定指令仅基于寻址模式和内存读/写的周期数。

举一个例子,我注意到所有使用立即或相对寻址的指令都需要2个周期。

如果就地改变存储器,所有零页指令需要3个周期,再加上2个周期。

所有索引的零页指令需要4个周期,如果就地改变存储器,则需要额外的2个周期。

......等等。

那么,是否有一些完整记录的,程序性的方法来确定上述指令的周期数?是否存在会破坏这种公式中的决定论的例外情况?

1 个答案:

答案 0 :(得分:6)

是的 - 这就是几乎所有精确模拟器的编写方式*;请参阅64doc.txt等文档。它并不比简单的存储器访问计数复杂得多 - 6502将在每个周期执行一次存储器访问,它通常可以在访问后的剩余周期内获得有意义的结果(即I' m尽量避免讨论什么是流水线,什么不是;请参阅文档。

所以,例如对于ADC #54,处理器必须(i)读取操作码; (ii)阅读操作数。这是两个周期。

对于ADC ($32), Y来说:

  1. 阅读操作码
  2. 读取操作数
  3. 从$ 32读取以获取低字节地址
  4. 从$ 33读取以获取高字节地址,将Y添加到地址的低字节
  5. 读取(地址的高字节):(地址的低字节+ Y),因为只有时间执行低字节计算
  6. 哦,等等,如果有进位,那么最后的结果是错误的,再次阅读更好。如果不是那么,很好,一切都很好,不要为这个周期而烦恼。
  7. 所以它是5个或6个周期。

    您可以随时更多地模拟内存访问,并将其作为正交步骤执行实际操作。它也很容易使用相同的逻辑进行读,写或读 - 修改 - 写:读和写具有相同的时序,但最后会进行不同的内存访问,tead-modify-writes都写入读取值在计算出真实结果的同时回到一个循环,然后写出真实的结果。

    *)因为同时执行所有内存访问,不包括任何冗余内存访问,然后稍微扭曲一点时间绝对不像真正的硬件。一旦存储器访问任何具有独立时间概念的东西 - 定时器或任何可能产生中断的东西,或者只是RAM本身(如果机器扫描RAM用于其视频输出),它就会绊倒你;不要紧,它要求您在CLISEI **等说明中添加特殊情况。仿真器不再像20世纪90年代那样结构化。

    **)IRQ状态在每次操作的倒数第二个周期进行采样。 CLISEI在最后一个周期内调整该位。因此,即使中断处于未决状态,CLI也会在CLI之后的指令之后产生中断。这可能是SEI。因此,当中断处于挂起状态时,CLI / SEI对将导致在执行SEI之后跳转到中断处理程序,并设置中断标志。如果您正在模拟6502的逐周期行为,那么这种情况自然会发生,如果您正在进行逐个操作和时间扭曲,这往往是一个巨大的黑客攻击。或者,更有可能的是,这样的模拟器只是简单地弄错了行为。