我一直在努力了解旧的6502处理器是如何工作的,特别是对于任天堂娱乐系统。让我感到困惑的一件事是系统如何将相关数据从ROM移入RAM,因为所有汇编指令似乎都处理RAM-RAM命令。例如,如果游戏需要在Mario中加载敌人,那么CPU如何识别要加载的相关区域,然后加载它们?一旦它在RAM中我有一个不错的理解,但它将数据输入RAM我不明白。谢谢!
答案 0 :(得分:9)
在典型的6502系统中,ROM映射到处理器的地址空间。根据处理器尝试访问的地址,访问权限分配给RAM,ROM,没有,或者可能是控制寄存器等。主板上通常有一些逻辑,它们查看高地址位并启用相应RAM或ROM芯片的芯片选择线。处理器无法区分,无意中忽略了写入ROM的尝试。
答案 1 :(得分:4)
我不能说我完全理解你的问题,但以下内容可能会帮助您指明正确的方向。
您需要了解系统的内存映射。谷歌搜索“任天堂娱乐系统内存地图”'在许多其他人中找到了这个有用的页面。 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地址。
由程序(或程序员)来跟踪加载适当数据的位置以及必须存储的位置。
答案 2 :(得分:2)
6502指令在具有16位寻址的存储器总线上运行。这意味着它可以寻址从0到65535的内存空间。
在基于现实世界的6502系统中,RAM(随机存取存储器)可能将仅映射到该存储空间的一部分,而另一部分将映射到ROM(只读存储器)
让我们想象一下,在我们的系统中,我们已经将RAM
映射到$0000-0FFF
的存储空间,并且我们已经将ROM
映射到了$1000-1FFF
的存储空间。 / p>
将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
注意:在大多数系统中,您还将具有其他硬件映射到该空间的其他部分。
答案 3 :(得分:1)
CPU不知道RAM / ROM,只知道总线。在一个级别上,总线是位的集合,而在另一个级别上,总线只是传输高或低信号的一系列导线。 从概念上讲,地址总线上有16根导线,数据总线上有8根导线,而读/写线用于指定方向。要读取值,它将地址总线上的线设置为要读取的地址,将方向线设置为要读取,并且(在电压稳定后的适当时钟周期内)将值从数据总线中删除。写作是相反的。尝试写入映射到ROM的内存位置只是意味着将值放在数据总线上时,没有任何监听。
某些体系结构具有可切换的存储体,这意味着写入信号最终在RAM芯片上结束,而读取信号进入ROM,但是CPU对此一无所知。正在侦听总线的内容(如果有的话)太远了。