matiaszanolli/sega-vr-disasm
GitHub: matiaszanolli/sega-vr-disasm
将世嘉 32X 平台的 Virtua Racing 游戏完整反汇编并通过架构优化将帧率从 20FPS 提升至 60FPS 的逆向工程项目。
Stars: 136 | Forks: 5
**(最新)** *查看我刚完成的 **Aerobiz Supersonic** 反汇编,地址为* [https://github.com/matiaszanolli/aerobiz-disasm](https://github.com/matiaszanolli/aerobiz-disasm)
# Virtua Racing Deluxe (32X) - 性能优化项目
**状态:v7.0.0 — 描述性 SH2 名称与 3D 引擎分析**
这是 Virtua Racing Deluxe (Sega 32X) 的完整、可构建反汇编项目,目前正积极优化以充分利用 32X 硬件。原版游戏由于采用了保守的阻塞式同步模型,导致大量硬件潜力未被挖掘,运行帧率仅为 ~20 FPS。本项目旨在释放这些潜力。
## 问题所在
原版游戏的大部分硬件处于空闲状态:
```
CPU Utilization (profiled):
68000: ████████████████████ 100% ← Saturated (bottleneck)
Master SH2: ░░░░░░░░░░░░░░░░░░░░ 0% ← Completely idle
Slave SH2: ██████░░░░░░░░░░░░░░ 33% ← 67% wasted in idle loop
```
68K **约 60% 的周期被阻塞**,在等待 SH2 确认时轮询 COMM 寄存器 —— 每帧 35 次。与此同时,Master SH2 无所事事,而 Slave SH2 则在延迟循环中浪费了三分之二的时间。
## 目标
重组命令流水线以消除阻塞等待,批量处理命令,并将工作分配给所有三个 CPU:
| 路径 | 策略 | 预期收益 |
|-------|----------|---------------|
| 68K 阻塞缓解 | 通过 SH2 中断队列实现异步命令 | FPS +46-67% |
| 命令批处理 | 将每帧 35 次提交减少至 ~3 次 | FPS +10-20% |
| 流水线重叠 | 在 SH2 渲染第 N 帧时构建第 N+1 帧 | FPS +15-30% |
| 68K 工作卸载 | 将物理/三角函数运算移至空闲的 Master SH2 | FPS +5-15% |
**目标:60 FPS**(基线为 ~20-24 FPS)
完整策略请参阅 [OPTIMIZATION_PLAN.md](OPTIMIZATION_PLAN.md),任务队列请参阅 [BACKLOG.md](BACKLOG.md)。
## 快速开始
```
# 构建 ROM
make all
# 在模拟器中测试 (仅限 PicoDrive — BlastEm 不支持 32X)
picodrive build/vr_rebuild.32x
```
## 项目结构
```
32x-playground/
├── disasm/
│ ├── vrd.asm # Main build file
│ ├── sections/ # Buildable section sources
│ ├── modules/
│ │ ├── 68k/ # 821 modularized 68K modules (17 categories + 15 game subcats)
│ │ └── shared/definitions.asm # Master symbol table (all HW register equates)
│ ├── sh2/ # SH2 functions + expansion code
│ │ ├── 3d_engine/ # 92 SH2 functions (descriptive names)
│ │ ├── generated/ # 89 SH2 function includes
│ │ └── expansion/ # SH2 expansion ROM code ($300000+)
│ └── sh2_symbols.inc # 107 SH2 function symbols
│
├── analysis/ # Reverse engineering & optimization research
│ ├── ARCHITECTURAL_BOTTLENECK_ANALYSIS.md
│ ├── 68K_FUNCTION_REFERENCE.md # 503+ named functions
│ ├── profiling/ # CPU profiling results
│ ├── optimization/ # Optimization designs & research
│ └── architecture/ # Memory maps, state machines, registers
│
├── docs/ # Hardware manuals & guides (markdown)
│
├── tools/
│ ├── libretro-profiling/ # Custom PicoDrive profiler (cycle-accurate)
│ ├── translate_68k_modules.py # Batch dc.w→mnemonic translator (Phase 1+2)
│ ├── m68k_disasm.py # 68K disassembler
│ └── sh2_disasm.py # SH2 disassembler
│
└── build/
└── vr_rebuild.32x # Output ROM (4MB)
```
## ROM 布局
```
Address Range Size Contents
──────────────────────────────────────────
$000000-$2FFFFF 3.0 MB Game Code (68K + SH2)
$300000-$3FFFFF 1.0 MB SH2 Expansion Space (~99% free)
──────────────────────────────────────────
Total 4.0 MB Full Cartridge
```
位于 $300000+ 的扩展空间仅由 SH2 处理器执行,并且已包含并行处理基础设施(调度钩子、优化顶点变换、工作封装器)—— 随时可激活。
## 代码库状态
### 反汇编与翻译 (v7.0.0 — 当前)
- **821 个 68K 模块**,分布在 17 个类别 + 15 个游戏子类别中
- **736 个模块**已完全翻译为正确的汇编助记符(转换了 5679 行 dc.w)
- **92 个 SH2 函数**拥有描述性名称(`matrix_multiply`、`frustum_cull`、`span_filler` 等)
- **107 个 SH2 入口点**已映射并在 89 个 .inc 组 + 12 个扩展中符号化
- **503+ 个 68K 函数**已命名并分类
- 所有翻译均经验证与原始 ROM **字节完全一致**
- 5 个翻译阶段:自动化(第 1-2 阶段)、手动分支(第 3 阶段)、JSR/JMP(第 4 阶段)、BCD 算术(第 5 阶段)
- 剩余约 522 个 dc.w 为数据值(精灵描述符、指针表、查找表)—— 翻译已完成
- 3D 引擎算法分析:平直着色、Bresenham 边缘插值、包围盒可见性
### 符号强化 (v5.1.0 — 完成)
- **118+ 个模块**在所有 17 个类别中均使用符号寄存器名称进行了强化
- 集中式的 [definitions.asm](disasm/modules/shared/definitions.asm) 包含 MARS/COMM/VDP/Z80/PSG 等值
- 原始十六进制代码(如 `$00A15120`)已全部替换为自文档化的 `COMM0_HI`
### 性能分析 (运行中)
- 带有周期精确检测的自定义 PicoDrive libretro 核心
- 帧级和 PC 级热点分析
- 自动化无头性能分析前端
### 优化 (B-003/B-004/B-005 完成)
- 68K 瓶颈已识别并量化(100.1% 利用率)
- **B-003:** sh2_cmd_27 → 通过 COMM7 信号机制实现“即发即弃”(每帧 21 次调用,每次约 50 周期)
- **B-004:** sh2_send_cmd → 单次触发 cmd $22(每帧 14 次调用,每次约 170 周期)
- **B-005:** sh2_send_cmd_wait → 单次触发 cmd $25(场景初始化 8 次调用,每次约 100 周期)
- 每帧命令开销减少 64%(~9,450 → ~3,430 周期)
- 任务追踪见 [BACKLOG.md](BACKLOG.md),陷阱见 [KNOWN_ISSUES.md](KNOWN_ISSUES.md)
## 关键架构发现
| 发现 | 证据 |
|---------|----------|
| 68K 是唯一的瓶颈 | 100.1% 利用率,127,987 周期/帧 |
| 单独优化 SH2 无法带来 FPS 提升 | Slave 减少 66.6% → FPS 无变化 |
| ~60% 的 68K 时间浪费在轮询上 | 每帧 35 次阻塞握手(优化前基线) |
| 命令开销减少 64% | B-003/B-004/B-005:~9,450 → ~3,430 周期/帧 |
| Master SH2 完全空闲 | 60 周期/帧(0.0% 利用率) |
| Slave 空闲时间被重新利用 (B-003) | 原本在 $0600060A 处空闲 66.5%,现在处理 cmd27 像素工作 |
## 自定义性能分析器
基于 PicoDrive 的 libretro 核心构建的周期精确性能分析系统 —— 这是**唯一可用的 32X 性能分析器**,支持每 CPU 周期计数和 PC 级热点分析。
```
cd tools/libretro-profiling
# Frame-level 性能分析 (1800 frames)
./profiling_frontend ../../build/vr_rebuild.32x 1800 --autoplay
# PC-level 热点分析
VRD_PROFILE_PC=1 VRD_PROFILE_PC_LOG=profile.csv \
./profiling_frontend ../../build/vr_rebuild.32x 2400 --autoplay
python3 analyze_pc_profile.py profile.csv
```
## 文档
| 类别 | 关键文档 |
|----------|---------------|
| **任务队列** | [BACKLOG.md](BACKLOG.md)(优先级工作项) |
| **已知陷阱** | [KNOWN_ISSUES.md](KNOWN_ISSUES.md)(硬件隐患、翻译问题) |
| **优化计划** | [OPTIMIZATION_PLAN.md](OPTIMIZATION_PLAN.md)(策略与理由) |
| **瓶颈分析** | [ARCHITECTURAL_BOTTLENECK_ANALYSIS.md](analysis/ARCHITECTURAL_BOTTLENECK_ANALYSIS.md) |
| **68K 性能分析** | [68K_BOTTLENECK_ANALYSIS.md](analysis/profiling/68K_BOTTLENECK_ANALYSIS.md) |
| **COMM 协议** | [68K_SH2_COMMUNICATION.md](analysis/68K_SH2_COMMUNICATION.md)(B-003/B-004/B-005 协议) |
| **68K 函数** | [68K_FUNCTION_REFERENCE.md](analysis/68K_FUNCTION_REFERENCE.md)(503+ 个函数) |
| **SH2 3D 流水线** | [SH2_3D_PIPELINE_ARCHITECTURE.md](analysis/sh2-analysis/SH2_3D_PIPELINE_ARCHITECTURE.md) |
| **3D 引擎深入解析** | [SH2_3D_ENGINE_DEEP_DIVE.md](analysis/sh2-analysis/SH2_3D_ENGINE_DEEP_DIVE.md)(算法分析) |
| **渲染流水线** | [RENDERING_PIPELINE.md](analysis/RENDERING_PIPELINE.md)(端到端 V-INT → VDP) |
| **硬件手册** | [32x-hardware-manual.md](docs/32x-hardware-manual.md) |
| **寄存器隐患** | [32X_REGISTERS.md](analysis/architecture/32X_REGISTERS.md) |
## 需求
- Python 3.x
- GCC 和 Make(用于 vasm)
- 类 Unix 环境(Linux、macOS、WSL)
### ROM(未包含)
您必须提供自己合法的 ROM dump:
- 文件:`Virtua Racing Deluxe (USA).32x`(位于 `roms/` 目录)
- 大小:3,145,728 字节(原始)
- MD5:`72b1ad0f949f68da7d0a6339ecd51a3f`
## 技术细节
| 组件 | 详情 |
|-----------|---------|
| 平台 | Sega 32X (Mega Drive 附件) |
| 68000 CPU | 7.67 MHz,游戏逻辑与协调 |
| SH2 CPUs | 2x 23.01 MHz,3D 渲染 |
| Z80 CPU | 声音处理 |
| ROM 大小 | 4 MB (4,194,304 字节) 含 1MB 扩展 |
| 原始帧率 | ~20 FPS(阻塞同步瓶颈) |
| 目标帧率 | 60 FPS |
## 支持
[patreon.com/virtua_racing_60fps](https://patreon.com/virtua_racing_60fps)
## 致谢
- **原版游戏**: SEGA (1994)
- **反汇编与分析**: Claude Code(在人工指导下)
- **工具**: vasm by Volker Barthelmann & Frank Wille
- **性能分析器**: 自定义 PicoDrive libretro 补丁
## 许可证
用于教育和保存目的的逆向工程项目。原版游戏 © SEGA 1994。不包含任何版权内容 —— 您必须提供自己合法的 ROM。
标签:3D引擎, 60FPS, 68000, Sega 32X, SH2, Virtua Racing, 世嘉32X, 云资产清单, 代码重构, 低延迟, 复古游戏, 多核优化, 安全报告生成, 嵌入式系统, 帧率优化, 并发编程, 快速连接, 性能优化, 检测绕过, 模拟器开发, 汇编语言, 流水线优化, 游戏反汇编, 游戏开发, 硬件加速, 系统编程, 逆向工具, 逆向工程, 静态重编译