Rust 编写的 CHIP-8 解释器编译成 WebAssembly,逐条执行 1977 年的虚拟机指令
电脑键盘 1234 QWER ASDF ZXCV 对应 CHIP-8 的 16 个按键(Pong 用 1 上、Q 下) | 手机上按右侧的键盘
CHIP-8 是 1977 年为 COSMAC VIP 等 8 位电脑设计的一种虚拟机:4 KB 内存、16 个 8 位寄存器、64×32 的黑白屏幕、16 键键盘,只有 35 条指令。当年的游戏就是这种虚拟机的字节码。这个页面用 Rust 实现了完整的解释器,每秒按设定的速度取出一条条两字节的指令来执行。页面还带着一个汇编器:内置的三个程序都以汇编源码形式保存,可以直接修改、重新汇编并运行。
LD F, Vx 指向对应字形,LD B, Vx 把数值拆成百位、十位、个位,Pong 的比分就是这样画出来的。LD V0, 0x05、DRW V1, V2, 6),汇编器扫描两遍:第一遍记下每个标签的地址,第二遍把每行翻译成操作码。调试面板里的反汇编是反方向的翻译;二进制 ROM 里代码和数据混在一起,所以数据区也会被当成指令显示。chip8_assemble(源码) 得到 ROM 字节,再用 chip8_load 装入内存;本地 ROM 文件则直接装入。chip8_frame(每帧指令数):Rust 连续执行这么多条指令(遇到等待按键、「每帧只画一次」或出错会提前停下),然后推进两个定时器。chip8_display() 的 2048 个像素画到 64×32 的 Canvas 上(CSS 放大并保持像素锐利,可选余辉效果减轻闪烁),按 chip8_sound() 开关蜂鸣,并用 chip8_regs() 和 chip8_disasm() 刷新调试面板。按键通过 chip8_key 传入。源码crates/games/chip8/src/vm.rscrates/games/chip8/src/asm.rscrates/games/chip8/src/programs/pong.asmwww/chip8/index.js