这是一枚仅 16 字节的 x86 DOS 程序,却在屏幕上绘出无限延伸的谢尔宾斯基三角形,同时让 PC 扬声器发出自相似的脉冲波形音乐。
程序怎么同时造画面和声音
代码利用了两个系统特性。一是视频内存初始化:BIOS 清屏后,每个字符位置填充的是 0x20(空格)和 0x07(浅灰)这两字节的固定模式,而非零。二是 PC 扬声器可通过端口 0x61 直接驱动——其中的第 1 位控制锥体的推出与拉回,产生方波。
程序逻辑极简:用 lodsb 读取显存中的字节,用 sub si, 57 让地址每次后退 57 字节(跨越 8192 像素宽的“虚拟屏幕”),用 xor [si], al 把读出的值写回原位,同时把这个结果直接写入端口 0x61 推动喇叭。循环往复,形成不断自我迭代的计算过程。
数学解释:二维胞元自动机
若假设显存初始全为零、把 xor 换成加法,并按步长 16 前进,则每个地址累加的值服从二项式序列的缩放:
A^(p)[k] ≡ 2·C(k+p, p-1) (模 256)
由于 65536/16=4096 是 256 的整数倍,寄存器溢出时 carry 自动对齐,形成所谓的“自相似 bytebeat”。当仅保留最低位的奇偶性(bit 1)时,这个加法表恰好映射到 Elementary Cellular Automaton 的 Rule 60——每位新胞等于左上胞与本位胞的异或。这正是谢尔宾斯基三角形在离散格点上的生成规则。
因此,程序输出的 0 与 1 序列既是屏幕上的分形图案,也是驱动喇叭的方波信号。
编注:信源为作者本人发布的技术博客,含谢尔宾斯基分形与 bytebeat 音乐的数学推导。材料侧重程序原理与算法逻辑,未涉及作者个人开发经历细节。