Skip to content

Latest commit

 

History

History
700 lines (423 loc) · 48.8 KB

README.md

File metadata and controls

700 lines (423 loc) · 48.8 KB

msp430-emu

Теоретические сведения

Эмулятор - комплекс программных, аппаратных средств или их сочетание, который позволяет одной вычислительной системе иммитировать поведение другой вычислительной системы. Целью эмуляции является максимально точное воспроизведение поведения эмулируемой системы.

В качестве эмулируемой системы выбран микроконтроллер MSP430G2553 семейства MSP430. Данное семейство микроконтроллеров получило широкое распространение благодаря возможности тактировать любой модуль периферии асинхронно от ядра. Такая особенность позволяет гибко управлять скоростью (а значит, и потреблением) каждого модуля.

Разработка эмуляторов MSP430 производилась и ранее, на различных языках программирования (Python, C/C++, JS и др.), некоторые из них представлены ниже:

Основной идеей различных реализаций является размещение регистров процессора и всего адресного пространства в оперативной памяти. В зависимости от подхода программирования работа с ними может быть как инкапсулирована, так и нет.

Сведения о процессоре

MSP430 имеет фоннеймановскую архитектуру, с единым адресным пространством для команд и данных. Память может адресоваться как побайтово, так и пословно. Порядок хранения 16-разрядных слов - little-endian (от младшего к старшему).

Регистры

Центральный процессор содержит шестнадцать 16-битных регистров. Регистры R0, R1, R2 и R3 имеют специальные функции. Регистры с R4 по R15 являются рабочими регистрами общего назначения.

Регистр R0 используется как программный счетчик (Program Counter - PC). PC указывает на следующую инструкцию, которая будет выполнена. Каждая инструкция использует чётное число байт (2, 4 или 6), соответсвенно инкрементируется и значение регистра PC. Доступ к инструкциям в 64-КБ адресном пространстве выполняется пословно, и значение PC выровнено по чётным адресам.

Формат счётчика команд PC приведён ниже:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
PC 0

Регистр R1 используется как указатель стека (Stack Pointer - SP). Указатель стека (SR/R1) используется процессором для хранения адресов возврата при вызове подпрограмм и обработке прерываний. Он использует схему предекремента и постинкремента. Кроме того, SP может быть использован программой со всеми инструкциями и режимами адресации. SP инициализируется пользователем в ОЗУ и выровнен по чётным адресам.

Формат указателя стека SP приведён ниже:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
SP 0

Регистр R2 используется как регистр состояния (Status Register - SR). Регистр состояния (SR/R2) используется в качестве регистра источника или назначения, а также может быть использован в качетве регистра общего назначения, но только с инструкциями, адресуемыми пословно. Остальные комбинации режимов адресации используются для генератора констант.

Формат реситра состояния SR приведён ниже:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Зарезервировано V SCG1 SCG0 OSC_OFF CPU_OFF GIE N Z C
Бит Описание
V Флаг переполнения. Этот бит устанавливается, если результат арифметической операции выходит за границы допустимых значений для знаковых величин
SCG1 Системный тактовый генератор 1. Когда этот бит установлен, сигнал SMCLK отключён
SCG0 Системный тактовый генератор 0. Когда этот бит установлен, генератор DCO выключен, если сигнал DCOCLK не используется для формирования сигналов MCLK или SMCLK
OSC_OFF Выключение генератора. Когда этот бит установлен, кварцевый генератор LFXT1 выключен, если сигнал LFXT1CLK не используется для формирования сигналов MCLK или SMCLK
CPU_OFF Выключение ЦПУ. Когда этот бит установлен, ЦПУ выключено
GIE Общий бит разрешения прерываний. Когда этот бит установлен, маскируемые прерывания разрешены. После сброса все маскируемые прерывания запрещены
N Флаг отрицательного результата. Этот бит устанавливается, если результат арифметической операции отрицателен, и сбрасывается, если результат положителен
Z Флаг нуля. Этот бит устанавливается, если результат арифметической операции равен нулю, и сбрасывается в противном случае
C Флаг переноса. Этот бит устанавливается, если при выполнении арифметической операции возникает перенос, и сбрасывается, если переноса не возникает

Регистр R3 используется как специальный регистр, именуемый генератором констант (Constant Generator - CG). R2 также может использоваться в качестве генератора констант. Генератор констант используется для сокращения общей длины команды вследствие неявного представления константы в коде операции. Шесть общеиспользуемых констант генерируются с помощью регистров генератора констант R2 и R3 без требования дополнительного 16-битного слова программного кода. Выбор констант производится через адресный режим регистра-источника.

Регистр As Константа Примечание
R2 00 - Регистровый режим адресации
R2 01 (0) Абсолютный режим адресации
R2 10 00004h +4, операции над битами
R2 11 00008h +8, операции над битами
R3 00 00000h 0, операции над словами
R3 01 00001h +1
R3 10 00002h +2, операции над битами
R3 11 0FFFFh –1, операции над словами

Двенадцать регистров с R4 по R15 являются регистрами общего назначения. Любой из этих регистров может использоваться в качестве регистра данных, указателя или индексного значения. Все эти регистры доступны для команд, работающих как с однобайтными, так и с двухбайтными операндами.

Режимы адресации

ЦПУ поддерживает семь режимов адресации для операндов-источников и четыре режима — для операндов-приёмников. Эти режимы позволяют адресовать любые ячейки в пределах адресного пространства. В таблице приводятся значения битов режима As (для операнда-источника) и Ad (для операнда-приёмника), соответствующие тому или иному режиму адресации.

As/Ad Режим адресации Синтаксис Описание
00/0 Регистровый Rn Содержимое регистра является операндом
01/1 Индексный X(Rn) (Rn + X) указывает на операнд. Значение X содержится в следующем слове
01/1 Относительный ADDR (PC + X) указывает на операнд. Значение X содержится в следующем слове. Используется индексный режим адресации X(PC)
01/1 Абсолютный &ADDR Слово, следующее за командой, содержит абсолютный адрес. Значение X содержится в следующем слове. Используется индексный режим адресации X(SR)
10/- Косвенный регистровый @Rn Rn используется в качестве указателя на операнд
11/- Косвенный регистровый с автоинкрементом @Rn+ Rn используется в качестве указателя на операнд. После выполнения операции значение регистра Rn увеличивается на 1 для команд с однобайтными операндами (.B) и на 2 для команд с двухбайтными операндами (.W)
11/- Непосредственный #N Слово, следующее за командой, содержит значение константы N. Используется косвенный режим адресации с автоинкрементом @PC+

Система команд

В общей сложности набор команд ЦПУ MSP430 включает в себя 27 команд ядра и 24 эмулируемых команды. Команды ядра — это команды, которые имеют уникальные коды операций, декодируемые ЦПУ. Эмулируемые команды облегчают создание и чтение кода, но не имеют собственных кодов операций, а автоматически заменяются ассемблером на эквивалентные команды ядра.

src Операнд-источник, определяемый битами As и S-reg
dst Операнд-приёмник, определяемый битами Ad и D-reg
As Биты, определяющие режим адресации источника (src)
S-reg Рабочий регистр, используемый в качестве источника (src)
Ad Биты, определяющие режим адресации приёмника (dst)
D-reg Рабочий регистр, используемый в качестве приёмника (dst)
B/W Одно- или двухбайтная операция:
0 — двухбайтная операция
1 — однобайтная операция

Адрес назначения может быть любым в пределах адресного пространства. Тем не менее, при использовании команды, изменяющей содержимое приёмника, необходимо убедиться, что адрес назначения доступен для записи. К примеру, адрес, находящийся в диапазоне адресов масочного ПЗУ, будет корректным адресом назначения, однако его содержимое не может быть изменено, поэтому результат выполнения команды будет утерян.

Существует три формата команд ядра:

  • команды с двумя операндами;
  • команды с одним операндом;
  • команды перехода.

Все одно- и двухоперандные команды могут работать как с однобайтными, так и с двухбайтными значениями. Команды, оперирующие байтами, используются для работы с однобайтными данными или доступа к 8-битным периферийным модулям. Команды, оперирующие словами, используются для работы с двухбайтными данными или доступа к 16-битным периферийным модулям.

Входные данные

На вход программы поступает бинарный файл (образ прошивки для микроконтроллера MSP430G2553). Прошивка, написанная на языке программирования C, компилируется в IDE IAR MSP430 с последующим преобразованием в формат RAW Binary. Формат файла RAW Binary представляет из себя образ прошивки, в том виде, как она располагается в адресном пространстве микроконтроллера (секции кода, констант, данных). Первое 16-битное слово в файле является начальным значением PC (точка входа).

Выходные данные

В выходной текстовый файл производится запись состояния процессора после выполнения очередной инструкции (running, если микроконтроллер продолжает работу или halt, если прекратил, а также значения всех регистров в шестнадцатеричном виде).

Пример:

CPU state: running

PC: C004 SP: 0400 SR: 0000 CG2: 0000

R4: 0000 R5: 0000 R6: 0000 R7: 0000

R8: 0000 R9: 0000 R10: 0000 R11: 0000

R12: 0000 R13: 0000 R14: 0000 R15: 0000

План решения задания:

  • изучение набора команд MSP430
  • написание функций, эмулирующих команды ядра
  • написание функций, эмулирующих работу процессора
  • написание тестовых программ для MSP430

Эмулятор микроконтроллера написан на языке C++ и состоит из двух частей - отладчика и процессора.

Процессор

Регистры

Регистры процессора представлены в виде следующей структуры:

typedef struct _regs Registers_t;
struct _regs {
	union {
		uint16_t R[16];
		struct {
			uint16_t PC;
			uint16_t SP;
			union {
				uint16_t SR_;
				struct {
					uint16_t C : 1;
					uint16_t Z : 1;
					uint16_t N : 1;
					uint16_t GIE : 1;
					uint16_t CPU_OFF : 1;
					uint16_t OSC_OFF : 1;
					uint16_t SCG0 : 1;
					uint16_t SCG1 : 1;
					uint16_t V : 1;
					uint16_t _reserved : 7;
				} SR;
			};
			uint16_t CG2;
		};
	};

	const uint32_t _count = 16;
};

Доступ к регистрам осуществляется внутри приватных методов класса процессора.

Адресное пространство

Адресное простарнство данного процессора относительно мало (всего 64КБ), поэтому для него выделяется единый блок памяти размером 64КБ. Работа с адресным пространством осуществляется при помощи класса Memspace. Данный класс предоставляет следующие методы: addr_ptr, stack_ptr, code_ptr, code_size.

Метод addr_ptr вычисляет и возвращает указатель на область памяти виртуального адресного пространства. На вход принимает виртуальный адрес.

Метод stack_ptr вычисляет и возвращает указатель на область памяти виртуального адресного пространства секции стека. На вход принимает виртуальный адрес.

Метод code_ptr вычисляет и возвращает указатель на область памяти виртуального адресного пространства секции кода. На вход принимает виртуальный адрес.

Метод code_size возвращает размер секции '.code'.

Последние два метода используются только при загрузке прошивки.

Ядро

Конкретный процессор (в данном случае MSP430G2553) реализуется классом MSP430, который в свою очередь наследуется от абстрактного класса Cpu. Класс Cpu содержит в себе объекты для регистров процессора (структура Registers_t) и его адресного пространства (класс Memspace).

Класс MSP430 переопределяет методы load_fw, step, decode и fetch, унаследованные от класса Cpu в соответствии с реальным поведением эмулируемого процессора. А также реализует команды ядра и функции декодирования команд каждого из форматов в виде приватных методов.

Команды формата 1 в качетве аргументов принимают указатели на операнды src и dst и длину команды, команды формата 2 - указатель на операнд src и длину команды, команды формата 3 - значение смещения относительно PC.

Метод load_fw загружает из бинарного файла прошивку микроконтроллера в (виртуальное) адресное простарнство, начиная с адреса 0xC000. Именно с этого адреса начинается выполнение программы.

Метод step извлекает из памяти по адресу PC команду и выполняет её, при помощи методов fetch и decode соответсвенно.

Метод fetch возвращает 16-битное значение, расположенное по указанному адресу (он передаётся в качестве аргумента), и увеличивает значение PC на 2.

Метод decode осуществляет декодирование и выполнение команды в зависимости от ёё формата. У данного микроконтроллера три формата команд. Обработка каждого из них выполняется при помощи соответсвующих приватных методов: formatI, formatII, formatJ.

Метод formatI вычисляет значение операнда-источника и/или адрес виртуального адресного пространства, по которому расположен операнд (который по факту является указателем на него), в зависимости от режима адресации, а также указатель на операнд-приёмник. И затем вызывает функцию, эмулирующую декодируемую команду, с передачей указателей на операнды и длины команды.

Метод formatII вычисляет значение операнда-источника и/или адрес виртуального адресного пространства, по которому расположен операнд (который по факту является указателем на него), в зависимости от режима адресации. И затем вызывает функцию, эмулирующую декодируемую команду, с передачей указателя на операнд и длины команды.

Метод formatJ вычисляет смещение относительно PC и вызывает одну из функций перехода, в зависимости от условия.

Функции, step, decode, formatI, formatII и formatJ возвращают true или false в случае успеха или неудачи декодирования и выполнения команды соответственно.

Отладчик

Отладчик используется для управления процессором (вызов функции для выполнения следующей инструкции) и вывода состояния процессора. Данный элемент системы реализуется классом Debugger и предоставляет следующие методы: step и print_cpu_state.

Метод step вызывает метод step класса Cpu и возвращает результат его работы.

Метод print_cpu_state выводит в поток std::ostream информацию о процессоре. CPU state: running, если микроконтроллер продолжает работу или CPU state: halt, если прекратил, а также значения всех регистров в шестнадцатеричном виде.

Эмулятор

Эмулятор реализуется классом Emulator, он содержит всего лишь один метод - run.

Метод run принимает на вход две строки - первая содержит имя файла прошивки, вторая - имя выходного файла. Внутри данного метода происходит вызов метода загрузки прошивки и её последующее выполнение.

Код эмулятора представлен ниже:

#include "emulator.h"


int main(int argc, char* argv[])
{
	if (argc == 3)
	{
		Emulator emul;

		emul.run(argv[1], argv[2]);
	}

	return 0;
}
//...

void Emulator::run(const std::string& fw_file, const std::string& log_file)
{
	bool is_running = true;
	std::ofstream out(log_file);

	_cpu->load_fw(fw_file);

	_dbgr->print_cpu_state(out);
	while (is_running)
	{
		is_running = _dbgr->step();
		_dbgr->print_cpu_state(out);
	}

	out.close();
}

Подробное описание системы команд

Ниже перечислены форматы команд ядра, сами команды и описание их выполнения.

Как было сказано выше, MSP430 имеет три формата команд ядра:

  • команды с двумя операндами;
  • команды с одним операндом;
  • команды перехода.

Формат команд с двумя операндами:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op-code s-reg ad b/w as d-reg

Перечень команд:

  • MOV
  • ADD
  • ADDC
  • SUB
  • SUBC
  • CMP
  • DADD
  • BIT
  • BIC
  • BIS
  • XOR
  • END

Формат команд с одним операндом:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op-code b/w ad ds-reg

Перечень команд:

  • RRC
  • RRA
  • PUSH
  • SWPB
  • CALL
  • RETI
  • SXT

Формат команд перехода:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
op-code condition 10-bit PC offset

Перечень команд:

  • JEQ/JZ
  • JNE/JNZ
  • JC
  • JNC
  • JN
  • JGE
  • JL
  • JMP

Команды условного перехода осуществляют относительный переход по заданному смещению и не влияют на биты состояния ЦПУ. Переход может осуществляться в пределах от –511 до +512 слов относительно текущего значения PC. Величина смещения интерпретируется как 10-битное значение со знаком, которое удваивается и прибавляется к содержимому счётчика команд: PC [new] = PC [old] + 2 + PC [offset] * 2

Описание команд:

MOV

Операция: src → dst

Описание: Операнд-источник пересылается в операнд-приёмник. Содержимое операнда-источника не изменяется. Предыдущее содержимое операнда-приёмника теряется.

Биты состояния: не изменяются

ADD

Операция: src + dst → dst

Описание: Операнд-источник прибавляется к операнду-приёмнику. Содержимое операнда-источника не изменяется. Предыдущее содержимое операнда-приёмника теряется.

Биты состояния:

N: Устанавливается, если результат отрицательный, сбрасывается — если положительный.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Устанавливается, если произошёл перенос, иначе сбрасывается.

V: Устанавливается, если произошло переполнение, иначе сбрасывается.

ADDC

Операция: src + dst + C → dst

Описание: Операнд-источник и бит переноса (C) прибавляются к операнду-приёмнику. Содержимое операнда-источника не изменяется. Предыдущее содержимое операнда-приёмника теряется.

Биты состояния:

N: Устанавливается, если результат отрицательный, сбрасывается — если положительный.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Устанавливается, если произошёл перенос из старшего бита результата, иначе сбрасывается.

V: Устанавливается, если произошло переполнение, иначе сбрасывается.

SUB

Операция: dst + .NOT.src + 1 → dst

Описание: Операнд-источник вычитается из операнда-приёмника путём прибавления к последнему обратного кода операнда-источника плюс единица. Содержимое операнда-источника не изменяется. Предыдущее содержимое операнда-приёмника теряется.

Биты состояния:

N: Устанавливается, если результат отрицательный, сбрасывается — если положительный.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Устанавливается, если произошёл перенос из MSB результата, иначе сбрасывается. Устанавливается, если не было заёма, иначе сбрасывается.

V: Устанавливается, если произошло переполнение, иначе сбрасывается.

SUBC

Операция: dst + .NOT.src + C → dst

Описание: Операнд-источник вычитается из операнда-приёмника путём прибавления к последнему обратного кода операнда-источника и значения бита переноса. Содержимое операнда-источника не изменяется. Предыдущее содержимое операнда-приёмника теряется.

Биты состояния:

N: Устанавливается, если результат отрицательный, сбрасывается — если положительный.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Устанавливается, если произошёл перенос из MSB результата, иначе сбрасывается. Устанавливается, если не было заёма, иначе сбрасывается.

V: Устанавливается, если произошло переполнение, иначе сбрасывается.

CMP

Операция: dst + .NOT.src + 1

Описание: Операнд-источник вычитается из операнда приёмника. Для выполнения этой операции обратный код операнда-источника плюс 1 складывается с операндом-приёмником. Операнды не изменяются, результат операции не сохраняется — операция влияет только на биты состояния.

Биты состояния:

N: Устанавливается, если результат отрицательный (src ≥ dst), сбрасывается — если положительный.

Z: Устанавливается, если результат нулевой, иначе сбрасывается (src = dst).

C: Устанавливается, если был перенос из MSB результата, иначе сбрасывается.

V: Устанавливается, если произошло переполнение, иначе сбрасывается.

DADD

Операция: src + dst + C → dst (BCD-арифметика)

Описание: Операнд-источник и бит переноса (C) прибавляются к операнду-приёмнику по правилам двоично-десятичной арифметики. Содержимое операнда-источника не изменяется. Предыдущее содержимое операнда-приёмника теряется. Для не BCD-чисел результат операции не определён.

Биты состояния:

N: Устанавливается, если MSB результата равен 1, иначе сбрасывается.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Устанавливается, если результат больше 9999, иначе сбрасывается. Устанавливается, если результат больше 99, иначе сбрасывается.

V: Не определён.

BIT

Операция: src .AND. dst

Описание: Выполняется операция «Логическое И» между операндом-источником и операндом-приёмником. Результат операции влияет только на биты состояния. Операнды не изменяются.

Биты состояния:

N: Устанавливается, если MSB результата равен 1, иначе сбрасывается.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Устанавливается, если результат ненулевой, иначе сбрасывается.

V: Сбрасывается.

BIC

Операция: .NOT.src .AND. dst → dst

Описание: Выполняется операция «Логическое И» между инвертированным значением операнда-источника и операндом-приёмником. Результат помещается в операнд-приёмник. Операнд-источник не изменяется.

Биты состояния: не изменяются

BIS

Операция: src .OR. dst → dst

Описание: Выполняется операция «Логическое ИЛИ» между операндом-источником и операндом-приёмником. Результат помещается в операнд-приёмник. Операнд-источник не изменяется.

Биты состояния: не изменяются

XOR

Операция: src .XOR. dst → dst

Описание: Выполняется операция «Исключающее ИЛИ» между операндом-источником и операндом-приёмником. Результат помещается в операнд-приёмник. Операнд-источник не изменяется.

Биты состояния:

N: Устанавливается, если MSB результата равен 1, иначе сбрасывается.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Устанавливается, если результат ненулевой, иначе сбрасывается (= .NOT.Zero).

V: Устанавливается, если оба операнда отрицательные.

AND

Операция: src .AND. dst → dst

Описание: Выполняется операция «Логическое И» между операндом-источником и операндом-приёмником. Результат помещается в операнд-приёмник.

Биты состояния:

N: Устанавливается, если MSB результата равен 1, иначе сбрасывается.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Устанавливается, если результат ненулевой, иначе сбрасывается (= .NOT. Zero).

V: Сбрасывается.

RRC

Операция: C → MSB → MSB-1 ... LSB+1 → LSB → C

Описание: Содержимое операнда-приёмника сдвигается вправо на один бит. Бит переноса (C) вдвигается в старший бит (MSB) операнда, а младший бит операнда (LSB) выдвигается в бит переноса (C).

Биты состояния:

N: Устанавливается, если результат отрицательный, сбрасывается — если положительный.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Загружается из LSB.

V: Сбрасывается.

RRA

Операция: MSB → MSB, MSB → MSB-1, ... LSB+1 → LSB, LSB → C

Описание: Содержимое операнда-приёмника сдвигается вправо на один бит. Старший бит содержимого (MSB) вдвигается в бит MSB-1 (значение MSB остаётся неизменным), а бит LSB+1 вдвигается в младший бит (LSB).

Биты состояния:

N: Устанавливается, если результат отрицательный, сбрасывается — если положительный.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Загружается из LSB.

V: Сбрасывается.

PUSH

Операция:

SP - 2 → SP

src → @SP

Описание: Указатель стека уменьшается на 2, после чего содержимое операнда-источника помещается в ОЗУ по адресу, определяемому указателем стека (TOS).

Биты состояния: не изменяются

SWPB

Операция: Bits 15 to 8 ↔ bits 7 to 0

Описание: Старший и младший байты операнда-приёмника меняются местами.

Биты состояния: не изменяются

CALL

Операция:

dst → tmp (dst вычисляется и запоминается)

SP - 2 → SP

PC → @SP (PC сохраняется в стеке)

tmp → PC (dst загружается в PC)

Описание: Осуществляется вызов подпрограммы, расположенной по любому адресу в пределах 64 КБ. Адрес возврата (адрес следующей команды) сохраняется в стеке. В команде используется 2-байтный операнд.

Биты состояния: не изменяются

RETI

Операция:

TOS → SR

SP + 2 → SP

TOS → PC

SP + 2 → SP

Описание: Содержимое регистра состояния восстанавливается таким, каким оно было при входе в процедуру обработки прерывания. Для этого значение, расположенное на вершине стека (TOS), копируется в регистр состояния. Затем указатель стека увеличивается на 2.

Содержимое счётчика команд восстанавливается таким, каким оно было на момент принятия запроса прерывания. Для этого значение, расположенное на вершине стека (TOS), копируется в счётчик команд. Затем указатель стека увеличивается на 2.

Биты состояния: восстанавливаются из стека

SXT

Операция: Bit 7 → Bit 8 ... Bit 15

Описание: Знаковый бит младшего байта слова копируется во все биты старшего байта.

Биты состояния:

N: Устанавливается, если результат отрицательный, сбрасывается — если положительный.

Z: Устанавливается, если результат нулевой, иначе сбрасывается.

C: Устанавливается, если результат ненулевой, иначе сбрасывается (= .NOT.Zero).

V: Сбрасывается.

JEQ/JZ

Операция:

Если Z = 1, то PC + 2 × offset → PC

Если Z = 0, то выполняется следующая команда.

Описание: Проверяется бит нуля (Z) регистра состояния. Если он установлен, то смещение (10-битное число со знаком), находящееся в младших битах слова команды, прибавляется к счётчику команд. Если бит Z сброшен, то выполняется команда, следующая за командой перехода.

Биты состояния: не изменяются

JNE/JNZ

Операция:

Если Z = 0, то PC + 2 × offset → PC

Если Z = 1, то выполняется следующая команда.

Описание: Проверяется бит нуля (Z) регистра состояния. Если он сброшен, смещение (10-битное число со знаком), то находящееся в младших битах слова команды, прибавляется к счётчику команд. Если бит Z установлен, то выполняется команда, следующая за командой перехода.

Биты состояния: не изменяются

JC

Операция:

Если C = 1, то PC + 2 × offset → PC

Если C = 0, то выполняется следующая команда.

Описание: Проверяется бит переноса (C) регистра состояния. Если он установлен, то смещение (10-битное число со знаком), находящееся в младших битах слова команды, прибавляется к счётчику команд. Если бит C сброшен, то выполняется команда, следующая за командой перехода. Команда JC (переход по «перенос»/«выше или равно») используется при сравнении чисел без знака (от 0 до 65535).

Биты состояния: не изменяются

JNC

Операция:

Если С = 0, то PC + 2 × offset → PC

Если С = 1, то выполняется следующая команда.

Описание: Проверяется бит переноса (C) регистра состояния. Если он сброшен, то смещение (10-битное число со знаком), находящееся в младших битах слова команды, прибавляется к счётчику команд. Если бит C установлен, то выполняется команда, следующая за командой перехода. Команда JNC (переход по «нет переноса»/ «ниже») используется при сравнении чисел без знака (от 0 до 65535).

Биты состояния: не изменяются

JN

Операция:

Если N = 1, то PC + 2 × offset → PC

Если N = 0, то выполняется следующая команда.

Описание: Проверяется бит отрицательного значения (N) регистра состояния. Если он установлен, то смещение (10-битное число со знаком), находящееся в младших битах слова команды, прибавляется к счётчику команд. Если бит N сброшен, то выполняется команда, следующая за командой перехода.

Биты состояния: не изменяются

JGE

Операция:

Если (N .XOR. V) = 0, то PC + 2 × offset → PC

Если (N .XOR. V) = 1, то выполняется следующая команда.

Описание: Проверяются биты переполнения (V) и отрицательного значения (N) регистра состояния. Если установлены или сброшены оба бита, то смещение (10-битное число со знаком), находящееся в младших битах слова команды, прибавляется к счётчику команд. Если установлен только один бит, то выполняется команда, следующая за командой перехода. Эта команда используется при сравнении чисел со знаком.

Биты состояния: не изменяются

JL

Операция:

Если (N .XOR. V) = 1, то PC + 2 × offset → PC

Если (N .XOR. V) = 0, то выполняется следующая команда.

Описание: Проверяются биты переполнения (V) и отрицательного значения (N) регистра состояния. Если установлен только один из битов, то смещение (10-битное число со знаком), находящееся в младших битах слова команды, прибавляется к счётчику команд. Если установлены или сброшены оба бита, то выполняется команда, следующая за командой перехода. Эта команда используется при сравнении чисел со знаком.

Биты состояния: не изменяются

JMP

Операция: PC + 2 × offset → PC

Описание: Смещение (10-битное число со знаком), хранящееся в младших битах слова команды, прибавляется к счётчику команд.

Биты состояния: не изменяются