黄京
11 min read
Available in LaTeX and PDF
Z80 与 6502 微处理器的架构比较
Z80 与 6502 架构对比:寄存器、指令与性能差异

Z80 和 6502 是 20 世纪 70、80 年代最具代表性的 8 位微处理器,它们分别由 Zilog 和 MOS Technology 推出,前者于 1976 年,后者于 1975 年。这些处理器深刻影响了个人电脑和家用游戏机的历史。Z80 广泛应用于 CP/M 操作系统驱动的商业系统,如 ZX Spectrum 和 Amstrad CPC,以及 MSX 标准平台;6502 则主导消费电子领域,包括 Apple II、Atari 2600、NES 和 Commodore 64 等经典设备。比较这两个架构具有重要意义,因为它们体现了当时微处理器设计的两大流派:Z80 代表复杂指令集(CISC)的丰富性和兼容性,而 6502 则以简洁高效的指令集著称,这种哲学差异直接影响了代码生成、性能优化和系统集成方式。本文将从历史发展、规格对比、寄存器架构、寻址模式、指令执行、中断处理、性能分析、应用案例到优缺点总结,逐层剖析二者差异,目标读者包括复古计算爱好者、嵌入式开发者以及微处理器历史研究者。

历史与发展

Z80 的起源可以追溯到 Intel 8080 的改进,由 Zilog 公司创始人 Federico Faggin 领导开发,于 1976 年正式发布。它在引脚上完全兼容 8080,同时新增动态 RAM 刷新支持和更低的功耗,这使得 Z80 迅速取代 8080,成为 CP/M 系统的主力 CPU。随后推出的 Z80A 提升了时钟频率,Z84C00 则是 CMOS 工艺版本,进一步降低了功耗并提高了可靠性,这些衍生品延长了 Z80 在嵌入式和工业控制中的寿命。与之相比,6502 的故事更具传奇色彩,它由 Chuck Peddle 主导,从 Motorola 6800 的复杂设计中简化而来,1975 年以仅 20 美元的价格推出,这大幅降低了个人电脑的门槛,推动了 Apple I 和 Apple II 等革命性产品的诞生。65C02 是其 CMOS 增强版,新增了更多指令如 BIT 分支;6510 则专为 Commodore 64 定制,内置 I/O 端口。市场影响上,Z80 主导了商业和专业系统如 CP/M PC,而 6502 则征服了消费市场,从游戏机到教育电脑无所不在,这种分野反映了二者定位的差异。

基本规格对比

Z80 和 6502 在基本规格上高度相似,都是 8 位数据路径和 16 位地址总线,支持 64KB 地址空间,但细节差异显著。Z80 的典型时钟频率为 4-8MHz,最高可达 20MHz,而 6502 通常在 1-3MHz,最高 14MHz,这得益于 Z80 更复杂的内部设计。功耗方面,Z80 的 NMOS 版本约 1W,远高于 6502 的 100mW,后者更适合电池供电设备。晶体管数量体现了设计哲学:Z80 约 8500 个,6502 仅 3500 个,都从早期 6 μ m 工艺演进到 1.5 μ m。指令集规模相近,Z80 有 158 条(含未文档化),6502 有 151 条,但 Z80 是典型 CISC,6502 虽标为 CISC,却更接近 RISC 的简洁。这些规格奠定了后续性能差异的基础。

寄存器架构

Z80 的寄存器架构极为丰富,主通用寄存器对包括 AF(标志和累加器)、BC、DE、HL,还有影子集 AF’、BC’、DE’、HL’,专为中断上下文切换设计。此外有索引寄存器 IX、IY、I(中断向量缓存)、R(刷新计数器)、SP(栈指针)和 PC(程序计数器),总计 14 个有效 8 位寄存器。这种设计允许高效的多任务处理和复杂运算,而无需频繁内存访问。相反,6502 采用极简主义,仅有 A(累加器,用于算术)、X 和 Y(索引寄存器)三个通用 8 位寄存器,SP 固定在页面 1,PC 隐式管理,标志寄存器 P 包含 NV-BDIZC 7 位状态(如零标志 Z、进位 C)。这种精简迫使程序员巧妙利用零页内存作为伪寄存器,代码虽紧凑但对寄存器压力较大。总体而言,Z80 的寄存器丰裕适合移植和多线程,6502 的简约则优化了芯片面积和代码密度。

寻址模式

Z80 支持约 20 种寻址模式,包括立即数、寄存器直接、通过 HL/IX/IY 加偏移的间接寻址、扩展寻址和页零寻址,还独有块传输如 LDIR(加载并递增重复)。相对寻址和端口寻址进一步增强灵活性。6502 核心模式有 13 种,如零页(单字节地址,周期最短)、栈相对、绝对、间接(JMP 通过指针跳转)、X/Y 预索引或后索引,以及隐式模式。这些模式特别优化零页访问,仅需 1 个周期。比较而言,Z80 更通用,支持复杂场景如字符串处理;6502 在实时任务中周期效率更高,尤其游戏循环中零页和索引的快速性无可匹敌。

指令集与执行效率

二者的指令集覆盖算术(如 ADD/SUB)、逻辑(AND/OR)、位操作、跳转和调用等基础,但独特点鲜明。Z80 提供 16 位加载、模拟乘除(如 MLT 模拟乘法)和字符串操作(LDI/CPDR),指令周期较长;6502 擅长高效分支(BCC/BCS)和读-改-写(RMW,如零页 INC,无需额外加载)。以下表格展示典型周期数:加载寄存器立即数,Z80 需 7-10 周期,6502 仅 2 周期;ADD 寄存器,Z80 4 周期对 6502 的 2 周期;绝对跳转 Z80 10 周期 vs. 6502 3 周期;调用子程序 Z80 17 周期 vs. 6502 6 周期。这种差异源于 Z80 的微码实现 vs. 6502 的硬连线解码。

以简单循环示例说明差异。Z80 汇编循环计数 256 次并累加:

LD B, 0          ; B=0(计数器)
LOOP:            ; 标签
INC B            ; B++
LD A, (HL)       ; 从 HL 指向内存加载到 A
ADD A, (DE)      ; 加 DE 指向值
LD (HL), A       ; 存回
DJNZ LOOP        ; B 非零则跳转 LOOP(递减并分支)

这段代码初始化 B 为 0,进入 LOOP 标签,每次递增 B,从 HL 地址加载值到 A,与 DE 地址值相加后存回 HL,若 B 非零则跳转。DJNZ 结合递减和分支,高效循环 256 次,总周期约 256×18=4608256 \times 18 = 4608。现在看 6502 等价代码:

LDA #0           ; A=0(计数器)
STA $00          ; 存零页 $00
LOOP:            ; 标签
INC $00          ; 递增零页计数
LDA $10          ; 从零页 $10 加载到 A
CLC              ; 清进位
ADC $20          ; 加零页 $20
STA $10          ; 存回 $10
LDA $00          ; 载入计数检查
BNE LOOP         ; 非零分支回 LOOP

这里用零页 这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页 00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00这里用零页这里用零页 00里用零页里用零页 00NELOOP;非零分支回LOOP这里用零页NE LOOP ; 非零分支回 LOOP 这里用零页00用零页用零页 00里用零页里用零页00NELOOP;非零分支回LOOP这里用零页NE LOOP; 非零分支回 LOOP 这里用零页 0000$用零页 $00$ 里用零页 $00$ NE LOOP;非零分支回 LOOP 这里用零页 $00$ 作为计数器,LOOP 内递增它,从 $10$ 加 $20$,零分支回 LOOP。$00$ 作计数器, LOOP 内递增它, 从$10$ 加 $20$,零分支回 LOOP。$00$\text{作计数器, LOOP 内递增它, 从}$10$ 加 $20$零分支回 LOOP 这里用零页 $00$这里用零页 $00$ 作计数器,LOOP 内递增它,从 $10$ 加 $20$ 存回,每次检查 $00$ 非零分支回 LOOP。零页操作仅 $10$ 加 $20$ 存 $101020存回,每次检查存回,每次检查00非零分支。零页操作仅非零分支。零页操作仅10201020存回,每次检查存回,每次检查 00非零分支。零页操作仅非零分支。零页操作仅10201020存回,每次检查存回,每次检查00非零分支。零页操作仅非零分支。零页操作仅10201020存回,每次检查存回,每次检查0000非零分支。零页操作仅非零分支。零页操作仅 10201020存回,每次检查存回,每次检查0000非零分支。零页操作仅非零分支。零页操作仅10201020存回,每次检查存回,每次检查000000\text{非零分支. 零页操作仅}1010202010102020\text{存回, 每次检查}0000\text{非零分支.零页操作仅}101020201010202020存回,每次检查存回,每次检查00非零分支。零页操作仅非零分支。零页操作仅 10201020存回,每次检查存回,每次检查00非零分支。零页操作仅非零分支。零页操作仅 10201020存回,00 存回 ,00\text{非零分支. 零页操作仅}1010202010102020 存回, 每次检查 0000\text{非零分支}\text{零页操作仅}1010202010102020 存回, 每次检查 0000\text{非零分支.零页操作仅}1010202010102020 存回, 每次检查 0000\text{非零分支.零页操作仅} 10201020存回,每次检查存回 , 每次检查00非零分支。零页操作仅非零分支。零页操作仅10201020存回,每次检查存回 , 每次检查00非零分支。零页操作仅10 非零分支。零页操作仅 10202010102020 存回, 每次检查 0000\text{非零分支.零页操作仅}1010202010102020 存回, 每次检查 0000\text{非零分支.零页操作仅}1010202010102020 存回, 每次检查 0000\text{非零分支.零页操作仅}1010202010102020 \text{存回, 每次检查} 0000\text{零页操作仅} 1010 \text{加} 2020 \text{存} 1010 \text{加} 2020 \text{存回, 每次检查} 0000 \text{非零分支. 零页操作仅} 1010 \text{加} 2020 \text{存} 1010 \text{加} 2020 \text{存回, 每次检查} 0000 \text{非零} 10$$ \text{10 加 20 存 10 加 20 存回, 每次检查 00 非零 10 加 20 存 10 加 20 存回, 每次检查 00 非零 10 加 20 存 10 加 20 存回, 每次检查 00 非零分支. 零页操作仅 110 加 20 存 10 加 20 存回, 每次检查 00 非零分支. 零页操作仅 10 加 20 存 10 加 20 存回, 每次检查 00 非零分支. 零页操作仅 10 加 20 存 10 加 20 存回, 每次检查 00 非零分支. 零页操作仅 110 加 20 存 10 加 20 00 非零分支. 零页操作仅 110 加 20 存 10 加 20 存回, 每次检查 00 00 非零分支. 零页操作仅 110 加 20 存 10 加 20 存回, 每次检查 00 00 非零分支. 零页操作} $$ \text{110 加 20 存 10 加 20 存回,每次检查 00 00 非零分支 . 零页操作仅 110 加 20 存 10 加 20 存回 , 每次检查 00 非零分支。零页操作仅 110 加 20 存 10 加 20 存回,每次检查 00 非零分支。零页操作仅 110 加 20 存 10 加 20 存回,每次检查 00 非零分支。零页操作仅 110 加 20 存 10 加 20 存回,每次检查 00} $$110202010102020 \text{存回,每次检查} 0000\text{非零分支。零页操作仅}110110202010102020\text{存回,每次检查}0000\text{非零分支。零页操作仅}110110202010102020 \text{存回,每次检查} 0000 \text{非零分支。零页操作仅} 1010202010102020 \text{存回,每次检查} 0000 \text{非零分支。零页操作仅} 1010202010102020 \text{存回,} 0000 \text{非零分支.零页操作仅} 1010202010102020\text{存回,每次检查}0000\text{非零分支。零页操作仅}1010202010102020存回,每次检查 0000 非零分支。零页操作仅 10+2010 + 2010+2010 + 20 存回,每次检查 0000 \text{非零分支。零页操作仅} 10+2010 + 2010 + 00$$00 \text{非零分支。零页操作仅} 10102020101000非零分支.零页操作仅\text{非零分支.零页操作仅}110加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20 00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00\text{10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20 00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00非零分支.零页操作仅10加20存10加20存回,每次检查00}00非零分支。零页操作仅非零分支。零页操作仅10201020存回,每次检查存回,每次检查00非零分支。零页操作仅非零分支。零页操作仅10201020存回,每次检查存回 , 每次检查00非零分支。零页操作仅 非零分支。零页操作仅10201020存回,每次检查存回 , 每次检查00非零分支。零页操作仅非零分支。零页操作仅 10201020存回,每次检查存回,每次检查00非零分支。零页操作仅非零分支。零页操作仅10201020存回,每次检查存回,每次检查0010 \text{加} 20 \text{存} 10 \text{加} 20 \text{存回, 每次检查 } 00 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{存回, 每次检查 } 00 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{存回, 每次检查 } 00 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{存回, 每次检查 } 00 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{存回, 每次检查 } 00 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{存回, 每次检查 } 00 \text{非零分支. 零页操作仅 } 10 \text{加} 20 \text{存} 10 \text{加} 20 \text{存回, 每次检查 } 00$$00$\text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $110$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $110$ \text{加} $20$ \text{存} $10$ \text{加} $20$\text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,} $00$\text{非零分支。零页操作仅} $110$ \text{加} $20$ \text{存} $10$ \text{加} $20$\text{存回,每次检查} $00$\text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,每次检查} $00$\text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$\text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,每次检查} $000$\text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ $00$\text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$\text{存回 , 每次检查} $00$ \text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回 , 每次检查} $00$\text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回 , 每次检查} $000$\text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $110$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $110$ \text{加} $20$ \text{存} $10$ \text{加} $20$\text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $1$ $10$ \text{加} $20$ \text{存} $10$ \text{加} $20$ \text{存回,每次检查} $00$ \text{非零分支。零页操作仅} $10$ \text{加} $20$ \text{存} $10$ \text{加} $2000\text{非零分支.零页操作仅} 10 \text{加} 20\text{存} 10 \text{加} 20\text{存回,每次检查} 00\text{非零分支.零页操作仅} 10 \text{加} 20\text{存} 10 \text{加} 20\text{存回,每次检查} 00\text{非零分支.零页操作仅} 10 \text{加} 20\text{存} 10 \text{加} 20\text{存回,每次检查} 00\text{非零分支.零页操作仅} 10 \text{加} 20\text{存} 10 \text{加} 20\text{存回,每次检查} 00\text{非零分支.零页操作仅} 10 \text{加} 20\text{存} 10 \text{加} 20\text{存回,每次检查} 00\text{非零分支.零页操作仅} 10 \text{加} 20\text{存} 10 \text{加} 20\text{存回,每次检查}0×00非零分支。零页操作仅 10+20 存回 10+20 存回,每次检查 00 非零分支。零页操作仅 10+20 存回 10+20 存回,每次检查 00 非零分支。零页操作仅 10+20 存回 10+20 存回,每次检查 00 非零分支。零页操作仅 10+20 存回 10+20 存回,每次检查 00 非零分支。零页操作仅 10+20 存回 10+20 存回,每次检查 00 非零分支。零页操作仅 10+20 存回 10+20 存回,每次检查 00 非零分支。零页操作仅 210+20 存回,每次检查 00 非零分支。零页操作仅 210+20 存回,每次检查 00 非零分支。零页操作仅 24 周期,总周期约 10+20 存回,每次检查 00 非零分支。零页操作仅 24 周期,总周期约 10+20 存回,每次检查 00 非零分支。零页操作仅 24 周期,总周期约 10+20 存回,每次检查 00 非零分支。零页操作仅 24 周期,总周期约 10+20 存回,每次检查 00 非零分支。零页操作仅 24 周期,总周期约 10+200 \times 00 \text{非零分支。零页操作仅 } 10 + 20 \text{ 存回 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 10 + 20 \text{ 存回 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 10 + 20 \text{ 存回 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 10 + 20 \text{ 存回 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 10 + 20 \text{ 存回 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 10 + 20 \text{ 存回 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 2\text{--}10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 2\text{--}10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 2\text{--}4 \text{ 周期,总周期约 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 2\text{--}4 \text{ 周期,总周期约 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 2\text{--}4 \text{ 周期,总周期约 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 2\text{--}4 \text{ 周期,总周期约 } 10 + 20 \text{ 存回,每次检查 } 00 \text{ 非零分支。零页操作仅 } 2\text{--}4 \text{ 周期,总周期约 } 10 + 20[ \text{存回, 每次检查 0000 非零分支. 零页操作仅 2244 周期, 总周期约 10+2010 + 20 回, 每次检查 0000 非零分支. 零页操作仅 2244 周期, 总周期约 10+2010 + 20 存回, 每次检查 0000 非零分支. 零页操作仅 2244 周期, 总周期约 10+2010 + 20} ]10 + 20$存回,每次检查$00$非零分支。零页操作仅 $2$--$4$ 周期,总周期约 $10 + 20$ 存回,每次检查 $00$ 非零分支。零页操作仅 $2$--$4$ 周期,总周期约 $256 \times 12 = 3072$ 非零分支。$2$--$4$ \text{周期,总周期约} $256 \times 12 = 3072$非零分支。零页操作仅$22\text{—}4 \text{ 周期, 总周期约 }256 \times 12 = 3072\text{ 非零分支. 零页操作仅 }2\text{—}4 \text{ 周期, 总周期约 }256 \times 12 = 3072$$$$ \text{—4 周期, 总周期约 } 256 \times 12 = 3072 $$

代码更短,速度更快。Z80 指令强大但周期冗长,6502 简洁高效,完美适配 ROM 受限系统。

\section{中断与 I/O 处理}

Z80 的中断系统灵活,支持 IM0(8080 兼容)、IM1(向量) 和 IM2(重映射向量) 模式,外加 NMI(非屏蔽)。I/O 通过专用 IN/OUT 指令,使用 8 位或 16 位端口寻址,与内存分离。6502 的中断简化为 IRQ、BRK 和 NMI,通过固定向量(\text{FFFE/FFFF})。I/O 完全内存映射,利用 \text{FFFE/FFFF}。FFFE/FFFF((FFFE/FFFF)I/O完全内存映射,利用) 。I/O 完全内存映射,利用 FFFE/FFFFFFFE/FFFFFFFE/FFFF. FFFE/FFFFFFFE/FFFF (FFFE/FFFFFFFE/FFFF\text{I/O 完全内存映射, 利用}FFFE/FFFFFFFE/FFFF). FFFE/FFFFFFFE/FFFF (FFFE/FFFFFFFE/FFFF\text{I/O 完全内存映射, 利用}FFFE/FFFFFFFE/FFFF\text{统一地址空间. Z80 适合多}FFFE/FFFFFFFE/FFFFI/O完全内存映射,利用FFFE/FFFF 完全内存映射,利用 FFFE/FFFF统一地址空间. Z80 适合多FFFE/FFFFFFFE/FFFFI/O完全内存映射,利用FFFE/FFFF 完全内存映射,利用 FFFE/FFFF统一地址空间. Z80 适合多FFFE/FFFFFFFE/FFFFI/O完全内存映射,利用FFFE/FFFF 完全内存映射,利用 FFFE/FFFF统一地址空间. Z80 适合多FFFE/FFFFFFFE/FFFFI/O完全内存映射,利用FFFE/FFFF 完全内存映射,利用 FFFE/FFFF统一地址空间. Z80 适合多FFFE/FFFFFFFE/FFFFI/O完全内存映射,利用FFFE/FFFF 完全内存映射,利用 FFFE/FFFF.FFFE/FFFFFFFE/FFFFI/O完全内存映射,利用完全内存映射,利用FFFE/FFFFFFFE/FFFF。FFFE/FFFF.FFFE/FFFFFFFE/FFFFI/O完全内存映射,利用FFFE/FFFF 完全内存映射,利用 FFFE/FFFFFFFE/FFFF I/O完全内存映射,利用完全内存映射,利用FFFE/FFFF)FFFE/FFFF)FFFE/FFFF利用 FFFE/FFFFFFFE/FFFFF I/OI/O\text{完全内存映射, 利用}FFFE/FFFFFFFE/FFFFFFFE/FFFF利用利用FFFE/FFFF I/O完全内存映射,利用完全内存映射,利用FFFE/FFFFFFFE/FFFF利用利用FFFE/FFFF I/O完全内存映射,利用完全内存映射,利用FFFE/FFFFFFFE/FFFFFFFE/FFFF 利用 FFFE/FFFFFFFE/FFFF I/OI/O\text{完全内存映射,利用}FFFE/FFFFFFFE/FFFFFFFE/FFFF利用利用FFFE/FFFF I/O完全内存映射,利用完全内存映射,利用FFFE/FFFFFFFE/FFFF利用利用FFFE/FFFF I/O完全内存映射,利用FFFE/FFFF \text{完全内存映射,利用}FFFE/FFFF 利用 FFFE/FFFFFFFE/FFFF I/OI/O \text{完全内存映射, 利用} FFFE/FFFFFFFE/FFFF\text{统一地址空间. Z80 适合多设备系统, 6502 则无缝集成外围硬件. }FFFE/FFFFFFFE/FFFF \text{统一地址空间. Z80 适合多设备系统, 6502 则无缝集成外围硬件.} $

\secFFFE/FFFFFFFE/FFFFFFFE/FFFF 统一地址空间。Z80 适合多设备系统,6502 则无缝集成外围硬件。

\section{性能与功耗分析}

基准测试显示 Z80 在 Dhrystone 上约 0.5 MIPS,6502 约 0.3 MIPS,但按时钟标准化,6502 每周期 MIPS 更高,尤其排序算法中零页优化闪耀。时钟效率上,6502 在游戏中胜出,如 ZX Spectrum (Z80@3.5 MHz) 帧率低于 Apple II (6502@1 MHz) 的同类游戏。功耗低是 6502 王牌,便携设备首选。

\section{应用案例与遗产}

Z80 驱动 Sinclair ZX 系列、Amstrad CPC、MSX 和 CP/M PC,奠定商业计算基础;6502 赋能 Apple I/II、BBC Micro、NES 和 Commodore 64,定义娱乐时代。现代 Z80 存活于工业控制,6502 启发 RISC 并通过 RC2014 等 FPGA 项目复兴。社区工具丰富,Z80 用 z80asm,6502 用 ca65,模拟器如 Fuse 和 MAME 让复刻触手可及。

\section{优缺点总结与选择指南}

Z80 优势在于寄存器丰富、指令全面、易移植 8080 代码,缺点是复杂和周期多;6502 胜在简单高效、低成本、代码紧凑,短板是寄存器匮乏和扩展难。新项目宜选 Z80 以求兼容,复古游戏或效率优先则推 6502。总体,6502 更优雅,Z80 更全面,二者互补。

\section{结论}

Z80 和 6502 的差异源于丰富 vs. 简约的哲学,前者全面,后者高效。未来 FPGA 复现和 SoC 借鉴将延续其活力。读者不妨试用模拟器或 DIY 项目,亲身体验这些传奇。参考 Zilog Z80 手册、Western Design Center 65C02 数据书,以及《Z80 Assembly Language》等书籍。

\section{附录}

术语 glossary:AF 为 Z80 标志/累加器对,零页指 6502 的 0000FFFF 快速内存。进一步阅读包括维基百科和相关资源。00--FF6502指 6502 的 00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF快速内存.进一步阅读包括维基百科和相关资源.快速内存. 进一步阅读包括维基百科和相关资源.00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF快速内存.进一步阅读包括维基百科和相关资源.快速内存. 进一步阅读包括维基百科和相关资源.00--FF0000FFFF 快速内存。进一步阅读包括维基百科和相关资源。00--FF0000FFFF 快速内存。进一步阅读包括维基百科和相关资源。0000FFFF 快速内存。进一步阅读包括维基百科和相关资源。0000FFFF 快速内存。进一步阅读包括维基百科和相关资源。0000FFFF 快速内存。进一步阅读包括维基百科和相关资源。00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF快速内存.进一步阅读包括维基百科和相关资源.快速内存. 进一步阅读包括维基百科和相关资源.00--FF快速内存. 进一步阅读包括维基百科和相关资源.\text{快速内存. 进一步阅读包括维基百科和相关资源.}00--FF零页指6502零页指 6502 的 00--FF快速内存. 进一步阅读包括维基百科和 YouTube demo.\text{快速内存. 进一步阅读包括维基百科和 YouTube demo.}FFFF快速内存 . 进一步阅读包括维基百科和 YouTube demo,0000FFFF00--FF快速内存.进一步阅读包括维基百科和YouTubedemo,基准代码可置GitHub.快速内存. 进一步阅读包括维基百科和 YouTube demo, 基准代码可置 GitHub.FF快速内存. 进一步阅读包括维基百科和 YouTube demo, 基准代码可置 GitHub.\text{快速内存. 进一步阅读包括维基百科和 YouTube demo, 基准代码可置 GitHub.}00 - FFFF快速内存 0000 - FF进一步阅读包括维基百科和 YouTube demo, 基准代码可置 GitHub.\text{进一步阅读包括维基百科和 YouTube demo, 基准代码可置 GitHub.}00 - FFFF\text{快速内存 . 进一步阅读包括维基百科和 YouTube demo, 基准代码可置 GitHub.}0000 - FF00FF00 - FF\text{快速内存 . 进一步阅读包括维基百科和 YouTube demo, 基准代码可置 GitHub}00FF00-FF .$FF 快速内存。进一步阅读包括维基百科和 YouTube demo,基准代码可置 GitHub。