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 | 負 |
比較:如果暫存器的值小於輸入值,則設定 |
| 6 | V | 溢位 |
算術運算:如果在加法或減法期間發生有符號溢位,則設定,即結果的符號與輸入和累加器的符號不同 |
| 5 | - | (未用) | 始終設定為 |
| 4 | B[1] | 中斷 | 如果 BRK 指令觸發中斷請求,則設定 |
| 3 | D | 十進位制 | 十進位制模式[2]:數學指令將把輸入和輸出視為十進位制數。 例如 $09 + $01 = $10 |
| 2 | I | 中斷停用 | 設定後,將停用中斷 |
| 1 | Z | 零 |
比較:如果暫存器的值等於輸入值,則設定 |
| 0 | C | 進位 | 進位/借位標誌用於數學和迴圈操作 算術運算:如果在加法或減法期間發生無符號溢位,則設定,即結果小於初始值(或等於初始值,如果進位標誌在進入時被設定) |
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 種記憶體定址模式之一,該模式決定指令的運算元。每個模式都提供了一個示例。
累加器被隱含地作為運算元,因此不需要指定地址。
示例
使用 ASL(算術左移)指令,沒有運算元,累加器始終是被左移的值。
ASL
運算元是隱含的,因此不需要指定。
示例
這裡隱含的運算元是 X(傳輸的源)和 A(傳輸的目的地)。
TXA
運算元直接用於執行計算。
示例
值 $22 被載入到累加器中。
LDA #$22
指定一個完整的 16 位地址,該地址處的位元組用於執行計算。
示例
地址 $D010 處的值被載入到 X 暫存器中。
LDX $D010
單個位元組指定記憶體第一頁($00xx)中的地址,也稱為零頁,該地址處的位元組用於執行計算。
示例
地址 $0002 處的值被載入到 Y 暫存器中。
LDY $02
與隱含(i)基本相同。不同之處在於,這些指令執行堆疊操作;從堆疊中壓入或彈出運算元。
指定的偏移量被新增到程式計數器(PC)中儲存的當前地址。偏移量範圍為 -128 到 +127。
示例
偏移量 $2D 被新增到程式計數器(例如 $C100)中的地址。分支的目的地(如果執行)將是 $C12D。
BPL $2D
儲存在指定地址處的低位元組序的兩位位元組值用於執行計算。僅由 JMP 指令使用。
示例
地址 $A001 和 $A002 被讀取,分別返回 $FF 和 $00。然後跳到地址 $00FF。
JMP ($A001)
X 中的值被新增到指定的地址以獲得一個總和地址。載入儲存在總和地址(LSB)和總和地址加 1(MSB)的兩個位元組對處的低位元組序地址,並在該地址處的值用於執行計算。僅由 JMP 指令使用。
示例
X 中的值 $06 被新增到 $EO15,總和為 $EO1B。讀取地址 $E01B 和 $E01C 處的地址 $D010。然後跳到地址 $D010。
JMP ($E015,X)
X 中的值被新增到指定的地址以獲得一個總和地址。總和地址處的值用於執行計算。
示例
X 中的值 $02 被新增到 $C001,總和為 $C003。地址 $C003 處的 $5A 值用於執行 _帶進位的加法_(_ADC_)操作。
ADC $C001,X
Y 中的值被新增到指定的地址以獲得一個總和地址。總和地址處的值用於執行計算。
示例
Y 中的值 $03 被新增到 $F001,總和為 $F004。地址 $F004 處的 $EF 值被遞增(_INC_),並向 $F004 寫回 $F0。
INC $F001,Y
X 中的值被新增到指定的零頁地址以獲得一個總和地址。總和地址處的值用於執行計算。
示例
X 中的值 $02 被新增到 $01,總和為 $03。地址 $0003 處的 $A5 值被載入到累加器中。
LDA $01,X
Y 中的值被新增到指定的零頁地址以獲得一個總和地址。總和地址處的值用於執行計算。
示例
Y 中的值 $03 被新增到 $01,總和為 $04。地址 $0004 處的 $E3 值被載入到累加器中。
LDA $01,Y
X 中的值被新增到指定的零頁地址以獲得一個總和地址。載入儲存在總和地址(LSB)和總和地址加 1(MSB)的兩個位元組對處的低位元組序地址,並在該地址處的值用於執行計算。
示例
X 中的值 $02 被新增到 $15,總和為 $17。地址 $0017 和 $0018 處的地址 $D010 將是累加器中 $0F 值儲存的位置。
STA ($15,X)
載入儲存在零頁地址(LSB)和零頁地址加 1(MSB)的兩個位元組對處的低位元組序地址,並在該地址處的值用於執行計算。
示例
地址 $0015 和 $0016 處的地址 $D010 將是累加器中 $0F 值儲存的位置。
STA ($15)
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 | ||||||||||||||||||||||||||||||||||||||||||||
|
|
| ||||||||||||||||||||||||||||||||||||||||||||
將累加器儲存到記憶體:STA |
將索引 X 儲存到記憶體:STX |
將索引 Y 儲存到記憶體:STY | ||||||||||||||||||||||||||||||||||||||||||||
|
A -> M 標誌:無 |
X -> M 標誌:無 |
Y -> M 標誌:無 | ||||||||||||||||||||||||||||||||||||||||||||
|
|
| ||||||||||||||||||||||||||||||||||||||||||||
將零儲存到記憶體:STZ |
||||||||||||||||||||||||||||||||||||||||||||||
|
0 -> M 標誌:無 |
||||||||||||||||||||||||||||||||||||||||||||||
|
算術
[edit | edit source] 將記憶體加到累加器帶進位:ADC |
將記憶體減去累加器帶借位:SBC | ||||||||||||||||||||||||||||||||||||||||
|
A + M + C -> A 標誌:N,V,Z,C |
A - M - ~C -> A 標誌:N,V,Z,C | ||||||||||||||||||||||||||||||||||||||||
|
|
增量和減量
[edit | edit source] 將記憶體加一:INC |
將索引 X 加一:INX |
將索引 Y 加一:INY | ||||||||||||||||||||
|
M + 1 -> M 標誌:N,Z |
X + 1 -> X 標誌:N,Z |
Y + 1 -> Y 標誌:N,Z | ||||||||||||||||||||
|
|
| ||||||||||||||||||||
將記憶體減一:DEC |
將索引 X 減一:DEX |
將索引 Y 減一:DEY | ||||||||||||||||||||
|
M - 1 -> M 標誌:N,Z |
X - 1 -> X 標誌:N,Z |
Y - 1 -> Y 標誌:N,Z | ||||||||||||||||||||
|
|
|
移位和旋轉
[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 | ||||||||||||||||||||||||
|
| ||||||||||||||||||||||||
左旋一位: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 | ||||||||||||||||||||||||
|
|
邏輯
[edit | edit source] 將記憶體與累加器 AND 操作:AND |
將記憶體與累加器 OR 操作:ORA |
將記憶體與累加器 XOR 操作:EOR | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
A & M -> A 標誌:N,Z |
A | M -> A 標誌:N,Z |
A ^ M -> A 標誌:N,Z | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
比較和測試位
[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 | ||||||||||||||||||||||||||||||||||||
|
|
|
測試記憶體中的位與累加器: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 標誌:無 |
|||||||||
|
|||||||||
分支如果進位清除:BCC |
分支如果進位設定:BCS | ||||||||
|
分支如果 C = 0 標誌:無 |
分支如果 C = 1 標誌:無 | ||||||||
|
| ||||||||
分支如果結果非零:BNE |
分支如果結果為零:BEQ | ||||||||
|
分支如果 Z = 0 標誌:無 |
分支如果 Z = 1 標誌:無 | ||||||||
|
| ||||||||
分支如果結果為正:BPL |
分支如果結果為負:BMI | ||||||||
|
分支如果 N = 0 標誌:無 |
分支如果 N = 1 標誌:無 | ||||||||
|
| ||||||||
分支如果溢位清除:BVC |
分支如果溢位設定:BVS | ||||||||
|
分支如果 V = 0 標誌:無 |
分支如果 V = 1 標誌:無 | ||||||||
|
|
與其他分支指令不同,BBR 和 BBS 具有兩個運算元。用於設定或重置比較的 M 運算元始終是 zp 定址模式。分支地址運算元是 r 定址模式,與其他分支指令的含義相同。
分支如果位復位:BBR |
分支如果位設定:BBS | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 分支如果 (M >> n) & 1 = 0 標誌:無 |
分支如果 (M >> n) & 1 = 1 標誌:無 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
傳輸
[edit | edit source] 將累加器傳輸到索引 X:TAX |
將索引 X 傳輸到累加器:TXA | ||||||||
|
A -> X 標誌:N,Z |
X -> A 標誌:N,Z | ||||||||
|
| ||||||||
將累加器傳輸到索引 Y:TAY |
將索引 Y 傳輸到累加器:TYA | ||||||||
|
A -> Y 標誌:N,Z |
Y -> A 標誌:N,Z | ||||||||
|
| ||||||||
將堆疊指標傳輸到索引 X:TSX |
將索引 X 傳輸到堆疊指標:TXS | ||||||||
|
S -> X 標誌:N,Z |
X -> S 標誌:無 | ||||||||
|
|
堆疊
[edit | edit source] 將累加器壓入堆疊:PHA |
將累加器從堆疊彈出:PLA | ||||||||
|
A -> S 標誌:無 |
S -> A 標誌:N,Z | ||||||||
|
| ||||||||
將索引 X 壓入堆疊:PHX |
將索引 X 從堆疊彈出:PLX | ||||||||
|
X -> S 標誌:無 |
S -> X 標誌:無 | ||||||||
|
| ||||||||
將索引 Y 壓入堆疊:PHY |
將索引 Y 從堆疊彈出:PLY | ||||||||
|
Y -> S 標誌:無 |
S -> Y 標誌:無 | ||||||||
|
| ||||||||
將處理器狀態壓入堆疊:PHP |
從堆疊中彈出處理器狀態:PLP | ||||||||
|
P -> S 標誌:無 |
S -> P 標誌位:全部 | ||||||||
|
|
處理器狀態儲存為一個位元組,其中從高位到低位的標誌位為: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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
清除十進位制模式:CLD |
設定十進位制模式:SED | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
0 -> D 標誌位:D = 0 |
1 -> D 標誌位:D = 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
清除中斷停用狀態:CLI |
設定中斷停用狀態:SEI | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
0 -> I 標誌位:I = 0 |
1 -> I 標誌位:I = 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
清除溢位標誌:CLV |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
0 -> V 標誌位:V = 0 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
重置記憶體位:RMB |
設定記憶體位:SMB | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
M & ~(1 << n) -> M 標誌:無
|
M | (1 << n) -> M 標誌:無
|
中斷: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 * | ||||