MZにUSBをつなごう
つながるものならつなぎたいと思うのが人情というもの…ってLANと同じネタだな
1999年の夏コミオフでのこと。飲み会&二大巨頭の対決(カラオケのことね)が終わり、宿泊場所兼発表会場に到着直後に、ある人が言いました。あ、発表ってのは趣味の工作やプログラムのお披露目のことね。「最近USBのチップとかいろいろ出てるでしょ。あれでMZにUSB機器がつながったら面白いかも」。が、ここで私が「いや、今出てるのはUSBにぶら下がるほうのチップで、ホストになれるものはない。ホストはたいていパソコンのチップセットに含まれているので、MZなんかにつけられるわけではない」と却下してしまいました。
実はこの私のセリフは、本当に正確なものではありません。現にPCIカードやCardBusタイプのPCカードとしてUSBのホスト機能を増設するものが市場にあります。それはPCIバスを経由して接続されるUSBホストチップなので、本体のチップセットとは一体のものではありません。ですがこれをZ80マシンに増設したいというなら、Z80バスとPCIをブリッジできる回路が必要になります。やっぱりMZをUSBホストとする道は遠いのか…。
つながらないならつないでみせましょう
しかし、どこかに需要はあると見たかScanLogicという会社が簡単な回路で接続できるUSBホスト/スレーブ兼用チップSL11H/SL11HTという製品を発表しました。初めこそ汎用のUSBホストチップという存在がキワモノすぎたか応用例がなかなか出てきませんでしたが、SL811HSTに進化して間もなく「USB On-The-Go」というスレーブが一時的にホストになるという規格が成立したあたりで注目を集め、ScanLogicはCypressに吸収されたもののデバイスはいろいろな製品で使われるようになってきました。
このページは修正版でして、当初はモルフィー企画製のUSBホストボード(ISAバス)の回路だけをいただいて作るつもりが挫折、次に同じくモルフィー企画の汎用USBホスト基板をMZのユニバーサル基板に載せて作りかけるもアドレスデコード用のCPLDがうまく動かずそのまま頓挫していました。
今回は秋月のAKI-H8/3069USBホストボードキットを使い、特定のUSBデバイスを接続することを目標にしてみます。なにせ、まだUSBのプログラミングをモノにしていませんしね。
ターゲットはHID
きっかけは、シャープ博物館をご覧になったある方からのメール。その人はMZ-2500のキーボードをなくしてしまったとのことで、PC/ATのキーボードを接続することはできないものかという質問をしてきたのです。
MZ-2500は見た目こそセパレート型のキーボードを装備していますが、ハード的には一体型のMZ-2000などと同等になっており、メインのZ80がパラレルポートを介してキーマトリクスをスキャンするようになっています。そのまま分離したのではケーブルが太くなるので(それを地で行ったのが初代PC-8801だったのですが)、専用のLSIで本体とキーボードの間を通信させるように変更しています。それでいて、Z80からはソフト的になんら変わりないように工夫されています。
その通信プロトコルなどは例え「活用研究」でも明らかにされておらず、唯一あるのは回路図だけです。それも参考にはならず、どうしても解析が必要となります。メールの主にはその旨伝えたのですが、私自身はその後かなり気になっていました。
ある日、とあることがきっかけで急にこのプロジェクトを進める気になりました。最初はPICでやらせようと思いPS/2のキーボードなどを制御している例を探したのですが、最近はみんなUSBだよなぁと思いUSBホスト関係を探すことに変更。しかし(AVRなら例があったものの)参考になるものがなく、探しているうちに秋月がH8/3069FとSL811HSTを使用したボードを出していることを知り、早速入手することにしました。それにどうせならキーボードだけでなくマウスやジョイスティックもつなげられると面白そうですよね。
で、届いたキットに添付されていたサンプルソフトのソースを眺めて、なんとなくわかってきたような気分。ちょっとがんばってみましょうか。
最初はマウス
キーボードが本命ですけど、ハードが簡単なのでマウスから挑戦します。マウスの制御ができれば難関の半分は乗り越えられている計算なので。
MZのマウスはシリアルマウスで、4800bpsの調歩同期シリアルを5VのTTLレベルで本体と通信します。TTLレベルである以外はRS232Cとなんら変わりなく、X1turboやMZ-2500はZ80SIOでマウスのデータを受け取っています。データは3バイトで、ボタン情報と移動量が本体からのリクエストで通知されます。
一方PCのマウスも同様で、基本的には3バイトのデータを本体に渡します(ボタンがいっぱいとかホイールとかがつくと変わりそうですが)。どうせ滑らせてボタンを押す、という点では昔も今も変わりませんので、USBからのデータをシリアルに乗せかえればいいような気がします。もっとも、MZ側からのデータ取得リクエストの周期とUSBマウスへのデータ取得周期はきっと一致しないでしょうから、一旦溜めるとか、その差を埋める工夫はいるでしょうね。
次はキーボード
MZ-2500のキーボードの端子を見ると、KD0〜4のスキャン情報をやりとりしていると思われる5本の線の他にRTSNとMPXという名の信号線があります。実際のスキャンは8bitで読み込みますので、時分割しているのは間違いないはずです。それを制御するのがMPXでしょうか?MZ-2000の回路図などを見てみると、普段スキャンに使われる信号は4本のみ(デコーダを通して1本のみ"L"となる12本のストローブ信号の束に変換される)で、1本はストローブ信号を全て"L"にするためにあります。
それを踏まえて再度MZ-2500の回路を見ると、KD4のみ片方向の信号で、KD0〜3はRTSNが"H"の時出力で"L"で入力となることから、おそらく
という具合の通信をしているのではないでしょうか。
で、これをキーマトリクスを使わずに再現する方法ですが、やはりなんらかのロジック回路を使う必要があるでしょう。実は一時ストローブ信号をアドレスとみなしてデュアルポートRAMを使うようなことを考えていたのですが、かなり大きなサイズのものを使わないといけないわりに必要な部分はごくわずか、外付け回路はやはり必要、ということでここはやはりCPLDを使うことに。でも使用予定のCPLD、注文してるのに一向に届かないなぁ…。