2025年3月14日金曜日

USB Keyboard Adaptorからのプログラム転送

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 Control
MEM_MODE EQU 3Ch ;Memory Mode
KEY_SCAN EQU 30h ; (out) KeyScan Data
KEY_RETURN EQU 31h ; (in) KeyReturn Data

ORG 0F000h
; データ読み込み処理
DATA_LOAD_START:
PUSH AF
PUSH HL
PUSH DE
PUSH BC

LD HL, ????h ; HL:転送先アドレス
LD DE, ??0Eh ; D:転送サイズHigh+1, E:次アドレス移動コマンド値(0Eh)
LD BC, ??31h ; B:転送サイズのLow, C:KeyReturnポート(31h固定)
DI
LOAD_NEXT:
LD A, E     ; E:次アドレス移動コマンド値(0Ch or 0Eh)の切替え
XOR 02h
LD E, A

RETURN_WAIT:
LD A, E
OUT (KEY_SCAN), A ; 次のアドレスに移動
IN A, (KEY_RETURN)
CP 0Fh ; Pauseキー=リセットコマンド(0Fh)が返答されたか確認
JR Z, DATA_LOAD_END
SUB E
JR NZ, RETURN_WAIT ; Picoからの応答がコマンドと一致するまで待つ

INC A
OUT (KEY_SCAN), A ; カレントアドレスのデータ出力(01h)
INI
JR NZ, LOAD_NEXT
DEC D
JR NZ, LOAD_NEXT

DATA_LOAD_END:
LD A, 0FFh
OUT (KEY_SCAN), A ;キースキャンを元に戻す
EI

POP BC
POP DE
POP HL
POP AF
RET

END
プログラム転送のキー割り当ては、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 件のコメント:

コメントを投稿