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~$4013(20字节)用来控制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。