在复古计算复兴的时代,将 ZX Spectrum 等 8-bit 家用电脑移植到 Web 平台,不仅能让经典软件重获新生,还能通过浏览器实现跨设备访问。这种工程实践的核心在于高效仿真 Z80 CPU、精确渲染低分辨率图形,并映射现代输入到复古键盘矩阵,从而平衡真实性和性能。
ZX Spectrum 的核心是 Z80 处理器,时钟频率 3.5 MHz,内存从 16KB 到 128KB 不等。Web 仿真需在 JavaScript 或 WebAssembly 中实现周期精确的指令执行,以避免时序偏差导致软件崩溃。例如,使用 AssemblyScript 编译的 Z80 核心能在 Web Worker 中运行,每帧模拟约 69888 个 T 状态(对应 50Hz 刷新率),确保兼容早期游戏如《Manic Miner》。证据显示,这种方法在 Chrome 和 Firefox 上可达 60 FPS 以上,而不牺牲准确性。
图形渲染是另一关键挑战。Spectrum 的显示为 256x192 像素,采用属性-based 颜色系统:每个 8x8 块有亮度、纸张和墨水颜色。使用 HTML5 Canvas 的 2D 上下文,直接像素操作可模拟 ULA(Uncommitted Logic Array)输出。将内存中的屏幕缓冲(0x4000-0x57FF)映射到 Canvas 的 ImageData 对象,每帧通过 putImageData() 更新。优化时,需处理亮度位(bit 6/7)和闪烁属性(bit 7),以再现彩色条纹和多色效果。实际参数:Canvas 尺寸设为 320x240(缩放 1.25x 以匹配像素比例),使用 nearest-neighbor 插值避免模糊;对于多色渲染,预计算属性表减少 CPU 开销。
键盘输入映射需桥接现代 QWERTY 键盘与 Spectrum 的 40 键矩阵(5 行 x 8 列)。Spectrum 通过 I/O 端口 0xFE 读取行扫描,Web 版本捕获 keydown 事件,将键码转换为矩阵位掩码。例如,'Q' 对应行 0 列 0(位 0x01 << 0),'5' 对应行 4 列 4(位 0x10 << 4)。为处理移位键(如 CAPS SHIFT),维护一个按键状态数组,模拟硬件扫描。移动端可添加虚拟键盘,映射触摸事件到相同矩阵。引用 JSSpeccy3 项目,其键盘映射支持 "recreated" 模式,兼容复刻硬件,确保输入延迟 < 16ms。
性能优化是工程落地关键。8-bit 约束要求严格内存管理:使用 TypedArray 模拟 64KB 地址空间,避免垃圾回收中断仿真循环。音频通过 Web Audio API 生成 Beeper(单声道方波)和 AY-3-8912 芯片声音,采样率 44.1 kHz,缓冲大小 512 样本以防掉帧。监控要点:使用 Performance.now() 测量帧时间,若 >20ms 则降级渲染(如禁用多色)。风险包括浏览器节流:在后台运行时,requestAnimationFrame 需 fallback 到 setTimeout(16);兼容性测试覆盖 Safari 的 Canvas 限制。
可落地参数与清单:
-
CPU 仿真:Z80 核心用 WebAssembly,T 状态计数器阈值 69888/帧;中断频率 50Hz(视频)+ 动态 EAR 位。
-
渲染管道:Canvas getImageData() 后,循环 6144 字节屏幕数据,应用属性(0x5800-0x5BFF);缩放因子 2x 为默认,启用 CSS transform: scale() 加速。
-
输入映射:事件监听 addEventListener('keydown', handler, true) 捕获全局键;矩阵位计算:row = keyRow[keyCode], col = keyCol[keyCode],端口输出 = ~(1 << row) & 0x1F。
-
音频参数:OscillatorNode for Beeper,频率 1-2 kHz;AY 通道增益 -12dB,延迟补偿 2-5ms。
-
监控与回滚:FPS 阈值 <45 时,禁用闪烁渲染;内存使用 >50MB 警报;测试用例:加载 TAP 文件,验证《Jet Set Willy》输入响应。
通过这些实践,Web ZX Spectrum 端口不仅复现了 80 年代计算魅力,还为现代开发者提供低门槛实验平台。未来,可扩展到 WebGPU 加速,进一步提升多模型仿真潜力。
(字数:1024)