イニチヒチウマシロチ
これ何かというと昔アスキー誌に掲載されたアドベンチャーゲームのDATA文に頻出した文字列です。
雑誌掲載ということでユーザが自分で入力することになるのでネタバレにならないように暗号化されています。
まぁ暗号といっても入力時に意図せずに読んでしまうことを防ぐためなので凝ったものではありません。スピード命で入力していれば気にせずそのまま入力するでしょうし、ちょっと考えながら入力する私でも頻出するこのフレーズはつい頭の中で解読してしまったものの他は読んでいないので、十分目的は果たしたと言えるでしょう。
結局このゲームをクリアしたのか諦めたのか憶えていませんが、内容を記憶していないということはきっと諦めたのでしょう。
ただプログラム自体には興味があって当時調べました。
先述のようにDATA文は暗号化(難読化)されていますが、RUNすると最初に以下を実行します。
- LISTなどを禁止
- DATA文を復号
1.はフックを利用しますが、簡単に解除されないように複数のフックで互いを再設定するような仕掛けになっていました。一つを解除してもすぐに再設定されてしまうので、全てを一気に解除しなくてはなりません。
面白いなと思ったのは2.のやり方です。
舐めるようにREAD S$してからマシン語で書かれた復号ルーチンをUSR(S$)のように呼び出すことを繰り返しています。
文字列を引数にしてマシン語ルーチンを呼び出すとストリングディスクリプタ(のアドレス)が渡されます。ストリングディスクリプタは3バイトの構造で、1バイトの長さと2バイトの文字列実体へのアドレスが入っています。
この文字列実体ですが、一度でも文字列演算をしていたりすれば文字列領域(CLEAR文でサイズ指定しますね)内にあります。ですがREAD文で読んだ直後はBASICテキストエリア内のDATA文の該当部分です。確認はしていませんが文字列リテラルの場合もBASICテキスト内のはずです。
なので復号ルーチン内でこの実体を書き換えるとBASICテキストが変更されてしまいます。
この状態でLISTをとると見えてしまうので禁止しているんですね。
とても珍しいBASICによる自己書き換えプログラムなのでした。使うときに復号でも問題なさそうだけど何でこうしているんだろう……
コメントを追加