CTR-NitroFueled-PC ISA重写指南:老CPU(Sandy/Ivy Bridge)为何也能流畅运行游戏

发布时间:2026/11/4 6:28:48
CTR-NitroFueled-PC ISA重写指南:老CPU(Sandy/Ivy Bridge)为何也能流畅运行游戏

【免费下载链接】CTR-NitroFueled-PC

Crash Team Racing: Nitro-Fueled (PS4) running natively on Windows 10/11. Windows fork of SacredFire, built on bbport and shadPS4. No game files included.

项目地址:https://gitcode.com/gh_mirrors/ct/CTR-NitroFueled-PC
点击查看免费下载

CTR-NitroFueled-PC 是一款让 PS4 游戏《Crash Team Racing: Nitro-Fueled》在 Windows 10/11 上原生运行的开源移植项目。它的核心亮点之一,是内置的ISA 重写(ISA Rewrite)机制——专门拯救 Sandy Bridge、Ivy Bridge 这类缺少 MOVBE / BMI1 / LZCNT 指令集的"老CPU",让游戏不再因非法指令崩溃,而是照常流畅运行。本文将带你弄懂它为什么崩、怎么修、修完后效果如何。

一、为什么老CPU一运行就崩溃?

游戏代码"要求过高"

游戏的可执行文件(eboot.bin及其模块)是用面向 PS4 Jaguar CPU 的工具链编译的,其中混入了Haswell 世代才有的指令:

  • MOVBE:大小端直接转换
  • BMI1:ANDN、BEXTR、BLSI/BLSMSK/BLSR等位操作
  • LZCNT:前导零计数

而 Sandy Bridge / Ivy Bridge(如 i5-3570、i7-3770)只有 SSE4.2、POPCNT(Ivy Bridge 还有 AVX),恰好缺了上面这些。CPU 一执行到这些指令就抛出"非法指令"异常,游戏日志里留下一条STOP后直接退出(对应上游 issue #31)。

💡 逐条"模拟"执行这些指令开销太大,会拖垮整个游戏。所以项目选择了另一条路:在加载时一次性改写指令。

二、ISA重写原理:把指令"搬家",而不是逐条模拟

整个方案分两步,全部在启动时自动完成:

1️⃣ 扫描并生成重写表(Python 侧)

scripts/isa_rewrite.py 借助 iced-x86 解码链接后的镜像out/boot-linked.bin,找出每一处"问题指令",按情况分成四类:

类别处理方式
JMP指令 ≥5 字节:在原地写入一条 5 字节跳转,跳到专用桩代码(stub)
JMP_RELOCATE4 字节指令且紧跟一条普通指令:桩代码顺带把"下一条"也搬进去执行
INT3其余 4 字节指令:原地写int3,运行到触发陷阱时再模拟
UNSUPPORTED桩代码覆盖不了的编码(如 LOCK 前缀、F16C 等),仅报告,不致命

扫描结果写入out/isa-rewrite.bin(格式名 BBISA1):开头是镜像大小和 SHA-256 校验,之后每处指令一条 64 字节的记录,描述寄存器、内存操作数、原始字节等。校验机制保证了表和图片严格对应,防止改错位置。

2️⃣ 加载时打补丁(C 侧)

加载器读取重写表(src/isa_rewrite.h 中的isa_table_load/isa_rewrite_apply),先核对 SHA-256,再为每处指令分配一个机器码桩函数:桩函数保存客户机寄存器 → 调用模拟器执行这一条指令 → 跳回原处。实现见 src/isa_rewrite.c(补丁逻辑)与 src/isa_emulate.c(单条指令模拟)。

关键设计细节:

  • 模拟器用-mgeneral-regs-only编译,绝不触碰 XMM/YMM 浮点寄存器,因为它运行在客户机代码内部;
  • 极少数位置(CTR 1.21 中仅 8 处)走int3陷阱:异常处理器识别到地址后模拟执行、恢复标志位、从下一指令继续(入口在 src/probe.c);
  • 打补丁发生在加载阶段、镜像保护之前,对游戏运行期几乎零开销——绝大多数"指令"只是多了一次普通跳转。

三、普通用户无需任何操作:自动检测、按需生效

这是最省心的部分:只有检测到 CPU 缺少指令集时,重写才会发生。

  1. run.py 启动时会先跑一遍sacredfire.exe --cpu-features,快速自检 CPU 功能;
  2. 若报告缺少 MOVBE / BMI1 / LZCNT,则调用scripts/isa_rewrite.py生成重写表(run.py),并把--isa-rewrite传给加载器;
  3. 新CPU(Haswell 及以后)跳过整个流程,启动速度不受任何影响。

老CPU上启动成功时,日志会打印一行汇总,例如:

ISA: CPU lacks MOVBE, BMI1, LZCNT: 4243 sites rewritten (4004 jmp, 231 relocated, 8 int3), 0 skipped

📦依赖提示:重写需要 Python 包iced-x86(pip install iced-x86)。Windows 绿色版 ZIP 已内置该依赖,下载解压即可;自行编译的用户建议使用 python.org 版 Python 3(MSYS2 的 Python 无法安装该 wheel)。

四、实测效果:Ivy Bridge 上的表现

项目文档 docs/sacredfire/17-isa-rewrite.md 记录了真实测试:

项目数据
测试硬件i7-3770(Ivy Bridge)+ RX 580,Windows
重写站点总数4243 处(MOVBE 391、BMI1 3528、LZCNT 324)
处理方式4004 处跳转、231 处重定位、8 处 int3
失败/不支持0 unsupported、0 skipped
结果游戏正常启动至标题画面并运行

也就是说:曾经"启动即 STOP"的 CPU,现在可以完整进入游戏。对老平台玩家来说,这是一次实打实的"复活"。

五、进阶调试:三个环境变量开关

想折腾一下?这些开关都写在文档的诊断一节(docs/sacredfire/17-isa-rewrite.md):

变量作用
BB_ISA_REWRITE=1强制在任何 CPU 上生成并应用重写表(测试用)
BB_ISA_REWRITE=0彻底禁用重写:第一条 MOVBE/BMI1/LZCNT 会再次让进程崩溃
BB_SKIP_CPU_CHECK=1跳过致命指令集(SSE4.2、POPCNT、AVX)检查

另外,--cpu-features参数会打印CPU: missing ...或CPU: complete;当缺少任何重写表都覆盖不了的指令集时,退出码为 20(逻辑见 src/cpu_check.c)。

六、核心文件路径速查 🗂️

  • 原理文档:docs/sacredfire/17-isa-rewrite.md
  • 指令扫描脚本:scripts/isa_rewrite.py
  • 加载器补丁:src/isa_rewrite.c 与头文件 src/isa_rewrite.h
  • 单指令模拟器:src/isa_emulate.c(接口定义见 src/isa_emulate.h)
  • CPU 功能检测:src/cpu_check.c
  • 启动编排:run.py
  • 单元测试:tests/test_isa_rewrite.py

七、常见问题

Q:我的新电脑也需要装 iced-x86 吗?A:不需要。重写表只在 CPU 缺少 MOVBE/BMI1/LZCNT 时才生成,现代 CPU 完全跳过。

Q:重写会影响性能吗?A:影响很小。每处改写点只是多一跳间接跳转(或重定位后原地执行),4243 处对整体帧率的影响微乎其微,实测可正常运行游戏。

Q:Linux 版也支持吗?A:重写逻辑是跨平台的(Windows 与 Linux 的信号处理分别实现,见 src/probe.c),但当前 Linux AppImage 尚未打包 iced-x86,需要重写的老CPU用户会看到原因日志。


总结:CTR-NitroFueled-PC 的 ISA 重写用"加载时一次性改写 + 桩代码模拟"的策略,把老CPU缺的 Haswell 指令集补齐了——无需用户配置、对现代CPU零负担,让 Sandy/Ivy Bridge 也能加入这场氮气加速的赛车之旅。🏁

【免费下载链接】CTR-NitroFueled-PC

Crash Team Racing: Nitro-Fueled (PS4) running natively on Windows 10/11. Windows fork of SacredFire, built on bbport and shadPS4. No game files included.

项目地址:https://gitcode.com/gh_mirrors/ct/CTR-NitroFueled-PC
点击查看免费下载
上一篇:终极指南:Jellyfin Media Player - 跨平台高清影音播放解决方案
下一篇:Datart数据可视化平台:快速安装与配置完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考