CPLD+SIMMを使ってUSBプロトコルの解析を!
VHDLを速習! XC95144XL+16MB・SIMMを使ってUSBプロトコルアナライザを作ってしまいました!
主目的は差し迫った事情からUSBプロトコルの解析をすることだったのですが、その手段として選んだのがコレ!
[第55回]
●ハードウェアによるウォームブート(6)
前回からの続きです。
前回は、「Legacy8080の起動の仕組みから見ると、CPU RESETによるウォームブートは無理ではないか」という意味のことを書きました。
「出口なし」です。
しかし、それで諦めてしまったらそれまでです。
ちょっと見たらできそうにないと思えることでも、じっくり考えていくと意外にも解決の方法がみつかったりするものです。
今回も、最初は前回書きましたように「あかん。無理や」と思ったのですが、そこをもうひとがんばりしてじっくりねばって考えてみましたら、おお、解決策があるじゃありませんか。
解決に必要な複数の問題の解決策が一挙にひらめきました。
問題点を整理しますと以下の2点になります。
1)CPU RESETによりCPU(Z8S180)は0000番地から実行を開始するが、PIC16F886によってIPLが書き込まれたときもPIC16F886から出力されるRESET信号によって、Z8S180は0000番地から実行を開始する。
前者はウォームブートを実行しなければならないが、後者はコールドブートである。
この両者をどのようにして区別するか。
2)CPU(Z8S180)はPIC18F14K50との間でUSB通信のためのデータのやりとりを行っている。
突然のCPUリセットはシステムをハングアップさせてしまうが、それを避けるにはどうすればよいか。
CPU RESETによって、CPU(Z8S180)はRAMの00000からプログラムの実行を開始します。
その00000には最初はPIC16F886によって、IPL(イニシャルプログラムローダー)が書き込まれていますが、それはCPUが起動して、IPLを実行して、システムプログラムを読み込んでしまうまで必要なだけなので、読み込みを終わってしまったら、そこにはシステムのためのジャンプ命令が上書きされます。
Legacy8080での初期起動動作は、まずIPLによってZB3BASICのシステムプログラムがRAMの0400〜7F7Fにロードされたあと、0000〜に必要なジャンプ命令を書き込んだ後0400番地台の初期LOAD後のエントリポイントにジャンプしてZB3BASICの起動処理に入ります(その過程でRAMバンクが設定されます)。
ここで重要なことは、その流れのなかでは0000番地にはジャンプすることなくZB3BASICシステムにエントリするという点です。
実はCP/Mでも同じことが言えます。
CP/Mが最初に起動するとき(コールドブート)はシステムプログラムをロードしたあとBIOSのエントリアドレスにジャンプします。
0000番地にはその後にウォームブート処理ルーチンへのジャンプ命令が書き込まれますが、最初のコールドブート時には0000番地は実行されません(実行する必要はありません)。
つまりCP/Mの場合0000番地はウォームブート専用のエントリポイントです。
その仕組みをそっくりそのままZB3BASICでも使えばよいということに気が付きました。
上にも書きましたようにZ8S180がPIC16F886によって起動するとき(コールドブート)は、一旦は0000番地からスタートしますが、それはIPLを実行するためで、BASICシステムをロードしてしまったら、もう0000番地に戻る必要はありません。
そのままBASICシステムにジャンプしてしまえばよいからです。
このときもND80ZV(3.5)からの流れで0000番地にはBASICシステムへのジャンプ命令を書き込むようになっていますが、しかし現行のシステムではコールドブートしか想定していませんから、そこ(0000番地)に何を書いても無意味です。
なぜならコールドブートによって、そこ(0000番地)には、PIC16F886によってまたIPLが書き込まれてしまうからです。
それならば、0000番地にウォームブート処理プログラムへのジャンプ命令を書いておけばよいではありませんか。
こうすることで、同じ0000番地からのスタートでありながら、システムリセット(コールドブート)ではIPLを実行し、CPU RESETではウォームブートを実行することができます。
これで第一の問題点は解決できました。
説明の途中ですが、本日は時間がなくなってしまいました。
この続きは次回にいたします。
CPLD+SIMMを使ってUSBプロトコルの解析を![第55回]
2014.5.23upload
前へ
次へ
ホームページトップへ戻る