[今更誰得] CX5Fに拡張RAMを装着したのに認識しない? #MSX

MSXでいろいろ遊ぼうとすると、MSX BASICで何かするだけなら32KBのRAMがあれば何の問題もないわけですが、もう少しいろいろなことをしようとすると、やはり64KBのRAMが欲しくなります。

幸い、令和の現代においても同人ハード的な拡張RAMを作ってくれている方がいて、64KBの拡張RAMは比較的手に入りやすいです。

たとえば↓など 

raphnet. - MSX用RAM増設カートリッジ基板(64KB)
https://www.raphnet-tech.com/products/msx_64k_ram_expansion/index_ja.php

これをカートリッジスロットに挿せば、中の人のCX5Fも64KBというか、内蔵RAMと合わせれば96KBのRAMになりますね。ゴージャス構成ww

・・・とか思っていたのですが、話はそう簡単ではありません。

MSXのCPUはご存じZ80ですが、Z80が同時にアクセスできるアドレス空間は64KBまでなんですね。

※画像は、「MSX Datapack wiki化計画」さんより引用しています。


合計96KBのRAMがあっても、同時にアクセスできるのは64KB分のみということです。

まあ、96KBは要らないにしても、64KB分は使いたいのですが、拡張RAMを挿せばそのままその64KBがプライマリのメインメモリとして使われるのかと思えば、そうではありません。

MSXはブートすると、起動用のBIOSプログラム(0000H番地~にある)を実行しますが、そのブートシーケンスの中で、RAMのあるスロットを探しに行きます。

※「スロット」といってますが、ここでいうスロットはゲームソフトなどのカートリッジスロットだけを指しているのではなく、メモリ空間を切り替える単位です。

MSXの仕様ではRAMをどこのスロットに置くかは決められていないので、ブート時に探しに行くようになっているのですが、どういうルールで探すかというと、

  • スロット番号の若い番号から順に
  • ページ2にRAMが割り当てられているスロットがあればそこをメインRAMのスロットとして割り当てます(RAM32KB,64KBの機種の場合)
  • ページ2のRAMが見つからなければ、ページ3にRAMが割り当てられているスロットを探して、あればそこをメインRAMのスロットとして割り当てる(RAM8KB,16KBの機種の場合)
という仕掛けになっているようなのですね。

ちなみに一般的なMSXでは、メインRAMはどこに割り当てられているかというと、スロット3のことが多いようです。

上記のルールに基づけば、スロット3に内蔵RAMがあれば、その内蔵RAMがどんな容量であっても、カートリッジスロット1または2(内部スロット1と2)に32KB以上の拡張RAMがささっていれば、拡張RAMが優先的に認識されメインRAMのスロットとして割り当てられることになるのです。ちなみにRAM8KB、RAM16KBの機種(ページ3にしかRAMが実装されていない機種)では、RAMがどのスロットにあろうが何も考えなくても拡張RAMが認識されることになります。
 
典型的なMSXのスロット構成
(カートリッジスロット1に拡張RAM64KBを挿した場合)

もし、自分の機種がどうか確認したいときは、MSX BASICからスロットがどう割り当たっているかを以下のコマンドで調べることができます。

PRINT RIGHT$("00000000"+BIN$(INP(&HA8)),8)

上から2ビットずつが、それぞれ、ページ3、2、1、0に割り当てられたスロットを示しています。
 

※画像は、「MSX Datapack wiki化計画」さんより引用しています。

で、CX5Fはどうなっているかというと、スロット0にMAIN ROM(ページ0がBIOS、ページ1がBASICインタプリタ)と32KB RAM(ページ2と3に16KBずつのRAM)が両方実装されています。

CX5F/YIS503のスロット構成


なんでスロット3にRAMを置かなかったかなんですが、スロット3はCX5Fの場合、サイドスロットのカートリッジ用に割り当てられています。スロット1と2は通常のカートリッジスロットに割り当てているので、空いているのはスロット0だけ・・・ということでやむなくスロット0にRAMを置くことになったのではないかと思われます。

実際は、各スロットはさらに4つに拡張できるので、スロット3-0にメインRAM、スロット3-1にサイドスロットとかも可能なのだろうと思いますが、無駄に構造が複雑になりますから避けたんだろうと思います。

だったら、用途のよく分からないリアスロット(実際にはピンアサインはMSX標準カートリッジスロットと同じでオスメスが逆なだけ)は潰して、スロット2をサイドスロット用にすれば良かったんではないかと思うのですが・・・ちょっと謎ですね。やっぱり通常のカートリッジを2本挿す用途もありうると考慮したんでしょうかね。実際のところ、SFG-01と組み合わせるカートリッジは複数リリースされていますし、その専用ソフトで作った内容を保存するSRAMカートリッジみたいなものもあったようなので、さすがに標準カートリッジ1スロットというわけにはいかなかったんでしょうね。

それなら、それならですよ、リアスロットも普通のMSXカートリッジスロットにしておけばいいのになぜそうしなかったのかww 現実に、リアスロット専用のカートリッジがリリースされたような気配はなく、マニュアルにも、シングルカートリッジアダプタ(おそらく実体は50ピンメス-メスコネクタ)というオプションを介して通常のカートリッジを挿す用途が紹介されているのみですしww



取説で想定しているリアスロットの用途w
※画像はCX5Fのマニュアルより引用

 
つまり、上記のブート手順に基づけば、CX5Fでは拡張RAMを挿しても、スロット0にある32KB RAMが常にメインRAMとして認識されるので、拡張RAMをメインRAMとするには起動後にスロットの割り当てを切り替える必要があるわけです。
 
CX5F/YIS503では拡張RAMカートリッジを挿しても
常に内蔵RAMがメインRAMとして選択されてしまう


いや、だからそれがどうしたの?という話だと思うのですが・・・

それがですね、もともと、RAMを64KB内蔵している機種を前提に書かれたアプリケーションだと、これが不都合なケースがありまして。

RAM64KB内蔵が前提のアプリケーションであっても、ちゃんと律儀に各ページのRAMを探しに行ってくれれば問題ないのですが、プログラムの作りによっては、「64KB分のRAM(ページ0~3)がメインRAMと同じスロットにすべて実装されている」と決めつけて操作しようとする場合があります。(まあ標準的スロット構成なら間違いではないし、MSX2以降は最低でもRAMは64KB実装される仕様なので、問題は起きない)

そういうアプリでは、ページ3や2に割り当たっているスロット番号を見て、ページ0や1のスロット番号もそこと同じ番号に変更すれば、64KB分のRAMにアクセスできる、という作りになっていたりするわけです。

しかしながら、CX5Fの場合、上記にある通り、通常起動時には拡張RAMは無視されてスロット0のページ2と3がメインRAMとして割り当たっていますから、ページ0と1をメインRAMと同じスロット0とみなしてしまうと、そこはMAIN ROMなわけで、いくらアクセスしてもデータが書き込めるはずはありません。

たとえば、RAMが64KB必要とされるMSX-DOSを起動する際はどうかといえば、FDDのインターフェースカートリッジに内蔵されているROMのブートシーケンスではちゃんとページ0とページ1のRAMの所在もサーチしてくれているらしいので、一応、CX5Fのようなスロット構成でも大丈夫なようです(実機がないので未確認ですが、MSX Datapackなどにそう記載がある)。

まあ、そもそも素のCX5FでMSX-DOSを普通に使おうとすれば、メモリが足りないから拡張RAMが必要ですし、FDDがないのでインターフェースカートリッジも挿す必要があるということで、そもそも普通のカートリッジスロットが1個しかないCX5Fではスロットが足りなくて詰むという話なんですがww

というわけで非MSX-DOS環境で64KB RAM前提のアプリを使おうとすると、たまに面倒らしい・・・というお話でした。

で、こんな知識が何に活きるのかというと、実際にRAM64KB前提の非MSX-DOSアプリを動かす際に重要になってくるわけです。そのあたりの顛末はまた別のエントリでw

コメント