我从Z80上的Zilog数据表中注意到,对于I/O(IN和OUT)指令组,各种寄存器的内容通常放置在地址总线的高8位(取决于指令),低 8 位选择最多 256 个理论上连接的设备之一。
我的问题是用这些高 8 位执行此操作有什么意义?我知道有些机器以某种方式使用它来降低解码复杂性,但是它们真的有什么用途吗?我想完全按照 Z80 的建议实现这些指令,但我不认为实现此行为有什么意义,因为它是非标准的。这种行为被描述为未记录的,因此,例如在“Sega Master System”上,我会逃脱这种惩罚吗?非常感谢。
问候, 菲尔·波特
该行为已由 Zilog 完整记录(第 269-287 页)。
我猜有些外设可能会使用地址总线的高位A8..A15作为一种8位参数。
有些系统使用高8位作为地址,低8位作为参数。 Amstrad CPC 是主要的例子。这使得 OUT (C),r 几乎成为唯一可用的指令,当然它现在实际上充当 OUT (B),r;为了方便起见,经常使用 C 作为参数。推论是 OUT (n),A 几乎完全无用,除非您碰巧想将 0x34 发送到端口 0x34 等。
在 ZX Spectrum 上,键盘只能通过从端口 0xfe 读取来读取,而最高 8 个地址线正在选择 8 组 5 个按键之一。例如,如果要扫描按键 Q、W、E、R 和 T,地址总线的高 8 位必须为 0xfb:
ld bc,#fbfe
in a,(c) ; reading from port 0xfe while upper 8 address lines are 0xfb
这与:
完全相同 ld a,#fb
in a,(#fe) ; reading from port 0xfe while upper 8 address lines are 0xfb
80 年代的一些街机通过一条
out
指令一次输出超过 8 位来与附加硬件进行通信 - 附加位是从高位地址线读取的。
“用这些高 8 位来做这个有什么意义?” 反之亦然。对于 IO 操作期间地址位在 CPU 内的路由方式,没有必要做任何特殊的事情。 LD A,(HL) 和 IN A,(C) 确实没有太大区别。
有 12 个 16 位主寄存器通过门连接到两个寄存器 PC 和 I/R,连接到 16 位 inc/dec 电路,该电路连接到 16 位地址锁存器。 就是这样。没有特殊逻辑处理高 8 位不同。
但是,IN r,(C) 和 IN A,(#n) 之间存在差异。第一个选择 BC 寄存器对,后者选择之前加载了 A 和立即操作数 #n 的隐藏 WZ 对。
在这里您可以研究 Z80 CPU 在晶体管级别的布局和行为 https://floooh.github.io/visualz80remix/https://floooh.github.io/visualz80remix/