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

65816指令集 语法约定
addr 2字节地址
addr/const 2字节值:是一个地址或一个常数
const 1-2字节的常数
destbk 字符串将被移动到的64K存储段
dp 1字节直接页面(对6502是零页面)偏移量
label 代码标签和指令放在相同的64K存储段内
long 3字节的地址(包括存储段字节)
nearlabel 非常靠近指令的代码标签,可以用一个字节的有符号偏移量到达
sr 1字节的堆栈相对偏移量
srcebk 字符串将被移出的源64K存储段

标志  
7 6 5 4 3 2 1 0
 
n v m x d i z c
 
e
n - 负的
v - 溢出
m - 8/16位内存/累加器
x - 8/16位变址寄存器
d - 十进位模式
i - IRQ禁用/启用
z - 零结果
c - 进位
e - 模拟
ADC:加累加器(带进位)

当使用16位累加器模式的时候,和预想的一样,操作产生的进位会正确地从从位7进入位8。(比如:$FF+4=$0103,1在累加器的高端字节,3在累加器的低端字节。)这样,只有在低端字节被加时才有清除进位的必要。和在8位累加器模式下一样,手动检测位15上的进位仍是必要的。

在16位模式下,低端字节位于有效地址上,而高端字节则位于有效地址的下一个单元上。

该指令会影响的标志:nv----zc

n:在结果的最高有效位被设置时设置。 v:如果出现有符号的溢出则设置。 z:如果结果是零则设置。 c:如果值满了则设置。
寻址方式 语法 操作码 指令长度 周期 备注
直接寻址 ADC #const
69
2*
2
1
绝对寻址 ADC addr
6D
3
4
1
绝对长程寻址 ADC long
6F
4
5
1
直接页面寻址 ADC dp
65
2
3
1,2
直接页面间接寻址 ADC (dp)
72
2
5
1,2
直接页面间接长程寻址 ADC [dp]
67
2
6
1,2
绝对变址X寻址 ADC addr,X
7D
3
4
1,3
绝对变址X长程寻址 ADC long,X
7F
4
5
1
绝对变址Y寻址 ADC addr,Y
79

3

4
1,3
直接页面变址X寻址 ADC dp,X
75
2
4
1,2
直接页面变址X,间接寻址 ADC (dp,X)
61
2
6
1,2
直接页面间接,变址Y寻址 ADC (dp),Y
71
2
5
1,2,3
直接页面间接长程,变址Y寻址 ADC [dp],Y
77
2
6
1,2
堆栈相对寻址 ADC sr,S
63
2
4
1
堆栈相对间接,变址Y寻址 ADC (sr,S),Y
73
2
7
1
* 如果m=0(16位内存/累加器),则增加一个字节
1 如果m=0(16位内存/累加器),则增加一个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个周期
3 如果增加变址越过页面边界,则增加一个周期
AND:与累加器

一般是将位于操作数给出的有效地址的数据和累加器进行“与”操作。如果在16位累加器模式(m=0)下,从内存取出的数据是16位宽的,低端字节位于有效地址而高端字节位于有效地址的下一个单元。

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

n:在结果的最高有效位被设置时设置。 z:如果结果是零则设置。
寻址方式 语法 操作码 指令长度 周期 备注
直接寻址 AND #const
29
2*
2
1
绝对寻址 AND addr
2D
3
4
1
绝对长程寻址 AND long
2F
4
5
1
直接页面寻址 AND dp
25
2
3
1,2
直接页面间接寻址 AND (dp)
32
2
5
1,2
直接页面间接长程寻址 AND [dp]
27
2
6
1,2
绝对变址X寻址 AND addr,X
3D
3
4
1,3
绝对变址X长程寻址 AND long,X
3F
4
5
1
绝对变址Y寻址 AND addr,Y
39

3

4
1,3
直接页面变址X寻址 AND dp,X
35
2
4
1,2
直接页面变址X,间接寻址 AND (dp,X)
21
2
6
1,2
直接页面间接,变址Y寻址 AND (dp),Y
31
2
5
1,2,3
直接页面间接长程,变址Y寻址 AND [dp],Y
37
2
6
1,2
堆栈相对寻址 AND sr,S
23
2
4
1
堆栈相对间接,变址Y寻址 AND (sr,S),Y
33
2
7
1

* 如果m=0(16位内存/累加器),则增加一个字节
1 如果m=0(16位内存/累加器),则增加一个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个周期
3 如果增加变址越过页面边界,则增加一个周期
ASL:算术左移

所有的位左移,最高有效位移入进位标志。如果在16位累加器模式(m=0)下,被移动的数据是16位的。

该指令会影响的标志:n-----zc

n:在结果的最高有效位被设置时设置。 z:如果结果是零则设置。 c:如果高位(位7或位15)移入进位则设置。
寻址方式 语法 操作码 指令长度 周期 备注
累加器寻址 ASL a 0A 1 2  
绝对寻址 ASL addr 0E 3 6 1
直接页面寻址 ASL dp 06 2 5 1,2
绝对变址X寻址 ASL addr,X 1E 3 7 1
直接页面变址X寻址 ASL dp,X 16 2 6 1,2
1 如果m=0(16位内存/累加器),则增加两个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个周期
转移指令:

下面的转移指令和在6502下表现相同,因此不会作深入的讨论。转移指令不会影响任何的状态寄存器标志。单字节操作数的范围是+128到-127。

BCC 进位清除则转移(别名BLT:小于时转移) BCS 进位设置则转移(别名BGE:大于或等于时转移) BEQ 如果相等则转移 BNE 如果不相等则转移 BMI 如果结果为负数则转移 BPL 如果结果为正数则转移 BVC 如果溢出标志被清除则转移 BVS 如果溢出标志被设置则转移
寻址方式 语法 操作码 指令长度 周期 备注
程序指针相对寻址 BCC near 90 2 2 1,2
程序指针相对寻址 BCS near B0 2 2 1,2
程序指针相对寻址 BEQ near F0 2 2 1,2
程序指针相对寻址 BNE near D0 2 2 1,2
程序指针相对寻址 BMI near 30 2 2 1,2
程序指针相对寻址 BPL near 10 2 2 1,2
程序指针相对寻址 BVC near 50 2 2 1,2
程序指针相对寻址 BVS near 70 2 2 1,2
1 如果转移被捕获,则增加一个周期
2 如果在模拟模式(e=1)下,则增加一个以上的周期
新的转移指令:

BRA:无条件转移
  无条件转移按操作数转移而不关心状态寄存器的当前状态。单字节操作数的范围是+128到-127。该指令和后面的BRL指令使得写重定位的代码变得容易。

寻址方式 语法 操作码 指令长度 周期 备注
程序指针相对寻址 BRA near 80 2 3 1
1 如果在6502模拟模式(e=1)下,则增加一个以上的周期

BRL:无条件长程转移
  和BRA一样,但操作数是2个字节,给指令提供了64k的范围。这个指令和JMP指令类似,区别在于JMP是绝对寻址而BRL是相对寻址。
  该指令不会影响任何标志。

寻址方式 语法 操作码 指令长度 周期 备注
程序指针相对长程寻址 BRL $xxxx 82 3 4  

BIT:检测累加器的某个位

  65816为旧的标志BIT指令提供了3种新的寻址方式。唯一不同的是当处理器处于16位模式下,送到状态寄存器的最高两位是位14和为15;而在8位模式下,位6和位7会被送到状态寄存器。
  该指令会影响的标志 nv----z- ( 除直接寻址之外)
            ------z- ( 在直接模式下)

n 取数据的最高有效位的值。 v 取数据的位6或位14的值。 z 如果mem和acc的逻辑与为零则设置。
寻址方式 语法 操作码 指令长度 周期 备注
直接寻址 BIT #const 89 2* 2  
绝对寻址 BIT addr 2C 3 6 1
直接页面寻址 BIT dp 24 2 5 1,2
绝对变址X寻址 BIT addr,X 3C 3 7 1
直接页面变址X寻址 BIT dp,X 34 2 6 1,2
* 如果m=0(16位内存/累加器),则增加1个字节
1 如果m=0(16位内存/累加器),则增加1个周期
2 如果直接页面寄存器的低端字节不是0,则增加1个周期
3 如果增加变址越过页面边界,则增加1个周期

BRK:软暂停

  在65816的原本模式下,BRK不受中断禁用标志I的影响。另外,你可以跳过一个字节的签名字节,它指示出是哪个BRK指令使得BRK被执行。新的BRK处理器包含一个硬件向量--因此不再需要通过IRQ来检测BRK位。
  当BRK在65816的原本模式下运行时: 程序指针存储寄存器被压入堆栈。 程序指针增加2并且压入堆栈。 状态寄存器压入堆栈。 设置中断禁用标志。 清除十进制模式标志。 程序存储寄存器被清零。 程序指针从位于$FFE6-$FFE7的暂停向量读取。

  在6502模拟模式(e=1)下,BRK和它在6502里的前身(b标志设定,状态压入堆栈,SEI和IRQ执行)一样被执行。

寻址方式 语法 操作码 指令长度 周期 备注
堆栈/中断寻址 BRK 00 2* 7 1
* BRK是一个字节,但是压入堆栈的程序指针要增加2,因为有可选的签名字节
1 如果在65816的原本模式(e=0)下,则增加一个周期

状态寄存器设置和清除:

下面列出的状态设置和复位指令在65816的原本模式和6502模拟模式下的效果是一样。

CLC 清除进位标志。 CLD 清除十进制标志。 CLI 清除中断标志。 CLV 清除溢出标志。 SEC 设置进位标志。 SED 设置十进制标志。 SEI 设置中断标志。 寻址方式

标志:nvmxdizc

助记符 操作码 指令长度 周期
隐式寻址 - - - - - - - 0 CLC 18 1 2
隐式寻址 - - - - 0 - - - CLD D8 1 2
隐式寻址 - - - - - 0 - - CLI 58 1 2
隐式寻址 - 0 - - - - - - CLV B8 1 2
隐式寻址 - - - - - - - 1 SEC 38 1 2
隐式寻址 - - - - 1 - - - SED F8 1 2
隐式寻址 - - - - - 1 - - SEI 78 1 2

CMP:将累加器和内存数据作比较

大致上,这个指令在6502模拟模式下和在65816模式下工作是一样的。

在16位累加器模式下,用于比较的数据低端字节来自有效地址,高端字节来自有效地址的下一个存储单元。

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

n:在结果的最高有效位被设置时设置。 z:如果结果是零则设置。 c:如果不需要借位则设置。累加器大于等于内存数据。   如果需要借位则c=0。累加器小于内存数据。 寻址方式 语法 操作码 指令长度 周期 备注
直接寻址 CMP #const
C9
2*
2
1
绝对寻址 CMP addr
CD
3
4
1
绝对长程寻址 CMP long
CF
4
5
1
直接页面寻址 CMP dp
C5
2
3
1,2
直接页面间接寻址 CMP (dp)
D2
2
5
1,2
直接页面间接长程寻址 CMP [dp]
C7
2
6
1,2
绝对变址X寻址 CMP addr,X
DD
3
4
1,3
绝对变址X长程寻址 CMP long,X
DF
4
7
1
绝对变址Y寻址 CMP addr,Y
D9

3

4
1,3
直接页面变址X寻址 CMP dp,X
D5
2
4
1,2
直接页面变址X,间接寻址 CMP (dp,X)
C1
2
6
1,2
直接页面间接,变址Y寻址 CMP (dp),Y
C1
2
5
1,2,3
直接页面间接长程,变址Y寻址 CMP [dp],Y
D7
2
6
1,2
堆栈相对寻址 CMP sr,S
C3
2
4
1
堆栈相对间接,变址Y寻址 CMP (sr,S),Y
D3
2
7
1
* 如果m=0(16位内存/累加器),则增加一个字节
1 如果m=0(16位内存/累加器),则增加一个周期
2 如果直接页面寄存器的低端字节不为零,则增加一个周期
3 如果增加变址越过页面边界,则增加一个周期

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

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