【问题标题】:How does a 6502 processor transfer data between ROM and RAM?6502 处理器如何在 ROM 和 RAM 之间传输数据?
【发布时间】:2017-09-20 06:14:40
【问题描述】:

我一直试图了解旧的 6502 处理器是如何工作的,尤其是对于任天堂娱乐系统而言。继续让我感到困惑的一件事是系统如何将相关数据从 ROM 移动到 RAM 中,因为所有汇编指令似乎都处理 RAM-RAM 命令。例如,如果游戏需要在马里奥中加载一个敌人,C​​PU如何识别要加载的相关区域,然后加载它们?一旦它在 RAM 中,我有一个不错的理解,但是它将数据放入我不理解的 RAM 中。谢谢!

【问题讨论】:

  • 处理器完全不知道它是在访问 RAM 还是 ROM。程序员有责任确保在写入 RAM 之前从不读取位于 RAM 中的地址,并且从不尝试写入 ROM。并不复杂,在像这样的简单系统上它们被映射到固定地址。
  • 程序员将地址硬编码到汇编代码中。虽然我不知道任天堂架构的确切细节,但 ROM 大概映射在地址空间中的固定位置。这种概念性问题可能更适合Retrocomputing
  • 大多数处理器不知道关于 rom 与 ram 的内存映射是什么,外围设备在哪里等等。这是程序员知道的。有一些例外,一些外围访问被设计到指令集中,像 cortex-m 这样的 cpu 被设计成一个地址带用于代码,一个用于数据,一个用于外围设备,但仍然取决于芯片供应商尊重这一点,程序员真正知道东西在哪里。 6502、8086、z80 等 100% 由程序员决定。

标签: assembly 6502


【解决方案1】:

在典型的 6502 系统中,ROM 被映射到处理器的地址空间。根据处理器尝试访问的地址,访问会转到 RAM、ROM、什么都没有,或者可能是控制寄存器之类的其他东西。主板上通常有一些逻辑可以查看高地址位并启用相应 RAM 或 ROM 芯片的片选线。处理器无法区分,写入 ROM 的尝试会被忽略。

【讨论】:

    【解决方案2】:

    我不能说我完全理解您的问题,但以下内容可能会帮助您指明正确的方向。

    1. 您需要了解系统的内存映射。谷歌搜索“Nintendo Entertainment System memory map”发现这个有用的页面在许多其他页面中。 https://fms.komkon.org/EMUL8/NES.html它将帮助您识别哪些区域是RAM和ROM。在您的程序中的某处必须有一个从磁带 ROM 加载数据的命令。

    2. 没有 RAM-RAM 命令本身这样的东西。寻址模式在此处描述:http://www.emulator101.com/6502-addressing-modes.html。所有数据都通过寄存器移动,因此将一个字节从 ROM(比如 $C042)移动到 RAM(比如 $00F5)可能看起来像:

      LDA $C042
      STA $00F5
      

      要移动整个形状定义,他们可能会使用更复杂的寻址模式,绝对索引,甚至是间接索引。后者可能会让你感到困惑,因为加载指令将引用一个 RAM 地址,该地址之前已经加载了存储要获取的数据的 ROM 地址。

    3. 由程序(或者更确切地说是程序员)来跟踪适当数据的加载位置和存储位置。

    【讨论】:

      【解决方案3】:

      6502 指令在具有 16 位寻址的内存总线上运行。这意味着它可以寻址从 0 到 65535 的内存空间。

      在基于 6502 的真实系统中,RAM(随机存取存储器)可能只映射到该内存空间的一部分,而另一部分将映射到 ROM(只读存储器) .

      假设在我们的系统中,我们将RAM 映射到$0000-0FFF 的内存空间,我们将ROM 映射到$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
      

      注意:在大多数系统中,您还会将其他硬件映射到该空间的其他部分。

      【讨论】:

        【解决方案4】:

        CPU 不知道 RAM/ROM,它只知道总线。在一个层面上,总线是位的集合,在另一个层面上,它只是一系列携带高或低信号的电线。 从概念上讲,地址总线上有 16 根线,数据总线上有 8 根线,还有一条用于指定方向的读/写线。为了读取一个值,它将地址总线上的线设置为要读取的地址,设置要读取的方向线,并且(在电压稳定后的适当时钟周期)从数据总线上取出值。写作是相反的。尝试写入映射到 ROM 的内存位置仅仅意味着当值被放置在数据总线上时,没有任何东西在监听。

        一些架构具有可切换的存储体,这意味着写入信号最终到达 RAM 芯片,而读取信号进入 ROM,但 CPU 对此一无所知。什么(如果有的话)正在听总线太远了。

        【讨论】:

          猜你喜欢
          • 2012-02-14
          • 1970-01-01
          • 2018-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-24
          • 2022-01-18
          • 2016-01-13
          相关资源
          最近更新 更多