apple][のI/Oスロットとデバイス・チェーン
DOSの話を書こうとしたら「あ、この説明を先にしておかないと」と気が付きました。拡張スロットの話です。
apple][には拡張スロットが8つあります。ここに周辺機器のインターフェースを載せたカードを挿すことで、いろいろなデバイスを接続することが出来ます。いろいろなデバイスを接続することにより、apple][はいろいろな用途に使うことができるようになるわけです。実に多くのインターフェースが用意されていました。代表的なものは以下に出ているようです。
代表的な拡張カードの例
接続されるデバイスとして、ディスクを置いておくとすれば、最初に思いつくのはプリンタです。最初に思いつくだけあって、大抵は1番スロットに挿されていました。
ここでプリンタに文字を出すには、PR#1(1はスロット番号)とやればいいのです。この後はPR#0とやるまでは、画面に出るものはすべてプリンタに送られプリントされます。
プリンタに関するリファレンスは、あまり良いものが見つからなかったのですが、以下が純正なので一番正確かと思います。
Apple II Parallel Interface Card
プリンタに出力される文字が画面にも出るかどうかであるとか、直接プリンタの設定を行うために少しだけ専用のコマンドがあります。今で言うところの入出力はプリンタにリダイレクトされるのだけど、I/Oコントロール命令が別途あるという感じでしょうか。当時はリダイレクトと言わずにフックすると呼んでいた気がします。
PR#n(とIN#n)は6K/10KのBASICに含まれていましたし、モニタコマンドとしては、CTRL-P(とCTRL-K)です。いずれも同じ挙動をします。これらをどのように実現していたかというと、モニタにある文字出力(と文字入力)の際に呼び出すアドレスが格納されているゼロページRAMにあるCOUT(とCIN)の値を書き換えることで実現していました。
COUTは起動時にはモニタROMにある出力ルーチンのアドレスが格納されています。PR#1とした場合、まず$C100を呼び出して(このアドレスは拡張スロット1番に割り当てられているので、カード上のROMが呼ばれます)デバイスのセットアップを行い、その処理の中で、このCOUTのアドレスを自分自身の出力ルーチンのアドレスに変更するのです。変更された自分自身の出力ルーチンは処理が終わったら、この元々COUTに書き込まれていた元のアドレスに処理を戻すことで処理を終えます。これで元の出力(普通は画面への出力)も継続できるのです。出力する内容を変更したり無くしてしまう(デバイス固有の命令で他のデバイスでは不要となる内容だった場合、他のデバイスでは出力したくない場合など)のは自分自身の出力ルーチンで決めればよいのです。このようにして複数のデバイスに対して順に出力を渡していくこと(デバイス・チェーンとか呼んでいた気がします)で、デバイスごとに個別の拡張を行うこと無くデバイスにデータを渡すことが出来ました。
これでプリントした内容をモデムにも出したりであるとか、複数のプリンタに出したい場合も、BASIC自身を変更する必要はありません。固有のデバイスに対する命令を少しだけ出力しておけば良いわけです。
なおPR#0の場合は、元のモニタROMにCOUTを戻します。そこで特殊な0番スロットですが、無印apple][の場合は10KBASICのROMが載ったカードが挿されることが多かったです。どうして特殊かというと、ハードウェア的にも0番スロットは他のスロットと違うところもありましたけど、ソフトウェア的にはPR#0はフックを外すために使われていたという理由もあります。
どの番号のスロットに何が挿されているかは、それぞれのapple][をセットアップした人しか知らないので、プログラムとしては番号を可変にしておく必要はあります。でも大抵は暗黙の番号が決まっていて、マニュアルとかはその番号で書かれていました。
#0 - ROM CARD または LanguageSystem
#1 - パラレルインターフェース(プリンタ)
#6 - DISK][
#7 - ヨーロッパ向けappleのビデオ
は、ほぼ決め打ちと言って良かったと思います(7番スロットにはビデオ信号の一部が出ていたのでユーロプラスは、これで決め打ち。その影響で他のアップルでも7番は避けられました)。
これ以外で私が使っていたのは、ROM書き込みボードといろいろなCPUカードくらいでしょうか。3台目(1枚のインターフェイスにDISK][は2台挿せます)のDISKは5番スロットでした(DISK][は番号の大きい方からスキャンされることがあったので)。
最終的には拡張スロットの大部分が埋まってしまった覚えがあるのですが、そのくらいになると、電源容量が怪しい状態になった気もします。
プリンタに関しては、まだまだいろいろあるので、それは別の機会に。ゲームI/Oも書かないとね。