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)〜14)のチェックを通過すればMSX−H8カートリッジは存在します。


基本的なアクセス手順

H8に1バイトのデータを送る

H8から1バイトのデータを受け取る


 なんらかのプログラムミスにより、送り側が送ろうとしているバイト数と受け側で受け取ろうとしているバイト数が違っている場合、「来ないデータを永遠に待ち続ける」「データを送っても相手が受け取ってくれないので次に進めない」といった「ハマり」が起こります。
(それ以外にも、どちらかのプログラムが暴走した場合も「ハマり」は起こりますが。)

 「ハマり」(英語で言うと Dead lock)の状況はある程度カートリッジ上のLEDで把握できます。/OBFランプが消えっぱなしの場合はMSXがデータを送っているのにH8が受け取っていない状態、IBFランプがつきっぱなしの場合はH8がデータを送っているのにMSXが受け取っていない状態です。

 このような「ハマり」に対処するため、普通はある程度待ってもフラグに変化がなければ異常とみなして処理を中断する「タイムアウトチェック」を行います。では、どれくらい待てばよいか、ですが、データをやりとりしている相手がH8上のブートローダの場合はせいぜい数ミリ秒も待てば良いでしょう(例外もあります)。H8側でユーザープログラムが走っていて、ユーザープログラムに対してデータをやりとりしている場合はなんともいえません。そのユーザープログラム次第です。