Z80 上未记录的 16 位 I/O 寻址

问题描述 投票:0回答:4

我从Z80上的Zilog数据表中注意到,对于I/O(IN和OUT)指令组,各种寄存器的内容通常放置在地址总线的高8位(取决于指令),低 8 位选择最多 256 个理论上连接的设备之一。

我的问题是用这些高 8 位执行此操作有什么意义?我知道有些机器以某种方式使用它来降低解码复杂性,但是它们真的有什么用途吗?我想完全按照 Z80 的建议实现这些指令,但我不认为实现此行为有什么意义,因为它是非标准的。这种行为被描述为未记录的,因此,例如在“Sega Master System”上,我会逃脱这种惩罚吗?非常感谢。

问候, 菲尔·波特

io emulation z80 ioports
4个回答
6
投票

该行为已由 Zilog 完整记录(第 269-287 页)。

我猜有些外设可能会使用地址总线的高位A8..A15作为一种8位参数。


2
投票

有些系统使用高8位作为地址,低8位作为参数。 Amstrad CPC 是主要的例子。这使得 OUT (C),r 几乎成为唯一可用的指令,当然它现在实际上充当 OUT (B),r;为了方便起见,经常使用 C 作为参数。推论是 OUT (n),A 几乎完全无用,除非您碰巧想将 0x34 发送到端口 0x34 等。


1
投票

在 ZX Spectrum 上,键盘只能通过从端口 0xfe 读取来读取,而最高 8 个地址线正在选择 8 组 5 个按键之一。例如,如果要扫描按键 QWERT,地址总线的高 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 位来与附加硬件进行通信 - 附加位是从高位地址线读取的。


0
投票

“用这些高 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/

© www.soinside.com 2019 - 2024. All rights reserved.