16ビットマイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第24回]
●Trace Flag(3)
TRACE割込みに限らず、8086の割込み時のレジスタ退避はCALL命令の実行時とは異なっています。
そのことをよく理解するためにまず8080の場合について考えてみます。
8080の場合にはCALL命令の動作と割込み時の動作は同じです。
割込みが発生すると次に実行するはずだったプログラム命令のアドレスがスタックに退避されたあと、割込み処理ルーチンにジャンプします。
CALL命令も同じで、CALL命令の次のアドレスがスタックに退避されたあと、CALL命令で指定したアドレスにジャンプします。
割込み処理ルーチンの終わりにはRET命令を置きます。
CALLによって呼び出されたプログラムの最後もRET命令で終ります。
RET命令が実行されるとスタックトップにあるアドレスがPC(プログラムカウンタ)に戻されるので、その結果退避されていたプログラムアドレスから続きが実行されます。
このように8080ではCALLも割込みも同じ動作になるため、メインプログラムに戻るためにはどちらもRET命令を使います。
ここで退避、復帰されるのはPC(プログラムカウンタ)の値だけです。
PC以外のフラグレジスタやそのほかのレジスタは必要に応じてユーザーが退避させる必要があります。
Z80の場合にはCALLに対してはRETを使いますが、割込みに対してはRETIを使います。
どちらも退避、復帰されるCPUレジスタはPCだけで、その限りでは8080と動作は同じです。
Z80では割込み許可フラグの状態も退避するように考えられているほか、周辺ファミリーLSIにも割込み処理ルーチンの終了を知らせるためにRETと区別してRETI命令が用意されています。
しかしファミリーLSIを接続しない場合などでは、Z80も8080と同じように、割込み処理ルーチンの最後をRET命令で終っても、特に支障はありません。
それでは8086(AM188も同じ)の場合についてはどうでしょうか。
8086の場合、
CALL命令では8080と同じようにPCが退避されますが、それに加えてCS(Code Segment register)もスタックに退避されます。
逆にRET命令ではスタックからCSとPCに値が戻されます。
[訂正]
上記はCALLF(セグメント間CALL)およびRETF(セグメント間RET)のことでした。
普通のCALL、RETでは8080、Z80と同様、PCしか退避されません。
[第26回]に関連記事があります。
[訂正ここまで]
そしていよいよ8086の割込み時の動作です。
実は8086では、割込みが発生すると、PCとCSだけではなくて、フラグレジスタもスタックに退避されます。
そのために割込み処理プログラムの最後は8080、Z80とは違ってRETで終ることはできません(フラグレジスタが残されてしまい、同時にSPの値も食い違ってしまいます)。
割込み処理を終了するための命令として前回の最後に書いたIRETが用意されています。
IRET命令が実行されると、スタックからフラグレジスタ、PC、CSに値が戻されます。
その結果、割込みによって保留されていた命令が実行され、もしTFがセットされていたら、その命令の実行後にTRACE割込みが再び発生することになります。
16ビットマイコンボードの製作[第24回]
2018.5.23upload
2018.5.29訂正
前へ
次へ
ホームページトップへ戻る