2013.1.28
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第303回]


●普通のProgram Loader(2)

前回は普通のProgram Loaderの説明の入口で時間がなくなって、そこで終わってしまいました。

IPL(Initial Program Loader)と普通のProgram Loaderとどこが違うのかといいますと、プログラムを外部記憶からロードするという働きそのものに違いはありません。
普通のプログラムをロードするから普通のProgram Loaderで、起動時にシステムプログラムを最初にロードするからInitial Program Loaderです。

IPLはシステムの起動時にのみ実行され、そしてシステムプログラムをロードしたあとは、ロードしたシステムプログラムに制御を渡します(システムプログラムにジャンプします)。
普通のProgram Loaderはプログラムをロードするだけです(ロードした後でそのプログラムにジャンプするようにもできますけれど)。

IPLはPower Onした時やシステム起動時にのみ読み出され、システムプログラムをロードした後では表舞台からは隠れてしまうというちょっと特殊な振る舞いをします。
それだけにハード面とソフト面で工夫が必要になります。
しかし外部記憶装置からプログラムをロードするという、主たる働きにおいて両者は同じです。
そこでIPLの説明に先立って、まず普通のProgram Loaderについて説明をすることにいたしました。

E−80(仮称)ミニコンではプログラムやデータはUSBで接続したWindowsパソコンからロードします。
ND80ZV(ND80Z3.5)やMYCPU80と同じ方式です。
MYCPU80ではUSBインターフェイスとしてFT232RLを使っていますが、ND80ZV(ND80Z3.5)ではPIC18F14K50を使っています。
E−80(仮称)ミニコンでもPIC18F14K50を使います。

ND80ZV(ND80Z3.5)ではPIC18F14K50にUSBだけではなくてRS232Cインターフェイスの役も背負わせたために、ちょっと窮屈な回路になっていますが、E−80(仮称)ミニコンではPIC18F14K50はUSB専用としましたので、比較的わかりやすい回路になっています。

具体的には、PIC18F14K50とCPUとの間でデータを受け渡しするのに、ND80ZV(ND80Z3.5)では4ビットずつ2回で行なっているところを、E−80(仮称)ミニコンでは8ビットを1度で送受します。
E−80(仮称)ミニコンのそこのところの回路図は前回お見せしましたが、戻って見ていただくのも面倒かと思いますのでもう一度あらためてお見せすることにいたします。

E−80(仮称)ミニコンのPIC18F14K50まわりの回路図です。

PIC18F14K50との間でデータの受け渡しをするために、74HC373と74HC244を各1個使います。

82C55やPICなどでは同じ端子で入力と出力ラッチを切り換えることができますが、74HCではそのような便利なICはありません。
74HC245は双方向バッファですが出力をラッチすることはできません。
そこでこの図のような使い方をすることになります。

IORD+アドレスFCHで74HC244がアクティブになってPICから出力されたデータを読み込みます。
IOWR+FCHで74HC373にデータを出力しラッチします。
74HC373からの出力は82C55からの出力(14K50WR)がLのときアクティブになります。

これだけではCPUとPICとの間でのデータの方向やタイミングが合わせられません。
そこでそのためにPICに制御情報を伝えるために74HC174を使い、PICからの制御情報を受け取るために別にもう1個の74HC244を使います。
こちらのほうはIOWR、IORDとアドレスFEHでコントロールします。
データ線と違って双方向ではなく向きは固定しています。

実はE−80(仮称)ミニコンではPIC18F14K50のほかに、もうひとつ別のPIC(16F886)を使っています。
この74HC174と74HC244は2つのPICとの間の制御信号のやりとりを合わせて行なっています。

回路図を見ていて気がついたのですが制御信号を入力するための74HC244は空きができています。
当初はもっと別の信号を入力していたのですが、設計を変更する過程で空きができてしまいました。
今ここに入っているBSという信号もここに入れる必要は無くなったことがわかっていますから、それならここは74HC244ではなくて、74HC126でもよさそうです。

PICとCPUとの間のデータの受け渡しのための制御出力はPICから2本とCPU側から2本の計4本で行ないます。
ただし送受信に対してCPUとPICは対等ではありません。
CPUがマスターでPICはスレーブです。
そこでその立場の違いによって信号の役割がちょっと異なります。

CPUがPICにデータを送る場合には、データを74HC373にセットしてからSTROBE=Lにします。
これに対してPICはREADY/BUSY=Lを返します。

これをもう少し詳しく言いますと、CPUはPIC側がREADY/BUSY=Hであることを確認してからSTROBEをLにします。
PICはデータを読み込んだらREADY/BUSY=Lにします。
CPUはREADEY/BUSY=Lを確認したらSTROBE=Hにします。
PICはSTROBE=Hを確認したらREADY/BUSYをHにします。

このようにちょうどお互いが2本の手を握り合ってタイミングを確認しながら送信受信を行ないますから、このような方法をハンドシェイク(Hand Shake)と言います。

さてCPUがデータをPICに要求するときは、PICの側のSTROBE=Hを確認してから、READY/BUSY=Lにしますが、このときはREADY/BUSYではなくてDATA REQUESTの意味で出力します。

PICはそれ以前にデータを受信していても、PIC側から勝手にデータをCPUに送ることはしません。
受信したデータは受信バッファに貯えておいて、CPUから要求があるのに備えています。

PICはCPUからのREADY/BUSY(DATA REQ)=Lを確認したら、データを出力してSTROBE=Lにします。
CPUはPICからのSTROBE=Lを確認したらデータを読み込みます。
そしてデータの読み込み後にREADY/BUSY(DATA REQ)=Hにします。
PICはCPUからのREADY/BUSY(DATA REQ)=Hを確認したら、STROBE=Hにします。

実はこのときにはPIC側のバッファに受信データが無いという場合が考えられます。
そこでその場合にはPICはデータを受け取るときに使うもう1本の出力線READY/BUSYをLにします。
CPUはデータ要求をしたときにPICからのSTROBEとともにREADY/BUSYも同時に確認して、それがLならばデータを読み込まずにそのままリターンします。

CPUがPICからデータを受け取る場合には、受信データが無いという以外に受信エラーが発生したことを伝える場合もでてきます。
しかしそれについては説明がこみいってきますのでここでは省略することにいたします。

今回もまた時間がなくなってしまいました。
実際のProgram Loaderのプログラムについては次回に説明することにいたします。

ワンボードマイコンでCP/Mを![第303回]
2013.1.28upload

前へ
次へ
ホームページトップへ戻る