跳轉至內容

NES程式設計

25% developed
來自Wikibooks,開放世界中的開放書籍
任天堂娛樂系統

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

硬體規格

[編輯 | 編輯原始碼]
帶註釋的MOS 6502晶片。
  • 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聲道

NES 2A03 CPU記憶體對映

[編輯 | 編輯原始碼]
地址範圍(十六進位制) 大小 註釋(頁面大小為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指令)處理程式例程的地址

硬體I/O埠

[編輯 | 編輯原始碼]

NES的I/O埠位於地址$2000-$2007(十六進位制)和$4000-$4017。

  • $2000 - 只寫 - PPU控制暫存器1
  • $2001 - 只寫 - PPU控制暫存器2
  • $2002 - 只讀 - PPU狀態暫存器

影片控制

[編輯 | 編輯原始碼]
  • 精靈
    • $2003 - 只寫 - 精靈記憶體地址
    • $2004 - 讀/寫 - 精靈記憶體資料
    • $2005 - 只寫 - 背景滾動

PPU(續)

[編輯 | 編輯原始碼]
  • $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:長度計數器載入暫存器
  • 方波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相同
  • 噪聲
    • $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
[編輯 | 編輯原始碼]
  • 超級任天堂程式設計
  • 更多資訊可以在IRC上找到,在EFnet伺服器的#nesdev頻道。
  • NesDev,包含詳細的技術文件、工具和示例。
  • P65彙編器,一個用Perl編寫的6502系列處理器的彙編器,支援NES程式設計。
華夏公益教科書