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