現在地

PC-8001 テープからのオートスタート


カテゴリー:

テープ時代のメモの記事でオートスタートに触れたのでその仕組みを書いてみます。

PC-8001でバイナリ(いわゆるマシン語)のプログラムをテープから読んで実行するには普通次のようにします。

mon
*L
*GD55B

ここで「*」はプロンプトなので入力はしません。

mon」コマンドでマシン語モニタに入り、「L」でテープからロードし、「G」で実行します。「D55B」は実行開始アドレスです。

mon」「L」は不変なので憶えられますが、実行開始アドレスはプログラム毎に異なるので面倒です。そこで市販ソフトウェアを中心にこのオートスタートのテクニックが使われました。

PC-8001のメモリマップは以下のようになっています。

0000
5FFF
N BASIC ROM
6000
7FFF
拡張ROMエリア
8000
801F
割り込みベクタ
8020
????
BASICプログラム
????
????
変数・配列エリア
????
????
空きエリア1
????
????
スタックエリア
????
????
文字列エリア
????
????
空きエリア2(起動時はサイズ=0)
EA00
FFFF
ワークエリア

アドレスが????になっているところは状況によって変化します。BASICのプログラムを入力すればBASICプログラムエリアが増えますし、変数などを使えば変数・配列エリアが増加します。

スタックエリアと文字列エリアはBASICの「CLEAR」命令によって移動できますが、起動時のアドレスは決まっています。起動直後に「mon」「L」と入力したとき、「L」コマンドの処理ルーチンからの戻りアドレスが書かれているアドレス(もちろんスタックエリア内)も決まっています。

そこでスタックエリアも含むように保存しておき、空きエリア1にプログラムをロードするときに上記戻りアドレスまで書き換えてしまうのです。ここでプログラムの開始アドレスに書き換えておけば、ロード終了と同時に実行開始できるというわけです。

このようなテープを作成するときや、ロード後に解析したりするために自動実行させたくない場合は「CLEAR」コマンドでスタックエリアと文字列エリアを前に移動しておき、空きエリア2にロードします。

何かバッファオーバーフローを利用してスタックを書き換える攻撃手法によく似ていますね。

このような特定アドレスに依存したテクニックが当たり前のように使われていましたから、ROMのソフトウェアの更新はその辺りを壊さないように気を使っていたのでしょうね。


コメント

GD55Bを検索したら辿り着きました。
スクランブルか何かのゲームの開始アドレスだったような気がします。当時はマシン語のデータをテープでロードしてユニークな値の開始アドレス全部覚えてました。

はい。I/O 82年1月号掲載の「SCRAMBLE」の開始アドレスです。
誰か気付いてニヤニヤするかなと思って特徴的なこれを例にしました。

ちょっと補足します。
この「SCRAMBLE」の記事の中で、一般的な説明ではなくこのゲームの場合の操作手順だけでしたがオートスタートテープの作り方が示されていました。

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。