4

我已经成功地模拟了任天堂娱乐系统的(稍微交替的)6502 内核,现在我有点卡在 PPU 模拟上。

在各种文档中注意到 PPU 有 0x4000 (16KB) 字节的可用内存。其中只有 2KB 是内部 RAM,其余的则在磁带上(或类似的东西)。我不明白的是,PPU 使用了模式表、名称表、属性表、背景调色板和精灵调色板(在我的脑海中)。所有这些东西都存放在哪里?我知道一个 CHR 内存条的大小为​​ 8KB,所以即使 ROM 有多个图形内存条,PPU 怎么知道在哪个银行中,在这些表/调色板中找到哪个?而有些游戏甚至没有CHR内存,一切都存储在PRG内存中。我怎样才能确定所有图形存储在哪里以进行仿真?

编辑:我添加了我自己的解释作为答案,因为我现在对 NES 的内部运作有了更多的经验。

4

2 回答 2

5

自从我提出这个问题以来,我学到了很多关于 NES PPU 的新东西,所以我将自己回答这个问题。

首先,PPU 的内存映射如下所示:

$0000 - $0FFF Pattern table 0 
$1000 - $1FFF Pattern table 1 
$2000 - $23BF Nametable 0
$23C0 - $23FF Attribute table 0
$2400 - $27BF Nametable 1
$27C0 - $27FF Attribute table 1
$2800 - $2BBF Nametable 2 
$2BC0 - $2BFF Attribute table 2 
$2C00 - $2FBF Nametable 3 
$2FC0 - $2FFF Attribute table 3
$3000 - $3EFF [0x2000 - 0x2EFF] mirror
$3F00 - $3F09 Background palette
$3F10 - $3F19 Sprite palette
$3F20 - $3FFF Palette mirror 

除此之外,还有一个 $FF (256) 字节区域称为 OAM,还有一个 $20 (32) 字节区域称为辅助 OAM。

它们是如何写入的?

模式表用于以模式保存NES的图形数据,即这里存储的任何内容都显示了所使用的精灵的形状。这些通常存储在卡带上的 CHR ROM 中,但它们也可以由游戏的程序员写入 PPU 内存。下面将解释这种情况的发生方式。

除了模式表之外,除了 OAM 和 Secondary OAM 之外的所有内容都是由游戏的程序员写入 PPU 内存中的。这通过使用寄存器$2006$2007来实现。如何?

每当程序员想要写入 PPU 内存中的某个地址时,他可以通过像他一样通过 CPU 两次写入$2006来存储他想要访问的地址(sta、stx、sty 和可能还有其他指令)在正常组装中。一个例子是:

LDA #$20
STA $2006
LDA #$00
STA $2006

用户先写入地址的高字节,再写入低字节。现在,一个 PPU 内部 15 位锁存器(不确定锁存器是否是正确的字)将 PPU 地址 $2000 存储在其中。每当程序员想要写入这个地址(在这种情况下,它是第一个命名表的起始地址)时,他可以通过将他想要存储在这个内存区域中的值写入内存地址$2007来正常执行此操作。写入该地址时,写入的值将被放入 15 位锁存器中的地址,并且锁存器将增加 1 或 32(由地址$2000中的值的第 2 位决定)。基本上就是这么简单。

当然,事情没那么简单。地址$2000 - $2007被称为 PPU 的内存映射寄存器,之所以这样称呼是因为它们在 CPU 的内存中。它们位于那里是因为 CPU 和 PPU 不能直接访问彼此的内存,因此 CPU 必须找到一些通往 PPU 内存的网关,这些地址就是它。这些寄存器有很多奇怪的异常和怪癖,在这里都进行了解释。

除此之外,还有前面提到的 OAM 和辅助 OAM,但它们是完全不同的东西,应该通过阅读实际可行的资料来彻底解释,而不是快速解释。

最好从提到的来源(再次,在这里)阅读它以获得完整的理解,但这只是对那些好奇并且实际上对这类东西有基本了解的人的快速解释。

于 2013-10-19T19:59:02.083 回答
0

游戏卡包含一个集成电路,该集成电路可以包含许多 ROM 芯片。这些将通过沿着连接边缘的电线进入。除了可热插拔之外,它们的工作方式就像永久存在于计算机中的 ROM 或 RAM 芯片一样。通过向其发送正确的信号来访问它,通常由总线控制器芯片和时钟脉冲介导。一个地址(二进制)被提供给它的地址线和一定数量的时钟脉冲之后,它在其数据线上产生所需的数据,然后沿着总线流向 cpu 或 dma 控制器。

物理位置在某种程度上由硬件决定(许多内存芯片具有可以映射到相同范围的 RAM 和 ROM 部分)。但它在很大程度上处于程序的控制之下。计算指针值,然后使用它。组装相​​当简单。

于 2013-07-22T11:55:58.967 回答