Gigamix DM-SYSTEM2

マッパーRAMアクセス機能

updated:

第1章 概要

マッパーRAM(メモリマッパ)とは

 MSXのシステムにおいて、64キロバイトを超える容量に対応した管理システム「MMS(MemoryMapperSystem)」に接続されている大容量RAMのことです。

 MSX(Z80 CPU)は基本的に16ビットのアドレス空間、つまり64キロバイトまでのメモリ空間までしかアクセスすることができません。ROMでは「メガROM」の登場によって大容量ROMが利用可能となりましたが、RAMでは(特にMSX BASIC環境下では)インターフェースが無いためにこれと言った活用方法が未だに確立していません。MSX-DOS2のHドライブ(RAMディスク)として使うか、プログラムの自作によって直接スロットとマッパセグメントを操作するしかなく、必然的にプログラムが煩雑になりがちでした。

※MSX2以降に追加された CALL MEMINI によるRAMディスク機能(通称:MEMディスク)はメインRAMの32キロバイトを消費する機能であり、マッパーRAMのメインRAM以外の領域を消費するMSX-DOS2のRAMディスク機能とは違うものです。

 DMシステム2では、そうした手間を極力省いて誰もが簡単に広大なメモリをBASIC上で利用できるように、独自のインターフェイスを提供します。

  • 64キロバイトを超える「マッパーRAM(メモリマッパ)」へのアクセスを、BASIC上で利用できます。
  • 最大4096キロバイト(4メガバイト)の広大なメモリを、BASICプログラムから読み書きできます。
Takashi Kobayashi @nf_ban MSX-BASICのBLOADやCOPYなど画像関連の命令を一切使わず、メインRAMではなくマッパーRAM上に配置した画像データを画面に表示する、DMシステム2の謎プログラム
マッパーRAMアクセス機能のテストプログラム1
Download DSK(39KB)
Run RAMTEST.DSK on WebMSX

 マッパーRAMさえあればあとはDMシステム2をインストールするだけですぐにでも利用可能です。DOSのバージョンによるマッパ管理方式の違いはDMシステム2が吸収するため、ユーザーは面倒なことに気を取られずプログラミングに専念できるでしょう。

動作環境について

 何はなくともマッパーRAMの動作環境が必要です。

 マッパーRAMの仕様はMSX2の規格で制定されました。基本的にはRAMの容量が128キロバイト以上のMSX2以降の機種でマッパーRAMが利用可能となっています。MSX-DOS2(Disk BASIC ver.2)の動作条件として128キロバイト以上のRAMが必要となっているため、MSX-DOS2が動作する機種ではマッパーRAMにも対応している、と言えます。MSX turbo R(FS-A1ST・FS-A1GT)および1chipMSXなどの互換機は256キロバイト以上のマッパーRAMを標準で搭載しています。

 メインRAMが64キロバイト以下の機種(日本国内で流通していたほとんどのMSX1・MSX2・MSX2+)ではカートリッジによるRAMの増設が必要になります。

マッパーRAMの増設が可能になる主なカートリッジ

  • 日本語 MSX-DOS2(128キロバイト または 256キロバイト, アスキー製)
  • 増設RAMカートリッジ MEM-768(768キロバイト, アスキー製)
  • ナイスメモリ!うっかりくん(4096キロバイト, 似非職人工房製)
  • MegaFlashROM SCC+ SD(512キロバイト, MSX Cartridge Shop製)
  • Carnivore2(1024キロバイト, RBSC製)
  • その他各種カートリッジは https://www.msx.org/wiki/Category:RAM_Expansions に一覧があります
増設できるカートリッジの写真
【写真】MEM-768(上), ナイスメモリ!うっかりくん(左下), Carnivore2(右下)

 マッパーRAMを標準で搭載している機種でもカートリッジでRAMを増設することで、より広いメモリ空間を利用できるようになります。

※初代MSX(MSX1)の全盛期に各社から発売されていた8キロバイト・16キロバイト・64キロバイトの各種RAM増設カートリッジはメインRAMへの増設目的なためマッパーRAMに対応していません。

※初代MSX(MSX1)の規格は基本的にマッパーRAMに対応していません。MSX-DOS2上位互換OS「Nextor(ネクストル)」によってMSX1においてもマッパーRAMが利用可能とされていますが、DMシステム2の動作は不定となりますので予めご了承ください。

第2章 DMシステム2からの使用方法

DMシステム2で利用するマッパーRAMの領域を確保する

 利用したい分だけマッパーRAMを確保します。

CALL MALLOC(<確保するセグメント数>[,<確保できたセグメント数を返す変数>])
ex.) _MALLOC(4) ← マッパーRAMを4セグメント(64キロバイト)確保する
ex.) _MALLOC(4096,A) ← マッパーRAMを可能な限り確保し、確保できたセグメント数をAへ代入

 1セグメントは16KBで、原理上これより少ないメモリを確保することはできません。

 確保するセグメント数に 0 を指定すると、マッパーRAMの利用を終了します。既に確保されていたマッパーRAMの領域は開放されて以後利用不可になります。再び利用するには CALL MALLOC を再度実行してください。

 変数には実際に確保できたセグメント数が返ります。必要なメモリを十分に確保できなかった場合は、後述する方法でマッパーRAMを解放してください。

確保できたマッパーRAMのセグメント数を得る

 DMシステム2で実際に利用できるマッパーRAMのセグメント数を変数で返します。

CALL MALLOC(,<確保できたセグメント数を返す変数>)
ex.) _MALLOC(,A) ← 確保できたセグメント数を変数Aへ代入

 変数の値が 0 の場合は、マッパーRAMを確保できていません。必要なメモリを十分に確保できなかった場合は、後述する方法でマッパーRAMを解放してください。

マッパーRAMとのデータブロック転送

 確保したマッパーRAMにデータを転送したり、マッパーRAMに転送したデータを利用します。

 基本的にメインRAMおよびVRAMでのブロック転送と変わりありません。メインRAMの10000h以降にマッパーRAMが追加されていると考えると分かりやすいでしょう。マッパーRAMヘデータを転送するときは転送元のアドレスに、マッパーRAMからデータを読み出すときは転送先のアドレスにそれぞれ “@” を付けるとVRAMとの間でデータ転送ができます。

CALL BLOCK(転送元アドレス,転送先アドレス,長さ)
ex.) _BLOCK(&HC000,65536+0,4096) ←メインRAMの内容をマッパーRAMへ転送
ex.) _BLOCK(65536,@0,32768) ←マッパーRAMの内容をVRAMへ転送

 65536+<CALL MALLOCで確保したセグメント数>×l6384(バイト)を越えるアドレスを読み書きしようとすると“Out of memory”エラーになります。

Takashi Kobayashi @nf_ban SCREEN5の画像8枚をマッパーRAMへ退避しランダムに次々と画像を表示するDMシステム2のBASICプログラム(要RAM 512KB以上) openMSXのFDDランプが消えてる(=画面切替時にファイルアクセスしていない)ことにご注目。パレットがおかしく見えるけど切替が速いだけで正常です。
マッパーRAMアクセス機能のテストプログラム2
Download DSK(39KB)
Run RAMVRAM.DSK on WebMSX

※マッパーRAMからメインRAMへのデータ転送は、アドレスの指定だけでなくサイズの指定にも十分注意してください。DMシステム2本体やMSXシステム本体領域への意図しないデータ転送によりシステム暴走(フリーズ)のおそれがあります。

 現在、マッパーRAMに対応している命令は以上ですが、今後のバージョンアップの際に PEEK, PEEKW, PEEKS, POKE, POKEW, POKES, LOAD, SAVE なども順次対応する予定です。

マッパーRAMの確保領域を解放する

 使い終わったマッパーRAMを解放します。

CALL MALLOC(O)

 以後、マッパーRAMを使い続けることはできません。再び必要になった場合は確保からやり直してください。

 再確保されたマッパーRAMの内容は不定です。まれに以前転送した内容が残っていることがありますが、これを期待してプログラムを作成してはいけません。

※CALL SYSONを実行した際にも解放されます。

第3章 補足

他のソフトとの共存と互換性

 MSX-DOS2環境下でDMシステム2と他のDOS2専用ソフトを動かすのであれば、特に問題はありません。しかしDOS1環境下においてDMシステム2と他のソフトの両方からメモリマッパを利用した場合、マッパーRAMの管理で競合が起こり動作が不安定になるおそれがあります。DOS1環境でDMシステム2のメモリマッパ機能を利用する際はメモリマッパを使用する他のソフトは実行しないようにしてください。

 2010年代から普及が始まった「多機能カートリッジ」で採用されるMSX-DOS2上位互換OS「Nextor(ネクストル)」によるMSX1での動作、および関連アプリ「Sofarun」上での動作は不定です。

 各種エミュレータでの動作は実機での動作と異なる場合があります。予めご了承ください。

確保可能な最大セグメント数

 DMシステム2はマッパセグメントの割り付け状態を内部のテープルで管理しています。このテーブルの制約により、実際に搭載されているマッパーRAMのすべてをDMシステム2からは利用できない場合があります。

 MSX turbo RではメインRAMとして4セグメント(64キロバイト)のほかR800・DRAMモードの動作に6セグメント(96キロバイト)のマッパーRAMを消費したうえでDMシステム2が領域を確保します。R800・DRAMモードでDMシステム2をインストールした場合、システム稼働中にR800・ROMモードへ切り替えたとしてもDRAMモード実行時に消費した6セグメントをDMシステム2が確保することはできません。Z80モードでDMシステム2をインストールした場合は6セグメントを追加した状態で領域の確保が可能ですが、その後R800・DRAMモードに切り替えた場合の動作は保証しかねますのでご了承ください。

Takashi Kobayashi @nf_ban 普通のFS-A1ST(RAM 256kB)+DMシステム2でマッパーRAMを確保 写真①DOS2(Disk BASIC ver.2)で起動するとBASICフリーエリアがDOS1より広くてR800で速いけどマッパーRAMの容量はしょぼい 写真②DOS1(ver.1)ではDOS2よりBASICフリーエリアが減少してZ80で遅いけどマッパーRAMの容量はDOS2の2倍 痛し痒し!

DM拡張BASIC上の制限

 マッパーRAMアドレスは23ビットに制限されるため、一度に多くのマッパーRAMを確保してもすべてを利用できない場合があります。それ以上のメモリを扱いたければ、マシン語からコールエントリを使って複数に分けてマッパーRAMを確保してください。

マッパーRAM活用のアイデア

 マッパーRAMはこれまでのMSX BASIC環境下では考えられない広大なメモリ空間が広がりながらも、その活用法についてはあまり議論されて来ませんでした。

マッパーRAMの問題点と課題

  • マッパーRAMの仕様にそもそも不備があり、厳格なメモリ管理を行うには過大な開発工数が必要(いわゆる面倒臭い類の処理)だったために開発者にとって避けたい意思が働いていた
  • 日本国内の流通機種ではマッパーRAMの非搭載機種が圧倒的に多い(海外ではMSX2で128キロバイトを搭載することが標準的でしたが日本国内では64キロバイトに留まった)
  • マッパーRAMをハードウェアの標準機能として利用できない(あくまで便利オプション機能扱いの)ため、開発者にとってマッパーRAM対応の追加開発に魅力を感じにくい

マッパーRAM活用の提案

[Back]トップページへ