512バイトのブートセクタに収まる16ビットx86 Forth「sectorforth」

Sectorforth is a 16-bit x86 Forth that fits in a 512-byte boot sector (2020)

sectorforthは、512バイトのブートセクタに収まる16ビットx86 Forth実装です。1996年のUsenetスレッドに触発され、わずか8つのプリミティブと5つの変数、2つのI/Oプリミティブのみで構成されています。分岐やコンパイル、リターンスタック操作などのワードはForth自身で記述可能で、コロンコンパイラも備えています。NASMでコンパイルし、QEMUで実行できます。

sectorforthには、上記のUsenetの投稿で概説された8つのプリミティブのみが含まれており、内部状態を操作するための5つの変数と、2つのI/Oプリミティブが含まれています。
  1. Saltloaf

    512バイトに8つのプリミティブとコロンコンパイラを収めるのは、ほとんど何もないところからどれだけ多くをブートストラップできるかの素晴らしいデモンストレーションだ。そこから積み上げていく例が最も素晴らしい部分だ。

  2. jcmeyrignac

    このプロジェクトに似ている:

    https://github.com/fuzzballcat/milliForth

    ZEROEQUALS関数は次で置き換えられる:

    pop ax; neg ax;sbb ax,ax;push ax

  3. anthk

    ForthもLispも大好きだが、SectorLispの方がはるかに優れている。

    また、小さなデモとしては、Subleq/Muxleqの下のEforthをチェックしてみてほしい:

    https://github.com/howerj/subleq

    subleq.fth/muxleq.fthを編集して、これらのオプションを1に設定する:

    1 constant opt.multi ( 大きな「pause」プリミティブを追加 )

    1 constant opt.editor ( テキストエディタを追加 )

    1 constant opt.info ( 情報表示関数を追加 )

    0 constant opt.generate-c ( Cコードを生成 )

    1 constant opt.better-see ( 'see'をより良いバージョンに置き換え )

    1 constant opt.control ( より多くの制御構造を追加 )

    0 constant opt.allocate ( 「allocate」/「free」を追加 )

    1 constant opt.float ( 浮動小数点コードを追加 )

    0 constant opt.glossary ( 「glossary」ワードを追加 )

    1 constant opt.optimize ( 追加の最適化を有効化 )

    1 constant opt.divmod ( 「opDivMod」プリミティブを使用 )

    0 constant opt.self ( 自己インタプリタ [動作しない] )

    次にこれを実行して、float/do...loopなどを備えた新しいEForthイメージを作成する:

    ./muxleq ./muxleq.dec < muxleq.fth > new.dec

    Subleqがオリジナルで、muxleqは多重化されたものだ。コマンドは同じで、muxleqをsubleqに置き換えるだけだ(fthファイルも編集すること)。

    使用方法: ./muxleq new.dec

    簡単なヘルプは:

    words

    Forth構文については、EForth Overview PDFで十分だが、8086関連のコードはここでは異なるので注意。

この日のほかの記事

2026-08-20