Вперед, только вперед...

MOS Technology 6502

Source: Wikipedia

MOS Technology 6502, или просто 6502, — восьмиразрядный микропроцессор, разработанный компанией MOS Technology в 1975 году. В момент появления на рынке он был дешевле аналогичных изделий компаний-конкурентов (Motorola и Intel). Несмотря на это, а также низкую тактовую частоту, в среднем он показывал сходную с ними производительность за счёт продуманных способов адресации памяти, коротких циклов исполнения команд и некоторой конвейеризации. Появление таких процессоров, как 6502 и Zilog Z80, в конечном счёте предопределило появление домашних компьютеров в конце 1970-х годов. Архитектура 6502 была лицензирована компаниями Rockwell, Synertek и многими другими, и использована во многих разработках. Процессор 6502 и его модификации до сих пор применяются во встраиваемых системах.

Микросхема 6502 datashet - тут и тут и тут 

Микросхема 6532 datashet - тут

Сопроцессор 6800 datashet - тут

Пример 2

Приложение №1. Система команд 6502.

Источник тут

Рассмотрим систему команд архитектуры 6502. В Денди используется именно эта модель, за исключением блока десятичной арифметики.

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

A – регистр - аккумулятор. Как и большинство «простых» архитектур – 6502 является «аккумуляторной», то есть во всех, или почти во всех, операциях явно или неявно участвует аккумулятор.

PC – программный счетчик. Единственный 16-ти разрядный регистр – указатель выполняемой команды (классически).

S – регистр - указатель вершины стека (первой свободной ячейки). Стек находится в пространстве адресов 0100h – 01FFh и «растёт» от старшего к младшему.

P – регистр флагов.

P[0] - “C” – “Carry” – флаг переноса из старшего разряда (классически).

P[1] - “Z” – “Zero” – признак нулевого результата (классически).

P[2] - “I” – “Interrupt” – флаг маскирования прерывания аппаратного прерывания на линии IRQ – варьируется командами SEI/CLI.

P[3] - “D” – “Decimal” – флаг режима десятичной арифметики. Так как в Денди этот режим отсутствует, то этот флаг не используется процессором, может использоваться программистом. Варьируется командами SED/CLD.

P[4] - “B” – “Break” – флаг программного прерывания (команда BRK).

P[5] - “ 1”

P[6] - “V” – “” – флаг переноса в знаковый разряд (из 6-ого в 7-ой - классически).

P[7] - “N” – “” – флаг знака результата операции – дублирует седьмой разряд (классически).

X, Y – регистры индексной адресации (или просто "общего назначения").

В общем итоге получается регистров для "юзания" всего навсего 3 (A,X,Y) - да и то, многие команды жестко привязаны именно к одному из них, очень часто неудобно бывает, что рождает лишние мнемоники и обращения в память.

Напомним, что система команд процессора оперирует или с перечисленными выше регистрами, или с адресным пространством памяти (64кб) – все устройства, управляемые процессором, должны отображаться своими регистрами на память.

И так – о способах адресации памяти.

ABS - прямая, в команде указывается полный 16-разрядный адрес операнда:

ABS, X (ABX)- индексированная по X, указывается базовый 16-разрядный адрес, к которому прибавляется смещение из регистра X;

ABS, Y (ABY) - индексированная по Y, указывается базовый 16-разрядный адрес, к которому прибавляется смещение из регистра Y.

АСС - аккумуляторная, подразумевает наличие операнда в регистре A процессора (что требуется указать в мнемонике).

IMM - непосредственная, 8-разрядный операнд расположен сразу за кодом команды (в мнемонической записи перед непосредственным операндом ставится символ «#»).

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, и из ячейки памяти с вычисленным адресом извлекается операнд.

Ниже приведем саму систему команд (Всего 56 мнемоник инструкций).

Мнемоника

Краткое описание

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

Запись на языке ассемблера

Код команды

Число байтов

Изменяемые флаги

ADC

Сложение с учетом флага переноса: А + d8 + С. Результат в аккумуляторе А и флаге переноса C

IMM

ADC #d8

69 d8

2

V, N, Z, С

ZP

ADC 08

65 a8

2

ZP, X

ADC а8, X

75 a8

2

ABS

ADC а16

6D a16l a16h

3

ABS, X

ADC а16, Х

7D a16l a16h

3

ABS, Y

ADC a16, Y

79 a16l a16h

3

IND, X

ADC (a8, X)

61 a8

2

IND, Y

ADC (a8), Y

71 a8

2

AND

Поразрядное логическое И аккумулятора и операнда

IMM

AND #d8

29 d8

2

N, Z

ZP

AND a8

25 a8

2

ZP, X

AND a8, X

35 a8

2

ABS

AND a16

2D a16l a16h

3

ABS, X

AND a16, X

3D a16l a16h

3

ABS, Y

AND a16, Y

39 a16l a16h

3

IND, X

AND (a8, X)

21 a8

2

IND, Y

AND (a8), Y

31 a8

2

ASL

Арифметический сдвиг операнда влево, без начального учета флага C (умножение на 2)

ACC

ASL A

0A

1

N, Z, C

ZP

ASL a8

06 a8

2

 

ZP, X

ASL a8, X

16 a8

2

 

ABS

ASL a16

0E a16l a16h

3

 

ABS, X

ASL a16, X

1E a16l a16h

3

 

BCC

Переход, если флаг C = 0

REL

BCC i8

90 18

2

 

BCS

Переход, если флаг C = 1

REL

BCS 18

B0 18

2

 

BEQ

Переход, если флаг Z = 1

REL

BEQ 18

F018

2

 

BIT

Установка флагов в соответствии с результатом выполнения поразрядного логического И над содержимым аккумулятора и операнда. Бит 6 результата копируется во флаг V, а бит 7 - во флаг N

ZP

BIT a8

24 a8

2

N, V, Z

ABS

BIT a16

2C a16l a16h

3

       

BMI

Переход, если флаг N = 1

REL

BMI 18

3018

2

 

BNE

Переход, если флаг Z = 0

REL

BNE 18

D0 18

2

 

BPL

Переход, если флаг N = 0

REL

BPL 18

1018

2

 

BRK

Программное прерывание

IMPL

BRK

00

1

I

BVC

Переход, если флаг V = 0

REL

BVC 18

5018

2

 

BVS

Переход, если флаг V = 1

REL

BVS 18

7018

2

 

CLC

Сброс флага C

IMPL

CLC

18

1

С

CLD

Сброс флага D

IMPL

CLD

D8

1

D

CLI

Сброс флага I (разрешение прерываний)

IMPL

CLI

58

1

I

CLV

Сброс флага V

IMPL

CLV

B8

1

V

CMP

Установка флагов в соответствии с результатом вычитания операнда из содержимого аккумулятора

IMM

CMP #d8

C9 d8

2

N, Z, C

ZP

CMP a8

C5 a8

2

ZP, X

CMP a8, X

D5 a8

2

ABS

CMP a16

CD a16l a16h

3

ABS, X

CMP a16, X

DD a16l a16h

3

ABS, Y

CMP a16, Y

D9 a16l a16h

3

IND, X

CMP (a8, X)

C1 a8

2

IND, Y

CMP (a8), Y

D1 a8

2

CPX

Установка флагов в соответствии с результатом вычитания операнда из содержимого регистра X

IMM

CPX #d8

E0 d8

2

N, Z, C

ZP

CPX a8

E4d8

2

ABS

CPX a16

EC a16l a16h

3

CPY

Установка флагов в соответствии с результатом вычитания операнда из содержимого аккумулятора

IMM

CPY #d8

C0 d8

2

N, Z, C

ZP

CPY a8

C4 a8

2

ABS

CPY a16

CC a16l a16h

3

DEC

Уменьшение операнда на 1

ZP

DEC a8

C6 a8

2

N, Z

ZP, X

DEC a8, X

D6 a8

2

ABS

DEC а16

CE a16l a16h

3

ABS, X

DEC a16, X

DE a16l a16h

 

DEX

Х = Х-1

IMPL

DEX

CA

1

N, Z

DEY

Y = Y-1

IMPL

DEY

88

1

N, Z

EOR

Поразрядное Исключающее ИЛИ содержимого аккумулятора и операнда

IMM

EOR #d8

49 d8

2

N, Z

ZP

EOR a8

45 a8

2

ZP, X

EOR a8, X

55 a8

2

ABS

EOR a16

4D a16l a16h

3

ABS, X

EOR a16, X

5D a16l a16h

3

ABS, Y

EOR a16, Y

59 a16l a16h

3

IND, X

EOR (a8, X)

41 a8

2

IND, Y

EOR (a8), Y

51 a8

2

INC

Увеличение операнда на 1

ZP

INC a8

E6 a8

2

N, Z

ZP, X

INC a8, X

F6 a8

2

ABS

INC a16

EE a16l a16h

3

ABS, X

INC a16, X

FE a16l a16h

3

INX

Х = X+1

IMPL

INX

E8

1

N, Z

INY

Y = Y+1

IMPL

INY

C8

1

N, Z

JMP

Переход по указанному адресу

ABS

JMP a16

4C a16l a16h

2

 

IND

JMP (a 16)

6C a16l a16h

2

JSR

Вызов подпрограммы с указанным адресом. В стеке сохраняется только адрес возврата

ABS

JSR a16

20 a16l a16h

3

 

LDA

Загрузка операнда в аккумулятор

IMM

LDA #d8

A9d8

2

N, Z

ZP

LDA a8

A5a8

2

ZP, X

LDA a8, X

B5a8

2

ABS

LDA a16

AD a16l a16h

3

ABS, X

LDA a16, X

BD a16l a16h

3

ABS, Y

LDA a16, Y

B9 a16l a16h

3

IND, X

LDA (a8, X)

A1 a8

2

IND, Y

LDA (a8), Y

B1 a8

2

LDX

Загрузка операнда в регистр X

IMM

LDX #d8

A2 d8

2

H, Z

ZP

LDX a8

A6a8

2

ZP, Y

LDX a8, Y

B6a8

2

ABS

LDX a16

AE a16l a16h

3

ABS, Y

LDX a16, Y

BE a16l a16h

3

LDY

Загрузка операнда в регистр Y

IMM

LDY #d8

A0 d8

2

N, Z

ZP

LDY a8

A4 a8

2

ZP, Y

LDY a8, Y

B4 a8

2

ABS

LDY a16

AC a16l a16h

3

ABS, Y

LDY a16, Y

BC a16l a16h

3

LSR

Логический сдвиг операнда вправо (деление на 2)

ACC

LSR A

4A

1

N, Z, C

ZP

LSR a8

46 a8

2

ZP, X

LSR a8, X

56 a8

2

ABS

LSR a16

4E a16l a16h

3

ABS, X

LSR a16, X

5E a16l a16h

3

NOP

Нет операции

IMPL

NOP

EA

1

 

ORA

Поразрядное логическое ИЛИ содержимого аккумулятора и операнда

IMM

ORA #d8

09 d8

2

N, Z

ZP

ORA a8

05 a8

2

ZP, X

ORA a8, X

15 a8

2

ABS

ORA a16

0D a16l a16h

3

ABS, X

ORA a16, X

1D a16l a16h

3

ABS, Y

ORA a16, Y

19 a16l a16h

3

IND, X

ORA (a8, X)

01 a8

2

IND, Y

ORA (a8), Y

11 a8

2

PHA

Помещение содержимого аккумулятора в стек

IMPL

PHA

48

1

 

PHP

Помещение регистра состояния в стек

IMPL

PHP

08

1

 

PLA

Помещение байта с вершины стека в аккумулятор

IMPL

PLA

68

1

 

PLP

Помещение байта с вершины стека в регистр состояния

IMPL

PLP

28

1

Все флаги

ROL

Циклический сдвиг операнда влево

АСС

ROL A

2A

1

N, Z, C

ZP

ROL a8

26 a8

2

ZP, X

ROL a8, X

36 a8

2

ABS

ROL a16

2E a16l a16h

3

ABS, X

ROL a16, X

3E a16l a16h

3

ROR

Циклический сдвиг операнда вправо

АСС

ROR A

6A

1

N, Z, C

ZP

ROR a8

66 a8

2

ZP, X

ROR a8, X

76 a8

2

ABS

ROR a16

6E a16l a16h

3

ABS, X

ROR a16, X

7E a16l a16h

3

RTI

Возврат из прерывания

IMPL

RTI

40

1

Все флаги

RTS

Возврат из подпрограммы

IMPL

RTS

60

1

 

SBC

Вычитание операнда из содержимого аккумулятора с учетом флага переноса

IMM

SBC #d8

E9 d8

2

N, V, Z, C

ZP

SBC a8

E5 a8

2

ZP, X

SBC a8, X

F5 a8

2

ABS

SBC a16

ED a16l a16h

3

ABS, X

SBC a16, X

FD a16l a16h

3

ABS, Y

SBC a16, Y

F9 a16l a16h

3

IND, X

SBC (a8, X)

E1 a8

2

IND, Y

SBC (a8), Y

F1 a8

2

SEC

Установка флага C

IMPL

SEC

38

1

С

SED

Установка флага D

IMPL

SED

F8

1

D

SEI

Установка флага I (запрещение прерываний)

IMPL

SEI

78

1

I

STA

Запись содержимого аккумулятора в память

ZP

STA a8

85 a8

2

 

ZP, X

STA a8, X

95 a8

2

ABS

STA a16

8D a16l a16h

3

ABS, X

STA a16, X

9D a16l a16h

3

ABS, Y

STA a16; Y

99 a16l a16h

3

IND, X

STA (a8, X)

81 a8

2

IND, Y

STA (a8)

91 a8

2

STX

Запись содержимого регистра X в память

ZP

STX a8

86 a8

2

 

ZP, Y

STX a8, Y

96 a8

2

ABS

STX a16

8E a16l a16h

3

STY

Запись содержимого регистра Y в память

ZP

STY a8

84 a8

2

 

ZP, X

STY a8, X

94 a8

2

ABS

STY a16

8C a16l a16h

3

TAX

Пересылка содержимого аккумулятора в регистр X

IMPL

TAX

AA

1

N, Z

TAY

Пересылка содержимого аккумулятора в регистр Y

IMPL

TAY

A8

1

N, Z

TSX

Пересылка содержимого указателя стека в регистр X

IMPL

TSX

BA

1

N, Z

TXA

Пересылка содержимого регистра X в аккумулятор

IMPL

TXA

8A

1

N, Z

TXS

Пересылка содержимого регистра X в указатель стека

IMPL

TXS

9A

1

 

TYA

Пересылка содержимого регистра Y в аккумулятор

IMPL

TYA

98

1

N, Z

Условные обозначения:

а16 - 16-разрядный адрес

a16h - старший байт 16-разрядного адреса

а16l - младший байт 16-разрядного адреса

а8 - 8-разрядный адрес в нулевой странице

d8 - непосредственный 8-разрядный операнд

i8 - 8-разрядное смещение в диапазоне от -128 до 127

Также приведем матрицу системы команд (красным цветом отмечены недокументированные инструкции – в базовой архитектуре 6502 они отсутствуют, но контроллером 6561, вероятно, поддерживаются).

76543210

xxx000xx

xxx010xx

xxx100xx

xxx110xx

xxx001xx

xxx011xx

xxx101xx

xxx111xx

000xxx00

BRK IMM

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

 

Источник - тут

6502 Instruction Set

HI LO-NIBBLE
  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00 BRK impl ORA X,ind ??? --- ??? --- ??? --- ORA zpg ASL zpg ??? --- PHP impl ORA # ASL A ??? --- ??? --- ORA abs ASL abs ??? ---
10 BPL rel ORA ind,Y ??? --- ??? --- ??? --- ORA zpg,X ASL zpg,X ??? --- CLC impl ORA abs,Y ??? --- ??? --- ??? --- ORA abs,X ASL abs,X ??? ---
20 JSR abs AND X,ind ??? --- ??? --- BIT zpg AND zpg ROL zpg ??? --- PLP impl AND # ROL A ??? --- BIT abs AND abs ROL abs ??? ---
30 BMI rel AND ind,Y ??? --- ??? --- ??? --- AND zpg,X ROL zpg,X ??? --- SEC impl AND abs,Y ??? --- ??? --- ??? --- AND abs,X ROL abs,X ??? ---
40 RTI impl EOR X,ind ??? --- ??? --- ??? --- EOR zpg LSR zpg ??? --- PHA impl EOR # LSR A ??? --- JMP abs EOR abs LSR abs ??? ---
50 BVC rel EOR ind,Y ??? --- ??? --- ??? --- EOR zpg,X LSR zpg,X ??? --- CLI impl EOR abs,Y ??? --- ??? --- ??? --- EOR abs,X LSR abs,X ??? ---
60 RTS impl ADC X,ind ??? --- ??? --- ??? --- ADC zpg ROR zpg ??? --- PLA impl ADC # ROR A ??? --- JMP ind ADC abs ROR abs ??? ---
70 BVS rel ADC ind,Y ??? --- ??? --- ??? --- ADC zpg,X ROR zpg,X ??? --- SEI impl ADC abs,Y ??? --- ??? --- ??? --- ADC abs,X ROR abs,X ??? ---
80 ??? --- STA X,ind ??? --- ??? --- STY zpg STA zpg STX zpg ??? --- DEY impl ??? --- TXA impl ??? --- STY abs STA abs STX abs ??? ---
90 BCC rel STA ind,Y ??? --- ??? --- STY zpg,X STA zpg,X STX zpg,Y ??? --- TYA impl STA abs,Y TXS impl ??? --- ??? --- STA abs,X ??? --- ??? ---
A0 LDY # LDA X,ind LDX # ??? --- LDY zpg LDA zpg LDX zpg ??? --- TAY impl LDA # TAX impl ??? --- LDY abs LDA abs LDX abs ??? ---
B0 BCS rel LDA ind,Y ??? --- ??? --- LDY zpg,X LDA zpg,X LDX zpg,Y ??? --- CLV impl LDA abs,Y TSX impl ??? --- LDY abs,X LDA abs,X LDX abs,Y ??? ---
C0 CPY # CMP X,ind ??? --- ??? --- CPY zpg CMP zpg DEC zpg ??? --- INY impl CMP # DEX impl ??? --- CPY abs CMP abs DEC abs ??? ---
D0 BNE rel CMP ind,Y ??? --- ??? --- ??? --- CMP zpg,X DEC zpg,X ??? --- CLD impl CMP abs,Y ??? --- ??? --- ??? --- CMP abs,X DEC abs,X ??? ---
E0 CPX # SBC X,ind ??? --- ??? --- CPX zpg SBC zpg INC zpg ??? --- INX impl SBC # NOP impl ??? --- CPX abs SBC abs INC abs ??? ---
F0 BEQ rel SBC ind,Y ??? --- ??? --- ??? --- SBC zpg,X INC zpg,X ??? --- SED impl SBC abs,Y ??? --- ??? --- ??? --- SBC abs,X INC abs,X ??? ---

 

Address Modes:

A   .... Accumulator   OPC A   operand is AC
abs   .... absolute   OPC $HHLL   operand is address $HHLL
abs,X   .... absolute, X-indexed   OPC $HHLL,X   operand is address incremented by X with carry
abs,Y   .... absolute, Y-indexed   OPC $HHLL,Y   operand is address incremented by Y with carry
#   .... immediate   OPC #$BB   operand is byte (BB)
impl   .... implied   OPC   operand implied
ind   .... indirect   OPC ($HHLL)   operand is effective address; effective address is value of address
X,ind   .... X-indexed, indirect   OPC ($BB,X)   operand is effective zeropage address; effective address is byte (BB) incremented by X without carry
ind,Y   .... indirect, Y-indexed   OPC ($LL),Y   operand is effective address incremented by Y with carry; effective address is word at zeropage address
rel   .... relative   OPC $BB   branch target is PC + offset (BB), bit 7 signifies negative offset
zpg   .... zeropage   OPC $LL   operand is of address; address hibyte = zero ($00xx)
zpg,X   .... zeropage, X-indexed   OPC $LL,X   operand is address incremented by X; address hibyte = zero ($00xx); no page transition
zpg,Y   .... zeropage, Y-indexed   OPC $LL,Y   operand is address incremented by Y; address hibyte = zero ($00xx); no page transition

 

Instructions by Name:

ADC .... add with carry
AND .... and (with accumulator)
ASL .... arithmetic shift left
BCC .... branch on carry clear
BCS .... branch on carry set
BEQ .... branch on equal (zero set)
BIT .... bit test
BMI .... branch on minus (negative set)
BNE .... branch on not equal (zero clear)
BPL .... branch on plus (negative clear)
BRK .... interrupt
BVC .... branch on overflow clear
BVS .... branch on overflow set
CLC .... clear carry
CLD .... clear decimal
CLI .... clear interrupt disable
CLV .... clear overflow
CMP .... compare (with accumulator)
CPX .... compare with X
CPY .... compare with Y
DEC .... decrement
DEX .... decrement X
DEY .... decrement Y
EOR .... exclusive or (with accumulator)
INC .... increment
INX .... increment X
INY .... increment Y
JMP .... jump
JSR .... jump subroutine
LDA .... load accumulator
LDY .... load X
LDY .... load Y
LSR .... logical shift right
NOP .... no operation
ORA .... or with accumulator
PHA .... push accumulator
PHP .... push processor status (SR)
PLA .... pull accumulator
PLP .... pull processor status (SR)
ROL .... rotate left
ROR .... rotate right
RTI .... return from interrupt
RTS .... return from subroutine
SBC .... subtract with carry
SEC .... set carry
SED .... set decimal
SEI .... set interrupt disable
STA .... store accumulator
STX .... store X
STY .... store Y
TAX .... transfer accumulator to X
TAY .... transfer accumulator to Y
TSX .... transfer stack pointer to X
TXA .... transfer X to accumulator
TXS .... transfer X to stack pointer
TYA .... transfer Y to accumulator

 

 

Registers:

PC .... program counter (16 bit)
AC .... accumulator (8 bit)
X .... X register (8 bit)
Y .... Y register (8 bit)
SR .... status register [NV-BDIZC] (8 bit)
SP .... stack pointer (8 bit)

 
SR Flags (bit 7 to bit 0):

N .... Negative
V .... Overflow
- .... ignored
B .... Break
D .... Decimal (use BCD for arithmetics)
I .... Interrupt (IRQ disable)
Z .... Zero
C .... Carry

 

Processor Stack:
LIFO, top down, 8 bit range, 0x0100 - 0x01FF
 

Bytes, Words, Addressing:
8 bit bytes, 16 bit words in lobyte-hibyte representation (Little-Endian).
16 bit address range, operands follow instruction codes.
 

Vendor:
MOS Technology, 1975

APPENDIX A: 6502 Instructions in Detail


ADC  Add Memory to Accumulator with Carry

     A + M + C -> A, C                N Z C I D V
                                      + + + - - +

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     ADC #oper     69    2     2
     zeropage      ADC oper      65    2     3
     zeropage,X    ADC oper,X    75    2     4
     absolute      ADC oper      6D    3     4
     absolute,X    ADC oper,X    7D    3     4*
     absolute,Y    ADC oper,Y    79    3     4*
     (indirect,X)  ADC (oper,X)  61    2     6
     (indirect),Y  ADC (oper),Y  71    2     5*


AND  AND Memory with Accumulator

     A AND M -> A                     N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     AND #oper     29    2     2
     zeropage      AND oper      25    2     3
     zeropage,X    AND oper,X    35    2     4
     absolute      AND oper      2D    3     4
     absolute,X    AND oper,X    3D    3     4*
     absolute,Y    AND oper,Y    39    3     4*
     (indirect,X)  AND (oper,X)  21    2     6
     (indirect),Y  AND (oper),Y  31    2     5*


ASL  Shift Left One Bit (Memory or Accumulator)

     C <- [76543210] <- 0             N Z C I D V
                                      + + + - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     accumulator   ASL A         0A    1     2
     zeropage      ASL oper      06    2     5
     zeropage,X    ASL oper,X    16    2     6
     absolute      ASL oper      0E    3     6
     absolute,X    ASL oper,X    1E    3     7


BCC  Branch on Carry Clear

     branch on C = 0                  N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     relative      BCC oper      90    2     2**


BCS  Branch on Carry Set

     branch on C = 1                  N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     relative      BCS oper      B0    2     2**


BEQ  Branch on Result Zero

     branch on Z = 1                  N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     relative      BEQ oper      F0    2     2**


BIT  Test Bits in Memory with Accumulator

     bits 7 and 6 of operand are transfered to bit 7 and 6 of SR (N,V);
     the zeroflag is set to the result of operand AND accumulator.

     A AND M, M7 -> N, M6 -> V        N Z C I D V
                                     M7 + - - - M6

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     zeropage      BIT oper      24    2     3
     absolute      BIT oper      2C    3     4


BMI  Branch on Result Minus

     branch on N = 1                  N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     relative      BMI oper      30    2     2**


BNE  Branch on Result not Zero

     branch on Z = 0                  N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     relative      BNE oper      D0    2     2**


BPL  Branch on Result Plus

     branch on N = 0                  N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     relative      BPL oper      10    2     2**


BRK  Force Break

     interrupt,                       N Z C I D V
     push PC+2, push SR               - - - 1 - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       BRK           00    1     7


BVC  Branch on Overflow Clear

     branch on V = 0                  N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     relative      BVC oper      50    2     2**


BVS  Branch on Overflow Set

     branch on V = 1                  N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     relative      BVC oper      70    2     2**


CLC  Clear Carry Flag

     0 -> C                           N Z C I D V
                                      - - 0 - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       CLC           18    1     2


CLD  Clear Decimal Mode

     0 -> D                           N Z C I D V
                                      - - - - 0 -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       CLD           D8    1     2


CLI  Clear Interrupt Disable Bit

     0 -> I                           N Z C I D V
                                      - - - 0 - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       CLI           58    1     2


CLV  Clear Overflow Flag

     0 -> V                           N Z C I D V
                                      - - - - - 0

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       CLV           B8    1     2


CMP  Compare Memory with Accumulator

     A - M                            N Z C I D V
                                    + + + - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     CMP #oper     C9    2     2
     zeropage      CMP oper      C5    2     3
     zeropage,X    CMP oper,X    D5    2     4
     absolute      CMP oper      CD    3     4
     absolute,X    CMP oper,X    DD    3     4*
     absolute,Y    CMP oper,Y    D9    3     4*
     (indirect,X)  CMP (oper,X)  C1    2     6
     (indirect),Y  CMP (oper),Y  D1    2     5*


CPX  Compare Memory and Index X

     X - M                            N Z C I D V
                                      + + + - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     CPX #oper     E0    2     2
     zeropage      CPX oper      E4    2     3
     absolute      CPX oper      EC    3     4


CPY  Compare Memory and Index Y

     Y - M                            N Z C I D V
                                      + + + - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     CPY #oper     C0    2     2
     zeropage      CPY oper      C4    2     3
     absolute      CPY oper      CC    3     4


DEC  Decrement Memory by One

     M - 1 -> M                       N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     zeropage      DEC oper      C6    2     5
     zeropage,X    DEC oper,X    D6    2     6
     absolute      DEC oper      CE    3     3
     absolute,X    DEC oper,X    DE    3     7


DEX  Decrement Index X by One

     X - 1 -> X                       N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       DEC           CA    1     2


DEY  Decrement Index Y by One

     Y - 1 -> Y                       N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       DEC           88    1     2


EOR  Exclusive-OR Memory with Accumulator

     A EOR M -> A                     N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     EOR #oper     49    2     2
     zeropage      EOR oper      45    2     3
     zeropage,X    EOR oper,X    55    2     4
     absolute      EOR oper      4D    3     4
     absolute,X    EOR oper,X    5D    3     4*
     absolute,Y    EOR oper,Y    59    3     4*
     (indirect,X)  EOR (oper,X)  41    2     6
     (indirect),Y  EOR (oper),Y  51    2     5*


INC  Increment Memory by One

     M + 1 -> M                       N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     zeropage      INC oper      E6    2     5
     zeropage,X    INC oper,X    F6    2     6
     absolute      INC oper      EE    3     6
     absolute,X    INC oper,X    FE    3     7


INX  Increment Index X by One

     X + 1 -> X                       N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       INX           E8    1     2


INY  Increment Index Y by One

     Y + 1 -> Y                       N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       INY           C8    1     2


JMP  Jump to New Location

     (PC+1) -> PCL                    N Z C I D V
     (PC+2) -> PCH                    - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     absolute      JMP oper      4C    3     3
     indirect      JMP (oper)    6C    3     5


JSR  Jump to New Location Saving Return Address

     push (PC+2),                     N Z C I D V
     (PC+1) -> PCL                    - - - - - -
     (PC+2) -> PCH

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     absolute      JSR oper      20    3     6


LDA  Load Accumulator with Memory

     M -> A                           N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     LDA #oper     A9    2     2
     zeropage      LDA oper      A5    2     3
     zeropage,X    LDA oper,X    B5    2     4
     absolute      LDA oper      AD    3     4
     absolute,X    LDA oper,X    BD    3     4*
     absolute,Y    LDA oper,Y    B9    3     4*
     (indirect,X)  LDA (oper,X)  A1    2     6
     (indirect),Y  LDA (oper),Y  B1    2     5*


LDX  Load Index X with Memory

     M -> X                           N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     LDX #oper     A2    2     2
     zeropage      LDX oper      A6    2     3
     zeropage,Y    LDX oper,Y    B6    2     4
     absolute      LDX oper      AE    3     4
     absolute,Y    LDX oper,Y    BE    3     4*


LDY  Load Index Y with Memory

     M -> Y                           N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     LDY #oper     A0    2     2
     zeropage      LDY oper      A4    2     3
     zeropage,X    LDY oper,X    B4    2     4
     absolute      LDY oper      AC    3     4
     absolute,X    LDY oper,X    BC    3     4*


LSR  Shift One Bit Right (Memory or Accumulator)

     0 -> [76543210] -> C             N Z C I D V
                                      - + + - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     accumulator   LSR A         4A    1     2
     zeropage      LSR oper      46    2     5
     zeropage,X    LSR oper,X    56    2     6
     absolute      LSR oper      4E    3     6
     absolute,X    LSR oper,X    5E    3     7


NOP  No Operation

     ---                              N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       NOP           EA    1     2


ORA  OR Memory with Accumulator

     A OR M -> A                      N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     ORA #oper     09    2     2
     zeropage      ORA oper      05    2     3
     zeropage,X    ORA oper,X    15    2     4
     absolute      ORA oper      0D    3     4
     absolute,X    ORA oper,X    1D    3     4*
     absolute,Y    ORA oper,Y    19    3     4*
     (indirect,X)  ORA (oper,X)  01    2     6
     (indirect),Y  ORA (oper),Y  11    2     5*


PHA  Push Accumulator on Stack

     push A                           N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       PHA           48    1     3


PHP  Push Processor Status on Stack

     push SR                          N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       PHP           08    1     3


PLA  Pull Accumulator from Stack

     pull A                           N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       PLA           68    1     4


PLP  Pull Processor Status from Stack

     pull SR                          N Z C I D V
                                      from stack

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       PHP           28    1     4


ROL  Rotate One Bit Left (Memory or Accumulator)

     C <- [76543210] <- C             N Z C I D V
                                      + + + - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     accumulator   ROL A         2A    1     2
     zeropage      ROL oper      26    2     5
     zeropage,X    ROL oper,X    36    2     6
     absolute      ROL oper      2E    3     6
     absolute,X    ROL oper,X    3E    3     7


ROR  Rotate One Bit Right (Memory or Accumulator)

     C -> [76543210] -> C             N Z C I D V
                                      + + + - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     accumulator   ROR A         6A    1     2
     zeropage      ROR oper      66    2     5
     zeropage,X    ROR oper,X    76    2     6
     absolute      ROR oper      6E    3     6
     absolute,X    ROR oper,X    7E    3     7


RTI  Return from Interrupt

     pull SR, pull PC                 N Z C I D V
                                      from stack

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       RTI           40    1     6


RTS  Return from Subroutine

     pull PC, PC+1 -> PC              N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       RTS           60    1     6


SBC  Subtract Memory from Accumulator with Borrow

     A - M - C -> A                   N Z C I D V
                                      + + + - - +

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     immidiate     SBC #oper     E9    2     2
     zeropage      SBC oper      E5    2     3
     zeropage,X    SBC oper,X    F5    2     4
     absolute      SBC oper      ED    3     4
     absolute,X    SBC oper,X    FD    3     4*
     absolute,Y    SBC oper,Y    F9    3     4*
     (indirect,X)  SBC (oper,X)  E1    2     6
     (indirect),Y  SBC (oper),Y  F1    2     5*


SEC  Set Carry Flag

     1 -> C                           N Z C I D V
                                      - - 1 - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       SEC           38    1     2


SED  Set Decimal Flag

     1 -> D                           N Z C I D V
                                      - - - - 1 -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       SED           F8    1     2


SEI  Set Interrupt Disable Status

     1 -> I                           N Z C I D V
                                      - - - 1 - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       SEI           78    1     2


STA  Store Accumulator in Memory

     A -> M                           N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     zeropage      STA oper      85    2     3
     zeropage,X    STA oper,X    95    2     4
     absolute      STA oper      8D    3     4
     absolute,X    STA oper,X    9D    3     5
     absolute,Y    STA oper,Y    99    3     5
     (indirect,X)  STA (oper,X)  81    2     6
     (indirect),Y  STA (oper),Y  91    2     6


STX  Store Index X in Memory

     X -> M                           N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     zeropage      STX oper      86    2     3
     zeropage,Y    STX oper,Y    96    2     4
     absolute      STX oper      8E    3     4


STY  Sore Index Y in Memory

     Y -> M                           N Z C I D V
                                      - - - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     zeropage      STY oper      84    2     3
     zeropage,X    STY oper,X    94    2     4
     absolute      STY oper      8C    3     4


TAX  Transfer Accumulator to Index X

     A -> X                           N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       TAX           AA    1     2


TAY  Transfer Accumulator to Index Y

     A -> Y                           N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       TAY           A8    1     2


TSX  Transfer Stack Pointer to Index X

     SP -> X                          N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       TSX           BA    1     2


TXA  Transfer Index X to Accumulator

     X -> A                           N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       TXA           8A    1     2


TXS  Transfer Index X to Stack Register

     X -> SP                          N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       TXS           9A    1     2


TYA  Transfer Index Y to Accumulator

     Y -> A                           N Z C I D V
                                      + + - - - -

     addressing    assembler    opc  bytes  cyles
     --------------------------------------------
     implied       TYA           98    1     2

  *  add 1 to cycles if page boundery is crossed

  ** add 1 to cycles if branch occurs on same page
     add 2 to cycles if branch occurs to different page


     Legend to Flags:  + .... modified
                       - .... not modified
                       1 .... set
                       0 .... cleared
                      M6 .... memory bit 6
                      M7 .... memory bit 7


Note on assembler syntax:
Most assemblers employ "OPC *oper" for forced zeropage addressing.

 

APENDIX B: The 65xx-Family:

  Type               Features, Comments
  -------------------------------------
  6502               NMOS, 16 bit address bus, 8 bit data bus
  6502A              accelerated version of 6502
  6502C              accelerated version of 6502, CMOS
  65C02              16 bit version, additional instructions and address modes
  6503, 6505, 6506   12 bit address bus [4 KiB]
  6504               13 bit address bus [8 KiB]
  6507               13 bit address bus [8 KiB], no interrupts
  6509               20 bit address bus [1 MiB] by bankswitching
  6510               as 6502 with additional 6 bit I/O-port
  6511               integrated micro controler with I/O-port, serial interface, and RAM (Rockwell)
  65F11              as 6511, integrated FORTH interpreter
  7501               as 6502, HMOS
  8500               as 6510, CMOS
  8502               as 6510 with switchable 2 MHz option, 7 bit I/O-port
  65816 (65C816)     16 bit registers and ALU, 24 bit address bus [16 MiB], up to 24 MHz (Western Design Center)
  65802 (65C802)     as 65816, pin compatible to 6502, 64 KiB address bus, up to 16 MHz

Disclaimer:
Errors excepted. The information is provided for free and AS IS, therefore without any warranty;
without even the implied warranty of merchantability or fitness for a particular purpose.

Basic 6502 computer (link)

DIY ("Do-It-Yourself") 6502 computer - link

 

<< Вернуться на предыдущую страницу