付録G
メモリ
TATARAとTANRENは、表を、そしてTANRENは作成中のプログラムも、Z80から見える64 KBの中ではなく、MSXのメモリ・マッパーに置きます。この付録では、ツールのメモリの使い方、プログラムを作るのに必要なメモリの量、そして足りないときにどうすればよいかを説明します。ここで扱うのは、ツールが動いている間に必要なメモリで、できあがったプログラムが動くときに必要なメモリではありません。
G.1 メモリ・マップ
メモリ・マッパーは、16 KBのセグメントに分けられた RAMです。Z80はそのうちの4つを同時に見ることができ、64 KBの4分の1ずつに 1つずつ置かれます。この4分の1をページと呼びます。図G.1に、TATARAやTANRENが動いている間の4つのページの使い方を示します。
- 0000h〜3FFFhと4000h〜7FFFh:0100hより下はMSX-DOSが使い、0100hからはツールそのもの、つまりそのコードと、いつも必要なデータが置かれます。
- 8000h〜BFFFh:窓です。ツールは、マッパーに置いたものを読み書きするために、マッパーのセグメントを1つずつこのページに持ってきます。MSX-DOSを呼ぶ前には、毎回このページをMSX-DOSに返します。
- C000h〜FFFFh:MSX-DOSとスタックです。
G.2 マッパーに置くもの
MSX-DOS2がほかのものに割り当てていないセグメントは空きで、ツールは必要になるたびに、それをMSX-DOS2に求めます。
- TATARAは、名前とその値、マクロの本体、オブジェクト・ファイルに書き出すレコードを置きます。
- TANRENは、各モジュールのセグメントと名前、そして作成中のプログラムを置きます。プログラムは、それが占めるアドレス16 KBごとに 1つのセグメントを使います。0100hからA0FFhまでのプログラムなら3つです。何も書き込まれないアドレスはセグメントを使いません。
つまり、プログラムの大きさを制限するのはマッパーの空きメモリで、MSX-DOSがC000hより下にプログラム用に残すメモリではありません。
G.3 プログラムを作るのにツールが必要とするメモリの量
問題になるのは全体の量ではなく、空きメモリの量です。MSX-DOS2はマッパーの一部を自分で使います。以下のテストでは、RAMディスクなしで、MSX2と MSX2+では112 KB、MSX turbo Rでは176 KBでした。RAMディスクがあると、さらに使われます。
表G.1に、いくつかのマシンの空きメモリに何が収まったかを示します。どのソースも、16文字の名前をEQUで定義したもので、プログラムは40 KBのデータを.COMプログラムとしてリンクしたものです。
| MSX | 全体 | MSX-DOS2 | 空き | 名前2000 | 名前8000 | 40 KB |
| MSX2 | 128 KB | 112 KB | 16 KB | ×(495) | ×(495) | × |
| MSX2 | 192 KB | 112 KB | 80 KB | ○ | ×(2479) | ○ |
| turbo R | 256 KB | 176 KB | 80 KB | ○ | ×(2479) | ○ |
| turbo R | 384 KB | 176 KB | 208 KB | ○ | ×(6447) | ○ |
| turbo R | 512 KB | 176 KB | 336 KB | ○ | ○ | ○ |
| turbo R | 1024 KB | 176 KB | 848 KB | ○ | ○ | ○ |
ここから、次の目安が得られます。
- 16 KBの空きメモリには、16文字の名前がおよそ495個入ります。1つの名前がおよそ33バイトを使うということです。短い名前はもっと少なくてすみます。
- TANRENには、表のための場所のほかに、プログラムが占めるアドレス 16 KBごとに1つの空きセグメントが必要です。
- 128 KBのMSXでMSX-DOS2が残す最小の16 KBの空きでも、ツールは動きますが、作れるのは小さなプログラムだけです。
- 80 KBの空きがあれば、ツールは自分自身を作れます(35章)。27個のモジュールからなる、およそ30 KBのプログラムです。192 KBのMSX2や256 KBのturbo Rには、それだけの空きがあります。
- 336 KB以上の空きがあれば、表のすべてが収まります。512 KBのマッパーがあれば、MSXに収まるどんなプログラムでも余裕を持って作れます。
MSX2にMSX-DOS2のカーネルを加えるカートリッジの多くは、自分のマッパーを持っています。アスキーのMSX-DOS2カートリッジは128 KB、SD-512と MegaFlashRom SCC+ SDは512 KB、Carnivore2は1 MBです。最大4 MBの MEGA-MAPPERや16 MBメモリーカートリッジV3のような、マッパーだけのカートリッジは、どのMSXにもメモリを加えます。これらのカートリッジとその入手先は、付録Hに示します。
MSXのメモリの量を調べる
MSXの起動画面にはメモリの量が表示されますが、機種によっては、コンピューター本体の中のマッパーのメモリだけを表示し、カートリッジのマッパーのメモリは表示しません。https://github.com/javilm/msx-mapperから入手できるMAPPER.COMは、MSX-DOS2が見つけたすべてのマッパーを、それぞれのうちMSX-DOS2が使っている量と空いている量とともに表示します。
A:\>mapper Total 256Kb (176Kb sys, 0Kb user, 80Kb free). Memory mappers detected by MSX-DOS2: [PRIMARY] Expanded slot 3-0: 176Kb sys, 0Kb user, 80Kb free.
ツールが使えるのは、freeの量です。
G.4 マッパーがいっぱいになったとき
空きセグメントがなくなると、ツールはout of mapper memory.で止まります。空きを増やすには、次の方法があります。
- RAMディスクをなくす:RAMディスクがあれば、ramdisk 0でそのメモリをMSX-DOS2に返します。メモリに常駐するプログラムも、マッパーのセグメントを使います。
- プログラムを分ける:より多くのモジュールに分けます(28章)。TATARAが一度に場所を必要とするのは、1つのモジュールの名前だけです。
- メモリを加える:上に書いたようなマッパーのカートリッジを使います。