Hotdry.

Article

16字节x86实模式汇编:Matrix雨屏的音频化与PC扬声器PWM合成

解析HellMood的16字节x86极小程序如何将Matrix雨屏视觉转化为音频输出,探讨PC扬声器PWM驱动原理与视觉-听觉跨模态映射的工程化技巧。

2026-05-18systems

在 Demoscene 文化中,sizecoding 是一项将程序压缩到极限字节数的艺术。当大多数开发者讨论代码压缩时,HellMood 用 16 字节的 x86 实模式汇编程序,将经典的 Matrix 数字雨视觉效果转化为可听的音频输出 —— 这不是简单的音效播放,而是一次完整的跨模态信号映射实验。

极限体积下的技术约束

16 字节的程序意味着什么?在 x86 实模式下,这 barely 容纳 4 条基本指令。要在如此严苛的约束下实现 "视觉转音频",必须充分利用硬件架构的每一个特性。

实模式汇编直接操作硬件端口,绕过操作系统 abstraction。PC 扬声器(PC Speaker)通过系统定时器 PIT(Programmable Interval Timer)驱动,核心控制涉及三个 I/O 端口:

  • 0x43:PIT 控制寄存器,配置通道与操作模式
  • 0x42:通道 2 数据端口,写入频率分频值
  • 0x61:系统控制端口,bit 0-1 控制扬声器使能

PWM(Pulse Width Modulation)合成的本质是利用定时器产生方波,通过调整频率改变音高。在 16 字节程序中,无法存储预计算的音频表,必须将视觉数据实时映射为频率参数。

Rrrola Trick:坐标到音频的魔法转换

HellMood 在 256 字节作品 "Memories" 中广泛使用的 "Rrrola Trick",在 16 字节版本中发挥关键作用。该技术利用乘法溢出的 "垃圾值" 作为伪随机源:

mov ax, 0xcccd      ; 魔数常量
mul di              ; DI为屏幕指针,结果DX=Y坐标,AX=X坐标

这条指令将线性屏幕地址转换为 XY 坐标,同时产生的中间值具有类随机特性。在 Matrix 雨屏场景中,下落字符的位置信息被编码为音频频率 —— 屏幕上方的高位置对应高频,下方低位置对应低频,字符密度映射为音色复杂度。

PC 扬声器 PWM 合成的工程实现

PC 扬声器本质上是 1-bit DAC,只能输出方波。但通过快速切换频率,可以模拟更丰富的音色。关键参数配置如下:

定时器配置

  • 写入控制字 0xB6 到端口 0x43(通道 2,模式 3,二进制计数)
  • 向 0x42 写入分频值低字节后高字节
  • 置位端口 0x61 的 bit 0-1 使能扬声器

频率计算

  • PIT 基准频率 1.193182 MHz
  • 目标频率 = 1193182 / 分频值
  • 16 字节程序中,分频值直接取自屏幕坐标的某种变换

跨模态映射策略

  1. 位置 - 音高映射:Y 坐标(行号)反向控制分频值,产生从上到下的音高下降效果
  2. 字符 - 音色映射:ASCII 码值映射为音量或脉冲宽度(通过快速频率切换模拟)
  3. 密度 - 节奏映射:屏幕字符密度控制音符触发频率

16 字节代码的结构解析

虽然完整代码未公开,但基于 HellMood 其他作品(如 "Kasparov 16b")的编码风格,可以推断其结构:

; 假设代码结构(基于sizecoding惯例)
mov al, [bx+si]     ; 读取屏幕字符
out 42h, al         ; 直接输出到PIT数据端口
in al, 61h          ; 读取系统控制端口
or al, 3            ; 使能扬声器
out 61h, al         ; 写入控制端口

实际 16 字节程序必然采用更激进的优化:

  • 利用xchg替代mov节省字节
  • 复用寄存器值避免初始化
  • 利用 BIOS 调用后的寄存器残留状态
  • 通过内存别名(如[bx+si]指向特定地址)访问屏幕缓冲区

从视觉到听觉:跨模态映射的工程启示

这个 16 字节程序的核心价值在于展示了一种极简的信号转换范式:

数据复用原则:同一数据源(屏幕缓冲区)同时驱动视觉渲染和音频合成,无需额外的中间表示。

参数耦合策略:视觉参数(坐标、字符值)与音频参数(频率、音量)建立直接的数学映射关系,避免查表开销。

硬件直通架构:绕过软件抽象层,应用程序直接控制硬件定时器,实现微秒级延迟的音频响应。

对于现代嵌入式开发,这种 "零开销抽象" 思想仍有借鉴意义。在资源受限的物联网设备中,类似的端口级优化可以显著降低功耗和延迟。

可落地的工程参数

若要在现代平台复现类似效果,关键参数如下:

参数项 值 / 范围 说明
PIT 基准频率 1.193182 MHz 原始 PC 硬件频率
可听频率范围 20 Hz - 20 kHz 对应分频值 59659 - 60
屏幕分辨率 80x25 (文本模式) 典型 DOS 文本模式
Y 坐标映射 25 行 → 音阶范围 每行对应约半音阶变化
刷新率 垂直同步触发 约 60Hz 音频更新频率

调试建议

  • 使用 DOSBox 运行实模式代码,配置cpu cycles参数匹配目标硬件
  • 通过debug命令单步跟踪端口访问
  • 使用示波器或音频分析软件验证 PWM 波形

结语

16 字节的 Matrix 雨屏音频合成程序,是 sizecoding 艺术的极致体现。它证明了即使在最严苛的资源约束下,通过深入理解硬件架构和巧妙的跨模态映射,依然可以实现令人惊讶的多媒体效果。对于系统编程者而言,这种 "字节级优化" 的思维训练,能够培养对计算机体系结构的深层直觉 —— 在追求性能极限时,每一字节都值得关注。


资料来源

  • HellMood, "Memories" 256-byte MS-DOS intro, Revision 2020, sizecoding.org
  • Hacker News discussion: "WriteUp: 16 Bytes of x86 that turn Matrix rain into sound"

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com