テープ時代のメモの記事でオートスタートに触れたのでその仕組みを書いてみます。
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のソフトウェアの更新はその辺りを壊さないように気を使っていたのでしょうね。
PC-8001 テープからのオートスタート
GD55Bを検索したら辿り着きました。
スクランブルか何かのゲームの開始アドレスだったような気がします。当時はマシン語のデータをテープでロードしてユニークな値の開始アドレス全部覚えてました。
スクランブル
はい。I/O 82年1月号掲載の「SCRAMBLE」の開始アドレスです。
誰か気付いてニヤニヤするかなと思って特徴的なこれを例にしました。
補足
ちょっと補足します。
この「SCRAMBLE」の記事の中で、一般的な説明ではなくこのゲームの場合の操作手順だけでしたがオートスタートテープの作り方が示されていました。
返信遅くなってすみません。やはり、PC
返信遅くなってすみません。やはり、PC-8001を購入して一番最初に買ったゲームだったので40年経った今でも覚えています。I/Oみて打ち込みではなく買いました。
コメントを追加