PC-8801mkII/SR/FR STM32F4でUSBキーボードとUSBゲームパッドを使う


リベンジを繰り返すも返り討ちにあっている、PC-8801mkII/SR/FRのキーボードコンバーターに再挑戦しました。

これまでのように試行錯誤でやっていると効率が悪いので、問題となっているアドレスポートの信号をオシロスコープで見てみました。
すると、本当に信号が変わるのはほんのわずか、まさに♪一瞬の光の矢~
この一瞬の間にアドレスポートに対応するキーデータを送信しなければいけませんので、マイコンで処理するのは不可能であることが判ります。

しかしSTM32の実力はこんなものじゃないだろうと、懲りずにアタックしてみます。

以前、4ビットのアドレスポートをANDで合成し、その結果を割り込みで検知しようとしましたが失敗しました。
今度は、STM32は16本まで割り込みを設定できるので、デコーダを通った12ビットのアドレスピン毎に割り込みを定義してみました。
割り込み検知後にアドレス番号を読み込もうとしても既に信号が立ち上がってしまって読めないので、発生した割り込み番号=アドレス番号にすれば判断できるはずです。

また、以前はSTM32F103を使いましたが、今回は全ピン5VトレラントのSTM32F401を使います。
F401であればCPUクロックが上なのはもちろん、オシレータも25MHzなのでI/Oも高速なはずです。

ということで、やってみましたが...
駄目です。
割り込み5~9番、10~15番が束になっているため、その割り込み番号判定の間にPC-8801側のキーデータ取得処理が終わってしまいます。
また、PS/2キーボードも仕様が複雑なので、キーデータの取得がもたついてしまいます。

次は、PS/2は諦めてUSBキーボードにしてみます。
普通はUSBの方が仕様が複雑で時間がかかりそうですが、USB OTGで処理してくれますし、PS/2と違って押したキーコードのみ入ってくるので、コンバータの処理自体は簡素化できます。

ということで、やってみましたが...

煙を吐いた!
どこかショートしていたようです。
幸い、PC-8801、マイコン、キーボードは無事でケーブルのみ焼損しただけです。
こんなくだらないことで火事なんて絶対あってはなりません。

ハードをマイコンごと交換して、再度一から作り直しました。
しかし駄目です。
もう八方塞がり、やはりPC-8801mkII/SR/FRのキーボードコンバーターは不可能なのか。
PC-8801FH以降やPC-9801、X68000、FM TOWNSは調歩同期なので簡単なのですが...。

とりあえず1週間ほど頭を冷やして工作から離れていたら、仕事中に閃きました(おい)。
5-9番の割り込みが束になっているなら、それを直接アドレス4ビットとして取得すればいいんじゃね?
これならデコーダICを使わない分、その遅延時間をマイコンの処理時間に回せるし。
また配線も極力短くすれば、純正のケーブルの配線遅延時間をマイコンの処理時間に回せます。

ということで、さっそくやってみました。
EXT5-9に対応するPB5をプルダウン、PB6-PB9をそのままアドレス番号として使用、なるべく割り込みベクタ直後にアドレス番号の取得と対応するデータの送出を行うために割り込みハンドラ内でコードを書きます。

今度こそどうだ...。

キター!
キー入力ができました。
N88-BASICはもちろん、N-BASICでもキー入力できます。
ただ、PS/2でもいけるかなと、コードを追加してみましたが処理が追い付かず、キー入力するとおかしなことになります。
したがってUSB専用となります。

キー入力ができればこっちのもの、テンキー操作をUSBゲームパッドに対応させました。
連射対応、SELECT(MODE)で割り当てボタン切り替え可能です。
走れスカイライン、バグファイヤーがまるで初めからゲームパッドに対応したかのごとく操作できます。
もちろんPC-8801の各種ゲーム、特にシューティングでは最高の使い勝手です。
手前味噌ですが完璧ですね。















戻る