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

●TK80のステップ動作

TK80のステップ動作については、[第241回]で、その動作について説明しました。

ユーザーが書いたプログラムを実行するには、そのプログラムの開始アドレスを、[ADRS SET]キーを使って、LEDの左4桁(アドレス表示部)に表示したあと、[RUN]キーを押します。
通常は、ユーザープログラムを最後まで(もし、最後があれば、ですが)一気に実行してしまいます。

しかし、このとき、「ステップ動作」SWをONにしておくと、[RUN]キーを押しても、最後まで一気に実行するのではなくて、たった1命令だけ実行すると、すぐにモニタプログラムに戻ってきてしまいます。
このとき、LEDのアドレス表示部には、今実行した命令の次のアドレスが表示されます。
またそのときのCPUレジスタの値は全てRAMの特定のエリアにセーブされていて、そのアドレスを指定することで、値を知ることができます。

この状態で[RET]キーを押すと、再びユーザープログラムに戻って、次の1命令が実行されますが、そこでまた実行を中止して、モニタプログラムに戻ってきてしまいます。

このように、ステップ動作は、ユーザープログラムを1命令ずつ実行しながら毎回モニタプログラムに戻ってくるという動作をします。
ユーザーが作ったプログラムが期待したのと異なる動きをしたときなど、このステップ動作を利用することで、効率のよいデバッグをすることができます。

TK80のステップ動作は、割り込みを利用しています。
というところまでを、お話したあと、割込みとEI命令、DI命令の説明に行ってしまいました。

EI命令はいきなり「割込み許可状態」にしないで、次の命令の実行が完了したあとで、有効になるように、回路に2段のDフリップフロップを使っていました([第243回])。
こういう仕組みが必要な理由についても、説明しました。

もしEI命令がすぐに受け付けられてしまうと、通常はEI命令の次には、メインルーチンに戻るためのRET命令がありますから、そのRET命令が実行される前に、また割り込みがかかってしまい、メインルーチンに戻れなくなってしまうからです(スタックだけ消費されていきますから、これが繰り返されると、最後には暴走してしまうことになります)。
EI命令の回路にある2段のフリップフロップは、それを防ぐためのものです。

もちろん、EI命令が実行されたあと、RET命令が実行されて、メインルーチンに戻ったあとは、もしINT信号がアクティブになっていれば、メインルーチンの命令を実行することなく、再び割込み処理が行われますが、割込み処理が完了してメインルーチンに戻ったあとに、次の割込みが受け付けられるわけですから、暴走したりはしません。

INT信号をずっとアクティブにしたままにしておくことで、割込みが連続して受け付けられる様子は、[第246回]で、写真をお見せしました。

しかし、この場合には、割込み処理が終わって、メインプログラムに戻ってすぐに次の割込みが受け付けられてしまうので、「ステップ動作」にはなりません。

●ステップ動作のための割込み回路にもフリップフロップが使われています

EI命令の仕組みは、EI命令の次の命令が実行されたあとで、「割込み許可状態」にするために、フリップフロップを使っています。
なんだか、ステップ動作にも、同じ考え方が利用できそうな気がします。

うーん。
もう限界だというのに、またまた回路を追加しなければなりません。
これは、つらい…。
しかし、覚悟を決めて、思いきって追加してしまいましたよ。

TK80のステップ動作回路を追加してしまった、INT回路です。


点線の四角で囲ったところが、追加したTK80のステップ回路です。
スイッチ(DS3−1)がONのときは、この回路は働きません。
回路を追加する前と同じことになります。
スイッチがOFFのときに、ステップ動作になります。

[09.6.21注記]
あとになって、この回路図が正しくない(最終ではない)ことに気がつきました。
上記の、スイッチについての操作も、最終回路ですと、全く逆になります。
そのことについては、[第255回]をお読みください。

●ステップ動作の割り込みのタイミングです

この回路がどのように働くのか、タイミングチャートを使って説明をしましょう。

すでに説明しましたように、EI命令が実行されると、2段のDフリップフロップ、D−FF(1)とD−FF(2)のQ出力は、順に図のタイミングでHになります。
回路図のDフリップフロップにはD−FF(1)、D−FF(2)という記号はついていません。
これは今回の説明のために仮につけた名前です。
IC212の、前段のフリップフロップがD−FF(1)で後段がD−FF(2)です。

D−FF(2)のQ出力がHになる、”RET”命令のT3以後、割込みの受け付けが可能になります。
ですから、もしこのとき以後にINT信号が入力されれば、早ければ、すぐ次の命令(next instruction)のT0のときに割込みが受け付けられることになります。

ところが、今回追加したTK80のステップ回路は、自動的にINT信号を発生させるのですが、その信号が実際に出力されるのは、D−FF(2)のQ出力がHになってから後のT2のときです。
したがって、タイミングチャートを見ていただくとわかりますように、”next instructon”が実行された、その次のT0にならないと、割込みは受け付けられないことになります。

この回路によって、メインルーチンの命令が1命令だけ実行された直後に、割込みが受け付けられることで、ワンステップ動作が可能になっているのです。

なお、8080には、T0やT3という信号はありませんので、TK80のステップ回路は、ここでお見せした回路とは同じではありません。
しかし動作の原理はここで説明した回路の考え方と同じです。
2009.6.12upload
2009.6.21「注記」を追加

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