Фантазии о Вселенной и мой личный сайт
Список инструкции 6502

Список инструкции 6502

76543210 xxx000xx xxx010xx xxx100xx xxx110xx xxx001xx xxx011xx xxx101xx xxx111xx
000xxx00 BRK PHP BPL REL CLC DOP ZP TOP ABS DOP ZPX TOP ABX
001xxx00 JSR ABS PLP BMI REL SEC BIT ZP BIT ABS DOP ZPX TOP ABX
010xxx00 RTI PHA BVC REL CLI DOP ZP JMP ABS DOP ZPX TOP ABX
011xxx00 RTS PLA BVS REL SEI DOP ZP JMP IND DOP ZPX TOP ABX
100xxx00 DOP IMM DEY BCC REL TYA STY ZP STY ABS STY ZPX SYA ABX
101xxx00 LDY IMM TAY BCS REL CLV LDY ZP LDY ABS LDY ZPX LDY ABX
110xxx00 CPY IMM INY BNE REL CLD CPY ZP CPY ABS DOP ZPX TOP ABX
111xxx00 CPX IMM INX BEQ REL SED CPX ZP CPX ABS DOP ZPX TOP ABX
000xxx01 ORA NDX ORA IMM ORA NDY ORA ABY ORA ZP ORA ABS ORA ZPX ORA ABX
001xxx01 AND NDX AND IMM AND NDY AND ABY AND ZP AND ABS AND ZPX AND ABX
010xxx01 EOR NDX EOR IMM EOR NDY EOR ABY EOR ZP EOR ABS EOR ZPX EOR ABX
011xxx01 ADC NDX ADC IMM ADC NDY ADC ABY ADC ZP ADC ABS ADC ZPX ADC ABX
100xxx01 STA NDX DOP IMM STA NDY STA ABY STA ZP STA ABS STA ZPX STA ABX
101xxx01 LDA NDX LDA IMM LDA NDY LDA ABY LDA ZP LDA ABS LDA ZPX LDA ABX
110xxx01 CMP NDX CMP IMM CMP NDY CMP ABY CMP ZP CMP ABS CMP ZPX CMP ABX
111xxx01 SBC NDX SBC IMM SBC NDY SBC ABY SBC ZP SBC ABS SBC ZPX SBC ABX
000xxx10 KIL ASL A KIL NOP ASL ZP ASL ABS ASL ZPX ASL ABX
001xxx10 KIL ROL A KIL NOP ROL ZP ROL ABS ROL ZPX ROL ABX
010xxx10 KIL LSR A KIL NOP LSR ZP LSR ABS LSR ZPX LSR ABX
011xxx10 KIL ROR A KIL NOP ROR ZP ROR ABS ROR ZPX ROR ABX
100xxx10 DOP IMM TXA KIL TXS STX ZP STX ABS STX ZPY SXA ABY
101xxx10 LDX IMM TAX KIL TSX LDX ZP LDX ABS LDX ZPY LDX ABY
110xxx10 DOP IMM DEX KIL NOP DEC ZP DEC ABS DEC ZPX DEC ABX
111xxx10 DOP IMM NOP KIL NOP INC ZP INC ABS INC ZPX INC ABX
000xxx11 SLO NDX AAC IMM SLO NDY SLO ABY SLO ZP SLO ABS SLO ZPX SLO ABX
001xxx11 RLA NDX AAC IMM RLA NDY RLA ABY RLA ZP RLA ABS RLA ZPX RLA ABX
010xxx11 SRE NDX ASR IMM SRE NDY SRE ABY SRE ZP SRE ABS SRE ZPX SRE ABX
011xxx11 RRA NDX ARR IMM RRA NDY RRA ABY RRA ZP RRA ABS RRA ZPX RRA ABX
100xxx11 AAX NDX XAA IMM AXA NDY XAS ABY AAX ZP AAX ABS AAX ZPY AXA ABY
101xxx11 LAX NDX ATX IMM LAX NDY LAR ABY LAX ZP LAX ABS LAX ZPY LAX ABY
110xxx11 DCP NDX AXS IMM DCP NDY DCP ABY DCP ZP DCP ABS DCP ZPX DCP ABX
111xxx11 ISC NDX SBC IMM ISC NDY ISC ABY ISC ZP ISC ABS ISC ZPX ISC ABX

Базовые инструкции в виде таблицы

  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00 BRK ORA
NDX
ORA
ZP
ASL
ZP
PHP ORA
IMM
ASL
ACC
ORA
ABS
ASL
ABS
10 BPL
REL
ORA
NDY
ORA
ZPX
ASL
ZPX
CLC ORA
ABY
ORA
ABX
ASL
ABX
20 JSR
ABS
AND
NDX
BIT
ZP
AND
ZP
ROL
ZP
PLP AND
IMM
ROL
ACC
BIT
ABS
AND
ABS
ROL
ABS
30 BMI
REL
AND
NDY
AND
ZPX
ROL
ZPX
SEC AND
ABY
AND
ABX
ROL
ABX
40 RTI EOR
NDX
EOR
ZP
LSR
ZP
PHA EOR
IMM
LSR
ACC
JMP
ABS
EOR
ABS
LSR
ABS
50 BVC
REL
EOR
NDY
EOR
ZPX
LSR
ZPX
CLI EOR
ABY
EOR
ABX
LSR
ABX
60 RTS ADC
NDX
ADC
ZP
ROR
ZP
PLA ADC
IMM
ROR
ACC
JMP
IND
ADC
ABS
ROR
ABS
70 BVS
REL
ADC
NDY
ADC
ZPX
ROR
ZPX
SEI ADC
ABY
ADC
ABX
ROR
ABX
80 STA
NDX
STY
ZP
STA
ZP
STX
ZP
DEY TXA STY
ABS
STA
ABS
STX
ABS
90 BCC
REL
STA
NDY
STY
ZPX
STA
ZPX
STX
ZPY
TYA STA
ABY
TXS STA
ABX
A0 LDY
IMM
LDA
NDX
LDX
IMM
LDY
ZP
LDA
ZP
LDX
ZP
TAY LDA
IMM
TAX LDY
ABS
LDA
ABS
LDX
ABS
B0 BCS
REL
LDA
NDY
LDY
ZPX
LDA
ZPX
LDX
ZPY
CLV LDA
ABY
TSX LDY
ABX
LDA
ABX
LDX
ABX
C0 CPY
IMM
CMP
NDX
CPY
ZP
CMP
ZP
DEC
ZP
INY CMP
IMM
DEX CPY
ABS
CMP
ABS
DEC
ABS
D0 BNE
REL
CMP
NDY
CMP
ZPX
DEC
ZPX
CLD CMP
ABY
CMP
ABX
DEC
ABX
E0 CPX
IMM
SBC
NDX
CPX
ZP
SBC
ZP
INC
ZP
INX SBC
IMM
NOP CPX
ABS
SBC
ABS
INC
ABS
F0 BEQ
REL
SBC
NDY
SBC
ZPX
INC
ZPX
SED SBC
ABY
SBC
ABX
INC
ABX

Таблица инструкции опкодов и тактов к ним

IMMZPZPXZPYABSABSXABSYI,XI,YIMPRELACCIND
ADC69 2T65 3T75 4T6D 4T7D 4*T79 4*T61 6T71 5*T
AND29 2T25 3T35 4T2D 4T3D 4*T39 4*T21 6T31 5*T
ASL06 5T16 6T0E 6T1E 7T0A 2T
BCC90 2**T
BCSB0 2**T
BEQF0 2**T
BIT24 3T2C 4T
BMI30 2**T
BNED0 2**T
BPL10 2**T
BRK00 7T
BVC50 2**T
BVS70 2**T
CLC18 2T
CLDD8 2T
CLI58 2T
CLVB8 2T
CMPC9 2TC5 3TD5 4TCD 4TDD 4*TD9 4*TC1 6TD1 5*T
CPXE0 2TE4 3TEC 4T
CPYC0 2TC4 3TCC 4T
DECC6 5TD6 6TCE 6TDE 7T
DEXCA 2T
DEY88 2T
EOR49 2T45 3T55 4T4D 4T5D 4*T59 4*T41 6T51 5*T
INCE6 5TF6 6TEE 6TFE 7T
INXE8 2T
INYC8 2T
JMP4C 3T6C 5T
JSR20 6T
LDAA9 2TA5 3TB5 4TAD 4TBD 4*TB9 4*TA1 6TB1 5*T
LDXA2 2TA6 3TB6 4TAE 4TBE 4*T
LDYA0 2TA4 3TB4 4TAC 4TBC 4*T
LSR46 5T56 6T4E 6T5E 7T4A 2T
NOPEA 2T
ORA09 2T05 3T15 4T0D 4T1D 4*T19 4*T01 6T11 5*T
PHA48 3T
PHP08 3T
PLA68 4T
PLP28 4T
ROL26 5T36 6T2E 6T3E 7T2A 2T
ROR66 5T76 6T6E 6T7E 7T6A 2T
RTI40 6T
RTS60 6T
SBCE9 2TE5 3TF5 4TED 4TFD 4*TF9 4*TE1 6TF1 5*T
SEC38 2T
SEDF8 2T
SEI78 2T
STA85 3T95 4T8D 4T9D 5T99 5T81 6T91 6T
STX86 3T96 4T8E 4T
STY84 3T94 4T8C 4T
TAXAA 2T
TAYA8 2T
TSXBA 2T
TXA8A 2T
TXS9A 2T
TYA98 2T

Расшифровка

PULL() - извлечение из стека. Сначала увеличивается S = S + 1, потом извлекается байт из стека.

PUSH(src) - помещение в стек. Записывается байт, и S = S - 1.

REL_ADDR(pc, rel8) - PC = PC + rel8, если rel8 < 128; иначе PC = PC + (rel8 - 256)


Декодер методов адресации

Ниже код на Verilog, который декодирует различные методы адресации.

casex (data)

    8'bxxx_000_x1: cpu_state <= NDX;
    8'bxxx_010_x1,
    8'b1xx_000_x0: cpu_state <= IMM;
    8'bxxx_100_x1: cpu_state <= NDY;
    8'bxxx_110_x1: cpu_state <= ABY;
    8'bxxx_001_xx: cpu_state <= ZP;
    8'bxxx_011_xx,
    8'b001_000_00: cpu_state <= ABS;
    8'b10x_101_1x: cpu_state <= ZPY;
    8'bxxx_101_xx: cpu_state <= ZPX;
    8'b10x_111_1x: cpu_state <= ABY;
    8'bxxx_111_xx: cpu_state <= ABX;
    8'bxxx_100_00: cpu_state <= REL;
    8'b0xx_010_10: cpu_state <= ACC;
    default:       cpu_state <= IMP;

endcase

Таблица инструкции

КОД Описание IMM ZP ZPX ZPY ABS ABX ABY INX INY IMP REL ACC IND
ADC Сложение с учетом флага переноса: А + d8 + С. Результат в аккумуляторе А и флаге переноса C 69 65 75 ... 6D 7D 79 61 71 ... ... ... ...
unsigned int temp = src + AC + (IF_CARRY() ? 1 : 0); /* This is not valid in decimal mode */ SET_ZERO(temp & 0xff); if (IF_DECIMAL()) { if (((AC & 0xf) + (src & 0xf) + (IF_CARRY() ? 1 : 0)) > 9) temp += 6; SET_SIGN(temp); SET_OVERFLOW(((AC ^ src ^ 0x80) & 0x80) && ((AC ^ temp) & 0x80) ); if (temp > 0x99) temp += 96; SET_CARRY(temp > 0x99); } else { SET_SIGN(temp); SET_OVERFLOW(((AC ^ src ^ 0x80) & 0x80) && ((AC ^ temp) & 0x80) ); SET_CARRY(temp > 0xff); } AC = ((BYTE) temp);
AND Поразрядное логическое И аккумулятора и операнда 29 25 35 ... 2D 3D 39 21 31 ... ... ... ...
src &= AC; SET_SIGN(src); SET_ZERO(src); AC = src;
ASL Арифметический сдвиг операнда влево, без начального учета флага C (умножение на 2) ... 06 16 ... 0E 1E ... ... ... ... ... 0A ...
SET_CARRY(src & 0x80); src <<= 1; src &= 0xff; SET_SIGN(src); SET_ZERO(src); STORE src /* в память или аккумулятор, зависит от метода адресации */
BCC Переход, если флаг C = 0 ... ... ... ... ... ... ... ... ... ... 90 ... ...
if (!IF_CARRY()) { clk += ((PC & 0xFF00) != (REL_ADDR(PC, src) & 0xFF00) ? 2 : 1); PC = REL_ADDR(PC, src); }
BCS Переход, если флаг C = 1 ... ... ... ... ... ... ... ... ... ... B0 ... ...
if (IF_CARRY()) { clk += ((PC & 0xFF00) != (REL_ADDR(PC, src) & 0xFF00) ? 2 : 1); PC = REL_ADDR(PC, src); }
BEQ Переход, если флаг Z = 1 ... ... ... ... ... ... ... ... ... ... F0 ... ...
if (IF_ZERO()) { clk += ((PC & 0xFF00) != (REL_ADDR(PC, src) & 0xFF00) ? 2 : 1); PC = REL_ADDR(PC, src); }
BIT Установка флагов в соответствии с результатом выполнения поразрядного логического И над содержимым аккумулятора и операнда. Бит 6 результата копируется во флаг V, а бит 7 - во флаг N ... 24 ... ... 2C ... ... ... ... ... ... ... ...
SET_SIGN(src); SET_OVERFLOW(0x40 & src); /* Копированиь бит 6 в OVERFLOW флаг. */ SET_ZERO(src & AC);
BMI Переход, если флаг N = 1 ... ... ... ... ... ... ... ... ... ... 30 ... ...
if (IF_SIGN()) { clk += ((PC & 0xFF00) != (REL_ADDR(PC, src) & 0xFF00) ? 2 : 1); PC = REL_ADDR(PC, src); }
BNE Переход, если флаг Z = 0 ... ... ... ... ... ... ... ... ... ... D0 ... ...
if (!IF_ZERO()) { clk += ((PC & 0xFF00) != (REL_ADDR(PC, src) & 0xFF00) ? 2 : 1); PC = REL_ADDR(PC, src); }
BPL Переход, если флаг N = 0 ... ... ... ... ... ... ... ... ... ... 10 ... ...
if (!IF_SIGN()) { clk += ((PC & 0xFF00) != (REL_ADDR(PC, src) & 0xFF00) ? 2 : 1); PC = REL_ADDR(PC, src); }
BRK Программное прерывание ... ... ... ... ... ... ... ... ... 00 ... ... ...
PC++; PUSH((PC >> 8) & 0xff); /* Вставка обратного адреса в стек */ PUSH(PC & 0xff); SET_BREAK(1); /* Установить BFlag перед вставкой */ PUSH(SR); SET_INTERRUPT(1); PC = (LOAD(0xFFFE) | (LOAD(0xFFFF) << 8));
BVC Переход, если флаг V = 0 ... ... ... ... ... ... ... ... ... ... 50 ... ...
if (!IF_OVERFLOW()) { clk += ((PC & 0xFF00) != (REL_ADDR(PC, src) & 0xFF00) ? 2 : 1); PC = REL_ADDR(PC, src); }
BVS Переход, если флаг V = 1 ... ... ... ... ... ... ... ... ... ... 70 ... ...
if (IF_OVERFLOW()) { clk += ((PC & 0xFF00) != (REL_ADDR(PC, src) & 0xFF00) ? 2 : 1); PC = REL_ADDR(PC, src); }
CLC Сброс флага C ... ... ... ... ... ... ... ... ... 18 ... ... ...
SET_CARRY(0);
CLD Сброс флага D ... ... ... ... ... ... ... ... ... D8 ... ... ...
SET_DECIMAL(0);
CLI Сброс флага I (разрешение прерываний) ... ... ... ... ... ... ... ... ... 58 ... ... ...
SET_INTERRUPT(0);
CLV Сброс флага V ... ... ... ... ... ... ... ... ... B8 ... ... ...
SET_OVERFLOW(0);
CMP Установка флагов в соответствии с результатом вычитания операнда из содержимого аккумулятора C9 C5 D5 ... CD DD D9 C1 D1 ... ... ... ...
/* CF=1, если AC > src */ src = (AC - src); SET_CARRY(src >= 0); SET_SIGN(src); SET_ZERO(src & 0xff);
CPX Установка флагов в соответствии с результатом вычитания операнда из содержимого регистра X E0 E4 ... ... EC ... ... ... ... ... ... ... ...
/* CF=1, если X > src */ src = (XR - src); SET_CARRY(src >= 0); SET_SIGN(src); SET_ZERO(src & 0xff);
CPY Установка флагов в соответствии с результатом вычитания операнда из содержимого регистра Y C0 C4 ... ... CC ... ... ... ... ... ... ... ...
/* CF=1, если Y > src */ src = (YR - src); SET_CARRY(src >= 0); SET_SIGN(src); SET_ZERO(src & 0xff);
DEC Уменьшение операнда на 1 ... C6 D6 ... CE DE ... ... ... ... ... ... ...
src = (src - 1) & 0xff; SET_SIGN(src); SET_ZERO(src); STORE(address, (src));
DEX Х = Х-1 ... ... ... ... ... ... ... ... ... CA ... ... ...
unsigned src = XR; src = (src - 1) & 0xff; SET_SIGN(src); SET_ZERO(src); XR = (src);
DEY Y = Y-1 ... ... ... ... ... ... ... ... ... 88 ... ... ...
unsigned src = YR; src = (src - 1) & 0xff; SET_SIGN(src); SET_ZERO(src); YR = (src);
EOR Поразрядное Исключающее ИЛИ содержимого аккумулятора и операнда 49 45 55 ... 4D 5D 59 41 51 ... ... ... ...
src ^= AC; SET_SIGN(src); SET_ZERO(src); AC = src;
INC Увеличение операнда на 1 ... E6 F6 ... EE FE ... ... ... ... ... ... ...
src = (src + 1) & 0xff; SET_SIGN(src); SET_ZERO(src); STORE(address, (src));
INX Х = X+1 ... ... ... ... ... ... ... ... ... E8 ... ... ...
unsigned src = XR; src = (src + 1) & 0xff; SET_SIGN(src); SET_ZERO(src); XR = (src);
INY Y = Y+1 ... ... ... ... ... ... ... ... ... C8 ... ... ...
unsigned src = YR; src = (src + 1) & 0xff; SET_SIGN(src); SET_ZERO(src); YR = (src);
JMP Переход по указанному адресу ... ... ... ... 4C ... ... ... ... ... ... ... 6C
PC = (src)
JSR Вызов подпрограммы с указанным адресом. В стеке сохраняется только адрес возврата ... ... ... ... 20 ... ... ... ... ... ... ... ...
PC--; PUSH((PC >> 8) & 0xff); /* Вставка обратного адреса в стек. */ PUSH(PC & 0xff); PC = (src);
LDA Загрузка операнда в аккумулятор A9 A5 B5 ... AD BD B9 A1 B1 ... ... ... ...
SET_SIGN(src); SET_ZERO(src); AC = (src);
LDX Загрузка операнда в регистр X A2 A6 ... B6 AE ... BE ... ... ... ... ... ...
SET_SIGN(src); SET_ZERO(src); XR = (src);
LDY Загрузка операнда в регистр Y A0 A4 B4 ... AC BC ... ... ... ... ... ... ...
SET_SIGN(src); SET_ZERO(src); YR = (src);
LSR Логический сдвиг операнда вправо (деление на 2) ... 46 56 ... 4E 5E ... ... ... ... ... 4A ...
SET_CARRY(src & 0x01); src >>= 1; SET_SIGN(src); SET_ZERO(src); STORE src /* в память или аккумулятор, зависит от метода адресации */
NOP Нет операции ... ... ... ... ... ... ... ... ... EA ... ... ...
Ничего не выполняется
ORA Поразрядное логическое ИЛИ содержимого аккумулятора и операнда 09 05 15 ... 0D 1D 19 01 11 ... ... ... ...
src |= AC; SET_SIGN(src); SET_ZERO(src); AC = src;
PHA Помещение содержимого аккумулятора в стек ... ... ... ... ... ... ... ... ... 48 ... ... ...
src = AC; PUSH(src);
PHP Помещение регистра состояния в стек ... ... ... ... ... ... ... ... ... 08 ... ... ...
src = GET_SR | 0x30; PUSH(src);
PLA Помещение байта с вершины стека в аккумулятор ... ... ... ... ... ... ... ... ... 68 ... ... ...
src = PULL(); SET_SIGN(src); SET_ZERO(src);
PLP Помещение байта с вершины стека в регистр состояния ... ... ... ... ... ... ... ... ... 28 ... ... ...
src = PULL(); SET_SR((src));
ROL Циклический сдвиг операнда влево ... 26 36 ... 2E 3E ... ... ... ... ... 2A ...
src <<= 1; if (IF_CARRY()) src |= 0x1; SET_CARRY(src > 0xff); src &= 0xff; SET_SIGN(src); SET_ZERO(src); STORE src /* в память или аккумулятор, зависит от метода адресации */
ROR Циклический сдвиг операнда вправо ... 66 76 ... 6E 7E ... ... ... ... ... 6A ...
if (IF_CARRY()) src |= 0x100; SET_CARRY(src & 0x01); src >>= 1; SET_SIGN(src); SET_ZERO(src); STORE src /* в память или аккумулятор, зависит от метода адресации */
RTI Возврат из прерывания ... ... ... ... ... ... ... ... ... 40 ... ... ...
src = PULL(); SET_SR(src); src = PULL(); src |= (PULL() << 8); /* Загрузка адреса из стека */ PC = (src);
RTS Возврат из подпрограммы ... ... ... ... ... ... ... ... ... 60 ... ... ...
src = PULL(); src += ((PULL()) << 8) + 1; /* Загрузить адрес из стека и добавить + 1 */ PC = (src);
SBC Вычитание операнда из содержимого аккумулятора с учетом флага переноса E9 E5 F5 ... ED FD F9 E1 F1 ... ... ... ...
unsigned int temp = AC - src - (IF_CARRY() ? 0 : 1); SET_SIGN(temp); SET_ZERO(temp & 0xff); /* Sign и Zero неверны в Decimal mode */ SET_OVERFLOW(((AC ^ temp) & 0x80) && ((AC ^ src) & 0x80)); if (IF_DECIMAL()) { if ( ((AC & 0xf) - (IF_CARRY() ? 0 : 1)) < (src & 0xf)) /* EP */ temp -= 6; if (temp > 0x99) temp -= 0x60; } SET_CARRY(temp >= 0x00); AC = (temp & 0xff);
SEC Установка флага C ... ... ... ... ... ... ... ... ... 38 ... ... ...
SET_CARRY(1);
SED Установка флага D ... ... ... ... ... ... ... ... ... F8 ... ... ...
SET_DECIMAL(1);
SEI Установка флага I (запрещение прерываний) ... ... ... ... ... ... ... ... ... 78 ... ... ...
SET_INTERRUPT(1);
STA Запись содержимого аккумулятора в память ... 85 95 ... 8D 9D 99 81 91 ... ... ... ...
STORE(address, (src));
STX Запись содержимого регистра X в память ... 86 ... 96 8E ... ... ... ... ... ... ... ...
STORE(address, XR);
STY Запись содержимого регистра Y в память ... 84 94 ... 8C ... ... ... ... ... ... ... ...
STORE(address, YR);
TAX Пересылка содержимого аккумулятора в регистр X ... ... ... ... ... ... ... ... ... AA ... ... ...
unsigned src = AC; SET_SIGN(src); SET_ZERO(src); XR = (src);
TAY Пересылка содержимого аккумулятора в регистр Y ... ... ... ... ... ... ... ... ... A8 ... ... ...
unsigned src = AC; SET_SIGN(src); SET_ZERO(src); YR = (src);
TSX Пересылка содержимого указателя стека в регистр X ... ... ... ... ... ... ... ... ... BA ... ... ...
unsigned src = SP; SET_SIGN(src); SET_ZERO(src); XR = (src);
TXA Пересылка содержимого регистра X в аккумулятор ... ... ... ... ... ... ... ... ... 8A ... ... ...
unsigned src = XR; SET_SIGN(src); SET_ZERO(src); AC = (src);
TXS Пересылка содержимого регистра X в указатель стека ... ... ... ... ... ... ... ... ... 9A ... ... ...
unsigned src = XR; SP = (src);
TYA Пересылка содержимого регистра Y в аккумулятор ... ... ... ... ... ... ... ... ... 98 ... ... ...
unsigned src = YR; SET_SIGN(src); SET_ZERO(src); AC = (src);

Регистры процессора

Процессор оперирует целыми восьмиразрядными числами. Содержит всего 6 программно-доступных регистров. Из них 5 - восьмиразрядных, и 1 - шестнадцатиразрядный программный счетчик.

  • A - регистр - аккумулятор. Как и большинство «простых» архитектур - 6502 является «аккумуляторной», то есть во всех, или почти во всех, операциях явно или неявно участвует аккумулятор.
  • PC - программный счетчик. Единственный 16-ти разрядный регистр - указатель выполняемой команды (классически).
  • S - регистр - указатель вершины стека (первой свободной ячейки). Стек находится в пространстве адресов 0100h - 01FFh и «растёт» от старшего к младшему.
  • P - регистр флагов.
  • X, Y - регистры индексной адресации (или просто "общего назначения").

Регистр флагов

  • C[0] "Carry" - флаг переноса из старшего разряда (классически).
  • Z[1] "Zero" - признак нулевого результата (классически).
  • I[2] "Interrupt" - флаг маскирования прерывания аппаратного прерывания на линии IRQ - варьируется командами SEI/CLI.
  • D[3] "Decimal" - флаг режима десятичной арифметики. Варьируется командами SED/CLD.
  • B[4] "Break" - флаг программного прерывания (команда BRK).
  • 1[5] - всегда единица
  • V[6] "Overflow" - флаг переноса в знаковый разряд (из 6-ого в 7-ой - классически).
  • N[7] "Negative" - флаг знака результата операции - дублирует седьмой разряд (классически).

Методы адресации

  • АСС - аккумуляторная, подразумевает наличие операнда в регистре A процессора (что требуется указать в мнемонике).
  • IMM - непосредственная, 8-разрядный операнд расположен сразу за кодом команды (в мнемонической записи перед непосредственным операндом ставится символ «#»).
  • ABS - прямая, в команде указывается полный 16-разрядный адрес операнда:
    • ABS, X (ABX) - индексированная по X, указывается базовый 16-разрядный адрес, к которому прибавляется смещение из регистра X;
    • ABS, Y (ABY) - индексированная по Y, указывается базовый 16-разрядный адрес, к которому прибавляется смещение из регистра Y.
  • IMPL - неявная (указывается лишь мнемоника), операнды не указываются - жесткая логика работы инструкции.
  • IND - косвенная, задается адрес ячейки памяти, в которой хранится адрес операнда - бывает следующих видов:
    • IND, X (NDX) - индексно-косвенная, указывается 8-разрядный адрес в нулевой странице (в квадратных скобках), к которому прибавляется содержимое регистра X, после чего из ячейки памяти с вычисленным адресом и следующей за ней извлекается полный 16-разрядный адрес операнда (в мнемонике после адреса через запятую ставится и "X"). Другими словами - в области нулевой страницы создается таблица адресов, а при помощи переменной в регистре "X" можно по ним "бегать";
    • IND, Y (NDY) - косвенно-индексная, указывается 8-разрядный адрес в нулевой странице (в квадратных скобках), после чего из заданной ячейки памяти и следующей за ней считывается 16-разрядный базовый адрес, к которому прибавляется содержимое регистра Y, и из ячейки с вычисленным адресом извлекается операнд (в мнемонике после адреса через запятую ставится и "Y"). В данном случае переменная в регистре "Y" играет роль смещения относительно адреса базы, хранящегося в нулевой странице;
  • REL - относительная, в команде указывается 8-разрядное смещение относительно содержимого счетчи­ка команд PC;
  • ZP - адресация нулевой страницы, в команде задается 8-разрядный адрес, определяющий ячейку памя­ти нулевой страницы, где хранится операнд;
    • ZP, X (ZPX) - индексированная по X адресация нулевой страницы, указывается 8-разрядный базовый адрес в нулевой странице, к которому прибавляется содержимое регистра X, и из ячейки памяти с вычисленным адресом извлекается операнд;
    • ZP, Y (ZPY) - индексированная по Y адресация нулевой страницы, в нулевой странице указывается 8-разряд­ный базовый адрес, к которому прибавляется содержимое регистра Y, и из ячейки памяти с вычисленным адресом извлекается операнд.

Ссылка на скачивание ассемблера A6.

Тестовая программа для A6

        .org $8000
start
        LDX #$00
        LDA hw,x
        INX
        JMP start
hw    .text "Hello, world"

Ассемблировать: ./a6 -fb test.asm -o test.bin