【问题标题】:Intel 8080 Instruction : OUT英特尔 8080 指令:输出
【发布时间】:2012-11-13 04:04:30
【问题描述】:

我正在尝试模拟 Intel 8080 指令集,但我被困在这条指令 OUT D8 上,根据书 Intel 8080/8085 Assembly Language Programming 它说的是

OUT 指令将累加器的内容放在八位数据总线上,将所选端口号放在十六位地址总线上。由于端口数的范围是从 0 到 255,因此端口号在地址总线上是重复的。

问题是我不明白这是做什么的。谁能给我解释一下,或者让我看一篇解释它的文章或一本书。

【问题讨论】:

  • 恕我直言,他们试图说只有 I/O 地址的低 8 位是重要的。用于寻址端口的寄存器的高位放在地址总线上,但总线上的 I/O 设备应忽略。 (8080 的内存和 I/O 使用相同的总线,区别在于我额外的 MEM/IO 线)

标签: port emulation instructions intel-8080


【解决方案1】:

对于仿真来说,这意味着
当仿真设备中存在 IN/OUT 端口时 - 端口中的简单 IN/OUT 数据
当模拟设备具有内存映射端口时 -
然后
OUT AB -> 到 STA ABAB
IN 12 -> LDAX 1212

对于硬件开发人员来说,这意味着在执行 in/out 时,地址总线有 a15-8 = a7-a0 和 =portNum

【讨论】:

  • 这可能需要胶合逻辑区分内存和IO周期。
【解决方案2】:

一种思考方式是 8080 及其衍生产品具有 17 位地址总线,而不是通常引用的 16 位总线。该地址总线的最高位是芯片的输入/输出请求线(IORQ)。

当您使用正常的加载和存储时,最高位总是被重置。当您执行输入或输出时,始终设置最高位。

Intel 命名了这条线,并希望它用于与外围芯片通信,因此得名,可用寻址的形式更加有限,访问成本更高,而且程序计数器和堆栈指针都不能指向地址空间的那个区域。

这给英特尔留下了一个问题,即他们有 16 位地址总线要填充,但只采用了一个 8 位参数。他们实际上所做的是将累加器加载到前 8 位。所以如果你有:

LD A, 0xfe
OUT (0xdc)

那么值0xfe就会被输出到端口地址0xfedc。

(除此之外:为 Zilog 语法而不是 Intel 道歉;可能有趣的是,Z80 添加了一堆指令,如OUT (C), A,它们真的将整个 BC 转储到地址总线上,而不仅仅是 C,大多数 Z80 微型制造商都完美无缺很高兴使用完整的 16 位地址,因为它允许他们使用“如果此地址线为低电平时正在寻址组件”的简化逻辑,同时仍然为外部外围设备留出相当大的范围)

【讨论】:

  • 你确定8080在IO周期的高8位地址位加载累加器吗? Z80 正是这样做的,但 AFAIK 8080 只是在地址总线上将 8 位地址翻倍。
  • 我将不得不检查我的消息来源;我将两者混为一谈的暗示很可能是正确的。
猜你喜欢
  • 2023-03-06
  • 2020-05-12
  • 1970-01-01
  • 2012-11-24
  • 2019-08-02
  • 2019-01-15
  • 2019-06-13
  • 2014-05-24
  • 2018-12-30
相关资源
最近更新 更多