ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.6.26 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆それは特注品の試作から始まりました TK80コンパチブルで、その上中日電工オリジナルのND80Zとしても動作するというZ80CPUのワンボードマイコンを企画し、その開発準備をしていたところに、ND80Zの特注品の開発依頼をいただきました。 |
[第6回]
●ステップ回路
TK80とMYCPU80(TK80回路)の、ステップ回路、ステップ動作の仕組みについては、TTLでCPUをつくろう[第241回]から何回かにわたって説明をしました。
TK80もMYCPU80(TK80回路)も、ステップ動作は割り込みを利用しています。
8080はEI命令とDI命令によって、割り込みを受け付け可能にする(Enable Interrupt)か、割り込みを受け付けできないようにする(Disable Interrupt)かをプログラムでコントロールすることができました。
マスカブルインタラプト(Maskable Interrupt)です。
今回のZ80版TK80も、ステップ動作には、マスカブルインタラプト(INT)を利用しています。
8080の割り込みはINT信号入力によって行われるマスク可能な割り込みだけだったのですが、Z80ではそのほかにマスクできない割り込み(NMI)があります。
またマスク可能な割り込みも、8080と同じモードのほかにも用意されています。
●NMI
Z80版TK80もTK80と同じように、ステップ動作ではマスク可能な割り込み(INT)を使いますから、今回のお話としてはNMIは関係ありません。
ですけれど、せっかくNMIという言葉がでてきたのですから、とりあえずは、まずZ80のNMIというものについて、簡単に説明をすることにいたします。
NMIはINTと違って、割り込みの許可、不許可をソフトウェアでコントロールすることができません。
どんな場合(たとえばCPUが暴走したようなときとかハングアップしてしまったときなど)でも、NMIは必ず受け付けられます。
そういうときのためには、RESET端子があるわけですが、リセットをすると初期状態に戻ってしまうため、電源投入時と同じ処理から開始することになってしまいます。
そこまではしたくないが、ハングアップ状態はクリアしたい、というようなときのためにNMIが用意されています。
と思っていたのですが、そもそもの目的はそういうためのものではなかったようです(後述)。
WindowsパソコンのリセットボタンがCPUのRESETに相当するとすれば、[Alt][Ctrl][Delete]の入力がNMIということになります。
緊急時割り込み、スーパーバイザーコールを可能にします。
NMI割り込みはZ80CPUのNMI端子をLにすることで受け付けられます。
NMI信号が入力されると、CPUは無条件で、アドレス0066番地からのプログラムを実行します。
ところで。
突然なのですが、[第4回]でご紹介したZ80の「Dadasheet」なのですが、いくらなんでも簡単すぎて、これじゃあ詳細についてはわかりません。
これは「Datasheet」というよりも、パンフレットみたいなものです。
おまけに文字も図版も読みにくくて、いかにも複写といった感じです。
もうちっと「まし」なものは無いのか、ということであらためて捜してみました。
そしたら、やっぱりありました。
●Z80 User Manual
308ページあります。
そうでしょう。そうでしょう。やっぱりこのくらいは欲しいですねぇ。
ところで、このMANUALなのですが、私の捜し方が悪かったのか、Zilog社のサイト内検索では出てきませんでした。
うう。
でも、まあ、よそ様のことに余り文句を言えたものではないのですねえ。
ウチ(中日電工)のサイトだって、相当にいい加減なつくりで、自分でも、どこに何が置いてあるのか、わからない状況ですから…。
最近は、自分が書いた過去記事を検索するのに、もっぱらGoogle様(実際は慣れているのでGoo検索)のお世話になっております…(汗)。
Googleで、「zilog z80 user manual」で検索すると、検索トップに表示されます。
え…、と…。
そうでした。NMIでした。
で、このZ80 User Manualを見てみますと、こんなふうに書いてあります。
[出典]Zilog社Z80CPU User’s Manual
おお。これならば。
きれいなMANUALです。
でも…。
きれいなことはよいのですけれどねえ。
これだけでは知りたいことがわかりませぬ。
おまけにFigure10は、肝心のNMIパルスが抜け落ちて(!)おりましたので、私が描き加えておきました。
おお。そうですか。
…to provide immediate response to important signals such as an impending power failure.
なるほど。
直訳しますと、
差し迫った(impending)電源異常などの重要なシグナルにすばやく対応するために…、
NMIが使われる、と書いてあります。
そうですか。もともとはそういうために用意されたものだったのですね。
私はてっきりもっぱらスーパーバイザーコールが目的だと思い込んでいました。
ま。それはそれでよいのですけれど。
でも。
ちょっと待ってくださいねー。
これを読みますと、ですねえ。
NMIに対する、CPUの動作は、通常のMemory Readと同じ動作をする(?)が、しかし、ただひとつ異なっているのは、バス上のデータは無視されて、PC(プログラムカウンタ)の値を外部スタックにオートマチックに退避したあと、0066にジャンプすることである。
これは日本語に訳してみても、ちょっとよくわからない文章です。
しかもタイミングチャートがまたよくわかりません。
文章からすると、NMIが受け付けられたあとの、M1にあるPCというのは、Next Instructionのアドレスということらしいのですけれど、そこから先にどうなるのかが全くわかりません。
これについては、たまたま手元にシャープ鰍フZ80テクニカルマニュアルがありましたので、それを見てみたのですが、全く同じ内容でした。
それともうひとつ、上の文章では、NMIが受け付けられるタイミングについては、全く書かれていません。
「通常のinterruptと同じ」だなんて、それは、手抜きでしょうよ。
んじゃ、ということで、通常のinterruptについて見てみましたら、
[出典]Zilog社Z80CPU User’s Manual
なるほど、ここにはちゃんと書いてありました。
ということは、INTもNMIも各命令の最後のクロックの上がりエッジで検出される、ということですね。
ところで、ここで素朴な疑問です。
INTはEI、DIによって制御できます。
でも、NMIはソフトウェアでは禁止することができません。
そう書いてありますし、なんたって、Non Maskable Interruptなのですから、信号が入ったら、必ず、直ちに、0066にジャンプしてしまいます。
すると…。
もしも、0066にジャンプしてNMI処理ルーチンを実行しているときにも、まだNMI信号がアクティブのままだったら…。
都合が悪いのではありませんか?
その疑問に対しては、Z80の端子説明のところに書いてありました。
[出典]Zilog社Z80CPU User’s Manual
negative edge−triggeredと書いてあります。
ちなみに、INTのほうは、このように書いてあります。
[出典]Zilog社Z80CPU User’s Manual
INTのほうは、active Lowですから、Lowレベルの入力信号です。
そのLowレベルが命令の最後のクロックの上がりエッジで検出される、ということですから、ここは素直に納得、です。
INT割り込みは、受け付けられると、自動的に割り込み禁止状態になりますから、Lowレベルのままであっても、重ねて割り込みが受け付けられることはありません。
もちろん割り込み処理が終わって、EI命令が実行されるまでの間には、Highに戻しておく必要があります。
さもないと、割り込み処理が終了した直後にふたたび割り込みが受け付けられてしまいます。
ところで、NMIのほうは、さきほどの文章にありましたように、negative edge−triggeredです。こちらのほうはINTとちがって、信号のnegative−edgeつまり信号の下がりエッジのみが有効ということです。
いちど信号がHighになってからでないと、ふたたび検出されることはない、ということになりますから、それならば、マスクできなくても、割り込み処理の間に重ねて受け付けられることはない、ということになります。
ところで(と、ところでばかりが続きますが)NMIはINTと同じく、命令の最後のクロックの上がりエッジでサンプリングされるとのことなのに、その一方で、NMIはその信号の下がりエッジのみが有効というのは、一体どういうことなのか?とさらに疑問が浮上してくるのでありますが、これはおそらく、edge−triggeredという言葉に意味があるような気がします。
多分、NMIの下がりエッジがトリガとなって、CPU内部のどこかにNMIの入力がラッチされ、それが命令の最後のクロックで検出される、のではないかと考えられます。
それについては、[第4回]でご紹介したZ80の「Dadasheet」に、次のような説明がありました。
Although NMI_ is an asynchronous input,to guarantee its being recognized on the following machine cycle,NMI_'s falling edge must occur no later than the rising edge of the clock cycle preceding the last state of any instruction cycle(TLI).
NMIは、非同期入力(おそらくCPUクロックと同期していなくていい、という意味)だけれども、その入力に続くマシンサイクルで認識されるためには、命令の最後のクロックの上がりエッジよりも前にNMIの下がりエッジがなければならない、と書いてあります。
NMIはレベルではなくて、下がりエッジがトリガになるのだけれど、それがCPUによってサンプリングされるのは、それよりもあとにある命令の最後のクロックの上がりエッジなので、そのクロックの上がりエッジよりもあとにNMI(の下がりエッジ)が入力されたら、次の命令の最後のクロックにならないと、そのNMIは認識されないよ、ということでしょう。
今回はステップ動作のためのINT回路について説明をするつもりだったのですが、ついNMIにはまってしまって、時間がなくなってしまいました。
INTおよびステップ回路についてはまた次回に、ということにいたします。
CPUをつくろう!第437回(2010.2.20upload)を再編集
ワンボードマイコンをつくろう![第6回]
2011.6.26upload
前へ
次へ
目次へ戻る
ホームページトップへ戻る