2022年4月28日木曜日

FM77AVにUSBキーボードを接続する試み(その5 完成に近づく)

 

ようやく完成に近づいたようで、使い勝手がかなり良くなりました。

前回の「その4」で一応完成と書きましたが、残っていた2つの不具合のうちの「Shiftキーを押すとシフトモードに入ったままになってしまう」については、結構使いにくいので、解消を試みました。


ハードは前回と同じです

前回はPIC24FJ64GB002側のUSB関係のプログラム中の app_host_hid_keyboard.c を手直ししただけだったのですが、それだけでは上記の不具合を解消できなかったので、ATmega88側のプログラムも手直しすることになりました。

まず、PIC24FJ64GB002側は今回も関数 App_ProcessInputReport(void) の手直しですが、修正点は4つの修飾キー(Ctrl, Shift, Alt, Winキー)に対応するようにしたことと、その修飾キーの出力タイミングを変えたことです。それを以下に示します。


   

 

次に、ATmega88側のプログラムですが、以前のものは元にしたPS/2用変換器のものを最小限の手直しだけで使用していましたが、それを見直しました。手直ししたのはmain.c 中の関数 outserialdata(unsigned cha kcode) だけですが、修飾キーの取り扱い方とその出力タイミングを変更しています。それを以下に示します。


 
 

以上のように修飾キー(Ctrl, Shift, Alt, Winキー)の出力タイミングを変更することでシフトキーの問題は解消できました。
また、もう一つの不具合ですが、実際に使用してみると6キーロールオーバーのはずが4キーロールオーバーになっているという件は実用上は特に問題にはならないようです。


残っている課題はひとつ


ということで、残る課題はキーリピートが有効ではないということだけということになりそうです。
実用上はキーリピートはぜひ実現したい機能なのですが、上記の App_ProcessInputReport(void) のリストを見ていただくと分かりますように、元にしたMicrochipのサンプルプログラムがキー入力の変更があった場合にそのキーを出力する、つまり、キー入力の変更がなければ出力されないという仕様になっているので、このサンプルプログラムを元にする限りキーリピート機能は実現できないように思えます。
どうしたものかと思案中です。。。

【蛇足】
最近はプログラムの書き込みツールとしてもっぱらPICkit4を使っているのですが、これは以前使用していたPickit3とは異なり、Atmelのチップにも対応しているので、今回のような場合にはとても便利です。
画像で分かりますように、PICとATmegaの両方に書き込みピンを用意してあるので、6ピンケーブルを差し替えるだけで両方の書き込みに対応できます。(PICkit4の8ピン出力のうちの6ピンのみを使用しているので、PICとATmegaとで6ピンケーブルを1ピン分ずらすことと、ひっくり返して装着する必要がありますが。)
さらに、ATmegaの書き込み時には基板からの電源供給にすれば、書き込み後の動作時にもPICkit4を外さなくても動作に支障がありません。(何故かPICの書き込み時には電源をPICkit4からの供給にして、FM77AVの電源を切る必要があるのが残念ですが...)
今まではPICはPickit3で、AtmelはTL866ⅡPLUSを使用していましたが、かなりの場合にPICkit4だけで間に合いそうです。

2022年4月10日日曜日

レトロエクスプレス6号のお知らせ

4月29日にレトロPCのイベント「レトロエクスプレス6号」が開催されます。

はせりんさまから声をかけていただきまして、レトロPCイベント「レトロエクスプレス6号」に、今まで製作してきましたFM-7/77関係の製作物をいくつか展示させていただくことになりましたので、ここでイベントの紹介をさせていただきます。

イベント名称:レトロエクスプレス6号
日時:2022年4月29日11:00~17:00
場所:東京都大田区産業プラザPiO小展示ホール(京急蒲田駅から歩道橋で直結です)

詳しくはこちらをご覧ください。

私の製作物は下記のFM-7/FM77AV関係のブースの一部に置かせていただきます。


展示ブースの紹介

会場に足を運んでいただき、上記のブースにも訪れていただけましたら幸いです。

なお、参加されるサークルの一覧はこちらで見ることができます。

よろしくお願いいたします。


2022年4月5日火曜日

FM77AVにUSBキーボードを接続する試み(その4 一応完成)

一応、 実用になるレベルに出来あがったようです

昨年末に「その3」を報告して以来、その間、手直しをしなければと思いつつそのままになっていたのですが、ようやく見直すことができました。

手直しが必要だった点は、Shiftキーを押した後にいくつかキーを押すとそのShiftキーの効果が無くなったりすることがあったことと、USBキーボードは仕様上6キーロールオーバーが可能なのですが、それが実現できていなかったことです。

もう一度プログラムを見直した結果、AppProcessInputReport(void)関数をほんの少しだけ書き換えることで上記の2点を解決することができました。

出来上がったものを下図に示します。

前回報告した基板にRJ-9のコネクタを追加しました。USBホスト機能を持つPIC24FJ64GB002でUSBキーボードからのキーコードを処理したものをATmega88Aに送って、77AV用のキーコードに変換しています。

PICのみで全ての処理をさせるのが理想ですが、なかなかうまく動作させることができないのでこのような構成になっています。


手配線です


ケースに入れてみました。
ケースはタカチの75x50x30mmのものです。


ケースに収めた状態


77AVとの接続には電話機の受話器用のカールケーブルを使っています。


キーボードと77AVに接続

回路は前回示したものとほとんど同じです。


RJ-9コネクタを追加しています

プログラムの変更部分を示します。変更したのはこの関数のみです。

 
 

最後に

現在分かっている不具合は次の2つです。
Shiftキーを一旦押すとシフトモードに入ったままになってしまう。(解除するにはNumLockキーを押します。)
USBキーボードの仕様では6キーロールオーバーのはずですが、何故か4キーまでになっている。
以上の点を承知して使えば特に問題はないので、これで使い続けていこうと思っています。

2022年4月2日土曜日

FT245高速通信カードの改造の試み

 秋月電子のFT245モジュールでなくFT245RLチップを使ってみました

一時期ですが秋月電子でFT245モジュールが欠品だったこともあり、また、モジュールを使わなければもっとコンパクトになるのではないかと思って、モジュールではなくチップを使ったカードを試作してみました。

モジュールをチップに置き換えるだけならわざわざ基板を起こす必要はないのですが、

(1)今までDIPのICのみを使用してきたが、表面実装部品を使ってみたい。

(2)PCとの接続ケーブルでmini-USBコネクタではなくmicro-USBコネクタを使いたい。

(3)回路を変更する実験をしてみたい。

のような意図もありました。

(1)ですが、最近はDIPのICよりも表面実装部品を使う方が作りやすい傾向もありますので、ここらで表面実装部品に慣れておきたいということです。

(2)ですが、最近はmicro-USBコネクタの方が普通になっているように感じています。

(3)ですが、FM-7からWindowsPCへの通信時に、WindowsPCの準備ができていない時でもFM-7がデータを送り出してしまうので、これを何とかしたいという事でFT245RLのTXEをフラグとしてチェックする形式に変更することを考えました。


表面実装部品を使うのは初めてなのでネットで情報を集めてみると、アマチュア的にはヒートガンかホットプレートを使用するのが普通のようですが、先日、基板から部品を外すためにPOT-21Cという小型ハンダ槽を購入したので、これを使えばホットプレートの代わりになるのではないかと考えて試してみることにしました。

これが入手した小型ハンダ槽です。温度は500℃まで上げることができます。小さな部品はもちろん、40Pコネクタ程度の大きさのものなら、数秒であっさりと基板から外すことができます。


小型ハンダ槽
ハンダ


このハンダ槽の上に5mm厚のアルミ板を載せて、ホットプレートの代わりにするというわけです。まずは左下のmini-USBコネクタと小さなフェライトインダクタ(FB)をクリームハンダを使用してハンダ付けができるかどうかを試してみました。
温度を400℃に設定し、クリームハンダを塗った上に部品を載せた基板を置いてみました。
結果ですが、1608サイズのFBは綺麗にハンダ付けされていました。しかし、USBコネクタはFBよりも熱容量が大きいせいか仕上がりが不十分だったので、後で半田ごてで補修しました。




次にメインであるFT245RLのハンダ付けに挑戦しました。温度を350℃に下げて、クリームハンダを塗ってICを載せて置いてみました。
結果ですが、うまくハンダ付けはできませんでした。350℃に下げたのが原因だったようですが、400℃に上げる勇気はなかったので普通にはんだごてですることにしました。
ホットプレートを使用する場合は蓋をするので、カップのようなものをかぶせるとうまく行くのではないかと思っています。次回挑戦する際には蓋を用意してやってみます。



FT245RLをハンダ付け


できあがったのが下の基板です。
追加のリード線が見苦しいですが、これは何とFT245RLのGNDを結線し忘れていたためです...(相変わらずドジばかり...)


完成した基板

とりあえず、ICの細い足に何とかリード線をハンダ付けして動作させることができました。
(SSOPですので0.65mm間隔の足にハンダ付けするのは大変でした...)

以上は元のFT245モジュールを使用した回路をそのままFT245RLに置き換えただけなので、ポリヒューズなどの余計な部品が載っていますが、電源をFM-7から取るようにすれば部品をいくつか省略できます。

次に回路の変更ですが、74LS244の15ピンに接続されているFT_DB6をカットして、代わりにFT245RLの22ピンのTXEを接続するだけです。
つまり、データのbit7がRXFであるのに加えてbit6をTXEにして、ソフトで読めるようにするわけです。

実は、もう既に既存のカードを改造し、それに対応してソフトも変更してありました。そのカードが下の画像のものです。LS244の15ピンを抜いてTXEに接続してあります。


DB6をTXEに変更したカード


ソフトの変更ですが、FM-7が受信する場合にはbit7(RXF)をチェックしてLowになったらデータを受信しているのと同様に、送信する場合にはbit6(TXE)をチェックしてLowになったらデータを送信するように変更することになります。

改造の結果

(1)表面実装部品を使ったおかげで、基板にかなり余裕ができましたので、上手く設計すれば他の回路も同居させることもできそうです。
(2)USBコネクタもmini-USBとmicro-USBの両方を搭載しても余裕です。
(3)FM-7からの送信時にもフラグをチェックするように変更してみたわけですが、実際にはそれ程のメリットは感じられませんでした。むしろ、何かの原因で通信経路の不調が生じた場合にハングアップ状態になってしまうのはデメリットかもしれません。


ということで、次回製作予定のプリント基板は下図のように切り替えスイッチを付けてどちらのモードでも使えるようにしようと思っています。


次回製作予定の基板


今回、初めて表面実装部品を使用してみましたが、フェライトビーズは問題なくハンダ付けができたので、同様な形であるRやCなどもこのような方法でできそうです。あとはもう少し試行錯誤しながらICなどの部品もハンダ付けできるような条件を見出したいと思います。


2022年3月1日火曜日

FM-7用の32Pスロット拡張基板の製作(第4作!)

 32Pスロット拡張基板の第4作目です(これで最後に)

FM-7の背面の50P拡張コネクタを利用して本体には2個しかない32Pスロットの拡張を試みてきましたが、途中での設計変更やコネクタのフットプリントの作成ミスなどがあり、何回も作り直してきましたが、ようやくこれで終わりになりそうです。

製作したのは下画像の2枚です。


製作した基板


下が50Pと32Pを変換するベース基板で、32Pスロットには出ているのに50P拡張コネクタにはない2.45MHzのクロック信号の生成回路のパターンが用意してありますが、このクロックを必要とするのはRS232Cカードのみですので、今のところ実装していません。また、上部の50Pコネクタは私の常用機であるFM77AV40SXのコネクタと同じピン配置で、ここに自作のROM/RAMディスクカードを接続する予定です。このために2枚構成となっています。


ベース基板


上が目的の32Pスロット基板です。使用した32Pコネクタは手持ちの圧着端子型のもので、これ用の取り付け穴と通常の基板取り付け用のコネクタや普通のピンコネクタなど用の取付穴を並べてあります。一応3枚まで装着できるようにと考えました。

32Pコネクタ基板


回路図を示します。

32Pスロット基板

50P-32P変換基板



実際にFT245カードや512KBRAMディスクを装着した様子です。

基板を装着した様子

バッファを付けていないので、実際に何枚のカードを装着できるかは不明ですが、今のところ本体側にFDCカード、拡張基板側にFT245カード、512KB RAMディスクカードの計3枚のカードを装着して正常に動作しています。

なお、蛇足ですが、カードを1枚だけ増やしたい場合には、下画像のような50Pコネクタと32Pコネクタ(メス)を単純に信号線を合わせて結線したものでも間に合います。

カード1枚ならこれでもOK

これは画像の上にあるような短いケーブルのついた50Pコネクタと手元にあった40Pのケーブル配線用のメスコネクタを、余分な8ピン分を削って32Pにして結線したものです。(32Pのコネクタは入手が困難ですが、この40Pのケーブル配線用のメスコネクタFCN-361J040は制御用装置で使用されていますので今でも入手できます。)

以上、32Pスロットの拡張の試みの報告でした。

2022年2月12日土曜日

F-BASIC用のWindows版仮想ドライブ構築ソフトの改良

F-BASIC V3.0用のWindows版仮想ドライブ構築ソフトを手直ししました

【2022年2月16日追記あり】動作しないソフトがあることについて末尾に追記しました。

2021年7月8日のブログ「FM-7/77用の改良版I/O拡張基板用のF-BASICドライバを作成」で紹介した仮想ドライブ構築ソフトですが、ブログに書きましたような起動時の不具合があったことと、RS232Cカード使用のものだった点を改良しましたので報告します。

まず、起動時の不具合は初期化時に必要な表RAMと裏RAM間でのドライブ番号の連携を忘れていたのが原因でした。

次に、最近はほとんどRS232Cカードは使用しておらず、もっぱら「思い付きハードでソフトに七転八倒」さんが開発されたFT245カードを使用しているので、このカードに対応させることにしました。

FM-7側は元のRS232C用の1バイト送受信ルーチン(RCVCH,SNDCH)を2月11日のブログ「高速通信カードFT245の使い方の紹介」で説明したようなFT245用ルーチンに置き換え、WindowsPC用のFbasDrvWin.exeも同様に書き換えることでFT245にも対応したものができあがります。

FM-7側のドライバ RDSKWINF は裏RAMに常駐する関係で、FT245カード専用としてあります。(RS232Cカードの場合は以前紹介したWINDRVU7をそのまま使用できます。)

WindowsPC側の FbasDrvWin.exe はRS232Cカード、FT245カード兼用になっており、その切り替えは起動時に読み込む FbasDrvWin.ini ファイルにFTもしくはRSのどちらが記述されているかで行います。


FT245カードで動作している様子を示します。

WindowsPC側はFbasDrvWin.exeで、FM-7側は今回作成したRDSKWINFを実行しています。


FT245カードで動作

最上行に --- use FT245 Card と表示されています。

これで実ドライブ0,1に加えてWindows上の仮想ドライブ2,3が実ドライブと同じようにF-BASICから使用できます。加えて、Windows上のファイルをこの仮想ドライブ中のイメージファイルに書き込んだり、逆に読み出したりができますので、実ドライブとの間でのファイルのやり取りも自由にできることになります。


Windows上の動作画面

もちろん、RS232Cカードでも動作します。

WindowsPC側は同じくFbasDrvWin.exeで、FM-7側は以前作成したWINDRVU7を実行しています。38400baudで動作しています。





最上行に --- use RS232C Card と表示されています。
使い方はFT245カードの場合と全く同じです。


RS232Cカードでの動作画面


FT245カードとRS232Cカードの切り替えはFbasDrvWin.iniファイルの13行目で行います。FTと書けばFT245カード使用に、RSと書けばRS232Cカード使用に設定されます。


iniファイルの内容


以上で紹介した新版のFbasDrvWin.exe(Ver1.41)、FbasDrvWin.ini、FT245カード用のRDSKWINF、以前紹介したRS232Cカード用のWINDRVU7をOneDriveに上げておきます。(使い方の説明も含まれています。)

なお、RS232Cカード用のWINDRVU7のインストール及び使用法については2019年9月25日のブログ「FM-7/77のF-BASIC用の仮想ドライブ構築ソフトが完成」をご覧ください。


【2022年2月16日追記】

本ソフトはF-BASICのBIOSのディスク関連の8(RESTOR)、9(DWRITE)、10(DREAD)を置き換えていますので(8は単に無視)、BIOSを通さずにディスクファイルを扱っているソフトは正常に動作しません。

F-BASICのシステムディスク中の富士通製のユーティリティの特に機械語サブルーチンはBIOSを使用せずにROM内ルーチンを使用してディスクを扱っているので、殆どが正常に動作しません。(動作しているように見えるものもありますが実際には正常な結果が得られなかったり、途中で異常終了したりします。)

しかし、Windows上の仮想ドライブの使用目的の殆どは、FM-7と仮想ドライブとの間でのファイルのやり取りにありますので、ファイルのコピーができれば充分です。コピーソフトとして私は「SFCOPY(SUPER FILESCOPY V2.0)Oh!FM 1987年5月号」を使用しています。これはコピーするファイルを画面上で選択できるので非常に使い易いものです。これを用いて仮想ドライブ上のファイルを実ドライブにコピーしてしまえば、後は富士通製のユーティリティも自由に使えることになります。

・・・追記ここまで


2022年2月11日金曜日

FM-7用の512KB RAMディスクカードの紹介

 FM-7用の512KB RAMディスクカードを紹介します

【3月26日訂正】リンク先を変更しました。

これは「思い付きハードでソフトに七転八倒」さんが所有されているRAMディスク「RD512」の動作を解析し、それと互換性のあるRAMディスクを作りたいということで新たに回路を考案し製作されたものです。

ここで紹介するのは、その回路資料をいただいて、それにバッテリバックアップ回路を追加してプリント基板を製作して完成させたものです。


完成したRAMディスクカードです。

RAMディスクカード


回路図を示します。図中のR1(1MΩ)は実際には22KΩを実装しています。


回路図


動作風景です。

FM-7に装着

後方にはFT245カード


具体的な使用法ですが、次の3つのバイナリソフトが用意されています。

・RAM512SR.DAT:Windows上のディスクイメージとRAMディスク間でのコピー
(FT245カードとWindows側ではFDIMG_RW77.EXE(Ver2.0)が必要です。)
・RD512_RW.DAT:ドライブ1とRAMディスク間でのコピー
(設定を変更することでドライブ0との間のコピーにも対応可能。)
・XRAMDK77.DAT:FM-7でRAMディスクとして使うためのドライバ

これらのバイナリソフトを直接使用するのは面倒なので、下画像のようなBASICのメニューソフトを使うと便利です。
まずDISK BASICをドライブ数に3を指定して起動します。
次にこのメニューソフトFM7RDSKをRUNします。
メニュー7をまず実行してRAMディスクがアクセスできるようにします。
これでメニュー8を実行するとドライブ2にセットされているRAMディスクの内容が表示されます。
メニュー1と2はドライブ1とRAMディスク間での丸ごとコピーです。
(FDDドライブの番号はメニュー6で変更できます。)
メニュー3と4はWindows上のイメージファイルとRAMディスク間での丸ごとコピーです。
Windows上の320KBのイメージファイルをおよそ1分20秒ほどでRAMディスクへコピーできます。
ただし、3と4を実行するにはFT245カード(上の画像の後方に見えています)が必要なので、50P拡張コネクタに32Pスロット拡張基板を接続して、その基板上にFT245カードを装着しています。


メニューソフト


以上、512KBのRAMディスクカードとドライブソフトを紹介しました。

今回のドライバとユーティリティはFDDIMG_RW77.EXEVER2.0)を含めて、下記の「RD-512DRV」の配下にあります。

【3月26日訂正 リンク先を下記に変更しました】

 「思い付きハードでソフトに七転八倒」さんのブログに解説がありますが、質問がありましたらここに書き込んで下さいとのことです。

https://vehwk3yxv7hw.blog.fc2.com/blog-date-202202.html


なお補足ですが、使用したSRAMは東芝のSOPタイプのSRAM TC554001AF-70Lを自作のDIP化変換基板に装着して使用しています。他に三菱のM5M5408BTPや日立のHM628512CLPでも動作することを確認しています。
また、リチウム電池2032を用いたバッテリバックアップはまだ長期間のテストが済んでいませんが、とりあえず、数日間はデータが保存されていることを確認してあります。




高速通信カードFT245の使い方の紹介

 アプリケーションでのFT245カードの使い方を紹介します

[4月18日追加] 末尾に「FT245カードの簡単な使用法」のダウンロード先を追加しました。

思い付きハードでソフトに七転八倒」さんが開発されたFM-7/77用の高速通信カードFT245カードをアプリケーションで使用する場合に、通信元と通信先の両方の対応の方法を紹介します。

FM-7/77に装着されたFT245カードからのWindows側への送信は通常のRS232Cでの通信と同様に1バイト単位で送信されますが、Windows側からFT245カードへの送信は1バイトのデータをb7の1ビットとb6~b0の7ビットに分けて2回で送信されますので、それに合わせてFM-7/77側、Windows側の送受信ルーチンを対応させる必要があります。

FT245カード


FM-7/77側:

従来のRS232Cの送受信ルーチンRCVCH, SNDCHを次のプログラムに置き換えます。RCVCHは2回受信して1バイトを構成しています。 



Windows等のアプリケーション側:

例としてVisualC++でのFormプログラムを示します。

受信用の関数 serialPort1->Read()には変更がありませんが、送信用の関数serialPort1->Write()は次の serial_Write()関数で置き換えます。



これだけの変更で、従来のRS232Cを使用したアプリケーションがFT245を使用した高速通信に置き換えることができます。

私はこれをWindows上の仮想ドライブ構築ソフトCpmDrvWin.exeやFbasDrvWin.exeなどに適用して快適に使用しています。

[4月18日追加] 「FT245カードの簡単な使用法」をOneDriveにアップしました。


2022年1月28日金曜日

SOJなどのSRAMも変換基板に装着できました

 SOJタイプのSRAMでも装着は簡単でした

10月2日のブログで報告したSOPタイプの512KBのSRAM用のDIP化変換基板ですが、本来は日立のSOPタイプ(幅10.16mm)用に設計したものですが、三菱のM5M5408BTPに使用できていました。


変換基板とM5M5408BTP


最近、SOJタイプのNECのD434008ALEを入手したのですが、これが何と36ピンでピン配列も全く異なっているので、仕方なく専用の変換基板を製作しました。

出来上がってきた変換基板に装着してみましたが、SOPタイプよりもむしろハンダ付けが簡単なぐらいでした。


専用変換基板とD434008ALE


これに味を占めて、以前入手していたのですがサイズ(横幅)が少し広すぎて変換基板に載せられないと諦めていた東芝のTC554001AFを、ピンを内側に折り曲げてSOJタイプに加工してしまえば装着できるのではないかと思って試してみましたら、簡単にできました。

加工というほどの事もなく、手でICを立てて机に押し付けて曲げるだけです。両側とも内側に曲げておいて、最後にICを机上に置いてしっかりと押し付けるだけでSOJタイプに変換されました。


TC554001AF

これらの512KBのSRAMは現在テスト中の512KB RAMディスクボードに装着して動作を確認していますが、残念ながらNECのD434008ALEだけは動作しませんでした。変換基板の配線を間違えたのかもしれません...



またもFM-7用の32Pスロット拡張基板の製作

 こりもせずまたFM-7用の32Pスロット拡張基板を製作してしまいました

これで3度目になるのですが、今度のものは、

(1)2枚の基板を2段重ねにして使用するのですが、そのためにサイズを合わせた。

(2)富士通のコネクタが製造中止になってしまったので、普通のピンヘッダとピンソケットの組み合わせでも使用できるようにした。

なお、2.45MHzの発振回路を内蔵しているので、FM-7本体の32Pスロットと完全互換である点は前回のものと同じです。例によって今回もミスがあり、画像でお分かりのように、50Pコネクタと基板との接続ケーブルをひねらざるを得ませんでした。

基板の様子を下に示します。32Pスロット基板には、富士通の標準のコネクタを2個と普通のピンソケットを装着しています。なおこの富士通のコネクタは部品屋の店頭で見つけたフラットケーブル圧接用のものです。(これを使いたくてわざわざ基板を起こしました。)

50P-32P変換基板の下部の50Pコネクタ用端子はROM/RAMディスクボード用です。2.45MHz発振回路は必要に応じて実装します。(私の知る限り、RS-232Cカードのみがこの発振回路を必要としています。)


左:32Pスロット基板、右:50P-32P変換基板



このように2段重ねで使用します。

重ねて使用します


実際の使用風景を示します。本体には左からFDCカード、テスト中の512KBのRAMディスクカード、自作CP/Mカードが刺さっていて、もう一杯ですので32Pスロット拡張基板に高速FT245カードを装着しています。この状態で、WindowsPCからFT245カードを介してRAMディスクにFDイメージファイルを高速転送するテストをしています。



使用風景


32Pスロット拡張基板の様子を拡大してみました。


拡張基板の拡大

以上のように、FM-7本体の32Pスロット数には限りがあり、さらに富士通のコネクタが入手困難(不可能?)な現状では、普通のピンヘッダとピンソケットも使えるというこの拡張基板にもそれなりの用途があるのではないかと思います。(と思わないと、3回も基板を作成した手間が報われない...)


2021年12月18日土曜日

FM77AVにUSBキーボードを接続する試み(その3)

 プログラムを手直しするとともに基板を製作してみました

今までは、以前別の用途に使用していたPIC24FJ64GB002の基板を流用していましたので、ATmega168の基板と2枚組になってしまって使いにくかったので、とりあえず手配線ですが基板を製作してみました。また、特に意味はありませんがATmega168をATmega88に交換してあります。それなりにコンパクトになりましたが、RJ-9コネクタのついたケーブルは非常にハンダ付けしにくいので、この部分にはRJ-9のメスコネクタが必要な感じです。





回路図を示します。電源はRJ-9コネクタを通してFM77AVから得ていますが5Vですので、ATmega88にはそのまま供給し、PIC24FJ64GB002には3.3Vに変換したものを供給しています。また、この中のプログラム書き込み用の端子は実装してありません。




プログラムですが、キーボードからの入力を処理するPIC側は前回報告したもののままですが、スキャンコードを変換してFM77AVに送るATmega88側は手直しをすることによって、PS/2キーボード変換器と同様な動作になりました。

そのプログラムを示します。


   
 

以上で、USBキーボードをFM77AVで使うという目標が一応達成できたわけですが、PS/2キーボード変換器の場合はATtiny85の1個だけで実現できたのと比べて、いかにもスマートではありませんので、何とかPICの1個で済ませるか、あるいは2個になるにしてももう少し安価でコンパクトなICで済ませられればと思います。

ということで、UART機能のあるコンパクトなAtmelがあればと考えて、Pickit4とSnapを購入する際にATtiny804も購入してみましたが、これが使えれば結構コンパクトになりそうです。一方、PICの方はUSBホスト機能を持つ安価でピン数の少ないものをまだ見つけていません...

蛇足ですが、最近の新しいAtmelのチップはPickit4やSnapでボードに装着したまま書き込みができるので便利です。(今回使用したATmega88や168も書き込めました。)


2021年12月11日土曜日

FM77AVにUSBキーボードを接続する試み(その2)


とりあえずFM77AVにUSBキーボードを接続できました

前回の報告はUSBキーボードのコードは読めたがFM77AVに送れないという段階まででした。

その後結局ATtiny85では無理だろうと判断して、USB機能を持っているAtmelのチップに変更することにしました。AtmelのチップにこだわるのはPS/2キーボード用に制作した変換プログラムを使用したかったからですが、手持ちのチップにはあまり適当なものがなく、20ピンのATmega88とATmega168ぐらいしかありませんでしたので、とりあえず、RAM容量の大きなATmega168を使うことにしました。

試作した回路を示します。右がPIC24FJ64GB002のキーボードインターフェース部、左がATmega168のコード変換部です。


左:ATmega168基板、右:PIC24FJ64GB002基板


全体の構成は図のようです。


プログラムの構成

[1]PIC24FJ64GB002側

ソフトは前回同様 MicrochipのMLA(Microchip Libraries for Applications  v2018-11-26版)中のusb frameworkを用いましたが、前回とは異なり、app_host_hid_keyboard.cの一部を書き換えることで、アスキーコードではなくUSB標準のキースキャンコードを得て、それをそのままUART(38400baud)でATmega168に送れるようにしました。

通常のキーは1バイトのキースキャンコードで、SHIFTキーやCTRLキーなどは2バイトのキースキャンコードとして送っています。

このために App_ProcessInputReport()関数の一部を下のように変更しました。

   

 

[2]ATmega168側

おおまかにはATtiny85でのPS/2キーボード用のプログラムのうちのキーボードのスキャンコードを得る箇所をUSBからの受信データに置き換えれば良いのですが、実際にはPS/2キーボードとUSBキーボードでは制御キーの扱いが異なっているので、その部分は書き換える必要がありました。

具体的には、SHIFTキーを押したときの処理はかなり書き換える必要がありました。

例えば、単純に’1’キーだけを押した場合に得られるコードは

0x1E,0x00 (押した時 0x1E、離した時 0x00)の2バイトなのですが、

SHIFTキーを押しながら’1’キーを押した場合に得られるコードは

0xE1,0x00,0xE1,0x1E,0xE1,0x00,0x00の7バイトになります。その内訳は、

SHIFTキーを押すと 0xE1,0x00

さらに’1’キーを押すと 0xE1,0x1E

続いて’1’キーを離すと 0xE1,0x00

SHIFTキーを離すと 0x00

となっています。

(注)上記の 0x00が余分なように思えますし、PICのプログラムを書き換えれば送られてこないようにできますが、これにはリリースコードの役割がありますので、なしにするとキーを離したことが検出できなくなります。

これを適切に処理しなければならないわけですが、その部分を下に示します。

   
 

これ以外の部分は、以前公開してありますPS/2キーボード用変換器とほとんど同じで、キーコードスキャン部をUARTからの入力に置き換えただけで、キーコード変換部は全く変更がありません。

以上により、試作した回路が間に合わせですし、プログラムもさらなる検討が必要な部分もありますが、とりあえず使えそうな段階まで達したと思います。

しかし、USBホストとしてPIC、そしてコード変換にAtmelと2つもマイコンを使うのはいかにもスマートではありません。何とかPICのみで済ませたいと思っていますが、それは次の課題ということにして、とりあえず一つの基板にまとめた回路を作るつもりです。


<余分な愚痴>

今回のプログラム作成ではPICとAtmelの2種を使いましたので、ライターとしてPICにはPICKIT3を、AtmelにはTL866ⅡPLUSを用いました。PICKIT3はPICを基板に装着したままで書き込めるので便利なのですが、残念ながらAtmelには対応していません。

PICKIT4ならAtmelに対応しているそうですが最近は入手しにくくなっているようです。秋月電子は安いのですが入荷未定ですし、他店も高価なうえに納期が良く分かりません。ということでMicrochip.comの直販で購入することにしたのですが、即納のように書いてあったのに、注文後に何と納期が90日と言われてしまいました。がっかりしていたら、またメールが来て早くなりそうなので一安心しましたが、同時に購入しようとしたATtinyの2シリーズのチップなどは納期が来年の5月と言われて諦めました。

また、先日Y電機で注文したスキャナは納期が来年の3月だそうで、古いスキャナをもう処分してしまったので、結構不自由しています。

コロナの影響なのか半導体不足の影響なのか分かりませんが、一個人にも影響する事態になっていることを改めて思い知らされました。


【12月13日追記】

納期が遅れるというメールを受け取ったのでつい愚痴ってしまいましたが、実際には遅れることもなくPICKIT4とSNAPはアメリカから12日に、ATtiny804はタイから13日に到着しました。日本で購入するよりも安かったですし(送料は無料、VATのみ)、納期も遅くなかったので良かったです。Microchip.comの直販での購入は久しぶりでしたが個人相手でも丁寧な対応で好感が持てます。ということで、上記の愚痴は取り消します。(スキャナの方は相変わらず納期未定です...)

2021年12月4日土曜日

FM77AVにUSBキーボードを接続する試み(途中経過)

FM77AVにUSBキーボードを接続する試みの途中経過です

以前、「FM77AVにPS/2キーボードを接続する変換器の基板化(2019年7月31日)」と「FM77AV用PS/2キーボード変換器の不具合を修正(2020年1月21日)」で紹介したFM77AV用のキーボード変換器ですが、私は今でもFM77AVやFM77AV40SXで常用しています。

しかし、PS/2キーボードも入手しにくくなっておりますので、いつかはUSBキーボード用変換器を製作しようとは考えていたのですが、私にはUSBは敷居が高くて手が出しにくいのでそのままになっていました。

しかし最近、中華製のCH559の記事を読んでいて、このようなUSBホスト機能を持ったマイコンを使えば何とかなるのではないかと考えました。でも今更新しいマイコンの使い方を覚えるのも大変だなと思っていたのですが、ふと思いついて、以前マイコンとスマホの間のBluetooth通信に関してあれこれやっていた時のPIC24FJ64GB002があったなと思い出して、探してみたら3台も出てきました。


出てきたPIC24FJ64GB002基板


ハードはこれをそのまま用い、ソフトはMicrochipのMLA(Microchip Libraries for Applications  v2018-11-26版)中のusb frameworkを用いることで、USBキーボードからの入力を得てUARTに出力することができました。と言ってもMLAのサンプルはPIC24FJ64GB004用でしたので、すんなりとできたわけではなく、ビルドできるようになるまでが一苦労でした。(YTSのホームページ中のPIC24FJ64GB002(Bluetooth LE)の記事が大変参考になりました。感謝いたします。)



ATtiny85と接続


UARTの出力をTeraTermで表示させてみました。入力したキーがちゃんと表示されています。


キー入力を表示


しかし、このMLAのサンプルコードはUSBキーボードのキースキャンコードをそのまま出力するのではなく、内部でコードの処理をした結果のアスキーコードを出力するようになっているので、FM77AV用の変換器を作るためにはこの部分を取り除かなければなりません。

さらに、USBキーボードのキーコードは 'a'=0x04, 'b'=0x05,..., '1'=0x1e, '2'=0x1f,...

であり、キーボードが送るHID Reportは

Makeコード(8バイト):status,0x00,第一キーコード,第2キーコード,..,第6キーコード

Breakコード(8バイト):all 0x00

のはずだと思うのですが、サンプルコードの中にこのフォーマットのデータらしい箇所をまだ見つけることができていません。

また、このサンプルコードはハブ機能を持ったUSBキーボードには適合しないという記事がありましたが、確認してみますと確かに全く反応しませんでした。


全体の構成(予定)

全体の構成としては下図のようにPIC24FJ64GB002の1個だけでFM77AVのスキャンコードの出力ができれば理想なのですが、あれこれと試してみましたがどうも無理なようです。


構成図

その理由については今のところ分かっていません。

試しにメイン関数中に特定のスキャンコードを送るルーチンを書き込むとFM77AVに表示されますが、USBのスキャンコードを得る関数中にそのルーチンを書き込んだ場合は表示されないのです。FM77AVへの通信ルーチンといっても、単にPORTBの1ビットをオンオフしているだけなのですが...

USBでは1ms毎に通信しているので、その中にFM77AVへの通信ルーチンを入れ込むのはダメということのようなのですが、参考にした「YTSのホームページ」さんはUSBの関数中にUARTの送信ルーチンを入れて正常に動作させています。下の画像のパルス間隔が伸びている箇所がUART通信中の部分です。(もっとも、FM77AVへは4バイトのコードを正確に100us,125us,175usの間隔で送る必要があるので、これが原因かもしれませんが。)


PIC24のRB2出力


ATtiny85を使うことになりそう


ということで、PIC24FJ64GB002でUSBキーボードのスキャンコードを得て、それをATtiny85に転送してコード変換した後にFM77AVに送り込むという形を考えています。

しかしその転送手段ですが、ATtiny85にはUART機能がないため、試しにATtiny85をArduino化してSoftwareSerial機能を使ってみましたが、変数がRAMエリアの容量を超えてしまってビルドできませんでした。あとはUSI機能を使用するか、あるいは直接UART信号を読むルーチンを書くかということになりそうですが、まだどちらも実現できていません。

以上、途中経過でしたが、私が理解していないことが多々あるかと思いますので気づかれたことがありましたらアドバイスいただけると有難いです。

2021年11月17日水曜日

6502の逆アセンブラを制作する(その3)

 6502の逆アセンブラを制作する過程の紹介の続きです


W65C816ボード


制作過程(6)--- pass2

pass2では再びデータの先頭から1文字ずつ読みながらアセンブルリストを作成し、ListリストとAssembleリストボックスに書き込んでいきます。その書式は次のようです。
Listリストボックスには
 行番号 アドレス オペコード オペランド ラベル ニーモニック オペランド
Assembleリストボックスには
 ラベル ニーモニック オペランド (アセンブラプログラムにかけられる形式です。)

そのアドレスにラベルがついている場合はラベルも表示し、オペランドがアドレスである場合は即値をラベルに置き換えて表示します。
該当する命令がない場合はオペコードを ?-xx- のように表示し、ニーモニック欄はそのアスキーコードを'a'のように表示します。

【ここまでの結果】 ... 06Coding-pass2

制作過程(7)

作成された逆アセンブルリストを保存します。
ListリストはLSTファイルとして、AssembleリストはASMファイルとして保存します。

【ここまでの結果】 ... 07Coding-savefile

制作過程(8)

最後に細部の見直しをして完成です。

【11月18日追加】下の2ファイルは適宜見直して差し替えることがあります。

【完成版】 ... 08Coding-complete  

完成版の中の実行ファイルのみ ... 6502DAsmWin

最後に

10年ほど前に制作した6800用の逆アセンブラの制作過程をほとんど忘れてしまっていたので、それを復習するためもあって今回、6502の逆アセンブラの制作に取り組んでみました。
自分の場合は、ソースが公開されていてもあまりに長いとなかなか読み切れないことが多いので、いくつかに分割して紹介してみましたがどうだったでしょうか。

手持ちに6502のバイナリがないので十分に動作確認ができてはいないのですが、とりあえずelectrelicさんのUniversal Monitor 6502版が正常に逆アセンブルできることは確認してあります。

6502の命令コードの解釈やその他の誤り・勘違いなどがありましたらお知らせいただけるとありがたいです。






 

6502の逆アセンブラを制作する(その2)

 6502の逆アセンブラを制作する過程の紹介の続きです


W65C816ボード

制作過程(5)--- pass1

いよいよここからが逆アセンブラの本体作成となりますが、まず検討すべきは命令の分類です。RockwellのデータシートによるとR65C02の命令は次の16通りに分類できるようです。

 0:(no opcode)
 1:Absolute 1:a
 2:Absolute Indexed Indirect 2:(a,x)
 3:Absolute Indexed with X 3:a,x
 4:Absolute Indexed with Y 4:a,y
 5:Absolute Indirect 5:(a)
 6:Accumulator 6:A
 7:Immediate 7:#
 8:Implied 8:i
 9:Program Counter Relative  9:r
10:Zero page Relative 10:zp,r
11:Zero page 11:zp
12:Zero page Indexed Indirect 12:(zp,x)
13:Zero page Indexed with X 13:zp,x
14:Zero page Indexed with Y 14:zp,y
15:Zero Page Indirect 15:(zp)
16:Zero Page Indirect Indexed with Y 16:(zp),y

これを元にして、オペコード、ニーモニック、命令長、命令タイプの表を作成しました。
それが下に示すファイルR65C02dopcode.hです。

         
 
pass1はデータファイルを1文字ずつ読みながら、スキップ範囲指定されていなければR65C02dopcode.hを参照して該当するopcodeを見つけ、そのオペランドがアドレスであったらL_xxxx(xxxxはアドレス)というラベル名でラベルテーブルに格納するという作業を繰り返します。(スキップ範囲指定されている場合は下記の処理をします。)
従って、上記のaやzpはそのアドレスにラベルが付き、rは相対アドレスを絶対アドレスに変換したアドレスにラベルが付くことになります。
該当する命令が存在しない場合はエラーにはせずにそのコードをスキップします。(pass2で処理します。)

スキップ範囲の処理
スキップ範囲に指定したデータの扱いですが、範囲の先頭の1バイトの値がアスキー表示可能($20~$7F)ならその範囲全体をFCC /abc.../のように表示し、そうでない場合はFCB $xx,$yy,$zz,...のように表示します。

【ここまでの結果】 ... 05Coding-pass1