我已经成功模拟了任天堂娱乐系统的(略微交替的)6502内核,现在我对PPU仿真有点不知所措了。
在各种文档中,注意到PPU具有0x4000(16KB)字节的可用内存。只有2KB是内部RAM,而其余的是在盒式磁带上(或沿着这些线路的东西)。我没有得到的是,PPU使用模式表,名称表,属性表,背景调色板和精灵调色板(在我的头顶)。所有这些东西都存放在哪里?我知道一个CHR存储体的大小为8KB,所以即使ROM有多组图形存储器,PPU如何知道哪个存储区可以找到哪些表/调色板?有些游戏甚至没有CHR内存,一切都存储在PRG内存中。为了仿真,我怎样才能找出存储图形的所有内容?
编辑:我已经添加了自己的解释作为答案,因为我现在对NES的内部运作有更多的经验。
答案 0 :(得分:3)
自从我问这个问题以来,我已经学到了很多关于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
除此之外,还有一个名为OAM的$ FF(256)字节区域,并且有一个20美元(32)字节的区域称为辅助OAM。
他们是如何写的?
模式表用于以模式保存NES的图形数据,即,此处存储的任何内容都显示所使用的精灵的形状。这些通常存储在盒式磁带上的CHR ROM中,但也可以由游戏的程序员将它们写入PPU存储器。这种情况的发生方式将在下面解释。
除了模式表之外,OAM和辅助OAM以外的所有内容都由游戏的程序员写入PPU内存。这通过使用寄存器 $ 2006 和 $ 2007 来实现。怎么样?
每当程序员想要写入PPU内存中的某个地址时,他都可以通过写入 $ 2006来存储(sta,stx,sty,以及可能还有其他指令)他想要访问的地址。 两次通过CPU,就像他在正常组装中一样。一个例子是:
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内存的网关,这些地址就是它。这些寄存器有很多奇怪的例外和怪癖,它们都被解释为here。
除了那些,还有上述OAM和辅助OAM,但这些是完全不同的东西,应该通过阅读实际可行的来源而不是快速解释来彻底解释。
最好从上述来源(again, here)中读取它以获得完整的理解,但这只是对那些好奇并且实际上对这种东西有基本了解的人的快速解释。 / p>
答案 1 :(得分:0)
物理位置将在某种程度上由硬件决定(许多存储器芯片具有可以映射到相同范围的RAM和ROM部分)。但它在很大程度上受到该计划的控制。计算指针值,然后使用它。装配相当简单。