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

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

 6502の逆アセンブラを制作する過程を紹介します

6502CPUには触れたことがなかったのですが、最近W65C02やW65C816用のボードを製作した(2021年5月20日のブログ「W65C816も動作する6502基板を製作してみました」)こともあって、6502のアセンブラプログラミングに取り組んでみようと思っています。

W65C816ボード


必要になるのはアセンブラですが、何しろ全く知識のないCPUですので、まず逆アセンブラを制作することで6502の命令体系に慣れ、それからアセンブラを制作することにしました。

なお、ここで制作するのはオリジナルの6502ではなく、Rockwell のR65C02ですので、オリジナルよりも命令が拡張されています。(オリジナルの6502のデータシートが入手できなかったため)

完成した逆アセンブラの動作画面を紹介します。

R65C02用逆アセンブラ

以前制作した6800や6809用の逆アセンブラをベースにしていますので、画面や操作性はほとんど同じです。

この逆アセンブラを制作する過程を順に紹介し、ソースプログラムも公開しようと思いますが、アセンブラや逆アセンブラの構造などについて全く知識のない素人が自己流で制作したものですので、知識のある方から見ると何だこれはと思われるかもしれませんが、私が調べた限りではアセンブラや逆アセンブラを作成するために役立つ情報はほとんど見当たらないようです。(専門家から見ると簡単すぎるので解説する気にもならないということなのでしょう。)

全体の構想

(1)操作性を考えてFormアプリとし、使い慣れているVC++で作成する。

(2)自動的にラベルを付けることができること。

(3)データ部分を指定できること。

(4)変換結果が画面で確認できること。

(5)作成されたアセンブラリストはそのままでアセンブラにかけられること。

上記を目標に制作した結果、上記画面のような構成となりました。


制作の過程

次のような段階で進めていきます。

(1)必要なFormをVisual Studio 2010のC++で作成します。

(2)作成したFormをVisual Studio 2019のC++に移行します。 

(3)処理ファイルを読み込む処理をします。

(4)オプションの処理をします。

  オフセットアドレスやスキップアドレス範囲などの設定をします。

(5)pass1の処理をします。

  ラベルの作成・登録をします。

(6)pass2の処理をします。

  アセンブルリストを作成します。

(7)処理結果を保存する処理をします。

  アセンブルリストを2つの形式(リスト形式、アセンブラ形式)で保存します。

(8)最終確認をして仕上げます。


入力データはファイルメニューから選択するか、あるいは直接ファイル名ボックスにドラッグ&ドロップします。スタートアドレスはBINの場合は$0000に、HEXやMOTの場合はその先頭アドレスになります。オフセットアドレスを設定するとアセンブル開始アドレスを変更することができます。

データ範囲はスキップアドレス範囲として設定します。もちろん複数範囲を指定できます。それらの範囲はFCBあるいはFCC疑似命令となります。

処理結果はListリストボックスやAssemblerリストボックスに表示されますが、変換中も表示させるようにすると時間がかかるので、処理終了後に表示されるように設定しています。

制作過程(1)

まずはFormの作成ですが、最近使用しているVisual Studio 2019(フリー版)ではC++のFormアプリは作成できないようですので、昔使っていたVisual Studio 2010で元のFormを作成し、それを2019で扱うことにします。

必要なメインForm、OffsetInForm、SkipAreaInForm、HelpFormの4つを作ります。

【ここまでの結果】... 01OriginalForm_byVC2010 (OneDriveで公開。以下同様)

制作過程(2)

(1)で作成したものを2019で読み込み、OffsetInForm、SkipAreaInForm、HelpFormをProjectに設定し、さらにメニューの項目を設定します。

【ここまでの結果】 ... 02SetForm_byVC2019

制作過程(3)

逆アセンブルすべきファイルを読み込む処理をします。BINファイルのみでなく、HEX,MOTファイルも読み込めます。

スタートアドレスはBINでは$0000、HEX,MOTでは設定されている先頭アドレスになります。アドレスが不連続の場合はその空白区間は$00になります。

(とりあえず、逆アセンブル実行ボタンを押すと読み込んだデータを表示するようにしてありますが、先頭アドレスから読み込んだ数だけ表示しますので、アドレスが連続していない場合は正常に表示されません。)

【ここまでの結果】 ... 03Coding-inputfile

制作過程(4)

オフセットアドレスやスキップアドレス範囲などのオプションの処理をします。

【ここまでの結果】 ... 04Coding-setoption



2021年11月3日水曜日

6821PIAからアセンブラによるSPI通信でセンサーを制御する

 6809SBCやFM-7からSPI通信でADコンバータMCP3208を制御してみました

これは以前の報告(6809SBCボードやFM-7にArduinoを接続してRTCやLCDを制御 2021年8月24日)の続編です。

実現しようとしているのは6809SBCボードやFM-7にArduinoやRaspberry Piのようなマイコンを接続して、その先の様々なセンサー等を制御することです。そのスタートが上記の報告だったのですが、SBCボードやFM-7に搭載したPIAとArduinoの通信にハードI2Cを用いざるを得なかったために、肝心のセンサー等の制御にソフトI2Cを用いることになり、これでは制御の自由度が狭まってしまっていました。

ということで、PIAとArduino間にSPI通信を用いることができれば、Arduinoに接続したセンサー等をI2C(ハード、ソフト)やSPIで自由に制御できると考えました。

手始めに、Arduinoを仲介せずにPIAにADコンバータMCP3208 を直接接続して制御してみました。写っていませんが前回同様にフラットケーブルの先でPIAと接続しています。


ブレッドボードで実験

 接続図です。


PIAとMCP3208の接続


プログラムを示します。
以前のI2C通信で用いたサブルーチンと同じ名称のものがありますが、その内容は細かいところで異なっているものがあります。またMCP3208のSPI通信に特化したものですので、制御信号は5ビットのみで良く、制御信号の書き込み、データの読み出しはいずれもSCLKをH->Lにするタイミングで行われます。

示したのは6809のFLEX9でのアセンブラプログラムですが、FLEX9特有のサブルーチンは15~18行目の4つ(WARMS, GETCHR, PCRLF, OUTADR)のみです。

   
 

これで、6809SBCやFM-7にマイコンを接続してその先に色々なセンサーをつなぐことができ、マイコンの高級言語(!)でセンサーを自由に制御できることになります。

間にマイコンを挟む場合ですが、ArduinoのようにSPI通信が1回路のみのものでは、センサー側がI2CかSPIかによってPIA側の接続を選ぶことになります。




Raspberry PiやBeaglebone blackのようにSPI通信を2回路持っているものではセンサーとの通信もSPIを使うことができます。





MCP3208の制御に関しては、データシートの他に「最新Raspberry Piで学ぶ電子工作」(金丸隆志著)の解説がとても分かりやすくて大変参考になりました。感謝いたします。


2021年10月20日水曜日

FM-7でFDX68を動作させてみました

 FM-7でFDX68が動作しました

知人からFDX68の基板と製作ガイドをいただいたので、FDX68シールドの製作・使用に挑戦してみました。

一年以上も前にいただいたものなのですが、私は普段はBeagleBoneBlackを使っており、そもそもRaspberry Piに触れたこともなかったので、まずRaspberry Piを入手してその使い方を覚えることから始めることになり、結構敷居が高くて動作させるまでに時間がかかりました。


組み立ててみたが動かない...

FDX68基板の組み立ては製作ガイドの通りに組み立てるだけなので、特に難しいところはなくすんなりと完成しました。(簡単な作業だったので気が緩んでいたのか、実はここにミスがありました...)


完成したFDX68


その裏面

完成させた基板を入手したばかりのFM77AV1に接続しても動作せず、そもそもRaspberry Piをいじったことがないので何が原因なのか見当もつかず、ほとんど放置状態でした。

しかし最近、ネットでのFDX68の記事を読んでいて、FM77AVでなくてもFM-7でも動作するのではないかと思い、これなら試してみやすいということで再挑戦してみることにしました。

Raspberry Piへのソフトの導入と設定については、【FDX68】初心者による初心向け導入解説(https://frogcube.net/2019/03/25/post-4253/)の説明が大変丁寧で、Raspberry Piの初心者にも分かりやすくて、特に迷うこともなくfdxイメージファイルの作成と0,1ドライブへの設定まで行うことができました。

私のFM-7には自作のFDCカード(FDC MB8877Aを搭載)を装着しているので、そのままFDX68カードと34Pフラットケーブルで接続しました。


Raspberry Pi 3Bに装着して

FM-7のFDCに接続


そして、改めてFM-7にfdx68を装着した状態でfdxイメージファイルを設定してみましたが動作しません。


ようやく原因判明

何回もRaspberry Piの設定を見直してみましたが間違いがありませんし、Raspberry Pi自身も手持ちの3Bと3B+の両方で試してみましたが、やはり動作しません。

思い余って、FDX68基板を下さった方に助けを求めて、fdxイメージファイルのサンプルを送っていただきましたが結果は同様でした。

これはもうFDX68基板自身に問題があるとしか考えられないということで、基板をよくよく見直してみましたら、何とICのピンが1本だけハンダ付けされていません。今までハンダ付け終了後は良く確認してきたつもりでしたが、もっと慎重にならなければダメですね。このハンダ付けを追加することで無事に動作しました。


使用感など

使用感ですが、Raspberry Piに電源を接続して起動し、SSH接続して0,1ドライブにfdxイメージファイルを設定する必要があるのはやや面倒ですが、それさえ済ませてしまえばあとは結構快適です。

また、コントローラモードもあって役に立ちそうです。今のところ使用してみたのはfddumpでFDデータを読み込み、fdxconvで読み込んだfdxイメージファイルをd88ファイルに変換することですが、WinSCPでそれをWindows側に簡単に持ってくることができました。

【注意】私のFM-7のFDCカードには直接FDDを接続できるのですが、メーカー製のFDDの場合にはドライブ本体中にあるFDCカードからFDDに接続されているケーブルを外して代わりにFDX68を接続することになります。FM-7に装着するインターフェースカードにはFDX68を直接接続することはできませんのでご注意ください。


発熱は大丈夫か?

使用していてちょっとだけ気がかりなのはRaspberry Piの発熱です。画像のようにFDX68をそのままコネクタに装着するとヒートシンクと集合抵抗がぶつかってしまいます。最初は間にコネクタを挟んで間隔を空けていたのですが、ネットで使用されている方々の画像を見ると皆さん直接装着されているようですので、私もそうしているのですが、集合抵抗の表側のICが結構熱くなっています。ということで、最初は3B+で使用していましたが多少は発熱の少ないと思われる3Bに変更していますが、ほとんど気休めです。


ヒートシンクと集合抵抗が接触している!

以上、考えてみれば当たり前なのですが、FM-7でも使えたという報告でした。

FDX68基板を下さった方、ネットで丁寧に使い方を解説してくださっている方々に感謝いたします。

秋月電子のP-ROMライターを復活させてみました

 今更ですが、秋月電子のP-ROMライターを復活させてみました。

部品を探していたら、秋月電子の古いROMライターが出てきたので動かしてみました。

かなり長い間使用していなかったせいか片面基板が反ってしまっていて、数か所の断線があり、その中には目視では分からないものもあったので修理には結構手間取りましたが、何とか動作させることができました。(やはり発熱の多い個所が傷みやすいようです。)


秋月電子 ROMライター


その裏面です。右上の配線は9ピンD-Subコネクタへの変更で、左側の配線はオプション基板のためのものです。左上の電源周りに三ヶ所の断線がありました。

その裏面


16Vの電源を接続して27C256に書き込みできることを確認しました。対象ROMは2764から27256までですが、書き込み電圧が21Vの2764や27128では25V程度の電源が必要なので書き込み確認はできませんでした。

2716や2732は対象外なのですが、それに書き込むための25V内蔵のアダプターを製作してありましたので、それを装着してみましたら無事に書き込むことができました。2716と2732の切り替えは右のプッシュスイッチで行います。


2716, 2732用のオプション基板



オプション基板の装着状態



オプション基板のアップ


使用したコントロールソフトですが、キットに付属していたMS-DOS版のものでは使いにくいのでWindows版のものを自作して使用していました(Visual C++ 2010で制作)。確かWindowsXPの頃に制作したものだと思いますので動作するか分かりませんでしたが、特に問題もなくWindows7でも10でも(どちらも64ビット版)動作しました。

せっかくですので他の自作ソフトと同様に、使用可能なCOMポートを検索して選択可能にすることと、ファイル選択をドラッグ&ドロップで行えるように改良してみました。


コントロールソフト AkiRomWriter.exe


このソフトを制作する際に参考にさせていただいた千々岩幸治さんの「秋月電子ROMライター制御用ソフトウェア」(この名称で検索すればヒットします)が今でもVectorで入手できますので、それを使用させていただけば良いのですが、自作すれば自分の使い易いように仕上げられるということで制作したものです。

今はメーカー製のROMライターを使用しているので特に出番は無いのですが、昔お世話になったものですので、動作する状態に復活させてみたという報告でした。


2021年10月2日土曜日

製作した基板3種の紹介

 今回製作した基板を紹介します

今回製作した基板は以下の3種です。

(1)32Pスロット拡張基板

(2)32Pスロット拡張基板をFM-7の50P拡張コネクタに接続するための変換基板

(3)TSOPの512KBのSRAMをDIP化する変換基板

(1)32Pスロット基板と(2)変換基板


(3)DIP化基板とSRAMを装着したもの

(1)は手持ちの2種類(基板取り付け用とフラットケーブル接続用)の32Pコネクタ(メス)を活用するために製作したものですが、フラットケーブル用のコネクタのKiCad用のフットプリントをミスってしまい基板取り付け用コネクタしか装着できないという情けないものです。(フットプリントを作り直したので、再度製作の予定です。)

(2)は以前紹介した手配線による変換基板をプリント基板化したものですが、クロック発生回路を追加してあります。FM-7の32Pスロットには2.45MHzのクロックが出ているのに、50P拡張コネクタには出ていないため、互換性を確保するためです。(私の製作物の中ではRS-232Cカードがこのクロックを使用しています。)

回路はごく普通のもので、9.8MHzか4.9MHzの水晶を使えるようにしてあります。

変換基板の回路

(1)と(2)は画像のように2段重ねで使用できます。変換基板の中央のコネクタは以前紹介した拡張I/Oボードと拡張ROM/RAMボードを接続するためのものです。


完成した基板

残念ながら、予定していたフラットケーブル用の32Pコネクタが装着できず、基板用のコネクタももう手持ちがないので、以前製作した基板を使用しています...

2段重ねにした32Pスロット基板(旧)と変換基板


実際の使用形態です。
中央のフラットケーブルをFM-7に接続します。右は2段重ねにしたI/O拡張基板とROM/RAMボードです。その右に出ているケーブルはUSB-TTL変換ケーブルを介してWindowsに接続します。ちなみに32Pスロット基板に装着してあるのはFT-245高速通信ボードです。

実際の使用形態

(3)は以前入手してあったTSOPの512KBのSRAM(三菱M5M5408BTP)を使用するために製作したものですが、32PのDIPソケットに合わせるためにSRAM本体幅が10mm、足も含めて12mm幅のものしか対応できません。(三菱の他には日立にも適応するものがあるようです。)

細ピンヘッダを使用しているので、普通の32PのDIPソケット(平ピン、丸ピン)に装着できます。

【蛇足】こんな変換基板を100個も製作してしまったので、もし使ってみたいという方がおられましたら、郵送料のみでお送りしますのでメールにてご連絡ください。

また、32Pスロット拡張基板なども余分に製作してありますので同様にお送りできますが、残念ながら、富士通はもうFCN_360シリーズコネクタの製造を中止してしまいましたので、該当のコネクタはもう入手が困難で、役に立たない基板になってしまいました。

これからFM-7用の基板を作る際には、紹介しました(2)の変換基板の34Pフラットケーブル用コネクタ(34Pですが、ピン配置をFM-7の32Pスロットに合わせてあります)の先に接続する形のものになるのかなと思います。


紹介した6809/6800用クロス逆アセンブラの修正版

 6809/6800用クロス逆アセンブラを修正しました

9月1日のブログ「必要に迫られて自作したアセンブラ等のツールソフトの紹介」で紹介した自作ソフトの内のクロス逆アセンブラですが、不具合がありました。

公開したものより以前のバージョンでは、スキップ範囲で指定した部分が1バイトずつFCB疑似命令に置き換えられていたので、表示メッセージなどではそれを手作業でFCC疑似命令に置き換えていました。

例えば、スキップ範囲指定したデータが 36,38,30,39,53,59,53,54,45,4D や 0D,0A,04では
        FCB $36            FCB $0D
        FCB $38            FCB $0A
        FCB $30            FCB $04
        FCB $39
        FCB $53
        FCB $59
        FCB $53
        FCB $54
        FCB $45
        FCB $4D
となっていましたが、リストを見やすくするために、それを手作業で
        FCC /6809SYSTEM/ や FCB $0D,$0A,$04
と書き換えていました。

これを逆アセンブラ自身にさせたいということで、公開したものでは、スキップ範囲に指定したデータの先頭の値が$20~$7Fの表示可能データの場合にはFCC疑似命令に、それ以外の場合にはFCB疑似命令に置き換えるとともに複数バイト列を一つの疑似命令にまとめられるようにしました。

この置き換えが可能になるようにプログラムを書き換えたのですが、一つ忘れていたのは、結果として作成されるFCCやFCB疑似命令のオペランドの長さが不定であり、場合によってはかなり長くなることがあるということでした。特にFCB疑似命令の場合には1バイトのデータあたり4バイト必要になります。

ということで、公開したバージョンではスキップ範囲指定の範囲を大きくとりすぎるとオペランドを格納するための文字列変数のサイズを超えてしまってプログラムが落ちてしまいました。(動作テストではそれほど大きな範囲を指定していなかったので気づきませんでした... ちなみに、スキップ範囲指定は100個まで可能なので、細かく分ければこのバグを回避できます。)

今回公開する修正版では、スキップ範囲指定の入力時に長さをチェックして32バイトを超えた場合は32バイトに制限することにしました。


指定範囲が32バイトを超えている場合は


32バイトに縮小される


動作している様子を示します。FCC,FCB疑似命令のオペランドが複数バイトになっています。

まず6809版です。

6809版のLst


6800版も同様です。

6800版のLst


Asmリストはそのままアセンブラに入力することができます。画像は6800版の例ですが6809版も同様です。

6800版のAsmリスト

修正版をOneDriveに上げておきます。


2021年9月1日水曜日

必要に迫られて自作したアセンブラ等のツールソフトの紹介

 6809用のクロスアセンブラやクロス逆アセンブラなどを紹介します

【10月2日追記】6800・6809逆アセンブラの修正版を10月2日にアップしました。

私は主に6809のプログラムを作成して楽しんでいますが、その中で必要に迫られて作成したいくつかのプログラムを紹介します。

基本的にWindows上でソースを作成し、自作したクロスアセンブラでアセンブルした後、生成されたバイナリを6809SBCなどの実機に転送して実行するという手順を踏んでいますので、必要なものは

(1)クロスアセンブラ、クロス逆アセンブラ

(2)実機への転送ツール

(3)ファイル形式の変換ツール

というわけで、10年ほどのあいだに6800用と6809用ののクロスアセンブラ、クロス逆アセンブラなどを制作してきました。(その他にも必要に応じて6801用、6303用のクロスアセンブラも作りました。)

プログラムのうちのいくつかは今までのブログで紹介してきましたが、その後もあれこれと修正を加えているものがありますので、ここでまとめて紹介します。

紹介するものは

(1)アセンブラ・逆アセンブラ

 6809クロスアセンブラ 6809AsmWin.exe とクロス逆アセンブラ 6809DasmWin.exe 

 6800クロスアセンブラ 6800AsmWin.exe とクロス逆アセンブラ 6800DasmWin.exe

(2)転送ツール

 転送ツールとして良く使用するのは仮想ドライブ構築ソフトです。それぞれのDOS(?)に合わせて4種類制作しています。

 Flex9用のFlexDrvWin.exe

 OS-9用のOS9DrvWin.exe

 F-BASIC3.0用のFBasDrvWin.exe

 CP/M-80用のCpmDrvWinFT.exeとCpmDrvWinRS.exe

(3)その他のツールソフト

 フロッピィディスクイメージの形式を変換するソフトとして CvtDskD77.exe

 バイナリファイルをBin, Hex, Mot形式に変換するソフト CvtMotHexBin.exe

以上のソフトのうち、CvtMotHexBin.exe以外はすべてVC++2019でビルドしています。


各ソフトの簡単な説明を加えておきます。

(1)クロスアセンブラ

 ファイルを選択して「アセンブル実行」ボタンを押すだけですが、エラーだけを表示する機能やワーニング表示を止める機能などがあります。結果の保存形式はLST, BIN, MOT, HEXがあります。特長としてはローカルラベル機能があります。この機能を有効にすると、例えばLOOPのようなよく使われるラベルを複数箇所で宣言できます。


6809クロスアセンブラ


(2)クロス逆アセンブラ
 元ファイルとしてはBINだけでなくMOT, HEXファイルも読み込めます。右端の「スタートアドレス」はBINでは$0000ですが、MOT, HEXの場合はその先頭アドレスが表示されます。「オフセットアドレス」は、逆アセンブルする先頭アドレスを移動させる場合に用います。先頭アドレスはスタートアドレスとオフセットアドレスの和になります。
ラベルはL_1234のようなアドレスの頭に「L_」がついた形になります。
特徴と言えるのは、データエリアと推測される個所を「スキップアドレス範囲」として指定することで、その範囲がFCBまたはFCCという疑似命令として扱われることです。どちらになるかは、範囲の先頭バイトが$20~$7Fの場合にはFCCに、それ以外の場合はFCBになります。(安直な区分けですが...)
保存形式はASMとLSTですが、ASMファイルはそのままアセンブラにかけることができる形式です。


6809クロス逆アセンブラ


(3)仮想ドライブ構築ソフト
 最初に制作したFlex9用を下に示します。ドライブ0~3にディスクイメージファイルを設定すればその内容が左下のボックス中に一覧表示されます。イメージファイル形式ですがD77(D88)形式だけでなくDSK形式(単純にセクタデータを順番に並べたもの)も読み込めます。このボックスにファイルをドラッグ&ドロップすればイメージファイル中に書き込まれます。ボックス中のファイルをマウスの左ボタンで選択して右ボタンでメニューを表示させることで、「読み出し」、「削除」、「名称変更」ができます。全ファイルを一気に読みだす場合はメニューの「編集」→「全ファイル読み出し」を用います。



FlexDrvWin.exe

 
 6809SBCやFM-7等のマイコン・パソコンとの間の通信経路を用意すればマイコン・パソコンから普通のドライブと同様に読み書きできます。下図は6809SBCのFlex9から読み出している例です。モニタのFLEXコマンドでFlex9を起動し、Flex9のCATコマンドを実行しています。上図の右のボックスはSBCから送られているコマンドをR/W,Drv,Trk,Sct形式で表示しています。


6809SBCとの通信の様子


他のソフトの例として、CpmDrvWin.exeの画面を下に示します。
表示・操作面はすべて同じようですが、内部ではもちろん、それぞれのFMS(ファイルマネージメントシステム)に合わせて処理されています。


CpmDrvWin.exe


(4)ファイル形式変換ソフト
(4-1)ディスクイメージファイル変換ソフト
 普段はディスクイメージファイルの中を見やすいDSKファイルを使うことが多いのですが、XM7やGOTEKのためにはD77形式に変換する必要があります。今まではそれぞれのDOS用に制作したコンソールソフトを使用していたのですが、不便なので全DOSに対応したフォームソフトを制作しました。トラック数が40か80かは自動判別しますのでどちらでも使えます。



D77, DSK, DAT間変換ソフト


(4-2)バイナリファイル変換ソフト
 Bin, Hex, Motファイル間の変換ソフトです。さらにFlex9のバイナリ形式にも変換できます。


Bin, Hex, Mot間変換ソフト


 以上のソフトは、必要に迫られてここ10年ぐらいの間に制作したもので、特にアセンブラや逆アセンブラは標準的な構造など全く知らないのに自己流で作ったものですが、自分にとっては結構役に立っています。(たまに動作がおかしいと思った時などには他のアセンブラなどの結果と比較することがありますが、現在の版では問題がないと思っています。)

一応、6800用ではMikbug9, Mikbug20, TL1, TinyBasic(電大版)などがアセンブルできることを確認してあります。GAMEⅢでは1文字を「'」ではなく「"」で囲むという標準ではない書き方が多数ありますのでそれを修正(#”A”→#'A')する必要がありました。

6809用ではASSIST09のリストのミス(CPX→CMPX)と4箇所の#'(sp)を#'(sp)'のようにスペース後の「'」を追加することでアセンブルできました。

これらをOneDriveに上げておきますので、もし使用してみて動作がおかしいということがありましたらご一報いただけると有難いです。

【10月2日追記】6800/6809逆アセンブラの修正版を10月2日にアップしました。



2021年8月24日火曜日

6809SBCボードやFM-7にArduinoを接続してRTCやLCDを制御

 6809SBCボードとFM-7にArduinoを接続してRTCやLCDを制御してみました

現在では様々なセンサー等が気軽に入手できて、電子工作好きには楽しい時代ですが、シングルボードマイコンやFM-7などにもそれらのセンサーを接続してみたいと考えていました。

今までにも、6809/6802Dualボードに搭載しているPIA(6821)を利用してRTC(ZS-042)を接続して、Flex9の起動時に時刻を自動的に読み込ませて、起動時の時刻の手入力を省略したりしていましたが(下記のブログで紹介)、もっと他のセンサーなども接続したいと思うようになりました。

  2018年11月3日のブログ「PIAのみでRTCからの時刻の読み書きができました」

上記のPIAにRTCを接続した際には、I2Cによる通信プログラムをアセンブラで作成しましたのでかなり時間がかかりました。センサー毎にアセンブラによるプログラムを作成するのは非現実的ですので、間にArduinoのようなマイコンを挟めばよいのではないかと思いつきました。手持ちには数種類のマイコンがありますが、とりあえず最も手軽そうなArduinoで始めて性能に不満が出たら他のマイコンに置き換えれば良いと思って始めましたが、思ったよりも難しくて一ヶ月余りもかかってしまいました。

難しかったのは、6809側ではアセンブラによるプログラムでI2C通信するのですが、それに対するArduino側のC++(?)のプログラムの応答との関係が良く分からないことでした。

とりあえず、Arduinoを通してRTCとLCDを制御できましたので報告します。

全体の接続を下に示します。6821PIAとArduino間をハードI2Cで通信し、Arduinoと各センサー間はソフトI2Cで通信します。ソフトI2CではArduinoがマスターにしかなれないのでこのような構成となりました。



接続図

(1)ハードの設定

実際の実験の様子です。上部に見えるのが6809/6802Dualボードで、下にあるのがArduinoとセンサーです。


実験風景

ブレッドボード上の中央がRTC(ZS-042)、右が8桁x2行のLCD(AQM0802A)で、RTCから読んだ日時を表示しています。どちらも5V版なので、Arduinoに直結できています。またI2Cのプルアップ抵抗は、ハードI2C側は6821内部の抵抗を、ソフトI2C側はArduino内部の抵抗を利用していますので、単純にセンサーをArduinoに接続するだけで済んでいます。
(左のセンサーは他の実験のもので無関係です。)

センサー部のアップ


6809/6802Dualボードに接続した場合の結果です。アセンブラによるプログラムでArduinoに指示を送り、ArduinoがRTCを読んで結果を送ってきています。(とりあえずの実験なので単純にデータを順に表示していますが、左から年月日と時分秒です。)


6809/6802Dualボードによる結果


続いて、FM-7でも同様な実験を行ってみました。


右に装着されているのが6821PIAボード



使用したのは、以前報告したブログ「FM-7/77用拡張PIAボードとP-ROMライタ」(2020年6月26日)で製作したP-ROMライタ用の6821PIAボードです。



FM-7用6821PIAボード


6809ボードで用いたアセンブラプログラムをサブルーチン化して、F-BASICのプログラムから呼び出す形で使用しています。F-BASICのプログラムはサブルーチンを呼び出すことと結果を表示するためだけに用いています。

FM-7による結果


(2)プログラム作成

プログラム作成上で私が引っかかった点を列挙します。

1.ソフトI2CではArduinoはマスターにしかなれず、スレーブにはなれない。

 → 最初は6809側をソフトI2Cで、センサー側をハードI2Cでと考えていたのですが、結局、逆にせざるを得ませんでした。

2.RTC(ZS-042)の制御ICであるDS3231用のライブラリDS3231.hはI2Cのアドレスを決め打ちしておりソフトI2Cには対応していない(ようです)。

 → ライブラリを使わずに直接DS3231のレジスタを操作することになりました。

3.Arduinoで標準のWire.hでの割り込み関数 Wire.onRequest(requestEvent); や Wire.onReceive(receiveEvent); を6809ボードからのアセンブラプログラムでどうしたら起動させることができるか。また、Wire.requestFrom(ID, no); は使えないが、その代わりにどのようにしたらリクエストできるのか。

 → 6809側からArduinoに何かのデータを書き込むと onReceive関数が反応するので、この receiveEvent関数内で送られてきたデータを読み込んで(必要がないので)捨てる。6809側にデータを送り返す作業は onRequest関数で呼び出される requestEvent関数内で行うという形で通信することができました。(receiveEvent関数では6809側に送り返すことはできませんでした。)


参考までに6809側のプログラムのソースを示します。

 


以上、あちこち引っかかりながらも何とか目的を達することができましたが、次に何とかしたいと考えているのは、Windows側からUSBを通してArduinoにデータを送り、それをさらに6809/6802DualボードやFM-7に送ることです。

とりあえず、現在の状態でのプログラム(6809側のSBC_I2C.txtとそのバイナリ、Arduino側のsbc_i2c.ino、FM-7用のFBI2C、FBI2CSUBとその保存形式のFBI2CSUB2の6本)をOneDriveに上げておきます。