MSX Datapack wiki化計画

6章 マッパーRAMセグメント

 ここでは、R800 DRAMモードでシステムセグメントに割り付けられた、マッパーRAMセグメントを再利用するための手順を紹介します。

 6.1 MSX turbo Rのマッパーサポートルーチン

 MSX turbo Rのマッパーサポートルーチンは、R800 DRAMモードを考慮して、以下のように拡張されています。

  1. 常に、内蔵スロット上のマッパーRAMをプライマリマッパーとして選択します。
  2. プライマリマッパーRAMの最後の4セグメントを、R800 DRAMモード用のセグメントとして割り付けます。
  3. MSX-DOS2カーネルのRAMセグメントは、R800 DRAMモード用セグメントの前の2セグメントに割り付けます。

 マッパーサポートルーチンでは、R800 DRAMモードであるかどうかに関わらず、実際にシステムに実装されているRAM容量をもとにして、管理するプライマリマッパーの総セグメント数を決めていることに注意して下さい。
 本体のRAMが256KBの場合、初期化が終わった段階では、割り付けテーブルは以下のようになります。

0123456789101112131415
SSSS------S S S S S S
図1.3 初期化時の割り付けテーブル

ここで、Sとあるのは、「システムセグメントとして割り当てられている」という意味で、内訳は次のとおりです。

表1.4 初期化時のシステムセグメント

セグメント番号内容
0〜3 アプリケーションが使用する。
10〜11 MSX-DOS2カーネルが使用する。
12〜15 割り当てられているが、MSX-DOS2では使用しない。

 この状態ではセグメント4〜9が割り付けの対象になります。
 R800 DRAMモードのとき、最後の4セグメントはライトプロテクトされており、RAMとしてアクセスできないので、マッパーサポートルーチンが返す総セグメント数のうちの4セグメントは、RAMとして扱うことはできません。しかし、セグメント管理の立場からは、この4セグメントはシステムセグメントとして割り付けられており、アプリケーションに対する割り付けの対象にならないので、実質上の弊害はありません。
 最後の4セグメントには、システムの初期化時に、システムROMの内容がコピーされています。各セグメントにコピーされるROMの内容は以下のとおりです。

表1.5 コピーされるシステムROMの内容

セグメント番号内容
12 MAIN ROM(ページ0)
13 MAIN ROM(ページ1)
14 SUB ROM
15 漢字ドライバの前半16KB

 どのような場合にも、これらの4セグメントは常にマッパーサポートルーチンが管理しているので、R800 ROMモードの場合には、標準的な手順の「セグメントの解放」ファンクションを使って、解放することができます。解放されたセグメントは、以降「セグメントの割り付け」ファンクションの対象になるので、RAMを有効に使うことができます。以上のように、マッパーサポートルーチンは、R800 ROMモードに切り替えた際に、必要に応じて最後の4セグメントをRAMセグメントとして再利用できるような構成になっています。
 ただし、12〜15のセグメントをアプリケーションなどで使用したときは、R800 DRAMモードに変えることはできません。どうしてもR800 DRAMモードに変更したいときは、システムROMの内容を、表1.5で示したセグメントにコピーし、それらのセグメントをシステムセグメントとして割り付けてからにして下さい。

 6.2 最後の4セグメント利用の手順

 以下で、最後の4セグメントを再利用するための、具体的な手順を説明します。

1. R800 DRAMモードであることを確認します。
 最後の4セグメントが初期化されたままの状態であり、他の目的で解放または最割り付けされていないことを確認しなければなりません。

2. 拡張BIOSの「マッパーサポートルーチンアドレスの獲得」ファンクションを使って、プライマリマッパーの総セグメント数を得ます。
 最後の4セグメントセグメント番号を獲得します。総セグメント数をNとすると、(N-4)〜(N-1)が解放の対象となるセグメントです。

3. マッパーサポートルーチンのFRE_SEGファンクションを使って最後の4セグメントを解放します。
 この際、対象となるのはプライマリマッパーなので、Bレジスタは0です。

 6.3 プログラム例

プログラム例を以下に示します。この例では、エラー処理や例外状態の判別は行っていませんのでご注意下さい。また、jump_table はRAM上になければなりません。

                 .z80
extbio  equ      0ffcah              ;extended bios entry

        ld       de,0402h            ;
        call     extbio              ; マッパーサポートルーチンアドレスを獲得
        ld       de,jump_table       ; マッパーサポートルーチンの呼び出し効率
        ld       bc,16*3             ; を上げるため、固定アドレスにジャンプテー
        ldir                         ; ブルをコピーする。
        ld       b,4
fre_loop:
        dec      a                   ; A = N-1, N-2 ..., N-4
        push     bc
        push     af
        ld       b,0                 ; プライマリマッパーのセグメント[A]を解放
        call     fre_seg             ; する。
        pop      af
        pop      bc
        djnz     fre_loop
        ...
        
        jump_table:
        all_seg:         ds      3
        fre_seg:         ds      3
        rd_seg:          ds      3
        wr_seg:          ds      3
        cal_seg:         ds      3
        calls:           ds      3
        put_ph:          ds      3
        get_ph:          ds      3
        put_p0:          ds      3
        get_p0:          ds      3
        put_p1:          ds      3
        get_p1:          ds      3
        put_p2:          ds      3
        get_p2:          ds      3
        put_p3:          ds      3
        get_p3:          ds      3