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

w.b*_*ian 3 6502 emulation

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

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

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

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

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

...等等.

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

Tom*_*mmy 6

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

因此,例如对于ADC #54处理器必须(i)读取操作码; (ii)阅读操作数.那是两个周期.

为此ADC ($32), Y:

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

所以它是5或6个周期.

您可以始终将内存访问更多地模拟为逐步定时事物,并将实际操作作为正交步骤执行.读取,写入或读取 - 修改 - 写入使用相同的逻辑也很容易:读取和写入具有相同的时序,但最后会执行不同的内存访问,tead-modify-writes会将读取值写回一个周期在计算出真实结果的同时,写出真实的结果.

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

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