ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.1
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆リモートプログラム
これまで何回かにわたって説明をしてきましたBASICはND80ZVとパソコンをUSBで接続して、パソコンのDOSプロンプト上から操作します。
ND80ZVとパソコンとをUSBで接続していきなりBASICを起動するのではなくて、手順としてはまず最初にリモートプログラムを実行します。
リモートプログラムはND80ZVのキーボード入力とLED表示をDOSプロンプト画面で行なうことのできるプログラムです。

[第72回]

●ND80ZVとの接続シーケンス

本日は朝からずっと、DOSのリモートプログラムとND80ZVのUSB接続のシーケンスについてのこまごまとしたところを構築しておりました。
いままではとにかくデバッグ優先ですから、接続とか切断とかといったあたりのシーケンスはほとんど無視、やっつけ、でやっておりました。
でもシステムも少しずつ完成に近づいてきましたので、ここらあたりできちんと整理しておこう、と考えたのが本日の作業のきっかけです。
あちこち、やりっぱなしできましたので、けっこう整理するのがホネでしたけれど、なんとかサマになったようです。

ND80ZVはTK80モニタプログラムとND80Zモニタプログラムの両方を搭載しています。
そのいずれも、パソコンとの接続は全く不要で、ボード上の16進キー、機能キーから入力、7セグメントLEDに出力することで、マシン語プログラムの作成と実行を行うことができます。

その昔のオリジナルのTK80と全く同じ使い方です。

●リモートプログラム

ND80ZVのROMに焼いてありますTK80モニタプログラムは、TK80の機能動作とほとんど同じなのですが、もうひとつのモニタプログラムである、ND80Zモニタプログラムは、TK80の機能をかなり拡張したものになっています。
当社が以前に発売しておりましたND80Zシリーズのモニタプログラムがもとになっています。
ND80ZモニタプログラムもTK80モニタと同様に、ボード上のキーボードから入力して、7セグメントLEDに表示するように動作するのですが、WindowsパソコンとUSBで接続した場合に、ボード上のキーから入力する代わりに、パソコンからUSB経由で送られてきたキー入力データをボード上のPIC18F14K50から受け取り、そして7セグメントLEDに表示すると同時に、その表示データをPIC18F14K50に送ることで、USBを経由してパソコン上のDOSプロンプト画面にも表示されるようにプログラムされています。

この仕組みは、TTLで作ったCPUボードMYCPU80のリモートプログラムの仕組みをもとにしています。
ただ、もともとはシステム的に構築するほどのものではなかったこともあって、接続するのも、切断するのも、かなり手作業的なものになっていました。
今回はその接続から切断までのところをスムーズにするように手を加えました。

ND80ZVはパソコンとのリモート接続をするときは、TK80モニタではなくて、ND80Zモニタで起動します。
モニタの選択はND80ZV本体ボード上のディップスイッチで行います。
パソコンとND80ZVの接続はUSBケーブルで行いますが、ケーブルを接続してND80ZVの電源を入れただけでは交信は開始されません。
ND80ZVはUSBケーブルを接続した状態でも、接続していないときと同じように独立して操作できる、ということを優先したためです。

接続のシーケンスは、普通DOSプロンプト側のリモートプログラムを起動することから開始します。
USBケーブルを接続しても、ND80ZVのZ80CPUは、そのことを全く認識していませんが、ND80ZV本体ボード上のPIC18F14K50は、USBケーブルの状態を常に監視していて、パソコンと接続された時点で(パソコン側のリモートプログラムが起動される以前に)、パソコンのUSB(HID)ドライバとの間で基本的な接続を確立しています。

ですから、パソコンのDOSプロンプトで、リモートプログラムを起動すると、ただちにND80ZV(実はND80ZVボード上のPIC18F14K50)が検出されるため、
ND80ZVに接続しました
というメーセージが表示されます。


ではこれにND80ZVはどうやって応答するか、といいますと、その仕掛けは、ND80ZVのモニタROMの中に仕込んであります。
ROMの中のUSB接続をアクティブにするプログラムを実行すると、キー入力プログラムがPIC18F14K50からデータを受け取るプログラムにスイッチされ、また7セグメントLEDの表示プログラムに、PIC18F14K50へデータを送出するプログラムが追加されます。
デバッグ初期は、そのプログラムを実行するために、(ND80ZVの)16進キーから、アドレスを入力して、[adrsset][run]と操作していたのですが、そのままではちょいといただけません(そのほうがマニアックでよいのかもしれませんけれど…)。
ND80ZVのキー機能で、使われていないものがありますから、それを利用することにしました。

以前ND80Zではプログラムやデータを保存するときに、カセットテープレコーダを使っていました。TK80も同じです。
カセットテープに録音するという方法は当時ではなかなかに便利なものでしたが、テープに傷があったりちょっとした回転ムラなどでうまく録音できないこともよくありました。
ですから、本当にうまく録音できたかどうか、チェックしてみる必要がありました。
それがベリファイです。
ND80Zモニタでは、[I/O]キーに続けて[8(VF)]キーを押すことで、ベリファイを実行するようになっていました。

このベリファイはND80ZVでは全く不要です。
そこで、現在は使われていない、[I/O][8(VF)]のキー操作でリモート接続を起動するようにしました。

上のDOS画面の表示のあとで、ND80ZVのキーから[I/O][8(VF)]と操作します。
すると、リモート接続がアクティブになって、下の画面になります。


PIC18F14K50を通じてND80ZモニタとDOS側のリモートプログラムとの間の通信接続が確立すると、そのことをわかりやすく表示するために、DOS側のリモートプログラムから[READINC]キーコードを送ります。
ND80Zモニタはそれを受けて、READ INC後のLEDのアドレス表示部とデータ表示部のデータを送ってきます。
それが上の画面です。
アドレス0001とデータ0000が表示されてキー入力待ちになっています。

そのときのND80ZVのLED表示です。

上のDOS画面と同じLED表示になっています。
これ以後は、パソコンのDOS画面の表示とND80ZVのLEDの表示は連動するようになります。
なお、さきほどのND80Zモニタの側のリモートプログラムを起動するときのキー操作[I/O][8(VF)]は、この写真のキーで、上の列の真中の[*(I/O)]キーと左の上から3番目の[8(VF)]キーを続けて押す、という操作です。

パソコンのフルキーボードの[+]を押したところです。

[+]は[READ INC]キーとして働きます。
そのキーコードはND80ZVの側に送られて、ただちにその結果が返送されてきます。
次のアドレス0002と、そのメモリの値0008が表示されました。

そのときのND80ZVのLED表示です。


[1][2][3][4]と入力してみました。


その入力データは1つのキーを押すごとにND80ZVに送られて、LEDに表示されます。

この写真では、DOS側で[1][2][3][4]と入力してから、LEDに1234と表示されたように見えますが、実際のLEDの表示は、次のように行われます。
キー入力前のLEDのデータ表示部   0008
[1]を入力                  0081
[2]を入力                  0812
[3]を入力                  8123
[4]を入力                  1234

うーん。そのようにして写真を撮るとよかったですねえ。

そのあと[ADRSSET]を入力しました。

DOS側のリモートプログラムでの[ADRSSET]は[.](ピリオド)キーを入力することで行われます。
フルキーボードの右側の数字キーボードを使うことを前提にして考えてあります。
[ADRSSET]はND80ZVでただちに実行されて、その結果がDOS側に送られてきます。
DOSの画面に、アドレス1234とそのメモリ内容345Eが表示されています。
データ表示部の表示は、その直前のデータ表示部の右2桁が左2桁にシフトして、そのあと右2桁にアドレス表示部に表示されているアドレスのメモリ内容が表示されます。

そのときのND80ZVのLED表示です。


リモートプログラムを終了するときは[Ctrl]キーを押した状態で[E]キーを押します。

[Ctrl]+[E]で終了するというのは、EXIT、またはENDの意味からです。
一般的な[Ctrl]+[C]([Ctrl]キーを押しながら[C]キーを押す)でも終了できますが、[Ctrl]+[C]はDOSのシステムプログラムでもブレイクコードとして使っていますから、危険です。
状況によっては、システムによって強制終了されてしまって、ログファイルがクローズされずに破棄されてしまう可能性がありますから、このリモートプログラムでは[Ctrl]+[E]で終了できるようにしてあります。

今回の作業で、この部分に手を加えました。
[Ctrl]+[E](または[Ctrl]+[C])の入力で、いきなりDOS側のリモートプログラムを終了してしまうと、ND80ZVの側は通信状態のままハシゴを外された形で残されてしまってハングアップしてしまいます。
そこでリモートプログラムの終了前にND80ZVに[0][0][0][0][ADRSSET][RUN]を送信して、ソフトウエアリセットをかけるようにします。
上の画面の最後の0000 00C3の表示は、[0][0][0][0][ADRSSET]を送信したことへの、ND80ZVからの最後の応答です。
その直後の[RUN]の送出によって、ND80ZVはソフトウェア的にリセットされ、初期状態(電源投入直後の状態)に戻ります。
そうしておいてから、DOS側のリモートプログラムを終了します。

そのときのND80ZVのLED表示です。

USBでのリモート接続は解除されていますから、通常のキー操作が可能になっています。

この状態は最初のリモートプログラムの起動前と同じ状態ですから、この状態で、再びリモートプログラムを起動して、ND80ZVとリモート接続することができます。

リモートプログラムはまだ作成途中ですからzb2nという名前になっています。
最初のリモートプログラムの起動のときと同じ状態です。
この状態で、ND80ZVのキーから[I/O][8(VF)]と入力すれば、さきほどと同じように、またND80ZVのリモートコントロールができるようになります。

ND80ZVで、[I/O][8(VF)]とキー入力しました。

ふたたびND80ZVがUSBでリモート接続されました。

今回はちょっと時間が無くなってしまいましたので、Z80BASICの起動と終了についての説明ができませんでした。
それについてはまた次回に説明いたします。
CPUをつくろう!第557回(2010.7.19upload)を再編集

ワンボードマイコンをつくろう![第72回]
2011.7.1upload

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