ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.6.30
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆USB接続 リモートプログラム
ND80ZVはその昔のTK80と同じ動作をします。CPUはZ80ですがTK80モニタプログラムとほとんど同じプログラムが搭載されています。
しかしそれだけではありません。ND80ZVにはTK80のイメージからは想像できないほどいろいろな機能を満載しています。
そのうちの1つがUSB接続です。
ND80ZVはボード上のPIC18F14K50のUSBインターフェースを介してUSBでWindowsパソコンと接続してデータの送受信を行なうことができます。
その機能の応用の1つとして、リモートプログラムを紹介します。

[第42回]

●USB(HID)応用 リモートプログラム(2)

前回、ちょいとすごいことをやっています、と書きましたが。
どこがすごいのさ?
と思われたかもしれません。

こういうことなのです。
以前に作りましたMYCPU80用のリモートプログラムは、TK80回路のLED表示データをUSB(RS232C)でホストに送信し、KEYから入力するところを、USB(RS232C)経由でホストから受信していました。
まあ、ごく当たり前のプログラムです。

ところで。
前回お見せしました/L(file load)ですが、それもUSBを使ってホストから送信しています。
前回は出てきませんでしたが、/Lと逆の機能も用意されています。
/S(file save)です。
たとえば
8000[ADRSSET]
8050
まで入力したあと、
/S filename.btk
とすると、アドレス8000〜8050のメモリデータが、先頭にアドレス情報の80008050をつけて、バイナリでsaveされます。
これもUSB経由で送られてきます。
このLOAD、SAVEはオリジナルのTK80ではカセットテープレコーダに対するシリアル送受信の機能でした。
キー入力、LED表示とは別のハードだったわけですが、今回のリモートプログラムでは、その別々のハードに対するデータの送信、受信を同じ1つのUSB送受信にまとめてしまっているのです。

さらに。
前回、レジスタダンプとメモリダンプの表示もお見せしましたが、ND80Zモニタプログラムでは、この2つの表示は、実はプリンタを接続したときに、プリンタに対して出力されるものだったのです。

先日特注品として作成しましたND80ZHでは、プリンタ接続ができるようになっていますので、レジスタダンプやメモリダンプはプリンタに対して行われます。

そうでした。
メモリダンプでプリンタに出力したものをお見せしておりました。こちらです([第13回])
レジスタダンプはこちら(第14回)にありました。

プリンタに対して出力しますから、出力データはプリントイメージです。
バイナリデータではなくて、ASCIIコードで出力し、行の終わりには、CRLFがつけられています。
これも今回はそのイメージのまま、USBでホストに送られます。

USBのデータ送受信では複数のパイプを使うことができます。
しかしそんな面倒なことはしておりません。
データの送信も受信も、同じエンドポイント(EP1)だけを使って行っています。
しかもHIDですから、一度に64バイトの固定長のデータしか送ることができません。
そのような制約があっても、ちょいと工夫すれば、いま説明しましたようないろいろ異なる性質のデータを同じ1本のパイプで送信、受信することができてしまう、というところに、ちょいとすごいなあ、と思っていただきたかったのでした。

ああ。USBでのデータの送受信に関しては、PIC18F14K50やZ80の側はそれほど大したプログラムではないのですけれど、ホストの側のC++のプログラムはなかなかに面倒なプログラムになっています。
必ずしも、高級言語ならば簡単、というものではないのです。
そのあたりにつきましても、いずれ順を追って説明をさせていただきますので、いましばらくお待ちください。

さて、前回の続きです。



前回はMEMORY DUMPの結果の表示までお見せしました。
アドレス8000〜8030(この指定の場合には803Fまでが表示される)のメモリデータがバイナリ(16進数)表示とASCII文字で表示されています。
これは、この範囲のメモリデータをバイナリでUSB受信して、それを加工して表示しているのではなくて、まったくこのままのプリントイメージで送信されてきたものをそのまま表示しているのです。
たとえば、最初の行の、8000  3E 03 …というところは、
38 30 30 30 20 20 33 45 20 30 33 20 …というデータとして送られてきたものです。
もちろん、なまのメモリデータはバイナリ数ですから、それをそのように加工しているのはND80Zモニタプログラムなのです。

ND80Zモニタにはこのメモリダンプのほかにもちょいとすごい機能があるのです。
それが上の画面で、メモリダンプの次に表示されている、逆アセンブラです。
メモリダンプと同じようにメモリアドレス範囲を指定してから、/a(または/A)と入力すると、ご覧いただきますようにその範囲の逆アセンブルリストが表示されます。
上ではアドレス表示部に8000が表示されていますから、それをそのまま開始アドレスとして利用して、終了アドレスの8020のみ入力しています。

この逆アセンブルリストも、もとはプリンタに出力されていたものですから、さきほどのメモリダンプと同じように、ASCIIコードのプリントイメージで送信されてきています。
逆アセンブルリストをプリンタ出力したものもお見せしておりました。こちらです([第16回])

[2011.6.30注記]この時点ではND80ZVには逆アセンブラの機能をつけるつもりでしたが、その後さらに機能追加をおこなったためにROMのメモリエリアが足りなくなってしまいました。そこでここで説明しているような形での逆アセンブラ機能は削除して代わりにWindowsパソコンのDOSプロンプトで機能するDOSプログラムとしての逆アセンブラをつけることにしました([第47回]参照)。
[注記ここまで]

また時間がなくなってしまいました。次回に続きます。
CPUをつくろう!第527回(2010.6.17upload)を再編集

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

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