Z-80 中断结构


我们知道 Intel 8085 有五个中断引脚(TRAP、RST7.5、RST6.5、RST6.5 和 INTR),但 Zilog Z-80 只有两个中断引脚,即 NMIINT。但与 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 PSWEXX
PUSH HEX AF, AF’
PUSH D{ISS 的其他部分}
PUSH BEX AF, AF’
{ISS 的其他部分}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 位于监视器程序部分,则必须有一个无条件跳转语句跳转到实际的子程序部分。

中断模式 2 (IM 2)

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

因此,我们可以总结 IM 2 中的步骤:

  • 完成当前指令执行

  • 激活 IORQM1

  • 从外设获取 1 字节地址,并将此地址视为地址指针的最低有效字节,同时将最低有效位设置为 0。I 寄存器的内容被视为最高有效字节。

  • 禁用中断系统

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

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

NMI 中断

NMI 代表非屏蔽中断。它是一个负边沿触发的输入中断。它比 INT 具有更高的优先级。此中断是非屏蔽的,也是向量中断。它非常类似于 8085 的 TRAP。当生成此中断时,它会跳转到内存位置 0066H。与 TRAP 一样,NMI 用于高优先级条件,例如电源故障等。从 NMI 服务例程返回后,系统将恢复到之前已启用或已禁用状态。

因此,我们可以总结 NMI 的步骤:

  • 完成当前指令执行
  • 禁用中断系统
  • 将程序计数器值存储到堆栈顶部
  • 跳转到位置 0066H

在 Z-80 套件中,如果 0066H 位于监视器程序部分,则必须有一个无条件跳转语句跳转到实际的子程序部分。NMI 服务例程将包含以下步骤:

  • 将所有寄存器内容保存到堆栈顶部
  • 执行满足中断设备所需的动作
  • 从堆栈顶部弹出所有寄存器内容
  • 使用 RETN 指令返回主程序。

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

更新于:2019 年 7 月 30 日

2K+ 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告