じょんのブログ

じょんのブログ

NEC PC-88VA2を修理(?)している記録です。

↓こちらの話の続きです。

 

1.メカニカルロックキーの扱い

PC-88VAのキーボード、というかPC-8801系キーボードは、CAPSキーとかなキーが、メカニカルロックキーになっています。

そして、キーボードから本体へは、キーのMake/Break、つまり、押した時と離した時にキーコードを送るようになっていす。

このままの仕様だと、本体側は、電源ON直後にメカロックキーがONなのかOFFなのか知るすべがなく、最初にキーを入力した時に、何を表示すべきか困ることになります。

この対策として、電源ON時に、メカニカルロックキーがロック状態、つまり押下されたままの状態だった場合は、そのキーのMakeコードを本体に送るようになっていたようです。

 

しかし、よく見ると、CAPSキーやかなキーのコードを送る前に00h(ESCキーのMakeコードに相当)も送っているように見えることがあります。ESCキーのMakeを送っているのは意味がわからないので、キーボードの状態を何等かのビット並びで送っているのか、電源ONによるノイズなのか、或いはまだバグが残っているのか、よくわかりません。

ご存じの方、いらっしゃいましたら、情報求む!

2. 複数のキーボードを接続した時の動作

PC-88VAに複数のキーボードなんて接続しないかもしれませんが、USBって、ハブが使えるので複数のキーボードを接続することができるんですよね。

そして今回使っている「かんたんUSBホスト」は、ハブ経由で複数のキーボードを接続することに対応しています。

このへんのルーチンはそのまま利用すれば、PC-88VAに複数のキーボードが接続できて、なんか面白いので、そのままにしています。

 

ただし、またしてもCAPSキー/かなキーが問題になります。これらのキーのロック状態は、キーボードのLED状態には全く関係なく、本体内のキーボードBIOSで管理しています。

複数のキーボードでバラバラにCAPSキー/かなキーをON/OFFすると、本体内部の状態とキーボードのLED表示がズレてしまいます。

さすがにこれでは困るので、接続されているいずれかのキーボードでCAPSキー/かなキーを操作したら、接続されているすべてのキーボードのLED状態を更新する必要があります。

「かんたんUSBホスト」では同期するかバラバラに操作するか選択できるようになっていますが、PC-88VAキーボード変換器としては、同期動作一択になります。

3.マウスも接続する?

キーボード変換器としては、まあだいたい完成しました。

一番面倒なUSB接続の部分を「かんたんUSBホスト」の機能をそのまま利用したので、比較的簡単にできてしまいました。

今後のために、もう少しきちんと資料を整理して残しておこうと思います。

 

さて、かんたんUSBホストでは、元々通信以外に、他のI/Oピンを使って色々と設定を変更できるようになっていましたが、PC-88VA用USBキーボード変換器としては、そういった設定機能はほぼ必要ありません。

これらI/Oピンによる各種設定、およびSPI通信を使った設定機能のあたりは、今回の変換器では、ザックリと削除したので、今のところ、I/Oピンは余っています。

 

この余ったピンを活用すれば、USBマウスとかUSBジョイスティックも接続できてしまうような気がしてきました。

まあ、とりあえず先にマウスかな?

因みにキーボードはシリアル通信、しかも片方向通信なので、データ線は1本だけでしたが、マウスの動作には、入力ピンが6本(ボタン用2本、移動データ用4本)必要です。

まあ、気が向いたら考えてみようかな。

↓だいぶ前の記事ですが、この記事の続きです。

 

久々の投稿です。

ゴールデンウイークに入って時間ができましたので、今日は調子の悪いPC-88VA2のキーボードを分解して掃除…ではなく、キーボード変換器を作っていこうと思います。

はい、前回は、黒井電波さんから発売されていた(現在品切れ中。再販予定は不明。)『かんたんUSBホスト (HIDキーボード用)』を使ったら、比較的簡単にUSBキーボードをつなげられるんじゃないかな?

という話でした。

 

1. 環境構築

記事の中では、そのうちソースコードを公開する予定と書いてありますが、既に公開されています。

q61org/CH559_EasyUSBHost: Firmware for CH559 that converts USB keyboard inputs to ASCII text, with USB hub support.

 

ソースコードは、Ubuntu上で、SDCCというCコンパイラ向けに書かれているので、私のように普段Linuxを使わない人は、まず環境を作成するところから始めなければなりません。

Linux環境の構築って、今までも何度か挑戦しましたが、誰かが書いた記事をなぞって、違いがあるとお手上げの繰り返しでした。

でも大丈夫。今の世の中、チャッピーくんという、(よく嘘つくけど)頼れる味方がいます。

誰かが書いた記事と多少違っても、お手上げにはならなくなりました。

いい時代になりましたね!

 

で、方法は色々とあるのですが、今回はMSYS2のMinGW64環境を構築しました。

Linux用に書かれたソースコードを再コンパイルして、同じ挙動をするWindows上の実行ファイル(*.exe)を作成する環境です。(違っていたらご指摘ください。)

bash.exeもあって、Linuxの基本ツール類もWindows形式の実行ファイル(*.exe)になってそろっています。

つまり、完全なるWindows環境なのですが、何となくLinuxを使っているような気分になれる、という代物です。

 

「かんたんUSBホスト」は、中国の半導体メーカーである南京沁恒(WCH)のワンチップマイコンCH559Lが使われています。

このMPUは、キーボードコントローラ等でよく使われているインテル8051のCPUコア(MCS51)を採用していますが、機能・性能共に、大幅に改良・拡張されたものになっています。

拡張メモリもチップに内蔵されており、「かんたんUSBホスト」ではスタックを拡張メモリに配置しています。

ここで1つ問題があります。スタックを拡張メモリに配置すると、C言語の関数呼び出しインタフェースが変わってしまいます。しかし、そのインタフェースのライブラリはバイナリで提供されておらず、必要ならば自分でソースファイルをコンパイルして作成しなければなりません。

 

これがなかなかたいへんでした。

やりたいことはライブラリのソースコードをコンパイルしたいだけなのですが、.configureを実行すると、コンパイラ本体からすべてコンパイルしようとしてしまい、そうするとgccが無いとか、なんちゃらライブラリが無いとか、色々と文句を言われます。

Makefileを作ってもらうために.configureの実行は必須なので、困ったものです。

しかし、コンパイラ本体のコンパイルは通らなくてもOK。そんなのは公式から実行形式をダウンロードしてくればよいのです。

ただし、ここで注意しなければならないことがあります。

公開されたSDCCの最新の実行形式ファイルと、最新のソースコードのバージョンが微妙に違っていたのです。

というか、そもそもコンパイルエラーが出ていたのはこれが原因だったようです。

ソースコードの最新版Ver.4.5.0に合わせて実行形式もVer.4.5.0を探して再インストール。これでやっとライブラリをコンパイルする環境が整いました。

 

どこに説明があるのかサッパリわかりませんでしたが、拡張メモリスタック配置版のライブラリをコンパイルするには、

make model-mcs51-xstack-auto

とターゲット指定してビルドすると良いそうです。

コンパイルが完了したら、sdcc-4.5.0/build/device/lib/build/large-xstack-autoディレクトリに所望のライブラリが作成されるので、これを/msys64/mingw64/share/sdcc/lib/large-xstack-autoディレクトリに格納すれば完了なのだそうです。

 

…って、そんなのわかるかよ(怒)!

こんなの自力では到底たどり着けなかったと思います。チャッピー様様です。

 

ちなみに、MSYS2には「~環境のbash」を実行するラッパーアプリが、何種類も用意されています。

でも、今回はVS Codeを使って編集をするので、ラッパーからではなく、VS Codeのコンソールから実行できるとベストです。はい、そしてここでもチャッピー登場!

コンソールでCtrl+Shift+Pでユーザー設定(*.json)を開いて、

"MSYS2 MINGW64": {
  "path": "C:\\msys64\\usr\\bin\\bash.exe",
  "args": ["--login"],

  "env": {
    "MSYSTEM": "MINGW64",
    "CHERE_INVOKING": "1"
  },
  "overrideName": true
}

を適切な場所に追加すればよいそうで…。

こちらも以前だったら間違いなく諦めていた内容ですね。

これで無事、VS Codeのコンソールからmakeできるようになりました。

2. ソースコード

さて、やっとソースコードの内容を見る段階に入りました。

元々「かんたんUSBホスト」はUSBキーボードから入力したデータをシリアルポートにテキストで出力するというものです。

USBキーボードは一定の時間間隔で、以下の8バイトのデータを垂れ流してきます。

ofs. val.
0 modifier
1 reserved
2 usageID 0
3 usageID 1
:
7 usageID 5

modifierは、いわゆるシフトキー、Ctrlキー等の状態です。ビット毎に以下のようになっています。

bit 7 6 5 4 3 2 1 0
key GUI(R) Alt(R) Shift(R) Ctrl(R) GUI(L) Alt(L) Shift(L) Ctrl(L)

reservedは使われていません。0が入っています。
usageIDはキースキャンコードです。6バイトあるので、6つまでキーの同時押しを検出できます。

 

対して、PC-88VAのキーボードの方は、キーのMake/Breakのタイミングで、1バイトのデータを送ります。

1バイトデータの内容は、bit0~6が、7ビットのキースキャンコードで、bit7はMake=0/Break=1です。

つまり、変換器は、USBキーボードから送られてくるキー状態を前回値と比較して、状態の変化分をPC-88VA本体に送信する必要があります。

因みに、PC-88VAでは、modifierのキーも他のキーと変わりません。

なので、modifierキーも同様にMake/Breakを検出してキースキャンコードを送ればよいということになります。

ちょっと考えなければならないのは、[CapsLock]キーと[かな]キーです。

PC-88VAではこれらのキーはメカニカルロックになっていて、1回押すとMakeコードが発生して押しっ放しの状態になります。もう1回押すとBreakコードが発生してキーが解放されます。

対してUSBキーボードでは、キーを押す度にLEDがON/OFFしてロック状態を変化させます。キーの押下状態からMake/Breakを監視するのは変わりませんが、Makeの時にLED状態をトグルして、LED状態に応じてキースキャンコードを送信します。

 

あとはキーマップですが、これはクラシックPC研究会さんのクラシックキーボード88VAを参考にさせていただきました。

PC-88VAにあるのにUSBキーボードに無くて困るのは、テンキーの[,]と[=]ですね。

これらはちょうどファンクションキーが2個余っているので、F11, F12に割り当てられています。

まあ、正直、私はテンキーを使わない人なのでどうでも良いのですが…

 

主なキー変換は以下の通りです。

USBキーボード PC-88VAキーボード
半角/全角 全角
Windowsキー PC
Alt GRPH
無変換 決定
変換 変換
カタカナ/ひらがな かな
Menuキー PC
F11 テンキー[,]
F12 テンキー[=]
Print Screen 画面コピー
Scroll Lock (割当て無し)
Pause Break 停止
Insert 挿入
Delete 削除
Home 画面消去
End 説明
Page Up ROLL DN
Page Down ROLL UP
Num Lock (Num Lock)

 

LEDの方は、CapsがそのままCAPS状態、Scrollが[かな]キー状態としています。

Num Lockについては、クラシックPC研究会さんの変換器ではNum Lockキーがテンキー[,]に割当てられていますが、私はそのままNum Lockキーとしました。

実は私が持っているUSBキーボードはコンパクト系ばかりで、Num Lockキーが使えないとテンキー入力に困るからです。困るキーボードもあるということで、そのままNum Lockキーとして残します。本体にキーコードは送りません。

あと、クラシックPC研究会さんのキーバインドでは、Scroll LockキーもPCキーに割り当てていますが、私はちょっと違和感を感じるので、割当て無しにしています。こちらも本体にキーコードを送りません。

 

3.進捗状況

まだ時々止まっちゃうことがあるので、何かバグがあるのだと思いますが、普通の操作をする限りにおいては、だいたい問題なく動作しているようです。

電源ON時にWindowsキーを押しながら起動すれば、ちゃんと初期設定画面にも移行します。

とりあえずもう少しデバッグは継続する予定です。

冒頭の写真の通り、まだブレッドボード状態なので、子亀基板化とか作って、ちゃんとした変換器にしたいな…。

 

反応の悪い元のキーボードの掃除とかスイッチの交換も真面目に考えてみてもいいかもしれませんが、物理的に形の合うような、都合のいい交換部品は無いかもしれません。
そんな時にこれがあれば、キー入力の問題は解決です。

既にハードウェアが入手困難なので皆さんに使ってもらうのは難しいかもしれませんが、誰かが同じことをしようとした時の参考になれば幸いです。

 

この続きは↓こちら

 

↓この記事の続きです。

 

いきなりですが、まずはお詫びから。

前回の投稿で↓の記事を引用させていただきました。

 

 

この投稿サイト名Zennを投稿者さんの名前と間違えて、「Zennさんの記事で…」と書いていましたが、この記事の投稿者さんの名前はMCtekさんでした。

成果物を利用させていただきながら、名前を間違えるなんて、本当に申し訳ございません。

お詫びとを訂正を申し上げます。(前の投稿は修正済み)

 

さて、MCtekさんの記事を参考に手順を追って、SDカード→IDE変換器のファームウェア書き換えをやってみました。

 

まず最初にやるべきことは、ROMライターとSOP8テストクリップの購入です。

これはAmazonから購入しました。

 

 

このライターキット、Amazonでは販売店違いで同じものをよく見かけます。

とにかく安いんだけど、正直言っておすすめできません。

あまりにも品質が悪すぎる!

 

まず何の保護材もなく静電防止袋ごと紙封筒に入れて送ってきており、おそらく輸送中の衝撃か何かで、テストクリップインタフェース基板のピンが曲がっていました。

これは運送会社の問題というより、軽い負荷で曲がってしまうようなものを何も保護せずに紙封筒に入れて送っていることが問題だと思うんですよね。ピンをウレタンに刺して送るだけでも全然違うのにねぇ。

 

そして、最初に購入したROMライターはUSBデバイスとして認識せず返品交換。

交換品の2台目もピンが曲がっていました。

この2台目もUSBの認識に問題が無いわけではなく、時々認識しません。全く認識しない1台目よりはマシという程度です。

基板上にはRUN LEDがありますが、このLEDは「あまり」点灯しません。USBコネクタの差し方か何かの都合で、気まぐれに点灯する時があるようですが、内部がきちんと動作しているかどうかとは無関係のようです。

 

そしてテストクリップですが、こちらは「そういうもの」なのかもしれませんが、ICのピンとの接触がかなりシビアです。1.27mmなんて、ICチップとしてはそれほど微小というわけでもないと思いますが、やってみると、簡単に隣のピンに接触してしまいます。

テストクリップのプラスチック部分の先端形状を工夫すれば、SOP8のICにカチッと嵌るクリップができそうな気がしますが、なんでこう、クリップを挟む人任せにしてしまうのでしょう。

 

まあ、ROMライターへの文句はこのぐらいにして、作業内容の話に戻ります。

書き換えるべきファームウェアは、MCtekさんの記事の中で色々とリンクが張ってありますが、結局のところ、↓以下のBOOTHのページからローダを持ってくるのが正解のようです。

 

 

Windows, Linuxのどちらでも処理ができるようにWindowsのバッチファイルとLinuxのシェルスクリプトの両方が用意されています。

WindowsのバッチファイルはCmdとPowerShellとで多少文法が違いますが、どちらでも動くのかな?その辺、確認はしませんでしたが、少なくともWindows11のPowerShell上では実行してうまく動きました。

BOOTHのページからダウンロードしてきたFWPatcher_25416.zipの中に入っている patcher.bat を実行すると、gitを使ってInternet Archiveから元となるファームウェア(V1.5B17)をダウンロード、更にMCtekさんの差分(Rev25416.patch)をダウンロードしてパッチを当ててくれるようです。

実行環境にcurl, gitがインストールされていない場合は、まず先にそれらのインストールが実行されます。

私は、最初、このインストールが実行された時に、ファームウェアをダウンロードしているのだと勘違いして、処理が終わったのにROMファイルができていなくて、焦っていました。

更にgitのインストール後は、いったんPowerShellを閉じて再度立ち上げる必要がありますが、そもそもそんなことが起こっているという認識がなかったので、ここでしばらく悩んでしまいました。

画面にはウィンドウを閉じてから再度実行するようにメッセージが出力されていたのですが、インストーラ自体がインストール関連のウィンドウをいくつか開いていたので、それらが閉じたからいいのかな?と思ってしまったのです。

わかってしまえば『なんだ、それだけのことか。』という話ですけどね。

PowerShellを再起動後、再度、patcher.batを実行。無事にパッチを当てて、ROMファイル「MCtek PC-9800 SD Adapter V1.5_Rev25416.bin」ができました。

 

続いて書き込みです。

ROMライターとテストクリップは、↓のようにつなぎます。

ポイントは以下の通り:

  • 16ピンソケットのUSBコネクタ側の8ピンに差す。
  • 1番ピン(赤いケーブル)の方向を確認し、USBコネクタとは反対側になる方向に差す。
  • 半田付けの甘さを考えると、USBコネクタを直接パソコンに差すのではなく、負荷をかけないように短い延長ケーブルを経由して繋いだ方が良いかも。

対象となるROMは下の画像の赤い丸で囲んだチップです。

拡大して見てみるとこんなふうに書いてあります。

ChatGPTに聞いたら、PFLASH社のPm25LD512かPMC社のPM25LD512、またはその互換品だろうとのことでした。

mが小文字で書いてあるんだから、普通にPFLASH社のPm25LD512なんじゃないの?

パッケージサイズはSOP8、インターフェイスはSPI、容量は512Kbitつまり、64KiB(65,536バイト)です。

 

テストクリップをつまむ方向はこの方向です。(赤いケーブルの位置を確認)

前にも書きましたが、このテストクリップでつまむのが、かなりシビアです。

うまくつまめていないと、ROMライターがUSBデバイスとして認識されなくなります。

(隣り同士のピンが短絡してハードウェア的にヤバい状態かもしれない。)

ここはもう少し改善していただきたいですが…

こんな安い製品に文句言っても仕方ないのかもしれませんね。

 

ROM焼きのアプリは、AsProgrammerを使いました。

 

 

よく使われている一般的なツールらしいです。(その割にはメッセージの多言語化が酷い。)

GitHubからダウンロードしたZIPファイルを解凍するだけ。特にインストールとかは必要ありません。

解凍したファイルの中に AsProgrammer.exe というファイルがあるので、そのまま実行します。

ライターのチップにはCH341Bと印刷されていますが、[ハードウェア]の選択肢に選択肢が無いので、CH341aとしました。特に問題はなさそう(?)です。

ROMは、前に書いた通り、「PFLASH社のPm25LD512かPMC社のPM25LD512、またはその互換品」とのことなのですが、[IC]→[SPI]→[PFLASH]の中に、[Pm25LD512]という選択肢がありません。

[IC]→[SPI]→[PMC]→[PM25LD512]はあるので、そちらにしました。

「いや、印字されている文字的には、Pm25LD512だろう!」とは思いましたが、無いものは仕方ない。

実際にやってみたら、PMC PM25LD512の設定で、普通にROMの読み書きができたのでヨシとします。

 

無事、SD35VC0のファームウェアをPC-98対応パッチバージョンに書き換え、SDカードの抜き差しとかリセットとかなく、普通に起動できるようになりました。めでたし、めでたし。

(この画像見ても普通に起動できるようになったかどうかはわかりませんよねw)

 

MCtekさん、本当にありがとうございます!