いまさらなんでMSX?
第2回
MSXの増設RAMにおける考察
web Ver 98.06.01
注意事項
この文章は2年ほど前にサークルの会誌のために書かれた文章です。
当時の知識で書かれていますのであちこちで過ちがあることが
わかっています。またweb化に際して図のほうも書いておりませんので
分かりづらい所が多いと思います。
なるべく早く修正したいと思いますので正式版はもう少々お待ちください。
1 MSXとメモリ
MSXのメインCPUはいわずと知れたZ80である。
このCPUはメモリ空間が64Kバイトという空間しかない。
確かにこのCPUが開発された1974年当時はこの空間でも十分に広かった。
現在でもこの空間を1バイトずつ埋めていくことを考えるとぞっとするぐらいの広さである。
しかし拡張性を考えるとこの空間は非常に狭いものであり、どうにかして空間を広げなければならない。
そこで考えられたのがメモリバンク方式である。
これはメモリ空間をいくつかに分け必要に応じてメモリを取り替えるという考え方である。
MSXにもこの考えは取り入れられた。
ただしMSXの場合メモリバンクとは言わずにスロットと言う。
このスロットの概念がMSXに最大1Mバイトのメモリ空間を与え、拡張性を高めているのである。
2 MSXのスロット
スロットは大量のアドレス空間を確保するためのインターフェイスの役目をしていて、MSXのアドレスバスに接続されるメモリやデバイス(FM音源やRS232Cなど)は、すべてスロットを介してつながっている。
これにはBASICのBIOSROMだろうとメインRAMであろうと例外はなく、ゲームカートリッジのROMもスロットでMSX本体とつながる。
MSXで言うスロットとはよく目にする(ゲーム)カートリッジを挿入する場所だけではない。
目には見えないが本体内に隠れている。
言葉で説明するのは非常に面倒なのだが、図1を御覧頂きたい。
MSXのスロットは基本的にはこうなっている。
図2−1がMSX1のスロットマップの1例である。
スロット#1、2はカートリッジ用のスロットで#1のほうにFM音源のFMBIOS−ROMがある。
MSXのすべてのメモリ(ROMとRAM)がスロットを介して繋がっているのがわかる。
さらにMSXはZ80の64Kバイトのアドレス空間を16Kバイトずつ4つの「ページ」にわけており、必要に応じてページを切り替えて様々なプログラムを実行しているのである。
例えばBASIC上(図2−2)でFMBIOSを使いたくなったらページ2を切り替えてFMBIOSをZ80の実アドレス空間に呼び出す(図2−3)。
3 2種類のスロット
さて図3ではスロットがさらに拡張されている例である。
MSXのスロットには「基本スロット」と「拡張スロット」の2種類がある。
基本スロットはCPUのアドレスバスに直結するスロットを指し、MSXの使用では最大4個持つことができる。
またその基本スロットはスロット拡張ボックスなどで1つの基本スロットが4つにまで拡張できる。
そのスロットを拡張スロットという。
4つの基本スロットをそれぞれ4つの拡張スロットに拡張したとき、スロットは最大の16個となり16スロット×64kバイト=1Mバイトのメモリ空間をアクセスできる。
図4−1のMSXturboR(GT)の基本的なスロットマップである。
現在筆者は図4−2のようにSCSIや増設RAM(これが本題ね)をつなげているが、まだあとSCC音源、ゲーム用SRAM(冒険の書だね)、将来的にRS−232Cもつないでみようと考えているが、今のままではスロットが足りない。
そこでまだ拡張されていないスロット#1や#2を拡張しようとなる訳である。
ただし筆者は拡張スロットを買ったり作ったりする余裕がない(回路図はあるから作ろうと思えば作れるが)ので、手軽にできる#0−1、#0−3の拡張改造をする予定である。
4 大容量メモリ
ところで図4−2の#3−0や#1にRAMがつながっているが、1スロットの最大容量は64Kバイトなので全体でこのシステムは64K+64K=128KのRAMしか積んでないようにみえる。
しかしMSXにはスロットとは別にRAM専用の拡張仕様である「メモリマッパー」という規格がありMSXシステム全体で最大4MバイトのRAMをシステム(MSXDOS2)でサポートしている。
MSXはZ80の64Kバイトのアドレス空間を16Kバイトずつ4つの「ページ」に分けているのだが、このメモリマッパーでは大容量RAMを16Kバイトごとに最大256個(256セグメント)にわけて(この作業もシステムが勝手に行う)管理していて、それは16K×256セグメント=4Mバイトである。
そしてさらに好きなページ(ページ3だけは不可)に好きなRAMを置くことができるのである。
現在#3−0には本体内蔵のプライマリRAM512Kバイトが#1に増設RAMが1Mバイトあり、MSXシステムは基本的には内蔵RAMと増設RAMの区別はないのでメインRAM1536Kバイトとなる。
5 メモリマッパー対応拡張RAM
マッパーRAMはMSXのI/O空間のFCh〜FFh(これはマッパーセグメントレジスタと呼ばれる)に出力されるセグメントNoで切り替えられる(図5参照)。
実際には直接I/OをいじるのはMSXでは基本的には禁止されていて、さらにメモリマッパー用のBIOSが用意されているのでI/Oを直接利用することはない。
さて図4−2のスロット#1の1Mバイト増設RAMは筆者の自作のRAMカートリッジである。
回路図は図6−1であり、材料は表1の通りである。
今後はこの回路について書いていきたい。
この回路の主な目的はI/OにセグメントNoが出力されたときにRAMを切り替えることである。
つまり追加アドレス情報を製作するのが重要なのである。
今回は1Mバイトなので追加アドレス情報はMA14〜MA20が必要である。
マッパーRAMを作成するときは、I/OのFCh〜FFhが選択さてれいて(1)そのときの出力された(2)データによって(3)RAMを切り替えればよい(4)ことになる。
6 回路の解説
NANDゲートである74LS30(以下30)は、アドレスバスのA7〜A2がHレベルのときのみ出力がLレベルになる。
これはつまりアドレスバスがマッパーセグメントレジスタ、すなわちI/OのFCh〜FFh(11111100b〜11111111b)が選択されたのを確認するために用いられるのである。
これが(1)に相当する。
74LS139(以下139)の半分で/IORQ(I/Oリクエスト)、/WR(ライトタイミング信号)がHレベルの時Lレベルを出力する。
つまり先ほどのアドレスバスがI/O空間を指し示していて、なおかつ、データバスにデータを出力している時にLレベルになるのである。
これが(2)に相当する。
その出力先に接続されている74LS670(以下670)は4×4ファイルレジスタと呼ばれている。
4ビットのレジスターが4組入っていて、書き込みアドレスと読み込みアドレスが別々に指定できるというものであり、今回のこの回路が非常にシンプルなのはこのICによるところが大きい。
さてこの670のGWに先ほどの139の出力がつながっている。
これはGWがLレベルの時に670の内部レジスタへの書き込みを許可することになる。
670のレジスタへの書き込みには、FCh〜FFhの4バイト分、つまりアドレスバスの下位2ビットのA0〜A1のみに対応させればよい。
これは上位の6ビットはメモリ選択のときは不変だからである。
またこのデータは670の内部に記録される。
これは後に使うこととなる。
よってアドレスバスのA0〜A1が670のWA、WBに接続されている。
この出力が追加アドレス情報となる。
U1の方にはデータバスの下位4ビットが入力され、追加アドレス情報のMA14〜MA17が出力される。
またQU2の方はデータバスの上位4ビットが入力され、MA18〜MA21が出力される。
このデータバスにはセグメントNoが出力されており、例えばページ1にセグメントNo82のセグメントが指定されたとき、追加アドレス情報MA21〜MA14には01001000bが出力され、今後ページ0のRAMを読み書きするときは01001000??????????????bの総合アドレスが参照されることになる。
これが(3)にあたる動作である。
なおGRはプルダウンされているが、670からデータの出力(データ読み出し)をする必要が常にあるからであり問題はない。
RA、RBにアドレスバスのA14、A15がつながっているのはさきほどのA0〜A1の記録したデータをそこに出力するためである。
これはA0〜A1のから出力されたデータはそのままアドレスバスの最上位2ビットと対応しているためである。
マッパーセグメントI/O、FCh〜FFhはそれぞれMSXのメモリの0000h〜3FFFh,4000h〜7FFFh、8000h〜BFFFh、C000h〜FFFFhのページ0からページ3にそれぞれ対応していてる。
このI/Oの下位2ビットとメモリの上位2ビットがちょうどぴったり合う。
データをRAMに書き込みのときはマッパーセグメントを参照して書き込み、読み込むときマッパーセグメントに対応したメモリアドレスに読み込むためにこのようになる。
さて今回使用している疑似SRAMの容量は1つ512Kバイトである。
512Kバイト以上の総合アドレスが指定されたときは対応できない。
そのため512KバイトRAM2つを使うときは、MA19がLレベルかつMA20がレベルのときにはU1のRAM、MA19がHレベルMA19がLレベルのときU2のRAMが選択されるようでなくてはならない。
それを制御するのが139(の半分)である。
これは/SLTSL(スロットセレクト信号)がLレベルのときつまりはこの増設RAMが接続されているスロットが選択されているときに動作し、入力であるMA19、MA20の状態によって4ビット出力の1つだけが選択される。
その内の2つ/Y1、/Y2がそれぞれU1、U2の/CE(チップセレクト信号)につながっているのである。
このように(4)は行われる。
マッパーRAM規格としてのRAMの選択の仕方は以上であるが、疑似SRAMにはSRAMであってSRAMにあらず。
DRAMのようなリフレッシュが必要なのである。
リフレッシュするときは/RFSH(リフレッシュ信号)、/MERQ(メモリリクエスト信号)が共にLレベル、かつRAMのアドレスが確定されていないときに/OE/RFSH端子にLレベルを出力する。
ちなみにこのRAMにデータを書き込むときは、アドレスバスが確定した後にデータバスにデータを確定させ、/CEをLレベルにしてから/WEをLレベルにすればよく、また、読み込むときはアドレスバスが確定した後に/CEが確定させ(つまり139のY0〜Y1がLレベルになったとき)その後に/OE/RFSHをLレベルにすればよい。
これらのタイミングはCPUが勝手にやっているのメモリアクセスのタイミングが満たしてくれる条件なので気にしなくてよい。
7 おまけ
1Mバイトにあきたらず4Mバイト拡張RAMを作るんだ!というなら、図6−1の139の辺りを図6−2のように変えればよい。
ただし疑似SRAMが8個必要なことと32や08の回路もそのRAMも数だけ必要であるが。
またそのときにはMSXのファインインを考慮する必要がある。
さて、ここまで書いてとんでもないことに気付いた。
MSXのRAMはシステム全体で4Mバイトだと思い込んでいたのだが、それはDOS2のサポートするRAMディスクの上限であって、システムRAMの上限ではないのだ。
簡単に書くと1スロットごとに4バイト分のマッパーセグメントレジスタがあり、それはずべての基本、拡張スロットに存在しているので、1スロットのRAMの上限が4Mバイトなだけであったのだ。
MSXの基本的にあいているスロット#1、2をそれぞれ拡張して8スロットにしてかつその8スロットにすべて4MバイトRAMをつなげることも可能である訳だ。
その場合総RAM容量は4Mバイト×8スロット=32Mバイト(!)。
本体を改造すればあと2つ拡張スロットが作れるからMSXは本当は最大で40Mバイト(!!)も実装出来ることになる。
そんなにRAMをつんでも全く意味はないのだが(笑)
ということは同様に考えてMSXは最大16スロットまで増設出来るから、4Mバイト*16スロット=64Mバイトもつなげることができる。
これはMSX1からのシステムであるから、1983年当時からからMSXは98すら考えてなかった64Mバイトという広大な領域を示唆していたことになる。
エミリア:すごく難しいお話だったね。
デイヴ :全然わかんないや。
じーさん:こんなのわからんでよいぞ(わしにだってわからんわい)。
エ:でもMSXに64MバイトもRAMつけれるってなんかすごいね。
デ:ウインドウズ95も16Mバイトあれば快適だっていうしね。
じ:わしらの創造主はそんなにRAMをつけてどうしようっていうのじゃろうなぁ。
全く分からんわい。
エ:最近SCSIカートリッジ作った所から4MRAMカ−トリッジの回路が発表になったらしいわよ
デ:やっぱり作るかなぁ。
なんか超高速RS232Cも発表になったとかとも聞いているからそれもつくるらしいし。
じ:またMSXの拡張機器が増えていくんじゃのう。
まったくやれやれじゃわい。
あてにならない(?)次回予告
コナミの驚異のウェーブ音減LSI「SCC」を使ったSRAMディスク、通称似非SCCディスクの作成をやろうかなっと思っていたりして。
前のページにもどる
タイトルにもどる