#pragma once

#include "BKToken.h"

using funcRef = bool (*)(int &, wchar_t &);

struct PseudoCommandStruct
{
	wstring strName;
	bool bEvenAddr;
	funcRef PSCFunction;
};

enum CPUCmdGroup
{
	CPUCG_NOOPS,
	CPUCG_CBRANCH,
	CPUCG_EIS,
	CPUCG_TRAP,
	CPUCG_SOB,
	CPUCG_MARK,
	CPUCG_2OPREG,
	CPUCG_FIS,
	CPUCG_PUSH,
	CPUCG_1OPS,
	CPUCG_2OPS
};

struct CPUCommandStruct
{
	wstring strName;    //Имя мнемоники
	uint16_t nOpcode;   //генерируемый опкод
	CPUCmdGroup nGroup; //группа, к которой принадлежит команда
};

bool AssembleCPUInstruction(CBKToken *token, int &R4, wchar_t &ch);
bool assemble2OP(int &R4, wchar_t &ch);
bool assemble1OP(int &R4, wchar_t &ch);
bool assemble1OPR(int &R4, wchar_t &ch);
bool assemble2OPR(int &R4, wchar_t &ch);
bool assemble2ROP(int &R4, wchar_t &ch);
bool assembleSOB(int &R4, wchar_t &ch);
bool assembleTRAP(int &R4, wchar_t &ch);
bool assembleMARK(int &R4, wchar_t &ch);
bool assembleBR(int &R4, wchar_t &ch);

bool PseudoCommandExec(CBKToken *token, int &R4, wchar_t &ch);
bool PSC_addr(int &R4, wchar_t &ch);
bool PSC_la(int &R4, wchar_t &ch);
bool PSC_print(int &R4, wchar_t &ch);
bool PSC_blkw(int &R4, wchar_t &ch);
bool PSC_blkb(int &R4, wchar_t &ch);
bool PSC_word(int &R4, wchar_t &ch);
bool PSC_byte(int &R4, wchar_t &ch);
bool PSC_end(int &R4, wchar_t &ch);
bool PSC_even(int &R4, wchar_t &ch);
bool PSC_rad50(int &R4, wchar_t &ch);
bool PSC_ascii(int &R4, wchar_t &ch);
bool PSC_asciz(int &R4, wchar_t &ch);
bool PSC_org(int &R4, wchar_t &ch);
bool PSC_flt2(int &R4, wchar_t &ch);
bool PSC_flt4(int &R4, wchar_t &ch);

bool BranchVerify(int nCommandAddr, int &nTargetAddr);
void LabelLinkage();

