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プリミティブが含まれています。
HNでの議論
16- Saltloaf
512バイトに8つのプリミティブとコロンコンパイラを収めるのは、ほとんど何もないところからどれだけ多くをブートストラップできるかの素晴らしいデモンストレーションだ。そこから積み上げていく例が最も素晴らしい部分だ。
- jcmeyrignac
このプロジェクトに似ている:
https://github.com/fuzzballcat/milliForth
ZEROEQUALS関数は次で置き換えられる:
pop ax; neg ax;sbb ax,ax;push ax
- 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関連のコードはここでは異なるので注意。