標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第181回]

●前回のプログラムの説明です

もう一度、リストをお見せしましょう。



BOOTLOADERと書いてありますね。
よくご存知の方が見れば、バレてしまうのですが、本当は、まだ、BOOT LOADERではありません。
ただのloaderです。
でもいずれBOOTLOADERにしてしまおうと思っていますから、そのようにタイトルをつけました。

PICが232Cで受信したプログラムを1バイトずつ受けとって、RAMに格納していくためのプログラムです。
このプログラム自身をLOADすることはできません。
このプログラムは、トグルスイッチをパチパチやって、0000番地から書いておきます。
でもわずか30バイト程度のプログラムでも、これを実行するだけで、PIC経由でパソコンからプログラムをLOADすることができてしまいます。

●パソコンとPICとの間のデータ通信

パソコンから「つくるCPU」ボード上のPICへは、232C通信でデータ(マシン語プログラム)を送信します。
マシン語プログラムは、CPUボードのメモリに書き込まれるときにはバイナリコードですが、232Cで送信するときには、バイナリコード(16進コード)をASCIIコードに変換したものを送信します。
バイナリコードのままでも送信できないことはないのですが、できるだけ標準的な方法でするように考えたので、そのようにしてあります。

たとえばさきほどのプログラムの最初のマシン語コードは16進数では、21です。
8ビット表現では00100001です。メモリにはこういう形で格納されます。
これは8ビットですから、このまま232Cで送信すれば簡単なのですが、一般的には、232Cでは、データではなくて、文字を送信します。
ですから、この00100001(21)を文字の”21”に変換します。文字コードはASCIIを使います。
16進数の0〜FをASCIIコードにすると、下のようになります。なお()は16進数表記です。
0 00110000 (30)
1 00110001 (31)
2 00110010 (32)
3 00110011 (33)
4 00110100 (34)
5 00110101 (35)
6 00110110 (36)
7 00110111 (37)
8 00111000 (38)
9 00111001 (39)
A 01000001 (41)
B 01000010 (42)
C 01000011 (43)
D 01000100 (44)
E 01000101 (45)
F 01000110 (46)

ですから、1バイトのマシン語コードの21は、2バイトの文字”21”をASCIIコードにした、32,31に変換して送信します。
なんでそんな面倒なことをするの?
という疑問がでてくるのも当然なのですが、もともと232Cはホストコンピュータと端末装置との間での通信ルールだったため、文字以外にもいろいろな制御情報もデータと一緒に送る必要があったからです。
たとえば端末(代表的なものはプリンタ)に対して、一般的な「改行」を指示するコードは、CRコード(carriage return復帰)+LFコード(line feed改行)です。CRは16進数の0D、LFは16進数の0Aです。

すると、一般的な232Cルールにしたがっている受信装置に対して、0Dや0Aをデータとして送っても、それを受信した装置は、データとしては受け取らず、「改行」もしくは「データの終り」の意味に受け取ってしまいます。
そのようなルールが一般的であるために、16進コードを送信する場合にも、それをASCII文字に変換してから、送信するようにします。

PICはASCIIコードのデータを受け取ると、そこでASCIIからもとの16進数に変換します。
そして、それをCPUに渡します。

●PICとCPUとの間のデータ通信(ハンドシェイク)

PICとCPUとの間のデータ送受信の回路は[第129回]にあります。
PICは2バイトのASCIIコードを受信すると、それをもとの1バイトの16進数に変換して、CPUに渡します。
CPUとの間のデータの受け渡しは8ビットパラレルで行いますが、CPUがまだ読み取っていないのに、どんどんPICがデータを出力してしまわないように、PICとCPUとの間で確認をしながらデータの受け渡しを行います。


PICは8ビットのデータを出力ポートに出力すると、そのことをCPUに知らせるために、RB0をLにします。PICのRB0はI/Oアドレス98のbit0入力につながっています。
CPUはI/Oアドレス98のbit0を監視していて、そのラインがLになったら、応答として、I/Oアドレス98の出力bit0をLにします。
そしてデータを読み込みます。8ビットのデータはI/Oアドレス94の入力から読み込まれます。
CPUは受け取ったデータをメモリに格納して、次のデータを受け取る準備ができたら、そのことをPICに知らせるために、さきほどLにしていたI/Oアドレス98のbit0出力をHにします。
この間、PICはCPUの応答を監視していて、CPUからのbit0の応答ラインがLになったことを確認してから、RB0出力をHにしておいて、次のデータの受信を行います。
PICは次のデータをCPUに送り出す準備ができたところで、CPUのI/Oアドレス98のbit0出力のラインを確認します。そのラインがHになっていたら、次のデータの送出を行います。

なお、上の説明でI/Oアドレス98のbit0が入力と出力の両方で出てきますが、同じアドレスの同じビットでも、ハード回路は、入力と出力のラインは別々のものです([第129回]の回路図参照)。

このように2本の制御線を使って、互いの状態を確認しながらデータ送信を行う方法をハンドシェイクと言います。

データの受け渡しをしているときの2本の制御線の様子です。



説明を書いていて、気がつきました。
今回紹介したloaderプログラムには、冗長なところがありました。
最後のLOOP2は余分でした。
さっそく直しましょう。

本日も、また時間がなくなってしまいました。この続きは次回にいたします。
2009.3.11upload

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