【发布时间】:2014-12-06 23:54:20
【问题描述】:
我只是为了好玩而设计一个带有很多外围设备的更复杂的 Z80 CP/M 系统。在阅读文档时,我在接受 IM0 中的中断时偶然发现了 Z80 CPU 的(未记录的?)行为。
当中断发生时,Z80 激活 M1 和 IORQ 向外部设备发出信号:“嘿,给我一个操作码”。如果操作码是 rst 00 或类似的东西,一切都很好。现在文档告诉我们,任何命令的任何操作码都可以提供给 cpu,例如 CALL。
但现在出现了未记录的部分:“在中断确认周期期间读取多字节指令的第一个字节。随后的字节由正常的内存读取序列读取。”
“正常的内存读取序列”。我如何确定 CPU 是想从内存中获取一个字节还是从设备中获取下一个字节?
编辑:我想,我找到了一个(好的?)解决方案:我可以通过分析 IORQ 和 M1 来检测中断确认周期的开始。我还可以通过分析 MREQ 和 M1 来检测下一个“正常”操作码获取。这样我就可以安装一个由这两个 ANDed 信号触发的触发器,即只要 CPU 从 io-device 读取数据,触发器就是 1。这个 1 我可以用来禁止总线驱动程序进出内存。
我的意图?我正在设计一个 CPLD 中具有 8 个优先输入的中断控制器。它的寄存器为每个中断引脚保存一个 16 位地址。只是为了好玩:-)
【问题讨论】:
-
在我的旧 Rodnay Zaks 编程 Z80 中查找
IM 0,他只说:“在这种情况下,中断设备可能会在数据总线上插入一条指令对于执行,其第一个字节必须在中断确认周期内发生。”数据没有多大帮助:) -
我认为在 ack 周期内只能从设备中获取一个字节。 CPU 不知道操作码的来源,然后执行它在加载多字节操作数时一直执行的操作,并从内存中读取其余部分。
-
@Mike 从应用说明中可以看出,它至少足够聪明,不会在这样的序列中调整 PC。
-
我很高兴看到 SO 上这么老的 CPU 的质量答案 - 特别是因为它也是那个 CPU 的一个非常神秘的角落(我想知道是否有人真的在 IM0 中使用过多字节指令?)。