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 中断返回),程序计数器值将从堆栈顶部恢复以返回主程序,并返回到中断启用/禁用状态的旧值。