"); //-->
COP通过一个独立的COP硬件向量引起一个软件中断。该硬件向量位于$FFF$-$FFF5。在6502模拟模式下: 程序指针增加2并压入堆栈。 状态寄存器压入堆栈。 中断状态位被设置。 程序指针从硬件向量载入。 十进制标志被清除。
在原本模式中:
会被改变的标志 ----di--
堆栈/中断寻址 | COP | 02 | 2* | 7 | 1 |
* | COP是一个字节,但是压入堆栈的程序指针要加2,因为有可选的签名字节 |
1 | 如果在65816/65802的原本模式(e=0)下,则增加一个周期 |
CPX和在6502下一样地工作,唯一值得注意的例外是要记住在16位变址寄存器模式(x=0)下,内存数据将是16位宽的。低端字节会来自有效地址而高端字节来自有效地址的下一个存储单元。
会被改变的标志 n-----zc
n:结果的最高有效位被设置时设置。 z:结果为零时设置。 c:如果不需要借位则设置。(X大于等于内存数据) 如果需要借位则设置。(X小于内存数据)直接寻址 | CPX #const | E0 | 2* | 2 | 1 |
绝对寻址 | CPX addr | EC | 3 | 4 | 1 |
直接页面寻址 | CPX dp | E4 | 2 | 3 | 1,2 |
* | 如果m=0(16位内存/累加器),则增加1个字节 |
1 | 如果m=0(16位内存/累加器),则增加1个周期 |
2 | 如果直接页面寄存器的低端字节不是0,则增加1个周期 |
CPY和在6502下一样地工作,唯一值得注意的例外是要记住在16位变址寄存器模式(x=0)下,内存数据将是16位宽的。低端字节会来自有效地址而高端字节来自有效地址的下一个存储单元。
会被改变的标志 n-----zc
n:结果的最高有效位被设置时设置。 z:结果为零时设置。 c:如果不需要借位则设置。(Y大于等于内存数据) 如果需要借位则设置。(Y小于内存数据)直接寻址 | CPY #const | C0 | 2* | 2 | 1 |
绝对寻址 | CPY addr | CC | 3 | 4 | 1 |
直接页面寻址 | CPY dp | C4 | 2 | 3 | 1,2 |
* | 如果m=0(16位内存/累加器),则增加1个字节 |
1 | 如果m=0(16位内存/累加器),则增加1个周期 |
2 | 如果直接页面寄存器的低端字节不是0,则增加1个周期 |
DEC也几乎和在6502模式下一样地工作。在16位累加器/内存模式(m=0)下,被改变的数据将是16位宽,低端字节会自动向高端字节借位。低端字节会来自有效地址而高端字节来自有效地址的下一个存储单元。
会被改变的标志 n-----z-
n:结果的最高有效位被设置时设置。 z:结果为零时设置。累加器寻址 |
DEC a 别名:DEA |
3A | 1 | 2 | |
绝对寻址 | DEC addr | CE | 3 | 6 | 1 |
直接页面寻址 | DEC dp | C6 | 2 | 5 | 1,2 |
绝对变址X寻址 | DEC addr,X | DE | 3 | 7 | 1 |
直接页面变址X寻址 | DEC dp,X | D6 | 2 | 6 | 1,2 |
1 | 如果m=0(16位内存/累加器),则增加两个周期 |
2 | 如果直接页面寄存器的低端字节不为零,则增加一个周期 |
两个指令都像在6502下一样地工作,在16位变址寄存器模式下,变址寄存器将会被当做16位宽。
会被改变的标志:n-----z-
n:结果的最高有效位被设置时设置。 z:结果为零时设置。隐式寻址 | DEX | CA | 1 | 2 |
隐式寻址 | DEY | 88 | 1 | 2 |
又是一个和在6502下一样工作的指令,只是有了新的寻址方式。在16位内存/累加器模式下,数据是16位宽--低端字节会来自有效地址而高端字节来自有效地址的下一个存储单元。
会被改变的标志 n-----z-
n:结果的最高有效位被设置时设置。 z:结果为零时设置。直接寻址 | EOR #const |
49
|
2*
|
2
|
1 |
绝对寻址 | EOR addr |
4D
|
3
|
4
|
1 |
绝对长程寻址 | EOR long |
4F
|
4
|
5
|
1 |
直接页面寻址 | EOR dp |
45
|
2
|
3
|
1,2 |
直接页面间接寻址 | EOR (dp) |
52
|
2
|
5
|
1,2 |
直接页面间接长程寻址 | EOR [dp] |
47
|
2
|
6
|
1,2 |
绝对变址X寻址 | EOR addr,X |
5D
|
3
|
4
|
1,3 |
绝对变址X长程寻址 | EOR long,X |
5F
|
4
|
5
|
1 |
绝对变址Y寻址 | EOR addr,Y |
59
|
3 |
4
|
1,3 |
直接页面变址X寻址 | EOR dp,X |
55
|
2
|
4
|
1,2 |
直接页面变址X,间接寻址 | EOR (dp,X) |
41
|
2
|
6
|
1,2 |
直接页面间接,变址Y寻址 | EOR (dp),Y |
51
|
2
|
5
|
1,2,3 |
直接页面间接长程,变址Y寻址 | EOR [dp],Y |
57
|
2
|
6
|
1,2 |
堆栈相对寻址 | EOR sr,S |
43
|
2
|
4
|
1 |
堆栈相对间接,变址Y寻址 | EOR (sr,S),Y |
53
|
2
|
7
|
1 |
* | 如果m=0(16位内存/累加器),则增加一个字节 |
1 | 如果m=0(16位内存/累加器),则增加一个周期 |
2 | 如果直接页面寄存器的低端字节不为零,则增加一个周期 |
3 | 如果增加变址越过页面边界,则增加一个周期 |
仍像在6502下的INC指令那样工作。在16位内存/累加器模式(m=0)下,数据按16位处理。一个新增的寻址方式是累加器寻址,那样可以递增累加器。
会被改变的标志 n-----z-
n:结果的最高有效位被设置时设置。 z:结果为零时设置。累加器寻址 |
INC a 别名:INA |
1A | 1 | 2 | |
绝对寻址 | INC addr | EE | 3 | 6 | 1 |
直接页面寻址 | INC dp | E6 | 2 | 5 | 1,2 |
绝对变址X寻址 | INC addr,X | FE | 3 | 7 | 1 |
直接页面变址X寻址 | INC dp,X | F6 | 2 | 6 | 1,2 |
1 | 如果m=0(16位内存/累加器),则增加两个周期 |
2 | 如果直接页面寄存器的低端字节不为零,则增加一个周期 |
两个指令都像在6502下那样工作。在16位变址寄存器模式下,寄存器将会被当做16位宽处理。
会被改变的标志 n-----z-
n:结果的最高有效位被设置时设置。 z:结果为零时设置。隐式寻址 | INX | E8 | 1 | 2 |
隐式寻址 | INY | C8 | 1 | 2 |
JMP跳转到操作数地址。如果执行一个远程跳转,程序指针存储寄存器从目标地址的第三个字节处载入。
65816的设计者还指出,汇编程序可能可以用JML指令代替JMP远程指令,JML [adr]也是绝对间接长程寻址的。
绝对寻址 | JMP addr | 4C | 3 | 3 | |
直接页面间接寻址 | JMP (addr) |
62
|
3
|
5
|
1 |
绝对变址间接寻址 | JMP (addr,X) | 7C | 3 | 6 | |
绝对长程寻址 |
JMP long 别名:JML long |
5C | 4 | 4 | |
绝对间接长程寻址 |
JMP [addr] 别名:JML [addr] |
DC | 3 | 6 |
1 | 在6502模式下,如果地址的低端字节为$FF(比如:地址是$xxFF),会得到错误的结果 |
JSR的工作方式和在6502下一样,不过增加了新的寻址方式。如果汇编程序中一个绝对地址小于$FFFF,那么会调用标准的JSR指令;如果它大于$FFFF,那么会使用绝对长程寻址方式。标准的JSR指令会跳转到当前的程序存储段内的子程序。
JSR指令能也够使用变址间接寻址。(参考寻址方式部分的例子)
JML是四字节指令,它可以JSR到位于任何存储段的子程序。执行该指令的时候,程序指针存储段会在程序指针的高端/低端字节之前压入堆栈。
绝对长程寻址 |
JSL long 别名:JSL long |
22 | 4 | 8 |
绝对寻址 | JSL addr | 20 | 3 | 6 |
绝对变址间接寻址 | JSL (addr,X) | FC | 3 | 8 |
LDA和标准的6502下的LDA指令几乎是一样的,新特点是使用了新的寻址方式。当状态寄存器被设置为16位内存/累加器模式(m=0)时,载入的数据是16位的,累加器的低端字节来自有效地址而高度字节来自有效地址的下一个存储单元。
会被改变的标志 n-----z-
n:结果的最高有效位被设置时设置。 z:结果为零时设置。直接寻址 | LDA #const |
A9
|
2*
|
2
|
1 |
绝对寻址 | LDA addr |
AD
|
3
|
4
|
1 |
绝对长程寻址 | LDA long |
AF
|
4
|
5
|
1 |
直接页面寻址 | LDA dp |
A5
|
2
|
3
|
1,2 |
直接页面间接寻址 | LDA (dp) |
B2
|
2
|
5
|
1,2 |
直接页面间接长程寻址 | LDA [dp] |
A7
|
2
|
6
|
1,2 |
绝对变址X寻址 | LDA addr,X |
BD
|
3
|
4
|
1,3 |
绝对变址X长程寻址 | LDA long,X |
BF
|
4
|
5
|
1 |
绝对变址Y寻址 | LDA addr,Y |
B9
|
3 |
4
|
1,3 |
直接页面变址X寻址 | LDA dp,X |
B5
|
2
|
4
|
1,2 |
直接页面变址X,间接寻址 | LDA (dp,X) |
A1
|
2
|
6
|
1,2 |
直接页面间接,变址Y寻址 | LDA (dp),Y |
B1
|
2
|
5
|
1,2,3 |
直接页面间接长程,变址Y寻址 | LDA [dp],Y |
B7
|
2
|
6
|
1,2 |
堆栈相对寻址 | LDA sr,S |
A3
|
2
|
4
|
1 |
堆栈相对间接,变址Y寻址 | LDA (sr,S),Y |
B3
|
2
|
7
|
1 |
* | 如果m=0(16位内存/累加器),则增加一个字节 |
1 | 如果m=0(16位内存/累加器),则增加一个周期 |
2 | 如果直接页面寄存器的低端字节不为零,则增加一个周期 |
3 | 如果增加变址越过页面边界,则增加一个周期 |
LDX和在6502下工作时的唯一不同是在16位变址寄存器模式(x=0)下,数据将会是16位宽的。X寄存器的低端字节来自有效地址而高端字节来自有效地址的下一个存储单元。
会被改变的标志 n-----z-
n:结果的最高有效位被设置时设置。 z:结果为零时设置。直接寻址 | LDX #const | A2 | 2* | 2 | 1 |
绝对寻址 | LDX addr | AE | 3 | 4 | 1 |
直接页面寻址 | LDX dp | A6 | 2 | 3 | 1,2 |
绝对变址Y寻址 | LDX addr,Y | BE | 3 | 4 | 1,3 |
直接页面变址Y寻址 | LDX dp,Y | B6 | 2 | 4 | 1,2 |
* | 如果m=0(16位内存/累加器),则增加1个字节 |
1 | 如果m=0(16位内存/累加器),则增加1个周期 |
2 | 如果直接页面寄存器的低端字节不是0,则增加1个周期 |
3 | 如果增加变址越过页面边界,则增加1个周期 |
LDY和在6502下工作时的唯一不同是在16位变址寄存器模式(x=0)下,数据将会是16位宽的。Y寄存器的低端字节来自有效地址而高端字节来自有效地址的下一个存储单元。
会被改变的标志 n-----z-
n:结果的最高有效位被设置时设置。 z:结果为零时设置。直接寻址 | LDY #const | A0 | 2* | 2 | 1 |
绝对寻址 | LDY addr | AC | 3 | 4 | 1 |
直接页面寻址 | LDY dp | A4 | 2 | 3 | 1,2 |
绝对变址X寻址 | LDY addr,X | BC | 3 | 4 | 1,3 |
直接页面变址X寻址 | LDY dp,X | B4 | 2 | 4 | 1,2 |
* | 如果m=0(16位内存/累加器),则增加1个字节 |
1 | 如果m=0(16位内存/累加器),则增加1个周期 |
2 | 如果直接页面寄存器的低端字节不是0,则增加1个周期 |
3 | 如果增加变址越过页面边界,则增加1个周期 |
又是从标准的6502指令集中完全照搬来的指令。在16位模式(m=0)下,被改变的数据将是16位宽的。
会被改变的标志 n-----zc
n:被清除。 z:结果为零时设置。 c:位0成为新的进位。累加器寻址 |
LSR a |
4A | 1 | 2 | |
绝对寻址 | LSR addr | 4E | 3 | 6 | 1 |
直接页面寻址 | LSR dp | 46 | 2 | 5 | 1,2 |
绝对变址X寻址 | LSR addr,X | 5E | 3 | 7 | 1 |
直接页面变址X寻址 | LSR dp,X | 56 | 2 | 6 | 1,2 |
1 | 如果m=0(16位内存/累加器),则增加两个周期 |
2 | 如果直接页面寄存器的低端字节不为零,则增加一个周期 |
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。