6502“非法”操作码脱贱

2021-06-05 23:31:41

仔细看看“非法”操作系统和MOS 6502 MPU的未记录指令。

MOS 6502 MPU的指令表由MOS技术设计并于1975年推出(CMOS版本,65C02由Western Design Center开发)具有一些明显的差距,只有56种IntrultIons以各种地址模式记录。这叶105无证的插槽 - 而6502个社区以来一直渴望填补这些差距。

此外,还有一些神秘的遗址,也有问题没有答复,就像他们至少有些人故意(特别是,因为他们中的一些人都派上街区转移,Z80有专门的指示,或者它们都是偶然的他们的行为,为什么这么做?在这里,我们将尝试提出这些问题的一些答案。

首先,让' s看一下指令表,因为它通常被描绘,填充空白间隙。(这里,对于“非法”操作码,我们使用DASM和ACME汇编程序使用的助记符,除了用于指令代码$ EB的“USBC”之外,这些使用普通“SBC”。)

以下是所有21(或多或少)“非法”操作码(括号中给出的替代名称),因为它们通常被描述:

非常不稳定,请勿使用。 A的基础值基于A和常量的CONTET确定,这可能通常是00,$ FF,$ EE等。此常量的值取决于逼近,芯片系列,以及其他因素,如图所示出色地。为了从等式中消除这些不确定,使用0作为操作数或累加器中的$ FF的值。

该操作涉及加法器:根据(A和Oper)设置V-FLAL + Oper携带未设置,但是与携带交换位7(符号)

m = c - > [76543210] - > C,A + M + C - > A,C. A和X同时放置在总线上(有效地在AN和操作中产生)并存储在M中 不稳定:有时'和(h + 1)' 丢弃,页面边界过境可能无法正常(具有用作地址的高字节的值的高字节) 不稳定:有时'和(h + 1)' 丢弃,页面边界过境可能无法正常(具有用作地址的高字节的值的高字节) 不稳定:有时'和(h + 1)' 丢弃,页面边界过境可能无法正常(具有用作地址的高字节的值的高字节) 将A和X放在SP中,并在ADDR存储A和X和(Addr的高字节+ 1)。 不稳定:有时'和(h + 1)' 丢弃,页面边界过境可能无法正常(具有用作地址的高字节的值的高字节)

处理器将在T1相中捕获,在数据总线上使用$ FF。 - 需要重置。

免责声明:提供信息,没有任何完全或正确性的保证。这些“非法”指示没有保证工作,有些是非常不稳定的,有些人甚至可以在竞争中开始两个异步线程,其中胜利者通过这种小型因素作为生产系列的温度或微小的差异,在其他时间,结果取决于所涉及的确切值和芯片系列。使用谨慎和您自己的风险。

好吧,这一切都很好,但是......我们真的不太了解他们是帽子,以及为什么这些是。让我们冒着冒险的风险,看看指令布局,因为它应该被视为。

根据模式A-B-C布置6502指令表,其中A和B是每个的八进制数,其次是一组两个二进制数字C,如在比特矢量“AAABBCC”中。

示例:所有ROR指令共享A = 3和C = 2(3 b2),在b中的地址模式。同时,所有指令都在寻址零页共享B = 1(A1 C)。 ABC&等于312&等于> (3<< 2 | 2)&等于66美元“ROR ZPG”。

如果我们按组件C,A和B排列指令表,我们发现它们在垂直列中的每个地址模式都整齐地排列(具有与X寄存器相关的指令的显着例外情况,这与其相应的Y对应涉及x的索引的地址模式)。值得注意的是,所有“非法移民”严格遵守此计划。

此外,CPU内部的所有指令及其控制流程列于C = 0的顶部季度,而C = 3的下季度,我们发现大多数“非法”OPCODES,是由官方完全没有禁令的操作码。此外,对于C = 1或C = 2的部分,我们可以看到那种共享相同行的操作代码(具有两个堆栈传送指令“TXS”和TSX的显着异常值)。

虽然这肯定的信息,但它仍然没有放弃未实现的指令的系统方面,也不会告诉我们他们真正的东西。

所以让我们再试一次,这次通过组件A,C和B来安排指令布局:

首先,我们了解额外的NOPS真正的东西。通过将Opcodes与列进行比较,我们可以清楚地看到,这些应该是什么。

$ 80(a = 4,c = 0,b = 0)显然是“Sty立即”,试图将Y寄存器的内容存储在文字操作数中。

一般而言,这些额外的NOP是具有非功能性或不义的地址模式的指令,它执行,但没有任何外部效果。

但是,该组的说明涉及间接寻址的CPU无限地捕获在T1相中,导致“JAM”(或kil),导致CPU无响应并要求重置。

这是真正有趣的部分,“非法OPCODES”的肉。

通常,我们可以观察到C = 3处的任何指令都是在同一时隙中的C = 1和C = 2的那些中继承它们的行为,在立即上方的行中找到相同的列,使用地址模式C = 1的指令。心中,在二进制3中是1和2的复合材料,位0和1设置。

换句话说,任何指令XXXXXX 11将在XXXXXX 01处的指令的地址模式一次执行XXXXXX 01和XXXXXX10处的指令。(但是,关于X和Y寄存器的一般规则特定的索引地址模式仍然适用。 )

“SAX ABS”(8F,A = 4,C = 3,B = 3)是“STA ABS”($ 8D,A = 4,C = 1,B = 3)和“STX ABS”( $ 8e,a = 4,c = 2,b = 3)。

“LAX X,IND”($ A3,A = 5,C = 3,B = 0)是“LDA X,IND”($ A1,A = 5,C = 1,B = 0)和“ LDX IMM“($ A2,A = 5,C = 2,B = 0)。

让我们仔细看看两个高度不稳定的指令“Ane”(XAA)和“LXA”(LAX立即)涉及“魔法常量” - 通常是00,$ FF,$ EE等 - 这两种组合累加器操作和累加器和X寄存器之间的寄存器间传输:

$ 8b(a = 5,c = 3,b = 2):Ane imm = sta imm(nop)+ txa(a或const)和x和oper - > $ ab(a = 4,c = 3,b = 2):lxa imm = lda imm +税(a或const)和oper - > a - > X

在“ANE”的情况下,累加器的内容与X寄存器的内容同时放在内部数据线上,同时在那里且操作数也读取了立即操作的操作数,结果转移到蓄能器。

在“LXA”的情况下,即时操作数和累加器的内容正在竞争非线线,而结果将被传送到累加器和X寄存器。

这些竞争的结果,嘈杂的条件取决于芯片的生产系列,也许甚至在环境条件下。这种效果在蓄电池或魔法常数“结合竞争输入的累加器中的影响。然后,对目标寄存器的最终转移似乎可以预期工作。

这种竞争输出值的这种竞争输出值Sucagests 6502正在内部工作在电源低逻辑中,其中所有数据线都将第一个设置为高电平,然后清除任何零位。这也表明“魔法常数”仅适用于累加器内容的部分转移。

(介意这不是关于6502硬件内部的合格声明,但仅仅是对其外部效果的观察。)

其中大部分也适用于“TAS”(XAS,SHS),9B美元,但在这里,索引寻址的额外周期似乎有助于在没有这种“魔法常数”的情况下被解决的冲突。但是,“TAS”仍然不稳定。

有四个指令,它将特殊的术语“高字节添加到方程中。这些都是:

SHA(AHX,AXA)A和X和(H + 1) - > M $ 9F SHA ABS,Y(5)SHX(A11,SXA,XAS)X和(H + 1) - > M $ 9E SHX ABS,Y(5)害羞(A11,SYA,SET)Y和(H + 1) - > M $ 9C Shy ABS,X(5)TAS(XAS,SHS)A和X - > SP,A和X和(H + 1) - > M $ 9B TAS ABS,Y(5)

我们可能已经看到,这是:由于有效地址的计算涉及ALU,高字节的部分结果增加了冲突的输出值。但是,根据轻微的时间差异,可能还可以丢弃这个术语(意思是,变得过度增写)。我们也可能辨别为什么有效的高地址可以完全由输出值替换,以防页面边界被交叉,因为这只提供允许输出值稳定和覆盖地址所需的额外时间量高字节。同样,这些指令不稳定。

我们可能需要注意的那个“害羞”和“SHX”不是C = 3组的一部分,而是未实现的指令“Sty ABS,X”(C = 0)和“STX ABS,Y”(C = 2) 。两者显然都倒回“STA ABS,X”的实施,额外的“H + 1”术语。

“SHA ABS,Y”最后,是遵守C = 3规则的复合指令,我们已经建立,执行“STA ABS,X”和“SHX ABS,Y”。 (特别是,这将地址模式翻转到“ABS,Y”,其中可以预期“ABS,X”。这表明关于任何X寄存器传输的索引指令的这种调整被实现为另外的阶段。)

然而,“Sha Ind,Y”(93美元)是“Sta Ind,Y”(91美元)和“Shx Ind,Y”(92美元)的综合,这是一个堵塞。

我们在这里观察到的是一个未定义的输入模式的未定义行为的文本图表示例。对于一次设置的两个至少有效位(C = 3)的任何指令(C = 3),具有C = 1和C = 2的各个时隙中的两个指令以竞争输出值和ED并行的异步线程开始。轻微的实施细节和环境因素可能导致其中一些指示的结果以及定时最终稳定的结果。

值得注意的是,C = 3没有NOP或干扰指令,意思是,如果其中一个线程中的任何一个,则它不会在其中一个线程成功解析(从而推动内部阶段)。

在C = 0,C = 1和C = 2,我们发现没有无效的地址模式,或未证明的指令,或者完全超过未解决的时序问题,导致“JAM”。这条规则只有两个例外,即“害羞”和“shx”,这是不稳定的,可能有些可用。

任何这个故意都是如此? 几乎不。 这只是未定义的行为。 由解码矩阵定义的有序混乱。 但是,我们可能会从这个关于6502的内部的内容和各种关堂兄弟中学习一些。 - 至少一些。