演算法密度:將 16 位元組的 x86 轉化為希爾平斯基交響曲

在 demoscene 的世界中,終極的技術挑戰往往不在於你能用無限的資源建造什麼,而是在極端的限制下你能達成什麼。最近於 2026 年 5 月在 Outline Demoparty 發布的一部名為 "wake up! 16b" 的作品,堪稱演算法密度的典範教學。

僅僅使用 16 位元組的 x86 real-mode DOS 組語,作者創造了一個系統,利用電腦的視訊記憶體作為暫存空間來計算無限的希爾平斯基分形(Sierpinski fractal),同時將該幾何數據解釋為 PC speaker 的原始音訊訊號。這不僅僅是一個視覺技巧,而是細胞自動機、二進位算術與硬體利用的深度交集。

16 位元組引擎

要領會其複雜性,我們必須首先查看程式碼本身:

int 10h          ; 2 bytes
mov bh, 0xb8     ; 2 bytes
mov ds, bx       ; 2 bytes
L:
lodsb            ; 1 byte
sub si, byte 57  ; 3 bytes
xor [si], al     ; 2 bytes
out 61h, al      ; 2 bytes
jmp short L      ; 2 bytes

畫布:初始化虛空

該程序起始於 int 10h,這會初始化 Video Mode 0(一個 40x25 的文字網格)。至關重要的是,BIOS 並不會將螢幕清空為絕對零值。相反,它會用統一的模式填充記憶體:ASCII 空格字元 (0x20) 與淺灰色屬性 (0x07)。

這種統一性至關重要。因為演算法依賴於讀取現有記憶體來計算下一個狀態,RAM 中的任何隨機雜訊都會破壞正在形成的模式。BIOS 可預測的初始化為細胞自動機的出現提供了必要的穩定基礎。

分形的數學原理

如果迴圈使用的是 add 指令而非 xor,它將會產生一個累加的前綴和。經過數千次迭代,記憶體中的值將遵循二項式係數序列。然而,透過使用 xor,作者捨棄了算術進位,從而分離出位元平面(bit-planes)。

這種轉換將邏輯直接映射到 Stephen Wolfram 的初等細胞自動機 Rule 60。具體而言,操作 Cell(p)[k] = Cell(p-1)[k] XOR Cell(p)[k-1] 正是產生希爾平斯基分形特有的自相似三角形的關鍵。

由於起始值為 0x20(二進位 00100000),計算過程主要切換特定的位元,從而創造出 1 與 0 的幾何級數。

將幾何轉化為聲音

這部作品最優雅的面向之一是指令 out 61h, al。連接埠 61h 是內部 PC speaker 的介面。該連接埠的第 1 位元直接控制揚聲器振膜:1 將其推開,0 將其拉回。

由於 XOR 程序分離並切換了這些位元,希爾平斯基三角形的幾何形狀變成了揚聲器振膜的一組字面指令。

  • 高頻波: 當分形產生交替的位元行時發生。
  • 節奏性停頓: 發生在三角形較大的「空白」區域,此時揚聲器振膜保持靜止。

本質上,CPU 的執行速度定義了取樣率,將數學分形轉化為一段連貫的方波音訊軌道。

空間剪切與八度音程偏移

程式碼並不僅僅是在記憶體中向前推進;它使用了 sub si, byte 57。結合 lodsb 的增量,淨移動量為每次迭代 -56 位元組

視覺影響

在一個 80 位元組寬的文字網格中,-56 位元組的偏移在空間上相當於向前移動 24 位元組。由於每個字元佔用 2 位元組,這會導致 12 欄位的偏移。最終的數學結果確保迴圈僅訪問其中四分之一的欄位,將分形對角線剪切成十根均勻間隔的垂直柱狀物,並在螢幕上向上延伸。

音訊影響

雖然 16 位元組的步進會讓記憶體掃描在 4,096 次迭代內完成,但 56 位元組的步進需要 8,192 次迭代 才能回到起點。這使宏觀週期長度翻倍,進而使基礎頻率減半,音調下降整整一個八度,並創造出更深沉、更有共鳴的聲音。

硬體敏感度與「指紋」

由於該程序會讀取並與 RAM 的當前狀態進行 XOR 運算,因此它對環境高度敏感。不同的 VGA BIOS 實作或模擬器(如 DOSBoxPCem)可能會在記憶體中留下略微不同的殘留物。

因此,視覺字元與聲音的音色可以在不同機器之間有所不同。這並非錯誤,而是極端尺寸編碼(size-coding)的一個特性:這部作品擁抱了硬體的不可預測性,將數學公式轉化為每台機器運行時獨有的視聽指紋。

"Sending this entire mixed-data byte directly to system port 61h... does not disrupt the system. In standard DOS environments and modern emulators, pushing these extra bits to the port is effectively harmless."

這種巧合使得視覺字元數據可以兼作音訊訊號,而不會導致系統崩潰,完成了一個效率極高的迴圈,讓每一個位元組都發揮多重用途。

Sources