Graphics 所有这些图形数据存储在NES盒带的何处?

Graphics 所有这些图形数据存储在NES盒带的何处?,graphics,emulation,nintendo,Graphics,Emulation,Nintendo,我已经成功地模拟了任天堂娱乐系统的6502内核(略为交替),现在我有点被PPU模拟卡住了 在各种文档中,需要注意的是,PPU有0x4000(16KB)字节的可用内存。其中只有2KB是内部RAM,而其余的则在盒式磁带上(或者沿着这些线路)。我不明白的是,PPU使用了模式表、名称表、属性表、背景调色板和精灵调色板(在我的头顶上)。这些东西都存放在哪里?我知道一个CHR内存库的大小是8KB,所以即使ROM有多个图形内存库,PPU如何知道在哪个库中找到哪个表/选项板?有些游戏甚至没有CHR内存,所有东西

我已经成功地模拟了任天堂娱乐系统的6502内核(略为交替),现在我有点被PPU模拟卡住了

在各种文档中,需要注意的是,PPU有0x4000(16KB)字节的可用内存。其中只有2KB是内部RAM,而其余的则在盒式磁带上(或者沿着这些线路)。我不明白的是,PPU使用了模式表、名称表、属性表、背景调色板和精灵调色板(在我的头顶上)。这些东西都存放在哪里?我知道一个CHR内存库的大小是8KB,所以即使ROM有多个图形内存库,PPU如何知道在哪个库中找到哪个表/选项板?有些游戏甚至没有CHR内存,所有东西都存储在PRG内存中。我如何知道为了仿真的目的,所有图形都存储在哪里


编辑:我添加了我自己的解释作为答案,因为我现在对NES的内部工作有了更多的经验。一个游戏盒带包含一个集成电路,可以包含许多ROM芯片。这些将通过沿连接边缘的导线进行访问。除了可热插拔之外,它们的工作原理就像永久存在计算机中的ROM或RAM芯片。它是通过发送正确的信号来访问的,通常由总线控制器芯片和时钟脉冲介导。一个地址(二进制)被提供给它的地址线和一定数量的时钟脉冲,之后,它在数据线上产生所需的数据,然后沿着总线流向cpu或dma控制器


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

自从我提出这个问题以来,我学到了很多关于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

他们是怎么写的

模式表用于保存模式中网元的图形数据,即此处存储的内容显示所用精灵的形状。它们通常存储在盒带上的CHR ROM中,但游戏程序员也可以将它们写入PPU内存。下面将解释这种情况的发生方式

除了模式表之外,除了OAM和辅助OAM之外的所有内容都由游戏程序员写入PPU内存。这是通过使用寄存器$2006$2007实现的。怎么做

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

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,但它们是完全不同的东西,应该通过阅读实际可行的源代码来彻底解释,而不是快速解释

最好是从上面提到的源代码()中阅读,以获得完整的理解,但对于那些好奇的人来说,这只是一个快速的解释,实际上他们对这类东西有一个基本的了解