КОД | Описание | IMM | ZP | ZPX | ABS | ABX | ABY | INX | INY | IMP | REL | ACC | IND
|
---|
ADC | Сложение с учетом флага переноса: А + d8 + С. Результат в аккумуляторе А и флаге переноса C | 69 | 65 | 75 | | 6D | 7D | 79 | 61
| | | | |
---|
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 | Арифметический сдвиг операнда влево (умножение на 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 += 2
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 | ... | ... | ... | ... | ... | ... | ... |
---|
PC = (src) |
JMP | Непрямой переход по адресу | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
---|
unsigned address = read_word()
PC = memory[ address ] + 256*memory[ (address & 0xFF00) + ((address+1)&0x00FF) ]; |
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 | Нет операции
| | | | | | | | | | | | |
---|
Ничего не выполняется |
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); |