"); //-->
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 - 模拟 |
当使用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 | 如果增加变址越过页面边界,则增加一个周期 |
一般是将位于操作数给出的有效地址的数据和累加器进行“与”操作。如果在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 | 如果增加变址越过页面边界,则增加一个周期 |
所有的位左移,最高有效位移入进位标志。如果在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 |
65816为旧的标志BIT指令提供了3种新的寻址方式。唯一不同的是当处理器处于16位模式下,送到状态寄存器的最高两位是位14和为15;而在8位模式下,位6和位7会被送到状态寄存器。
该指令会影响的标志 nv----z- ( 除直接寻址之外)
------z- ( 在直接模式下)
直接寻址 | 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个周期 |
在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 设置中断标志。隐式寻址 | - - - - - - - 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 |
大致上,这个指令在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 | 如果增加变址越过页面边界,则增加一个周期 |
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。