質問

Intel 8080 では割り込みはどのように機能しますか?Google と Intel の公式ドキュメント (197X) を検索しましたが、これに関する説明はほんの少ししか見つかりませんでした。この CPU をエミュレートするには、それについての詳細な説明が必要です。

役に立ちましたか?

解決 4

I最終的にそれを見つけて下さい!

私は中断オペコードが行くバスという変数を作成します。 その後、私は中断を処理するための関数を呼び出します:

void i8080::interruption()
{
    // only for RST
    cycles -= cycles_table[bus];
    instruction[bus]();
    INT = false;
}

INTは中断を必要とするとき、真です。 EIとDI命令はINTEを処理します。

INTとINTEが真の割り込みが実行されます。

他のヒント

8080 には割り込みライン (ピン 14) があります。すべてのペリフェラルは、通常「ワイヤ OR」構成でこのピンに配線されます (つまり、割り込み要求出力はオープンコレクタであり、割り込みピンは抵抗によって High にプルされます)。プロセッサには内部的に割り込みイネーブル ビットがあります。EI と DI の 2 つの命令は、このビットをセットおよびクリアします。したがって、割り込みシステム全体がオンまたはオフになり、「ベア」8080 では個々の割り込みをマスクすることはできません。デバイスが割り込みを発行すると、プロセッサは「割り込み確認」(~INTA) 信号で応答します。この信号は「メモリ読み取り」(~MEMR) 信号と同じタイミングを持ち、周辺デバイスをトリガーしてデータ バス上に「再起動」命令を配置することを目的としています。割り込み肯定応答信号は基本的に命令フェッチ サイクルであり、割り込みに応答してのみ発生します。

8 つの再起動命令 (RST 0 ~ RST 7) があります。RST 7 はオペコード「0xFF」です。再起動命令により、プロセッサはスタック上のプログラム カウンタをプッシュし、再起動ベクトルの位置で実行を開始します。RST 0 は 0x0000 にベクトルし、RST 1 は 0x0008 にベクトルし、RST 2 は 0x0010 にベクトルします。7 つのベクトルを 0x0038 まで再起動します。これらのベクタ アドレスは、実行可能コード、通常は割り込みサービス ルーチンへのジャンプ命令を含むことを目的としています。割り込みサービス ルーチンは、使用するすべてのレジスタをスタックし、必要な I/O 機能を実行し、すべてのレジスタのスタックを解除し、サブルーチンを終了する同じリターン命令 (RET、オペコード 0xC9) を介してメイン プログラムに戻ります。

再起動命令は実際のオペコードであり、プログラムの実行中にメモリからフェッチされた場合と同じことを行います。初期の EPROM には通常、空白の各位置に 0xFF が含まれていたため、キーボード モニター/デバッガー プログラムの「ウォーム リスタート」として Restart 7 を使用すると便利でした。空の EPROM を実行していた場合は、何か問題が発生したことを意味しており、とにかくモニターに戻りたいと考えている可能性があります。

RST 0 は RESET と同じメモリ位置にベクトルし、どちらも 0x0000 で実行を開始することに注意してください。ただし、RST 0 は戻りアドレスをスタックに残します。ある意味、RESET は 8080 が備えていた唯一のノンマスカブル割り込みと考えることができます。

割り込み信号によって割り込みビットもクリアされるため、割り込みサービス ルーチンは通常 RET の直前に EI 命令を実行する必要があります。それ以外の場合、システムは 1 つの割り込みイベントにのみ応答します。

CP/M はメモリの最初の 256 バイトをシステム用に予約し、その割り込みベクトル マップは最初の 64 バイト (再起動命令ごとに 8 バイト) を使用しました。CP/M システムでは、RAM は 0x0000 から始まり、ROM はメモリの最上位に存在します。これらのシステムは、ある種の賢いバンク切り替えを使用して、RESET 直後に EPROM などに切り替えてシステム ROM に JUMP 命令を送り、ブート シーケンスを開始できるようにしていました。メモリの下位に ROM を備えたシステムでは、最初の 64 バイトに RAM にあるベクトルに JUMP 命令がプログラムされていました。これらのシステムは起動時に RAM ベクトルを初期化する必要がありました。

は、割り込みハンドラに関数ポインタは、低メモリに格納されています。 最初のアドレスの一部32程度はハードウェア割り込みである:。トリガハードウェア

次の32ほどのアドレスは、これらは、ソフトウェア割り込みと呼ばれ、ユーザがトリガされています。これらはINT命令によってトリガされます。

INTにパラメータが。

と呼ばれる割り込みになります。のベクタ番号の、割り込みソフトウェアです

あなたは割り込みからの復帰にIRET命令を使用する必要があります。

それだそうあなたはずの割り込みを入力するときにあなたが最初のものとしても割り込み禁止ます。

さらに詳しくは、あなたが特定のプロセッサモデルのマニュアルを参照する必要があり、それが広く変化する傾向がある。

8080は、一般化することは不可能である、割り込みの取り扱いを制御するために外部のハードウェアに依存していました。インテル8214または8259、割り込みコントローラ上の情報を探します。

割り込みが他のハンドルの何かに通知して、CPUを中断する方法ですが、私は、Intel 8080チップの一定ではないけど、私の経験から、割り込みを記述するための最良の方法はこれです:

CS:IP(コードセグメント:命令ポインタ)は、メモリアドレス0x0000にこの命令である:0020、インテル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 is pointing here
0x0000:0021   INT 0x15

CS場合:次の行とINTerrupt 15進数のIPポイントが発行され、これは、CPUがスタックにレジスタおよびフラグを押圧した後、0x1000番地にコード実行、何が起こるかである:INTをサービス0100、15例として、

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から:IPポイントここにバック:ALLレジスタオフポップや状態を復元するには、発行され、それが実行されます時にCPUのCSは、014B、IRET(割り込みリターン)、 、0000の命令の後に:0021

0x0000:0022   CMP AX, 0
0x0000:0023   ....

、この割り込みベクタテーブルはBIOS内の特定の場所にBIOSによって設定された割り込みベクタテーブルに基づいて特定のオフセットにジャンプする場所CPUが知ってどのように、それは次のようになります:

INT    BIOS's LOCATION OF INSTRUCTION POINTER
---    --------------------------------------
0      0x3000
1      0x2000
..      ....
15     0x1000    <--- THIS IS HOW THE CPU KNOWS WHERE TO JUMP TO

そのテーブルがBIOSに格納され、INT 15が実行されると、BIOSは、CS再ルーティングされます。サービスコードを実行するBIOS内の場所にIPをそのハンドル割り込み

昔の

バックは、ターボCの下で、実際の割り込みハンドラは、独自のコードに再ルーティングされた機能のsetvectgetvectを使用して、独自の割り込み処理関数を割り込みベクタ・テーブル・ルーチンを無効にする手段がありましたます。

私は大丈夫、それはインテル8080ではありませんが、それは私の理解であり、チップのインテルのx86ファミリはそこから来たことを確認コンセプトは、そのチップのために同じであるだろう、私は十分にそれを説明している願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top