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。