新闻  |   论坛  |   博客  |   在线研讨会
65816指令集2
zhchxgh | 2009-07-10 16:44:49    阅读:1754   发布文章

COP 可使用协同处理器

COP通过一个独立的COP硬件向量引起一个软件中断。该硬件向量位于$FFF$-$FFF5。在6502模拟模式下: 程序指针增加2并压入堆栈。 状态寄存器压入堆栈。 中断状态位被设置。 程序指针从硬件向量载入。 十进制标志被清除。

在原本模式中:

  • 程序指针存储寄存器压入堆栈。
  • 程序指针增加2并压入堆栈。
  • 状态寄存器压栈。
  • 中断状态标志被设置。
  • 程序存储寄存器被清零。
  • 程序指针从硬件向量载入。
  • 在COP运行后,十进制标志被清除。

    会被改变的标志 ----di--

d:十进制模式标志被复位成零。 i:中断禁用标志被设置。 寻址方式 语法 操作码 指令长度 周期 备注
堆栈/中断寻址 COP 02 2* 7 1
* COP是一个字节,但是压入堆栈的程序指针要加2,因为有可选的签名字节
1 如果在65816/65802的原本模式(e=0)下,则增加一个周期

CPX:把X变址寄存器与内存数据作比较

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:把Y变址寄存器与内存数据作比较

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:内存单元递减

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 如果直接页面寄存器的低端字节不为零,则增加一个周期

DEX,DEY:变址寄存器递减

两个指令都像在6502下一样地工作,在16位变址寄存器模式下,变址寄存器将会被当做16位宽。

会被改变的标志:n-----z-

n:结果的最高有效位被设置时设置。 z:结果为零时设置。 寻址方式 语法 操作码 指令长度 周期
隐式寻址 DEX CA 1 2
隐式寻址 DEY 88 1 2

EOR:异或累加器

又是一个和在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 如果增加变址越过页面边界,则增加一个周期

INC:数据递增

仍像在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 如果直接页面寄存器的低端字节不为零,则增加一个周期

INX,INY:变址寄存器递增

两个指令都像在6502下那样工作。在16位变址寄存器模式下,寄存器将会被当做16位宽处理。

会被改变的标志 n-----z-

n:结果的最高有效位被设置时设置。 z:结果为零时设置。 寻址方式 语法 操作码 指令长度 周期
隐式寻址 INX E8 1 2
隐式寻址 INY C8 1 2

JMP:跳转到新位置

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,JSL:跳转到子程序

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:将数据读入累加器

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:将数据读入X寄存器

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:将数据读入Y寄存器

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个周期

LSR:逻辑右移

又是从标准的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 如果直接页面寄存器的低端字节不为零,则增加一个周期

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客