Smalltalk-72で遊ぶOOPの原点: Altoのシステムクロック取得

アラン・ケイの“メッセージングによるプログラミング”という着想に基づき(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72に実際に触れてみるシリーズ 第2弾です(なお最新のSmalltalkについては Pharo などでお楽しみください!)。

今回は謎言語「Smalltalk-71」で書かれたスペースウォー・ゲームSmalltalk-72に移植して動かすことを目指します。前回(2019年)を含む他の記事はこちらから→Smalltalk-72で遊ぶOOPの原点 | Advent Calendar 2023 - Qiita


エミュレーターにちょっとだけ手を加えて mem 280 の数値をそれっぽく動かす

そろそろ並列性をどう実現するか考えなければならなくなってきたので、同期をとるのに必要っぽそうな Altoのシステムクロックの取得について。

ALLDEFS の説明を読むと Smalltalk-72 では mem 280 で Altoのシステムクロック値を取得できることになっています。

しかし、オリジナルのダン・インガルス版では、恐らくメモリダンプされた時点のシステムクロック値を返すだけでこれは機能していないようです。

Altoのハードウエアマニュアルによれば、同マシンのシステムクロックは、38.08マイクロ秒毎にインクリメントされる 26 bit 値で表現される仕様なのだそうです。

だいたい 40分くらいで一周する(元の値に戻る)この 26 bitのうち上位の 16 bit が 280番地に保持されます(念のため、8進数の430は 10進数の280)。

なので、この 280番地を適当なタイミングでインクリメントしてやれば、それっぽい動作をさせることが可能だとわかります。

Altoのエミュレーターの画面を Ctrl+クリック でハロー(選択状態にあるウィジェットの周囲に表示されるいろいろなメタ機能を持つ○型ボタン群)を呼出し、右側中央にある Debugハローをクリックすると Script Editor を開いてエミュレーターのコードを読んだり編集することができます。

左手のメソッドリストから step を呼び出すと 280番地を書き換えるのによさそうなループが見つかります。

これに this.mem[280]++; を追加して保存したワールドがこの一連の記事で使用している tweak3 です。

変更後、mem 280 の値が(正確ではないですが)変化するようになります。

手元の環境では約30ミリ秒でインクリメントされ、約32分、つまり Altoの実機より少し早めに一周するようです。

宇宙船をキーで制御する方法を考えるへ続く)