R800ユーザーズマニュアルを読んで

 国会図書館に遠隔複写を申請していた、月刊Datum1990年10月号掲載の「R800ユーザーズマニュアル暫定版」が届いたのでざっと読んでみた。そもそもあんましハードウェアは詳しくないのだけど、いくつかわかったこと。

 速度アップと乗算命令追加以外でわりと特徴的なことは、

  • 新割り込みモード
  • DMA

 あたりだろう。新割り込みモードは、8段階の優先度付き割り込みで、割り込みベクターレジスタに登録した8ビットの値を上位アドレスにして、そこから2バイトずつ置かれたアドレスに割り込みごとにジャンプするようだ。従来の割り込みと新割り込みの切り替えは割り込みベクターレジスタベクターを書き込むかどうかで行われる。
 MMUというかマッパーは、24ビットのアドレススペースの上位11ビットを変更できるマッパーレジスタが9本用意され、8KB単位でページの内容を入れ替えられる模様。MAP0(0000H~1FFFH)からMAP7(E000H~FFFFH)までの8本と、新割り込み時に使われるMAP0'(0000H~1FFFH)がある。
 DMAはメモリ・メモリ間、メモリ・I/O間の高速データ転送を行う。これは24ビットリニアアドレスで実行可能。

 これらはすべて内部拡張レジスタを使用する。CSREGピンをLowに設定すると内部拡張レジスタが使用できる。なおMSX turbo Rではこのピンは常にHighなので、内部拡張レジスタにアクセスすることはできない。
 内部拡張レジスタは各8ビットでレジスタアドレス00Hから41Hまで存在するが、これらは通常のレジスタ、AとかHLみたいにマシン語の命令で直接操作できるわけではない。

内部I/OレジスタはCSREGピンを「LOW」にすることでアクセスできます。アドレス信号のA0が「LOW」の時、内部I/Oレジスタポインターが書き込まれ「HIGH」の時データが書き込まれます。ポインターはデータ書き込みごとにオートインクリメントされるためマッパレジスタ等の高速書き込みが可能です

 とあるのだがこの文章では具体的にどうしたらいいのかよくわからない。A0が「LOW」ということはアドレスの末尾が0であればいいのだろうけど、CSREGを「LOW」にしたあとで、メモリアクセスすればいいのかI/Oアクセスすればいいのか。どっちでもいいのか、まあとにかくA0を「LOW」にし、何らかの方法でレジスタポインターに目的のレジスタアドレスを設定し、A0を「HIGH」つまり奇数アドレスを設定してレジスタの中身を読み書きすることになるようだ。CSREGを切り替えるには外部回路を作ってI/Oで制御するのが一般的だと思うけど、一旦CSREGを「LOW」にしたらA0=「LOW」でレジスタポインタ、A0=「HIGH」でレジスタデータになるのなら、偶数奇数すべてのアドレスでこのどちらかになるわけで、LDやIN,OUT命令が全部拡張レジスタアクセスになっちゃうとしたら、どうやって戻せばいいんだろうか…うむ、なにか読み違えているっぽい。

せめてアセンブラで書かれた内部拡張レジスタ利用のサンプルコードでもあればと思うのだけど。そんなのはなかった。たとえばI/OポートFFHに0を書き込むとCSREGがLOWになって、1を書き込むとHIGHになるという前提で

XOR A ; A=0
OUT (FFH),A ; CSREGをLOWに
OUT (0),A ; Aが0だから拡張レジスタ0(メモリマッパー0のMA13-MA15)を指定
OUT (1),A ; 拡張レジスタ0に0を設定、ポインタはインクリメントされる。
INC A ; A=1
OUT (1),A ;拡張レジスタ1(メモリマッパー0のMA16-MA23)に1を設定
; これによって物理アドレス 010000Hがマッパー0に設定され、
; 論理アドレス0000Hが物理アドレス010000Hにマップされる。
OUT (FFH),A ;CSREGをHIGHに

とかなんとか。いやこの例は、内部拡張レジスタアクセスが、偶数アドレスと奇数アドレスのIN、OUT命令でできるという憶測に基づくものなので、全然間違ってるかもしれないし、そもそも上で書いたように、I/Oアドレス奇数偶数全部拡張レジスタアクセスになっちゃってるとしたら、最後のOUT(FFH),Aは希望する動作にならないと思うし。