昨日書いたTX-0の紙テープの話。
えーと、まず前提として、TX-0 (だけじゃないけど)の資料やソフトを保存しているサイトがあって、そこで見つけた紙テープイメージをロードしようとしていた。
必ずではないが、ソースコードがある場合は一緒に置いてある。
さらに、これも必ずではないが、ソースコードは紙テープイメージと共に、テキスト化したものも置いてある。
で、ちゃんと読み込めているか試験するために、ソースコードがわかっている紙テープを読もうとしていた。
しかし、ソースとは全然違うデータが入っている。
さらにいえば、ソースイメージが非常に大きくても、ほんのちょっとしか読み込まない。
なんか読み込み方法が間違っているのかな、と思っていたのが昨日の段階。
TX-0 には、3つのモードがある。
プログラム実行モードと、テストモード(ステップ実行ができる)、そして紙テープ読み込みモードだ。
紙テープ読み込みモードで実行を開始すると、紙テープから 1word を読み込んで命令として解釈する。この際、sto (ストア:メモリ書き込み)命令だった場合は、紙テープからもう 1word 読んで AC とする。
つまり、sto とデータを並べれば、メモリ内をデータで埋めることが出来る。
紙テープから読み込むのは「命令」であることに注意。
最後に trn(transfer:分岐) 命令を読み込むと、そこで TX-0 は自動的にプログラム実行モードに切り替わり、指定されたアドレスから、メモリ内のプログラム実行を開始する。
当全、紙テープだからこの形式で書きこまれているのだろうと思っていた。
動作がおかしいので冒頭を解読したら、違っていた。
冒頭に、たった 18word の小さなプログラムが入っている。
おそらくは、紙テープを読み込むためのローダープログラム。まずはこれを解読しないといけない。
というわけで解読し、凝集度に驚いた。
たった 18word だけど、以下の機能を持つ。
・圧縮されたプログラムデータを展開しながら読み込む。
・データのチェックサムを用意し、最後に比較することで読み取りエラーの警告を出す。
・複数のプログラムの紙テープをつないでおくと、次々メモリに読み込む。(リンカに相当する機能)
・もちろん、最後に自動実行できる。この際、実行直前に一時停止し、ユーザーに準備を促すことも可能。
…まぁ、圧縮と言っても、元々のデータは必ず「メモリアドレスと、書き込みデータ」が必要だったので、メモリアドレスを省略しただけだけどね。
最初のアドレスと、最後のアドレスを最初に与えて、後はデータを並べればよいようになっている。これで、紙テープの長さはおよそ半分になる。
リンカ機能も、「紙テープをセロテープで貼ってつなげておく」という単純なものだけど、当時としては十分便利だったようだ。
#このプログラム、解読後に気づいたけど、ちゃんと説明あった。
でも、下に書くように、解読したことは無駄じゃなかった。
そして、このプログラムの解読中に、自分のページの記述間違いを発見したりもした (^^;
もうなおしてあるけど、改造後の TX-0 には、ループ命令とレジスタ内容の交換命令があった。
ループ命令(tix)は文書に書かれた説明がややこしくて理解できていなかっただけ。
レジスタ交換は、非常に特殊な組み合わせで命令を実行した時だけ「発動」する、隠しコマンド的機能だった。
(ちゃんと資料に書いてあったが、特殊条件なので気づいていなかった)
どちらも、自分でプログラムの流れを追わないと気づかなかった。
特に、レジスタ交換命令。一見すると全く無意味な処理をしているので「どういう意味だろう?」と資料を調べて、やっと特殊動作に気づいた。
書いた記事を修正するとともに、作成中エミュレータの該当機能も修正。
どうやら、ローダプログラムは正常に動くようになったようだ。
何やらデータをロードして、実行を開始しているのがわかる。
…でも、動作がおかしい。というか、暴走しているようにしか思えない。
少なくとも、ローダープログラムに使われる命令は正しく動いているが、他に動作のおかしな命令も多いのだろう。
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
15年 A Dark Room , Candy box! , Cookie Clicker.
申し訳ありませんが、現在意見投稿をできない状態にしています。 |