跳转到内容

65c02 汇编

来自维基教科书,开放的书籍,开放的世界

本书是 65c02 汇编语言的指南。本书将讲解 8 位 WDC 65c02 处理器的不同内存寻址模式和指令。

这是对 6502 汇编 书籍的编辑,增加了 65c02 上的新指令/模式。

语法在不同的汇编器之间会有所不同 - 本书将在整本书中使用以下语法

数值表示
语法 进制 示例
%00001111 二进制 LDA #%0001
$FA 十六进制 LDA #$0E
123 十进制 LDA #100

65C02 CPU 有一个 8 位 数据 总线,以及一个 16 位地址总线。所有 寄存器 都是 8 位的,除了 16 位的 程序计数器 (PC) 寄存器。因此 CPU 被认为是 8 位的。

地址总线是 16 位意味着 CPU 可以访问 2^16 个独立的字节内存,从地址 $0000 到地址 $FFFF,也就是 65536 字节 (64KB).

与外围设备(例如视频、音频、磁盘和游戏系统的控制器)的通信通常通过 内存映射 I/O 进行。

内存被划分为“页”,每页 256 个字节(在 8 位偏移量的范围内)。第 n 页是内存中的第 n 页,起始地址为 256*n,结束地址为 (256*(n+1))-1。例如,“零页”从地址 0 开始,到地址 255 结束。有关详细信息,请参阅下面的 内存布局

不到一半的 65c02 CPU 操作码 处理存储在零页中的内存。存储在零页中的内存通常需要更短的时间来处理。

寄存器

[编辑 | 编辑源代码]

寄存器
寄存器 大小(位) 用途
累加器 (A) 8 用于对数据执行计算。
指令可以直接对累加器进行操作,而不是浪费 CPU 周期去访问内存
X 寄存器 (X) 8 在某些 寻址模式 中用作索引
Y 寄存器 (Y) 8 在某些 寻址模式 中用作索引
程序计数器 (PC) 16 指向要执行的下一条指令的地址
堆栈指针 (SP) 8 存储堆栈索引,下一个堆栈元素将插入到该索引中。
该位置的地址为 $0100 + SP。SP 最初设置为 $FD
状态 (SR) 8 每一位代表一个状态标志。标志指示 CPU 的状态,或关于先前指令结果的信息。
有关每个标志的描述,请参阅下表

状态标志
符号 名称 描述
7 N

比较:如果寄存器的值小于输入值,则设置
否则:如果结果为负数,则设置,即结果的第 7 位被设置

6 V 溢出

算术运算:如果在加法或减法期间发生有符号溢出,则设置,即结果的符号与输入和累加器的符号不同
BIT:设置为输入的第 6 位

5 - (未用) 始终设置为
4 B[1] 中断 如果 BRK 指令触发中断请求,则设置
3 D 十进制 十进制模式[2]:数学指令将把输入和输出视为十进制数。
例如 $09 + $01 = $10
2 I 中断禁用 设置后,将禁用中断
1 Z

比较:如果寄存器的值等于输入值,则设置
BIT:如果累加器与输入进行逻辑与运算的结果为 0,则设置
否则:如果结果为零,则设置

0 C 进位 进位/借位标志用于数学和循环操作

算术运算:如果在加法或减法期间发生无符号溢出,则设置,即结果小于初始值(或等于初始值,如果进位标志在进入时被设置)
比较:如果寄存器的值大于或等于输入值,则设置
移位:设置为输入中消除位的数值,即左移时为第 7 位,右移时为第 0 位

内存布局

[编辑 | 编辑源代码]

16 位值以 小端 方式存储在内存中,因此最低有效字节存储在最高有效字节之前。例如,如果地址 $0000 包含 $FF,地址 $0001 包含 $00,则从 $0000 读取一个两位字节值将得到 $00FF

有符号整数采用 二进制补码,可以表示从 -128 (%10000000) 到 +127 (%01111111) 的值。如果整数为负数,则设置第 7 位。

6502 的程序计数器是 16 位宽的,因此最多可以寻址 2^16 (65536) 个字节的内存。某些内存区域为特定目的保留

内存区域
区域 目录 描述
$0000 - $00FF 零页内存的第一页,访问速度比其他页快。
指令可以使用单个字节而不是两个字节来指定零页内的地址,因此使用零页而不是其他页面的指令在执行时需要少一个 CPU 周期
$0100 - $01FF 堆栈后进先出数据结构。从 $01FF 反向增长到 $0100
由某些 传输堆栈子程序 指令使用
$0200 - $FFFF 通用可以用于任何所需用途的内存。
使用 6502 处理器的设备可以选择为其他目的保留子区域,例如 内存映射 I/O

内存寻址模式

[编辑 | 编辑源代码]

每个指令使用 13 种内存寻址模式之一,该模式决定指令的操作数。每个模式都提供了一个示例。

累加器:A

[编辑 | 编辑源代码]

累加器被隐含地作为操作数,因此不需要指定地址。

示例

使用 ASL(算术左移)指令,没有操作数,累加器始终是被左移的值。

ASL

隐含:i

[编辑 | 编辑源代码]

操作数是隐含的,因此不需要指定。

示例

这里隐含的操作数是 X(传输的源)和 A(传输的目的地)。

TXA

立即:#

[编辑 | 编辑源代码]

操作数直接用于执行计算。

示例

值 $22 被加载到累加器中。

LDA #$22

绝对:a

[编辑 | 编辑源代码]

指定一个完整的 16 位地址,该地址处的字节用于执行计算。

示例

地址 $D010 处的值被加载到 X 寄存器中。

LDX $D010

零页:zp

[编辑 | 编辑源代码]

单个字节指定内存第一页($00xx)中的地址,也称为零页,该地址处的字节用于执行计算。

示例

地址 $0002 处的值被加载到 Y 寄存器中。

LDY $02

堆栈:s

[编辑 | 编辑源代码]

与隐含(i)基本相同。不同之处在于,这些指令执行堆栈操作;从堆栈中压入或弹出操作数。

相对:r

[编辑 | 编辑源代码]

指定的偏移量被添加到程序计数器(PC)中存储的当前地址。偏移量范围为 -128 到 +127。

示例

偏移量 $2D 被添加到程序计数器(例如 $C100)中的地址。分支的目的地(如果执行)将是 $C12D

BPL $2D

绝对间接:(a)

[编辑 | 编辑源代码]

存储在指定地址处的低字节序的两位字节值用于执行计算。仅由 JMP 指令使用。

示例

地址 $A001$A002 被读取,分别返回 $FF$00。然后跳到地址 $00FF

JMP ($A001)

绝对间接索引 X:(a,x)

[编辑 | 编辑源代码]

X 中的值被添加到指定的地址以获得一个总和地址。加载存储在总和地址(LSB)和总和地址加 1(MSB)的两个字节对处的低字节序地址,并在该地址处的值用于执行计算。仅由 JMP 指令使用。

示例

X 中的值 $06 被添加到 $EO15,总和为 $EO1B。读取地址 $E01B$E01C 处的地址 $D010。然后跳到地址 $D010

JMP ($E015,X)

绝对索引 X:a,x

[编辑 | 编辑源代码]

X 中的值被添加到指定的地址以获得一个总和地址。总和地址处的值用于执行计算。

示例

X 中的值 $02 被添加到 $C001,总和为 $C003。地址 $C003 处的 $5A 值用于执行 _带进位的加法_(_ADC_)操作。

ADC $C001,X

绝对索引 Y:a,y

[编辑 | 编辑源代码]

Y 中的值被添加到指定的地址以获得一个总和地址。总和地址处的值用于执行计算。

示例

Y 中的值 $03 被添加到 $F001,总和为 $F004。地址 $F004 处的 $EF 值被递增(_INC_),并向 $F004 写回 $F0

INC $F001,Y

零页索引 X:zp,x

[编辑 | 编辑源代码]

X 中的值被添加到指定的零页地址以获得一个总和地址。总和地址处的值用于执行计算。

示例

X 中的值 $02 被添加到 $01,总和为 $03。地址 $0003 处的 $A5 值被加载到累加器中。

LDA $01,X

零页索引 Y:zp,y

[编辑 | 编辑源代码]

Y 中的值被添加到指定的零页地址以获得一个总和地址。总和地址处的值用于执行计算。

示例

Y 中的值 $03 被添加到 $01,总和为 $04。地址 $0004 处的 $E3 值被加载到累加器中。

LDA $01,Y

零页间接索引:(zp,x)

[编辑 | 编辑源代码]

X 中的值被添加到指定的零页地址以获得一个总和地址。加载存储在总和地址(LSB)和总和地址加 1(MSB)的两个字节对处的低字节序地址,并在该地址处的值用于执行计算。

示例

X 中的值 $02 被添加到 $15,总和为 $17。地址 $0017$0018 处的地址 $D010 将是累加器中 $0F 值存储的位置。

STA ($15,X)

零页间接:(zp)

[编辑 | 编辑源代码]

加载存储在零页地址(LSB)和零页地址加 1(MSB)的两个字节对处的低字节序地址,并在该地址处的值用于执行计算。

示例

地址 $0015$0016 处的地址 $D010 将是累加器中 $0F 值存储的位置。

STA ($15)

零页间接索引 Y:(zp),y

[编辑 | 编辑源代码]

Y 中的值被添加到存储在指定地址(LSB)和指定地址加 1(MSB)的两个字节对处的低字节序地址处的地址。总和地址处的值用于执行计算。实际上,寻址模式完全重复了累加器寄存器的数字。

示例

Y 中的值 $03 被添加到地址 $002A$002B 处的地址 $C235,总和为 $C238。然后,累加器与 $C238 处的 $2F 值进行异或运算。

EOR ($2A),Y

这些是 6502 处理器的指令,包括 ASCII 可视化、受影响标志的列表以及可接受寻址模式的操作码表。

加载和存储

[edit | edit source]
将内存加载到累加器:LDA    将内存加载到索引 X:LDX    将内存加载到索引 Y:LDY   

M -> A

标志:N,Z

M -> X

标志:N,Z

M -> Y

标志:N,Z

寻址模式 操作码
a AD
a,x BD
a,y B9
# A9
zp A5
(zp,x) A1
(zp) B2
zp,x B5
(zp),y B1
寻址模式 操作码
a AE
a,y BE
# A2
zp A6
zp,y B6
寻址模式 操作码
a AC
a,x BC
# A0
zp A4
zp,x B4
将累加器存储到内存:STA    将索引 X 存储到内存:STX    将索引 Y 存储到内存:STY   

A -> M

标志:无

X -> M

标志:无

Y -> M

标志:无

寻址模式 操作码
a 8D
a,x 9D
a,y 99
zp 85
(zp,x) 81
(zp) 92
zp,x 95
(zp),y 91
寻址模式 操作码
a 8E
zp 86
zp,y 96
寻址模式 操作码
a 8C
zp 84
zp,x 94
将零存储到内存:STZ   

0 -> M

标志:无

寻址模式 操作码
a 9C
a,x 9E
zp 64
zp,x 74

算术

[edit | edit source]
将内存加到累加器带进位:ADC    将内存减去累加器带借位:SBC   

A + M + C -> A

标志:N,V,Z,C

A - M - ~C -> A

标志:N,V,Z,C

寻址模式 操作码
a 6D
a,x 7D
a,y 79
# 69
zp 65
(zp,x) 61
(zp) 72
zp,x 75
(zp),y 71
寻址模式 操作码
a ED
a,x FD
a,y F9
# E9
zp E5
(zp,x) E1
(zp) F2
zp,x F5
(zp),y F1

增量和减量

[edit | edit source]
将内存加一:INC    将索引 X 加一:INX    将索引 Y 加一:INY   

M + 1 -> M

标志:N,Z

X + 1 -> X

标志:N,Z

Y + 1 -> Y

标志:N,Z

寻址模式 操作码
a EE
a,x FE
zp E6
zp,x F6
A 1A
寻址模式 操作码
i E8
寻址模式 操作码
i C8
将内存减一:DEC    将索引 X 减一:DEX    将索引 Y 减一:DEY   

M - 1 -> M

标志:N,Z

X - 1 -> X

标志:N,Z

Y - 1 -> Y

标志:N,Z

寻址模式 操作码
a CE
a,x DE
zp C6
zp,x D6
A 3A
寻址模式 操作码
i CA
寻址模式 操作码
i 88

移位和旋转

[edit | edit source]
算术左移一位:ASL    逻辑右移一位:LSR   

C <- 7 6 5 4 3 2 1 0 <- 0

标志:N,Z,C

0 -> 7 6 5 4 3 2 1 0 -> C

标志:N,Z,C

寻址模式 操作码
a 0E
a,x 1E
A 0A
zp 06
zp,x 16
寻址模式 操作码
a 4E
a,x 5E
A 4A
zp 46
zp,x 56
左旋一位:ROL    右旋一位:ROR   

C <- 7 6 5 4 3 2 1 0 <- C

标志:N,Z,C

C -> 7 6 5 4 3 2 1 0 -> C

标志:N,Z,C

寻址模式 操作码
a 2E
a,x 3E
A 2A
zp 26
zp,x 36
寻址模式 操作码
a 6E
a,x 7E
A 6A
zp 66
zp,x 76

逻辑

[edit | edit source]
将内存与累加器 AND 操作:AND    将内存与累加器 OR 操作:ORA    将内存与累加器 XOR 操作:EOR   

A & M -> A

标志:N,Z

A | M -> A

标志:N,Z

A ^ M -> A

标志:N,Z

寻址模式 操作码
a 2D
a,x 3D
a,y 39
# 29
zp 25
(zp,x) 21
(zp) 32
zp,x 35
(zp),y 31
寻址模式 操作码
a 0D
a,x 1D
a,y 19
# 09
zp 05
(zp,x) 01
(zp) 12
zp,x 15
(zp),y 11
寻址模式 操作码
a 4D
a,x 5D
a,y 59
# 49
zp 45
(zp,x) 41
(zp) 52
zp,x 55
(zp),y 51

比较和测试位

[edit | edit source]

负数(N),零(Z)和进位(C)状态标志 用于条件(分支)指令。

所有比较指令都以相同方式影响标志。

条件 N Z C
寄存器 < 内存 1 0 0
寄存器 = 内存 0 1 1
寄存器 > 内存 0 0 1
将内存与累加器比较:CMP    将内存与索引 X 比较:CPX    将内存与索引 Y 比较:CPY   

A - M

标志:N,Z,C

X - M

标志:N,Z,C

Y - M

标志:N,Z,C

寻址模式 操作码
a CD
a,x DD
a,y D9
# C9
zp C5
(zp,x) C1
(zp) D2
zp,x D5
(zp),y D1
寻址模式 操作码
a EC
# E0
zp E4
寻址模式 操作码
a CC
# C0
zp C4

测试内存中的位与累加器:BIT

A & M

标志:N = M7,V = M6,Z

寻址模式 操作码
a 2C
a,x 3C
# 89
zp 24
zp,x 34

分支

[edit | edit source]
无条件分支:BRA   

分支如果 1 = 1

标志:无

寻址模式 操作码
r 80
分支如果进位清除:BCC    分支如果进位设置:BCS   

分支如果 C = 0

标志:无

分支如果 C = 1

标志:无

寻址模式 操作码
r 90
寻址模式 操作码
r B0
分支如果结果非零:BNE    分支如果结果为零:BEQ   

分支如果 Z = 0

标志:无

分支如果 Z = 1

标志:无

寻址模式 操作码
r D0
寻址模式 操作码
r F0
分支如果结果为正:BPL    分支如果结果为负:BMI   

分支如果 N = 0

标志:无

分支如果 N = 1

标志:无

寻址模式 操作码
r 10
寻址模式 操作码
r 30
分支如果溢出清除:BVC    分支如果溢出设置:BVS   

分支如果 V = 0

标志:无

分支如果 V = 1

标志:无

寻址模式 操作码
r 50
寻址模式 操作码
r 70

与其他分支指令不同,BBR 和 BBS 具有两个操作数。用于设置或重置比较的 M 操作数始终是 zp 寻址模式。分支地址操作数是 r 寻址模式,与其他分支指令的含义相同。

分支如果位复位:BBR    分支如果位设置:BBS   
分支如果 (M >> n) & 1 = 0

标志:无

分支如果 (M >> n) & 1 = 1

标志:无

寻址模式 操作码
BBR0 r 0F
BBR1 r 1F
BBR2 r 2F
BBR3 r 3F
BBR4 r 4F
BBR5 r 5F
BBR6 r 6F
BBR7 r 7F
寻址模式 操作码
BBS0 r 8F
BBS1 r 9F
BBS2 r AF
BBS3 r BF
BBS4 r CF
BBS5 r DF
BBS6 r EF
BBS7 r FF

传输

[edit | edit source]
将累加器传输到索引 X:TAX    将索引 X 传输到累加器:TXA   

A -> X

标志:N,Z

X -> A

标志:N,Z

寻址模式 操作码
i AA
寻址模式 操作码
i 8A
将累加器传输到索引 Y:TAY    将索引 Y 传输到累加器:TYA   

A -> Y

标志:N,Z

Y -> A

标志:N,Z

寻址模式 操作码
i A8
寻址模式 操作码
i 98
将堆栈指针传输到索引 X:TSX    将索引 X 传输到堆栈指针:TXS   

S -> X

标志:N,Z

X -> S

标志:无

寻址模式 操作码
i BA
寻址模式 操作码
i 9A

堆栈

[edit | edit source]
将累加器压入堆栈:PHA    将累加器从堆栈弹出:PLA   

A -> S

标志:无

S -> A

标志:N,Z

寻址模式 操作码
i 48
寻址模式 操作码
i 68
将索引 X 压入堆栈:PHX    将索引 X 从堆栈弹出:PLX   

X -> S

标志:无

S -> X

标志:无

寻址模式 操作码
i DA
寻址模式 操作码
i FA
将索引 Y 压入堆栈:PHY    将索引 Y 从堆栈弹出:PLY   

Y -> S

标志:无

S -> Y

标志:无

寻址模式 操作码
i 5A
寻址模式 操作码
i 7A
将处理器状态压入堆栈:PHP    从堆栈中弹出处理器状态:PLP   

P -> S

标志:无

S -> P

标志位:全部

寻址模式 操作码
i 08
寻址模式 操作码
i 28

处理器状态存储为一个字节,其中从高位到低位的标志位为:NV--DIZC。

子程序和跳转

[编辑 | 编辑源代码]

跳转到新位置:JMP

通过更改程序计数器的值跳转到新位置。

标志:无

寻址模式 操作码
a 4C
(a) 6C
(a,x) 7C

跳转到新位置并保存返回地址:JSR

跳转到子程序

下一个指令之前的地址(PC - 1)被压入堆栈:首先是高字节,然后是低字节。由于堆栈向后增长,因此返回地址在内存中以小端序存储。
PC 设置为目标地址。

标志:无

寻址模式 操作码
a 20

从子程序返回:RTS

从子程序返回到使用 JSR 调用它的位置。

从堆栈中弹出返回地址(先弹出低字节,然后是高字节)。
返回地址加 1 并存储到 PC 中。

标志:无

寻址模式 操作码
i 60

从中断返回:RTI

从中断返回。

从堆栈中弹出 SR。
从堆栈中弹出 PC。

标志位:全部

寻址模式 操作码
i 40

设置和清除

[编辑 | 编辑源代码]
清除进位标志:CLC    设置进位标志:SEC   

0 -> C

标志位:C = 0

1 -> C

标志位:C = 1

寻址模式 操作码
i 18
寻址模式 操作码
i 38
清除十进制模式:CLD    设置十进制模式:SED   

0 -> D

标志位:D = 0

1 -> D

标志位:D = 1

寻址模式 操作码
i D8
寻址模式 操作码
i F8
清除中断禁用状态:CLI    设置中断禁用状态:SEI   

0 -> I

标志位:I = 0

1 -> I

标志位:I = 1

寻址模式 操作码
i 58
寻址模式 操作码
i 78
清除溢出标志:CLV   

0 -> V

标志位:V = 0

寻址模式 操作码
i B8
重置内存位:RMB    设置内存位:SMB   

M & ~(1 << n) -> M

标志:无

寻址模式 操作码
RMB0 zp 07
RMB1 zp 17
RMB2 zp 27
RMB3 zp 37
RMB4 zp 47
RMB5 zp 57
RMB6 zp 67
RMB7 zp 77

M | (1 << n) -> M

标志:无

寻址模式 操作码
SMB0 zp 87
SMB1 zp 97
SMB2 zp A7
SMB3 zp B7
SMB4 zp C7
SMB5 zp D7
SMB6 zp E7
SMB7 zp F7

中断:BRK   

强制中断。

这是一个两字节指令,其中第二个字节被处理器忽略。第二个字节可以用作中断服务例程的参数。

标志位:B = 1, I = 1

寻址模式 操作码
i 00

无操作:NOP   

无操作

标志:无

寻址模式 操作码
i EA

等待中断:WAI   

等待中断

标志:无

寻址模式 操作码
i CB

停止模式:STP   

停止模式

标志:无

寻址模式 操作码
i DB

操作码映射

[编辑 | 编辑源代码]

所有存在的操作码列表。操作码是“操作码”,是指令中的第一个字节。这个字节决定要执行的操作。多个汇编助记符(例如 ADC、BIT、JMP 等)对应于多个不同的操作码。每种寻址模式都对应一个操作码。例如,助记符 ASL 有多个操作码,每个操作码对应于 CPU 支持的一种寻址模式。

带星号 (*) 的操作码表示 6502 CPU 中不存在的操作码。

空白条目应与 NOP 指令(EA)的行为相同。

指令表
高位 nibble 低位 nibble
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00 BRK
s
ORA
(zp,x)
TSB
zp *
ORA
zp
ASL
zp
RMB0
zp *
PHP
s
ORA
#
ASL
A
TSB
a *
ORA
a
ASL
a
BBR0
r *
10 BPL
r
ORA
(zp),y
ORA
(zp) *
TRB
zp *
ORA
zp,x
ASL
zp,x
RMB1
zp *
CLC
i
ORA
a,y
INC
A *
TRB
a *
ORA
a,x
ASL
a,x
BBR1
r *
20 JSR
a
AND
(zp,x)
BIT
zp
AND
zp
ROL
zp
RMB2
zp *
PLP
s
AND
#
ROL
A
BIT
a
AND
a
ROL
a
BBR2
r *
30 BMI
r
AND
(zp),y
AND
(zp) *
BIT
zp,x
AND
zp,x
ROL
zp,x
RMB3
zp *
SEC
i
AND
a,y
DEC
A *
BIT
a,x *
AND
a,x
ROL
a,x
BBR3
r *
40 RTI
s
EOR
(zp,x)
EOR
zp
LSR
zp
RMB4
zp *
PHA
s
EOR
#
LSR
A
JMP
a
EOR
a
LSR
a
BBR4
r *
50 BVC
r
EOR
(zp),y
EOR
(zp) *
EOR
zp,x
LSR
zp,x
RMB5
zp *
CLI
i
EOR
a,y
PHY
s *
EOR
a,x
LSR
a,x
BBR5
r *
60 RTS
s
ADC
(zp,x)
STZ
zp
ADC
zp
ROR
zp
RMB6
zp *
PLA
s
ADC
#
ROR
A
JMP
(a)
ADC
a
ROR
a
BBR6
r *
70 BVS
r
ADC
(zp),y
ADC
(zp) *
STZ
zp,x
ADC
zp,x
ROR
zp,x
RMB7
zp *
SEI
i
ADC
a,y
PLY
s *
JMP
(a,x) *
ADC
a,x
ROR
a,x
BBR7
r *
80 BRA
r *
STA
(zp,x)
STY
zp
STA
zp
STX
zp
SMB0
zp *
DEY
i
BIT
# *
TXA
i
STY
a
STA
a
STX
a
BBS0
r *
90 BCC
r
STA
(zp),y
STA
(zp) *
STY
zp,x
STA
zp,x
STX
zp,y
SMB1
zp *
TYA
i
STA
a,y
TXS
i
STZ
a *
STA
a,x
STZ
a,x *
BBS1
r *
A0 LDY
#
LDA
(zp,x)
LDX
#
LDY
zp
LDA
zp
LDX
zp
SMB2
zp *
TAY
i
LDA
#
TAX
i
LDY
a
LDA
a
LDX
a
BBS2
r *
B0 BCS
r
LDA
(zp),y
LDA
(zp) *
LDY
zp,x
LDA
zp,x
LDX
zp,y
SMB3
zp *
CLV
i
LDA
a,y
TSX
i
LDY
a,x
LDA
a,x
LDX
a,y
BBS3
r *
C0 CPY
#
CMP
(zp,x)
CPY
zp
CMP
zp
DEC
zp
SMB4
zp *
INY
i
CMP
#
DEX
i
WAI
i *
CPY
a
CMP
a
DEC
a
BBS4
r *
D0 BNE
r
CMP
(zp),y
CMP
(zp) *
CMP
zp,x
DEC
zp,x
SMB5
zp *
CLD
i
CMP
a,y
PHX
s *
STP
i *
CMP
a,x
DEC
a,x
BBS5
r *
E0 CPX
#
SBC
(zp,x)
CPX
zp
SBC
zp
INC
zp
SMB6
zp *
INX
i
SBC
#
NOP
i
CPX
a
SBC
a
INC
a
BBS6
r *
F0 BEQ
r
SBC
(zp),y
SBC
(zp) *
SBC
zp,x
INC
zp,x
SMB7
zp *
SED
i
SBC
a,y
PLX
s *
SBC
a,x
INC
a,x
BBS7
r *

参考资料

[编辑 | 编辑源代码]
  1. [1],B 标志位不代表实际的 CPU 寄存器

进一步阅读

[编辑 | 编辑源代码]
华夏公益教科书