#pragma once

//#include <vector>
using namespace std;

enum ListType : int
{
	LT_BLANKLINE,
	LT_COMMENTARY,  //комментарий
	LT_ASSIGN,      //присваивание
	LT_LABEL,       //метка
	LT_INSTRUCTION, //обычная ассемблерная инструкция
	LT_PSC_ADDR,    //псевдокоманда ADDR
	LT_PSC_LA,      //псевдокоманда LA
	LT_PSC_PRINT,   //псевдокоманда PRINT
	LT_PSC_BLKW,    //псевдокоманда BLKW
	LT_PSC_BLKB,    //псевдокоманда BKLB
	LT_PSC_WORD,    //псевдокоманда WORD
	LT_PSC_BYTE,    //псевдокоманда BYTE
	LT_PSC_END,     //псевдокоманда END
	LT_PSC_EVEN,    //псевдокоманда EVEN
	LT_PSC_RAD50,   //псевдокоманда RAD50
	LT_PSC_ASCII,   //псевдокоманда ASCII,ASCIIZ
	LT_PSC_FLT2,    //псевдокоманда FLT2
	LT_PSC_FLT4,    //псевдокоманда FLT4
};

struct ListingCmdType
{
	int nPC;        //адрес с которого начинаются бинарные данные
	int nEndAdr;    //адрес на котором кончаются бинарные данные
	ListType LT;    //тип команды в строке
};


struct ListingLine
{
	int nLineNum;           //номер строки
	wstring line;           //сама строка
	vector<wstring> errors; //список ошибок.
	vector <ListingCmdType> vCMD;

	ListingLine() : nLineNum(0)
	{}
};

extern vector <ListingLine> g_Listing;

void Lst_PrepareLine(int PC);
void Lst_AddPrepareLine(int PC, ListType lt);
void Lst_AddPrepareLine2(int len);
void MakeListing(wstring &strName, wstring &strExt);
/*
Генерация листинга делается в 2 этапа
1. при первом проходе собирается информация о строках, и их содержимом.

2. если ошибок нет и мы делаем окончательную компоновку, генерируется
листинг, данные берутся из массива скомпиленных данных и выводятся
в отформатированном виде в зависимости от типа команды в строке.

*/
