跳转至内容

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编程。
华夏公益教科书