Z-80 中斷結構
我們知道 Intel 8085 有五個中斷引腳(TRAP、RST7.5、RST6.5、RST6.5 和 INTR),但 Zilog Z-80 只有兩個中斷引腳,即 NMI 和 INT。但與 8085 相比,它具有更優越的中斷結構。
INT 中斷
它是一個低電平有效的,電平觸發的輸入中斷。它是可遮蔽的,並且可以使用 **DI** 指令將其停用。當中斷引腳被停用時,如果 IO 裝置使能了 INT 引腳,Z-80 將不會被中斷。即使在復位後,它也會被停用。因此,如果我們希望 MPU 被該引腳中斷,則程式中必須有 **EI** 指令。
有三種中斷模式,在使用 INT 引腳中斷後,會發生不同的操作。這些模式是模式 0、模式 1 和模式 2。
中斷模式 0 (IM 0)
它是 Z-80 的一條 2 位元組指令。操作碼為 **ED 46H**。執行此指令後,INT 輸入將表現得像 IM 0。這是復位後的預設模式。
此模式類似於 8085 的 INTR。因此,它是非向量中斷。MPU 啟用 **IORQ** 和 M1 來響應中斷。
因此,在 IM 0 中 INT 的流程(假設 NMI 未啟用,並且已執行 EI 指令以使能中斷系統)如下:
- 它完成當前指令,然後使能 INT,使能 M1,以及
- 從外設接收 RST 或 CALL 指令
- 停用中斷系統
- 將程式計數器值壓入堆疊
- 跳轉到由外設指示的 ISS(中斷服務子程式)。
因此,以下是 8085 和 Z-80 ISS 結構的示例
| 8085 中斷服務子程式 | Z-80 中斷服務子程式 |
|---|---|
| PUSH PSW | EXX |
| PUSH H | EX AF, AF’ |
| PUSH D | {ISS 的其他部分} |
| PUSH B | EX AF, AF’ |
| {ISS 的其他部分} | EXX |
| POP B | EI |
| POP D | RETI |
| POP H | |
| POP PSW | |
| EI | |
| RET |
中斷模式 1 (IM 1)
它是 Z-80 的一條 2 位元組指令。操作碼為 **ED 56H**。執行此指令後,INT 輸入將表現得像 IM 1。此模式類似於 8085 MPU 的 RST 7.5、6.5 和 5.5。此模式下的中斷是向量中斷。
在此模式下,IORQ 和 M1 不處於活動狀態。CPU 自動停用中斷系統,因此我們不需要顯式使用 **DI** 指令。CPU 將程式計數器 (PC) 值儲存到堆疊頂部,並跳轉到位置 0038H。
在 Z-80 套件中,如果 0038H 位於監視器程式部分,則必須有一個無條件跳轉語句跳轉到實際的子程式部分。
中斷模式 2 (IM 2)
Z-80 的另一條 2 位元組指令是 **ED 5EH**。執行此指令後,INT 輸入將表現得像 IM 2。這是一種特殊模式;此模式不存在於 8085 MPU 中。此模式的主要特點是系統中最多可以存在 128 箇中斷源。在這些源中,每個源都可以向 CPU 傳送唯一的 1 位元組地址以同時啟用 IORQ 和 M1。因此,根據地址,它可以跳轉到不同的 128 個服務例程。
因此,我們可以總結 IM 2 中的步驟:
完成當前指令執行
啟用 IORQ 和 M1
從外設獲取 1 位元組地址,並將此地址視為地址指標的最低有效位元組,同時將最低有效位設定為 0。I 暫存器的內容被視為最高有效位元組。
停用中斷系統
將程式計數器值儲存到堆疊頂部。
跳轉到地址指標指向的中斷服務子程式。
NMI 中斷
NMI 代表非遮蔽中斷。它是一個負邊沿觸發的輸入中斷。它比 INT 具有更高的優先順序。此中斷是非遮蔽的,也是向量中斷。它非常類似於 8085 的 TRAP。當生成此中斷時,它會跳轉到記憶體位置 0066H。與 TRAP 一樣,NMI 用於高優先順序條件,例如電源故障等。從 NMI 服務例程返回後,系統將恢復到之前已啟用或已停用狀態。
因此,我們可以總結 NMI 的步驟:
- 完成當前指令執行
- 停用中斷系統
- 將程式計數器值儲存到堆疊頂部
- 跳轉到位置 0066H
在 Z-80 套件中,如果 0066H 位於監視器程式部分,則必須有一個無條件跳轉語句跳轉到實際的子程式部分。NMI 服務例程將包含以下步驟:
- 將所有暫存器內容儲存到堆疊頂部
- 執行滿足中斷裝置所需的動作
- 從堆疊頂部彈出所有暫存器內容
- 使用 RETN 指令返回主程式。
使用 RETN(從 NMI 中斷返回),程式計數器值將從堆疊頂部恢復以返回主程式,並返回到中斷啟用/停用狀態的舊值。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP