跳轉到內容

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 暫存器

進一步閱讀

[編輯 | 編輯原始碼]
華夏公益教科書