西门子 PC 100 汇编手册中的 6502 非法 Opcodes (1980)
西门子 PC 100 汇编手册中的 6502 非法 Opcodes (1980)
2025-05-08 by Michael Steil
6502 的"非法" Opcodes 曾引起家庭电脑爱好者的极大兴趣,并且在各种 杂志上发表过分析文章。但人们永远不会想到像西门子这样的公司会在 1980 年的编程手册中记录非法 Opcodes。
PC 100 汇编手册
西门子 PC 100 基本上是一个装在机箱里的 Rockwell AIM-65 单板计算机,配备了 6502 处理器、集成键盘、LED 显示器和热敏打印机,专为教育和开发目的而定制,并提供本地化的文档和修改后的 ROM。
西门子的德语手册主要基于 Rockwell 的原始手册,但重新调整了内容。特别值得关注的是汇编手册:
[Siemens Assembler-Handbuch Personal-Computer PC 100, Ausgabe 1980/1981](https://www.pagetable.com/<docs/pc100_illop/Assembler-Handbuch Personal-Computer PC 100.pdf>)(124 页,17 MB)
它由以下部分组成:
Assembler-Handbuch | Rockwell | 描述 ---|---|--- 第 1–9 章 | User’s Guide, Chapter 5 | 汇编器参考 第 10 章 | Programming Manual, Appendix B | 6502 参考 第 11 章 | User’s Guide, Chapter 3 | 监视器参考 第 12 章 | – | 表格
“特殊指令”
6502 参考的末尾有三页额外的页面,描述了“Sonderbefehle”(“特殊指令”),这些指令不在本章翻译的原始 MOS/Rockwell 6502 参考中。我们可以假设这是西门子的原创研究。
以下是翻译后的转录:
10.3 特殊指令
微处理器识别出许多特殊的指令,这些指令在很大程度上是未知的,但可以为用户在程序开发中提供有价值的帮助。下表中所选择的助记符仅是对有效表示这些指令的建议。
注意: 这些指令不是规范的一部分,可能会随时更改,恕不另行通知。特殊的命令无法被汇编器程序解码,必须使用 .BYT 指令进行编程(请参阅第 10.2 章)。
AAX 累加器和 X 寄存器之间的逻辑“AND”运算,带结果存储。
操作 A ∧ X → M,带零页 und (A) ∧ X ∧ $02 → M,带绝对地址
标志
N | Z | C | I | D | V ---|---|---|---|---|--- – | – | – | – | – | – 寻址模式 | 汇编器助记符 | OP CODE | 字节数 ---|---|---|--- 零页 | AAX Oper | 87 | 2 零页,Y | AAX+16 Oper | 97 | 2 X-Reg. ∧ $02Absolute | AAX+23 Oper | 9E | 3 X-Reg. ∧ Accu ∧ $02Absolute | AAX+24 Oper | 9F | 3
DCM 将内存位置的值减 1,并将结果与累加器进行比较。
操作 M – 1 → M 且 A – M
标志
N | Z | C | I | D | V ---|---|---|---|---|--- V | V | V | – | – | – 寻址模式 | 汇编器助记符 | OP CODE | 字节数 ---|---|---|--- 零页 | DCM Oper | C7 | 2
LAX 加载累加器和 X 寄存器
操作 M → A 且 M → X
标志
N | Z | C | I | D | V ---|---|---|---|---|--- V | V | – | – | – | – 寻址模式 | 汇编器助记符 | OP CODE | 字节数 ---|---|---|--- 立即数 | LAX Oper | AB | 2 零页 | LAX-4 Oper | A7 | 2
ISB 将内存单元的值加 1,并从累加器中减去结果
操作 M + 1 → M 且 A – M → A
标志
N | Z | C | I | D | V ---|---|---|---|---|--- V | V | V | – | – | – 寻址模式 | 汇编器助记符 | OP CODE | 字节数 ---|---|---|--- 零页 | ISB Oper | E7 | 2
注意: 指令 LAX Immediate、AAX X reg $02 和 AAX X reg accu $02 并非总是被正确处理。
10.4 汇编语言编程
由于上述特殊指令无法被汇编器程序解码,因此必须使用 .BYT 指令进行编程。
分析
Opcodes | Siemens 助记符 | 现代助记符 | 评论 ---|---|---|--- 87/97 | AAX | SAX | 正确。也存在 izx/abs 寻址模式。 9E/9F | AAX | SHX/SHA | 它是 aby,而不是 abs。 此外,他们的常量 ($02) 实际上是指令地址的高字节。(不应该与其他“AAX” Opcodes 分组。) C7 | DCM | DCP | 正确。 也存在 zpx/izx/izy/abs/abx/aby 寻址模式。 AB | LAX | LAX | 基本正确。 所记录的不稳定性来自 A 寄存器的位有时会渗入计算中。 (更多信息) A7 | LAX | LAX | 正确。 也存在 zpy/izx/izy/abs/aby 寻址模式。 E7 | ISB | ISC | 正确。 也存在 zpx/izx/izy/abs/abx/aby 寻址模式。
总而言之:
- 他们正确地得到了那些被指定为“稳定”的指令,但缺少许多寻址模式。
- 他们错误地得到了 9E/9F(他们指定为“不稳定”),可能是因为没有测试足够多的输入组合。
- 他们正确地得到了 AB(实际上是不稳定的),但他们没有进一步研究不稳定性的根源。
我们可以假设这要么是西门子作者的原创研究,要么是从其他来源复制的。 如果这些信息来自 MOS 或 Rockwell,他们肯定会:
- 列出所有寻址模式。
- 不添加诸如_“指令 […] 和 […] 并非总是被正确处理。”_ 这样的语句——或者更好的是,省略不稳定的指令。
致谢
感谢 Gerald Schiepeck 在 VCFE 2025 上的 AIM-65 和 PC 100 展览,以及 Marco Baye 提请我注意汇编手册中的这一部分。
分类 6502, Archeology, Literature Siemens Personal Computer PC 100 Bedienungsanleitung, Ausgabe 1981/1982