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是
//数据传送指令
//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是