スロットに御用心

初出:1996年6月
更新:1996年9月17日
ここではスロット操作に関する注意事項を述べてみたいと思います。 スロットの概念や基本的な操作方法などは、MSX・FAN 1994年12月号の「おもちゃのマシン語」や、MSXテクニカルハンドブック(アスキー出版局)などを参考にするといいでしょう。

※以後、MSX-DOSのことを単にDOSと表現します。

DOS上でサブROMは使えない?

「MSX2」以降の機種用のDOSアプリケーションでサブROMを使うには、非常に複雑なことをしなければなりません。
単にCALSLTでサブROMをコールしたりすると、機種によっては暴走することがあります。
DOS上では、基本的にサブROMは使わない方がよいでしょう。
どうしてもサブROMを使いたい場合は、MSXテクニカルガイドブック(アスキャット)などに方法が載っているので、そちらを参考にするといいでしょう。

なお、「MSX2+」以降の機種では、DOS上で普通にサブROMを使用しても暴走しないようになったので、「MSX2+」以降の機種用のDOSアプリケーションの場合は、CALSLTなどでサブROMを操作してもいいでしょう。

スロット操作後は基本的にEIすること

スロット操作(CALSLT など)を行うと、操作前の割り込み状態によらずDI(割込み禁止)状態で戻ってくることがあります(MSX2以降の機種でも)。
操作後EI(割り込み許可)状態である必要がある場合は、操作後にEIするようにしてください。
割り込みルーチン内など特別な状況でなければ、スロット操作が一通り終わったらEIしたほうがいいでしょう(マシン語のEI命令を使います)。

RAMのあるスロットアドレスの調べ方(ディスクドライブがある場合)

ページ n(n=0,1,2,3)のRAMのスロットアドレスは、F341H + n 番地に書かれているので、そこを参照すればOKです。
RAMのスロットアドレスがページ毎に異なる機種があるので、必要なページをきちんと調べましょう。

※ディスクのブートセクタを書き換えて立ち上げた場合は、上記アドレスには正しいスロットアドレスが入っていない場合があります。
※ディスクドライブの有無に関係なくRAMのスロットアドレスを調べる方法は、かなり複雑(面倒?)です。 要は、調べたいスロットの特定のアドレスに値を書き込めるかどうかをみればいいのですが、書き込みの方法やアドレスに注意しないとうまく調べられません。 詳しくはMSXテクニカルガイドブックなどを参考にしてください。 それと、すべてのRAMが同じスロットにあるとは限らないこともお忘れなく(ページ毎に異なる機種あり)。

ENASLT(スロット切り替え)について

BIOSのENASLTは、ページ0のスロットを切り替えることはできません。
DOSのENASLTは、ページ0のスロットも切り替えることができます。

DOSでタイマ割り込みを利用する際の注意

DOS上でタイマ割り込みを利用する際は、自作のタイマ割り込みルーチン(H.TIMI(FD9FH)から飛んできた先)はページ0に置いてはいけません。 また、H.TIMIからはJP命令ではなく、「RST 30H」(CALLF)で飛んでください。
こうしないと、一部機種ではスロットの切り替えがうまく行かずに暴走することがあります。

※タイマ割り込みの基本的な利用方法は、MSXテクニカルハンドブックなどを参考にするといいでしょう。

FM BIOSのINIOPL使用上の注意

FM BIOSのINIOPLは不用意にインタースロットコールすると、INIOPLから戻ってしばらくすると、機種によっては暴走することがあります。
これはINIOPLから、ページ1のスロットを戻さずに戻ってくることがあるからです。

INIOPLをインタースロットコールする際は、以下の手順で行ってください。

1.ページ1のスロットアドレスを調べる。
2.INIOPLをインタースロットコールする。
3.戻ってきたら、ページ1のスロットをコール前に戻す(ENASLT使用)

これもMSXテクニカルガイドブックに、サンプルプログラム付きで紹介されているので、そちらも参考にするといいでしょう(でも、テクガイのサンプルはI/O直でスロットアドレスを調べてるから、ちょっとあやしいかも?)。

なお、WRTOPL等も含めたFM BIOSは、必ず一度はINIOPLをコールしてから利用しましょう。 詳しくは「FM 音源(MSX-MUSIC)あれこれポイ」を御覧下さい。


参考文献

MSX・FAN 1994年12月号(徳間書店インターメディア)
MSXテクニカルハンドブック(アスキー出版局)
MSXテクニカルガイドブック第4版(アスキャット)
MSXの適当手帳 MSX駅 西山駅