概要
- 16バイト のx86アセンブリで実現された Sierpinskiフラクタル の描画とオーディオ化
- BIOSビデオモード初期化 と テキストバッファ操作 の詳細
- XORによるセル・オートマトン と スピーカー出力 の連携
- メモリステップ幅 による 音・映像パターンの変化 解説
- ハードウェア依存性 と 実行環境ごとの違い への考察
16バイトx86アセンブリによるSierpinskiフラクタル生成
- Outline Demoparty 2026年5月、Ommen, NL で発表
- 16バイト のx86リアルモードDOSアセンブリによる極限的アルゴリズム密度の探求
- ビデオメモリ を計算空間とし、 Sierpinskiフラクタル を無限描画
- 描画データ をそのまま PCスピーカー のオーディオ信号として出力
コード詳細
- int 10h: BIOSによるビデオモード0(40x25テキスト)初期化
- mov bh, 0xb8 / mov ds, bx: データセグメントを 0xB800 (テキストバッファ)に設定
- L: lodsb / sub si, byte 57 / xor [si], al / out 61h, al / jmp short L: メインループ
- lodsb: SIで指すバイトをALにロード、SI++
- sub si, 57: SIを56バイト逆方向へ移動(結果的に-56バイト/ループ)
- xor [si], al: メモリ内容とALをXORし保存
- out 61h, al: ALの値をスピーカーポートに出力
- jmp short L: ループ継続
初期化とテキストバッファの均一性
- BIOS int 10h でテキストバッファ全体を ASCII 0x20(スペース)/ 属性0x07 で初期化
- 均一なデータ がセル・オートマトンの正確な進行を保証
- ランダムなメモリ内容 ではパターンが乱れるリスク
加法的プレフィックスサムの数理
- 理想状態 として全メモリ0でモデル化
- add で進めると、AL=2で16バイトごとに加算し プレフィックスサム 形成
- 4096ステップ でセグメント全体を1周(65536/16=4096)
- ALの値 はパスごとに 二項係数 で増加
- $$A^{(p)}[k] \equiv 2 \binom{k+p}{p-1} \pmod{256}$$
XORによるSierpinskiパターン
- XOR へ切り替えると、加算のキャリーを無視し ビットプレーン のみ伝播
- AL=2 (Bit1のみON)により Rule 60 型セル・オートマトンへ
- Lucasの定理 により、XOR進行は加法表のBit1と一致
- Sierpinski三角形 のパターンが明確に浮かび上がる
オーディオ化:fractalを音に
- out 61h, al :ALのBit1が PCスピーカーコーン を直接制御
- フラクタル進行 がそのまま パルス幅・周波数 の異なる矩形波に
- CPU速度 がサンプリングレートを決定
- パターン変化 が 音の高さ・リズム として聴覚化
56バイトステップの効果
- sub si, 57 で-56バイトずつ逆方向移動
- 65536バイト/56=8192ステップ でメモリ全域を7周してカバー
- 1周あたりのステップ数倍増 → 音の基本周波数が1オクターブ低下
- ASCIIキャラクタバイト のBit1がスピーカー制御、残り7bitが画面上にカオスな文字列生成
視覚パターンの構造:斜めシア
- テキストモード は1キャラ2バイト、1行40キャラ(80バイト)
- -56バイト移動≡+24バイト(mod 80) → 12カラム右/1行上 に進行
- gcd(12, 40)=4 なので 10本の等間隔縦柱 として描画
- フラクタル が画面上で 斜めにシア された形で現れる
実行環境とメモリ依存性
- BIOSやエミュレータ ごとに初期メモリ状態に差異
- XOR進行 が既存メモリ内容に依存し、 表示・音色 が環境で変化
- 完全再現 には全メモリの明示的初期化が必要だが、16バイト制限では不可能
- この不確定性もデモシーン的魅力
ご覧いただきありがとうございました。