我一直试图了解旧的 6502 处理器是如何工作的,特别是对于任天堂娱乐系统。让我感到困惑的一件事是系统如何将相关数据从 ROM 移动到 RAM 中,因为所有的汇编指令似乎都在处理 RAM-RAM 命令。例如,如果游戏需要在马里奥中加载一个敌人,CPU如何识别要加载的相关区域,然后加载它们?一旦它在 RAM 中,我有一个不错的理解,但是它将数据放入我不理解的 RAM 中。谢谢!
4 回答
在典型的 6502 系统中,ROM 被映射到处理器的地址空间。根据处理器尝试访问的地址,访问会转到 RAM、ROM、什么都没有,或者可能是控制寄存器之类的其他东西。主板上通常有一些逻辑可以查看高地址位并启用相应 RAM 或 ROM 芯片的片选线。处理器无法区分,写入 ROM 的尝试会被忽略。
我不能说我完全理解您的问题,但以下内容可能会帮助您指出正确的方向。
您需要了解系统的内存映射。谷歌搜索“Nintendo Entertainment System memory map”发现这个有用的页面在许多其他页面中。https://fms.komkon.org/EMUL8/NES.html它将帮助您识别哪些区域是 RAM 和 ROM。在您的程序中的某处必须有一个从磁带 ROM 加载数据的命令。
本身没有 RAM-RAM 命令之类的东西。寻址模式在这里描述:http ://www.emulator101.com/6502-addressing-modes.html 。所有数据都通过寄存器移动,因此将一个字节从 ROM(比如 $C042)移动到 RAM(比如 $00F5)可能看起来像:
LDA $C042 STA $00F5
要移动整个形状定义,他们可能会使用更复杂的寻址模式,绝对索引,甚至索引间接。后者可能会让你感到困惑,因为加载指令将引用一个 RAM 地址,该地址之前已经加载了存储要获取的数据的 ROM 地址。
由程序(或者更确切地说是程序员)来跟踪适当的数据从哪里加载以及必须存储在哪里。
CPU 不知道 RAM/ROM,它只知道总线。在一个层面上,总线是位的集合,在另一个层面上,它只是一系列携带高或低信号的电线。从概念上讲,地址总线上有 16 根线,数据总线上有 8 根线,还有一条用于指定方向的读/写线。为了读取一个值,它将地址总线上的线设置为要读取的地址,设置要读取的方向线,并且(在电压稳定后的适当时钟周期)从数据总线上取出值。写作是相反的。尝试写入映射到 ROM 的内存位置仅仅意味着当值被放置在数据总线上时,没有任何东西在监听。
一些架构具有可切换的存储体,这意味着写入信号最终到达 RAM 芯片,而读取信号进入 ROM,但 CPU 对此一无所知。什么(如果有的话)正在听总线太远了。
6502 指令在具有 16 位寻址的内存总线上运行。这意味着它可以寻址从 0 到 65535 的内存空间。
在基于 6502 的真实系统中,RAM(随机存取存储器)可能仅映射到该存储器空间的一部分,而另一部分将映射到 ROM(只读存储器)。
让我们想象一下,在我们的系统中,我们已经RAM
映射到内存空间 from$0000-0FFF
并且我们已经ROM
映射到内存空间 from $1000-1FFF
。
将一个值从 ROM 加载到 RAM 中很简单:
LDA $1000 ; Take value from first address of ROM, put it in A register
STA $0000 ; Take value from A register, put into first address of RAM
注意:在大多数系统中,您还会将其他硬件映射到该空间的其他部分。