2022年5月に発売したパソピア700用USB Keyboard Adaptor Rev.0.1ですが、
内部にはRaspberry PI Picoを使っています
2022年当時は色々制限がありましたが、最新の開発環境を落としてみたところ、USB HostやPIO周りがだいぶ改善されてきました。
・USB Hub付きのキーボードが使えるようになった(但し全てではない)
・Hot Plugで落ちにくくなった(でも時々ハングする)
・PIOの命令数を31以下にしないとAssertで止まっていたのが、32命令まで動くようになった
特に最後の、PIOで1命令追加できるのは嬉しい。
せっかくなので、
push noblock
を入れてみました。パソピア700からPicoに届くKeyScan 7bitデータをFIFOに保存します。
逆方向へはKeyReturn 8bitデータを送れるので、これで双方向通信ができます。
Picoにプログラムを保存しておき、パソピア700に転送する仕組みを考えます。
パソピア700からKeyScanデータ(0Ch or 0Eh)を送り、Picoが受け取ったら、次のアドレスに移動。格納されているデータをPIOにセットします。続いてKeyScanデータ(01h)が来たらKeyReturnで8bitデータを返却、を繰り返してプログラムを転送します。
パソピア700側の転送処理です。
MEM_CTRL EQU 22h ;Memory ControlMEM_MODE EQU 3Ch ;Memory ModeKEY_SCAN EQU 30h ; (out) KeyScan DataKEY_RETURN EQU 31h ; (in) KeyReturn DataORG 0F000h; データ読み込み処理DATA_LOAD_START:PUSH AFPUSH HLPUSH DEPUSH BCLD HL, ????h ; HL:転送先アドレスLD DE, ??0Eh ; D:転送サイズHigh+1, E:次アドレス移動コマンド値(0Eh)LD BC, ??31h ; B:転送サイズのLow, C:KeyReturnポート(31h固定)DILOAD_NEXT:LD A, E ; E:次アドレス移動コマンド値(0Ch or 0Eh)の切替えXOR 02hLD E, ARETURN_WAIT:LD A, EOUT (KEY_SCAN), A ; 次のアドレスに移動IN A, (KEY_RETURN)CP 0Fh ; Pauseキー=リセットコマンド(0Fh)が返答されたか確認JR Z, DATA_LOAD_ENDSUB EJR NZ, RETURN_WAIT ; Picoからの応答がコマンドと一致するまで待つINC AOUT (KEY_SCAN), A ; カレントアドレスのデータ出力(01h)INIJR NZ, LOAD_NEXTDEC DJR NZ, LOAD_NEXTDATA_LOAD_END:LD A, 0FFhOUT (KEY_SCAN), A ;キースキャンを元に戻すEIPOP BCPOP DEPOP HLPOP AFRETEND
プログラム転送のキー割り当ては、f9~f12キーにしました。
キーが押されたら、USB Keyboard Adaptorが上記プログラムをBASICで打ち込みます
clear,&h????:a$="f5e5d5c521????110e??0131??f37bee025f7bd330db31fe0f280d9320f43cd330eda220e91520e63effd330fbc1d1e1f1c9":a=&h????:for i=0 to ??:poke a+i,val("&h"+mid$(a$,i*2+1,2)):next:call a\n
??の部分は転送するプログラムに応じてPico側で埋め込みます。
Picoは一文字ごとPIOに文字をセットして、パソピア700にキー入力させます。
その間もUSB Host処理を行い、Pauseキーが押されたら中断できるようにします。
前回のXPAC2コマンドプロンプトをf12キーに割り当てて、Picoから転送してみました。
BASICへのキー入力は最短1文字7msで1文字転送できますが、連続して入力すると入力を取りこぼすことがあるので、かなりウェイトを入れています。それでも、タイミングによっては取りこぼすことがあるので、もしハングした場合は「Pauseキー」 or 「Winキー+Pauseキー」を押すと復帰します(それでも復帰できない場合はリセット...)
SCREEN 0で実行した方が取りこぼしが少ないです。
ショートカットキーのような使い方ができるので、過去に作ったユーティリティを登録してみます。
0 件のコメント:
コメントを投稿