CP/M-80をつくるぞ! 2016.9

なぜいまさらCP/Mを組んでみたくなったかというと,いろいろと理由がありますが、ちょっとだけ列挙。

CP/M80への敬意
 最初にPCを手にしたのは大学入学時に買ってもらったPC8801(学生なので親にかってもらいました).
発売間もなかったこともあり定価218,000円から1円もまけてもらえなかった。当時の記録媒体はもっぱらカセットテープ。
ピーヒャラヒャラと可聴音で記録するので1秒間に数100バイトが関の山。それでもずいぶん役にたったが、憧れは
ディスクシステムだった。PC8801用のFDは当時は高くて買えなかった(20万円くらいした)ので、結局は日本橋で中古のFD
(8インチのフルサイズなので漬物石の感覚。阪急電車でもって帰るのも重かったです)を買って、自作の
Z80システムでCP/Mを動かすことに。当時はこのCP/Mシステムを組むのが結構はやっていた気がします(で、どうやってCP/Mを手に
したのかなどは、今となっては・・・です)。片面単密度のディスクで容量は240kB程度ですが、速度も容量もカセットに比べたら雲泥の差です。
それが完成してからは、PC8801はターミナルとしてのみ使う羽目に・・。PC8801は起動後の入力はterm"N83XN" こればっかりだった
ような(ターミナルの起動コマンドです)。で最初にお世話になったDOSはCP/Mなわけで、色々と勉強させてもらったし、
かなり思い出があります。もう一度触ってみたいな〜っと。単にCP/Mだけを触りたいなら、探せばシミュレータなるものは沢山ありますが、
やはり本物のZ80で動くCP/Mを復活させたいです。この想いが一番強いです。やはり、ハードからつくって
DOSまで動作させることに達成感を感じますからね。
 
必要な部品は揃いそう
 大学のときに買ったZ80や周辺IC、さらにどこかのボードから外したSRAM(1MBit)が
手もとにあったので部品は揃いそうです。SRAMも何個かあるのでディスクもSRAM
が構成できそうなので、さらに製作してみたいという想いは強くなってきました。
なお、ディスクをRAMで構成するということも当時は結構流行っていたかな?
当時の市販のCP/Mマシンでも高いものはRAM-DISKが数10kBだが搭載されていた(先輩が持っていた.Talosという名だったかな?)。
いまとなっては容量は極めて少ないですが、これがあるとコンパイルなどがかなり早くできた記憶があります。
なんせフロッピのヘッドのシーク速度は遅いですから。


Z80周辺のICが部品箱に色々とありました。

CP/Mはフリーに

 もういまさらCP/Mをつかう人もいないのか、CP/Mが自由に使えるように開放されいます。
さらに、CP/Mで動く言語やアプリなども自由につかえるようになっているのでソフトの調達には困りそうにありません。
当時は高くて使えなかったHiTECH-Cなど、その他のソフトも色々とつかえそうです。

関連情報も沢山ありそう

 ネットを探すとCP/Mを動作させている人もたくさんいそうなので、そういったところから必要な情報は得られるでしょう。
海外ではAVR(マイコン)に8080をシミュレートさせてダイナミックメモリも制御しつつ、SDカードでCP/Mを動作させている強者もいるようです。

帰省時の時間つぶしに

 帰省先にもPCがあって、ちょっとだけなら半田付けやソフト開発もできるので、帰省したときの趣味のネタにもしたかった。


その他、考えたらいろいろと理由はありますが、昔懐かしさもあってCP/Mシステムを組み立ててみようという気が強くなってきました。

理由はともあれ、想いを実現していきましょう!
まずはハードを組み立てる。

構成は極めて簡単です。Z80とSRAMで構成したマイコンシステムをPICマイコンのI/Oにをぶら下げているだけです。
CPUの入出力をすべてPICに接続するために、できるだけ足の多いPICを選択しました。ここでは80PのPIC18F8723
を使いました。28PinのPICでもできそうでしたが、アドレスのラッチに2個以上はロジックICが必要になりそうだったので、
それらを省略するためにもPIC18F8723を使いました。ICソケットは使えないので、プログラムの書き込みはICSPになります。


制御のICにはPIC18F8723を使いました。80PinなのでI/0端子はたくさんあります。

ターミナル(Windows-PC)との通信はUSB経由でのRS232とします。これも最近使い出したFT232を使いましょう。

今回つかったZ80はCMOS版のZ84C000AP-6なので6MHz動作品です。6MHzで動かしたかったのですが、
手元に20MHzの水晶があったので、これを1/4分周して5MHzで動かすことにしました。
製作時点で6MHzの水晶を手にいれとけばロジックICの配線も不要だったのにと、ちょっと後悔です。
 
配線には、一部これを使いました。

被覆が半田の熱で溶けるので、簡単に配線ができます。でも、半田ゴテの温度が高くないと、逆に使いにくです。


こんな感じで配線ができます。

これをつかった理由は、SRAMの配線などは平行に単調な配線がつづくので、半田の熱で被覆がとけるこの線をつかうと作業効率があがります。
ちょうど秋月電子から売り出されていました。ただ、この線をうまくつかうにはこて先の温度が高い必要があるので
手元の25Wの半田コテではすこし容量不足だったかも。なかなか被覆がとけずに苦労して、余計に時間がかかったかもしれません。

ハードは一旦完成しました。


まずは最小限のCP/Mシステムを構成するためのハードが出来上がりました。
メモリは1MBit(128kByte)が3個乗っていて、1つはZ80用、残り2つはRAMディスク用です。

ソフトを組んでいきましょう!

CP/Mシステムは62k版を採用。BIOSはCBIOS.ASMを少しだけ修正して使用。
これらもネットで簡単に探してこれました。

Z80とPICとの通信は
Z80は純粋なCPUなのでそれ自体にはI/O端子はありません。端末(WIN-PC)との入出力などの通信は、PIC側を経由
する必要があるので、その先のPICとZ80での間に何らかの通信手段が必要です。このことは、最初に組み立てている
最中には、全然考えていなくて、最悪はZ80CPUの速度をすこし削るつもりで、定期的にPICからメモリの内容を読みにいって
メモリ内容を介して通信(すなわちZ80を停止しバスを開放させて、SRAMを読み書きするパターン)を考えました。
 でもZ80にも唯一の入出力端子があります。他の人もやられていますがHALT端子(出力)とNMI(入力)をつかえば、
うまく通信ができそうです。Z80はHALT命令があればHALT端子をLレベルにして動作を停止します。
復帰させるには割り込み信号入れてやればいいので、HALT端子をZ80からのコマンドリクエストとしてPICで監視して、
PICでの処理が終われば、割り込み信号(NMI)を加えることで、コマンドリクエスト完了の通信ができます。
コマンドの中身についてはメモリを介して行えばいいでしょう。
 ちなみに、ディスク(RAM-DISK)の読み書きの作業はほとんどがPICが行います。RAMディスクからZ80のメモリ空間の転送などは
Z80にやらせてもよかったのですが、そのためにはハード追加が必要だったのと、Z80のアセンブラをいまとなっては
使いこなせる自信がなかったからです。もはやC言語以外ではプログラムが組めない体になってしまいました。
まずはH/Wが完成しました。次はソフトの作成に入りましょう。
さて、さて色々とバグ取りしながらもCP/Mが動きだしました。
最初のプロンプト
A>
がでたときにはすこし小躍りしました。さて、これからどんどん仕上げに入りましょう。


欲がでてきます
 最初は動かすことだけが目的だったのですが、プロンプトがでるのをみてもう少し使えるシステムにしたくなりました。
ディスクは揮発性のSRAMということもあり、使うたびにPIPやSTATなどのコマンドをダウンロードする必要があるのですが、
やはり恒常的につかうには不便です。
 ちなみに、どうやってプログラムをダウンロードをしたかというと、CP/Mの動作中にZ80にリセットをかけて、PIC制御下の
モニターモードに移します。そしてPICをつかってWindowsPCから必要なファイルを1つづつバイナリ―で通信でRAM上に受信します。
19200bの速度なので10kB程度のファイルで約5秒かかります。
ダウンロードがおわったら、再度CP/Mを起動させてSAVEコマンドでディスクに書き出します。
バイナリ―のダウンロードの情報はZ80のRAM上の0100H番地から格納された状態になっています。
そしてたとえば

A>SAVE 21 STAT.COM

というようなコマンドでディスクに書き込みます。ここで21は256バイトブロックとした場合の保存するファイルの容量です。
これを繰り返すわけです。しかし、だんだんファイルがたまると電源は落とせませんね。
で、恒常的につかうことを考えた場合に大容量バッテリーバックアップ付のSRAMを搭載したCP/Mマシンを夢想(それも基板化)していました。
でも、作例にはSDカードをつかったものが多いようなので、これがつかえれば容量の束縛やバッテリーバックアップの呪縛からは逃れられます。
 やはり、SDカードをつかうことを考えましょう!この先は楽しそうだ。
 
でも、SDカードを使うには、いろいろな呪いがありました。


SDカードの呪い(その1)

先に述べたように、最初はディスクはSRAMのみにして、あとはバッテリーバックアップにしようかと
思っていましたが、大容量化(数MB程度)にするには現在の基板構成では無理で、新規に設計するか
あるいは基板を追加するなど、かなり物理的な手間をかける必要があり実現にはハードルが高そうです。
ほかの作例でもSDカードをつかっているので、ここは一発つかってみることにしました。
そもそもSDカードを使わなかった理由は、その使い方が面倒そうだったからです。なんせ、
やたらめったらコマンドを送信して通信しないといけなさそうだからです。

幸運にも
 CCS−Cコンパイラのドライバー集にSDカードの動作ルーチン集があることがわかりました。
これが、俄然SDカードをつかってみようとした理由です。でも、これがいろいろと苦労・・・
いや勉強する機会になりました。まず、


初期化すらできない・・・
 まずはいきなり、CP/M基板にSDカードを搭載(秋月の変換済基板を使用)しました。
簡単に動くだろうなとは最初は思っていました。

空いているスペースにSDカードコネクタをとりつけました。
簡単に動くと鷹をくくっていましたが・・・。

そして
 CCSのさきのルーチンをつかってテスト的に動かしてみることにしました。でも、動きません・・・。
 肝心のSDカードの初期化ができないのです。初期化時にエラーがでて返ってきます。
ハードの結線が違っていないか?ソフトが間違っていないか?いろいろと調べてみても
駄目なものは駄目です。すくなくとも信号線をオシロでみているとPICとSDカード間で通信はされて
いるようなので、ハードの問題なさそうです。

SDカードとSDHCカードとはちがうんだ。
 色々と調べてみるとSDカードとSDHCカードとは違うということです。どうやらCCSのソフトは
SDカード用(2GBまで)であって、SHDCカード(4GB以上)には対応していないようです。
今回買ったSDカードは16GBのもので、SDHCでした。秋月で安くかったものです。

秋月電子でかったこれを使いました。SDではなくSDHCです。

さらにネットでいろいろと調べると、SDHCカードを初期化するにはSDカードに加えて、より複雑な処理
が必要なようです。詳しくはここにありました。


SDHCにも対応できるSDカードの初期化は、次の手順になります。

このサイトにはFATも考えたプログラムも公開されているのですが、もっと単純にSDカードを物理メモリとしてのみ使いたかったので、
もうちょっと別の方法を探してみましょう。実はいきなり簡単な方向に流れをきろうとして、
SDHCではなく2Gバイト以下のSDカードを探すことに。
しかし、手元にあまっているSDカードがみつかりません。1枚だけディジカメにつかっている
SDカードが2Gのものでした。でもその物理的サイズが大きいのと、肝心のソケットがありません。
ソケットは秋月で頼めば2日程度で届きますが、週末中には無理だな〜(作り出すと気が焦ります)。
それに大きくて基板には載りそうにありません。

これがあればと思いましたが、ちょっとサイズが大きいです。

それでも、すくなくともSDカードだけでも中古でいいので探そうとしましたが、ヤフオクあたりをみても意外と2GBのものが高いです。
だいたい数100円〜1000円くらいでしょうか。最近の大容量のものに比べると容量比では割高感はぬぐえません。

ということで、2GBのSDカードの採用は一旦保留にして、なんとかSDHCで動くようにSDHCカード用のソフトを探して
みることに。意外と簡単に見つかりました。”SDHC CCS”で検索したら一発でみつかりました。


イニシャライズルーチンをSDHC用に改造したものがFreeでアップされていました。
また、この人の最後のコメントをみて笑ってしまいました。

やっぱり、世の中にはソフト作成でSDHCの壁にぶち当たって、2GBのSDカードを必要としている人が沢山いるんだな!と。
で、このルーチンを組み込んだところあっさり初期化に成功してSDカード(SDHC)がつかえるようになりました。

SDカードの呪い?(その2)
SDカードの呪い?いやSDカードは鈍いのです。SDカードの駆動はSPI(シリアルーパラレルインターフェイス)
で行うのですが、そのクロック数はマイコンで行うと数100kHzが上限です。すなわち、1バイト(8ビット)を
取り出すのには最高でもおよそ50kB/sが限界です。よくSDカードには転送速度○○MB/sなどと高速なことが書かれていますが、
これを実現させるには、SDカードなんたらの協会に加入(2000ドル)はらって、さらに年間(1000ドル)の
会費を払わないと、高速に通信するためのプロトコルを教えていただけないそうです。だから、
ネット上には高速に通信するためのソフトが全然なく、低速であつかうだけのものがホビーユースで
でてきています。
 まあたとえ50kb/Sの速度がでたとしても、その他の処理等を含めると実質には半分以下に転送速度は落ちそうです。
おそらく昔のフロッピー程度の速度になりますが、ちょうどレガシーなCP/Mを実現するにはいいのかもしれません。
ちなみにフロッピーの転送速度は片面単密度の場合だと回転数が360RPMです。1秒間6回転で1トラックを
一度に読めるととする128×26×6=20kBなのでちょうど同じくらいです。でも、実際に
フロッピーディスクではセクターを連続して読むことは難しく、インターリーブがかけられているので、
実際には6回転で26セクタをすべて読むことになりますので実際には3kB/sec程度でしょうか。
それに比べるとずいぶん早いかもです。

SDカードの呪い?(その3)
また、SDカードとSDHCカードでの使用上に大きな違いがあって、それに気づくのが遅れました。
SDカードへの書き込みサブルーチンでのアドレス指定は32ビット(4G)です。2G以下ならSDカード
は問題ないのですが、SDHCカード(私が使用したのは16G)では足りません。足りない分はどうやって
補うのかをふと考えましたが、まあそこまで容量をつかうこともないので、ほっときましょう!」
って感じだったのです。
 なぜ気づいたかといえば、サンプルプログラムを組んでSDHCで実際にどの程度の容量があるかを
確認してみたのですが、思ったより容量が少なかったのです。本来16Gバイトあるはずが、
実際には数10MBしかないとでてきます。まあ、実際10MB程度しか使う必要はないのですが、
どうも気になって調べることに。
 結論として、どうやら読み書きにつかったサブルーチンはSDカード専用のコメントであったみたいです。
SDでは絶対アドレスの指定になりますが、SDHCは512バイトをプロックとしたブロックアドレスでの指定になることがわかりました。
 しかし16GBのSDHCをつかっていて、実際につかう容量が10MB程度というのは勿体ないですね。
総容量の1/1000以下ですからね。どこかに32MBあたりのSDが10円くらいで売っていればベストです(笑)。


完成したハードウエア。SDカードも搭載しています。空きの8Pソケット2個はEEPROM用です。たぶん使いませんが・・


裏面です。配線がぶらぶらしないようにホットボンドで固定しています。

実際のシステムでは
 CP/Mのシステム(CCP+BDOS)にはAドライブの最初の1〜2トラック程度が必要になりますが、いちいちシステムをロードして
つかうのも面倒なので、CP/Mシステム自体はPICのROMに書き込んでおいて、ブートがかかればPICから直接RAMに
転送するようにしました(PICに容量があるのでこれも可能になりました)。
これなら、高速だし、あとはディスク作成時にいちいちシステムを追加して組み込む必要がありません。
だたしBIOSの変更などがあれば、そのときはちょっと面倒ですが、BIOS自体は一旦完成すれば触ることはないでしょう。

さてさてソフトも完成しました。


懐かしのCP/Mが再現できました。

完成しましたが、別に使う目的はありません。単にCP/Mを動かすこと自体が目的だったですから。
でも、今後に思い出したように使うかもしれませんので、今回の作業したときに参考になった資料類については
備忘録として整理して残しておきましょう。
 たくさんのWEBを参考にさせていただきました。改めてここで感謝の意を示します。
 
参考WEB
ここで色々と教えてもらいました

AVRとZ80でCP/M - neko Java Home Page - GMOとくとくbb
 http://star.gmobb.jp/koji/cgi/wiki.cgi?page=FrontPage
 http://star.gmobb.jp/koji/cgi/wiki.cgi?page=CP%A1%BFM%A5%B3%A1%BC%A5%CA%A1%BC
 http://star.gmobb.jp/koji/cgi/wiki.cgi?page=CpmtoolsGUI

やってみよう準備室 Z80マイコンボードの製作
 https://tech.nosuz.jp/2016/08/z80-cpu-borad/

CP/Mに関するソフトは下記から入手できます。
The Unofficial CP/M Web site http://www.cpm.z80.de/index.html
Commercial CP/M Software      http://www.retroarchive.org/cpm/
CPM Software (taken from http://www.retroarchive.org/) http://pcsauro.altervista.org/CPM.PHP

まだまだ参考にしたWEBがあるので、時間をみつけてまとめていきたいと思います。

まだまだいじって遊んでいます。 2016.10.31

当初はSDカードをつかって、ディスク2MBを4台、RAMディスク(250kB)を1台の5ドライブでソフトを組んでいましたが、
SDカードの容量ももったいない(実際には8MBしか使わないので16GBのSDカードからみれば使用率1/2000です)こともあり、
ディスクを2MBを8台まで拡張し、さらに仮想的に8バンク分持たせることにしました。起動時にどのバンクを使用するか任意に
選ぶことができるようにしています。これSDカードの使用量は2×8×8=128MBになりました。それでも16GのSDカードからみれば
まだまだ1/100程度ですね。あ〜もっと小さいSDカードに変更しようかな?でも、容量が小さくなっても値段はかわらないんですよね。

超速!
最初はZ80(正確にはTMPZ84C00)を5MHzで動かしていましたが、現時点でのZ80の最大速度は20MHzのようです。
5MHzだと、コンパイルなどをしていて、やはり少し遅い気亜がします。20MHzになると、ずいぶんストレスが小さくならうだろうな〜
と思って一度乗せ変えてみることにしました。
 Z80の20MHz版のDIP品についてはDIGIKEYではすにで在庫がなくなっていましたが、MOUSERにはありました。
あとあとつかうことも考えて2個ほど購入しました(使うかな?)。
 考えてみれば、最初(高校生のとき)にZ80を使ったときは2.5MHzのものだったので、それから比べると8倍速いことから、
ひょっとして感動ものかもしれません。


最初に使っていたZ80(6MHz品)。基板から半田を溶かしてはずした一品なので、足はもげかけています。

 
Z80の20MHzに交換しました。まだZILOGってメーカあるのかな?

CPUを換装して、クロックも20MHzを4分周して5MHzとしていたものを、分周器をバイパスして20MHzを直接たきこみます。
じつは、最初動くかどうか心配でした。というのも、メモリーのアクセス時間が追いつくかどうかがわからなかったからです。
Z80からのアクセス時間は基本は1.5クロックで、20MHzだと50ns×1.5=75nSnsです。メモリのアクセス時間は50nsなので
おいつきそうなものですが、実際にはZ80のワーストケースでは時間遅延が40nS以上発生するのでアクセス時間は35nS以下が
要求されます。となると、メモリーはおいついてこれません。
 でも、それは最悪のケースであって通常の場合は素子のオーバスペックをふくめてもっと余裕あるでしょうから大丈夫かもです。

無事動作しました。

ちょっとだけ心配しまsたが、起動すればあっさりとうごきました。
それにしても20MHzにすると気持ちがいいほど快適に動きます。そりゃ今までの4倍速ですからね。

気持ちよくコンパイルもできます。

もっとも20MHzにしたところでも、最近のPCで動かすエミュレータの方がもっと高速に動くでしょうが、
やはり本物のZ80が動くところに感動があります。ただ、20MHzくらいで動くなら、色々と応用もできそうです。

もっと、ちゃんとした基板をつくりたいな〜。

こちらはオーディオネタではありませんが、むらむらと基板にしてみたい欲求もでてきました。
ということで、帰省したときにチョコチョコとアートワークの作成にかかっている自分がいました(笑)。

ちょっと小さめのZ80によるCPM基板です。折角なのでIOもつけようかと画策中です。
どうせつくるのならTK-80みたいな大きな基板でつくろうかな〜っと考えているときが楽しいです。


その前に 

 Hi-TECH-Cをつかってコンパイラを動かすとSDカードをディスクにみたてていては結構時間がかかります。
一応、RAMディスクは320kBほど実装はできているのですが、コンパイラやリンカーなどすべてを乗せるとなると、
やはり1MB程度はないと便利にはつかえませんn。ということでZ80の換装に加えてRAMも変更することにしました。

最初に搭載してたRAMです。1MBitなので128kByteです。

最初は日立のSRAMをつかっていました。どこかの基板から引っぺがして保管していたものですが、
容量は1MBitなので128kByteです。これを3個つかっていたので、全体では384kBになるのですが、
Z80のメモリー空間に64kBとられるので実際にディスクとしてつかえるのは320kB程度です。
今回、4MBitのものに乗せ換えました。512kByteあるので3個あると1.5MBほどになります。

乗せ換えたSRAMです。DIGIKEYで@500円で買えます。まだDIP品があることに感動しました。

当然のことながら、若干配線を追加してソフトも修正です。あまり大した作業ではありません。
ハードウエア的には配線を1本追加するだけで済みました。SRAMのピン配置っでほぼコンパチですからね。

STATコマンドでデイスクサイズを確認です。1.47MBが確保できています。

実際にプログラムを動かして確認してみましょう。適当なサンプルプログラムを作成して
コンパイル・リンクです。リンクにすこし時間がかかるように浮動小数点の演算を入れて、
浮動小数点ライブラリーのリンクを加えるようにしました。
HI-TECH-Cは単精度ですが、浮動小数点がつかえるのが便利です。
もっとも、単精度では数値計算(数値解析)にはつかえる代物ではありませんが・・・・

浮動小数点の計算として、sin,cosを入れてみました。

実際にかかった時間を測定しました。測定には目覚まし時計をつかったので、計測誤差は1〜2秒あります(笑)。

Z80- 5MHz時  SDカード上:約65秒  RAMディスク上:約46秒
Z80-20MHz時  SDカード上:約28秒  RAMディスク上:約14秒


と、こんな感じです。もっと劇的に早くなるかと期待していましたが、CPUが動いている時間が結構長いのですね
まあ10秒ちょっとでコンパイルできるなら早いものです。おそらくフロッピーディスク上でやっていたら2分くらい
平気でかかりそうですからね。
ざっと計算するとRAMディスク上での使用時間14秒(20MHz)のうち、3秒がディスクアクセス、11秒がCPU稼働時間です。
46秒(5MHz)のうちなら、3秒がディスクアクセス、43秒がCPU稼働時間です。まあ、CPUはクロック数4倍の効果が
はっきりと出ています。ちなみにディスクアクセスはPICが完全にコントロールしているのでZ80の速度には無関係です。
あと、SDカードとRAMディスクの速度比は6〜7倍といったところです。これについてはPIC側のプログラムの改造で
もっと早くなるかな〜?。実際には300kB/sec弱といったところなので、I/Oピンにメモリをぶら下げて制御しているので
、 こんなものかもしれません。

TRY! CP/M-68K

Z80でCP/M-80を動かすことに成功して、さらにZ80-20MHzや1.5MBのRAMディスクを実現できたこともあり、
さらに完成版を目指すべく基板化おもくろんでいましたが、考えてみればZ80でのCPMについては
すでに約30年前に実行したことでもあり、懐かしさを楽しむ意味合いでしかありません。
そう思い出すと、やっぱりチャレンジングな内容をやりたくなってきました。
その目標はCP/M-68Kを動かすということです。

68k自体は大学生の時に組み立てたことがあります。構成は8MHzのMC68000に256kBのDRAMを実装して、さらに16kBのSRAM
および16kBのEP-ROM(EEP-ROMではない)を乗せていました。といっても、単なるモニタープログラムだけを載せて
単なる”動きました”的なものです。それでも、当時は結構先端を行っていた内容だと思います。
モニタープルグラムはアセンブラで組みましたが、当時はアセンブラもなかったのでCPM80上のBDS-Cで
クロスアセンブラをまず開発してから作業です。いや〜当時は若かったし、馬力もあったもんだと感心です。
とくにクロスアセンブラは集中的に取り組んで、ほぼ2〜3日で完成した記憶があります。
いま、そんなことしたらぶっ倒れてしまいそうです。

ようやく作業再開! 2017.1.5
いままで意外なところでつまづいています。TMP68301を入手したのはいいのですが、0.8mmQFP(100p)を2.54mmピッチに変換する
基板がどこにも見当たりません。すでに数世代前のICなので、そのような変換基板はもう絶滅してしまったのかも・・・。
aitendoさんにも無いようで色々とあたりましたが・・・ということでBBSで売っているようなところあれば情報ほしいと、ヘルプです。



ありがたいことに速攻で情報いただきました。う、調査不測が露呈してしまいました(笑)。

ようやく変換基板ゲットです。できるだけ安そうな通販サイトを探したのですが、なかなかみつからなくて、
最終的にRSコンポから取り寄せました。基板本体だけでCPUより高くなってしまいました。それにさらに送料がプラス・・・。
まあ、仕方ないですね。

CPU本体より高かったです。でもこれがないと始まりません。


問題なくとりつきました。

帰省先で半田付け開始しました。

年末年始に帰省しましたが、酒ばっかり飲んでいるのもなんなんで(笑)、基板作成にかかりました。
まずは適当に主要部品のみ搭載して半田付け開始です。

まずは主要な部品を乗せています。基板はかなり大きめのユニバーサルです。これも高かった〜。


半田面には銅はくテープでGNDラインを引いています。

3年半ぶりのご対面 2020.5.28

基板を整理していたら、こんなもんがでてきました。4年くらい前にCP/M-80の製作にとりかかって、
その勢いのままCPM-68Kも動かしてやろうとして、組みだしたものです。すでに配線は終わっているのですが、
なぜか、そこで中断してしまいました。たぶん、急激に作るモチベーションがなくなったのか、他に興味が移ったからでしょう。
まあ、よくあることです(笑

すでに組みあがっています。でも、これはとある理由があって作り直したものです・・・。


CPUは周辺機器を内蔵したTOSHIBAのTMP68301です。作り出したときは、
CPUだけのオリジナルのMC68000が手に入りませんでした(多分探しだせなかったのでしょう)。

で、なぜ再開することになったか?
 布団に入りながらALIのネットショップを眺めていたら、ふとMC68000が目に付きました。で、その値段を見ると、安い!
一番よくないパターンですね。必要に応じてでなく、安いから買うというのは(笑。
でも、気づいたら2個ほどポチッとしてました。また、部品箱の肥しになるな〜とおもいつつも満足です。
ここから、急にまたMC68Kへの興味が再燃してきました。

MC68000が安いです!買わずにはおれません(笑。

製作資料の捜索!
 さて、再開するにしても問題はこの基板の製作資料の捜索です。それがなければ、一から配線を紐解かなければなりません。
幸運なことに、のちのちのために製作資料(というかメモ)をどこかにファイルした記憶があるので部屋の中を捜索です。

でてきました!
 ほんとうのメモでしたが、資料がでてきました。殴り書きのもの含めて数枚ですが、これがあるのとないのとでは大違いです。
メモが散逸してもいいように、HPに備忘録代わりにアップしておきます。

 部品の配置です。



 メモリーのアクセスロジックです。あれ、RWのロジックは正負反対じゃないかな?あとで確認しておかなくっちゃ。
 
CPUを変換基板に乗せたあとのピン配置表です。千鳥の変換基板なので、これがあると便利です。でないと、必ず間違えてしまいます。

これがかなり重要です。PICとCPUとの結線表です。

結線表の縦バージョン。おそらくこちらが最初に書いたものかな?


メモリーのピン配置です。A0-A18まであるので512kByte(4MBit)のメモリーをつかっていました。
4つ使っているので2MBの容量です。いまのPCから見ればゴミの範囲ですが、30年前に2MBもあれば、
大してシステムだったでしょう。


回路図の見直し
下記の部分がなんかおかしい。通常RW信号はRead(H)でWrite(L)で、メモリーのWEもOEもどちらも負論理(Lで動作)なので、
信号が反転してしまっているようです。一応基板の配線を確かめたところ、回路図どおりになっており間違っています。

これは間違いです。WEとOEを反対に修正です。

動かしていきましょう!
CPM68Kが動くまでは、まだまだ道のりが遠い(たどり着かない可能性が高いかも)ですが、一つ一つ道を進めていきましょう。
当面のマイルストーンはCPUが動くことの確認です。
そのための手順は
 1)まずはPICが動いて、通信(UART)が動作する。
 2)メモリーの読み書きができる。
 3)MC68000の機械語表を探してきて、なにかのループプログラムを組む。
 4)メモリーに書き込み動作させる。

ここまでやって行きましょう。

まずは「1)通信」については、PICでUARTは何度も使っているので、無事クリアーです。STAGE1完了1(笑

次に「2)メモリー読み書き」です。これも簡単にパスするかと思ったら、超難渋・・・・・。書くと長くなりますが、書かないと
なんのことかいつか思い出せなくなると思うので、簡単に書くとバスの開放のやり方が間違っていました。
基板上のRAMに書き込むためには、MC68Kからバスを横取りしてPICですべての制御線(アドレス、データ、IO)
を動かしててメモリーの読み書きをします。バスの横取りは、MC68Kにバスの要求BR(BUS REQUEST)を出します。
そして、MC68KからBG(BUS GRANT)が帰ってきたら、それでよかったのですが、BGACK(BUS GRANT ACKNOWLEDGE)を
出してしまったことでMC68Kが動き出してバスの衝突が発生したのが原因です。ステップごとに基板の消費電流をみていて、
あるとき急に電流値が増える(通常60mAくらいが300mAくらい流れる)ので、衝突発生がわかりました。
まあ、なんのこっちゃ?という感じでしょうが・・・・。夜中の2時ごろまで格闘しました。

次に
「3)ループプログラム」ですが、これも以前に買ってあった書籍を引っ張り出して再読です。
とりあえず、自分自身のアドレスにジャンプするプログラムを書きました。
ニーモニックで書くと
$0002000  JMP.L $0002000
と超簡単プログラムです。全体で6バイトのプロラムラムです(命令2バイト、アドレス4バイト)。
プログラムとは呼べないかな?

すべて中古本です。なんせ30年ほど前に発刊されたものばかりです。

最後に
「4)動作確認」です。さきほどのプログラム(というものでもありませんが)、RAMに書き込んで、
MC68Kにバスを返却したのち、リセットパルスをたたきこんで、オシロでメモリーのアクセス状況と、PICでアドレスラインの値を監視です。


連続してメモリーをアクセスしていることが確認できました。
これはAS(ADDRESS STROBE)の信号です。


アドレスも命令のある位置を示しています。

祝!動き出しました!!!!

ようやく3年越しに基板が動き出しました。
でも、ここからが長そうです。まずはCPM68Kに関する資料の捜索と理解です。またほっぽらかして、数年後にチャレンジ
てなことになりそうな予感もありますが・・・・・

次のマイルストーンはLチカ! 2020.5.30

つぎなるマイルストーンはLEDチカチカ、いわゆるLチカです。デパチカじゃないですよ〜。
CPM68Kを動かすまでにはまだまだ踏まねばならないステップがいくつもあります。
なんせ、MC68000のアセンブラでプログラムをほとんど組んだことがありません。
すくなくともCPMを動かすにはBIOS部分は書かないといけないので、多少なりともアセンブラで
プログラムが組めないと話しになりません。
 それと、MC68000とPICとの通信も必要なので、MC68000のペリフェラルも動かさないと
いけないです。ということで、次なるマイルストーンに向けたステップは下記の通りです。

1)ハードの追加
2)クロスアセンブラを探す
3)簡易モニターの作成
4)Lチカプログラムの作成と確認

1)ハードの追加

 TMP68301の中のパラレルインターフェイスが使えるように、端子の取り出しです。それをPICに接続して
PICとの通信にします。通信といっても、単に68000からトリガーをかけるだけで、やりたい内容はすべてSRAMのデータを経由します。
そして難しい処理はすべてPICにまかせます。なんせC言語でプログラムが組めますからね。
 ハード的にもっとも簡単なのは、PIC側から定期的にSRAMの中を読み出して、御用聞きをすればいいわけですが、御用聞きのタイミングで
バスを止めてしなうことになります。そのため68000のスループットが幾分なりとも落ちるので、それをできる限りさけるために通信ラインを
設けます。
 あとは、現状の基板のクロックは9.6MHzですが、搭載しているTMP68301は12MHz品なのでもう少しクロックに余裕があります。
そこで、手元の25MHzの水晶を1/2分周してつかうことに。これで30%のスピードアップです。SRAMのアクセスタイムは55nSなので
まだまだ余裕があります。12.5MHzとなるとCPUの仕様をすこし越えますが、まあ大丈夫でしょう。
 
最初は9.6MHzで動かしていました(左)が、12.5MHzに増速(右)です。
25MHzの出力を1/2にするため分周器(74AC74)を追加しています。


基板上にパラレルインターフェイスの出力ピンを設けました。とりあえず16bit分すべてを取り出しました。
ここからPICにトリガーをかけます。

2)クロスアセンブラを探す
 フリーソフトで探します。国内では1個みつかりました。海外に目をむけると、いくつかあるようです。どれでもいいのですが、
国内産にしました。ここからDLしました。コマンドラインで使うので、いわゆるDOS窓を開いての作業になります。
ありがたく使わせていただきます。

3)簡易モニターの作成
 基板上のSRAMの内容表示と編集、プログラムのロード・実行(ジャンプ)が最低限できるモニターが必要です。
すくなくとも、クロスアセンブラで出力されるSフォーマットと呼ばれるHEXファイルをSRAMにロードする機能は必須です。
ということで。超簡単ですがモニタープログラムをつくります。これはすべてPIC上の話で、PICからMC68Kのバスを奪い取って
SRAMの読み書きを行います。
とりあえずコマンドは

 L Sフォーマットファイルのロード
 D メモリ内容のダンプ
 G 特定アドレスへのジャンプ(Go)

これだけですが、まずは十分です。

4)Lチカプログラムの作成
 さて、ここからが本番です。超久しぶりのMC68Kのアセンブラ書きです。どんな命令があるかも、すっかり忘れているので
一から書籍と首っ引きで格闘です。パラレルインターフェイスを初期化して・・・・ディレイのルーチンを組み込んで・・・
MC68Kのアセンブラは、とてもシンプルなのでディレイのプログラムも簡単にかけるようです。といいながら、
まだニーモニックをよく知らないので、ガイドブックと首っ引きです。
 とりあえず動くようになりました。

Lチカ成功です。

;   LED CHIKA-CHIKA
;
   org    $0000
   dc.L   $00200000   ; stack point
   dc.L   $00010000   ; jump address

   org   $10000
start:
   move.l   #$00fffd00,a0
   move.w   #$ffff,(A0)   ; all port output
   move.l   #$00fffd03,a0
   move.b   #$00,(A0)   ; mode 0
   move.l   #$fffd0a,a0
loop:
   move.w   #$ffff,(A0)   ; LED ON
   bsr      wait
   move.w   #$0000,(A0)  ; LED OFF
   bsr      wait
   jmp.l    loop
; subroutine for wait
wait:
   move.w   #30000,D0
loop2:
   SUBQ.w   #1,D0
   CMPI.w   #0,D0
   BNE      loop2
   rts
   end
こんな簡単なプログラムです。

長期戦に備えて 2020.5.31

色々とCPM68Kに関する資料やデータを集めて、ポチポチと眺めていると、どうやら長期戦になりそうな予感がしてきました。
その理由はあとで書くとして、それに耐えられるようにすこし基板に手を加えました。

1)電源はUSBからに変更
この基板には5V電源が必要で、通電時には電源端子に実験用電源からワニ口クリップで挟んで供給しています。
しかし、このワニ口クリップが曲者で、ボー〜としながら接続すると、たまに間違えることがあります。大抵は電源スイッチを入れる
前に気づきますが、電源スイッチを入れたままで通電したらアウトです。こういう経験は他の基板でも何回もあります。
ということで、このワニ口クリップはやめることにしました。消費電流をみると、だいたい80〜90mA程度なのでUSBから
供給することにします。USBは500mAまでの供給能力があるので十分余裕があります。 

ワニ口での電源供給をやめて、上のUSBからの電源供給にしました。

2)配線面の保護
 裏面は細い配線で一杯ですが、ふとしたはずみで配線をひっかけて切ってしまうかもしれません。それに、しばらく使わなくて
箱にしまいこむときに、他の基板類と配線が絡みあう羽目になるかもしれません。ということで、裏面に3mmのアクリル板を
ベースとして取り付けることにしました。

配線面の保護用のアクリル板を加工しました。幅が足りないので2枚付き合わせています。


配線面の保護のためのアクリルです。ついでにゴム足もとりつけました。

すこし長くなってきたので後編にページを切り替えます。

後編につづく

CPM80-1、2号機 お役目ご苦労様! 2020.8.24

CPM80も現時点ですでに6号機までつくってしまいました。
そろそろ動かさない基板については、再利用できそうな部品を取り外して整理していくことにしましょう。
というのも中でもPIC18F8723を使いたいのですが、結構お高い(PICなのに1000円以上する)ので、
拾い上げられそうな基板を探していました。


色々と勉強をさせてもらった1号機でした。RAMディスクもありますが、I/Oがありません。


I/Oも付加して2号機でした。RAMディスクがないのですこし使いづらかったです。