像 NES 这样的 8 位机器如何访问超过 256 字节的 ram?

How did 8 bit machines like the NES access more than 256 bytes of ram?

最近我花了很多时间思考硬件仿真和虚拟机。我一直在尝试设计一个基于 NES 硬件的虚拟机。但是,我似乎无法找到有关 NES 如何访问超过 256 字节的 RAM 的任何信息。根据 NES wiki,该机器有 2k CPU RAM。由于 NES 是 8 位机器地址最多只能达到 255。这怎么可能?他们只是将更大的地址存储在多个寄存器中还是什么?

感谢您的宝贵时间。

是的,使用 "multiple registers" 被称为银行切换,无论是在机器的硬件还是在墨盒上:https://en.wikipedia.org/wiki/Bank_switching

NES 有一个由 Ricoh 制造的 6502 系列 CPU(它缺少 BCD 模式)。 6502 CPUs 有一个 16 位地址 space 可以使用各种模式寻址。

您可以在指令中直接指定一个16位地址即

LDA 00 将使用地址 $8000

处的数据加载累加器

LDA 00,X 会将 X 寄存器添加到 $8000,然后读取该地址的值(即,如果 X 为 76,则地址为 $8076)

更有趣的是零页,它可以看作是128个16位指针寄存器。零页指令只需要一个字节来指定地址(但需要更多的周期来执行间接)

所以如果 $0004 的内存包含值 $1234 并且 Y 寄存器是 $21 那么指令

LDA (),Y会从零页读取$1234,然后加上Y寄存器得到地址$1255,然后将$1255的内容载入累加器。有更多的寻址模式,但感觉更像是关于 6502 汇编的教程。

从广义上讲,处理器是按其数据路径的宽度分类的,但是 CPU 出于成本原因,设计人员可能会在物理芯片上指定较少的数据或地址引脚。

例如,8088 和 8086 被归类为 16 位设备,具有 20 位地址总线和 8 位或 16 位数据总线。摩托罗拉 68000 有另一个带有 8 位总线的引脚缩减版本(Sinclair QL 中使用的是 68008),后来的部件有完整的 32 位地址/数据总线。