IM0 中的 Z80 多字节命令

Hen*_*nes 4 z80 interrupt

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

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

但现在出现了未记录的部分:“多字节指令的第一个字节在中断应答周期期间读取。后续字节通过正常的内存读取序列读入。”

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

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

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

Tom*_*mmy 6

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

  • 了解需要输入多少字节;
  • 响应 IORQ 周期之后的正常读周期;和
  • 安排通常响应内存读取周期的任何内容在持续时间内不会这样做。

此外,Zilog 在应用说明中记录了该行为,您的引用源自该应用说明(大概未注明出处)。

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

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

  • 我的理解是,CPU 将继续执行读取周期,而外设将通过自己的计数器对它们进行计数。我找不到明确的文档来说明将为读取周期提供哪个地址。如果历史记录有帮助的话,“IM0”是 80​​80 兼容模式,并且 8080 被设计为与 8008 中断兼容(并且源兼容,但不兼容二进制)。所以我们谈论的是非常原始的东西。“IM1”和“IM2”是 Zilog 尝试做一些更智能的事情。 (4认同)