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输入将类似于IM0。这是复位后的默认模式。

此模式类似于8085的INTR。因此它是非向量中断。MPU激活IORQM1以响应中断。

因此,IM 0中的INT流程 (假设NMI未激活,并且执行EI指令以启用中断系统)如下-

  • 它完成当前指令,然后使 INT M1 

  • 从外围设备接收RST或CALL指令

  • 禁用中断系统

  • 将程序计数器值压入堆栈

  • 跳至外围设备指示的ISS(中断服务子程序)。

这是8085和Z-80 ISS结构的示例

8085中断服务子程序Z-80中断服务子例程
推PSWEXX
推HEX AF,AF'
推D{国际空间站的其他部分}
推BEX AF,AF'
{国际空间站的其他部分}EXX
POP BEI
POP DRETI
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。该模式下的中断是向量中断。

在此模式下,  IORQM1不在活动状态。CPU自动禁用中断系统,因此我们不需要显式使用DI指令。CPU将程序计数器(PC)值存储到堆栈顶部,并跳转到位置0038H。

在Z-80套件中,如果0038H在Monitor程序部分下,则必须有一个无条件跳转语句才能跳转到实际子例程部分。

中断模式2(IM 2)

Z-80的另一个2字节指令是ED 5EH。执行完该指令后,  INT输入将类似于IM2。这是一种特殊模式。8085 MPU中不存在此模式。此模式的主要特点是系统中可能存在多达128个中断源。在这些源中,每个源可以向CPU发送唯一的1字节地址,以同时激活 IORQM1。因此,根据地址,它可以跳转到不同的128个服务例程。

所以我们可以总结一下IM 2中的步骤-

  • 完成当前指令执行

  • 激活 IORQM1 

  • 在将LSb设置为0之后,从外设获取1字节的地址,并将其视为地址指针的最低有效字节。并将I寄存器的内容视为最高有效字节。

  • 禁用中断系统

  • 将程序计数器值保存到堆栈顶部。

  • 跳转到地址指针指向的“中断服务”子例程。

在 NMI中断

NMI代表不可屏蔽中断。它是下降沿触发的输入中断。它具有比INT高的优先级  。该中断是不可屏蔽的,也是向量化的。它与8085的TRAP非常相似。当产生此中断时,它会跳到存储器位置0066H。与TRAP一样,  NMI用于高优先级条件,例如电源故障等。从NMI服务例程返回后 ,系统将恢复到较早的启用或禁用状态。

所以我们可以总结一下NMI的步骤 -

  • 完成当前指令执行

  • 禁用中断系统

  • 将程序计数器值存储在堆栈的顶部

  • 跳至位置0066H

在Z-80套件中,如果0066H在Monitor程序部分下,则必须有一个无条件跳转语句才能跳转到实际子例程部分。该 NMI服务程序将包含这些步骤-

  • 将所有寄存器内容保存到堆栈顶部

  • 执行所需的操作以使中断设备满意

  • 从堆栈顶部弹出所有寄存器内容

  • 使用RETN指令返回主程序。

使用RETN(从NMI中断返回 ),程序计数器值将从堆栈顶部恢复以返回到主程序,并返回到中断允许/禁止状态的旧值。