すっかりTX-0エミュレータを作るのが楽しくなっています。
紙テープ先頭に書かれたローダは完全動作するようになり、いくつか小さなプログラムが動き始めています。
ただ、その動作が「正しい」のかどうか判断するのが難しい。
なにせ、何をするプログラムかもわからない状態ですから。
tst 、と名称についているいくつかのプログラムがありました。
どうやら、TX-0 を改造したりしたときに、動作確認のために使ったプログラムっぽいです。
その中で一番小さな tstDisplay が動作した、と思ったのが昨日のこと。
画面に光の点が走る、と言うだけのプログラム。なるほど、ディスプレイテスト用だ。
…でも、しばらく走らせていると、光の点が出なくなる。
おかしいなぁ、と思ってプログラム解析すると、どうも動作が違う。
エミュレータ上で動くプログラムは、光の点は縦に動きつつ、少しづつ横にずれる。
でも、プログラム解析したら、横座標は変わらないらしい。
…と言うところまで理解できれば、どの命令がおかしいかはわかる。
その命令の実行プログラムにデバッグ用の「ログ表示」を仕込むと、動いていないとわかる。
なにかおかしいらしい。
呼び出し部分のバグを見つけ、修正したら正しい動作になった。
これでプログラムが正しく動作するようになったようなので、次へ。
いちいち解析しないといけないので、短いプログラムがいい。
lightGunTst というのが小さいから、それ行ってみよう。
ライトペン(ライトガン)のプログラムはまだできていないので、先に解析してみる。
どうやら、先のプログラムと同じように光が走り、ライトペンで触れると停止する、と言うプログラムのようだ。
ライトペンの動作を実装し、プログラムを動かす。
…触れると非常に遅くなるが、停止はしない。
ライトペンの実装方法がおかしいかな、とか散々調べてわかった。
元のプログラム、一見「停止する」ように見えるのだが、バグがあって停止はしない。遅くなるだけ。
えーと、半世紀前に作られたプログラムのバグを発見したんですけど、誰に連絡すれば?
まぁ、テスト用プログラムだから、当時も「なにか反応すればよし」だったのだろう。
動作したから次。
なんかわからんが、flexo という小さなプログラムがあった。
動作させると、flexowriter から アルファベットと数字が繰り返し出力される。
うん。一発で動いてた。
でも、動作が速すぎ。
flexowriter がそんなに早いわけないから、wait 入れよう。
当時の flexowriter ってどのくらいの速度だったんだろう。
…調べていて、重大な勘違いを発見する。
TX-0 、5MHz と書いてある文献があったのでその速度で作っていたのだけど、1cycle が 6μsec という資料があった。
5Mhz だと、1cycle は 0.2μだ。速度がかなり違う。
TX-0は16cycle で1命令をこなすので、1秒間に3万命令くらい動くつもりでいた。
同じ資料に「8千命令以上」と書いてあったが、これだと 6μsec と合致する。
というわけで速度調整。
flexowriter の動作速度や、テープリーダーの速度も調整する。
(テープリーダーは TX-0 は 250 line/min とわかったが、穿孔機と flexowriter の速度は不明。
PDP-1 を参考に、穿孔機 60 line/sec、flexowriter 10文字/sec とする)
…うん。flexo のプログラム、それらしく動いたから終わり。
文字が延々出ていても面白くない。
tssDisplay 、と言うプログラムが2つある。
tss って、tst の間違いじゃないかな?
実は、初期のころに読み込んでみて、全然動かなかった。
というか、画面がガビガビしたので、エミュレータの動作が悪くて暴走しているらしい、と判断した。
ところが、これまで速度調整などして「遅く」なっているので、動作させると一瞬画面が出た。
…一瞬だけで、そのごはやはりガビガビ。
もう一個の tss プログラムを動かしてみると…なぜか、こちらは動いた。
そしてわかった。なるほど、tss、Toggle Switch Storage のテスト用か。
TSS 部分のハードウェアをエミュレートする部分を作ってみる。
そして、TSS のトグルスイッチをパチパチすると、それを8進表記で画面上に表示する。
なんか、はじめて「対話的な」プログラムが動作した。ちょっと感動。
ほぼ同じプログラムらしいが、片方動いて片方動かない。
逆アセンブルして(動作確認のために、簡単なものを作った)、命令を比べると、片方にしか使われていない命令がある。
じゃぁ、この命令の動作がおかしいのかな…と調べると、もともと動作がややこしくて、実装のために「なんとなく」動く部分しか作っていない命令だった。
厳密に動作を作りこむ。
で、動かしてみると、もう一つの tssDisplay も動作した。
画面のフリッカーは結構激しい。
この程度の画面表示でちらつくとなると、もっと残光時間伸ばしたほうがよいのか。
0.25 秒程度にしていたのを、0.5 秒まで伸ばしてみた。
それでキャプチャしたのがこの日記の冒頭の図。
下の方で、画面の「リフレッシュ」を行っているのがわかる。
(縮小されいるとよくわからないので、クリックして拡大してください)
なんか画面も表示されるし、調子に乗って大きなプログラムに手を出してみる。
当初目標の、TicTacToe を読み込むと…なんと動作した!
…けど、動作がへん。
まず、ライトペンの動作が変で、まともに操作できない。
で、無茶苦茶なりに操作してみると、すでに○×を書き込んであるマスに上書きしたりしてしまう。
内部動作もおかしいようだ。
しかし、画面が出たことがちょっと励みになった。ぜひ、こいつを完動させたい。
mouse 、と名付けられたプログラムも動かしてみる。
格子模様が画面に描かれる。…それ以上動作しない。
でも、これはおそらく Mouse in Maze 。
格子模様をライトペンでつついて迷路作るのかな?
ライトペンの動作がどうもおかしいので、まだよくわからない。
こちらもぜひ動作を見てみたいプログラム。
もう少し頑張ります。
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |