4

我只是为了好玩而设计一个带有很多外围设备的更复杂的 Z80 CP/M 系统。在阅读文档时,在接受 IM0 中的中断时,我偶然发现了 Z80 CPU 的(未记录的?)行为。

当中断发生时,Z80 激活 M1 和 IORQ 向外部设备发出信号:“嘿,给我一个操作码”。如果操作码是 rst 00 或类似的东西,一切都很好。现在文档告诉我们,任何命令的任何操作码都可以提供给 cpu,例如 CALL。

但现在出现了未记录的部分:“在中断确认周期期间读取多字节指令的第一个字节。随后的字节由正常的内存读取序列读取。”

“正常的内存读取序列”。我如何确定 CPU 是想从内存中获取一个字节,还是从设备中获取下一个字节?

编辑:我想,我找到了一个(好的?)解决方案:我可以通过分析 IORQ 和 M1 来检测中断确认周期的开始。我还可以通过分析 MREQ 和 M1 来检测下一个“正常”操作码获取。这样我就可以安装一个由这两个 AND 信号触发的触发器,即只要 CPU 从 io-device 读取数据,触发器就是 1。这个 1 我可以用来禁止总线驱动程序进出内存。

我的意图?我正在设计一个 CPLD 中具有 8 个优先输入的中断控制器。它的寄存器为每个中断引脚保存一个 16 位地址。只是为了好玩:-)

4

2 回答 2

4

我的理解是需要外围设备:

  • 知道它需要提供多少字节;
  • 响应 IORQ 周期后的正常读取周期;和
  • 安排通常会响应内存读取周期的任何内容在持续时间内不会这样做。

此外,Zilog 在应用说明中记录了该行为,您的报价来自该应用说明(可能未记入信用)。

在实践中,我猜 99.99% 的 IM0 用户只使用 an RST,其余 99.99% 使用已知大小的指令,例如CALL xxxx.

(我也知道有几个微控制器有效地保证在中断周期内不会将任何东西放到总线上,从而变成了由于集电极开路输出IM0的同义词)。IM1

于 2014-12-07T00:16:04.510 回答
0

Z80 手册中合理地记录了中断行为: 中断模式,IM2 允许您为 16 位指针提供 8 位地址。至少到所需的 16 位直接地址的一半。

如何设置中断模式

我的理解是使用 M1 + IORQ 组合,因为没有留给专用中断响应的引脚。还有一个有趣的细节是,PIO、SIO、CTC 等 Zilog I/O 芯片读取 RETI 指令(当 CPU 获取它时)以了解 CPU 已准备好接受另一个中断。

于 2015-02-01T00:25:05.043 回答