にがMSX

〜最強のFS-A1FX を造る 後編〜


Panasonic MSX2+

FS-A1FX

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

前回は、メモリ512kB増設、S端子増設、FM音源、FMBIOSの増設、べーしっ君ぷらすの内蔵までの改造を施した松下FS-A1FX

後編ではメモリ1024kBの拡張と、クロック3倍速改造、VRAM192kB増設を行う。


メモリ512kBの壁に挑戦

パナMSX2+のメモリ造設といえば、T9769内蔵のマッパーレジスタを利用した256kBまたは512kB改造が一般的であるが、それ以上の拡張の事例がないかというとそうでもなく、以前にヤフオクで1MB化された機体が出品されていたのを見たことがある(手法についての詳細は不明)。今回の機体では512kBのメモリ514800を2個使って改造しているので、メモリチップには1MBの容量があるが、半分の512KBしか活用していない。それも勿体ない話なので、1MB化に挑戦してみることにした。

まず、現状512kBのマッパーメモリは16kBx32個のセグメントを持っている。T9769内蔵のマッパーレジスタはbit0-bit4の合計5ビットとなるが、外部で1ビット拡張できれば倍の16kBx64個=1MBのセグメントを管理することができるはず。

 マッパーレジスタとして定番の74LS670を使って、1ビット拡張させる回路図を書いてみた。マッパーレジスタはIOのFCh-FFhに存在しており、今回はbit5を拡張することになる。IO監視のロジックは後で拡張する3倍速ウェイト回路のことを考えて亀の子接続しやすく配線を引き回している。

514800A9RROWアドレスのみ有効なので、マルチプレクス化は不要。生成したマッパーアドレスMA9RをそのままDRAMのA9Rとして接続しても問題ないだろうと考えた。

マッパーレジスタの拡張

マッパーアドレスの生成のためには、CPUのアドレスバス、データバスなどの信号が必要となるが、信号はスロットから取るのが簡単。後に3倍速改造のときにICを亀の子する予定もあり、スペースに余裕がある場所に実装した。たった1ビットの拡張だが、配線数はバカにならない。

メモリチェック

 起動時のメモリチェックでは、1024kB認識され、藤本さんのMEMTEST.COM(1MBメモリカートリッジ製作記事に同梱)でも特にメモリエラーがなく、一見成功に見えたのだが、動作が不安定で突然暴走したりする。どうもこのシステムではDRAMリフレッシュをRAS Onlyでやってるらしく、正しくリフレッシュが行われていなかった模様。

藤本さんのメモリーチェッカーは付属ドキュメントによると正常にメモリの読み書きができるか、ある程度の時間でデータ化けが発生しないかをチェックするとのことだが、今回使用した514800は10秒程度リフレッシュしなくてもデータが化けないようで、リフレッシュ回路の不具合を検出できなかったようだ。

リフレッシュカウンタの拡張

Z80 CPUでは、CPU内部のリフレッシュカウンタによるRAS Onlyリフレッシュをサポートしているが、Z80内蔵リフレッシュカウンタアドレスはA6までの7ビットしかなく、16kBのメモリ空間しかサポートしていない。それ以上のDRAMを積む場合、リフレッシュカウンタを増設する必要があるが、T9769ではこれをA8まで拡張しているようだ。今回は更にA9まで拡張する必要がある。

ネットでZ80におけるDRAMリフレッシュのことを調べているうちに、昔Z80コンピュータを自作した方のサイトを発見。ここに今回の回路でほぼそのまま使えるリフレッシュカウンタ拡張回路が掲載されていたので、信号名を書き換えて上の回路図を起こしてみた。

動作としては、/RFSHがアクティブの時の/MREQの立ち上がりをリフレッシュ終了とみなし、この時のA8をリフレッシュカウンタの値RA8としてHC74に記憶させ、RA8が1週して次に立ち上がったタイミングで拡張リフレッシュアドレスRA9Rを反転させる仕組みで生成している。また、HC00を使い、通常はマッパーアドレスMA9RをDRAMに与え、/RFSHがアクティブのときには、リフレッシュアドレスRA9RをDRAMに与えるように切り替えている。

その結果、通常の使用では暴走しなくなり、今度は成功と思っていたのだが、ゲームでPAUSEした後復帰しようとしたら暴走してしまった。

PAUSE対策

PAUSE時のデータ化け対策について、過去のメモリ造設の事例を調べてみたところ、藤本さんのMSX2メモリ512kB造設記事に答えがあった。どうやらPAUSE中は、DRAMのリフレッシュに必要なMREQ信号や/RFSH信号が使えないらしい。とはいえ、DRAMを使っている以上はリフレッシュは必要なわけで、PAUSE中はCPUとは別の仕組みでリフレッシュをしていることになる。

PAUSE中はCPUの/BUSACKがアクティブになりバスが解放されるため、その間DRAMの読み書きはされず、ひたすらリフレッシュのみ行っているものと考えられる。

RAS Onlyリフレッシュ動作のタイミングチャート(左図)を参照すると、システムはリフレッシュアドレスを確定させた後に、/RASを立ち下げリフレッシュを行い、/RAS信号を立ち上げてリフレッシュカウンタを進める動作を繰り返していると考えられる。

よって/BUSACK信号がアクティブなときはリフレッシュアドレスRA8更新のトリガを/RASの立ち上がり時に変更、同時にDRAMのA9RにはリフレッシュアドレスRA9Rを与えるようにした。

以上の回路図の通りロジックを追加したところ、PAUSEを行っても暴走しなくなった。

1MB化の回路図

クリックで実寸表示

最終的に1MB化の回路図を1枚にまとめるとこのようになった。

余談だが、DRAMのリフレッシュモードはDRAM内蔵のカウンタを使ったCBR(CAS before RAS)Hiddenモードで行うほうが回路は簡単になるはずだが、これらのモードはメモリのREADが発生しないPAUSE中のリフレッシュには対応が難しいと思われる。A1FXのシステムが、敢えてRAS OnlyでリフレッシュしているのはPAUSE対策が理由かも知れない。


3倍速クロックアップ

クリックで実寸表示

次は、つじかわさんの考案した3倍速クロックアップに着手する。概要は以前に作成した改造記事を参照していただくとして、今回は新たにWAIT回路をIOデバイス化して、クロック切り替えに連動させるようにした。

従来の3倍速改造では、内蔵ソフトスイッチでWAIT回路のon/offを手動で切り替え、似非RAMが起動時の内蔵ソフトスイッチの状態を読み取ってクロックを切り替える仕組みになっていた。具体的には内蔵ソフトスイッチ「入」で起動すればWAIT回路が有効になり、クロックが3倍速モードに切り替えられて内蔵ソフトをスキップしてDOS2が起動する(内蔵ソフトは実行キー立ち上げで起動可能)。しかし、A1FXの場合この仕組みが働かず、似非RAMを使っても内蔵ソフトのスキップができなかった

つじかわさんによると、似非RAMでは内蔵のルーチンでシステム起動時に機種がA1WX/WSX/FXかどうかを判別して、内蔵ソフトスイッチ「入」で実行キーが押されていない時には内蔵ソフトのバンクを起動しないように切り替えているとのこと。A1FXの内蔵ソフトはメガROMではない(32kB)のでバンク切り替えができず、スキップしないと考えられる。また、A1FXには実行キーがないので、内蔵ソフトのon/offを実行キーに関連付けさせることはできない。よってA1FXの場合、クロック切り替えはシステム起動後にDOSアプリケーション(拙作CCC.COMなど)で行い、WAIT回路はクロック切り替えに連動させるようにするべきだろう。

 過去にめらまんさんがIOの41hを監視して高速モードランプの増設を行っているが、その仕組みを利用してWAIT回路のon/offが自動的に切り替えるように回路図を起こしてみた。めらまんさん考案の回路と使用ロジックICは同じだが、メモリ1MB化で増設したICに亀の子しやすいように共通点を多くしている。74HC74は、FMBIOS ROM増設の際に使ったICの余ったゲートを活用し、74HC3274HC08に亀の子、74HC138は同じく74HC138に亀の子して、配線作業を省力化した。

 IOの41hのbit0のデータの書き換えがモード切替のトリガーとなるため、本来はIOREQ立ち上がりのタイミングでD0を読むべきで、74HC138Y1出力は反転させてCKに入れるべきなのだが、IOサイクルのタイミングチャートを見ると、IOREQ立下りでも問題ないようなので、/Y1CKは直接繋いでいる。実際に動作に支障はないようだ(めらまんさんの回路図でも同様)。

高速クロックに切り替え

回路図の下の方のクロック信号を入れ替えている部分がこちら。(C95)の上側とR124が繋がっている部分でパターンカットを行い、C96上側とR124下側をジャンパー線で繋いでいる。これで従来1.5倍速だった高速モードが3倍速になる。

なお、VDPCASXは、VRAMを192kB化する際に使用する信号(後述)。

WAIT回路の増設

WAIT発生回路の74LS123が右上のフィルムコンデンサ、金皮抵抗、ダイオードが付いているIC。SOPパッケージで薄いので、基板裏(パターン面)に貼り付けた。DIPだと厚みで裏側への貼り付けは難しいと思う。ある程度端子が剥き出しになるので、組み込み時にシールド板と接触してショートしたりないように配慮が必要。

M60014周囲の4つのSOPパッケージの石はメモリ1MB化で増設したロジックIC群(リフレッシュカウンタ関連)。WAIT発生のトリガを作る74LS139はDIPパッケージを使い、表のLS670(拡張マッパーレジスタ)に亀の子した。

これにて3倍速で動作するようになり、WAIT回路も自動で切り替わるようになった。起動時はWAITが無効になるため従来の改造のようにカクカクのMSXオープニングは見られなくなったが、不必要なWAITを発生させることも無くなったし、WAITスイッチを入れ忘れて表示が化けることもなくなった。1MB化したメモリも3倍速モードで問題なく動作している。


VRAM 192kB拡張

実用性はほとんど無いといわれ続けて20年、今回もやってしまったVRAM192kB増設。外して余った64kBのメモリーの廃棄場所として丁度良い。今回、IC12とIC14に亀の子したが、IC11とIC13でも構わない。/CAS(16p)以外を亀の子し、2つの/CASをワイヤーで接続して、VDPのCASXに繋げば完了。

例によってBASICで使えるページ数は変わらないのでイマイチ使い道がないが、これをバッファーメモリとして活用するアプリケーションが稀にあり、MIDIプレーヤーのMSPや、FDコピーツールのCOPYCATがさりげなく対応していたりする。BASICのROMを書き換えて使えるページ数を増やすとか考えられなくもないが…。


そして…

 A1FXのインジケータLEDは赤一色で面白みがないので、今時のLEDに変更してみたり。電源LEDは赤青の2色として、赤を電源LEDとして使用、青側は高速モードランプとして配線した。よって、高速モードになると赤と青が同時に点灯してピンクっぽい紫色に発色する。

画像上が、ノーマルモードでFDDアクセス中の様子。下が高速モードでCAPS、かなロックした上でPAUSEしたときのもの。PAUSEランプはイルミネーションフルカラーLEDを使ったので、PAUSE中にゆっくりと色が変わる。

ひとまず、これにて改造は完了。A1FXとしての「味」は残しつつも、ノーマルと比べて非常に使いやすい機体に仕上がった。ターボRに速度的には劣るものの、メモリはノーマルGTの倍量あり、3倍速でメモリアクセスも高速なため、体感速度的には近いところまで行っていると思う。DOS2での3倍速環境に慣れてしまうと、もうノーマルのMSX2+には戻れない感じ。中古市場ではSONY機よりいまひとつ人気がない松下機であるが、3倍速改造が可能なことは大きなアドバンテージだと思う。

いずれ筐体を赤く塗装して3倍速にふさわしい機体にしたいと思っているが、それはまたの機会に。

謝辞

 今回、大勢の(元)MSXユーザーの方の協力によりこの改造記事を書き上げることができました。ほぼ丸ごと1台のFX本体を提供してくださったはにはにさん、マザーボードその他を提供してくださったSyntax札幌MSXユーザーの集いのユーザーさん、YM2413を提供してくださった方、FMBIOSのEPROMを焼いてくださったMさん、3倍速改造情報を提供してくださったつじかわさん、有用な改造記事を提供してくださった藤本さん、めらまんさん、A1WXの回路図の作成・提供や随時改造のアドバイスをしてくださったBABAXさん、そしてれふてぃさんありがとうございました。


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

Top pageへ戻る

copyright (C) 2014 Niga.