Zilog Z80 迎来50周年

Lobsters Hottest 新闻

摘要

Zilog Z80 微处理器庆祝其50周年,回顾其对早期个人电脑、家用电脑和工业应用的深远影响,以及个人轶事和历史背景。

<p><a href="https://lobste.rs/s/y3qqzv/zilog_z80_has_turned_50">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/17 00:01

# Zilog Z80 已满50岁 来源:https://goliath32.com/blog/z80.html 返回博客索引 (https://goliath32.com/blog/index.html) --- ### 引言 [](https://goliath32.com/img/photo/blog/z80/0.jpg)在撰写本文时,Zilog Z80 处理器正式发布已过去 50 年,那是 1976 年 7 月,距离最后一位人类踏上月球不到 4 年,距离二战比距离今天*更近*几十年,大致位于肯尼迪遇刺和柏林墙倒塌之间的中点,距离朝鲜战争比距离 9/11 更近——而 9/11 本身也是四分之一个世纪前的事件了。(抱歉……) 这款处理器极其成功,被广泛应用于许多 8 位微型计算机中,包括早期的个人电脑、家用与爱好计算机,以及众多嵌入式、工业应用。 与其二进制兼容的 8080 和 8085 一起,它帮助为 8 位微型机创建了一个事实上的硬件标准,进而催生了 CP/M 和 Microsoft BASIC 这样的事实上的软件标准。 Z80 本身也在多年间衍生出许多克隆体和派生架构,著名的包括用于初代 GameBoy 的 Sharp LR35902。Zilog 自己最终放弃了他们的 16 位和 32 位派生架构系列,回归到基于 Z80 的微控制器及变体,例如流水线化、更高时钟频率的 eZ80 (https://en.wikipedia.org/wiki/Zilog_eZ80),主要为了在工业应用中继续使用。 我本人太年轻,没能亲眼目睹家用计算的那一面(忽略前面提到的 GameBoy),但 Z80 在工业应用中的广泛使用意味着原版 Z80 仍然存在并被使用,直到仅仅两年前 Zilog 才最终停产。 我第一次接触 Z80 是在我十几岁的时候,当时我浏览一家电子公司的目录,惊讶地发现它们仍在销售。我自己设计了一个小小的 Z80 电脑,并说服一位学校老师允许我晚上使用暗房,这样我就能蚀刻一些电路板。 [](https://goliath32.com/img/photo/blog/z80/1.jpg)由于我以前的几位老师对我的所作所为感到好奇,我最终听到了许多关于旧式家用电脑、游戏机的有趣轶事,还有一个关于放在特百惠盒子里的自制绕线计算机的故事,它运行着 CP/M 和 WordStar,连接到一个“借来的” IBM 终端,用来撰写论文。随着时间的推移,我收到了许多从布满灰尘的抽屉里翻出来的老芯片,它们最终进入了我的 DIY 项目,包括一堆 MCS-85 部件、几个 Z80、8085、6502 和 6522。 整个经历确实教会了我许多关于系统工程的宝贵经验,还有一些意想不到的收获(可靠的电源上电复位出奇地难;编写链接器比编写汇编器难得多;编写编译器是*实际上可以做到*的事情)。 无论如何,这就是我自认为有资格回忆 Z80 的理由。虽然我最初想基于自己的经验,将讨论限制在 Z80 与其派生来源 8080 之间的一些技术细节比较上,但我最终却深入研究了计算机历史博物馆的口述历史小组,其中相关人士回忆起更多关于这些芯片开发的轶事。整个“我想(再次)写一篇博客文章”的想法很快就变得规模庞大。 ### 从 2200 到 8008 从前,计算机终端公司 (CTC) (https://en.wikipedia.org/wiki/Datapoint) 构建了一款新的可编程终端,即 Datapoint 2200 (https://en.wikipedia.org/wiki/Datapoint_2200),它采用由分立 TTL 芯片构成的 8 位处理器。当时英特尔正在为 CTC 提供移位寄存器和存储芯片。 有人提出用定制 IC 替换部分 TTL“墓地”的想法,最终考虑尝试将整个 8 位 CPU 集成到单个芯片上。最终有两家不同的公司被委托执行这项任务:德州仪器 (TI) 和英特尔。 两家公司都没有按时完成设计。当英特尔准备好芯片时(最初基于系统命名法命名为 **1201**),CTC 已经在销售基于 TTL 设计的终端了。 CTC 的工程师也对芯片的性能不满意,并且他们已经在为下一代终端修改架构了。 虽然 TI 最终放弃了他们的设计,但英特尔继续前进,并成功将其版本作为 **8008** 商业化(像 **4004** 一样,由市场部门重新命名)。 ### 8008 架构 `` ___ ___ -9V ---|1 |_| 18|<- IRQ AD7 <->|2 17|<- READY AD6 <->|3 16|<- CLK1 AD5 <->|4 15|<- CLK2 AD4 <->|5 14|-> SYNC __ AD3 <->|6 13|-> S0 | AD2 <->|7 12|-> S1 > 状态 AD1 <->|8 11|-> S2 __| AD0 <->|9 10|-- +5V |_________| `` ABCDEHLPCCPZS8008 有 7 个寄存器:**A**、**B**、**C**、**D**、**E**、**H**、**L**。其中 **A** 是指定的累加器,其他可用作操作数或临时存储。顾名思义,**H** 和 **L** 共同构成一个内存指针的**高**位和**低**位部分。内存访问通过第 8 个伪寄存器 **M** 完成,它代表 **HL** 指向的内存字节。 处理器内部在几个标志位中跟踪 ALU 状态(**C** 进位、**P** 奇偶校验、**Z** 零、**S** 符号),并可以基于这些标志位执行条件跳转(包括调用和返回)。 程序计数器 **PC** 几乎从不直接可见。有专用的函数调用和返回指令,但处理器使用一个*内部*返回地址栈,深度为 8 层。这样做的原因是 Datapoint 2200 原本计划使用串行内存,内存中的调用栈被认为最终会成为性能瓶颈。 内存地址宽度为 14 位,有一个独立的 I/O 地址空间,总共 32 个 I/O 端口(地址总是立即数,并被“位填充”到操作码中)。 对于中断处理,有一条特殊的“重启”指令,它本质上会调用地址空间起始处的 8 个槽位之一(0x00, 0x08, 0x10, 0x18, ..., 0x38)。槽位索引被“位填充”到 RST 操作码本身中。当中断发生时,处理器向外部发出已收到提示的信号,然后盲目地执行数据总线上的当前内容——它最好是一条 RST 指令。 从这里开始,情况变得有些棘手。CPU 没有通用堆栈来保存寄存器,所有内存访问都需要 **HL**,但你不想在中断处理程序中破坏 **HL**。预期的解决方案是通过 I/O 总线上的外部锁存器,用作临时寄存器。 总而言之,这个架构相当简单,大约需要 3500 个晶体管,并采用 DIP18 封装。地址和数据被多路复用,需要外部锁存。内部译码/执行状态被暴露出来,需要进行译码以驱动锁存器并确定处理器试图做什么(从内存或 I/O 总线读取/写入)。 处理器需要两个相位交错的时钟信号(它以 500kHz 运行)、一个 +5V 正电源和一个 -9V 负电源。 ### 从 8008 到 8080 源自 Datapoint 2200 的 8008 架构的缺点在开发过程中就已经为人所知。按照典型的工程风格,甚至在开发结束之前,就已经在讨论改进架构的想法。 Federico Faggin (https://en.wikipedia.org/wiki/Federico_Faggin),他从 **4004** 项目调过来,力推着手开始改进版的工作,但管理层坚持要先看看市场对他们的两款微处理器会作何反应。竞争对手最终宣布了他们正在开发中的 8 位设计,这些延误最终导致英特尔损失了总共 9 个月的领先时间。 甚至在该项目最终获批之前,Federico Faggin 就获准从 Busicom (https://en.wikipedia.org/wiki/Busicom) 挖角 Masatoshi Shima (https://en.wikipedia.org/wiki/Masatoshi_Shima) 来从事 8080 的设计工作。在许多方面,类似 CTC 对 8008 的发展有影响一样,Busicom 也参与了 4004 的开发,他们最初是想要为其计算器定制一套芯片。 潜在客户在看到 8008 演示后提出的批评和反馈也影响了 8080 的设计,并且很早就在二进制兼容性方面做出了妥协。 ### 8080 架构 AFBCDEHLSPPC8080 本质上拥有与 8008 相同的寄存器组,但它用位于内存中、通过堆栈指针寄存器 (**SP**) 访问的外部堆栈替换了内部的返回地址堆栈。 堆栈指针可以与 **HL** 交换或移动,寄存器可以成对压栈或出栈。除了 **HL**,其他寄存器对还有 **BC**、**DE** 和 **AF**(累加器和 ALU 标志),但在 8080 汇编中更习惯称后者为“程序状态字”**PSW**。 内存地址提升至完整的 16 位,使机器拥有 64k 的地址空间。I/O 端口提升至 256 个。**BC** 和 **DE** 现在也允许基本的间接寻址(加载/存储累加器),累加器和 **HL** 可以在一个立即数目的地址处加载/存储。 增加了一些可以对寄存器对进行操作的双字节算术运算(例如,增/减),主要是为了支持指针运算和 16 位计数器。对 **AF** 使用这些指令实际上会作用于 **SP**。 中断处理的工作方式基本相同,使用重启指令,但增加了软件启用/禁用中断的功能。显式的堆栈也不再需要使用 I/O 硬件来保存寄存器。 下面是来自维基百科页面稍作修改的内存拷贝示例,它将 BC 中指定数量的字节从 DE 复制到 HL。 `` memcpy: PUSH B ; 压栈 BC PUSH D ; 压栈 DE PUSH H ; 压栈 HL loop: LDAX D ; A := *(DE) MOV M, A ; *(HL) := A INX D ; ++DE INX H ; ++HL DCX B ; --BC MOV A, B ; A := B ORA C ; A |= C JNZ loop ; 如果不为零则跳转 POP H POP B POP D RET `` 这里需要注意几点:对寄存器对进行操作的指令总是使用一个寄存器的助记符来代表*两个*,“INX”中的“X”用于区分双字节增量和单字节寄存器的“INC”。英特尔 8080 汇编的助记符与操作码几乎是一一对应的,极易解析,这使得汇编器的实现很容易。从某种程度上说,这是以牺牲人类可读性为代价的。 此外,双字节算术不影响 ALU 标志,它是一个独立的、分开的功能块。在递减 **BC** 后,我们需要手动检查两个寄存器是否都为零。 ### 电气接口 为了提高速度,8080 使用了 NMOS 逻辑。这样做的缺点是 CPU 现在需要三种不同的供电电压(-5V、+5V 和 +12V)。它仍然坚持使用两个相位交错的时钟信号(在 9V 到 12V 范围内),这使得芯片周围的电路设计有点繁琐。 得益于 40 引脚封装(Faggin 回忆说,获得批准本身就是一场艰苦的战斗),CPU 不再需要对数据和地址线进行多路复用。但与 8008 一样,它仍然在外部暴露内部处理器状态,在数据总线上对实际的控制状态进行多路复用,需要外部锁存和译码。 英特尔当然会出售用于状态译码、时钟发生等的支持芯片。此外,人们可能还需要购买一个配套的中断控制器和一个类似可编程间隔定时器的东西,至少用于驱动 DRAM 刷新,也许可以使用那些方便的英特尔 DMA 控制器之一。 英特尔至少在 8085 中解决了*部分*这些缺点,仅需要单个 5V 电源和单个 5V 时钟信号。释放出的引脚暴露了几个额外的控制信号。但仍然需要*某些*专用支持芯片。 ### Zilog 和 Z80 由于对在英特尔公司的经历感到不满,包括各种延误以及为了获得 8080 项目的批准而与管理层进行的艰苦斗争,Federico Faggin 最终决定离开英特尔,与当时微处理器部门的负责人 Ralph Ungermann (https://en.wikipedia.org/wiki/Ralph_Ungermann) 共同创立自己的公司。 起初有点没有方向,Faggin 最初考虑设计微控制器,但他意识到对于一家无晶圆半导体初创公司来说,利润率太薄,难以盈利。 他最终决定设计一个改进版的 8080,昵称为“Super 80”,后来成为 Zilog Z80。他们从埃克森美孚获得了资金,并将 Masatoshi Shima 从英特尔挖来参与设计,后来团队规模扩大到总共 11 人,负责布局、软件模拟等工作。 Z80 的设计目标是二进制兼容于 8080,同时增加寄存器、寻址模式和新指令,并从其他同期产品(如 6800)中汲取灵感。它还旨在实现比 8080 更简单的电气接口和更高的速度。 从处理器开发到第一个工作原型,总共花费了大约 40 万美元,并且按时、在预算内完成(他们从埃克森美孚获得了 50 万美元的资金)。 Zilog 依靠 Mostek 来制造他们的处理器(在最初签约的 Synertek 出现一些问题之后)。他们最终确实从埃克森美孚获得了更多资金来建立自己的晶圆厂,但 Z80 保持由第二供应商生产。 ### Z80 架构 AFA'F'BCB'C'DED'E'HLH'L'IXIYSPPCZ80 完全二进制兼容于 8080 指令集。 受 6800 的启发,它增加了两个索引寄存器 **IX** 和 **IY**,它们可以替代 **HL** 使用(相同的编码,但带有一个操作码前缀),并带有一个立即偏移量。 **AF**、**BC**、**DE** 和 **HL** 寄存器对是分组的,允许更简单、更快的中断处理。 说到中断,Z80 有 3 种不同的处理方式:一种兼容 8080 的方式(模式 0),一种总是调用固定地址的方式(模式 1),以及一种通过调用表分派的方式(模式 2),使用总线上的数值作为索引。一个额外的寄存器用于在内存中定位表的基地址。 Z80 还增加了许多位旋转、位测试与设置指令、BCD 算术,以及内置的循环指令(使用 **BC** 作为计数器)、自我重复的块传输、块比较和字符串操作。 由于英特尔声称拥有汇编助记符的版权,Z80 最终使用了它自己的汇编语言,语法可以说更清晰。Z80 汇编更明确地表示操作数,并使用基本助记符的重载变体。 这基本上是上面相同的程序,用更具表现力的 Z80 汇编编写: `` memcpy: PUSH BC ; 寄存器对的全名 PUSH DE PUSH HL loop: LD A, (DE) ; 显式的双参数语法 LD (HL), A INC DE INC HL DEC BC LD A, B ; 重载的名称 OR C JP NZ, loop ; 重载的名称,条件是参数 POP HL POP BC POP DE RET `` 当然,在 Z80 上,整个字节复制循环也可以被一个单一的、自我重复的指令替代:**LDIR**。 ### 改进的总线设计 Z80 仅需要一个 +5V 电源和一个单一时钟信号。8080 的许多需要外部锁存/译码的状态现在被芯片明确地暴露出来,例如 **MREQ** 或 **IORQ** 用于指示内存或 I/O 访问,**RD**/

相似文章

Zeal Z80 计算机

Lobsters Hottest

Zeal 8-bit 计算机是一款基于 Z80 的开源爱好者计算机板卡,拥有多个原型版本以及新发布的视频板卡扩展。

用RP2350监视Z80

Hacker News Top

一篇博客文章,探讨如何使用带PIO的Raspberry Pi Pico RP2350来监视Z80微处理器的地址和数据总线,包括时序考虑和时钟速度限制。

z386:基于原始微码构建的开源80386

Hacker News Top

本文详述了z386,一款基于原始Intel微码构建的开源FPGA 80386 CPU。它能引导DOS 6/7、运行保护模式程序,并玩经典游戏如Doom,既是一种教育性重构,也是一个可用的FPGA CPU。