前述のように、MSXではプログラムが異なったスロットに分かれているため、現在選択されているスロット上にないプログラムが必要になることもあります。これは主に以下のような場合が考えられます。ROMにあるBIOSを呼び出す。ROMにあるBIOSを呼び出す(MSX2以降)。ROMのBIOSを呼び出す。これらの作業を行う際スロット切り換えが簡単かつ安全に行えるように、インタースロットコールという一群のBIOSルーチンが存在し、どのスロットに存在するルーチンでも呼び出せるようになっています。本説では、このインタースロットコールの使用法を説明しましょう。ROM上のBIOSを呼び出す場合、スロットの状態の遷移は以下に示すとおりです。初めはMSX-DOSモードなので64Kのアドレス空間すべてにRAMが選択されており、このままではBASIC-ROMをアクセスできない(図5.6-1)。ROMに切り換え、アクセス可能な状態にする。BIOSを呼びだす(図5.6-2)。BIOSの処理が終わったら再び元の状態に戻し、初めに呼ばれたアドレスにリターンする。インタースロットコールのされ方このとき、MSX-DOS側のプログラムが、ページ0以外に存在するならば話は簡単なのですが、呼びだす側のプログラムが呼びだされる側のBIOSと同じページ0に存在しているときは、非常に複雑になります。呼び出す方のプログラムがページ0を切り換えたとたんに自分自身がいなくなって暴走してしまう、ということのないように配慮しなければいけません。インタースロットコールでは、いったんページ3へ分岐してから実際のスロット切り換えを行うという方法で、この問題を解決しています。このような複雑な状況をインタースロットコールはサポートするので、ユーザーは簡単に他のスロットのプログラムを呼び出すことができます。↓インタースロットコールは、以下に述べるいくつかの方法で行うことができます。MSX-DOSのインタースロットコール」参照)。指定スロットの指定アドレスから値を読み出します。指定したスロットの指定したアドレスの内容を読み出し、Aレジスタに格納します。スロットの指定はAレジスタによって図5.5の形式で行います。このとき、目的のスロットが基本スロットならば、上位6ビットはすべて「0」に設定し、下位2ビットでスロット#0〜#3を決めます。拡張スロットを指定するならば、同様にビット0とビット1で基本スロットを指定し、その基本スロットに接続されるどの拡張スロットかということをビット2とビット3で指定、さらにビット7を「1」にします。指定スロットの指定アドレスに値を書き込みます。D解説Aレジスタで指定したスロット(指定の形式は図5.5と同じ)のHLレジスタで指定したアドレスに、Eレジスタの値を書き込みます。呼び出し先プログラムの実行結果により異なる変更レジスタ呼び出し先プログラムの実行結果により異なる解説IYレジスタの上位8ビットで指定したスロット(指定の形式は図5.5と同じ)の、IXレジスタで指定するアドレスに存在するルーチンをコールします。ENASLT(0024H/MAIN)機能スロットを切り換えます。上位2ビットでスロット切り換えを行うページを指定する戻り値なし変更レジスタすべて解説HLレジスタの上位2ビットで指定したページを、Aレジスタで指定したスロットに切り換えます。指定スロットの指定アドレスをコールします。指定したスロットの、指定したアドレスをコールしますが、前述のCALSLTと異なり、スロットおよびアドレスの指定は次に示すように、インラインパラメータ形式で行います。このCALLFを呼びだす命令の直後にスロットを指定する値1バイト(RDSLTと同じフォーマット)を置き、その次にアドレスを指定する数値2バイトを置くという形でパラメータを渡します。30H」というRST(リスタート)命令を使ってもかまいません。その場合、4バイトでインタースロットコールが実現可能になります。基本スロット選択レジスタの内容を読み出します。基本スロット選択レジスタの内容を読み出し、Aレジスタに入れます。基本スロット選択レジスタへ値を書き込みます。基本スロット選択レジスタにAレジスタの値を書き込み、スロットを選択します。ROMの指定したアドレスをコールします。ROMを呼びだすためのルーチンです。ROMの存在するスロットはBIOSが自動的に調べます。普通は、次のEXTROMを使います。ROMの指定したアドレスをコールします。ROMを呼び出すためのルーチンです。ROMとこのEXTROMとは、IXレジスタの値をpushするか否かという点だけが異なります。↓MSX-DOSでは、以下に示す5種類のインタースロットコールが用意され、MSX-DOSジャンプベクタにそのエントリアドレスが定義してあります。これらはBIOS内の同名のルーチンとまったく同じものですから、機能や使用法に関しては、前述のBIOSをご覧下さい。ROMコール」の方法を使います。ROMを呼ぶ場合は、以下のような特別な配慮が必要ですCALSUBのエントリ条件は、IXにアドレスを入れるだけです。スタックはページ0以外でなければなりません。割り込み禁止は必要ありません。終了後、NMIフックの解除は必要ありません。ここで問題となるのは、EXTROMに必要なIXレジスタの値が渡せないことです。ROMが呼び出された後にIXがセットされ、EXTROMにジャンプする必要があります。具体的には、スタック上に次のようなルーチンを用意し、NMIのフックからジャンプさせるようにしておきます。次に、BIOSのNMIエントリ(フックは用意されているが使用されない)をインタースロットコールします。リスト5.3を参照して下さい。↓スロットに関するワークエリアには、以下のものがあります。Perl5.008007。