「PCエンジンマウス」の互換品を作ってみました。
Multiway pad converterのモードの一つなので、正確にはパッド変換器です。以下のページにソースを公開しています。
GitHub - nicotakuya/multiway-pad-converter
「PCエンジンマウス」とはPCエンジン専用のマウスです。かなりマイナーな周辺機器だと思います。ベーマガのバックナンバーを確認したら、どこにも写真がありません。1992年9月号で、'92東京おもちゃショーでNECが専用マウスを発表したという一文があるだけでした。マウスを「マリオペイント」とセット売りした任天堂は商売上手だなと思います。
PCエンジンマウスの対応ソフトが手元にありません。対応ソフトがどれなのか不明。
動作チェックするには、ソフトは必須。そして、ソフトの動作チェックにマウスが必要になります。堂々巡りです。
しかたないので、中古のPCエンジンマウスを買いました。買ったら、もう自作する意味ないんですが。
駿河屋で3010円。高い、、、高すぎる、、、。このお金で中古のデュアルショック2が6個買えます。
マウスのテストプログラムを作ってみました。
HuCにはマウス用の関数が用意されているので、それを呼べばいいだけです。マウスの認識は自動的に行われます。
以下のページでソースコードを公開してます。
PCエンジンマウスの通信仕様は、どこにも資料が存在しないので、HuCのソースファイルを解読しました。"include/pce/mouse.asm"がマウスのドライバです。
CLR端子でPCエンジンから同期信号を送って、移動量/ボタン情報を読み取ります。
・SEL端子=Hに切り替え、CLR端子をL→H→Lに切り替え、K0~3から移動量読み込み。
・SEL端子=Lに切り替え、ボタン情報読み込み。
これを4回繰り返します。CLRのパルスは1→2回目だけ時間が空いていて、それで、1回目だと認識していると思います。
移動量の内容は読み込み回数によって、次のように変化します。止まった状態だと0です。
・X移動量 上位4ビット
・X移動量 下位4ビット
・Y移動量 上位4ビット
・Y移動量 下位4ビット
ボタン情報は4回読んでも同じ内容です。RUN/SELECT/ボタンII(左クリック)/ボタンI(右クリック)に割り振ってあります。
ここで問題が発生。
マウスが認識されません。「EXIST」が0のままです。
Arduinoの起動に時間がかかりすぎて、マウスを認識している処理に間に合わないためです。マウスの認識は最初だけで、失敗すると以後は認識してくれません。
苦肉の策ですが、PCエンジンにリセットボタンを追加しました(ソフト側からリセットする方法が不明だったので)。
リセットした結果、うまくマウスとして認識されました。アナログスティックを動かすと、カーソルが動きます。
回路に問題があって、SELECTとRUNボタンは外付けになっていて、パッドのボタンを割り当てることができません。XHE-3をそのままマネしたので、こういう仕様になってしまいました。
マウスの認識はHuCで独自に採用しているものです。ソースを見た感じでは、ポートの状態が一定回数連続で「0」ならマウスと認識しているだけで、かなり判断が甘いです。他のソフトで正しく動くのか、まだ確認していません。
(追記2022/7/11)
うっかり「世界初」と書いてしまったのですが、もっと先に作っている方が居ました。ご参考までに。
https://github.com/dshadoff/PC_Engine_RP2040_Projects