如果6502需要8位操作码和8或16位数据(如地址或数字),那么为什么它只有8位数据总线?为什么不是24位呢?
这让我非常困惑,因为我知道地址总线不能用作数据,因为它是全向的。
如果6502需要8位操作码和8或16位数据(如地址或数字),那么为什么它只有8位数据总线?为什么不是24位呢?
这让我非常困惑,因为我知道地址总线不能用作数据,因为它是全向的。
Tn | 地址总线 | 数据总线 | 注释 |
---|---|---|---|
T0 | 程序计数器(PC) | 操作码(OP CODE) | 获取操作码 |
T1 | PC + 1 | 低位有效地址(LSB EA) | 获取LSB EA |
T2 | PC + 2 | 高位有效地址(MSB EA) | 获取MSB EA |
T3 | 高位有效地址(MSB EA), 低位有效地址(LSB EA) | 数据 | 获取数据 |
注意:6502是SY6500系列的一部分。
实际上非常简单。操作码始终为一个字节,它告诉CPU需要读取多少个字节才能获得完整的指令。
例如,考虑操作码$A9
,查看这个表,我们可以看到它是LDA immediate。我们看到它是两个字节,并且需要两个机器周期。在第一个周期中,它加载操作码。在第二个周期中,它解码操作码,然后增加程序计数器,决定需要读取另一个字节,并将其加载到累加器中,同时递增程序计数器。
再举一个更复杂的例子,例如LDA $01E0
。这在内存中看起来像AD E0 01
(请记住,16位数字的低字节首先出现在内存中,即“小端模式”)。这需要三个字节和四个周期。这是因为它在第一个周期中加载操作码,在第二个周期中加载地址的低字节,在第三个周期中加载地址的高字节,然后在第四个周期中加载该地址处的值。
我已经在Visual6502中模拟了这个过程,具体如下:
我已经将指令放置在地址0处,然后一步一步地执行,直到准备获取下一个指令,这是一个BRK
。
每个周期分为两个部分。原因是每个6502机器周期的第二半部分始终是读取或写入内存,没有例外,大部分内部处理发生在周期的第一半。
所以你可以看到:
AD
E0
的低半部分01
的高半部分01E0
放置在地址总线上,并从地址位置01E0
读取55
。