用 Claude 读 68000 汇编把 30 年前的 Amiga
这次移植最硬核的地方在于,我直接把 MC68000 汇编代码喂给了模型。对于大多数开发者来说,汇编代码的可读性极差,但 LLM 在处理这种确定性极强的底层语言时表现出奇地稳定。为了验证模型理解得对不对,我让它在 Mac 上使用 vasm 尝试重新组装代码。
这里有个非常细节的坑,值得记录下来:模型在尝试还原二进制文件时,发现结果与我 30 年前的原始二进制文件有 108 个字节的偏差。这其实揭露了一个当年的技术细节——我当年使用的是 AsmOne,它是直接组装到内存里的,而最终保存到磁盘的文件实际上是游戏运行后的内存快照,而不是纯粹的组装输出。这种 108 字节的差异,如果靠人工对比,可能得查好几天,但模型通过对比二进制流很快就锁定了这个差异点。
在具体的迁移步骤上,我采取的是一种“记忆+代码+文档”的综合喂养法:
一、 建立上下文基准
我没有直接扔代码,而是先给了它三样东西:我这 33 年来对游戏机制的记忆描述、当年的开发笔记,以及现在的 Git 仓库。这样模型在读汇编指令时,知道这个寄存器操作是在处理地图坐标还是在算碰撞体积。
二、 汇编逻辑到 GDScript 的映射
由于 MC68000 是基于寄存器的架构,而 Godot 使用的是 GDScript(类似 Python),最关键的是把汇编里的跳转指令和标志位状态转换为现代的高级语言逻辑。比如一个简单的 CMP (Compare) 和 BEQ (Branch if Equal) 组合,在模型看来就是一个简单的 if 判断。
三、 验证与迭代
我把 1993 年的地图编辑器截图发给它,让它对照截图中的布局和汇编代码里的偏移量进行核对。在这个过程中,我发现模型对老旧硬件的内存映射(Memory Mapping)理解得相当到位,能够迅速定位到哪些代码是在操作 Amiga 的自定义芯片。
这次经历给我最大的启发是,LLM 现在已经可以充当一个极其高效的“数字化考古学家”。如果你手里有那种没有文档、只有二进制或汇编的古董项目,不要试图自己一行行翻译,直接把代码块扔给模型,然后问它这个循环在处理什么逻辑,速度会快得惊人。
至于移植后的表现,虽然逻辑迁移只要一个晚上,但“手感”这种东西是无法通过代码直接翻译的。在 Godot 里还原 30 年前那种特定的输入延迟和像素移动感,依然需要开发者手动在 _physics_process(delta) 里一遍遍调试坐标增量,这部分工作目前 AI 还替代不了。