VirtuaNES.v0.97源码探究<6> 内存相关

NES内存相关

这一篇主要结合VirtuaNES.v0.97源码把我所知道的NES内存相关的东西总结一下。


源码中,跟内存相关的东西基本上都定义在

NES\MMU.h 和 NES\MMU.cpp


CPU的内存映像:

开始地址

用途

结束地址

$0000

2K字节RAM,做4次镜象(即$0000-$07FF可用)

$1FFF

$2000

寄存器

$2007

$2008

寄存器($2000-$2007的镜像,每8个字节镜像一次)

$3FFF

$4000

寄存器

$401F

$4020

扩展ROM

$5FFF

$6000

卡带的SRAM(需要有电池支持)

$7FFF

$8000

卡带的下层ROM

$BFFF

$C000

卡带的上层ROM

$FFFF

任天堂产品系统文件上覆制来的。


NES\MMU.h

源代码中表示

实际对应地址

备注

LPBYTE CPU_MEM_BANK[8]

$0000~$FFFF

0.指向RAM

1,2. 指向XRAM,不知道啥用的

3. 指向WRAM

4~7. 指向PROM

8*4KB

BYTE RAM [ 8*1024]

$0000~$1FFF


BYTE PPUREG[0x04];

$2000~$2003

用来控制PPU的寄存器

BYTE CPUREG[0x18]

$4000~$4017

各种控制寄存器

$4000~$401320字节)用来控制APU的寄存器

BYTE WRAM[128*1024]

$6000~$7FFF

保存游戏记录的地方,智力卡才有的。

LPBYTE PROM

$8000~$FFFF

NES文件头来看,这个大小貌似会变(⊙﹏⊙)。暂且当成这个大小吧。这里储存的是游戏的运行代码,从卡带里面读取的。


PPU内存映像:

开始地址

用途

结束地址

$0000

图案表0(256x2x8,可能是VROM)

$0FFF

$1000

图案表1(256x2x8,可能是VROM)

$1FFF

$2000

命名表0(32x30块)(镜像,见命名表镜像)

$23BF

$23C0

属性表0(镜像,见命名表镜像)

$23FF

$2400

命名表1(32x30块)(镜像,见命名表镜像)

$27BF

$27C0

属性表1(镜像,见命名表镜像)

$27FF

$2800

命名表2(32x30块)(镜像,见命名表镜像)

$2BBF

$2BC0

属性表2(镜像,见命名表镜像)

$2BFF

$2C00

命名表3(32x30块)(镜像,见命名表镜像)

$2FBF

$2FC0

属性表3(镜像,见命名表镜像)

$2FFF

$3000

$2000-$2EFF的镜像

$3EFF

$3F00

背景调色板#1

$3F0F

$3F10

精灵调色板#1

$3F1F

$3F20

镜像,(见调色板镜像)

$3FFF

$4000

$0000-$3FFF的镜像

$7FFF


NES\MMU.h

源代码中表示

实际对应地址

备注

LPBYTE PPU_MEM_BANK[12]

$0000~$3000

12*1KB

0~7指向VROM

8~11 指向VRAM

LPBYTE VROM

$0000~$1FFF

NES文件头来看,这部分大小也会改变(Orz)。先当成8KB吧。

这部分也是从卡带中读取的,对应的是图案表。所以说呢,图案表已经写死在卡带里了,改不了!

BYTE VRAM[ 4*1024]

$2000~$2FFF

指向四个命名表和属性表的组合。既然是RAM,游戏运行中可以改变。产生不同的画面,就靠它了。

BYTE BGPAL[0x10]

$3F00~$3F0F

16字节。背景调色板。

BYTE SPPAL[0x10]

$3F10~$3F1F

16字节。精灵调色板。


小结一下

PROM和VROM读取自卡带,不可变。

WRAM 也是读取自卡带,可以改变,用来保存游戏记录。

其它的RAM、寄存器都是在NES游戏机上的,初始化的时候应该都是0。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章