gpt4 book ai didi

emulation - 是否可以通过程序确定 6502 上特定指令所占用的周期数?

转载 作者:行者123 更新时间:2023-12-02 23:24:15 25 4
gpt4 key购买 nike

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

我想知道是否有一种方法可以仅根据寻址模式和内存读/写来在程序上确定指令将花费的周期数。

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

所有零页指令都需要 3 个周期,如果就地更改内存,还需要另外 2 个周期。

所有索引零页指令都需要 4 个周期,如果就地更改内存,还需要另外 2 个周期。

...等等。

那么,是否有一些完整记录的程序方法来确定上述指令的周期数?在这样的公式中是否存在会打破决定论的异常(exception)情况?

最佳答案

是的 - 这就是几乎所有精确模拟器的编写方式*;请参阅 64doc.txt 等文档。不过,它并不比简单的内存访问计数复杂多少——6502 将在每个周期执行一次内存访问,它通常可以在访问后的剩余周期内获得有意义的结果(即,我稍微挥手以避免讨论什么是管道化的、什么不是;请参阅文档)。

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

对于 ADC (32 美元),Y 是:

  1. 读取操作码
  2. 读取操作数
  3. 从 $32 读取以获取地址的低字节
  4. 从$33读取,得到地址高字节,低字节加Y
  5. 从(地址的高字节)读取:(地址的低字节 + Y),因为只有时间执行低字节计算
  6. 哦,等等,如果有进位,那么最后的结果就是错误的,最好再读一遍。如果没有,那就太好了,一切都很好,不用再为这个循环烦恼了。

所以是 5 或 6 个周期。

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

*) 因为同时执行所有内存访问,不包括任何冗余的访问,所以将时间稍微向前扭曲一点绝对不像真正的硬件。一旦内存访问任何具有独立时间概念的东西(计时器或任何可能产生中断的东西,或者只是 RAM 本身(如果机器扫描 RAM 以获得视频输出),它就会让你陷入困境;没关系,它要求您在 CLISEI** 等指令周围添加特殊情况。模拟器的结构不再需要像 20 世纪 90 年代那样。

**) IRQ 状态在每个操作的倒数第二个周期进行采样。 CLISEI 在最后一个周期调整该位。因此,即使中断正在等待,CLI 也不会导致中断,直到 CLI 后面的指令执行完毕。它本身可以是一个SEI。因此,当中断挂起时,CLI/SEI 对应该会在执行 SEI 后导致跳转至中断处理程序,并且中断标志设置。如果您正在模拟 6502 的逐周期行为,这种情况会很自然地发生;如果您正在逐个操作和时间扭曲进行工作,则这往往是一个巨大的黑客攻击。或者,更有可能的是,此类模拟器只是简单地将行为弄错了。

关于emulation - 是否可以通过程序确定 6502 上特定指令所占用的周期数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41255275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com