
2026/07/17 3:33
16 ビット x86 DOS 用の完全機能版で遊べるチェスプログラム「AttoChess」、わずか 278 バイト。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
元の要約は、簡潔な概要として明確かつ正確で完結しており、改訂は必要ない。
要約:
AttoChess は、実行可能な DOS 将棋エンジンにおける従来のサイズ限界を破壊し、わずか 278 バイトにまで縮小したことで、レトロコンピューティング分野における画期的な成果を達成しました。この最小限のエンジニアリングは 2026 年に MIT ライセンスの下でリリースされ、前身である LeanChess を直接的に改良したものであり、16 ビット x86 ハードウェア上で完全なゲームループを実行可能にする絶対的な最低限度のコード量を示すことを目的としています。この劇的な縮小は、BIOS インター럽ト「int 29h」を介して生板データをストリーミングしたり、王手詰判定やフルチェックメイト検出などの非本質的な機能を削ぎ落とすなど、攻撃的な最適化によって実現されています。再帰的なミニマックス探索戦略および専用 0x88 スタイルのボード表現を保持しつつも、ピースの色間で命令を共有するために冗長な算術処理を排除しています。外部のグラフィカルインターフェースなしで決定論的な実行を目指した AttoChess は、単なる 4 文字の動き(例:"e2e4")としてフォーマットされたユーザー入力を待ち続けたまま無限ループに置かれ続けます。このリリースは、コードサイズの効率性の新たな基準を確立し、極限的な制約内で複雑なゲームロジックが存続できることを証明すると同時に、レトロコンピューティングコミュニティにおける低レベル最適化やミニマリズムへのさらなる探求に刺激を与えています。
本文
最小限のチェスエンジン:278 バイトの世界
AttoChess の概要
AttoChess は、16 ビット x86 DOS 環境下で動作する完全なチェスプログラムです。
- サイズ: 278 バイト(ファイル全体)
- 形式: x86 DOS .COM ファイル
- 機能:
- 盤面の描画と再描画
- キーボードからの手番入力
- **4 プリー(ply)**の最善手探索(最小限の深さ)
- ライセンス: MIT
- 著者: ニコラス・タナー (Nicholas Tanner)
- 公開年: 2026 年
このプログラムは、単なるパフォーマンス競技ではなく、ブートから盤面描画、入力読み込み、探索実行までの全ループを278 バイトで完結させる実用的な作品です。
技術的系譜と革新
AttoChess は、以前の「最小のチェスエンジン」記録保持者である Dmitrey Shechtman 氏の LeanChess(288 バイト)を起源としています。 10 バイトの削減は、以下の二つの領域での最適化によって達成されました。
歴史的進化の軌跡
- 1K ZX Chess (672 バイト, 1982) – David Horne / Sinclair ZX81
- BootChess (487 バイト, 2015) – Olivier Poudade / x86 ブートセクター
- LeanChess (288 バイト, 2019) – Dmitry Shechtman / x86 DOS (.COM) ★転換点
- AttoChess (278 バイト, 2026) – Nicholas Tanner / x86 DOS (.COM)
最適化の詳細分析
01 · ディスプレイ(描画手法の廃止)
レンダリングバッファや文字列出力機能 (
int 21h/09h) を排除し、直接ストリーミング出力を実現しました。
- 旧方式: バッファ設定→ASCII 変換→終端記号追加→
一括出力(オーバーヘッド大)int 21h/09h - 新方式 (AttoChess):
- 境界は改行コード (
) で直接表現。CR, LF
(高速コンソール出力) を使用し、各バイトを即座に画面に描画。int 29h- プログラムメモリ内に盤面配列を予約する必要がない(パディングなし)。
- 境界は改行コード (
アセンブリコード例:描画ループ
main_loop: mov si, offset board_db + 24 ; 黒方のバックランクから開始 (行 2) mov cl, 98 ; 8 行分+最後のリターン処理 disp_loop: lodsb ; マスデータを読み取る test al, 30h ; ピースがあるか?(ASCII '0'-'9') jz disp_cont ; なしなら改行/NUL を出力 inc ax ; 王 (K) のゼロベース調整 and al, 27h ; ピースタイプと色フラグ抽出 add al, 4Bh ; ASCII 文字に変換 (大/小文字自動) disp_cont: int 29h ; [AL] を即座に出力 loop disp_loop
02 · スタートアップ(BIOS の省略)
ビデオモード設定 (
int 10h) を行わず、プログラムが動作する前提を明示しています。
: デフォルトの DF フラグクリアを強制。cld
: 行数をハードコードし、入力での変数を依存しない設計。mov cx, 13
03 · 入力処理(定数の折りたたみ)
ファイル・ランク座標へのマッピング演算を簡素化し、
imul を利用した効率的な計算を実装しました。
- 削減点: 入力マスク (
) と乗算セットアップ命令を削除。and al, 0Fh - 手法: ASCII バイアスをベースアドレスに直接統合。16 ビットオーバーフローを利用。
アセンブリコード例:入力デコーダ
read_sub: mov bp, di mov di, offset board_db + 123 + 0CE0h ; ベースアドレスに定数畳み込み mov ah, 01h int 21h ; ファイル文字入力 add di, ax ; オフセット加算 int 21h ; ランク文字入力 imul ax, 12 ; (12 * ランクオフセット) 高速計算 sub di, ax ; 目標マスへジャンプ
04 · 探索ループ(レジスタの再利用)
再帰探索中のスタックフレーム読み込みを削減。CX レジスタは常に「深度カウンター」として維持されます。
- 手法:
命令ではなく、ポインタ比較でループ制御。loop - 効果:
のような深度復元作業が不要になる。mov cx, [si + 32]
アセンブリコード例:探索ループ制御
src_cont: inc bp cmp bp, offset board_db + 120 ; 盤面末尾越えか? jnz src_loop ; 未超えなら継続 (CX は維持)
05 · 歩兵の移動判定(色と方向の統合)
ベクトルパリティと先手権限を組み合わせ、方向テストを単一の XOR 命令で完結させました。
- 手法:
で符号ビットと先手権限を同相化。xor al, dh - 結果: カラー依存の別コードパスが不要になり、共通処理で両色に対応。
アセンブリコード例:歩兵移動判定
pawn: push ax xor al, dh ; 符号 XOR 先手権限 (bit 5 に整合) test al, 20h ; 前方移動か?(負の符号ビット) pop ax ; フラグ状態維持のため POP jz vec_cont ; 後方なら却下 test al, 1 ; 斜め移動か?(奇数オフセット判定) jnz pawn_cont ; 斜めなら取処理へ xor ah, 30h ; 直進なら宛先色反転 (空マス確認用) pawn_cont: test ah, dl jz vec_cont
環境設定と実行方法
コンパイル手順 (MASM/TASM)
80186 コードを生成し、
.COM 形式の 278 バイトファイルを出力します。
tasm AttoChess tlink /t AttoChess ; /t オプションにより .COM ファイルを生成 ls -l AttoChess.com ; 確認:サイズは 278 バイト
DOS 環境での実行 (DOSBox 例)
標準的な DOS インターフェンス (
int 21h, int 29h) のみのため、エミュレータでも本機でも動作します。
dosbox mount c: . c: AttoChess.com
プレイガイド
- 対戦スタイル: プレイヤー vs コンピュータ(黒方自動レスポンス)
- 入力の形式:
の 4 文字(例:[初期ファイル][初期ランク][目標ファイル][目標ランク]
)e2e4 - 盤面表示: 各一手ごとに自動再描画され、4 プリーまでの最善手が探索されます。
スコープと制限事項
AttoChess は記録達成のための最小限の設計であり、以下の特徴を持っています。
実装されている機能
- 基本ルール: 全ての駒移動と捕獲ロジックを実装。
- 探索: 真正な再帰型ミニマックス(4 プリー)。
制限事項 (典型的な小型チェスエングのトレードオフ)
- 欠落した機能:
- 王手詰めの判断
- 王冠 (キャスリング)
- パスアンパサント (en passant)
- 歩兵の昇進 (プロンプト)
- 入力処理:
- イレガルドな動き(例:
)はバリデーションされず、単純にエラーとみなします。g1e2 - 「合法な手が存在しない局面」では探索停止(スコア 0)。
- イレガルドな動き(例:
結論: これらの制限こそが、278 バイトという圧倒的なコンパクトさを担保しており、この記録の真価を体現しています。