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

SEP:设置状态位

SEP是一个新的65816指令。当被执行时,它会设置被单字节直接值指定的位。

这是设置X和M状态寄存器位的唯一方法。

举例来说,要设定状态寄存器位5:

SEP #%00100000 ;设置位5
或要清除多个位: SEP #%10110000; 设置位7,位5和位4
任何组合都是可以的。

要复位一个位,参考REP。

会受影响的标志:nvmxdizc

所有操作数中被设置的位对应的标志都会被设置,其他的标志则不受影响。 寻址模式 语法 操作码 指令长度 周期
直接寻址 SEP #const E2 2 3

STA:储存累加器的数据 寻址模式 语法 操作码 指令长度 周期 备注
绝对寻址 STA addr
8D
3
4
1
绝对长程寻址 STA long
8F
4
5
1
直接页面寻址 STA dp
85
2
3
1,2
直接页面间接寻址 STA (dp)
92
2
5
1,2
直接页面间接长程寻址 STA [dp]
87
2
6
1,2
绝对变址X寻址 STA addr,X
9D
3
4
1
绝对变址X长程寻址 STA long,X
9F
4
5
1
绝对变址Y寻址 STA addr,Y
99

3

4
1
直接页面变址X寻址 STA dp,X
95
2
4
1,2
直接页面变址X,间接寻址 STA (dp,X)
81
2
6
1,2
直接页面间接,变址Y寻址 STA (dp),Y
91
2
5
1,2
直接页面间接长程,变址Y寻址 STA [dp],Y
97
2
6
1,2
堆栈相对寻址 STA sr,S
83
2
4
1
堆栈相对间接,变址Y寻址 STA (sr,S),Y
93
2
7
1
* 如果m=0(16位内存/累加器),则增加一个字节
1 如果m=0(16位内存/累加器),则增加一个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个周期

STP 停止处理器

STP关闭处理器,直到硬件复位。它被用于一些通过让处理器休眠来减少能耗的系统。65816处理器上有一个复位B引脚,允许使用这个指令。

寻址模式 语法 操作码 指令长度 周期
隐式寻址 STP DB 1 3

STX:储存X寄存器的值到内存

又一个和在6502模式下一样工作的指令。唯一例外是当设置为16位变址寄存器(x=0)时,被储存的数据将是16位宽的。X的低8位会被储存到有效地址,而高端字节储存到有效地址的下一个存储单位。

STX不会影响任何标志。

寻址模式 语法 操作码 指令长度 周期 备注
绝对寻址 STX addr 8E 3 4 1
直接页面寻址 STX dp 86 2 3 1,2
直接页面变址Y寻址 STX dp,Y 96 2 4 1,2
1 如果x=0(16位变址寄存器),则增加一个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个以上的周期

STY:储存Y寄存器的值到内存

又一个和在6502模式下一样工作的指令。唯一例外是当设置为16位变址寄存器(x=0)时,被储存的数据将是16位宽的。X的低8位会被储存到有效地址,而高端字节储存到有效地址的下一个存储单位。

STY不会影响任何标志。

寻址模式 语法 操作码 指令长度 周期 备注
绝对寻址 STY addr 8C 3 4 1
直接页面寻址 STY dp 84 2 3 1,2
直接页面变址X寻址 STY dp,X 94 2 4 1,2
1 如果x=0(16位变址寄存器),则增加一个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个以上的周期

STZ:向内存储存零字节

65816的一个新的指令。STZ储存一个零字节到目的地址。在8位累加器/ 内存模式(m=1)下,只有一个字节被储存到有效地址;在16位内存/累加器模式(m=0)下,零会被储存到有效地址和有效地址的下一个存储单元。

该指令不会影响任何标志。

这个指令可以看作旧6502中下列代码的一个替代:

lda #0 sta $xxxx
STZ指令的优势是执行后累加器和状态寄存器都不会变化。 寻址模式 语法 操作码 指令长度 周期 备注
绝对寻址 STZ addr 9C 3 4 1
直接页面寻址 STZ dp 64 2 3 1,2
绝对变址X寻址 STZ addr,X 9E 3 5 1
直接页面变址X寻址 STZ dp,X 74 2 4 1,2
1 如果x=0(16位变址寄存器),则增加一个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个以上的周期

寄存器传送指令:

TAX,TXA,TAY,TYA,TSX,TXS传送指令在处理器寄存器之间传送数据。

TAX:传送累加器的值到X变址寄存器。 TAY:传送累加器的值到Y变址寄存器。 TYA:传送Y变址寄存器的值到累加器。 TXA:传送X变址寄存器的值到累加器。 TSX:传送堆栈指针到X变址寄存器。 TXS:传送X变址寄存器的值到堆栈指针。

两个新的寄存器传送指令是:

TXY:直接传送X寄存器的值到Y寄存器。 TYX:直接传送Y寄存器的值到X寄存器。

因为变址寄存器和累加器能独立地被设置成8位或16位,移动的宽度由目标寄存器来决定。下列各项展示了所有可能的组合:

8位累加器到8位变址寄存器。(m=1,x=1),8个位被转移。 8位累加器到到16位变址寄存器。(m=1,x=0),16个位被转移。隐藏的累加器高端字节变成X或Y的高端字节。 16位变址寄存器到8位累加器。(m=1,x=0),8个位被转移。隐藏的累加器高端字节不受影响,并保持原来的值。 8位变址寄存器到16位累加器。(m=0,x=1),2个字节被转移,高端字节为零。 16位累加器到8位变址寄存器。(m=0,x=1),只有累加器的低端字节被传送到变址寄存器。 16位累加器到16位变址寄存器。(m=0,x=0),16个位被转移。 16位堆栈指针到8位X寄存器。只有地址的低端字节被转移。 8位X寄存器到16位堆栈指针,堆栈指针的高端字节设为零。

该指令会影响的标志 n-----z-

n:要传送的值的最高有效位被设置时设置。 z:如果要传送值是零则设置。 寻址模式 语法 操作码 指令长度 周期
隐式寻址 TAX AA 1 2
隐式寻址 TAY A8 1 2
隐式寻址 TXA 8A 1 2
隐式寻址 TYA 98 1 2
隐式寻址 TSX BA 1 2
隐式寻址 TXS 9A 1 2
隐式寻址 TXY 9B 1 2
隐式寻址 TYX BB 1 2

直接页面指令:

有两个新的65816个指令用于在累加器和直接页面寄存器之间交换数据:

TCD:将累加器的值传送到直接页面寄存器。 TDC:将直接页面寄存器的值传送到累加器。

TCD将来自累加器的一个16位的值传送到直接(零页面)指针。无论累加器是在16位还是8位的设定下,都会传送全部的16个位。

在TCD中的C用于指明累加器是作为C来引用的(当它是16位宽时,低端字节是A而高端字节是B)。

TDC将来自直接页面寄存器的值传送到累加器的全部16个位,而不管累加器的位m的状态。

一些汇编程序也允许使用TAD或TDA。

该指令会影响的标志 n-----z-

n:要传送的值的最高有效位被设置时设置。 z:如果要传送值是零则设置。 寻址模式 语法 操作码 指令长度 周期
隐式寻址

TCD

别名:TAD

5B 1 2
隐式寻址

TDC

别名:TDA

7B 1 2

TCS:传送累加器到堆积指针

TCS传送完整的16位到堆栈指针,而不管状态位m的状态如何。

和在TCD和TDC中一样,TCS中的C表示累加器是完全16位的。

TAS作为另一种助记符,也被一些汇编程序使用来传送堆积指针。

在6502模拟模式下,只有八个位的累加器值被传送,因为在6502下堆栈总是位于页面1。

TCS和TXS是仅有的两个能改变堆栈指针寄存器的指令。

TCS不会影响任何标志。

寻址模式 语法 操作码 指令长度 周期
隐式寻址

TCS

别名:TAS

1B 1 2

TSC:传送堆栈指针到累加器

TSC传送完整的16位堆栈指针到16位的累加器,不管状态位m的值如何。

和TDC和TCD一样,TSC中的C表示累加器完全是16位的。

TSA作为另一种助记符,也被一些汇编程序使用来传送值到堆积指针。

在6502模拟模式下,1会被传送到隐藏的B(高8位)累加器,因为在6502下堆栈总是位于页面1。

该指令会影响的标志 n-----z-

n:要传送的值的最高有效位被设置时设置。 z:如果要传送值是零则设置。 寻址模式 语法 操作码 指令长度 周期
隐式寻址

TSC

别名:TSA

3B 1 2

TRB:测试并复位内存位

TRB执行一个累加器和有效的地址的逻辑与操作--然后数据会被写回到指定的地址上。

该指令会清除内存中和累加器内相对应的位(累加器中为1的位被清除),其他的位则无变化。

从另外一个角度来说--TRB翻转累加器的位值然后和内存操作数进行逻辑与操作,再将结果保存回有效地址。

在16位累加器模式(m=0)下,数据按16位进行操作。操作数的低端字节位于有效地址,高端字节位于有效地址的下一个存储单元。

该指令会影响的标志 ------z-

z:如果要和累加器与的值是零则设置。 寻址模式 语法 操作码 指令长度 周期 备注
绝对寻址 TRB addr 1C 3 6 1
直接页面寻址 TRB dp 14 2 5 1,2
1 如果m=0(16位内存/累加器),则增加两个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个周期

TSB:测试并且设置内存位

TSB将累加器和位于有效地址的数据进行逻辑与操作。

该指令能高效地设置内存中和累加器内设置位对应的位。

在16位累加器模式(m=0)下,数据按16位进行操作。操作数的低端字节位于有效地址,高端字节位于有效地址的下一个存储单元。

在累加器和内存数据值进行逻辑与操作之后,状态寄存器的零标志被设置。(和BIT指令相同)

该指令会影响的标志 ------z-

z:如果要和累加器与的值是零则设置。 寻址模式 语法 操作码 指令长度 周期 备注
绝对寻址 TSB addr 0C 3 6 1
直接页面寻址 TSB dp 04 2 5 1,2
1 如果m=0(16位内存/累加器),则增加两个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个周期

WAI:等待中断

WAI将操作挂起,直到外部硬件中断发生。处理器的能耗被降低。如果中断禁用标志(i=1)被设置并且IRQ在执行WAI之前是未决定的,那么等待会结束并继续执行下一条指令。

WAI不会影响任何标志。

寻址模式 语法 操作码 指令长度 周期
隐式寻址

WAI

CB 1 3

WDM:为将来扩充而保留的指令

WDM是被设计成运行于未来版本处理器上的多字节指令的第一个字节。

现在的WDM则像NOP那样,被当成空操作。

这个指令不应该在现在版本的处理器上使用。

WDM:William D. Mensch, JR(65816的设计者)

寻址模式 语法 操作码 指令长度 周期

WDM

42 2

XBA:交换B和A累加器

XBA交换累加器的低8位(A)和高8位(B)。该操作不理会状态位M的值。

这个指令在6502模拟模式下也能工作。

XBA能用来在高端累加器上保存低端累加器的一个临时副本。它用来反转16位模式下值的高位和低位也很不错。

在模拟模式下,XBA是能唯一能存取累加器高端8位的指令。

一些汇编程序也用SWA(swap)。

该指令会影响的标志 n-----z-

n:新的低8位的最高有效位(原来的位15)被设置时设置。 z:如果新的累加器低8位值为零则设置。 寻址模式 语法 操作码 指令长度 周期
隐式寻址

XBA

别名:SWA

EB 1 3

XCE:交换进位和模拟位

XCE交换E模拟位和C进位标志的值。这是存取E模拟位的唯一方法。

要设定模拟模式:

sec ;设置进位 xce ;交换进位和模拟位
要设定原本模式: clc ;清除进位 xce ;交换进位和模拟位

该指令会影响的标志     e 
         --mx/b---c 

e:取自原先的进位。 c:取自原先的模拟位。 m:只在本地模式下用的标志,要切换到原本模式时设为1 。 x:只在本地模式下用的标志。 b:只在6502模拟模式下用的标志。如果设置为1,则会变成原本模式下的x标志。 寻址模式 语法 操作码 指令长度 周期
隐式寻址

XCE

FB 1 2

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

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