にがMSX

〜 FS-A1Fの改造 後編〜




FS-A1F
1 VDP交換
2 システムROM書き換え
3 F4レジスタ実装
4 S端子増設
5
2ドライブ化テスト
6
FM音源増設
7
メモリ増設(4MB以上)
前編はコチラ

 FS-A1F改造ネタは前回記事で左記項目の1,2,4,5が終了している。
後編ではF4レジスタ実装FM音源増設メモリ増設を行う。



回路図


(画像クリックでフルサイズ表示)
 この規模の回路をイチから手配線で作る気にはなれないのでKiCADで基板を設計した。マッパーレジスタ、FM音源やF4レジスタは全てIOデバイスなので、同じ基板に同居させるのが合理的である。



 DRAM信号はメインボードから取得して流用。 ICソケットを介して接続できるようにする。(後に/CASは流用不可と判明)

DRAMアドレスの下位DA0〜DA6を流用し、上位のDA7〜DA10は、マッパーアドレスMA14〜MA21とリフレッシュアドレスRA7〜RA10をマルチプレクス化して生成する。

なお、MA14〜MA18はS1985(MSX SYSTEM II)からも取得できるが、細かい配線を避けたかったので8bitフル実装した。


 リフレッシュアドレス生成のロジックがコチラ。リフレッシュ時のDRAMアドレスDA6を7474で取り込みRA6とし、このnegative edgeを捉えて上位のカウンタアドレスRA7〜RA10を生成。/BUSACKアサート時の/RASのpositive edgeを7474のトリガーにすればPAUSEにも対応できる。

なお、DRAMマルチプレクス信号MPXはS1985の41pから取得できるが、配線が面倒なのと7474も余っていたので生成することにした。



 IOデコーダはOPLL (#7C-7Dh = 0111110Xb )、F4レジスタ(#F4h = 11110100b)、マッパーレジスタ(#FC-FFh = 111111XXb)の共通点を利用してなるべく石の数が少なくなるようにした。





 Z80の下駄になるように部品をレイアウトした。左下のDRAMソケットの位置もA1Fメインボードに合わせてある。丸穴はメインボードの電解コンデンサの貫通孔。機能ごとに白線で仕切ってあるので必要なだけ部品を実装できる。

オペアンプの電源とサウンド信号以外はZ80とDRAMソケット経由でやりくりするつもりだったが、後で不具合が判明。実際はDRAM制御信号(/CAS)に追加回路を要する(後述)。

上記イメージで2020年1月中旬にFuisionPCBに発注。春節と新型肺炎の影響により、2ヶ月後に到着した。下準備としてメインボードのZ80とDRAMを増設分含めて全て撤去し、空いたIC14とZ80パターンにICソケットを実装。基板にDRAMと周辺ロジックを実装した状態でA1Fに組み込んで電源投入してみたが、画面は真っ暗なままで沈黙…。



/CAS信号の修正

 

 回路図を見直したところ、DRAMの/CAS信号が不適切であることに気が付いた。
A1Fでは元から載っている64kBのDRAMが/CAS0、+64kB増設分が/CAS1で制御される仕組みになっている。

今回の基板はレイアウトの都合で、増設RAM側(IC14)の制御信号を流用しているため、DRAMに接続されているのは/CAS0ではなく/CAS1である。この信号はマッパメモリの最下位64kBアクセス時はアサートされないので、システムからマッパメモリとして認識されない状態になっていた。

 諸々試行した結果、最終的に以上のように修正することとなった。新しい/DCAS信号はS1985から出ている/CAS信号とRAMのスロットセレクト信号/SLT30のORで生成した。





 DRAMソケットから取得していた/CAS1信号は切り離し、DRAMには新しく生成した/DCAS信号を接続する。

左画像のようにメインボード側でDRAM(IC14)の16pをパターンカットで切り離し、代わりに/DCAS(増設7432の3p)をワイヤーで接続すればOK。




 実際の74HC32増設部分がコチラ。

S1985にワイヤーを半田付けするので難易度はそれなりだが、離れている2本なので512kB増設よりはラク。




 今回試行した接続例と認識された容量を示す。

/CAS1は使えなかったが、/CAS0をそのままDRAMに入れれば64kBメモリとして認識された(予想通り)。

ダイオードとプルアップ抵抗で/CAS0/CAS1のANDを取れば全領域認識されても良さそうに思えたが、実際は128kBしか認識されなかった。どうやらA1Fのゲートアレイ内部にはマッパレジスタMA17が存在していて、MA17=1の時に/CAS0,/CAS1はアサートされない模様。



データ化けと回路デバッグ

 /CAS信号の修正により、メモリとして認識され、MSX2+起動ロゴが現れるようになった。
しかし、Main RAM表示の文字が崩れているし、BASICは起動せずにフリーズしてしまう。



想定していたDRAMアドレス
Row
Column
DRAMアドレス
A0
A1
DA0
A2
A3
DA1
A4
A5
DA2
A6
A7
DA3
A8
A9
DA4
A10
A11
DA5
A12
A13
DA6
MA14
MA15
DA7 (生成)
正しいDRAMアドレス
Row
Column
DRAMアドレス
A0
A8
DA0 (流用)
A1
A9
DA1 (流用)
A2
A10
DA2 (流用)
A3
A11
DA3 (流用)
A4
A12
DA4 (流用)
A5
A13
DA5 (流用)
A6
MA14
DA6 (流用)
A7
MA15
DA7
 Main RAM表示は毎回同じパターンで崩れていて、データが法則性を持って変化していることを示唆していた。原因はDRAMアドレスマルチプレクスの組が間違っていたことだった。Z80のA0〜A6はDRAMリフレッシュカウンタアドレスを含んでおり、DRAMのRowアドレスはこれを利用するのが通例で、設計時にこれをすっかり失念していた。

今回の増設回路ではDA6までをメインボードの信号を流用し、DA7以降をマッパーアドレスから生成している。流用したDA6にMA14が含まれているのに、生成したDA7でMA14がダブってA7が足りない状態となっていた。

やや余談であるが、FS-A1Fは無改造の64kBの状態でもメモリマッパに対応しており、DRAMアドレスDA6,DA7にマッパーアドレス(MA14,MA15)が含まれている。初代A1等のメモリマッパ非対応機の場合はDA6、DA7のColumnアドレスとしてZ80のA14,A15が与えられるため、DRAM信号の流用はDA5までしかできないことになる。


 
 マルチプレクサに入っているMA14を切り離し、代わりにZ80のA7を入れれば正しいDA7になるはず。

MA14は裏面でパターンカットし、U10の6pとZ80の37pをジャンパー線で接続した。


 これで起動ロゴの文字化けが直り、BASICも正常起動した。メモリチェッカー「MEMTEST.COM」で全てのセグメントにエラーが無いことも確認。拙作PCMプレーヤー「MPCM.COM」で5分PAUSE後のリプレイも正常に発音されたのでPAUSEでのデータ化けも無い模様。

ちなみにMEMTEST.COMーはこちらのアーカイブ(藤本氏による1MBメモリカートリッジ製作記事)に同梱されている。MPCM.COMはこちらのページで配布中。



F4レジスタ

 F4レジスタはIOの#F4hのbit7に存在し、リセット時のステータスを記録するもので、電源ON(またはリセットボタン)で起動した場合に'0'が読み出され、ソフトウエアリセット時は'1'が読み出される。このレジスタはソフトリセット時にMSXタイトルをスキップして再起動を高速化する目的で利用されているようだ。海外のMSX2の2+化改造では追加実装するのが一般的らしい。

海外の作例に倣って74HC173を採用したが、このICを実装したところ、MSX起動ロゴが出なくなってしまった。海外では、このレジスタがないとロゴが出ないという情報があり、どうも話が食い違っている。


 原因究明のため、BIOSを探ってみることにした。F4レジスタの読み書きにはRDRESとWRRESが用意されており、FS-A1FXのシステムROMでは下記の様になっていた。
FS-A1FX のBIOS
RDRES: MAIN ROM 017Ah 
リセット時のステータスを読む
017A: C3 6A 14

146A: DB F4
146C: 2F
146D: C9
JP RM146A
 
IN A,(F4h)
CPL
RET

WRRES: MAIN ROM 017Dh
リセット時のステータスを書き込む
017D: C3 6E 14

146E: 2F
146F: D3 F4
1471: C9
JP RM146E

CPL
OUT (F4h),A
RET


 017Ah, 017Dhはフックで、実際のルーチンは146Ah,146Ehから書かれている。読み書き共にCPLで反転されており、問題はレジスタのハードウエア的な初期値にあると判明した。今回ハードウエア的なレジスタの初期値を'0'(ソフトウエア的には'1')に設定してしまったため、電源投入時にソフトウエアリセットとして起動ロゴがスキップされた模様。なお、ソフトウエアリセットをかけた場合は正しくレジスタがセットされるため、起動ロゴを出さずに再起動する。つまり、どの状況でも起動ロゴが出ない。


 この問題を解決するには、2か所の CPL(2Fh) を NOP (00h)に書き換えたBIOSを用意するか、ハードウエア的なレジスタの初期値を'1'にするかのどちらかになる。74HC173は初期値が'0'に固定されているので、BIOSを書き換えるのが近道だろう。ということで、MAIN ROMに対して下記修正を行い、ROMを焼きなおした。

Panasonic MSX2+ MAIN ROM  
146Ch: 2Fh -> 00h
146Eh: 2Fh -> 00h

  なお、SONYのHB-F1XVのBIOSでは、上記ルーチンのCPL(2Fh)のところが最初からNOP(00h)に置き換わっていた。このようなBIOSでF4レジスタが存在しない場合、データバスのプルアップにより'1'が読み出され、常にソフトウエアリセットとして起動ロゴがスキップされる。おそらく海外でMSX2+化改造に用いられるBIOSはこちらが主流で、起動ロゴが出ない問題を回避するためにF4レジスタの追加実装が一般的になっていると思われる。








FM音源の増設

 

 FM音源 YM2413増設の手法は初代FS-A1で行ったものと基本的に同じ。フィルターのカットオフ周波数等についてはそちらを参照のこと。R11はHICに対する入力抵抗で、初代A1では4.7kΩとしていたが、A1Fではゲインが大きすぎるので100kΩに変更した。



 これでフル実装状態となった。音声信号用のコンデンサC20,C23は音響用電解とフィルムコンデンサを採用。C23は無極性タイプでなければならないので注意(理由は過去記事参照)。オペアンプ用の±12V電源と、音声信号は左下の4本のピンヘッダからジャンパー線を接続する。


 HICの7pがGND、18pがオプション用の音声入力端子であるので、ピンヘッダのGND,SOUNDからワイヤーで接続した。

±12Vについては、スロットの48pが+12V、50pが-12Vになっているので適当なところに接続。


 HICについてはBABAXさんのblogに回路図が公開されている(上図は抜粋したもの)。14p〜18pが音声入力端子になっていて、コンデンサと抵抗を介してミキシングされているが、入力抵抗の値はバリエーションがある模様。

A1Fでは入力抵抗はPSG:100kΩ、キークリック:1MΩ、スロット150kΩ(BABAXさんの回路図では220kΩ)となっていた。今回の改造ではOPLLの音声信号をRESERVE SOUND INに接続するので、入力抵抗は100k〜150kΩ程度が妥当だろう。



 ソケットにZ80とYM2413を実装し、メインボードにプラグイン。音源用のジャンパー線を接続して完成した。OPLLをシステムに認識させるためにはROMが必要であるが、前回既にスロット#3-3に実装済みである。

FMサウンドはPSGやキークリック音にミキシングされて出力されるが、これらの音量バランスについては特に規定はなく、機種によってもバラバラのようである。本基板では半固定抵抗で調整できるが、上画像のように中央より絞り気味でいい塩梅になった。



少数頒布
A1F専用で、かなりマニアックな基板なのであまり需要は無さそうではあるが、せっかく作ったので余った基板を数枚のみ頒布することにした。

キットは左画像の状態で、4MBメモリとして動作確認済み。メインボード改造用の74VHC32やICソケット、基板穴を貫通できるスリムタイプのコンデンサ、配線用のジュンフロン線を添付。F4レジスタの74HC173は添付するが非実装FM音源を構成する部品は添付しない実装WEBマニュアルはコチラ

頒布は家電のケンちゃんを通じて行う。A1Fの基板は改造難易度が高いので未経験者にはオススメしないが、腕に覚えのある方はチャレンジして欲しい。

2021.1.12追記)既に頒布は終了しています。再生産の予定はありません。



 お約束ですが、この記事を見て修理・改造などを行い故障やその他問題が発生しても当方は責任を負いません。各自の責任において情報を広く集めて行うことをおすすめします。

この記事の内容は個人の憶測や見解の誤りを含んでいる可能性があります。内容についてメーカー各社に問い合わせるのは止めましょう。

「続編」に続く

ご意見、ご感想、ご質問はにが BBSまで!
Top pageへ 戻る

copyright (C) 2020 Niga.