2.2 スロット切り替えに挑戦  MSX を語るのに、避けてとおれないのが、スロットの概念。ここではソフトウェアでスロットを制御する方法や、MSX2+ での仕様の変更点など中心にお送りする。 2.2.1 スロットを切り替えるには  MSXにおけるスロットの意味は説明したのだけど、スロットを切り替える方法は説明していなかった。そこでここからは、その方法を説明しよう。もちろん"人間がスイッチで切り替える"なんてヤボなものではなく、プログラムで切り替えられるのだ。  まず、MSX の CPU である Z80 には"I/Oポート"というものがある。これは、CPU が外部(つまり VDP や FM音源などの周辺機器)を通信するための、電話線のようなものだ。Z80 には合計 256本もの I/Oポートがあるのだけど、それぞれに 0〜255(16進数では 00H〜FFH)までの番地を割り当てることで、区別している。  BASIC でこれらのポートを扱うには、"INP"関数で I/Oポートから 1バイトの値を読み込み、"OUT"命令で 1バイトの値を書く。またマシン語では、"IN"命令と"OUT"命令がこれと同じ働きをする。  さて、この I/Oポートの A8H番地に書き込まれた値によって、基本スロットが切り替わる。逆にこの番地を読むと、現在のスロットの状況がわかるわけだ。ビット 7 と 6 がページ 3、5 と 4 がページ 2、3 と 2、3 と 2 がページ 1、1 と 0 がページ 0 というように対応しているので、1111000B(Bは2進法を意味する)という値を書き込みと、ページ 3 と 2 がスロット 3 に、ページ 1 と 0 が スロット 0 に切り替わるぞ。また、拡張スロットを切り替えるにはメモリーの FFFFH番地を使うのだけど、こちらは複雑なのでここでは省略する。  ところで、プログラムによって直接スロットを切り替えると、面倒なだけではなく、機種によってはプログラムが動かないといった、互換性の問題が起こりやすい。そこで実際には、"BIOS"によってスロットを切り替える。BIOS とは、"Basic Input Output System"という意味。あとでくわしく説明するけど、ハードウェアを制御するための、マシン語サブルーチンの集まりだ。これにはスロットの切り替えるいがいにも、多くの機能があるのでチェックしよう。 2.2.2 スロット番号の指定方法  BIOS を使ってスロットを切り替える場合には、基本スロット番号と拡張スロット番号を、それぞれべつに指定すればいい。でもそのためには、2個のレジスター(CPU内のデータの一時記憶場所)が必要になってしまい、不経済(?)だ。そこで、図2.6のように8ビット(1バイト)の各ビットをうまく使って、基本スロットと拡張スロットをまとめて指定する方法が取られている。  たとえば基本スロット 0 を指定するには、00000000B(16進数では00H)という値を、基本スロット3の拡張スロット1を指定するには、10000111B(87H)という値を指定すればいい。 2.2.3 スロットを操作する BIOS の機能  まず、BIOS の機能を書き表せすための記号を覚えよう。「E」とは BIOS を呼び出すまえに値を設定すべきレジスター。「R」は BIOS が値を返すレジスター。「M」は BIOS が無意味な値を書き込む、つまり元の内容が壊されるレジスターを表わす。また IYH とは、 IY レジスターの上位バイトを表わし、下位バイトの内容は無視される。またははじめに書かれた番地は、その BIOS を呼び出すためのエントリーアドレスだ。 RDSLT 000CH 番地 [機能] Aレジスターで指定されたスロットの、HLレジスターで指定された番地の内容を読む。 [E] Aスロット番号 HL番地 [R] A呼んだ値 [M] AF、BC、DE [注] 割り込みが禁止される。 WRSLT 0014H 番地 [機能] Aレジスターで指定されたスロットの、HLレジスターで指定された番地に、Eレジスターの内容を書き込む。 [E] Aスロット番号 HL番地 E書き込み内容 [R] なし [M] AF、BC、D [注] 割り込みが禁止される。 CALSLT 001CH 番地 [機能] ほかのスロットにあるサブルーチンを呼び出す。 [E] IX 呼び出す番地 IYH スロット [R] 呼び出す相手による [M] IX、IY、裏レジスター [注] 現在のスロット状態をスタックに保存し、目的のサブルーチンをコールする。AF、BC、DE、HLレジスターの内容は、そのままサブルーチンに渡され、サブルーチンがRET命令を実行すると、元のプログラムに戻る。このときも、AF、BC、DE、HLレジスターの値はサブルーチンから渡される。何バイトのスタックが使われるかどうかはスロットの構成によって異なる。 ENASLT 0024H 番地 [機能] スロットを切り替える。 [E] Aスロット番号 Hページ(上位2ビット) [R] なし [M] AF、BC、DE、HL [注] たとえば、2ページを切り替えるためには、Hレジスターに80H〜BFHの値を指定すればよい。割り込みが禁止される。 CALLF 0030 番地 [機能] ほかのスロットにあるサブルーチンを呼び出す。 [E] 以下のプログラムのように、"RST 30H"命令に続けてスロット番号を番地をプログラムに書き込んでおく。 RST 30H DB スロット番号 DW 番地 [R] 呼び出す相手による。 [M] IX、IY、裏レジスター [注] スロットと番地の指定方法以外は、CALSLTと同じ。特別な目的(フック)に使う。 EXTROM 015CH 番地 [機能] サブROMを呼び出す。 [E] IX 呼び出す番地 [R] 呼び出す相手による [M] IX、IY、裏レジスター [注] 自動的にサブ ROM のスロットが選択される以外は、CALSLTと同じ働きをする。  と、以上紹介してきた BIOS には若干の制限がある。それもページ3 に対しては使えない。ページ0 に対しては DOS からメイン ROM を呼び出す場合にのみ使える。ページ2 と 3 に対しては問題なく使えることもあるからだ。"自分のMSXだけで動くプログラム"を作らないように注意しよう。とくに DOS からサブ ROM を呼び出そうとして CALSLT を使うと、スロット構成とディスクインターフェースの種類によって、動いたり動かなかったりするぞ。 2.2.4 スロット構成を知る方法  前にも説明したように、MSX のスロット構成は機種によって異なる。ディスクインターフェースのようなオプション仕様もあるため、マシンの数だけスロット構成があるといっても過言ではない。そこで、自分のマシンスロット構成と、オプション機器の有無を調べる方法を紹介しよう。  メモリーの F380H〜FFFFH 番地を"システムワークエリア"といい、ここには BIOS などによって重要な情報が記憶されている。ディスクインターフェースが接続していれば、システムワークエリアより少し番地が小さい場所に"ディスクワークエリア"が用意されているわけだ。またスロットに関係する情報は、表2.1のようにシステムワークエリアとディスクワークエリアに記憶されている。  メイン RAM がどのスロットにあるかという問題は重要だけど、表2.1 の "RAMAD0"などはディスクワークエリア内にある。そのため、ディスクがないとこれらの情報はわからないという問題もある。  リスト2.1 は、これらのシステムワークエリアから調べたスロット構成を、わかりやすく表示するプログラムだ。機種によって構成が違ってくるから、自分の MSX でも試してみよう。  表2.1 に掲載された以外にも、プログラムの役に立つシステムワークエリアがあるけど、詳細は"MSX2テクニカルハンドブック"などを見てほしい。それから、これらのシステムワークエリアは、とくに指示される場合を除いて、アプリケーションプログラムが書き換えられてはいけない。メモリーが不足して苦しまぎれにシステムワークエリアを使うプログラムがあるけれど、互換性をなくするもとなので注意しよう。 2.2.5 システムワークエリアを探ってみる  MSX2用のゲームソフトの中に、MSX2+で動かせばSCREEN 12 のタイトル画面を表示するようなものがある。また、モデムカートリッジがないのに通信しようとすると、親切にエラーメッセージを表示するプログラムもある。こんなソフトを作るために、プログラムがハードの種類や構成を調べる方法を紹介する。  まず"ディスクがあるかどうか"を調べるには、FFA7H番地の内容を読む。もし C9H であればディスクがなく、そのほかの値であればディスクがある。  "MSXの種類"を調べるには、メイン ROM の 2DH番地を読む。0 ならばMSX1、1ならばMSX2、2ならばMSX2+、そして 3 ならば turbo R というわけ。  一般に、2BH 番地と2CH 番地の内容は 0 だけど、"海外の輸出用に作られたMSX"では、キーボードや通貨記号の種類を表わす番号が入っている。輸出用ソフトウェアを作る場合だけ気にすればいいので、番号の一覧を省略する。  これは余談になるけど、MSXパソコンはヨーロッパをはじめ、ソビエトや、中近東のクウェートなどにも相当数が輸出されている。また、お隣の韓国では、学校に多数導入され、授業に役立たれているとか。なんともインターナショナルなマシンなのだ。  さて、"ビデオRAM容量"を調べるには、FAFCH 番地を読む。ビット2 とビット1 の値が、00ならば16キロバイト、01ならば64キロバイト、10ならば128キロバイトだ。これ以外のビットがべつの目的に使われているようなので無視しよう。次のページのリストのように"AND 6"でビット2 とビット1の値を切り出し、それを2で割ればいい。  このリストでは、おまけとして"拡張 BIOS"の有無も調べている。これは、通信モデム、FM音源、漢字辞書といった、オプションハードウェアを制御するための機能だ。FB20H番地のビット0 の内容が1 で、FFCAH番地の内容がC9Hでなければ、何らかの拡張 BIOS 機能があることになる。これが何であるか調べるには、複雑なマシン語のプログラムが必要になるので、今回はパス。それから、これは仕様書には書かれていないのだけど、FFCBH番地の内容は、拡張 BIOS 機能を持っているプログラムのスロット番号。  なお、意味を決められていないビット、たとえばスロット番号を表わす値の、ビット6 からビット4 などには、何が書き込まれているかわからない。そこで"AND"を使って、その内容を無視していることが分かるかな。  何度も書くようだけど、たとえ同じメーカーのマシンであっても、機種によってスロット構成が異なることがある。だから、自分の持っているマシンで試したあとは、友だちのマシンでも試してみよう。多くのマシンでテストして、その結果を表わしてみるとおもしろいぞ。 【リスト 2.1 (WHO_AM_I.BAS)】 2.2.6 MSX2+ ハードウェア仕様  MSX2+ には、ハードウェアの細かい改良点が加えられた。表2.2にまとめたのが、新しく仕様は定義または追加された I/Oポートだ。 【表2.2:MSX2+ の I/Oポート】  7CH番地と7DH番地は、本体に内蔵されたFM音源を操作するための I/Oポート。これとは違い、カートリッジで供給されるタイプのFM音源は(今後もし発売されるなら)、パナソニックの"FM-PAC"と同じ I/Oポートを使う。  FM音源カートリッジが本体に内蔵されているかどうかを調べるには、各スロットについて、4018H番地から401FH番地までを読む。その内容が"APRLOPLL"という文字列と一致すれば、そのスロットにFM音源を制御するプログラムのROMがあり、本体にFM音源が内蔵されているというわけだ。  一方、FM音源カートリッジの場合には、4018H番地からの内容が"PAC2OPLL"のように、製品の種類を表わす4文字と"OPLL"いう文字になるようだ。  "MSX-Write"や一部のモデムカートリッジには、最初のメニューで"BASIC"を選ぶと、リセットされたようにMSXのタイトル画面が表れるものがある。これは、ソフトウェアの準備の都合で、メインROMの0番地へジャンプして、リセットと同じような処理をさせているからだ。  以前は、0番地へのジャンプと本当のリセットを確実に区別する方法がなかったので、ソフトウェアの誤動作が起きることがあった。それがMSX2+からは、I/OポートのF4H番地にリセットの状態を調べるためのハードウェアが追加された。ただし、実際には、次のようにMSX2+のメインROMに追加されあたBIOSを使う。 CALL 17AH OR 80H CALL 17DH JP 0  初期化に呼び出されたROMカートリッジのプログラムは、 CALL 17AH を行う。そして、Aレジスターのビット7 が 0 ならば本当のリセット。1ならばジャンプ0で、自分が呼び出されたことがわかるというわけだ。 2.2.7 衝突を防ぐデバイスネーブル  漢字ROMを内蔵しているMSXに漢字ROMカートリッジを接続すると、漢字が正しく表示されないだけでなく、ハードウェアが衝突して故障する危険がある。これを防ぐありがたい機能が、I/OポートのF5H番地で制御される"デバイスイネーブル"というものだ。  図2.7に書かれているハードウェアは、リセット時にバスから切り離されている。そして、I/OポートのF5H番地の1バイト(8ビット)の値を書き込むことで、1になったビットに対応する内蔵ハードウェアが、バスに接続されているわけだ。これらの処理は、リセットまたはジャンプ0(ソフトウェアによって、メインROMの0番地にプログラムの実行が移ること)のあとで自動的に行われる。  MSX2では、I/OポートのF5H番地に0を書き込んだ場合、既に接続されているハードウェアを切り離すかどうかの、規定がされていなかった。このため"MSX-Write"などが、ROMのO番地へジャンプしてBIOSを再度初期化しようとすると、混乱が起こることもあったわけだ。  それがMSX2+からは、0を書き込めば、内蔵ハードウェアがバスから切り離されるように統一された。これにより、I/OポートのF4H番地とF5H番地を活用してMSX2+用の基本ソフトウェアを作ることで、互換性と信頼性が、いままで以上によくなるわけだ。