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。



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