NES 指令

//addr  :代表8位地址    addr16:代表16位地址     data  :立即数


//数据传送指令


//LDA--由存储器取数送入累加器 M→A


符号码格式 指令操作码 寻址方式 
LDA ($addr,X) A1 先变址X后间址 
LDA $addr A5 零页寻址 
LDA #$data A9 立即寻址 
LDA $addr16 AD 绝对寻址 
LDA ($addr),Y B1 后变址Y间址 
LDA $addr,X B5 零页X变址 
LDA $addr16,Y B9 绝对Y变址 
LDA $addr16,X BD 绝对X变址 


//LDX--由存储器取数送入累加器 M→X


符号码格式 指令操作码 寻址方式 
LDX #$data A2 立即寻址 
LDX $addr A6 零页寻址 
LDX $addr16 AE 绝对寻址 
LDX $addr,Y B6 零页Y变址 
LDX $addr16,Y BE 绝对Y变址 


//LDY--由存储器取数送入累加器 M→Y


符号码格式 指令操作码 寻址方式 
LDY #$data A0 立即寻址 
LDY $addr A4 零页寻址 
LDY $addr16 AC 绝对寻址 
LDY $addr,X B4 零页X变址 
LDY $addr16,X BC 绝对X变址 


//STA--将累加器的内容送入存储器 A--M


符号码格式 指令操作码 寻址方式 
STA ($addr,X) 81 先变址X后间址 
STA $addr 85 零页寻址 
STA $addr16 8D 绝对寻址 
STA ($addr),Y 91 后变址Y间址 
STA $addr,X 95 零页X变址 
STA $addr16,Y 99 绝对Y变址 
STA $addr16,X 9D 绝对X变址 


//STX--将寄存器X的内容送入存储器 X--M


符号码格式 指令操作码 寻址方式 
STX $addr 86 零页寻址 
STX $addr16 8E 绝对寻址 
STX $addr,Y 96 零页Y变址 


//STY--将寄存器Y的内容送入存储器 Y--M


符号码格式 指令操作码 寻址方式 
STY $addr 84 零页寻址 
STY $addr16 8C 绝对寻址 
STY $addr,X 94 零页X变址 


//寄存器和寄存器之间的传送


符号码格式 指令操作码 寻址方式 指令作用 
TAX AA 寄存器寻址 将累加器A的内容送入变址寄存器X 
TXA 8A 寄存器寻址 将变址寄存器X的内容送入累加器A 
TAY A8 寄存器寻址 将累加器A的内容送入变址寄存器Y 
TYA 98 寄存器寻址 将变址寄存器Y的内容送入累加器A 
TSX BA 寄存器寻址 将堆栈指针S的内容送入变址寄存器X 
TXS 9A 寄存器寻址 将变址寄存器X的内容送入堆栈指针S 


[算术运算指令]


1. ADC--累加器,存储器,进位标志C相加,结果送累加器A  A+M+C→A 


符号码格式 指令操作码 寻址方式            周期 
ADC ($addr,X) 61 先变址X后间址          
ADC $addr 65 零页寻址 
ADC #$data 69 立即寻址 
ADC $addr16 6D 绝对寻址 
ADC ($addr),Y 71 后变址Y间址 
ADC $addr,X 75 零页X变址 
ADC $addr16,Y 79 绝对Y变址 
ADC $addr16,X 7D 绝对X变址 




2. SBC--从累加器减去存储器和进位标志C,结果送累加器  A-M-C→A


符号码格式 指令操作码 寻址方式 
SBC ($addr,X) E1 先变址X后间址 
SBC $addr E5 零页寻址 
SBC #$data E9 立即寻址 
SBC $addr16 ED 绝对寻址 
SBC ($addr),Y F1 后变址Y间址 
SBC $addr,X F5 零页X变址 
SBC $addr16,Y F9 绝对Y变址 
SBC $addr16,X FD 绝对X变址 




 


3. INC--存储器单元内容增1  M+1→M


符号码格式 指令操作码 寻址方式 
INC $addr E6 零页寻址 
INC $addr16 EE 绝对寻址 
INC $addr,X F6 零页X变址 
INC $addr16,X FE 绝对X变址 


4. DEC--存储器单元内容减1  M-1→M


符号码格式 指令操作码 寻址方式 
DEC $addr C6 零页寻址 
DEC $addr16 CE 绝对寻址 
DEC $addr,X D6 零页X变址 
DEC $addr16,X DE 绝对X变址 


5. 寄存器X,Y加1减1


符号码格式 指令操作码 寻址方式 
INX E8 隐含寻址 
DEX CA 隐含寻址 
INY C8 隐含寻址 
DEY 88 隐含寻址 


[逻辑运算指令]


1.AND--寄存器与累加器相与,结果送累加器  A∧M→A


符号码格式 指令操作码 寻址方式 
AND ($addr,X) 21 先变址X后间址 
AND $addr 25 零页寻址 
AND #$data 29 立即寻址 
AND $addr16 2D 绝对寻址 
AND ($addr),Y 31 后变址Y间址 
AND $addr,X 35 零页X变址 
AND $addr16,Y 39 绝对Y变址 
AND $addr16,X 3D 绝对X变址 
     


2.ORA--寄存器与累加器相或,结果送累加器  A∨M→A


符号码格式 指令操作码 寻址方式 
ORA ($addr,X) 01 先变址X后间址 
ORA $addr 05 零页寻址 
ORA #$data 09 立即寻址 
ORA $addr16 0D 绝对寻址 
ORA ($addr),Y 11 后变址Y间址 
ORA $addr,X 15 零页X变址 
ORA $addr16,Y 19 绝对Y变址 
ORA $addr16,X 1D 绝对X变址 


3.EOR--寄存器与累加器相异或,结果送累加器  A≮M→A


符号码格式 指令操作码 寻址方式 
EOR ($addr,X) 41 先变址X后间址 
EOR $addr 45 零页寻址 
EOR #$data 49 立即寻址 
EOR $addr16 4D 绝对寻址 
EOR ($addr),Y 51 后变址Y间址 
EOR $addr,X 55 零页X变址 
EOR $addr16,Y 59 绝对Y变址 
EOR $addr16,X 5D 绝对X变址 


[置标志位指令]


1. CLC--清除进位标志         0→C   机器码 18     √


2. SEC--置进位标志C          1→C   机器码 38     √


3. CLD--清除十进制运算标志D  0→D   机器码 D8     ×


4. SED--置十进制运算标志D    1→D   机器码 F8     ×


5. CLV--清除溢出标志V        0→V   机器码 B8


6. CLI--清除中断禁止指令I    0→I   机器码 58     √


7. SEI--置位中断禁止标志I    1→I   机器码 78     √


 
//比较指令


1. CMP--累加器和存储器比较


符号码格式 指令操作码 寻址方式 
CMP ($addr,X) C1 先变址X后间址 
CMP $addr C5 零页寻址 
CMP #$data C9 立即寻址 
CMP $addr16 CD 绝对寻址 
CMP ($addr),Y D1 后变址Y间址 
CMP $addr,X D5 零页X变址 
CMP $addr16,Y D9 绝对Y变址 
CMP $addr16,X DD 绝对X变址 


 


2. CPX--寄存器X的内容和存储器比较


符号码格式 指令操作码 寻址方式 
CPX #$data E0 立即寻址 
CPX $addr E4 零页寻址 
CPX $addr16 EC 绝对寻址 


这些指令和CMP指令相似,不过前者是寄存器A,后者是寄存器X,另外寻址方式也比较少.


3. CPY--寄存器Y的内容和存储器比较


符号码格式 指令操作码 寻址方式 
CPY #$data C0 立即寻址 
CPY $addr C4 零页寻址 
CPY $addr16 CC 绝对寻址 


这些指令和CPX指令相似,不过前者是寄存器X,后者是寄存器Y.


 
4. BIT--位测试指令


符号码格式 指令操作码 寻址方式 
BIT $addr 24 零页寻址 
BIT $addr16 2C 绝对寻址 


//移位指令


1. 算术左移指令ASL


符号码格式 指令操作码 寻址方式 
ASL 0A 累加器寻址 
ASL $data 06 零页寻址 
ASL $addr16 0E 绝对寻址 
ASL $addr,X 16 零页X变址 
ASL $addr16,X 1E 绝对X变址 


ASL移位功能是将字节内各位依次向左移1位,最高位移进标志位C中,最底位补0
2. 逻辑右移指令LSR


符号码格式 指令操作码 寻址方式 
LSR 4A 累加器寻址 
LSR $data 46 零页寻址 
LSR $addr16 4E 绝对寻址 
LSR $addr,X 56 零页X变址 
LSR $addr16,X 5E 绝对X变址 


该指令功能是将字节内各位依次向右移1位,最低位移进标志位C,最高位补0.
3. 循环左移指令ROL


符号码格式 指令操作码 寻址方式 
ROL 2A 累加器寻址 
ROL $data 26 零页寻址 
ROL $addr16 2E 绝对寻址 
ROL $addr,X 36 零页X变址 
ROL $addr16,X 3E 绝对X变址 


ROL的移位功能是将字节内容连同进位C一起依次向左移1位
4. 循环右移指令ROR


符号码格式 指令操作码 寻址方式 
ROR 6A 累加器寻址 
ROR $data 66 零页寻址 
ROR $addr16 6E 绝对寻址 
ROR $addr,X 76 零页X变址 
ROR $addr16,X 7E 绝对X变址 


ROR的移位功能是将字节内容连同进位C一起依次向右移1位


//addr  :代表8位地址    addr16:代表16位地址     data  :立即数


//堆栈操作指令


1. 累加器进栈指令 PHA


   PHA是隐含寻址方式的单字节指令,操作码是 48


   功能是把累加器A的内容按堆栈指针S所指示的位置送入堆栈,然后堆栈指针减1


   该指令不影响标志寄存器P的状态


2. 累加器出栈指令 PLA


   PLA是隐含寻址方式的单字节指令,操作码是 68


   功能是先让堆栈指针S+1,然后取加过1的S所指向的单元的内容,把它送累加器A


   该指令影响标志寄存器P中的N,Z两标志位


3. 标志寄存器P进栈指令 PHP


   PHP是隐含寻址方式的单字节指令,操作码是 08


   功能是把标志寄存器P的内容按堆栈指针S所指示的位置送入堆栈,然后堆栈指针减1


   该指令不影响标志寄存器P的状态


4. 标志寄存器P出栈指令 PLP


   PLP是隐含寻址方式的单字节指令,操作码是 28


   功能是先让堆栈指针S+1,然后取加过1的S所指向的单元的内容,把它送标志寄存器P


 


1. JMP--无条件转移指令


符号码格式 指令操作码 寻址方式 
JMP  $data16 4C 绝对寻址 
JMP ($data16) 5C 间接寻址 


2. 条件转移指令


符号码格式 指令操作码 寻址方式 指令功能 
BEQ $data16 F0 相对寻址 如果标志位Z=1则转移,否则继续 
BNE $data16 D0 相对寻址 如果标志位Z=0则转移,否则继续 
BCS $data16 B0 相对寻址 如果标志位C=1则转移,否则继续 
BCC $data16 90 相对寻址 如果标志位C=0则转移,否则继续 
BMI $data16 30 相对寻址 如果标志位N=1则转移,否则继续 
BPL $data16 10 相对寻址 如果标志位N=0则转移,否则继续 
BVS $data16 70 相对寻址 如果标志位V=1则转移,否则继续 


3. 转移到子程序指令JSR和从主程序返回指令RTS


JSR指令仅仅是 绝对寻址,它的操作码是 20


RTS指令是     隐含寻址,它的操作码是 60 




//中断指令


  在文曲星内部大量使用了这种指令,该指令占三个字节.


  操作符为 INT,机器码为 00


  例如 INT $8A01


       INT $C001


  那么INT $8A01是

原文地址:https://www.cnblogs.com/xiayong123/p/3717568.html