2022年9月27日火曜日

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

 32Pスロット拡張基板の第5作目です(ついに最終版?)


2022年3月1日の「FM-7用の32Pスロット拡張基板の製作(第4作!)」で紹介した拡張基板ですが、これで終わりにしようと考えていました。

しかし、使用していると、本体の50P拡張コネクタからのケーブルをあまり長くできないので不便を感じることがありました。ということで、拡張ベース基板上にスペースが十分ありますので、データ線と制御線にバッファを追加することで50Pケーブルを長くしても動作するようにしたいと考えました。さらに、FM-7本体の32Pスロットには+12V,-12V電源も来ているので、私的には特に必要はなかったのですが、ついでに12V電源も追加して本体の32Pスロットとの完全互換を実現することにしました。

製作した基板を示します。


拡張コネクタベース基板



32Pコネクタ拡張基板


製作したベース基板の回路図です。

ExConnBase51


正負12V電源用のDC-DCコンバータとしてMAU109(秋月電子で購入)を使用することにしました。これについては、カベキンブログの「富士通 FM-7用32Pスロット拡張基板に±12Vの電源を追加」(2022年4月6日)を参考にさせていただきました。カベキンさまに感謝いたします。


相変わらずミスがあって、、、

実は製作したプリント基板にはミスがあり、なかなか動作しませんでした。上記の回路図はそのミスを修正したものです。
単純なミスのU2(74LS541)のEXTDETとIRQの入出力の向きが逆であることはすぐに分かったのですが、最後の一つはなかなか分かりませんでした。
FM-7に接続すると、殆どの場合起動しないのですが、ごくまれに正常に起動するのです。しかも、起動した場合でもU5(74LS245)だけが異常に熱くなるのです。
プリント基板上の配線を何度見直しても異常はありません、試作品という事でICソケットを使用していましたので、74LS245を交換してみましたが変わりません。ついには追加した12V電源の存在を疑って、MAU108を取り外したりしてみましたが変化はありません。

あれこれと2日間も悩んだ挙句ようやく原因に気づきました。
何と、U5(74LS245)のCE端子をGNDに落としていました。これによってU5が常にアクティブになっていて、FM-7本体のデータバスと衝突したために発熱していたという事なのでした。(相変わらずいつもどこかでドジをしています。。。)

修正してようやく動作した

U5のCE端子をIOS0に接続することによって、ようやく正常に動作するようになりました。期待した通り、50Pフラットケーブルを長くしても正常に動作しましたので、配置などの取り回しが楽になりました。

32Pコネクタ拡張基板の方は、コネクタの数を第4作の3個から4個に増やしてみました。これは、バッファを追加したことでドライブ能力が大きくなった(?)と期待してのことです。さらにコネクタを増設できるような端子が2箇所ありますが、これは富士通のFCNコネクタ(現在は入手が極めて困難です)を使用せずに、通常のコネクタとピンヘッダでも使用できるようにと考えてのことです。

最終と考えているこの基板ですが、最終基板に修正用のジャンパ線が走っているのは嬉しくないので、修正した回路でもう一度基板を発注しました。(今度こそ最終版にしたい...)

2022年9月26日月曜日

PC用の2DDドライブをFM-7等で使うためのアダプタの基板化

PC用の2DDドライブをFM-7等で使うためのアダプタを基板化してみました 

2019年10月26日の「FM-7でPC用のフロッピードライブを使う」で紹介しました、PC用の2DDドライブをFM-7等で使うための、FDDに直接装着するタイプのアダプタをプリント基板化しました。

簡単なものですのであえて基板化する必要もないのですが、他の基板を発注する際に、ついでにということで製作してみたものです。

製作したアダプタは下画像のようです。


アダプタのFDD側


アダプタのFDC側


回路は簡単すぎて、回路図を示すほどのものではありませんが、FDCからのドライブセレクト信号(0あるいは1)をピン12に入れる切り替えスイッチと、ダイオード1個によるReady信号生成回路からなっています。このダイオード1個によるReady信号生成回路は前回同様に、てきとーに。さんの「FM77AV20/40以降のFDD修理というか交換」中のダイオード1個による簡便な変換回路を使わせていただいています。感謝いたします。


FDD ADAPTER


FDDに直接装着して使用します。

FDDに装着した様子


そしてFDCからのケーブルと電源ケーブルを接続します。画像では、FM-7上の自作FDCカードと接続しています。この時、FDC右端のStep信号2倍化回路のスイッチをDouble側にセットしておきます。使用したFDDはTEACのFD-235HGです。
【注意】対応しているFDDには制限があります。構造上、34Pコネクタの上部に電源コネクタがあるMITSUMIのドライブにはそもそも装着できないので使用できません。これは、以前私がチェックした限りでは、このダイオード1個によるReady信号生成回路ではMITSUMIのD353やD359の中には動作しないものがあったために、対象外と考えたためです。確実に動作するのはTEACのFD-235HGやHFで、他にSONYのMPF920も動作確認をしています。これらについては、2019年12月31日の「FM-7でPC用のフロッピードライブを使う(その後の訂正・補足)」をご覧ください。

なお、FM-7ではStep信号2倍化回路が必要ですが、FM77AV20/40/40SX等のFDDが2DD仕様のものでは接続するだけでそのまま使用できます。私は手配線のものをFM77AV40SXで2019年以来使用していますが、特に不都合は生じていません。





ドライブ番号として0と1が選択できますので、2台までのFDDが制御できます。


FDDを2台制御できます

以上、手配線で使用していたものをプリント基板化してみたというだけの報告でした。

なお、画像のような基板が数多くできてしまいましたので、もしご希望の方がおられましたらお申し出くだされば、郵送料(84円)のみでお送りできます。


製作した基板

実際に製作するためには、34Pのピンヘッダ(オス)、34Pのピンソケット(メス)、通常の信号用ダイオード、3Pスライドスイッチが必要です。
また、本文中に書きましたように、対応していないドライブがあることをご承知おきください。


2DDドライブ用ステップ信号2倍化回路をFDD2台に対応させました

 2DDドライブ用ステップ信号2倍化回路を2台のFDDが接続できるように改良しました

2020年7月29日の「2DDドライブ用ステップ2倍化回路のその後」で紹介しましたステップ2倍化回路ですが、ドライブ毎にそれぞれ2倍化基板が必要となるのは煩雑なので、1枚の基板でドライブ2台を制御できるように改良しました。

最初は単純に2回路を1枚の基板に収めたものを製作して使用してみましたが、これは如何にも大きすぎて、扱いにくいものでした。


左:従来のもの 右:最初に製作した2回路版

そもそも、よく考えてみるとATtiny85が2個も必要なわけではありませんでした。ということで、回路を見直した結果、現在の基板と同じサイズに収めることができました。

その回路を示します。

FDD2台用回路


次に製作した2台用基板


右端の34PコネクタにFDCからのケーブルを、左端のコネクタとその隣の上向きのコネクタに2台のFDDへのケーブルを接続します。上下に出ている4PはFDD用の電源ケーブルです。
(FDD用のコネクタが左と上に向いているのは、当初、左向きのコネクタをメスにしてFDDに直接装着することでケーブルを省略できると考えていたからなのですが、それはそれで使いにくい面もあり、結局ケーブルで接続する形にしています。)

ドライブ番号は0~3から指定でき、それぞれStep信号2倍化回路を通すか通さないかを選択できますので、PC用の2DDのFDDのみでなくGOTEKや2Dのドライブも接続できます。
(GOTEKを使用する場合は、常に本体のドライブ番号はS0ではなくS1にセットしておきます。)

下画像はGOTEKをドライブ0に、PC用FDDをドライブ1に指定して、自作のFDCカードに接続した様子です。


使用中の様子

長いケーブルを使用したので、結構ゴチャゴチャに見えますね...

でも従来の基板と同じサイズのもので2台のFDDが制御できるようになったので、目的は達成できました。


2022年9月15日木曜日

自作クロスアセンブラの修正とASSIST09のFM-7への移植

 ASSIST09がアセンブルできるように自作クロスアセンブラを修正し、FM-7に移植してみました

【9月20日訂正】末尾に訂正が一個所あります。

発注しているプリント基板ができあがるまでハードいじりは措いておいて、いつかは直そうと思っていたソフトの修正に取り掛かりました。

まずは6809用のクロスアセンブラですが、以前、「必要に迫られて自作したアセンブラ等のツールソフトの紹介(2021年9月1日)」で紹介したもので、ASSIST09のソースをアセンブルする際にはそのままではアセンブルできず、ソースを修正する必要がありました。

例えばASSIST09のソースの1684行は

FCB 'H,$01,'H,$01,'H,$00,',,$00 --> $48,$01,$48,$01,$48,$00,$2C,$00 になって欲しい

となっていますが、この中の「',」が$2Cとならずに区切り記号と解釈されてしまうのです。ですので、アセンブルする際には「',」を$2Cと置き換えてアセンブルしていました。

ちなみに、使用者が多いと思われるアークピットさんのX6809でもこれは正常にアセンブルされません。アセンブル結果は次のようになります。

$48,$2C,$24,$30,$31,$2C,$00,$01,$48,$2C,$24,$30,$30,$2C,$00,$00

これは、X6809では1文字は「'」で囲んで「','」にしなければならないという仕様になっているからです。

私の自作アセンブラ(6809用、6800用)でも、最初はそのような仕様にしていたのですが、ASSIST09だけではなく他のソースでも後ろの「'」のない書き方が多いようなので、どちらの書き方にも対応するように変更した結果、「',,」が正常に変換されないというバグが発生していました。

もう一つの不具合も FCB疑似命令に関するもので、負数がちゃんと変換されないというもので、FCBのオペランド中での負数の処理にバグがありました。そのため、やはりアセンブル前にソースのFCBのオペランド中の-1を$FF,-2を$FEのように書き換えていました。

上記の2つの不具合はいずれもFCBのオペランド文字列の解釈に関するものでしたので、それを修正したVer1.92を作成しました。これによって「',」でも「','」のどちらでも正しく変換できるようになりました。


Ver1.92でのアセンブル結果


WARNINGが出ている


ASSIST09をアセンブルするために

以上で自作クロスアセンブラでASSIST09をアセンブルできるようになったのですが、実はソースそのものを何箇所か変更する必要があります。

私が以前から使用していたものは、書籍「MC6809-MC6809Eマイクロプロセッサ プログラミング マニュアル」中のソースではなくバイナリを手入力したもので、必要な個所を直接書き換えて使用していました。当時はアセンブラを所有していなかったので、ソースをアセンブルできなかったのです。

その後、ネットからソースを入手しましたが、そのソースが書籍のものと何箇所か異なっていることに気づいてはいましたが、ちゃんとソースを読んでいませんでした。

最近、ソースをアセンブルしてバイナリを得る必要があったので、書籍と見比べた結果、やはり書籍版を使用することにして、書籍版に合わせてネット版ソースを変更しました。

(私は今まで書籍版のバイナリを使い続けており、ネット版をそのままアセンブルしたものを使用したことがありませんので、動作にどんな違いがあるのかは分かりません。)

変更したのは下記の4箇所です。

1.825行からのCIDTAルーチン

2.870行からのCODTAOルーチン

3.1085行のCPX命令は6800の命令なのでCMPXに変更

4.1619行のCBKADDルーチンのDECBを変更

以上の変更を加えたソースを自作クロスアセンブラでアセンブルすると6つのWarningが出ますが、これはExtend命令と解釈したがDirect命令に変更できるよという警告ですので、該当の6箇所のオペランドの先頭にDirect命令を指示する「<」を付加します。改めてアセンブルするとWarningも出ずに、書籍と同じバイナリが生成されました。

以前は、Direct命令に変更できる場合は常に変更したコードを生成するようにしていたのですが、これではまずい場合がありましたので現在のような仕様にしているのですが、元のソースを書き換える必要があるのは嬉しくないので、変更するかしないかを選択できるようにしたVer1.93を作成しました。プログラムソースをかなり書き換えたので、正常に動作するかどうかをテスト中です。


FM-7へのASSIST09の移植

以前、ASSIST09に関するブログを書いた際には、もう既に移植済みのASSIST09にコマンドを追加したという内容でした。

「ASSIST09に追加したLoad, Saveコマンドを改良しました」(2018年6月27日)

「ASSIST09にLoad, Saveコマンドを追加」(2018年5月26日)

今さらとは思いますが、マイコンなどへの移植はネットでもいくつか見ますが(私も昔から自作マイコンで使用しています)、FM-7への移植はあまり見たことがないので、ここでFM-7へのASSIST09の移植の手順について書いてみたいと思います。

なお、以下の移植の手順についてはインターフェース誌1982年4月号の「ASSIST09の詳細とFM-8への移植(高橋豊)」をほとんどそのままFM-7に適用したものです。高橋豊さんに感謝いたします。

[1]最も簡単な移植(入出力にACIAを使用、領域圧縮なし、拡張ROMなし、アドレス$F800からに配置)

アセンブラが使用できればソースを変更してバイナリを生成できますので、ソースの24行、25行のACIAとPTMのアドレスを変更し、配置するアドレスを20行に書いてアセンブルするだけです。PTMが実装されていない場合はアドレスに$0000を書いておきます。

しかし、これでは2KBのASSIST09の他に6KBもの使われないエリアが生じて無駄が多くなりますし、そもそも、FM-7のようなパソコンの$F800からには移植できません...

[2]簡単な移植(入出力にACIAを使用、領域圧縮なし、拡張ROMなし、任意のアドレスに配置)

任意のアドレスに配置する場合には、20行目のROMBEG(スタートアドレス)を書き換えます。さらに[1]の設定に加えて、SWIやNMIのベクターアドレスをASSIST09用に再設定する必要があります。ベクターアドレスについては直接設定することになります。

[3]未使用領域を圧縮して移植(拡張ROMあり、他は[2]と同様)

拡張ROMを使用する場合は、それを用いて必要な再設定をすることができます。図のFM-7への配置例で示したものでは、$6800~$6FFFにASSIST09を配置し、その下に$100バイトの拡張ROMを置き、その下からがスタック/ワークエリアとしています。ソースの変更箇所はROMBEG(スタートアドレス)とRAMOFS(拡張ROMのオフセット)のみで、他は拡張ROM中で設定できます。


ASSIST09の配置例


ASSIST09は拡張を容易にするために、自身のアドレスから2KB下に$20,$FE(BRA *)があると、拡張ROMがあるとみなし、ASSIST09の起動前に$20,$FEの次のアドレスにサブルーチンジャンプすることで、ユーザの初期化プログラムなどを実行することができます。図では、2KB下ではなく$100バイト下に設定しています。

この初期化プログラム中で必要な処理を書くわけですが、最小限必要な処理は以下の2つです。

・1文字入力ルーチン、1文字出力ルーチンをFM-7のそれに置き換える。

・SWI、NMIルーチンをASSIST09用に置き換える。

SWIはASSIST09の内部でサブルーチンコールなどのために使用しています。NMIはBREAKキーでF-BASICに戻るために使います。

その他、コマンドの拡張もここで行うことができます。


拡張ROMの例を下に示します。まず最小限のものです。

 

コマンドの拡張は非常に有用ですので、高橋豊さんの例をそのままお借りしてコマンド拡張方法の具体例を示します。

 


配置例にあるように、拡張ROM($6700~$67FF)とASSIST09($6800~$6FFF)を一つにまとめておいて、
 CLEAR ,&H6000
 LOADM "ASSIST" <-- ASSIST09とExROMを合体したファイル
 EXEC &H67E0
その後
 MON でASSIST09が起動します。ASSIST09から抜ける場合はBREAKキーを押します。

FM-7への移植手順は以上ですが、改めてインターフェース誌で情報を公開して下さった高橋豊さんに感謝いたします。

修正した6809用クロスアセンブラについてはチェックが終わり次第公開します。
それにしても、6809の命令一覧表には載っていない命令(例えば、LEA命令のプログラムカウンタ相対のDirectモード命令)が存在したりして、情報不足のせいか今一つ理解できないことがいくつかあるのが悩ましいところです。
【9月20日訂正】私の勘違い(&知識不足)でした。Directモード命令ではなく、プログラムカウンタ相対の8ビットオフセットか16ビットオフセットかの違いでした。

2022年8月24日水曜日

ESPRIMO D583/HXのマザーボードにSATAコネクタを取り付ける

 常用のWindows機のマザーボードにSATAコネクタを増設してみました


動機

私の常用機は富士通のESPRIMO D583/HXです。使い始めてもう7,8年になりますが、これを選んだのはビジネスユーザ向けということで、余計なソフトが入っていないことと、ある程度仕様を選択できることからでした。

今までに、Windows8.1を10に、メモリを4GB->8GB->12GB->16GBと増設し、500GBのHDDを500GBのSSDに交換してきましたが、いよいよディスクが窮屈になってきていました。

ちなみに、ファイルの保存等には4TBと2TBの2台のLANDISKを使用しているのですが、プログラミング時などのWorkエリアとしてSSDの200GBをDドライブとして使っていたので、Cドライブが残り少なくなってしまったということです。

そこで、現用のSSDを全てCドライブにして、Workエリア等としては、以前購入したままにしてあった3TBのHDDを使用することを考えました。

ところが何と、D583/HXのマザーボードにはSATAコネクタが2個しかないのです。これではSSDとDVDドライブの2台でおしまいです。筐体を開けてマザーボードを見ると、SATA1というパターンはありますが、コネクタが実装されていません。。。

(サブ機はHP製で、これには十分な数のSATAコネクタが実装されていたので、HDDの増設が簡単にできたのに...)

ということで、始めは画像のようなHDDスタンドを購入して使用していました。これによって、確かに簡単にHDDを増設できたのですが、使用しているとUSB3と言えども遅いのですね。(このスタンドのせいではなく、本体がUSB3.0なので仕方がないのですが...)HDDのフォルダを最初に選択した時には、最悪数秒待たされるのです。その後はまあまあ普通にアクセスできるので良いのですが、今までSSDの速度に慣れてしまっていたためか我慢ができません。


当初使用していたUSB3のHDDスタンド

SATAコネクタを増設された方がいた!

そんな時に、マザーボードに直接SATAコネクタを増設したという蓼科電研さんのブログを見つけました。

正に目からうろこで、これならHDDも内蔵できるし速度も上がるだろうという事で、早速部品集めにかかりました。しかし、こんなことをする人はあまりいないようで、まずSATAコネクタが見つかりません... aitendoでは扱っているようですが品切れですし、DigikeyではMolex製を扱っていますが、両端の固定ピンが平行で、マザーボードのパターンとは合っていません。また、直流カットコンデンサも蓼科電研さんのブログではパターンが小さいので、容量が22nFでサイズが1005が良いと書かれていましたが、これも手に入りにくい... 結局、何とかなるという甘い考えでMolexのコネクタ2種と、サイズ1608の22nFのコンデンサを入手しました。


マザーボードの現状

左下部にSATAコネクタが2個ありますが


D583/HXのマザーボード


その下部のSATA1にはコネクタが実装されていません。

SATA1のコネクタが未実装


裏面を見ても、直流カットのコンデンサ4個も実装されていません。。。

Cも未実装


コネクタ増設作業

まずはパターンのハンダ除去作業から取り掛かります。

私のハンダ吸い取り器は十年ほど前にヤフオクで入手したHOZANのHS-800というとても古いもので、入手時から真空ポンプの吸引力が弱っていましたが、消耗部品もストックしてあるので使い続けています。(さすがに今回のマザーボードは手強かった。)


ハンダ吸い取り器

両端にある固定ピン用や信号用の穴はすぐにハンダが吸い取れましたが、GND用の3つの穴のハンダはなかなか抜けず、何度も試みているうちにすぐ隣の信号用の穴がふさがってしまったりで、結局30分ほどもかかってしまいましたが、何とか吸い取ることができました。


ハンダ吸い取り前



ハンダ吸い取り後

パターン付近が汚れてしまいましたが、ハンダは吸い取れています。


SATAコネクタを実装

SATAコネクタは片側の固定ピンを無理矢理曲げることで、何とか取り付けることができましたが、問題は直流カットの4個のコンデンサの取り付けでした。

基板のパターンはやはり1005用らしくてとても小さく、サイズ1608のコンデンサはとにかく大きすぎました。何とかハンダ付けしてみましたが、隣と接触してショートしてしまうのです。ということで、結局直接の取り付けは諦めて、0.32mmのポリウレタン線を10~15mmぐらいに切って1608のコンデンサにハンダ付けして、その先を基板にハンダ付けしました。画像はとても見苦しいですが、カプトンテープで絶縁してあります。


Cを4個取り付けたが...


仕上げ

以上で、無事に3つ目のSATAコネクタが使えるようになりましたので、SATA0にSSD、SATA1にHDD、SATA4にDVDを装着して、SSDを取り付けてあった位置にHDDを取り付けました。SSDはとりあえずですが、画像のようにライザーカードに空いている穴の一つを利用してねじ止めして、あとはテープで固定してみました。

(ちなみに、本来のライザーカードはPCIスロットが2個のものでしたが、当初はSATA拡張カードを利用することを考えていたのでPCIeスロットのものを入手して交換してあります。結局今回は使うことがありませんでしたが...)


SSD取り付けの様子


結果


動作させてみた結果ですが、間違いなくHDDのアクセスは速くなりました。USB3のHDDスタンドの場合にあった最初のアクセスが待たされる現象が無くなり、快適に使用できています。また、外付けだったHDDが内蔵できたのも良かったです。


終わりに

以上ですが、マザーボードを加工してSATAコネクタを増設するという報告があまり見当たらないようですので、私の試みを紹介させていただきました。

と言いましても、何も新しいことはありませんで、殆どが蓼科電研さんのブログの後追いにすぎません。蓼科電研さんに心より感謝いたします。

強調しておきたい事は、ハンダ吸い取り器がないとマザーボードのハンダの吸い取りは絶対に無理だという事、直流カットコンデンサのハンダ付けはサイズ1005のコンデンサが必須で、しかも細いコテ先のハンダごてが必要だという事の2つです。SATAコネクタについては固定ピンがパターンと合っていないものでも、無理矢理ですがピンを曲げることで何とか取り付けることはできるようです。

万が一、同様な試みを実行してみようという方がおられましたら、最悪の場合はマザーボードを破壊してしまう可能性がある事をご承知ください。私の場合はたまたまうまく行っただけかも知れませんので。


2022年6月22日水曜日

FT245通信カードとRAMディスクカードの合体カードの製作

 FT245カードとRAMディスクカードを合体させてみました

以前、秋月電子のFT245モジュールが品切れだった時期があり、それならという事で代わりにFT245RLチップを使ったカードを試作してみたことがあります。

それについては4月2日のブログ「FT245高速通信カードの改造の試み」で紹介しましたが、その試作機は秋月のFT245モジュールの回路をそのままそっくりプリント基板に実装したものでした。しかし、USBから電源を取る必要はないなど、不要なパーツを省くことで回路を簡単化できそうでした。

製作してみると、スペースに結構余裕ができましたので、これならさらに回路を追加することができるのではないかということで、表面実装のSRAMを用いればRAMディスクの回路を入れることができるのではと思いつきました。

それまではFM-7の32PスロットにはFDCカード、FT245通信カードの2枚が刺さっていましたので、RAMディスクカードを使う際には自作の32Pスロット拡張基板を使用していました。しかしFT245通信カードと512KBのRAMディスクカードを一枚に合体させれば、FM-7本体だけで収まることになり使い勝手が向上します。

ということで製作したものが下画像のカードです。今までのFT245カードや512KB RAMディスクと同様、TTL ICには74LSを使用しています。


試作第1作(74LS使用)

回路はどちらも実績があるものですので、配置に多少手間を掛けただけで完成しました。回路的には74LSだけでなく74HCも使用できるので、バッテリバックアップ機能の向上を期待して、全てのTTL ICを74HCにしたものも製作してみました。

USBコネクタとしてminiとmicroの両方を実装したのはどちらの接続ケーブルも使用できるようにするためです。上部に見えるスライドスイッチはFM-7からWindowsへの転送時にTXEフラグを読むか読まないかを切り替えるものです。(ソフトでの対応が必要です。)

実装としては、USB microコネクタの取り付けに最も苦労しました。0.65mmピッチのFT245RLチップはそれほど大変ではありませんでしたが、それよりも1.27mmピッチのHM628512の方が大変でした。ハンダの乗りがチップによって異なるようです。


74HCでの製作品


裏面

ドライブソフトはFT245通信カード用、RAMディスクカード用のそれぞれがもちろん使用できますが、両カードの開発者の「思い付きハードでソフトに七転八倒」さんが統合したものを制作されています。


FPGAボードで6809を作ってNitros9を走らせてみました

安価なFPGAボードでOS-9互換と言われているNitros9を走らせてみました

FPGAで6809を作ってOS9を動かす」というサイトを見て、同じFPGAボードを入手してNitros9を走らせようとしてみました。

 目的は2つありまして、一つはOS-9互換と言われていますが、本当なのかどうかを所有しているOS-9Level1(FM-7用)とLevel2(FM77AV40用)と比較して確認してみたいことと、もう一つは普段使用している自作の6809/6802DualボードでNitros9を走らせたいので、その前準備のためということです。

入手したFPGAボードは下画像のものです。ALTERAのCyclone IIのEP2C5が載っています。他に購入したのは3.3Vで動作するSRAMのみで、あとは全て手持ちの部品で済ませました。


購入したFPGAカード

ネットの情報に従って、裏面のR1, R2, R9, R10は取り外してあります。

その裏面

基板も使いまわしなので余計な穴が開いていたりします...

3.3Vの512KB SRAMが載っていますが、もう一個載せられるようにスペースを空けてあります。


製作したボード

まず最初の試みとして慣れているFLEX9を動作させる方が簡単かと思って、同じ著者の「FPGAで6809を作ってFLEXを動かすぞ」という記事の通りにインストールしてみることにしましたが、うまくいきませんでした。

コンパイルはエラー無く終了し、書き込みも一瞬で無事に終了します。コンフィグROMへの書き込みもできましたが、RAMでもROMでも動作しないのです。

FPGAに書き込んだ6809がまず動作してメッセージが表示され、続いてSDカードに書き込んだFLEX9が読み込まれて走るはずですが、画面には何も表示されません。SDカードを読みに行く気配がないので、それ以前のFPGAに書き込んだプログラムの動作がダメなようです。

一部Verilogで書かれているので、VHDLならともかくVerilogの細かいところは良く分かりません。

これはあかんということで、FLEX9ではなくOS-9の方も試みたのですが、やはり画面には何も表示されず、SDカードを読みにいく以前の段階に問題があるという状態でした。


ハードが悪いのかそれともソフトのせいか

何しろ回路が手配線なのでハードのミスがあるかもしれず、悪いのは回路なのかFPGAデータなのか、それともSDカードに書き込んだファイルなのかが全く分からず、途方に暮れるばかりでした。

そんな時に「Multicomp Cyclone II-CでCP/Mが動いた」という記事を見つけました。これも同じFPGAボードを使用しており、かつSDカードに書き込むイメージファイルも既に用意されていましたので、FPGA用のプログラムをそのままコンパイルして書き込み、さらに用意されているイメージファイルをSDカードにそのまま書き込むことで、あっさりとCP/Mが動作しました。


Z80書き込み中


CP/M3.0起動直後


CP/M3.0動作中


ハードには問題がなかった

この結果、ハードには問題がないことが確認できましたので、あとはFPGAに書き込むプログラムとSDカードに書き込むイメージファイルの作成という事に注力することができます。

FLEXとOS-9を走らせる記事は、こうすればできますよという手順を詳細に解説したというものではなく、分かっている人には分かるという書き方ですので、私のような素人には引っかかる個所が多すぎます。

ということで、あちこちを修正しながらコンパイルして実行することを繰り返しましたが、やはりSDカードを読みに行く前段階の、FPGAに書き込んだプログラムが動作しない状態から脱却できません...(VHDファイルのセット、コンパイル、実行の手順を数百回も繰り返したおかげで、操作手順だけは目を瞑っていても出来るぐらいになってしまいました...)


オリジナルのファイルで動作させることができた

結局、ブログ中のファイルを諦めて、元々のファイルから始めることにしてGithubにある「nealcrook/multicomp6809」をダウンロードし、その中のMicrocomputerPCBフォルダ中のMicrocomputer.vhdから作成することにしました。これについても色々と試行錯誤をしましたが、何とか6809を立ち上げることができました。

これはシリアル出力に設定してコンパイルした場合の出力画面です。まずCamelForthが立ち上がり、Enterー>OK表示ー>NITROS9入力でNitros9が立ち上がり、日付の入力の後、dir /d0でドライブ0の内容が表示されています。


シリアル出力の場合

こちらはビデオ出力に設定してコンパイルした場合で、PS/2キーボードから操作できます。


ビデオ出力の場合

なお、シリアル出力とビデオ出力の切り替えですが、VHDファイルの該当部分を有効・無効化するだけではダメで、シリアル出力に設定した場合はブログの著者による数か所の変更が必要なようです。(元のmulticomp6809中のVHDファイルと比較すると変更部が分かります。)

SDカードに書き込むデータファイルですが、ブログに書かれていますようにLinux環境で行いましたが、書かれていますようにbin\create_sd_imageをそのまま実行してもエラーで止まってしまいますので、実行行を一行ずつ手作業で修正しながら行いました。どうも、著者はLinuxかMac環境のようで(ファイルの改行コードが0x0D,0x0Aでなく0x0Aになっていた)、それもあって私のWindows環境では難しかったのかもしれません。

蛇足ですが、FPGAは便利なものですね。コンパイルに1分程度かかりますが、その手間をかけるだけで同じボードがZ80や6809に変身するのですから。また、ROMに書き込めば電源スイッチONで即起動しますし。

しかし、一ヶ月以上の試行錯誤の結果として何とか動作したので良かったのですが、つくづく自分の知識の無さを痛感しました。未だに理解しきれていない部分が多いですし、おまけに、何故かQuartus IIの13.0sp1をLinuxにインストールできない状態が続いています。


この後は

この後は、まず手持ちのOS-9L1, L2とどの位の互換性があるのかを確認してみたいと思います。その次には、いよいよ自作のボードマイコンへのNitros9の移植に挑戦したいです。


2022年6月12日日曜日

SDカードを6809のアセンブラで読み書きしてみる

SDカードを6809のアセンブラを用いてSPIモードで読み書きしてみました


 以前からSDカードに興味がありましたが、難しそうで手を出せずにいました。昨年ですがSPIモードでセンサを読み書きしてみたところ、I2Cよりもかなり簡単だという印象を持ちました。

「6821PIAからアセンブラによるSPI通信でセンサーを制御する(2021年11月3日)」

その経験からSPIモードでのSDカードの読み書きなら割と簡単にできるのではないかと試してみることにしました。

参考にしたのは、いつもお世話になっている中日電工の菱田さんのブログの「[新連載]マイコン独立大作戦「SDカードインターフェースの製作」第1回~第32回」です。いつも貴重な情報をありがとうございます。

ということで、回路はブログ第8回の5V-3.3V変換部をそのまま使わせてもらい、元記事は82C55でコントロールしているのですが、私は6809/6802Dualマイコンに搭載している68B21を使用しました。


実験回路の画像と接続図を示します

画像左に立ててあるのが6809/6802Dualボードで68B21からフラットケーブルで実験回路に接続しています。


実験回路


ブロック図


68B21のポートAは出力モードのままで入力もできる便利な機能を持っているので、ポートAのみで入出力を行なっています。クロックSCKは1ビット出力のCA2を利用しています。このCA2によるクロックの周波数は私のプログラムではおよそ30.7KHzでした。

5V-3.3Vインターフェースはインバータひとつで構成しているために信号が反転してしまいますのでプログラムの方で考慮します。

秋月電子のSDカードモジュールは5V電源から3.3Vを生成するようになっていますので、インターフェース回路にその3.3Vも供給しています。


プログラム作成

プログラム作成ですが、Windows上で行いました。

Windows上のエディタ(私はEmEditorを使っています)でソースを作成し、それをWindows上で動作する自作の6809クロスアセンブラでアセンブルして、できたmotファイルを6809/6802DualボードのモニタのLコマンドで読み込んで実行します。

その手順を画像で紹介します。

エディタでプログラムリストを作成します。


エディタで作成中

できたプログラムをアセンブラに放り込んでアセンブルします。


アセンブル中

実行画面でLコマンドを用いてロードします。通常、このロードプログラムの画面は最初に起動するだけで操作する必要はありませんので閉じておきます。

ロードプログラム動作中

実行画面です。Lコマンドで読み込み、Gコマンドで実行します。

ロードして実行中

プログラムに修正の必要があれば、上記の手順を繰り返します。

実際にSDカードを読み書きできるようになるまでには結構はまってしまう個所もあり、中日電工さんのブログの他に、「えるむ by ChaN」さん、「SDカード」さんや「SDカードの操作」さんのブログなども参考にさせていただきました。ありがとうございます。

とりあえず完成したプログラムですが、SDカードとSDHCカードの両方が読み書きできるものとSDカードのみを読み書きするものの2本立てとしました。

目的としている6809/6802DualボードのFlex9に組み込むためには少しでも短いほうが良いので、SD専用とする予定ですが、折角ですのでSDHCカードも読み書きできることを確かめたという事です。

ここではSD、SDHCカード両用のプログラムのリストを紹介します。SDカード専用版との違いは初期化ルーチンとRead/Writeルーチンのセクタ番号の指定方法の違いのみで、特に初期化ルーチンはSD専用版に比べてかなり複雑です。


 


プログラムのメニュー部です。

1:Read Sct, 2:Write Sct, 3:Get SD data, 4:SD Init, 9:End:
メニューの1や2を選択するとセクタ番号を聞いてくるので、入力するとそのセクタの内容が読み込まれたり、そのセクタにバッファの内容が書き込まれます。
3でSDの情報を表示したりすることもできます。

モニタ中のサブルーチンとして INCHA, OUTCHA, PSTRNG を使用していますが、それ以外は特別なものはないので、6809機で6821さえあればSDカードが読み書きできることになります。