NES程式設計
外觀

本書是一部開放作品,旨在幫助對學習NES(任天堂娛樂系統)程式設計感興趣的人。

- CPU - Ricoh 2A03 CPU,它是MOS 6502的簡化版本,沒有十進位制模式。
- 時鐘頻率為1.789773Mhz(NTSC,系統頻率21.47727Mhz / 12)和1.773447Mhz(PAL,系統頻率26.601171Mhz / 15)
- 記憶體 - 2 KB
- 影片
- Ricoh 2C02 PPU(影像處理單元)
- 解析度 - 256 x 240畫素(NTSC下只有256 x 224畫素可見)
- 顏色 - 固定52種(44種顏色,5種灰色和3種重複)
- 調色盤
- 背景:4個調色盤x 3種顏色 + 1種背景色
- 精靈:4個調色盤x 3種顏色
- 圖塊 - 8 x 8畫素的圖塊背景
- 精靈 - 最多64個8x8畫素或8x16畫素的精靈,但每掃描線最多隻能顯示8個
- 聲音
- 2個脈衝波聲道
- 1個三角波聲道
- 1個噪聲聲道
- 1個DPCM聲道
| 地址範圍(十六進位制) | 大小 | 註釋(頁面大小為256位元組) | |
|---|---|---|---|
| $0000–$00FF | 256位元組 | 零頁 — 特殊的零頁定址模式可以提供更快的記憶體讀寫訪問 | |
| $0100–$01FF | 256位元組 | 堆疊記憶體 | |
| $0200–$07FF | 1536位元組 | RAM | |
| $0800–$0FFF | 2048位元組 | $0000–$07FF的映象 | $0800–$08FF 零頁 $0900–$09FF 堆疊 $0A00–$0FFF RAM |
| $1000–$17FF | 2048位元組 | $0000–$07FF的映象 | $1000–$10FF 零頁 $1100–$11FF 堆疊 $1200–$17FF RAM |
| $1800–$1FFF | 2048位元組 | $0000–$07FF的映象 | $1800–$18FF 零頁 $1900–$19FF 堆疊 $1A00–$1FFF RAM |
| $2000–$2007 | 8位元組 | 輸入/輸出暫存器 | |
| $2008–$3FFF | 8184位元組 | $2000–$2007的映象(多次) | |
| $4000–$401F | 32位元組 | 輸入/輸出暫存器 | |
| $4020–$5FFF | 8160位元組 | 擴充套件ROM — 與任天堂的MMC5一起使用,以擴充套件VRAM的功能。 | |
| $6000–$7FFF | 8192位元組 | SRAM — 儲存RAM,用於在遊戲之間儲存資料。 | |
| $8000–$FFFF | 32768位元組 | PRG-ROM | |
| $FFFA–$FFFB | 2位元組 | 非遮蔽中斷(NMI)處理程式例程的地址 | |
| $FFFC–$FFFD | 2位元組 | 電源開啟重置處理程式例程的地址 | |
| $FFFE–$FFFF | 2位元組 | 中斷(BRK指令)處理程式例程的地址 | |
NES的I/O埠位於地址$2000-$2007(十六進位制)和$4000-$4017。
- $2000 - 只寫 - PPU控制暫存器1
- $2001 - 只寫 - PPU控制暫存器2
- $2002 - 只讀 - PPU狀態暫存器
- 精靈
- $2003 - 只寫 - 精靈記憶體地址
- $2004 - 讀/寫 - 精靈記憶體資料
- $2005 - 只寫 - 背景滾動
- $2006 - 只寫 - PPU記憶體地址 - 索引到PPU記憶體位置
- $2007 - 讀/寫 - PPU記憶體資料 - 從PPU記憶體位置讀取的資料或寫入PPU記憶體位置的資料
- 方波1
- $4000 - 暫存器1 - 位
- 0-3:音量/包絡衰減率
- 4:包絡衰減停用
- 5:長度計數器時鐘停用/包絡衰減迴圈啟用
- 6-7:佔空比型別(在噪聲聲道上未使用)
- $4001 - 暫存器2 - 位
- 0-2:右移位量
- 3:減小/增加(1/0)波長
- 4-6:掃描更新率
- 7:掃描啟用
- $4002 - 暫存器3 - 位
- 0-7 波長的8個LSB
- $4003 - 暫存器4 - 位
- 0-2:波長的3個MSB(在噪聲聲道上未使用)
- 3-7:長度計數器載入暫存器
- $4000 - 暫存器1 - 位
- 方波2
- $4004 - 暫存器1 - 與方波1相同
- $4005 - 暫存器2 - 與方波1相同
- $4006 - 暫存器3 - 與方波1相同
- $4007 - 暫存器4 - 與方波1相同
- 三角波
- $4008 - 暫存器1 - 位
- 0-6 線性計數器載入暫存器
- 7 長度計數器時鐘停用/線性計數器啟動
- $4009 - 未使用暫存器
- $400A - 暫存器3 - 與方波1相同
- $400B - 暫存器4 - 與方波1相同
- $4008 - 暫存器1 - 位
- 噪聲
- $400C - 暫存器1 - 與方波1相同
- $400D - 未使用暫存器
- $400E - 暫存器3 - 位
- 0-3 播放取樣率
- 4-6 未使用
- 7 隨機數型別生成
- $400F - 暫存器4 - 與方波1相同
- $4010 - 暫存器1 - 位
- 0-3:取樣率
- 4-7:未使用?
- $4011 - 暫存器2 - 位
- 0-7:音量
- $4012 - 暫存器3 - 位
- 0-7:語音表起始地址(N*0x40+0xc000)
- $4013 - 暫存器4 - 位
- 0-7:語音表字節大小(N*16+1)
- $4014 - 只寫 - DMA訪問精靈記憶體
- $4015 - 讀/寫 - 啟用/停用各個聲音聲道
- $4016 - 讀/寫 - 操縱桿1
- $4017 - 讀/寫 - 操縱桿2