H8側のメモリマップ



マニュアルの目次に戻る


H8全体のメモリマップ


ユーザプログラム/データ領域について

 MSX−H8カートリッジは、最低限 H'200000番地から容量1Mバイトの16ビットバス接続、2ステートアクセス(つまりノーウエイト)のRAMを実装しているものとします。

 自作なさる方はかならずこの条件を満たしてください。これより小容量のRAMしか実装しなかったり、手を抜いて8ビットバス接続にしたりしないでください。とくに8ビットバスで接続するのは絶対やめてください。ブートローダはこの領域を16ビットバスに設定しますので、8ビット接続されたRAMはまともにアクセスできません。



 ブートローダのHELOコマンドは、H'200000番地から H'2FFFFF番地までの1MバイトにRAMが存在するかどうか、きわめて簡単なチェックを行い、存在すればGOODコード、存在しなければBADコードを返します。

 MSX−H8カートリッジの仕様としては、H'300000番地以降にRAMを増設することを禁止してはいませんが、増設されていてもブートローダは関知しません。H'300000番地以降にロードするLOADコマンドを実行しても特にエラー等にはなりません。運がよければ(つまりメモリが実装されていれば)正しくロードされますが、そうでなければそのプログラムあるいはデータは失われます。

 H'300000番地以降にメモリが存在することを盲目的に期待するアプリケーションソフトは作らないでください。最初にMSX側からロードされるアプリケーションソフトは1Mバイト以内に収まるようにしてください。H'300000 番地以降にRAMが増設されている可能性があり、アプリケーションソフトがそれらのRAMを使用したい場合は、RAM容量チェックなどはアプリケーションソフト側で行い、存在するときのみ使用するようにしてください。

ユーザプログラム領域が H'200000 番地から始まる理由

 それほど確固たる理由ではないのですが。

 あまり低い番地にRAMを置くと、将来もっと大きな容量の内蔵EEPROMをもつH8プロセッサが出てきた場合、ユーザプログラム領域の先頭がEEPROMに食われてしまい、ユーザプログラム領域の先頭番地を変更せざるを得なくなります。そうなると、完全にリロケータブルなプログラムでないプログラムは動作しなくなります。

 かといって高い番地に置くと、将来RAMを増設する余地が少なくなります。MSX1のようにRAMを高位番地から低位番地に向けて増設する、という手も考えられなくはないのですが、RAMの先頭番地が変動するようだとやはりリロケータブルなプログラムが必要になります。

 MSX−H8の仕様として「すべてのプログラムは完全にリロケータブルでなければならない」などと強制するのもいやです。
 H8のアーキテクチャ自体がリロケータブルなプログラムには向いていない(たとえば、PC相対のアドレッシングモードはジャンプ/コールでしか使えず、データのアクセスには使えない、など)ので、無理に完全リロケータブルなプログラムを組んでもパフォーマンスは上がらないでしょう。私自身そんなソフトは組みたくありません。(とか言いつつブートローダにリロケートコマンドを付けている私・・・)

 じゃあ、結局どこに置くんだ、ということですが、少なくともエリア0(0〜H'1FFFFF)は避けよう、ということで H'200000 に落ち着きました。

H8内蔵RAM内訳


H'FFEF10〜H'FFEFFF(240バイト) ブートローダ作業領域

 ブートローダが作業用に使います。レジスタ保存領域などもここにあります。

H'FFF000〜H'FFF0FF(256バイト) 割り込みジャンプテーブル

 割り込みルーチンのアドレスを指定するジャンプテーブルです。割り込み要因1つにつき、4バイトの領域が割り当てられており、全部で64個の割り込み要因に対応しています。
 割り込みが発生すると、いったんこの領域にジャンプしてきます。通常ここにはRTE命令が書き込まれていますが、ユーザーが作成した割り込みルーチンへのJMP命令を書いておけばユーザーの割り込みルーチンが呼び出されます。

H'FFF100〜H'FFF2FF(512バイト) ブートローダ予約作業領域

 この領域は現在使われていないのですが、将来ブートローダの機能が拡張された場合使用される可能性があるので、ユーザーは使用してはいけません。

H'FFF300〜H'FFFF0F(3064バイト) ユーザ作業領域

 この領域はユーザーが作業領域として自由に使ってかまいません。
 もちろん、ここを使わずにユーザープログラム領域の一部を作業領域として使うのもユーザーの自由ですが、この領域は短いオペランドによる高速アクセスができるので(とくに H'FFFF00〜H'FFFF0F の16バイトは8ビットオペランドでアクセス可能)、容量的に足りるならここを作業領域とした方が速いプログラムになります。
 なお、ブートローダのCALLコマンドを使用すると、スタックポインタ(ER7)は H'FFFF00 に設定されてからユーザプログラムがよびだされますので、多少余裕をみて、 H'FFFEFF番地ぎりぎりまで使うようなことは避けてください。
 スタック領域は普通のプログラムなら256バイト程度をみておけばよいでしょう(Z80の2倍はスタックを消費すると思ってください)。深い再帰呼び出しをするようなプログラムは、ユーザープログラム/データ領域の方にスタックを設定しなおしたほうがいいかもしれません。