【问题标题】:Undocumented 16-bit I/O addressing on Z80Z80 上未记录的 16 位 I/O 寻址
【发布时间】:2011-12-14 16:16:44
【问题描述】:

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

我的问题是用这些高 8 位这样做有什么意义?我知道有些机器以某种方式使用它来降低解码复杂性,但它们真的用于任何事情吗?我想完全按照 Z80 的建议执行指令,但我看不出执行此行为的意义,因为它是非标准的。这种行为被描述为无证,例如在“世嘉主系统”上,我会逃脱吗?非常感谢。

问候, 菲尔·波特

【问题讨论】:

  • 未记录但在数据表上?
  • 对不起,我的意思是虽然这种行为是正常的 - I/O 设备的寻址通常只有 8 位。

标签: io emulation z80


【解决方案1】:

该行为完全是 Zilog 的 documented(第 269-287 页)。

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

【讨论】:

  • 谢谢 :-) 无论如何最好模拟这种行为。
  • Phil 所暗示的“降低解码复杂性”是最常见的用途——直接使用单个地址线作为设备启用/禁用比逻辑组合多个地址线更便宜,并且不会觉得太浪费其中有 16 个。 8bit micros 上的键盘倾向于利用这种行为将端口地址的一部分视为一种参数,除非您使用地址线启用或禁用键盘线(所以它就像一个掩码),结果最终是所有受影响行的逻辑与(不是故意的,只是因为板子是开放式收集器)。
【解决方案2】:

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

【讨论】:

  • Amstrad 实际上有很多 ports 必须使用所有 16 位。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2014-05-27
    • 1970-01-01
    • 2013-09-12
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多