にがMSX

〜最強のFS-A1FX を造る メモリ増設完結編〜


Panasonic MSX2+

FS-A1FX (2号機)

 

WSXのガワを纏ったA1FX2号機(LED交換済み) 

※ こちらのページから入った方は前編からどうぞ

 パナFS-A1FXをベースに最強のMSX2+を目指すシリーズ。第4回目はメモリ増設の完結編。前回4MBに増設したメモリを、本体内部の未使用スロット信号を利用して究極の16MBに拡張する。

実は、前回4MBに改造した機体はA1FXの2号機で、もともとアルカリ電池の液漏れでパターンが損傷していた基板を修復したものだ。1号機と同様にFM音源増設、3倍速、ROM増設なども行っている。なお、1号機はメモリ1MB化のままイケメン筐体に納めて改造終了にした。

2号機のガワは、はにはに氏からの頂き物のA1WSX(部品取り機の残骸)を利用。キーボードはWSXとSTのキートップを2個イチして程度の良いものを組み合わせた。まさにジャンク部品の寄せ集めで構成されており、ガワの塗装が剥がれているが、いずれ再塗装する予定なので問題なし。


メモリ4MBの壁に挑戦

 MSXのメモリは1スロットあたり4MBが限界であり、今回の機体は内部スロット#30に4MB増設済み。さらなる増設には別スロットにマッパーメモリを用意すれば良いわけだが、マッパーレジスタはIOデバイスなのでスロットには依存せず、複数のスロットで共有することができる。これを利用して比較的簡単に4MB超えができるのではないかと考えた。

A1FXは、MSX ENGINE II T9769により内部でスロット0とスロット3が拡張されている。A1WXではスロット#02にFMBIOSが割り当てられているが、改造FXでは内蔵ソフト(スロット#33)と排他的にFMBIOSを割り当てているのでスロット#01,#02,#03の3つのスロットが未使用のままだ。これらにすべてRAMを搭載すると合計16MBのメモリを実装することも可能だろう。ということで、最終目標は16MB化とした。

手始めにスロット#03に4MB追加して、8MB化ができるかどうか試してみることにした。手法として元の4MBに亀の子しても良いのだが、不具合のあったときの対処がしやすいように実装場所を変更した。ワイヤーの数が多くてそこそこ面倒…。

並列接続

DRAMは4MB化の時と同じSIMMから剥がした5117405を亀の子して実装。とりあえず4本のデータ線以外を親亀小亀で接続して、/CAS信号以外をスロット#30に実装したDRAMと並列に接続してみた。スロット#03用の/CAS信号はは別途生成する。(実はこれだと8MB認識しない:理由は後述)

/CAS信号の生成

DRAMをスロット#03に割り当てるためには、当該のスロットセレクト信号/SLT03がアクティブな時にのみ/CASをアクティブにするように組めばよい。S1985(MSX SYSTTEM II)搭載機ならば42pにベタな(スロットに依存しない)/CAS信号が出ているので使えるが、T9769(MSX ENGINE II)は外部にこれを出力していない。

例によってS1985のデータシートのタイミングチャートを参照すると、/CAS信号のタイミングについては、MPXが立ち上がった後に遅延させて立ち下げ、/RFSHがアクティブになるタイミングで立ち上げれば良さそうだ。

いつものように74HC74を利用して、MPXの立ち上がった後のクロックの立下りでアクティブにし、/RFSHに同期させて立ち上げるように/CASを生成。これを74HC32/SLT01-03信号とORを取って各スロット用の/CAS01-03を生成することにした。

とりあえずDRAMの/CAS/CAS03を繋いで起動してみたが8MBとして認識せず。回路を追いかけてみると、どうもスロット#30のDRAMの/OE/WEには、ゲートアレイで生成した/MRD(2p)/MWR(1p)が繋がっており、これがスロット#03が選択されているときにはアクティブにならないことが原因のようだった。

起動

 過去のマッパメモリの作成事例を参照すると、DRAMの/OE/WEには、Z80CPU/RD/WRを接続しても問題ないようだ。スロット#03のDRAMにはT9769/RD(93p)/WR(92p)を接続しなおして起動したところ、8192kBで認識した。この時点では2号機のS端子は増設しておらず、コンポジットビデオ接続なので画面は汚い。

メモリチェック

例によって藤本さんのメモリチェッカーMEMTEST.COMでテスト。特に問題なく256セグメントの読み書きOKであった。アドレス線と/RAS信号はスロット#30のDRAMと並列なので、リフレッシュは/RAS onlyですべてのDRAMで同時に行われ、PAUSE機能にも完全対応している

プライマリRAM問題

 SLOT.BASで表示させたスロットマップがこちら。このソフトはMファン1994年12月号「おもちゃのマシン語」に収録されていたものと判明。このソフトではRAMはページ0,1しか調べておらず、BASIC起動時のページ2,3のスロットをプライマリRAMとして認識する。表示結果を見ると、新たに増設したスロット#03のメモリをプライマリRAMとして、元から載っているスロット#30のメモリはセカンダリとして認識している模様。実はこのスロット構成が原因で後に不具合が発覚する

 「プライマリRAM」とはページ3にワークエリアを置いているRAMということのよう。ターボRはプライマリRAMがスロット#30に固定されているが、2+以前の機種では「最大容量のRAMがプライマリになる」というのが通説らしい。「最大容量」といってもシステムがマッパーメモリに対応しているかどうかで解釈が変わってくるし、複数スロットに同じ容量で搭載した場合はどちらがプライマリになるのか…という疑問もある。テクハンやテクガイを調べてみたがこれについての記述は見つけられなかった。

発覚した不具合は、8MB化の状態でコンパイルのゲーム(アレスタ2など)が起動しなくなるというもの。OKEIさんの解析によると、このゲームはスロット検索にバグがあるようで、プライマリRAMより若いスロットにRAMがあると暴走するらしい。試しにスロット#30にRAMのあるノーマルなマシンのスロット1にメモリカートリッジ(MFP 2MB)を差し込んでみたが、やはり起動しなかった。外付けRAMならば取り外せば済む問題だが、内蔵の場合はそうもいかないので何らかの対策は必要だろう。元々はソフトのバグなのでソフトにパッチを当てるのが「正しい解決法」なのだろうが、アレスタ2以外のソフトにも同様のバグがあるようで(例:ディスクステーション#0)、いちいち解析してパッチで対応するのも面倒。プライマリが#30固定のターボRに外付けメモリを差し込んでもアレスタ2は起動できることから、ROMを書き換えてプライマリRAMをスロット#30に固定できれば問題が解決するのではないかと考えた。

起動シークエンス

 MSX2+のシステムROMを逆アセンブルして解析した結果、まずMAIN ROMの0416hからマッパーレジスタの初期化が行われ、直後にスロット拡張の有無をチェックしながらページ2のRAMを検索していることが分かった。ここではマッパーセグメントの検索は行われず、1ページ16kBまでの容量しかチェックしない(一応8kBのRAMも認識するが、MSX1の名残か?)。スロットは前から後ろに向けてスキャンされ、最初に見つかった最大容量(16kB)のRAMがページ2のRAMとしてシステムに認識される。その後ページ3についても同様のスキャンが行われ、プライマリRAMのスロットが決定され、ワークエリアの初期化ルーチン(7B61h)へ飛んでいる。

BASICではこのままページ0,1をMAIN ROM、ページ2,3をRAMとして起動するが、DISK-ROM(DOS1)が存在する場合はさらにページ0,1のRAMのスキャンも行われ、すべてのページをRAMに切り替えてMSX-DOSを起動する。DOS2カーネルが存在する場合はマッパーセグメントを検索し、改めて最大容量のRAMをプライマリとしてワークエリアのスロットを切り替えるようになっているらしい。

よって、BASICやDOS1環境では複数のスロットにマッパーRAMが存在する場合、マッパー容量の大小に関わらず若いスロットのRAMがプライマリRAMになるが、DOS2ではマッパー容量の大きいものがプライマリになる。実際に、A1FXに4MB内蔵した状態で、スロット1に2MBの外付けメモリを挿した状態だと、DOS1でプライマリRAMは容量の少ないスロット1の2MBのほうになっていたが、DOS2では容量の大きな内蔵メモリがプライマリになっていた。

システムROMの書き換え箇所

MAIN ROM
アドレス 書き換え前 書き換え後
0467h 93h 37h
04CCh 93h 37h

DISK ROM
アドレス 書き換え前 書き換え後
59BCh 38h,03h 3Eh,83h
59C6h 38h,03h 3Eh,83h

 パッチワークのエキスパートであるOKEIさんの協力をいただき、以上のようにROMパッチを当てればDOS1でのプライマリRAMをスロット#30に固定できることが実証された。アドレスはMSXシステム上での実アドレスで表記している。

MAIN ROMの書き換えによりページ2,3のRAMは一番後ろに見つかった(スロット番号の大きな)RAMになり、事実上スロット#30に固定される。DISK ROMのパッチはページ0,1のRAMを強制的にスロット#30(83h)に固定するもの。DISK ROMは難解なので、OKEIさんの協力がなかったら諦めていたかもしれない。OKEIさんに感謝!

なお、システムROMの書き換えテストは1chipMSX上で行った。1chipMSXは、フォーマットしたばかりのSDカードにESE-16J.SYSというファイル名で、先頭からDISK-ROM(64kB)+MAIN-ROM(32kB)+SUB-ROM(16kB)+FMBIOS(16kB)の順番で結合した128kBのファイルをセーブして起動すると、これをシステムROMとして認識するという隠し(?)機能があり、これを利用した(OKEIさん情報)。

システムROM HACK回路図

クリックで実寸表示

 書き換えたシステムROMはEP-ROMに焼いて実装しなければならない。今回はMAIN ROMDISK ROMの両方の書き換えであり、同時にFMBIOSも載せなければならないため、元々のシステムROMの漢字ROM以外の領域をゴッソリと入れ替えるような回路に変更した。

HACK-ROMFMBIOSの有効無効は内蔵ソフトスイッチに連動させており、ROM書き変えによりなんらかの不具合が合った場合でも元に戻すことは可能。しかし、内蔵ソフトスイッチONでオリジナルROM(FMBIOSなし)にするとPSG版のアレスタ2が起動できなくなってしまうので、これを回避するためにはスロット#0xのRAMの有効無効も内蔵ソフトスイッチに連動させる必要もあり

回路的には、A17とROMの/CSを監視してマスクROMとEP-ROMを切り替えているだけなのでもっと簡単にできるが、既に配線している石を行かすためにあえてこのような回路になっている。

EP-ROMの差し替え

 以前の改造ではFMBIOS用の28pのEP-ROMを使っていたが、今回は1Mbitの27C1001なので32pとなり、若干のピンアサインの相違あり。配線の変更を行いソケットに実装した。ロジックIC周りも回路図どおりに変更。

これにて8MB化の状態でもアレスタ2の起動ができるようになったここまできたら16MBまでやるしかない!


16MB化の回路図

クリックで実寸表示

/CAS01-03の生成回路と、内蔵ソフトスイッチ連動の仕組みを取り込んで、最終的に16MB化の回路図はこうなった。内蔵ソフトスイッチONでスロット#30の4096kBメモリのみで起動する。見た感じ7474のフリップフロップだらけになってしまたが、リフレッシュカウンタに74393とか使うと少しスッキリするかも知れない(石の数は変わらないが)。

ロジックIC10個と、DRAM8個のかなり「面倒」な回路なので、これを見てイチから配線するには相当の気合が必要になりそう…。

DRAMの実装

最終的にDRAMは4段亀の子が2つになった。手前のDRAMはキーボードに干渉しないギリギリの高さとなっているのでこれ以上は無理(この位置だとネジ1個が干渉したので外した)。配線数をなるべく減らすため、8MB化で増設した奥の下2つのDRAMのデータ線は手前のものと上下逆配列に変更。その上に/CAS以外を接続した孫亀、曾孫亀を実装した。手前のDRAMにも同様に孫亀、曾孫亀するが、こちらは/CASのほかに/OE/WEも親亀小亀から切り離して実装した。

手前増設分の/OE/WEは奥の亀と接続し、ペアになる2つのDRAMの/CASをまとめて、生成した/CAS01,/CAS02に接続した。ほとんど亀の子でいけるので作業自体は意外とラク。

最初から16MBを目指すのなら、データ線上位4ビットx4個と下位4ビットx4個で亀の子したほうが実装はラクだと思う。/WE/OEスロット#0xと#30で分けないとならないが。

/CAS01-03 生成回路

実装した/CAS01-03の生成回路がこちら。/SLT01-03T976934-36pから取り出すが、34p,35pはピッチが細かいのでそれなりの半田テクが必要。20Wの先細の半田ごては必須と思う。このピッチでも隣り合う3本程度はジュンフロン線で配線できる。


起動

 起動画面がこちら。なんとなくこの画面が出るまでのメモリチェック時間が長くなったような気がする。S端子を増設したので映像が綺麗になった。この画面が見たかったために改造したようなものなので、これだけで妙に達成感があったりする。実際MSXに16MBメモリがあっても使い道が思いつかない…。

ちなみにMSX2+の起動時のメモリチェックはSUB-ROM (0627h〜)で行っており、以下の手順でマッパー容量を認識している。

1 すべてのセグメントの先頭にAAhを書き込む
2 セグメント0からチェック開始
3 先頭にAAhが読めるか確認し、読めなければチェック終了
4 セグメント先頭に55hを上書きする
5 再度読み出して55hが読めればセグメントを1進めて3に戻る

例えば64kB=セグメント0〜3のRAMの場合、存在しないセグメント4〜7、8〜B、C〜F…は同一内容が現れ、単純な読み書きチェックでは容量を正しく認識できない。以上の方法でチェックすることで、一番最後のセグメント3の先頭に55hを書き込んだ時点ですべてのセグメントの先頭が55hとなり、以後AAhが読めなくなるので、存在するセグメントが3までと分かる仕組み。これをすべてのマッパーRAMが存在するスロットに対して行って、合計メモリを計算している。

スロットマップ

16MBの状態ではHACK-ROMが有効になっているので、DOS1カーネルによるDISK BASICが起動した状態ではプライマリRAMのスロットは#30になり、#01-03はセカンダリになっている。スロット#0xのRAMのページ2は認識していないが、SLOT.BASの仕様なので問題ない。もちろんMEMTEST.COMMEMCHK.COM(ろけっとましんさん作)でのテストも問題なし。

なお、内蔵ソフトスイッチON起動で、実際にスロット#0xのRAMと#33のFMBIOSは無効になった。よっていずれの状態でもアレスタ2の起動は問題なし。

これですべての内部スロットは埋まり、これ以上の内部拡張はできなくなった(IOデバイスを除く)。MSX2+の内蔵メモリとしては限界といっていいかも(DOSやFMBIOSを無効にすればあと2スロット行けるけど実用性が犠牲になる)。


DOS2起動

 MEGA-SCSIにインストールしたMSX-DOS2を起動してシステムインフォメーション表示プログラム「SYSI.COM(みかせんさん作)」を実行した結果がこちら。メモリのスロット表記が16進数になっているが読み替えると SLOT:84H=#0-1 SLOT:83H=#3-0 SLOT:8CH=#0-3 SLOT:88H=#0-2 となり、プライマリRAMをスロット#01として4つのスロットにメモリを認識している。DOS2のマッパーサポートルーチンでカウントできるセグメント数の上限が255であるためこの表示で正常(物理メモリが256セグメントあっても16kBは使用されない)。やはりDOS2カーネルを使うとプライマリが若いスロットに変更されてしまうようだが、特に不具合なく動作するのでこれ以上の改造はしないつもり。

 なお、ターボRDOS2カーネルは仕様に従いプライマリRAMを#30に固定にしているらしい。一方、カートリッジ版のDOS2はマッパー容量の大きなRAMをプライマリにするようにできている。似非RAMMEGA-SCSIターボRのカーネルをインストールした場合はカートリッジ版DOS2と同じ挙動をするようにMGINST.COM(つじかわさん作)によりパッチが当てられる。そのため接続されたMSXがターボR以外の場合、プライマリRAMが若いスロットに変更される。

一応将来必要になるかも知れないので、メモとしてOKEIさんに教えて頂いたDOS2でプライマリを#30にする呪文を書いておく。「DISK-ROMの71A4h, 71F1hの18h,16hをB7h,28hに書き換える

謝辞

 今回、MSXユーザーの各位の協力により究極のメモリ内部増設を実現できました。システムROM解析に協力していただいたOKEIさん、FX本体その他を提供してくださったはにはにさん、諸々のアドバイスをいただいたBABAXさん、れふてぃさん、ありがとうございました。お約束ですが、この記事を見て改造などを行い故障やその他問題が発生しても責任は負えません。各自の責任において情報を広く集めて行うことをおすすめします。


ご意見、ご感想、ご質問はにがBBSまで!

Top pageへ戻る

copyright (C) 2015 Niga