#pragma once

// структура для дизассемблирования инструкции
// с дополнительными данными для анализа
namespace ARGTYPE
{
	enum ARGTYPE : int
	{
		DST = 0,
		SRC = 1,
		NUMARGS
	};
}

constexpr auto OPDATA_LEN = 8;

class CDbgItemParam
{
	public:
		enum class OPTYPE
		{
			NO_OP,              // безоперандная команда
			NUM_ARG_OP,         // есть числовой аргумент, напр. у команды MARK, EMT
			BRANCH_OP,          // есть адрес перехода, содержится в arg_dst
			SOB_OP,             // два аргумента reg и адрес перехода в arg_dst
			RTS_OP,             // для команды RTS
			JSR_OP,             // два операнда, reg и dst
			XOR_OP,             // два операнда, reg и dst
			ONE_OP,             // однооперанднаяя команда, нет src, есть dst
			TWO_OP,             // двухоперандная команда, есть src и dst
			EIS_OP,             // тут src и dst поменяны местами относительно JSR_XOR_OP
			FIS_OP,             // только регистр
			FPU_OP,             // один операнд
			FPU_OP1,            // два операнда reg и dst
			FPU_OP2,            // тут src и dst поменяны местами относительно FPU_OP1
		};
		struct argParam
		{
			uint8_t  reg;       // регистр
			uint8_t  meth;      // метод адресации
			uint16_t addr_arg;  // адрес аргумента
			uint32_t arg;       // значение аргумента (тут же хранятся плавающие числа float, в старших битах - старшие разряды)
			uint32_t argl;      // младшая часть аргумента для double (остаток мантиссы, в старших битах - старшие разряды)
			argParam()
				: reg(0)
				, meth(0)
				, addr_arg(0)
				, arg(0)
				, argl(0)
			{};
			void clear()
			{
				reg = 0;
				meth = 0;
				addr_arg = 0;
				arg = 0;
				argl = 0;
			}
		};
		uint16_t opdata[OPDATA_LEN]; // массив данных команды
		CString  instr;         // текст дизассемблированой инструкции
		int      len;           // длина в словах дизассемблированной инструкции
		OPTYPE   optype;        // тип операции, чтобы опознавать параметры
		uint16_t addr;          // адрес дизассемблированной инструкции
		bool     byteop;        // флаг байтовой операции
		argParam arguments[ARGTYPE::NUMARGS];

	public:
		CDbgItemParam()
			: opdata{}
			, len(0)
			, optype(OPTYPE::NO_OP)
			, addr(0)
			, byteop(false)
			, arguments{}
		{};

		void clear()
		{
			memset(&opdata[0], 0, sizeof(uint16_t) * OPDATA_LEN);
			instr.Empty();
			len = 0;
			optype = OPTYPE::NO_OP;
			addr = 0;
			byteop = false;
			arguments[ARGTYPE::DST].clear();
			arguments[ARGTYPE::SRC].clear();
		}
};

