MSXからのアクセス
マニュアルの目次に戻る
MSX−H8カートリッジは、Z80のI/O空間ではなく、メモリ空間に置かれています。したがって、マシン語でアクセスするにはIN/OUT命令ではなくLD命令を使います。ただし、極めて当たり前なことですが、あらかじめMSX−H8カートリッジの存在するスロットをBIOSのENASLTなどでアクセス可能にしておく必要があります。(別にRDSLTやWRSLTなどで1バイトづつ読み書きしても一向に構いませんが、速度の面から考えるとやはりENASLTでしょう。)
ちなみにマシン語以外でアクセスするにはどうするの? という疑問も出てくるかと思いますが、一応私としては次期バージョンのH−FORTHと超ミニBASIC(MSX版)にはMSX−H8カートリッジアクセス用の命令を付けようと思っています。あと、GIGAMIXのDM−System2にも対応するつもりです。
|
MSXとH8の間にはいわゆる「8255」と呼ばれる、もっともポピュラーと言ってよいパラレルインターフェース用のICが介在しています(MSXにも8255と同等の機能を持つICが内蔵されています)。ENASLTでMSX−H8カートリッジのあるスロットのページ1またはページ2を開くと、ページ1なら 04000H〜04003H番地、ページ2なら 08000H〜08003H番地に8255が見えます。(実は、アドレスバスの上位ビットをデコードしていないので、たとえば 08004H〜08007H とか、0BFFCH〜0BFFFH などを見ても同じように見えます)。
注意すべきなのは、MSXのA0を8255のA1に、MSXのA1を8255のA0につないであるため、ポートの順番が一般的な8255の用法と異なり、ポートA、ポートC、ポートB、モードレジスタ、の順になります。もちろん、これは意図的にこのようにしています。実際にH8とデータをやり取りするには、「ポートCからステータスを読む」ことと「ポートAのデータを読む(または書く)」ことを交互に繰り返すパターンがほとんどです。ですから、このようにポートAとポートCを隣接させておけば、たとえばDEレジスタ(べつにBCでもHLでもいいですが)にポートAの番地を入れておけば、INC/DEC命令1つで簡単にポートA、ポートCをポイントすることができます。
なお、以下の文章では8255のポートA、ポートB、ポートCを、PA,PB、PCと略すことがあります。
8255 ポート構成
8255は、グループA(PA、PC上位)をモード2(双方向ハンドシェーク)、グループB(PB、PC下位)をモード0(単純なI/Oポート)として使います。よって、8255のモードレジスタ(04003H・08003H番地)には初期化時には 0D9H を書きこみます。
PA(双方向) 04000H・08000H番地
|
ビット
|
内容
|
BIT 7
:
BIT 0
|
MSX−H8でやりとりする8ビットデータ
|
8ビット、双方向のパラレルデータポートです。
PC上位(ハンドシェークフラグ) 04001H・08001H番地
|
ビット
|
信号名
|
内容
|
BIT 7
|
/OBF
|
H8に対して出力可能なとき”1”になります
|
BIT 6
|
INTE1
|
(割り込み許可1、未使用)
|
BIT 5
|
IBF
|
H8からMSXへのデータがあると”1”になります
|
BIT 4
|
INTE2
|
(割り込み許可2、未使用)
|
BIT 3
|
INTRA
|
(割り込みフラグ、未使用)
|
/OBF、IBF は自動的にセット/リセットされます。すなわち、 /OBF は、MSXがPAにデータを書き込むと"1"になり、H8がそのデータをPAから読むと"0"になります。 IBF は、H8がPAにデータを書き込むと"1"になり、MSXがそれをPAから読むと"0"になります。
PC下位(入力) 04001H・08001H番地
|
ビット
|
信号名
|
内容
|
BIT 2
|
USRI2
|
ユーザー用入力(MSX←H8)です。
H8のポート6のビット2〜0につながっています。
|
BIT 1
|
USRI1
|
BIT 0
|
USRI0
|
PB(出力) 04002H・08002H番地
|
ビット
|
信号名
|
内容
|
BIT 7
|
RESET
|
”1”にするとH8にリセットがかかります
|
BIT 6
|
NMI
|
”1”にするとH8にNMIがかかります
|
BIT 5
|
RESERVE
|
(未使用)
|
BIT 4
|
RESERVE
|
BIT 3
|
RESERVE
|
BIT 2
|
RESERVE
|
BIT 1
|
USRO1
|
ユーザー用出力(MSX→H8)です。
H8のポート8のビット1〜0につながっています。
|
BIT 0
|
USRO0
|
MSX−H8カートリッジのスロット検索
ところで、MSX−H8カートリッジのあるスロットってどこでしょうか?MSX−H8カートリッジにはMSXから直接見えるROM(例の、04000H に 'AB' と書いてあるやつ)などは載っていないので、スロットを端から全部検索しなければなりません。その手順はたとえばFMBIOSの検索などと比べると若干煩雑ですが、プログラムの頭で一回だけやればよいことですから大した問題じゃないでしょう。
検索の仕方
以下の手順を、すべてのスロットについて行います。
1) 調べたいスロットのページ2をENASLTで開けます。
2) 08003H番地に 0D9H を書き込みます。(8255モード設定)
3) 08002H番地に 080H を書き込みます。これで(存在していれば)H8にリセットがかかります。
4) 08002H番地を読みます。読んだ値が 080H でない場合、そのスロットにはMSXーH8カートリッジは存在しません。(8255ポートBは出力に設定してあるので、書き込んだ値と同じ値が読み出せるはず)
5) 少し(少なくとも10μ秒)待ちます。
6) 08002H番地に 000H を書き込み、H8のリセットを解除します。
7) もう一度 08002H を読み、 000H であることを確認します。もし違っていればそのスロットにはカートリッジは存在しません。
8) PCのビット5(IBF)が"1"になるのを待ちます。最低1/60秒程度待ち、それでも"1"にならなければカートリッジは存在しません。
以下、14)まで、「ビット△が×になるのを待つ」という表現があったら、これと同様のタイムアウトチェックをしてください。
|
9) PAを一度カラ読みします。そのあと1/60秒程度待ちます。
10) 再度PAを読みます。この2度目の読みこみのときは IBF ビットのチェックは必要ありません。読みこんだ値が 0F5H なら11)へ進みます。0F5H でなかった場合、そのスロットにはカートリッジは存在しません。
9)、10)で2度読んでいるのは、H8側ですでに何らかのプログラムが走っていて、リセットをかけれられる直前にデータをポートに書き込んでいた場合、一回目のデータは 0F5H でないこともありうるからです。
|
11) PCのビット7(/OBF)が"1"になるのを待ちます。
12) PAに 080H(HELOコマンド)を書き込みます。
13) PCのビット5(IBF)が"1"になるのを待ちます。
14) PAを読み 0F0H(リザルトコードGOOD)であることを確認します。 それ以外の値だった場合、そのスロットにはカートリッジは存在しないか、存在していてもハードウエア不調で使用できません。
以上1)〜14)のチェックを通過すればMSX−H8カートリッジは存在します。
H8に1バイトのデータを送る
1)PCを読み、/OBF が"1"になるのを待ちます。 /OBF が"0"のときは決してPAにデータを送ってはいけません。
2) /OBF が"1"になったらPAに送りたいデータを書き込みます。PAに書き込むと /OBF は自動的に"0"になり、しばらくしたら(H8がそのデータを読んだら)"1"に戻ります。
H8から1バイトのデータを受け取る
1)PCを読み、 IBF が"1"になるのを待ちます。 IBF が"0"の時にPAから読んだデータは無効です。
2) IBF が"1"になったらPAからデータを読みます。PAを読むと IBF は自動的に"0"になります。
なんらかのプログラムミスにより、送り側が送ろうとしているバイト数と受け側で受け取ろうとしているバイト数が違っている場合、「来ないデータを永遠に待ち続ける」「データを送っても相手が受け取ってくれないので次に進めない」といった「ハマり」が起こります。
(それ以外にも、どちらかのプログラムが暴走した場合も「ハマり」は起こりますが。)
「ハマり」(英語で言うと Dead lock)の状況はある程度カートリッジ上のLEDで把握できます。/OBFランプが消えっぱなしの場合はMSXがデータを送っているのにH8が受け取っていない状態、IBFランプがつきっぱなしの場合はH8がデータを送っているのにMSXが受け取っていない状態です。
このような「ハマり」に対処するため、普通はある程度待ってもフラグに変化がなければ異常とみなして処理を中断する「タイムアウトチェック」を行います。では、どれくらい待てばよいか、ですが、データをやりとりしている相手がH8上のブートローダの場合はせいぜい数ミリ秒も待てば良いでしょう(例外もあります)。H8側でユーザープログラムが走っていて、ユーザープログラムに対してデータをやりとりしている場合はなんともいえません。そのユーザープログラム次第です。