Intel 8080で割り込みはどのように機能しますか?GoogleとIntelの公式ドキュメント(197X)を検索しましたが、これについての説明はほんの少ししか見つかりませんでした。このCPUをエミュレートするには、詳細な説明が必要です。
5 に答える
8080には割り込みライン(ピン14)があります。すべてのペリフェラルは、通常「ワイヤOR」構成でこのピンに配線されます(つまり、割り込み要求出力はオープンコレクタであり、割り込みピンは抵抗でハイにプルされます)。内部的には、プロセッサには割り込みイネーブルビットがあります。EIとDIの2つの命令は、このビットをセットおよびクリアします。したがって、割り込みシステム全体がオンまたはオフになり、個々の割り込みを「ベア」8080でマスクすることはできません。デバイスが割り込みを発行すると、プロセッサは「割り込み確認」(〜INTA)信号で応答します。この信号は「メモリ読み取り」(〜MEMR)信号と同じタイミングであり、周辺機器をトリガーしてデータバスに「再起動」命令を出すことを目的としています。割り込み確認信号は、基本的に命令フェッチサイクルです。
RST 0〜RST7の8つの再起動命令があります。RST7はオペコード「0xFF」です。再起動命令により、プロセッサはスタック上のプログラムカウンタをプッシュし、再起動ベクトルの場所で実行を開始します。RST 0ベクトルから0x0000、RST 1ベクトルから0x0008、RST2ベクトルから0x0010など。7つのベクトルを0x0038に再起動します。これらのベクトルアドレスは、実行可能コード、通常は割り込みサービスルーチンへのジャンプ命令を含むことを目的としています。割り込みサービスルーチンは、使用するすべてのレジスタをスタックし、必要なI / O機能を実行し、すべてのレジスタをアンスタックし、サブルーチン(RET、オペコード0xC9)を終了する同じ戻り命令を介してメインプログラムに戻ります。
再起動命令は実際のオペコードです。つまり、プログラムの実行中にメモリからフェッチされた場合も同じことを行います。初期のEPROMには通常各空白の場所に0xFFが含まれていたため、キーボードモニター/デバッガープログラムの「ウォームリスタート」としてRestart7を使用すると便利でした。空のEPROMを実行している場合、それは何かがうまくいかなかったことを意味し、とにかくモニターに戻りたいと思ったでしょう。
RST 0はRESETと同じメモリ位置にベクトル化し、両方とも0x0000で実行を開始することに注意してください。ただし、RST0はスタックにリターンアドレスを残します。ある意味で、RESETは、8080が持っていた唯一のマスク不可割り込みと考えることができます。
割り込み信号も割り込みビットをクリアするため、割り込みサービスルーチンは、通常はRETの直前にEI命令を実行する必要があります。それ以外の場合、システムは1つだけの割り込みイベントに応答します。
CP / Mは、システムで使用するためにメモリの最初の256バイトを予約し、その割り込みベクタマップは最初の64バイト(再起動命令ごとに8バイト)を使用しました。CP / Mシステムでは、RAMは0x0000で開始し、ROMはメモリの最上位にありました。これらのシステムは、何らかの形の巧妙なバンク切り替えを使用して、EPROMまたはRESETの直後に何かを切り替え、システムROMにJUMP命令を提供して、ブートシーケンスを開始できるようにしました。メモリマップのローエンドにROMがあるシステムは、RAMにあるベクトルへのJUMP命令を最初の64バイトにプログラムしました。これらのシステムは、起動時にこれらのRAMベクトルを初期化する必要がありました。
8080は、割り込みの処理を制御するために外部ハードウェアに依存していたため、一般化することはできません。Intel8214または8259割り込みコントローラーに関する情報を探してください。
やっと見つけた!
割り込みオペコードが入るバスと呼ばれる変数を作成します。次に、割り込みを処理する関数を呼び出しました。
void i8080::interruption()
{
// only for RST
cycles -= cycles_table[bus];
instruction[bus]();
INT = false;
}
INTは、中断が必要な場合にtrueになります。EIおよびDI命令はINTEを処理します。
INTおよびINTEが真の場合、割り込みが実行されます。
割り込みハンドラへの関数ポインタは、ローメモリに格納されます。最初のアドレスの約32は、ハードウェア割り込みです。ハードウェアによってトリガーされます。
次の32ほどのアドレスはユーザーがトリガーでき、これらはソフトウェア割り込みと呼ばれます。それらはINT
命令によってトリガーされます。
INTのパラメータは、呼び出される割り込みとなるソフトウェア割り込みベクタ番号です。
IRET
割り込みから戻るには、この命令を使用する必要があります。
割り込みを入力するときに最初に行うこととして、割り込みも無効にする必要がある可能性があります。
詳細については、特定のプロセッサモデルのドキュメントを参照する必要があります。これは大きく異なる傾向があります。
割り込みは、他の何かを処理するための通知でCPUに割り込みをかける方法です。インテル8080チップについてはよくわかりませんが、私の経験から、割り込みを説明する最良の方法は次のとおりです。
(CS:IP
コードセグメント:命令ポインタ)は、メモリアドレス0x0000:0020でこの命令にあります。例として、Intel 8086命令を使用して説明するために、アセンブラはぎこちなく、実際の意味はありません...命令は想像力に富んでいます。
0x0000:001C MOV AH、07 0x0000:001D CMP AH、0 0x0000:001E JNZ 0x0020 0x0000:001F MOV BX、20 0x0000:0020 MOV CH、10; CS:IPはここを指しています 0x0000:0021 INT 0x15
CS:IPが次の行を指し、誤ったINT
15の16進数が発行されると、これが発生します。CPUはレジスタとフラグをスタックにプッシュし、0x1000:0100でコードを実行します。これは、例としてINT15にサービスを提供します。
0x1000:0100 PUSH AX 0x1000:0101 PUSH BX 0x1000:0102 PUSH CX 0x1000:0103 PUSH DX 0x1000:0104 PUSHF 0x1000:0105 MOV ES、CS 0x1000:0106 INC AX 0x1000:0107...。 0x1000:014B IRET
次に、CS:IPが命令0x1000:014Bにヒットすると、IRET
すべてのレジスタをポップオフして状態を復元する(Interrupt RETurn)が発行され、実行されると、CPUのCS:IPは命令の後にここに戻ります。 0x0000:0021で。
0x0000:0022 CMP AX、0 0x0000:0023...。
CPUが特定のオフセットにジャンプする場所を認識する方法は、割り込みベクトルテーブルに基づいています。この割り込みベクトルテーブルは、BIOSによってBIOSの特定の場所に設定され、次のようになります。
INTBIOSの命令ポインタの場所 --- -------------------------------------- 00x3000 1 0x2000 .....。 150x1000<---これはCPUがジャンプ先を知る方法です
そのテーブルはBIOSに保存され、INT
15が実行されると、BIOSはCS:IPをBIOS内の場所に再ルーティングして、割り込みを処理するサービスコードを実行します。
昔、Turbo Cでは、関数を使用して独自の割り込み処理関数で割り込みベクトルテーブルルーチンをオーバーライドする手段がsetvect
ありgetvect
、実際の割り込みハンドラーは独自のコードに再ルーティングされていました。
十分に説明できたと思いますが、Intel 8080ではありませんが、それは私の理解であり、Intelx86ファミリのチップと同じ概念であると確信しています。