ちょっとTea Time!? 簡易外部ストレージを検討しよう! 2020.9.19

ことのはじまり

寝床にはいってノートPCでネットサーフィンしていたら、下記のサイトを見つけました。
CPM80用ですが、色々なCコンパイラがあります。 ここ → http://www.z80.eu/c-compiler.html
一度は使ってみたいと思ったAztec-CやWhitesmith-Cもありますね。
とくにAztec-Cのファイルを見てみると、倍精度の浮動小数点もサポートしているようです。もっとも、いまさらCPM80で
数値計算をやろうとは思いませんが、なんとなく使えるというだけで嬉しくなります。 というのも、CPM80をつかっていた
学生のころは、OSやコンパイラを自前で買うこともできず○×△※して×○したCPM80-v2.2とBDS-Cを使っていました。
BDS-Cはコンパイル&リンクが早くてよかったのですが、なんせ浮動少数点はおろかlong(32ビット)整数も使えない代物です。
当時はそれしか知りませんでしたから、それが当然かも思っていましたが、世の中の普通のコンパイラはちゃんと浮動小数点も
サポートしていたのですよね。

 さて、さっそくダウンロードして動かしてみたくなりました。

このサイトに色々なCコンパイラがあります。C以外にも色々とありますが、やはり慣れたC言語がたくさんあるのは嬉しい。



Aztec-Cは一度つかってみたいと思っていたものです。


ををを! WhitesmithのCコンパイラもあります。


CPM80のディスクを作るのは面倒!

CPM80のディスクにはSDカードをつかっています。問題は、PCでダウンロードしたファイルをSDカードに追加するのが面倒なことです。
当然のことながら、CPM80のファイルシステムとPCでのファイルシステム(FAT32やNTFSなど)とは構造が全然違いますから、単純にSDカードに
書き込めばいいという訳ではありません。CPM80を使っている人にはおなじみのCPMTOOLSというユーティリティを使うのですが、
これがまた面倒くさい。まっさらで作るならまだしも、中身の変更は面倒で、一旦、PC上にSDカードのイメージをアップロードして編集
する必要があります。
 なんとか、PC上でダウンロードしたファイルをCPM80に転送できないものだろうか・・・と、考えて検討したのが今回のテーマです。

転送方法は色々

1)RS232を使う方法
・・×
 一番簡単そうなのは、RS232をつかうことです。すでに、PCとCPMマシンはRS232でつながっていることもあり、バイナリーデータを
転送してやるのが簡単そうです。でも、いくつか問題があります。
 ・1つは、すでにCPM側のキー入力にESCコードでの割り当てをしてしまっているので、それを解除する必要があります。
  解除にはCPMの入出力を制御するPICのプログラムを書き換えないといけないので面倒です。やるならば、バイナリーファイルを一旦テキストファイルに
  変換して転送した方が転送時間はかかりますが簡単そうです。

 ・2つ目の問題は転送時間です。こちらの方が問題としては深刻です。ゆっくり送ればいいというわけにはいきません。
  というのも、CPMはZ80(20MHz)で動いているので19200ボー程度なら余裕で通信できるのですが、問題は溜まったデータをSDに書き出す
  ときです。SDへの書き込み速度があまり速くないので、その間はデータを受信できません。勿論、バッファーはありますが、高々100バイト程度
  なので、すぐに一杯になります。受信速度を極端に遅くする(例えば1200ボーとか)こともかんがえられますが、SDカードへの書き出しタイミングと
  書き出されるデータ量がわからないと、1200ボーでも取りこぼす可能性がでてきます。ちなみに、転送するデータ量はテキストにすると、
  倍の約800kB(バイナリーで400kB程度)になるので、1200ボーで転送したら2時間近くかかってしまいます。

 ということで、RS232を使う方法は、ちょっと駄目っぽいです。

2)ハンドシェークができるケーブルを使う・・・△
 RS232みたいに、垂れ流しでデータを送るのではなく、ハンドシェークができるように専用の通信ケーブル(シリアルです)を使う方法が良さそうです。
 勿論、RS232もフロー制御はできますが、CPM側でそれをサポートしていません。またバッファーが溜まってきたら、CTRL-Xを送って、送信を一時止めて
 もらう手法もありますが、それを組み込む面倒を考えたら、私的にはGPIOをつかったデータ転送用の専用ケーブルをつかったほうが早そうです。
  実際にはそのケーブをつかって、データ転送ができることを確認しました・・・・・でも、これをつかうのはかなり面倒です。
 というのも、接続のためにCPMマシンとPC(GPIOがつかるRasPiです)の両方を机の上に配置しなければなりません。まあ、すこし机の上を片付ければ
 済む話ですが、それが結構、いや大変面倒(笑。とくにRasPiも単体だと小さいですが、すでに拡張用のIOが取りついているので、それなりにスペースを使います。


GPIOを活用した通信ケーブルが使えそうです。でも、PC(RasPI)とCPMの両方を結合しないと
いけないので、散らかった机の上では、まず最初に整理からはじめなければなりません(笑。


3)簡易外部ストレージを使う(その1)・・・・(○???)

ケーブルでの接続が面倒なので、ちょっとした外部ストレージを作って、それにデータを蓄えてやる方法を検討してみました。
いや、実際に作ってみました。メモリーはマイクロチップ社の23LC512を使いました。これは64kBの容量があるので、手持ちの
分をつかって2個搭載したものを作りました。そして、PCやCPMマシンから切り離しても内容を保持できるように1Fのコンデンサを抱かせています。
 で、いざ作ってみましたが・・・・・作りながら、だんだん後悔です。
 というのも、メモリー素子を2個搭載したとしても、容量は高々128kBです。必要なファイルをすべて転送しようと思えば、4〜5回程度は
かかります。小分けにするのも面倒だなあ〜と半田ゴテを握りながら考え出すと、どんどんモチベーションが下がっていきます・・・・。
 一応、最後まで半田ゴテは握りましたが、この基板ができた時点で使うのは諦めてしまいました。


シリアルSRAMを使ったものを作りましたが・・・結局使わず仕舞いです。
容量が128kBとちょっと小さかったです。企画倒れ・・・・・。

4)容量の大きめの外部ストレージを使う(その2)・・今回のTOPIC

もうすこし容量の大きな外部ストレージが扱えるようにして、1回でデータの転送ができるようにしたいものです。
64kBの23LC512を8個くらい搭載したものを作るのも手ですが、エンコードするICも必要になってきますし、
エンコードのICには複数の制御線が必要になります。まとめて制御するのにPICを搭載してもいいのですが、そこまでやると結構
複雑になってきます。それに23LC512は1個170円なので8個買うのも結構な出費です。できるだけ、
安く仕上げたいです。

 ということで、またまた秋月のHPを眺めて、使えそうなものを探します。その中で、1個使えそうなものがありました。
4M×1bitのDRAMです。1ビットなので、シリアル転送にちょうど良さそうです。それに4Mビットですからバイトに換算すれば
512kBですから、Aztec-Cも丸まるはいりそうです。
 秋月のWEBサイトにはメモリー自体はもっと大容量のものも扱っているのですが、どれもピンピッチが小さいです。それ専用の変換基板が必要です。
その点、このDRAMは1.27mmピッチですが千鳥配置なので、足を広げてやれば普通のDIPソケットを変換基板代わりに使うことができます。

このDRAMを使ってみることにしました。


こんな感じで20pのICソケットが変換基板として使えます。

DRAMを使うのは久しぶり・・・
 それにしても、DRAMを使った工作って40年近く前にやったきりかな?使ったといってもZ80のRAMとして使ったので、なにも難しいことはありません。
Z80はDRAMのリフレッシ機能がはいっているので、ほぼなにも考えずにDRAMをSRAMと同じようにつかうことができます。
 そういれば、同時期にMC68000でも256kBのメモリーを作るのにDRAMを使った気がします。でも、作ったといっても雑誌の回路図を丸々コピー
したはずです。なんせ、回路を考えた記憶がまったくありませんから・・・・単に忘れているだけの可能性もありますが・・・・。

PICで制御してみる
 DRAMを動かすといっても、面倒な回路にすることはせず、PICのGPIOにぶら下げてソフトオンリーで制御してやります。
DRAMでの動作タイミングを確認する点からも、まずはブレッドボードに搭載して動かせるかを確認です。
で、細かいことは省略ですが、DRAMの動作のタイミングチャートをみながら、それに合致するようにGPIOを
動かしてやれば、問題なく動くことが確認できました。でも、改めてSRAMと違う点を認識しました。というのも、
SRAMはフリップフロップで記録しているので、デーを出力させても永久に出続けますが、DRAMの場合は
コンデンサで記録しているだけですので、データの出力時間を長くすることができません。そのため、データの出力を固定させる
ためには、一旦DRAMの出力をPICで読み込んで、そしてPICの違うポートから出力させるということをしなけば
なりません。最初は単純にDRAMの出力端子(DOUT)を、外部出力に使おうかと考えていましたが、それが
出来ないことがわかりました。うん、ちょっとは勉強になったかな(笑。 でもいまさらDRAMの知識なんて・・・・。


まずはDRAMがちゃんと動くかを確認してみました。

まずは回路図を描いてみましょう!

 さて、基板への実装は部品も少なくて簡単ですが、回路図なしでは部品少なくても間違えそうです。IC2個程度の回路なので、まずはチャっチャと描いてみました。
また、回路図も実体配置に近い形で描いておけば、半田付け作業をするときは、左右反転させた回路図をみながら作業するとミスを減らすことができます。
なんせ、DIPを半田するときに、左右のどちらのピンだったかを、いちいち基板をひっくり返して確認することが多いですからね。

まずは回路図を描いてみました。


半田付けのときは、回路図を左右反転させたものを使います。こうすれば、基板を裏返した状態と合致します。

ついでに、電源(電池)も搭載しましょう!
 動かすには電源が必要です。最初は、つかうときに5VのACアダプターを使おうかと考えていましたが、使い勝手を考えると電池を抱かせたほうが良さそうです。
でも、乾電池だと交換が必要になってくるので、ここでは充電池を使いました。単4型の3本パックのものですが、秋月で100円で買える格安品が手もとにありますから、
これを使いましょう。
 なぜ、これがあったかといえば、ちょっと前に電話の子機の充電池が駄目になり(10年近く経っている)、交換しようとして近くの電気屋さんに
行ったのですが、純正品は馬鹿高い!1000円以上もします。背に腹は変えられなかったのですが、純正品を諦めて、近くの100均で単4の受電地を3本買って組み立てて
使うことにしました。まあ、それでも問題なく使えました。で、子機はまだもう1台あるので、そろそろ交換しないと危ないので、その交換用部品(電池だけ使う)として
買っておいたものです。なんせ3本で100円ですから、100均より安くなります。


充電池には秋月のこれを使いました。100円と安価です。もともとは、電話のコードレス子機用につかうつもりで買ったものです。

ただし、この電池の出力は3本なので3.6Vしかありません。DRAMは5V動作なので少し電圧を上げる必要があります。そのため、これも以前に買いだめしておいた
昇圧型のDCDCを使いました。もともと、RasPiの電源(5V)からファン用の電源(12V)を作るために買っておいたもので、安かったので何個か買って
おいたものです。なんせ、送料込みでも1個100円しませんから・・・・。ただし、品質にはかなりのクエスチョンが付く可能性を考慮して、
このDCDCでは一旦8V程度まで昇圧させて、その後に5Vの3端子レギュレータで5Vを得るようにしました。なにかあって、DCDCが暴走しても、
回路の保護ができます。いや、回路だけでなく、それにつながるCPMやRasPiも守る保険みたいなものです。
こうすることで効率は無茶苦茶悪いですが、短時間しか使わないものなので問題ないでしょう。


まずはこのDCDCで8Vに昇圧したのちに、5Vレギュレータで電源を得ることにしました。

完成!

配線も大して多いこともありませんから、割と短い時間で完成です。

512kBの外部ストレージが完成しました。


配線はいつものポリウレタン線をつかいます。やみ付きになっています。

遅いけど・・・・・
 さて、ハードが完成したのでソフトの作成にはいります。まずは、簡単にCPM80の3号機と本機の間での
データ転送の確認を行います。肝心の転送速度ですが、Z80を20MHzで動かしていますが、いかんせんCコンパイラの
生成コードがのろいせいか、1ビットあたりの転送に約20us程度かかるようです。20usのうち、4us程度が本機の処理時間
なので、CPM80側で16usかかっている計算になります。
 20us/ビットということは160usで1バイトですから、約6kB/sですね。最近のUSBメモリーなんかに比べたら、
動いているかどうかもわからない程度でしょうか(笑。 まあ、DRAMのアドレス設定やアクセスはすべてソフトウエアで
やっていますから、こんなもんかもしれません。 400kBのAztec-Cのファイルだと、転送だけで約1分です。SDカードへの
書き込みも含めると全体で2〜3分かかるかな〜。
 まあ、机の上を整理する時間に比べたら短いものです(笑。
 

まずは、CPM80の3号機と接続してデータの送受信ができることを確認しました。ただし、あまり高速な
データ転送は望むべくもなしです。ネットで6kB/sec程度の速度です。

あとは、データ転送に関するソフトを書き上げておきましょう。連休中のお楽しみです。


(おしまい? 最後までできるかな〜???)