まごの手本舗さんのお造りになった、PC-98用のキーボードをPC/AT互換機のPS/2ジャックに挿して使う変換アダプタGKA-98ATをもう一つ作りたい。GKA-98ATに必要な部品は、PIC16F84以外は手持ちので間に合う。もうちょい新しくて付加機能のある手元にPIC16F628が幾つも残っている(とはいえ何年も前に買ったものですが)。大変ありがたいことにソースを公開して下さっています。PIC16F84をわざわざ買うのも面倒ですしピン互換ぽいので置き換えてみました。したことはPIC16F628A事始に解説頂いてるまんましただけです。参照元が見つからないので、追記すると、ポートがデフォルトでアナログになっているのでデジタルIOに変更することと、アドレス、バンクの変更です。レジスタファイルの先頭アドレス書き換えと、EEPROMアクセスの箇所だけ書き換えたら動きました。当然ながら自己責任で、トラブルが起きてもまごの手本舗さんにご迷惑おかけしないようにお願いします。最近のWindows10で動かしているcore-i7機などでもPS/2ポートがあると動きます。ただ、(そもそも活線挿抜するポートでもないですが)PCのBIOSが走る段階でPS/2に繋がってないとまったく認識されないようです。
ICSP周りを追記している2018年現在、PIC16F628も相当過去のチップになりましたが、最近のPICに手持ちのCHIPMAXは対応していないので、開発環境にPICKIT3Aを導入しました。PIC16F84Aの時点でICSPは対応のようです。当時はそれを活用するような環境は整っていないようでしたが。PIC16F628からICSPでの書き込みは対応しているので、MCLRピン周りをF少し修正するとソケットからいちいち抜き差ししなくても書き込みが可能になります。6pinのケーブルがあると書き込みに便利です。まごの手本舗さんで書かれている図に、ICSPDATとICSPCLK相当のICSP用の配線を追加しただけの図ですが、回路図をうpします。運の良いことに、追加配線の13ピンと12ピンは未使用のため、プログラムは下記修正は必要ですが、ポートの変更などは不要です。
ICSP書き込み、PICKIT接続用のピンヘッダを基板上に追加します。また、MCLRにVPPをかけるので、書き込みモードと通常運転モードを切り替えるピンヘッダをMCLRピンの隣に追加します。通常運転モードの際にはジャンパピンでMCLRをリセットIC出力あるいは4.7kを介してVDDにつなぎます。特に、VPPがかかるのでリセットIC保護のためこのジャンパは必要でしょう。LVPモードの書き込みも可能かもしれませんが検証していません。
昔購入したPS/2-USB変換のArea コンバティーノ(ベンダID 0A81 デバイスID 0205)ではうんともすんともいわず、全く動作しませんでした。最近Aliexpressでいろいろ出ているので、だめもとで買ってみたところ、どれもベンダID 13BA デバイスID 0018でGKA-98ATから変換できてあっさり動きました。ただし、何の違いなのか、1個のGKA-98ATでは動作しましたが、もう1個は怪しい動作でまともに動作しているとはいえない状態でした。大昔に作ったものなので何の違いかは分かりませんが、前者は16F628Aを使ったもの、後者は16F84Aを使ったもので動作周波数も10MHzで同じはずですが、PICの違いが原因ではなく、configurationレジスタや設定の違いなどが関係しているかもしれません。それか、mini-DIN 8pinの切り替え経由で使って信号が劣化しているなどの原因かもしれません。良く分かりませんが、動く場合がある、という程度で動作報告とします。
RADIX DEC PROCESSOR 16F84A INCLUDE "P16F84A.INC" __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON __IDLOCS H'0001' ☆☆☆書き換え後☆☆☆ RADIX DEC PROCESSOR 16F628 INCLUDE "P16F628.INC" __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON & _MCLRE_ON & _LVP_OFF __IDLOCS H'0001'
#DEFINE SYS_CLK 0 ; システムクロック 0=6.144MHz 1=10MHz ☆☆☆書き換え後☆☆☆ #DEFINE SYS_CLK 1 ; システムクロック 0=6.144MHz 1=10MHz
WAIT0 EQU 0Ch (中略) PS2_DBAK EQU 25h ; 直前に送信されたPS/2データ ☆☆☆書き換え後☆☆☆ WAIT0 EQU 20h (中略) PS2_DBAK EQU 39h ; 直前に送信されたPS/2データ
ORG 00h BSF STATUS,RP0 ; SELECT PAGE 1 ☆☆☆書き換え後☆☆☆ ORG 00h clrf PORTA ; @Chg movlw 0x07 ; @Chg コンパレータOFF movwf CMCON ; @Chg ディジタルI/Oとして定義 BSF STATUS,RP0 ; SELECT PAGE 1
EE_WRITE BCF STATUS,RP0 ; PAGE 0 MOVWF EEDATA MOVF E_ADR,0 MOVWF EEADR BSF STATUS,RP0 ; PAGE 1 BSF EECON1,B2 ; WRITE ENABLE MOVLW 55h ; EEPROM WRITE 1st PASSWORD 1 MOVWF EECON2 MOVLW 0AAh ; EEPROM WRITE 2nd PASSWORD 2 MOVWF EECON2 BSF EECON1,B1 ; WR BEGIN WRITE WAIT_EEW BTFSC EECON1,B1 ; WAIT FOR WRITING GOTO WAIT_EEW BCF STATUS,RP0 ; PAGE 0 RETURN ; ; DATA EEPROM READ ; IN: W=EEPROM ADDRESS OUT: W=EEPROM DATA ; EE_READ BCF STATUS,RP0 ; PAGE 0 MOVWF EEADR ; SET ADDRESS BSF STATUS,RP0 ; PAGE 1 BSF EECON1,B0 ; READ BEGIN WAIT_EER BTFSC EECON1,B0 ; WAIT FOR READING GOTO WAIT_EER BCF STATUS,RP0 ; PAGE 0 MOVF EEDATA,0 RETURN ☆☆☆書き換え後☆☆☆ EE_WRITE BSF STATUS,RP0 ; PAGE 1 MOVWF EEDATA BCF STATUS,RP0 ; PAGE 0 MOVF E_ADR,0 BSF STATUS,RP0 ; PAGE 1 MOVWF EEADR BSF EECON1,B2 ; WRITE ENABLE MOVLW 55h ; EEPROM WRITE 1st PASSWORD 1 MOVWF EECON2 MOVLW 0AAh ; EEPROM WRITE 2nd PASSWORD 2 MOVWF EECON2 BSF EECON1,B1 ; WR BEGIN WRITE WAIT_EEW BTFSC EECON1,B1 ; WAIT FOR WRITING GOTO WAIT_EEW BCF STATUS,RP0 ; PAGE 0 RETURN ; ; DATA EEPROM READ ; IN: W=EEPROM ADDRESS OUT: W=EEPROM DATA ; EE_READ ; BCF STATUS,RP0 ; PAGE 0 BSF STATUS,RP0 ; PAGE 1 MOVWF EEADR ; SET ADDRESS BSF EECON1,B0 ; READ BEGIN WAIT_EER BTFSC EECON1,B0 ; WAIT FOR READING GOTO WAIT_EER MOVF EEDATA,0 BCF STATUS,RP0 ; PAGE 0 RETURN
Winmergeで作ったパッチファイルをうpして置きます。