
2026/05/24 9:30
目覚めろ!16 ビット
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
2026年5月、オムメン(NL)で開催された Outline Demoparty でリリースされたこのアルゴリズム芸術プログラムは、リアルモード DOS アセンブリと厳格な 16 バイトのメモリ制限を統合し、シエルピンスキ fractal(シエルピンスキ集合)および「マトリックスレイン」効果を生成します。Plex の「Rainbow Surf」に触発され、HellMood は、モノクロームグリーンモニタ搭載の古い IBM PC で 15 年間tiny intro を制作してきた自身の歴史を振り返り、極限的なコードゴルフ密度を探求することを目的としています。技術的に、システムは BIOS 中断
int 10h を介して初期化され、ビデオモード 0 を設定し画面をクリアします。エンジンでは、ビデオメモリセグメント(0xb800)全体で加法前和を実行し、modulo 2 の法則を利用する XOR 演算を用いて fractal を描画します(セルーラ自動機械 Rule 60)。この特定の計算では、ロードの各回にインデックスから 57 を引くことで、実効的なステップを -56 バイトにし、無限の fractal を 10 の可視ピラーへとせん断し、標準的なステップと比較して基底周波数を半分にします。音響はポート 0x61h を介して生成され、正方形波はこれらの幾何学的計算から直接導出されます。本プロジェクトは、ハードウェアのアティファクトを重要な特徴として強調します:実在のヴィンテージマシン(例:IBM 286/MDA)は ROM に独自の BIOS コードを保持し、視覚および音響に「パンキー」で粗粒なサウンドを加える一方、エミュレータはそれぞれの BIOS バージョンと RAM ステートに基づいて異なる出力を生み出します。本文
16 バイトで実現!シエルピンスキフラクタルとサウンドの融合(x86 アセンブリ)
2026 年 5 月の「Outline Demoparty」にて、オランダ出身のデベロッパーHellMoodが発表しました。 この作品は、わずか 16 バイト の x86 アセンブリコードで実現した、アルゴリズム的密度への挑戦です。
プロジェクトの背景と着想
- 著者は 30 年以上前、IB MPc でプログラミングを学び始め、以来「システム向けのプログラム」作りに憧れていました。
- 15 年間で100 個以上のミニチュアイントロを作成し、「Rainbow Surf」(Plex 作・16 バイト)に触発されて再挑戦しました。
- グラフィックやサウンドの作成を試行錯誤する中で、サイズコーディングのトリック(命令の再利用や多義的な命令の活用)を見出しました。
- 今回の作品は数多くの実験の中で、その「音」だけで際立っており、解説内容の深さに著者自身も驚いています。
2014 年の前作「M8trix」では偽ランダムな文字を表示(当初 8 バイト→7 バイト)しましたが、「どうすれば音が良くなるか」は常に疑問事項でした。 今回は、**「シエルピンスキ三角形の音をマトリクスレインに変換する」**というコンセプトで再構築しました。
コードと動作概要
以下のコードを実行すると、ビデオメモリを計算領域として使い、無限にシエルピンスキフラクタルを描画し、同時にスピーカーから音を出します。
int 10h ; ビデオモード 0 セット (2 バイト) mov bh, 0xb8 ; データセグメントを 0xB800 に (2 バイト) mov ds, bx ; DS レジスタ設定 (2 バイト) L: lodsb ; メモリから AL レジスタに読み込み (1 バイト) sub si, byte 57 ; シーンスポットを -56 バイト移動 (3 バイト) xor [si], al ; XOR 演算でフラクタル計算 (2 バイト) out 61h, al ; スピーカー出力 (2 バイト) jmp short L ; ループ (2 バイト)
動作原理の要約:
- 時間ステップごと: 新しいシエルピンスキ三角形の一行が生成されます。
- a) スピーカーで音として再生される。
- b) ステップサイズ 56 で画面に描画される。
- 視覚的制約: 解像度が「8192 ピクセル幅」に対し、文字行はわずか**80 バイト(約 80 ピクセル)**しかないため、細部は見えにくいです。
- もし画面が巨大化すれば、あるいはピクセルをスキップせずに全て描画すれば、全体像が見えます。
技術的解説:5 つのステップ
1. キャンバス:準備された空虚
コードは標準的な BIOS 割り込み
int 10h から起動します。
- ビデオモード設定: モード 0 が設定され、40×25 のテキストグリッドが用意されます。
- メモリ初期状態: データセグメント (
) はds
(VGA/CGA テキストバッファ) を指します。0xB800- BIOS クリア時にメモリは 0 にリセットされるのではなく、すべての文字位置が「空白」として扱われます。
- 実際には 2,000 スロット が
(スペース) と0x20
(黒背景のライトグレー) で満たされています。0x07
- 「空白」の見せ方: メモリには一様なパターンが埋め尽くされており、ここが計算の「種」になります。
著者のコメント:過去のノイズ系イントロとは異なり、この作品の画面クリア時のメモリアイニシャライゼーションや境界条件による「スパイス」という微妙な差異が、理解できていないだけに魅力的です。
2. エンジン:加法型前側和(Additive Prefix Sums)
数学的な核心は「加法型前側和」です。RNG を使わずにカオスな動きを生成しています。
- 数式的モデル:
- ASCII
の代わりにゼロ初期状態とする。0x20
の代わりに加算を使用する。XOR- ステップサイズを 16 バイトに進める。
- 累加器
を初期値 2 から開始する。al
- ASCII
- サイクル特性:
- DOS セグメントは 65,536 バイト。各ステップ 16 バイト進むため、4,096 ステップで巡回します。
であり、256 の倍数であるため、進位が同期し、各スウィープ開始時点で65536 / 16 = 4096
を 2 にリセットできます。al
- 生成される数列: この値は二項係数列に追随し、2 倍スケールされます。 $$A^{(p)}[k] \equiv 2 \binom{k+p}{p-1} \pmod{256}$$
3. 結晶化:XOR とシエルピンスキのシフト
純粋な加算からビット演算(XOR)への変換がフラクタル構造を生み出します。
- 原理: 「進位なしの加算が XOR である」という事実を利用。
- コードでは
の代わりにadd
が採用されています。xor
- コードでは
- 初期値との関係:
- 初期値は 2 (バイナリ:
) です。00000010 - ビット 1 のみが
と0x00
で切り替わります。0x02
- 初期値は 2 (バイナリ:
- オートマトンルール 60: これは初等的細胞状オートマトンのルール 60 に完全にマッピングされます。 $$Cell^{(p)}[k] = Cell^{(p-1)}[k] \oplus Cell^{(p)}[k-1]$$
- ルカスの定理: この加算表におけるビット 1 の挙動を保証します。「2」はビット 1 がセットされていることを意味するため、シエルピンスキ三角形が生成されます。
4. マシンの声:データを音へと変換
フラクタルの計算結果を直接スピーカーポートへ出力し、音源として使います。
- 出力メカニズム:
がトリックです。out 61h, al- ポート
は PC スピーカーとインターフェースします。61h - ビット 1 を高レベルにするとスピーカーのコーンが外側に押し出され(1)、低レベルにすると引き込まれます(0)。
- ポート
- 生成される音:
- フラクタルから得られる
と1
が正方形波を作り出します。0 - 行単位で再生されると、**自己相似的でテンポ不変な近似音節ビート(Bytebeat)**が生成されます。
- フラクタルから得られる
- 音質の特徴:
- テキスト領域だけでなく、残りの 64 キロバイトのセグメントも出力されます。
- そこに含まれるシャドウ付けされたビデオ ROM BIOS コードが、「パンキーで荒々しい音質」の秘訣です。
- これにより、単純な矩形波音節ビートとは異なる特徴的なサウンドになります。
5. ステップサイズ 56:オクターブシフトと対角スアー
視覚効果と音響効果を両立させるための高度な幾何学的操作です。
- 移動ロジック:
とsub si, byte 57
の組み合わせにより、実質的に -56 バイト(逆方向)移動させます。lodsb
- 音響面での効果:
- 56 は 65,536 を綺麗に割らないため、オフセットが 8 の倍数となる位置のみをアクセスします。
- サイクル長が 2 倍になり、基本周波数が半分になります → 音が 1 オクターブ低下します。
- 視覚面での効果:
- 80 バイト幅の画面において -56 バイト逆向き移動することは、実質的に +24 バイト(12 コラム)前方移動と同等です。
- アクセされるのはたった 10 の異なるコラムのみになります。
- フラクタルは固体画像ではなく、対角方向にスアーしながら画面全体を 10 の文字ピラーへ分割して上昇していきます。
ハードウェア検証と感想
実機動作の確認(scener miragept)
キャプチャ映像では以下の調整が行われました。
- 色変更: 緑色の文字は MDA/Hercules に自然にフィットするため、アドレスを
から MDA が使用する0xB800
にパッチしました。0xB000 - 機材: EGA カード搭載の 286 と、実物の MDA モニター(IBM 5151)を使用。
- 音質: マシンの特性による定常ノイズが含まれますが、フォスフォア持続時間の大きいモニターでは高速な動きに不具合が生じる場合があります。
著者のリプライ
「想定通りに動作し、バイト値のわずかな違いによって音が多少変わっていても満足しています。驚いたのは、シエルピンスキ構造が(作品後半特に)私のバージョンよりも実際に見やすくなった点です。」
エビデンス感について
- エミュレーターや異なる BIOS バージョンは RAM にわずかに異なるアファクタを残します。
- コードは既存の内容に対して
するため、出力は環境に極めて敏感です。XOR - メモリを最初にクリアすれば完璧な一様な出力が得られますが、そのためのバイト数は貴重なリソースです。
- 「サイズコーディング」の醍醐味: ハードウェアの自然な状態を受け入れることにあります。
関連リンクとリソース
- Nanogems – デモシーンからの厳選されたミニチュアイントロ集
- HellMood の Pouet 作品一覧
- miragept による 286/MDA/Hercules でのキャプチャ
- Sizecoding Wiki
- "Rainbow Surf" – Plex による 16 バイト x86
- "M8trix" – HellMood による 8 バイト
※本テキストは手書きから抽出されました。