ChipWits 40周年、オリジナルのFORTHコードをオープンソース公開
(chipwits.com)- 1984年の初期Macintoshゲームの1つである ChipWits が40周年を迎え、オリジナルのMac・Commodore 64向け FORTHソースコード をオープンソース公開
- 公開の目的は、ゲームの遺産を保存するとともに、1984年の 8ビットマイクロコンピュータ でクロスプラットフォーム開発がどのように行われていたかを共有すること
- Doug Sharpが保管していた40年前のディスクからデータを復旧し、一部に不良セクタはあったものの、ほとんどのディスクは正常に読み取り可能
- Mac版の全ソースは約 3,000行のFORTH である一方、現代化ポートは 35,000行のC# に達しており、当時のコードの高い凝縮性と制約がうかがえる
- プロジェクトはオリジナルのディスクイメージと抽出コードをGitHubで公開し、最新ソースの特定・ビルド方法の整備・スプライト抽出をコミュニティとともに進めようとしている
ChipWits オリジナルコード公開
- ChipWitsの40周年を記念し、オリジナルのMacおよびCommodore 64向け FORTHソースコード がオープンソース公開された
- 復旧されたオリジナルコードとディスクイメージは chipwits/chipwits-forth にまとめられている
- 公開の目的は、ChipWitsの 遺産保存 と、1984年の8ビットマイクロコンピュータ向けクロスプラットフォーム開発経験の共有にある
- オリジナルシステムに詳しい人はソースの調査や整理に参加でき、プロジェクトは ChipWits Discord Server を通じて協力を呼びかけている
1984年にFORTHを選んだ理由
- ChipWitsは1984年にMacintoshで発売された初期のゲームの1つだった
- 共同制作者のDoug SharpとMike Johnstonは、8ビットマイクロコンピュータ間で教育用ゲームを移植する中で、最初のオリジナルゲームであるChipWitsを設計した
- このゲームは Rocky’s Boots、Logo など、当時のプログラミングゲームの影響を受けた ロボットプログラミング ゲームである
- 1984年のMac開発環境は制約が大きく、主な開発手段は Apple Lisa を購入することだった
- Apple Lisaの元の価格は $9,995 で、現在価値では $30,373 に相当する
- インディーゲームスタジオには負担が大きすぎたため、DougとMikeはMac上で直接動作する MacForth Plus で開発した
- 当時は複数の8ビットマイクロコンピュータにFORTHの派生実装が存在し、後の移植を見据えた言語選択として適していた
- 開発は1984年4月に始まり、最初のバージョンの開発から出版まで約 7か月 を要し、クリスマス商戦に合わせて完成した
Commodore 64とApple IIへの移植
- Epyx はChipWitsのパブリッシャーになる予定で、Commodore 64が最大の市場だった
- EpyxにはMacゲームがなく、Brainworksは当時Appleが強かった教育市場を狙っていたため、Epyxは Commodore 64版のみ を出版した
- C64版への移植は1985年に完了し、Super Forth 64 で書かれた
- Commodore 64への移植は、Macと同様の全体的なUI設計を維持する必要があり、難易度が高かった
- マウスの代わりに ジョイスティック で操作するプルダウンメニューシステムを開発する必要があった
- カラーグラフィックスと SIDチップサウンド を追加した
- Macの400KBディスクではなく 165KBディスク にすべてを収める必要があった
- Macの128KB RAMではなく 64KB RAM とより低速なプロセッサを使わなければならなかった
- Commodore 64版の成功後、Apple II版も制作され、これもFORTHの派生実装で書かれた
発売後の評価とオリジナル版の実行
- ChipWitsは発売後、複数のレビューと賞を獲得した
- MacUser Editor’s Choice 1986 Award はChipWitsを「最も楽しいプログラミング概念入門」と評価し、アイコンベースの言語と教育的設計を高く評価した
- Macazine は、ChipWitsがMacintoshユーザーや子どもたちのカルト的人気作になるだろうと予想した
- MacWorld は、プログラミングが好きならChipWitsも気に入るだろうと評価した
- Creative Computing は、午前4時30分に漫画風ロボットに悪態をつく場面を含むレビューを残した
- 2008年にMaclife.comはChipWitsを 歴代Top 10 Apple II / Mac Games の1つに選出した
- オリジナル版は、オープンソースプロジェクト Emularity と Apple2js を通じて、ブラウザエミュレータで実行できるよう準備されている
40年前のディスク復旧
- 新バージョンのChipWitsを作業する中で、Doug Sharpが保管していた オリジナルディスク が見つかった
- 3.5インチフロッピーディスクと5.25インチフロッピーディスクは40年間家庭で保管されていたが、ほとんどのディスクは不良セクタなしで読み取れた
- Commodore 64ディスクの復旧には、eBayで購入した 1541 Commodore 64 Disk Drive が使われた
- USB XoomFloppy アダプタを通じて、現代のPCでデータを読み取った
- Macの3.5インチフロッピーディスクは、Mac独自のセクタ配置のため、現代のドライブの標準方式では読み取れなかった
- Macはディスク容量を 800KB まで増やすために独自のセクタレイアウトを使用していた
- PowerMac G3 WallStreetは3.5インチドライブとネットワークスタックを備えていたためブリッジシステムとして使われたが、最新のMacOSでは400KB対応が無効化されており、800KBディスクしか読めなかった
- その後、ファンの提案でUSBディスクドライブ制御用のカスタムハードウェアコントローラ GreaseWeazle を使用し、この方法は正常に機能した
- すべてのディスクはブロック単位のイメージとして吸い出され、GitHubリポジトリに整理された
- ファイル名にはディスクラベルを使用した
- 不良セクタが検出された場合は、ファイル名の先頭に
badを付けた - 現代のコンピュータで読みやすいよう、Pythonスクリプトでブロックを抽出し、UTF-8 ASCIIファイルとして再整形した
- Commodore 64独自の文字エンコーディングである PETSCII はASCIIに変換した
FORTHソースから見える開発手法
- 完全なオリジナルディスクイメージとコードは chipwits/chipwits-forth で確認できる
- Mac版ChipWitsの全ソースは約 3,000行のFORTH である
- 現代化ポートはすでに 35,000行のC# に達しており、オリジナルFORTHコードの凝縮性が際立っている
- 別記事 Forth Code for Electrocrabs in 1984 ChipWits Deciphered では、エレクトロクラブを制御するFORTHコードの1つの “screen” を分析している
- FORTHはスタックベースの言語で、逆ポーランド記法に近い
1 + 1の代わりに1 1 +の形で書くif random(3) == 1の代わりに3 irnd 1 = ifの形を使う
コード例で見る1984年のゲーム実装
- Mac版のロボット移動コードは、現代のゲーム開発のようにフレームごとのレンダリングループを分離していない
- ゲームロジックとグラフィックレンダリング が命令型コードの中に混在している
- アニメーションはループ内でピクセルを直接レンダリングする方式で実装されている
- 空の床タイルへ移動するか、壁にぶつかるか、爆弾に触れるかを数語のコードで処理する
?boom定義は、爆弾接触時にゲーム終了かどうかまで決定する- ロボット位置に応じてスコアに0を加え、ロボット通過で消えてしまった可能性のあるスコア表示を強制的に再描画する
- Commodore 64版のスプライト定義は、コードとアセットデータが一体化していた当時のやり方を示している
- FORTHソースはファイルではなく、番号付きの screen 単位で保存され、必要な順にロードされる
- C64のモノクロスプライトは 24×21ピクセル で、1画面に8個のスプライトしか使えなかった
- 4色スプライトを選ぶと解像度は 12×21 に下がり、ピクセル幅は2倍になる
- ChipWitキャラクターは複数のスプライトを重ねて描画され、ビンテージ漫画のセルアニメーションに似た方式になっている
- この選択により、利用可能なスプライトをChipWitに多く割く代わりに、より鮮明な画像と部位ごとのアニメーションが可能になった
- Mac版のアイテム得点テーブルは、1つのscreenに収まるようデータが圧縮されている
( 110584 dws)のような表記はscreenの日時スタンプで、110584は 1984年11月5日、dwsはDouglass Walter Sharpを意味する- このscreenは最終リリース前に最後に修正されたscreenの1つと思われ、最後に変更されたscreenは11月8日である
d,は値を10倍して保存するよう定義されており、150点を15 dのように表現できた- この方式は表の整列を保ちながら1つのscreenに収める助けとなり、リリース前のスコアバランス調整で全体の得点値を変更しやすくした可能性がある
リブートとコミュニティ作業
- チームはオリジナルのFORTH版公開とは別に、現代化されたChipWitsの開発も進めている
- リブート版は原作の楽しさとコンピュータ科学的な厳密さを保ちつつ、学習曲線から対戦型グローバルリーダーボードまで多方面を改善しようとしている
- SteamでChipWitsをウィッシュリストに追加すると、最終版のリリース通知を受け取れる
- オリジナルFORTHコードに関する現在のGitHubイシューの当面の目標は次の通り
- raw disk imageから関連するソースコードがすべて抽出されたか確認する
- 一部ソースファイルの整列問題を修正する
- 一部は40文字幅、一部は64文字幅である
- どのディスクが最新のソースコードを含んでいるかを特定する
- MacとC64でソースからビルドする方法を文書化する
- ディスクからraw spriteと画像を抽出し、
.pngファイルに変換する
- 最終目標は、現代のPC向け コミュニティ保守FORTH版 ChipWitsの実現である
1件のコメント
Hacker Newsのコメント
1984年にChipWitsをFORTHで作った理由を書いた記事がある
https://chipwits.com/2023/04/08/forth-programming-language-g...
大好きだったゲームを作ってくれてありがとう。新しいデモも入手し、Steamのウィッシュリストにも追加した
Forthはここ数年、学んでみたいと思っていた言語
昔のコンピューターでは、高速なプログラムが欲しければアセンブリ言語、遅くてもよければBASICを使うという選択肢があったが、Forthはかなり高水準に見える一方で「中間くらいの速度」の言語として残っているのが面白い
スタックベースの言語である
https://www.forth.com/starting-forth/
USBケーブルをコンピューターに接続し、ターミナルプログラムを起動するだけですぐ始められるので、この言語にどっぷり浸るにはよい
ただしオーストラリアから届く製品は到着まで数か月かかることがあるので、まず近くの供給元を探すのがよい
もう一つのよい方法は、1984年のように学ぶことだ。現代のコンピューターでCommodore 64やApple ][のようなエミュレーターを動かし、その中にForth開発環境を載せればいい
当時の文書は完全な初心者向けに書かれていて非常に追いやすく、インターネット上には無料のスキャンPDFも多い
簡単で楽しかったが、ある時点まではあまりにもばかばかしいほど簡単なので、人によっては基礎的すぎると感じたり、おもちゃ実装を超えたくなる誘惑が強くなったりするかもしれない
スタックを自分で管理しなければならないのでかなり面倒で、自分でFORTHを作るのは楽しい。必ずしもアセンブリ言語で作る必要はなく、以前C++でForth風のスクリプト言語を作ったこともある
BASICは「Beginner's All-purpose Symbolic Instruction Code」なので、その目的によく合っていた
Amstrad CPC 6128には教育用Lisp方言であるLogoの実装も別ディスクで提供されていて、子どものころ、その連想リストには本当に衝撃を受けた
当時は「オープンソース」が一般的な概念ではなく、各種言語のコンパイラーやインタープリターは専門的な商用ツールだった
[1] https://en.wikipedia.org/wiki/Amstrad_CPC#Other_languages
[2] https://en.wikipedia.org/wiki/An_Open_Letter_to_Hobbyists
すごく格好よく見える
関連して http://tumbleforth.hardcoded.net/ もあるけれど、かなり良さそうだと思う。これを最後までやった人がいるなら、どんな体験だったのか気になる
コンピューティングについて違う見方をさせてくれた
まだ若く未熟ではあるけれど、振り返ってみると、昔はハードウェアの制約のために特定の抽象化が選ばれ、現在のプログラミング言語の「進化の枝」にはうまく歳を取れなかった抽象化がたくさん積み重なっていて、荷重を支えるガラクタの層が増えたように見える。ほかの工学プロジェクトと似ている
Collapse OS は今日では実用的ではないかもしれないが、いくつもの抽象化レイヤーから抜け出す解放感はある。ひどい開発者体験なしに1960年代式のコンピューティングを楽しむ方法のように感じる
今の自分の荒唐無稽なプロジェクトは、こうしたものを追いかけながら Dusk OS を仮想マシン上でビルドし、その後物理マシンへ移し、C で Dusk OS 用の Scheme インタプリタを書いてから思う存分拡張すること
そこに到達する前に越えなければならない川がいくつかある。Python で Scheme インタプリタを数時間で実装し、さらに数時間かけてスキャナ/トークナイザを改善した。今は C で Scheme インタプリタを実装するにはどうすればよいかを見るために Crafting Interpreters を読んでいる。C インタプリタを作った後でこのガイドをもう一度見直し、DuskOS に正面から飛び込むつもり
もう筆者の語り口が気に入っている
例えば:
継続的で膨大なアウトプットが印象的。Collapse の哲学に完全に同意しているわけではないが、DuskOS のメーリングリストは眺めるのにちょうどいい程度のトラフィックがある
Virgil の仕事を見て Forth を少し試してみて、昨年は SmithForth[1] を手で逆コンパイルするのに時間を使った
言語をブートストラップするのに必要なアセンブリ言語が本当に少ないことに驚く。Forth が組み込み環境で REPL を提供できるというのは完全に納得できるし、よく聞く一般的な開発サイクルよりずっと面白そうに見える
[0]:https://duskos.org/
[1]:https://dacvs.neocities.org/SF/
その後 ChipWits の Wikipedia ページとブログ記事を読んでみたが、原作ゲームは本当に格好よく見える。Wikipedia のマニュアルにあるロゴもとても良い
最近、パズルとプログラミング要素のある昔/新しいゲームのリストを作っていたので、そこに入れるつもり。ketman アセンブリ「ゲーム」を終えたらすぐにやってみるかもしれない。実際には、あれをゲームと呼ぶのは微妙だけれど
新しい ChipWits が大成功することを願っている
Valpar の ValForth は Atari ST エコシステムにおける初期のクロスプラットフォーム FORTH 実装の一つで、ゲーム向けの賢い拡張も備えていた
https://www.atarimagazines.com/rom/issue1/jumping_forth.php
記事で述べられているように、8ビットにも Elcomp の FORTH があり、https://www.atarimania.com/documents/FORTH-on-the-Atari-Lear... のような本もあった。Leo Brodie の “Starting FORTH” は今でも優れた入門書だ
皆 BASIC を学んだが、こうした代替言語は、デバイスをプログラムするためのまったく別のメタファーが実際に存在するのだと教えてくれた
80年代の子どもにとっては、視野が一気に広がる出来事だった
Forth は Perl のように、一度書いたら読みにくい言語の一つに見える
書いたり作ったりするのは簡単だが、1年ほど後にコードへ戻ると何をしているのか分からなくなりそう
それでも本当に高速で効率的
たった今、3年以上触っていなかったかなり大きな Perl プログラムを適当に開いてソースをざっと見たが、何をしているのか理解するのにまったく問題はなかった
Perl コードが他の大半のプログラミング言語より読み返しにくいとは思わない。難しさは主に、開発者がその言語にどれだけ熟達しているか、そしてその言語で最後にコードを書いてからどれくらい経っているかに左右される
その言語の腕がかなり鈍っていたり、そもそも熟練度が高くなかったりすれば、どんな言語でも昔のコードを見直すのは難しくなる
もちろん自分のコードでなければさらに難しいし、コードがどれだけうまく書かれているかも大きく影響する。どんな言語にもひどいコードは多いし、最初からひどかったものは時間が経っても良くならない
Forth は書くのは難しいが、読むのは簡単だと思う
子どもの頃、Commodore 64でよく遊んだ
独特で、興味深く、楽しいゲームだった
Hacker News でスパムしたくはないが、オリジナルを遊んだことがあるなら、リブート版への反応をぜひ聞きたい: https://chipwits.com
子どもの頃、このゲームが本当に喉から手が出るほど欲しかった
自分もずいぶん年を取ったものだと思う
現代版 ChipWits は何で書かれているのか気になる
このゲームは本当に大好きだった。C64 用の Forth パッケージも持っていたが、このゲームがそれで作られていたとは結び付けて考えていなかった
Human Resource Machineを買って、ほとんどの部分は楽しく遊んだ。難しすぎるようになるまでは
ChipWits と同じコンセプト、つまりスタックベースのプログラミングをゲームにしたもののように見える
両方遊んだ人がいたら、どう比較されるのか気になる