まだまだ参考にした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枚付き合わせています。
配線面の保護のためのアクリルです。ついでにゴム足もとりつけました。
すこし長くなってきたので後編にページを切り替えます。
(後編につづく?)