プログラミング
SC-Forth-サウザンド、って感じかな?
More like SC-Forth-thousand, am I right? (leadedsolder.com)
要約
著者は、レトロコンピュータープロジェクトのために、セガのSG-1000(またはSC-3000)で動作する低レベルプログラミング環境としてForthを選択しました。Forthは、そのミニマルな設計、インタラクティブな開発環境、そして組み込みアセンブラを内蔵できる柔軟性から、リソースが限られたシステムに適していると述べています。この記事は、RetroChallenge 2026/10の一環として、ForthのポートとSG-1000への統合の初期段階について解説しています。
全文翻訳
将来のハードウェアプロジェクトでいじくり回すための、優れた低レベルプログラミング環境がSoggy(セガの最初の家庭用ゲーム機であり、最初の家庭用コンピューター)には必要でした。理想的には、著作権を侵害することなくオンボードROMに含めることができる、自分で制御できるものでした。組み込みシステムで半ば人気のあるプログラミング言語を使用し、マシン上で直接実行できるインタラクティブな開発環境があれば良いでしょう。それらすべてを考えると、ついに初めてのForthを作成することになりそうです。
Soggy? セガの最初の家庭用コンピューターと最初の家庭用コンピューターは非常に似たマシンです。正確な理由は(私の知る限り)述べられていませんが、セガは当初、さまざまな能力レベルの複数の家庭用コンピューターをリリースする予定でした。この計画は、1台の家庭用コンピューター(SC-3000)と1台のゲーム機(SG-1000)のみをリリースするというものに変更されました。残念ながら、SG-1000は任天堂のファミリーコンピュータと全く同じ日にリリースされましたが、セガはそれを成功と見なしました。
これらの2台のマシンの共通の遺産で興味深いのは、SG-1000にキーボードを取り付けて、一種の事実上のSC-3000にすることができることです。80年代には多くの企業がこのようなものを約束しましたが、セガはそれを実現しました。その結果、SG-1000で(非常に限定的な形式の)BASICを実行できます。私は非常に壊れやすく劣化しているSC-3000を持っていますが、壊れやすいキーボードのプラスチックを割る心配なく遊べるものが欲しかったのです。比較的耐久性のあるSG-1000の価格は高く、特に昭和の未来的な第一世代モデルは上昇しています。私はまた、SG-1000と多くの類似した部品を使用する(しかし互換性はない)ColecoVisionのクローンを作成した経験もありました。結局、私はSoggy-1000と呼ばれるSG-1000のクローンを作成し、SG-1000キーボードとの互換性を確保しました。当然、このような野心や過剰な自由時間があると、すぐにセガのBASICの限界にぶつかりました。本当のコンピューターは、それ自体でプログラムを構築できるべきです!
RetroChallenge
このプロジェクトは、RetroChallengeの一部として行われています。RetroChallengeは、ほぼ年1回開催される非公式のコンペティションで、参加者全員が1ヶ月間レトロコンピューターで何かクールなことをします。これはRetroChallenge 2026/10のためのものです。このイベントは、私がたくさんのアイデアの間を飛び回るのではなく、1つのプロジェクトに集中するのに役立ち、1ヶ月でプロジェクトに大きな進歩をもたらすことができると感じています。RetroChallengeのルールでは、早期に作業を開始することはできないため、この記事は月の初めに公開されています。すべて数ヶ月、場合によっては数年前に完了したものであり、実際の「チャレンジ」は、私がそれを完成させることです。ここからのすべてはRetroChallengeの一部であり、この記事は私が何をしようとしているのかを理解するための入門書となるはずです。さて、Forthに進みましょう。
なぜForthなのか?
聞いたことがないかもしれませんが、Forthは非常にミニマルな高水準プログラミング言語です。組み込みシステムや小規模システムでは非常に一般的ですが、主にベースシステムを動作させるのが簡単で、コマンドシェルを使用して機能 incrementally に構築できるためです。PythonのREPLを考えてみてください。スタック指向の設計を理解するには時間がかかりますが、一度理解すると、その言語がいかにエレガントであるかに驚くでしょう。「What the Hell is Forth」は、このテーマに関する素晴らしい読み物で、このばかげたプロジェクトを開始した後にインターネットで見かけました。これらの限られたマシンでForthが私にとって魅力的であるもう一つの大きな理由は、多くのディストリビューションでForthが統合アセンブラを含んでいることです。適切に装備されたForthインタプリタがあれば、実際のハードウェア上でREPLでアセンブリ言語プログラムを作成でき、これは他に類を見ない体験です。
この記事、そして今後私が書くであろうほとんどの記事で、最も注意すべき点は、私はForthでプログラムを書く方法を本当によく知らないということです。いくつかの серьезные усилия を払えば簡単なプログラムをでっち上げることができますが、専門用語を理解するためにドキュメントに戻る必要があり、コードを読むことはほとんど役に立ちません。Forthのエキスパート、あるいは熱心なアマチュアとさえ思わないでください。このシリーズの目的は、遭遇したどんなコンピューターにもForthインタプリタを簡単に起動できることを示すことです。経験豊富なForthプログラマーであれば、間違いはご容赦ください。
なぜSG-1000/SC-3000でForthなのか?
SC-3000でForthを使えば、BASICよりもスペース効率の良い方法で、あらゆる種類のプログラムを書くことができます。率直に言って、よりイライラしません。90年代に大規模なBASICプログラムを再ナンバリングするのにうんざりしました。Forthはアセンブリよりも高水準で構造化されているため、otirのセマンティクスを覚えて自分自身を混乱させようとすることなく、より速くプログラムを書くことができます。必要であれば、アセンブラを含めることさえでき、Z80のためにクロスアセンブルするために「実際のコンピューター」を関与させることなく、マシン上で直接非常に高速で有用なコードを書くことができます。最後に、SoggyのROMソケットがあれば、強力なプログラミング言語を備えた汎用コンピューターとして、より便利にするための有用なプラットフォームを提供し、コールドスタートからすぐに使用できます。拡張スロットに接続された新しいもの用のデバイスドライバさえ書くことができます!前述の記事が言うように、それはアセンブリREPLのようなものです。
このプロジェクトに取り組んでいる間、私はKilobaud誌で「Write Your Own FORTH Interpreter」という素晴らしい記事を見つけました。これらのものが実際にどのように機能するかのメカニズムに興味がある場合は、セカンドタブで開いてみてください。または3番目、あるいは400番目。私たちは皆友達です。
Port a Forth
まず、Forthをポートすることから始めたいと思いました。これにより、「SG-1000固有」の多くのことを済ませることができ、実装について良いアイデアが得られるかもしれません。RomWBWプロジェクトには、Bradford J. RodriguezによるGPLライセンスのCamelForth-80のフォークが含まれています。CamelForthは元々CP/M-80で動作するように意図されていましたが、著者は幸いにも、それをスタンドアロンでROMから実行できるように変更するための詳細なポートガイドを提供しています。
私は、TMS9918、スタックポインタなどの独自のハードウェア初期化、リセットハンドラを書き、いくつかのバッファを移動し、CP/Mを使用するように実装された3つの単語を置き換える必要があります。Z80アセンブリで実装されたこれらの3つの単語は次のとおりです。
KEY: 押されているキーを返します。
KEY?: キーが待機しているかどうかを返します。
EMIT: 画面に1文字を出力します。
このような詳細なポートガイドを見ることができて本当に嬉しいです。ソースコードを読み、攻撃計画を立て、RAMテストプログラムのコードベースにマージして、コンソールインターフェースと基本的なキーボード読み取り機能を提供することを試みました。RomWBWバージョンは変更されていたため、CamelForthのウェブサイトから元のバージョンを取得して作業しました。
アセンブルさせる
すべてのZ80マクロアセンブラは pretty much 同じだと考えるかもしれません。しかし、構文、演算順序、特にマクロ実装には多くの違いがあります。CamelForth-80は元々、フリーウェア/パブリックドメインのZ80MRアセンブラで構築されましたが、私はこれまですべてのZ80プロジェクトでZasmを使用してきました。Zasmに特別な愛着はありませんが、Z80MRはCP/Mで動作するように設計されており、私の知る限りではモダンなMac/*nixポートはありませんでした。実際、ウェブ検索をすると、その存在に関する参照の大部分は、CamelForth-80自身のREADMEから来ています。少し探し回って、Oakland CP/MアーカイブCDのDiscMasterアーカイブで、(当然)Z80アセンブリで配布されていたこのコピーを見つけました。つまり、アセンブリをあるアセンブラから別のものにポートする必要がありました。簡単でしょう?
ビルドする
zasmが最初に失敗したのは、ソースコードの最初のForth単語であるEXIT.(ファイルcamel80.asm内)でした。
210: IF