在 ZX Spectrum 的 1 位蜂鸣器上实现数字音频
作者 Michael C. Martin 在 ZX Spectrum 系列收官篇中,详细记录如何用 Z80 汇编让 Spectrum 的 1 位蜂鸣器发出高质量数字音频。 核心原理:电路有电容、扬声器有质量,1 位信号从 0 跳 1 需要时间,中断信号即可产生更细腻波形。作者经历两次失败:先做固定 8kHz 采样率+可变 NOP 延迟,结果只得到尖锐的 8kHz 纯音;后引入 6502 风格的动态 NOP 跳转,仍只是勉强听出声音。 关键突破是研究模拟器 Fuse 的 Blip Buffer 音频库,测出蜂鸣器实际过渡时间为 97-170 微秒(比 8kHz 采样周期还长),从而把脉冲宽度调到 0-15 个 NOP(18-78 周期)。 最终方案:用 EXX 指令组换入影子寄存器腾出 B 寄存器做精确延迟,采样率提升到 16kHz;因 40KB 样本超出 Spectrum 32KB 可用 RAM,改为每条脉冲发两次回到 8kHz 等效;通过在跳转表中做减 5 乘 3 截断来"放大"音量;还要保存影子寄存器避免退出时系统崩溃。 文中给出完整 Z80 汇编(含 pcmstep 宏、跳转表、周期对齐 219/438 等),并附硬件验证:48K Spectrum 和 Omni 128 克隆机均运行成功,Fuse、EightyOne、Zesarux、Spectaculator、Clock Signal 等模拟器也都能复现。 文末对比 Dmitry Milk 的 Spectrum 声音引擎和 Michael J. Mahon 在 Apple IIe 上的 RTSynth 系统。对 retrocomputing 和芯片级音频工程读者有完整的一手调试路径与可复用代码,普通读者门槛较高但技术密度极高。
