众所周知,Intel 8085有五个中断引脚(TRAP,RST7.5,RST6.5,RST6.5和INTR),但是Zilog Z-80只有两个中断引脚。在 NMI和 INT。但与8085相比,它具有更好的中断结构。
这是一个低电平有效触发的输入中断。这是可屏蔽的,使用DI指令可以将其禁用。禁用中断引脚时,如果IO设备使能INT引脚,则Z-80不会被中断 。即使在重置后,也将被禁用。因此,如果我们希望MPU被引脚中断,则程序中必须有EI指令。
共有三种中断模式,在使用INT引脚进行中断后,对它们进行不同的操作。这些模式是模式0,模式1和模式2。
这是Z-80的2字节指令。操作码为ED 46H。执行该指令后, INT输入将类似于IM0。这是复位后的默认模式。
此模式类似于8085的INTR。因此它是非向量中断。MPU激活IORQ和M1以响应中断。
因此,IM 0中的INT流程 (假设NMI未激活,并且执行EI指令以启用中断系统)如下-
它完成当前指令,然后使 INT 的M1和
从外围设备接收RST或CALL指令
禁用中断系统
将程序计数器值压入堆栈
跳至外围设备指示的ISS(中断服务子程序)。
这是8085和Z-80 ISS结构的示例
8085中断服务子程序 | Z-80中断服务子例程 |
---|---|
推PSW | EXX |
推H | EX AF,AF' |
推D | {国际空间站的其他部分} |
推B | EX AF,AF' |
{国际空间站的其他部分} | EXX |
POP B | EI |
POP D | RETI |
POP H | |
POP PSW | |
EI | |
RET |
这是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在Monitor程序部分下,则必须有一个无条件跳转语句才能跳转到实际子例程部分。
Z-80的另一个2字节指令是ED 5EH。执行完该指令后, INT输入将类似于IM2。这是一种特殊模式。8085 MPU中不存在此模式。此模式的主要特点是系统中可能存在多达128个中断源。在这些源中,每个源可以向CPU发送唯一的1字节地址,以同时激活 IORQ和M1。因此,根据地址,它可以跳转到不同的128个服务例程。
所以我们可以总结一下IM 2中的步骤-
完成当前指令执行
激活 IORQ和M1
在将LSb设置为0之后,从外设获取1字节的地址,并将其视为地址指针的最低有效字节。并将I寄存器的内容视为最高有效字节。
禁用中断系统
将程序计数器值保存到堆栈顶部。
跳转到地址指针指向的“中断服务”子例程。
NMI代表不可屏蔽中断。它是下降沿触发的输入中断。它具有比INT高的优先级 。该中断是不可屏蔽的,也是向量化的。它与8085的TRAP非常相似。当产生此中断时,它会跳到存储器位置0066H。与TRAP一样, NMI用于高优先级条件,例如电源故障等。从NMI服务例程返回后 ,系统将恢复到较早的启用或禁用状态。
所以我们可以总结一下NMI的步骤 -
完成当前指令执行
禁用中断系统
将程序计数器值存储在堆栈的顶部
跳至位置0066H
在Z-80套件中,如果0066H在Monitor程序部分下,则必须有一个无条件跳转语句才能跳转到实际子例程部分。该 NMI服务程序将包含这些步骤-
将所有寄存器内容保存到堆栈顶部
执行所需的操作以使中断设备满意
从堆栈顶部弹出所有寄存器内容
使用RETN指令返回主程序。
使用RETN(从NMI中断返回 ),程序计数器值将从堆栈顶部恢复以返回到主程序,并返回到中断允许/禁止状态的旧值。