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

●ND80ZVROMメモリマップ

前回はCDROMの内容について紹介をいたしました。
本日になってから、あらためて読んでみましたら、落ちているファイルやら日付の古いファイルやらがぽろぽろ出てきまして、そのたびに画像を修正してUPし直しましたので、結構時間がかかってしまいました。
でもこうしてホームページにUPすることで、そのように見直してミスを発見することができるのですから、有り難いことです。

で、そのようにして読み直していましたら、なんとかしたいなあ、というところが出てきました。
nd80z3romフォルダのところです。

nd80z3romフォルダは前回お見せしておりますが、もう一度お見せします。

「nd80z3rom」フォルダにはND80ZVのモニタROMに書き込まれている、ND80Zモニタプログラム、ZB3BASICのソースプログラムがあります。またそれらのソースプログラムをZ80アセンブラ(ZASM.COM)でアセンブルして作成された、バイナリファイルやリストファイルも入っています。
と、前回そのように説明をいたしましたが、そりゃあ不親切ってものです。
ということに気がつきました。
せめて、それぞれのソースプログラムが一体どういうプログラムでどこに収まるのか、というくらいのことは書いておくべきでありましょう。
そこで簡単ではありますけれど、各プログラムがND80ZVモニタROMの中でどこに配置されるのかを示したROMメモリマップを作成いたしました。
こういうことになっています。



NDMON0M、NDMON4Pは0000番地、0400番地スタートのTK80モニタです。
ND3MON2OはND80Zモニタです。
ZMON1MはBASICシステムの基本的なサブルーチンです。WindowsパソコンのROMBIOSに相当します。
CMDTBL1GはBASICシステムコマンドおよびBASICシステムのマシン語モニタコマンドのテーブルです。
ZENTRY1XはBASICシステムのモニタルーチンです。MSDOSの場合のMSDOS本体に相当します。
CMDTBL2CはBASICコマンドテーブルです。
ZBASIC2VはZ80BASICのメインプログラムとコアなサブルーチンです。
ZBSB2_2Lは拡張機能的なBASICシステムサブルーチンです。
ZRRCNV1Hは、BASICシステムのマシン語モニタコマンドルーチンです。
ZDFLO1BはBASICシステムの倍精度浮動小数点演算ルーチンです。

●USBデバイスのセットアップ(Enumeration)の仕組み

先日から悩んでおりました、時々ND80ZVがUSB接続時に不明なデバイスになってしまうことについて、やっとなんとか解決できそうです。
そのことにつきましては、もちろん順をおって説明をしていく予定ですが、その前に予備知識といたしまして、USBのEnumerationなるものについて、簡単に説明をいたします。

Enumerationにつきましては、[第626回]でせっかくND80ZVを使って実際のセットアップの過程をモニタしたものをお見せしましたので、そのデータをもとにして説明をすることにいたします。

USBのセットアップは、エンドポイント0を使って行われます。
セットアップのときに送信、受信されるデータは一度に8バイトです。
そうではない設定もできるようですが、ここでは8バイトで行います。

最初はパソコンのUSBホストコントローラからのデバイスディスクリプタ送信要求で開始されます。
USBのセットアップは、ディスクリプタとよばれる、USB装置の情報を一定の書式で記述したものを、ホストコントローラからの要求に従って送信することで行われます。
ディスクリプタの詳細についてはいずれ時間をみつけて説明していきたいと思いますので、ここでは各ディスクリプタの中身には触れないで、手続きの流れについて見て行きたいと思います。

8000  5D 41 80 06 00 01 00 00-40 00 40 08 42 12 01 00  ]A......@.@.B...
8010  02 00 00 00 08 40 40 40-01 40 40 40 40 40 40 40  .....@@@.@@@@@@@


このデータはPIC18F14K50のUSBプログラムに細工をして、受信、送信データ以外の情報も ごちゃまぜになっていますが、その中から送信、受信データ に注目して説明をしていきます。

1)80 06 00 01 00 00 40 00
ホストからの要求コマンドです。
最初の2バイト、80 06 がディスクリプタの送信要求です。その次の2バイトでディスクリプタの種類を指定しています。
00 01 はデバイスディスクリプタです。
後ろから2バイト目の40は送信するデータのバイト数です。40は16進数ですから、64バイトを送れと要求していることになります。本来のバイト数よりも大きい数値が指定されたときは、本来のデータを全て送ります。

2)12 01 00 02 00 00 00 00
PIC18F14K50からの送出データです。デバイスディスクリプタの最初の8バイトを送ります。

3)2行目の中ほどにある、01はPIC18F14K50が、USBホストコントローラからのリセット信号を受けたことを示しています。理由はわかりませんが、ここで一度リセットが入るようです。
私のプログラムでは、リセットについては特にアクションはしていませんが、べつに問題はないようです。

8030  40 40 40 40 40 40 40 40-40 08 41 00 05 01 00 00  @@@@@@@@@.A.....
8040  00 00 00 08 42 D8 04 0A-00 01 00 00 00 40 40 40  ....Bリ.......@@@

4)00 05 01 00 00 00 00 00
アドレスの指定です。1)、2)の段階ではADRS=0で行われます。
ここで、はじめてUSBデバイスに個別のアドレスが割り当てられます。
最初の00 05 がset addressコマンドです。その次がアドレス番号です。
このときは、USBには他になにも接続していませんでしたから 01 が指定されました。

5)アドレス0で空データを返す
D8 04 …というデータを送っているように見えますが、これはモニタしているプログラムの都合でこうなっているだけで、set addressコマンドに対しては、アドレス0のまま、0バイトを送ります。
余り深く考えないで、そういうルールだと理解してください。

なお、アドレスはPIC18F14K50のUADDRレジスタにセットするだけで、あとはPIC内蔵のUSBコントローラがそのアドレスで送受信の処理をしてくれます。

時間がなくなってしまいました。
本日はここまでにいたします。
2010.10.7upload

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