にがMSX

〜 秋葉原最終処分場のMSX2+基板を弄る 前編〜




HB-F1XV (MainBoard)
 ひょんなことから「秋葉原最終処分場」で放出されていたSONYのHB-F1XVらしきメインボードを入手した。画像ではVDPが載っているが、当初はVDPが抜き取られてICソケットが実装されていた。SONY最終機のMSX2+なので動けば儲けものだし、CPUやOPLLは残されていたので部品取りとしても結構オトクではなかろうか。

 このtweetのブツと思われる。SONYのMSX2/2+が数台バラバラにされて売られていたようだが、すべてキーボードが欠損しており、SONY機の弱点であることが伺える。そういえば以前から持っているF1XVもキーボードのフレキが内部で断線していて、修復が非常に面倒だった覚えが。

 入手したメイン基板は前オーナーの手が入っていて、定番のHICの面実装コンデンサやELNAの4級塩コンデンサは交換済みだった。とりあえず手持ちのF1XVの電源回路を使って火入れしてみたが、ウンともスンとも言わない。BEEP音も鳴らないので起動シーケンスが進んでいないようだ。まぁ、LEVEL5(酷)のジャンクなのだから想定内ではある。

なお、本機をハダカ基板で火入れする際はIC26の3端子レギュレータがかなり熱を持つのでヒートシンクの装備を忘れずに。



改造の痕跡
 


 ケミコン交換だけでなく、システムROMの上にSRAMが亀の子されいて、ポリウレタン線でCPUに配線されていた。ROMに亀の子実装は自分が2015年4月にはにはにさんとF1XVの修理改造コラボした時に行った手法と同じで、下画像はそのときのもの。

  S1985に接続するマッパメモリの上位アドレス線は、5本連続で引き出しが必要で、難易度は高め(慣れるとどうってことはないが)。画像ではRAMのスロットセレクト信号/SLT30と、キーボードリターン信号/X5にMA18有効化のためのダイオードが繋がっている。

ポリウレタン線が部品の足の隙間を経由して引き回されているが、自分はこの被膜をあまり信用していないので、角ばった足と接触した場合、被膜が削れて導通してしまうこともあるのではないかと心配してしまう。実際そういう事例があるのかは知らないが。
元のDRAM(IC7,IC8)は撤去されていた。残したままだと増設SRAMと競合するので適切な処置である。

電源を入れても起動シーケンスが進まないことからSRAMを認識していない可能性はある。一旦SRAMを撤去し、改造前の状態に戻してみることにした。

SRAMをテスト
 撤去したSRAMをROMライターでチェックしてみたが、異常は見当たらなかった。ポリウレタン線を全て外して元通りIC7,IC8にDRAMを実装したが起動せず。スロットに外付けメモリを挿してもダメなので、起動しない原因はメモリとは別にあるようだ。

改めてケミコンの液漏れで痛んだパターンを重点的に調べたが、断線は見つからなかった。とはいえ、後々腐食が進んで断線することもあるだろうからワイヤーで予備線を張っておいた。


起動しない原因
 よくよく観察するとパスコン数個とD1ダイオードが欠損していた。ニッパーで切り取られているようだが、周囲にはケミコン液漏れの痕跡はなく、部品取りして使いまわすようなものでもないので不自然な気がする。完全不動のジャンクにするために意図的に切り取られたものか?

この一帯はRTC関連の回路で、D1はバックアップ電源に関わるもののようだ。過去にA1FXの電池液漏れでRTC周りの断線で起動しないトラブルを経験している。D1に適当なダイオードを実装したところ起動するようになった。ついでに欠損していたパスコンも元通り実装。

起動画面
 しかし画面はチラつき激しく、起動ロゴは良くてもこんな具合。まぁ、この程度の補修で正常動作するような基板なら最終処分場には流れて来ないだろう。

このまま放っておくとBASICっぽい画面には遷移するので、CPUとROM/RAMは正常に動作している模様。VDPかVRAMに問題がありそう。

VDP/VRAMの交換
 ebayで購入したVDPを幾つか試してみたが症状は変わらず。全部のVDPが同じ故障モードとは思えないので、VRAMも張り替えてみたがNG。

なお、既にVDPはソケット化されており、VRAMの足もヤニまみれになっていたので、前オーナーはVDPとVRAMの交換までは試していた模様。ヤニを拭き取って観察してもパターンが切れているようには見えず。


VRAMのデータ化け
 画面表示はチラついて安定しないが、時として左画像の状態でBASICが起動した。文字化けの法則性を解読すれば問題箇所が絞り込める可能性がある。
DRAMアドレスとデータ化けの関連を推定するため、テキストを書き出してみた。上2行がアドレス、その下が正常表示データ、文字化けデータと続く。

ASCIIコードと照合すると、文字化けは一定の法則で発生しており、SPACE(空白)は必ず「"」に化けている。SPACEのコードは20h(00100000b)で、「"」のコードは22h(00100010b)であることから、データのbit1が1に固定されている可能性がある。

すべての文字コードのbit1が1に化けていると仮定して、正しいアドレスに表示されている部分に「^」でアンダーマークを入れてみた。1行目の内容を検証すると、アドレス10-16hの内容が00-06hにも現れ、07-0Fhが17-1Fhに現れていることが分かる。他の行でも同様の傾向があり、データの繰り返しは必ず1行(32バイト)の範囲内で発生している。

以上の法則性により、アドレスのbit4が怪しいと考えられるが、0か1のどちらかに固定されているならば16バイト単位で同じデータが繰り返されるはずである。実際は16バイトの範囲内で正常・異常の分岐点が不定であることから、bit4は不定値、つまり断線して浮いている状態と考えられる。
 VRAMのアドレス線A4の断線&データ線D1のブリッジにアタリを付けて補修したところ、正常に起動画面が出るようになった。

ちなみに基板を観察してもA4の断線は判らなかった。テスターリードで押さえ付けると導通してしまうような微妙な断線であったと推定される。

SONYタイマーの除去
 HB-F1XV(F1XDJ)には有名なSONYタイマーが実装されており、数年間使い続けるとFM音源の音がカスレて鳴らなくなることが知られている。根治療法としてC99を除去してジャンパー線でショートし、C20を無極性コンデンサに交換した。

この改修で本機のSONYタイマーは永久に除去される。C99は時限劣化装置になっているため、交換してもタイマーがリセットされるだけで、時期が来れば再発動する。C99タイマーを無力化すると二段目のC20がバックアップとして機能する仕組みになっていて、非常によくできたタイマーだと思う(皮肉)。詳しくはコチラの記事のコラムを参照のこと。

スピコン、連射機能の封印
 F1XVには、スピコンとSPACEキーの連射機能が装備されているが、コントロール用のサブ基板を接続しないと最低速モードになり、SPACEキーが押せなくなる。とりあえずCN7(連射用)の1-2、3-4と、CN15(スピコン用)の1-2を半田でブリッジさせておいた。

これでスピコン無効、SPACE連射無しに固定される。これらの機能は筐体を作る時に再建する。



機能再建の方針
1 電源を+5V単一化
2 マッパメモリ増設
3 キーボード接続
4 FDDエミュレータ接続
5
筐体をでっちあげる
 以上の補修にて安定して動作するようになったので、普通にMSX2+マシンとして稼働できる状態にしたい。とはいえ、部品取り目的で別のジャンク機を入手すると、直すべき機体が増えてジャンク上がり機が増殖する問題が発生する。そのため、今回は純正部品の調達に走らず、汎用部品と代用品だけで機能を再建することにした。

前編ではPhase1〜3と4のテストまで実行する。


 電源の単一化については、以前にA1Mk2でDC9V化改造を行ったことがあるが、2021年現在はDCDCコンバータが安価に手に入り、大容量のUSB電源も普及していることから、+5V単一化改造とする。

 マッパメモリの増設はNextorを使うために必要だが、いまさら512kB化では面白くないのでDRAMとCPLDを使って4MB化する。とりあえずA1F用の基板を使うが、後で専用基板に置き換える予定。

 キーボードは1ChipMSX同様にPS/2で代用するのが現実的な手法であるが、敢えてファミリーベーシックのキーボードを接続してみる。個人的に使用実績があって変換プログラムが書きやすいという理由もあるが、キーマトリクスの構成がいずれも8bit x 9なのでキー数に過不足なく相性も良いだろう。球数が多くてやたら丈夫なため、動作品が安価に入手できるのもメリット。


電源改修

 

 元々F1XVは、トランス電源で降圧->ダイオードで整流->レギュレータで+5Vを生成する仕様であるが、効率が悪くヒートシンクがかなり熱を持つ。昔は±12Vの生成のためにトランス電源を使うのが一般的だったが、今は+5Vから±12Vを生成できるDCDCコンバータが安価に入手できる。よって本機の電源入力は5V単一とし、±12VはDCDCで生成する方針とした。なお、A1Mk2の改造を行った当時はDCDCが高価だったため100均のシガーソケットアダプタを改造してDCDCをでっち上げていたが、2021年現在は秋月電子で「MAU108」や、「MCWI03-12D12」の完成モジュールが比較的安価に入手できる。

ちなみに、MSXの±12Vは外部スロット合計で各50mAという規定があるらしい(MSX Datapack Wiki 1部4章に記載あり)。本機の場合、内部のオペアンプが±12Vを使うのでMAXで50mA超ということになる。よって3W級(125mA)のMCWI03-12D12を使うべきであるが、±12Vを要求する外部デバイスはFMPAC等のオペアンプくらいと思われるため、1W級(42mA)のMAU108でも運用上は問題ないように思う。2021年現在、MCWI03-12D12が1080円、MAU108は500円なので、今回はケチってMAU108を選択した。SONYの外付けFDDユニットで+12Vを使うものがあるようだが、MAU108でこれが動くかは非検証。

なお、MAU108は入力電圧が4.5V〜5.5Vとされていて、実質5V専用である。MCWI03-12D12は入力電圧が4.5V〜18Vまで許容されるので、電源に+9Vや+12VのACアダプタを使うのであればこちらの方が向いているだろう。

 作業としては、まず不必要な3端子レギュレータを除去した。IC26が+5V用、IC27,IC28が±12V用である。なお、基板にレギュレータを残したまま各電源を供給すると、これらの出力端子に電圧が印加されるため、レギュレータが破損したり、それによって何らかの障害に繋がるかも知れない。テスト目的の短時間であれば壊れない気もするが、継続してレギュレータの出力側に外部電源を接続する場合はレギュレータの除去を強く推奨する。


なお、本機では±12Vを供給しなくてもシステムは起動し、映像もPSG音声も出力されるが、FM音源部のオペアンプが±12Vを使用しているので、FM音源のみ発音されない状態となる。

 巨大な電解コンデンサC81はAC-DC変換において電圧を平滑にするためのものだが、DC電源化で不要になるので撤去した。USB電源なら極性を間違う心配がないのでダイオードによる回路保護も不要だろう。この際壊れたUSB電源を接続する可能性は考慮しない。

適当なUSBケーブルの切れ端をIC26(撤去済み)のIN/G端子に接続し、ナイロンバンドで基板穴に固定。スイッチはIC26のIN/OUT間に取り付けた。これで、スイッチON時にOUT/G間にUSB電源の+5Vが供給される。

テスト用電源にはiPhone付属のUSBアダプタ(1A)を使用。Apple純正電源はローノイズなのでオススメ。

MAU108は適当に強力両面テープで貼り付けて、±12V出力をレギュレータ(除去済み)の出力端子にワイヤーで接続した。+5V入力とGNDはそれぞれIC26のOUT、Gに接続。

 小さなUSB電源だが普通にゲームが起動し、FM音源も鳴っている。過去のA1Mk2の改造では+9V/1.3A(11.7W)の電源では起動しないことがあったが、今回はレギュレータ撤去で省エネ化され、+5V/1A(5W)でも問題ないようだ。しばらく稼動させてみてもCPUとVDPが多少ぬるい程度。FDDを接続してモーターを回したら1A電源では不足するかも知れないが、その時は容量の大きいUSB電源を使えばよいだろう。




メモリ増設
CPUをソケット化し、A1F用の4MBメモリ増設基板を載せてみた。増設基板のOPLL回路は実装せず、F4レジスタは競合するのでJP1オープンで無効化してある。RAMのスロットセレクト信号はS1985の/SLT30を使用。元の64kBのDRAMは競合するので撤去した。

この状態で起動ロゴ画面から4096kB認識され、似非SDiskのNextorも問題なく動作した。もちろんチェッカーによるテストやMPCM再生もOK。

この基板はメインボード上の構造物と干渉せずに実装可能であったが、オリジナル筐体のキーボードやシールド板と干渉するためガワには入らなくなる。無駄に面積を食うのでXV専用の基板を作ったほうが良いかもしれない。後の課題とする。

キーボードの接続
HVC-007のキーマトリクス表
Enriさんのサイトより引用)
MSXのキーマトリクス表
テクハンWikiより引用)

 ファミベーキーボードの特徴は、左右のSHIFTが別キー扱いになっている他、F6,F7,F8があってTAB,BS,SELECT,CAPSがないことである。キー数はMSXと同じ72(テンキーは除く)なので、適当にF6 -> TAB , F7 -> SELECT , F8 -> BS , 右SHFT -> CAPSとかアサインすれば良いだろう。データは4bit毎のシリアル通信で18回に分けて取得する。正論理なのでキーが押されていれば「1」。詳しくはEnriさんのサイトを参照のこと。

一方、MSXのキーボードインターフェイスはパラレル通信で、IOポートの#AAh(bit3:0)に行データ(Yx)を書き込んでから#A9hを読んで8bitずつ取得する。負論理でキー押下状態が「0」。任意のタイミングで任意のキーを読むことができる。

これをPICマイコンで変換することになるが、プログラム的には、メインルーチンでファミベのキーマトリクスをスキャンして、9バイトのバッファメモリに蓄積。一方でMSXの#AAhの書き込みを検出して割り込みをかけ、瞬時に行データ(YA-YD)を取り込んでバッファメモリの内容をGPIOに出力する感じになる。問題はMSXのデータ要求に応えられる速度が出るかどうか。最速だと以下のルーチンになる。

OUT (0AAH),A
IN    A,(0A9H)

in/out命令はそれぞれ12Tステート消費するが、内訳はM1サイクル5T+メモリサイクル3T+IOサイクル4Tである。PICの処理的にはout命令の終わりで割り込みをかけて、in命令のIOサイクルまでに目的のデータを出力する必要がある。猶予は8T=2.23usとシビアであるが、32MHzドライブのPICならこの間に17命令実行できる。速度的にはいけそうな感じ。



 割り込みのトリガー信号にはS1985のKBDIRが使えそう。この信号は外付けキーボードを接続する際にケーブルの配線を少なくするために用意されているものらしい。
タイミングチャートを見ると、#AA/ABhアクセスの終わりに1.5Clock(0.42us)立ち上がることになっている。PICの割り込み信号に要求されるパルス幅は25ns(0.025us)以上なので十分に追従できるはず。
ちなみにKBDIR信号はS1985の3pから出力されるが、マッパーアドレスMA18と排他である。よってメモリ512kB化改造している場合この信号は使えない。上で増設した4MBメモリボードはCPLD内部でMA18を生成しているためS1985のMA18は不使用。


 実際のMSXのBIOSによるキーボードスキャンの波形を観測してみた。画像が暗くて見難いが、上半分の矩形波がS1985のYA、その下のドットがKBDIRのHパルスを示している(DIV 20us)。テンキーを含めて11回の行指定がされていることが分かる。YAは都度反転しているのでYマトリクスは0〜10にインクリメントされていると推定できる。
BIOSにおける全体のスキャンはVSYNC同期(1.67ms周期)と思われるが、スキャン中の行指定の間隔は実測で約17us。PICで割り込み処理を完了するのに十分な時間的猶予がある。KBDIRのHパルスも理論値0.42usと概ね一致していた。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
C0D12:
IN A,(0AAH)
AND 0F0H
LD C,A
LD B,11
LD HL,NEWKEY
J0D1C:
LD A,C ;5T
OUT (0AAH),A ;12T
IN A,(0A9H) ;12T
LD (HL),A ;8T
INC C ;5T
INC HL ;7T
DJNZ J0D1C ;14T
 MSX BIOSのキースキャンコードを読んでみた。予想通り、OUT -> IN間隔はあまり余裕がないが、Yマトリクス指定が0〜10でインクリメントされることや、OUT -> OUT周期は63T=17.6usで観測結果と一致していた。



画像クリックで拡大
 PICマイコンに要求されるスペックは、クロック32MHz、テーブル変換データ用メモリ72バイト、8bitバスを含むGPIOが20本(FB側7本+MSX側13本)、IOC(状態変化割り込み機能)ということで、手持ちの16F1933か16F18857が使えそう。いつものようにオールマシン語(笑)でプログラムを書いた。HEXファイルはコチラ(FBKB2MSX.zip)。いずれもRaspberry Pi のPickleで書き込める。16F1933はp14コマンド、16F18857はn14コマンドに対応。


 回路図上はシンプルにS1985とファミベーキーボードの間にPICを繋ぐだけであるが、実際の配線はメイン基板から引き出す信号が多いので意外と面倒。S1985の信号はできるだけ取り出しやすい端子を探して接続した。ほとんどの信号はIC15と集合抵抗RB2から取り出せるが、KBDIRだけは直接S1985から取り出す必要あり。なお、キーボードリターン信号/X1はRB2ではなくIC10の8pから取り出す。

S1985のキーボードリターン信号はリセット時に機能設定ピンとして使われるため、PICにリセット状態を明示する必要がある。PICの/MCLRピンをリセットIC(IC14)の出力端子(5p)に接続した。ちなみにPICのファームウエアでキーボードリターン信号をオープンドレイン出力にしているので、既存のキーボードと並列に繋いでも競合せずに動作するはずである。




 余談だが、MSXでは原則カートリッジ式の外付けキーボードI/Fは作ることができない。IO競合の問題が発生するためである。通常、キーボードリターン信号はプルアップされ、オープンドレインのキースイッチからS1985等のキーマトリクス処理系統に入力される。よって今回の改造のようにキーボードリターン信号に並列にオープンドレイン出力のデバイスを接続すれば問題ない。

一方で、S1985やS3527のデータシートを読む限り、キーボードIOアクセス時のデータバスがオープンドレイン出力になるという記載はなく、キー押下のないbitについては普通にHレベルを出力していると思われる(実機では測定していない)。ここでカートリッジが外付けキーボードの押下を検出してLレベルを出力すると本体のH出力と競合する。注意すべきは競合が発生してもLレベルが優位になって一見普通に機能しているように見えることがあり、「機能する=IO競合していない」とは言えない点である。IO競合は故障を誘発する要因になると思われ、このようなカートリッジを作成しようと思うなら事前に本体の回路を調べてキーボードI/Fの出力信号がオープンドレインになっているかどうか確認すべきである。なお、そのような機種が存在するかどうかは不明。


 
ブレッドボード上でテストを繰り返し、最終的に全てのキーが正しく入力できるようになった。刻印の異なるキーは下記の通り割り当てた。
HVC-007
MSX
F6
TAB
F7
SELECT
F8
BS
SHIFT(右)
CAPS


IO直アクセスなど、BIOSのキースキャン以外のタイミングでアクセスがあると正しい応答ができないことがあるが、実用上ほぼ問題ないレベルである。





ゲームもプレイ可能

  ゲームでは高速化のために独自のタイミングで特定キーのみ読み取っていることがある。アレスタのゲーム中ではカーソルキーとSHIFT,Z,SPACE,STOPキーだけが使われていている。キーアクセスはBIOSのSMSMAT(0141h)を経由していて、Y8(カーソル)、Y6(SHIFT)、Y5(Z)、Y8(SPACE)の順で読んでいるが、Y7(STOP)は別ルーチンで読んでいるようだ。

 開発当初は不適切なキー応答が目立っていたが、タイミングを調整してゲームでも支障ない操作が可能になった。とはいえ、クリアまでのプレイで一度だけ押してないSTOPキーが反応したので完全ではない。


KBDIRが使えない場合
RAM512kB改造でS1985のKBDIR信号が使えない場合は代用信号を作成すればよい。IOの#AA〜ABhの書き込みが終わるタイミングでL->Hに遷移する信号を作ればよいので、下記回路図のようになる。S1985のKBDIRとはH->Lに遷移するタイミングが異なるが、実際に試してみたところPICの割り込みトリガー信号としては問題なく機能した。



続く?

 とりあえずキーボードもFDDエミュレータも繋がるし、一通り使えるようになった。ベースがFM音源と漢字ROMが載ったMSX2+なので、これ以上の拡張の必要性も感じない。裸基板はテスターやオシロのプローブを当てやすいので、実験機としてコレはコレでいいんじゃね?という気もしてきた。

とはいえ、あまりに剝き出しのままだと、ついうっかりショートさせて重要な部品を殺してしまう事故が起こりうる。スピコンやリセットボタンやPAUSEボタンも復活させたいし、FDDエミュレータもスマートに内蔵させたいところ。ということで、ガワのでっちあげについては次回に持ち越しとする。

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

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

気が向いたら後編へ続く!

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

copyright (C) 2021 Niga.