NES 模拟器项目状态
最后更新: 2025-11-30
项目阶段: 核心功能完成,准备游戏测试
📊 总体进度
阶段 1: 硬件设计 ████████████ 100%
阶段 2: CPU 实现 ████████████ 100%
阶段 3: PPU 基础 ████████████ 100%
阶段 4: APU 基础 ████████████ 100%
阶段 5: 系统集成 ████████████ 100%
阶段 6: 单元测试 ████████████ 100%
阶段 7: 游戏测试 ░░░░░░░░░░░░ 0% ← 当前位置
阶段 8: PPU 完善 ░░░░░░░░░░░░ 0%
阶段 9: APU 完善 ░░░░░░░░░░░░ 0%
阶段 10: 优化调试 ░░░░░░░░░░░░ 0%
整体完成度: 60%
✅ 已完成功能
1. CPU (6502) - 100% 完成
指令集实现
- 覆盖率: 151/151 条官方指令 (100%)
- 指令类别:
- ✅ 数据传输 (LDA, LDX, LDY, STA, STX, STY, TAX, TAY, TXA, TYA, TSX, TXS)
- ✅ 算术运算 (ADC, SBC, INC, DEC, INX, INY, DEX, DEY)
- ✅ 逻辑运算 (AND, ORA, EOR, BIT)
- ✅ 移位旋转 (ASL, LSR, ROL, ROR)
- ✅ 比较指令 (CMP, CPX, CPY)
- ✅ 分支指令 (BCC, BCS, BEQ, BNE, BMI, BPL, BVC, BVS)
- ✅ 跳转调用 (JMP, JSR, RTS, RTI)
- ✅ 栈操作 (PHA, PLA, PHP, PLP)
- ✅ 标志位操作 (CLC, SEC, CLI, SEI, CLV, CLD, SED)
- ✅ 系统控制 (NOP, BRK)
寻址模式
- ✅ 隐含寻址 (Implied)
- ✅ 累加器寻址 (Accumulator)
- ✅ 立即数寻址 (Immediate)
- ✅ 零页寻址 (Zero Page)
- ✅ 零页索引 (Zero Page,X / Zero Page,Y)
- ✅ 绝对寻址 (Absolute)
- ✅ 绝对索引 (Absolute,X / Absolute,Y)
- ✅ 间接寻址 (Indirect)
- ✅ 索引间接 (Indexed Indirect - (ind,X))
- ✅ 间接索引 (Indirect Indexed - (ind),Y)
- ✅ 相对寻址 (Relative)
中断处理
- ✅ NMI (Non-Maskable Interrupt)
- ✅ 中断向量支持
- ✅ 状态保存/恢复
状态机
- ✅ RESET 状态
- ✅ FETCH 状态
- ✅ DECODE 状态
- ✅ EXECUTE 状态
- ✅ MEMORY 状态
- ✅ WRITEBACK 状态
- ✅ NMI_HANDLER 状态
2. PPU (Picture Processing Unit) - 基础完成
核心功能
- ✅ 扫描线计数器 (262 条扫描线)
- ✅ 像素点计数器 (341 个周期/扫描线)
- ✅ VBlank 信号生成 (扫描线 241)
- ✅ VBlank 标志保持 (200 CPU 周期)
- ✅ 时钟域同步
寄存器接口
- ✅ $2000 - PPUCTRL (控制寄存器)
- ✅ $2001 - PPUMASK (掩码寄存器)
- ✅ $2002 - PPUSTATUS (状态寄存器)
- ✅ $2003 - OAMADDR (OAM 地址)
- ✅ $2004 - OAMDATA (OAM 数据)
- ✅ $2005 - PPUSCROLL (滚动位置)
- ✅ $2006 - PPUADDR (PPU 地址)
- ✅ $2007 - PPUDATA (PPU 数据)
渲染功能
- ✅ 基础渲染管线
- ✅ 帧缓冲输出 (256x240)
- ⚠️ 图块渲染 (部分实现)
- ⚠️ 精灵渲染 (部分实现)
- ❌ 背景滚动 (未实现)
- ❌ 精灵优先级 (未实现)
3. APU (Audio Processing Unit) - 基础完成
音频通道
- ✅ 脉冲波通道 1 (占空比: 12.5%, 25%, 50%, 75%)
- ✅ 脉冲波通道 2
- ⚠️ 三角波通道 (部分实现)
- ❌ 噪声通道 (未实现)
- ❌ DMC 通道 (未实现)
音频输出
- ✅ 16-bit 立体声输出
- ✅ 44.1kHz 采样率
- ✅ 定时器/序列器
- ❌ 包络发生器 (未实现)
- ❌ 扫描单元 (未实现)
- ❌ 长度计数器 (未实现)
4. DMA (Direct Memory Access) - 完成
- ✅ OAM DMA 传输 ($4014)
- ✅ 256 字节批量传输
- ✅ CPU 暂停机制
5. 系统集成 - 完成
- ✅ NES 系统模块 (nes_system.sv)
- ✅ 组件互连
- ✅ 内存映射
- ✅ 时钟分频 (CPU: ÷8, PPU: ÷4)
- ✅ ROM 加载 (iNES 格式)
6. 测试工具 - 完成
单元测试
- ✅ test_cpu.sv - CPU 指令测试
- ✅ test_ppu.sv - PPU 寄存器测试
- ✅ test_apu.sv - APU 音频测试
- ✅ test_dma.sv - DMA 传输测试
- ✅ nmi_test.sv - NMI 中断测试
- ✅ ppu_render_test.sv - PPU 渲染测试
测试结果: 6/6 通过 ✅
开发工具
- ✅ 帧捕获工具 (nes_capture_tb.cpp)
- PPM 格式导出
- 可配置采样间隔
- PNG 转换脚本
- ✅ SDL2 GUI 模拟器 (nes_gui_audio_tb.cpp)
- 实时视频显示 (768x720)
- 音频播放 (44.1kHz)
- FPS 计数器
- ✅ 指令覆盖率分析 (check_cpu_instructions.py)
🔧 技术栈
硬件描述
- 语言: SystemVerilog
- 仿真器: Verilator 5.042
- 构建系统: Make
测试框架
- C++ 测试台: Verilator C++ API
- 图形库: SDL2
- 脚本: Python 3, Bash
开发环境
- 操作系统: macOS
- 编译器: Clang/LLVM
📁 项目结构
my6502/
├── src/
│ ├── main/
│ │ └── rtl/
│ │ ├── cpu_6502.sv # CPU 核心
│ │ ├── nes_ppu.sv # PPU 核心
│ │ ├── nes_apu.sv # APU 核心
│ │ ├── nes_dma.sv # DMA 控制器
│ │ └── nes_system.sv # 系统集成
│ └── test/
│ ├── rtl/
│ │ ├── unit/ # 单元测试
│ │ ├── nes_capture_tb.cpp # 帧捕获工具
│ │ └── nes_gui_audio_tb.cpp # GUI 模拟器
│ └── tools/
│ └── check_cpu_instructions.py
├── docs/
│ ├── PROJECT_STATUS.md # 本文档
│ └── instruction_dependency_tree.txt
└── roms/ # 游戏 ROM 文件
🐛 已知问题
1. PPU 渲染问题 (优先级: 高)
现象: 帧捕获输出单色画面 RGB(84,84,84)
可能原因:
- 图块数据读取未实现
- 调色板映射缺失
- 渲染管线不完整
影响: 无法显示游戏画面
状态: 待修复
2. APU 音频不完整 (优先级: 中)
缺失功能:
- 三角波通道完整实现
- 噪声通道
- DMC 采样通道
- 包络/扫描/长度计数器
影响: 音频质量不完整
状态: 基础功能可用
3. 游戏兼容性未验证 (优先级: 高)
现状:
- CPU 指令集已完整 (100%)
- 之前游戏卡在初始化循环
- 根因已修复,但未重新测试
需要验证:
- 游戏是否能正常启动
- 游戏逻辑是否正确执行
- 渲染输出是否正常
状态: 待测试
📝 开发历史
2025-11-30
- ✅ 完成 CPU 指令集 (62.3% → 100%)
- ✅ 实现 57 个缺失指令
- BIT, INC/DEC 内存操作
- ROL/ROR 循环移位
- AND/ORA/EOR 所有寻址模式
- LSR/ASL 内存操作
- CMP/CPX/CPY 变体
- 间接寻址模式
- ✅ 扩展 CPU 单元测试
- ✅ 所有单元测试通过 (6/6)
- ✅ 创建指令依赖树文档
- ✅ 创建项目状态文档
之前的工作
- ✅ 实现 NES 系统架构
- ✅ 实现 CPU 基础指令集
- ✅ 实现 PPU 基础功能
- ✅ 实现 APU 脉冲波通道
- ✅ 创建帧捕获工具
- ✅ 创建 SDL2 GUI 模拟器
- ✅ 添加音频支持
- ✅ 分析 VBlank 时序问题
- ✅ 创建指令覆盖率分析工具
🎯 下一步计划
短期目标 (1-2 天)
- 游戏测试 (最高优先级)
cd src/test/rtl
make gui_audio
./obj_dir/Vnes_gui_audio
- 验证游戏是否能启动
- 检查 CPU 执行是否正常
- 分析渲染输出
- PPU 渲染修复
- 调试工具增强
- 添加 CPU 指令跟踪
- 添加 PPU 状态监控
- 添加内存访问日志
中期目标 (1-2 周)
- PPU 完善
- 精灵渲染
- 背景滚动
- 精灵优先级
- 精灵 0 碰撞检测
- APU 完善
- 三角波通道
- 噪声通道
- DMC 通道
- 包络/扫描/长度计数器
- 游戏兼容性
长期目标 (1 个月+)
- 性能优化
- 功能扩展
- Mapper 支持 (MMC1, MMC3 等)
- 存档功能
- 作弊码支持
- 录像回放
- FPGA 移植
📊 代码统计
RTL 代码
- cpu_6502.sv: ~950 行
- nes_ppu.sv: ~400 行
- nes_apu.sv: ~200 行
- nes_dma.sv: ~100 行
- nes_system.sv: ~300 行
总计: ~2000 行 SystemVerilog
测试代码
- 单元测试: ~500 行
- C++ 测试台: ~800 行
- Python 工具: ~200 行
总计: ~1500 行测试代码
🤝 贡献指南
开发流程
- 修改 RTL 代码
- 运行单元测试:
make all
- 运行 GUI 测试:
make gui_audio
- 提交代码
测试要求
- 所有单元测试必须通过
- 新功能需要添加测试
- 修复 bug 需要添加回归测试
代码规范
- SystemVerilog 使用 4 空格缩进
- 信号命名使用下划线分隔
- 添加必要的注释
📚 参考资料
6502 CPU
NES 架构
PPU
APU
📞 联系方式
项目维护者: tongxiaojun
最后更新: 2025-11-30
项目状态: 🟡 开发中 - 核心功能完成,准备游戏测试