// rev 1.00
// VM1CPPDlg.h : файл заголовка
//

#pragma once

#include "tboard.h"
#include "resource.h"
#include "LockVarType.h"
#include "Defines.h"
#include "DumpListCtrl.h"
#include "EnterEditCtrl.h"

uint16_t OctStringToWord(const CString &str);
CString WordToOctString(uint16_t word);
CString ByteToOctString(uint8_t byte);

//таблица соответствия верхней половины аскии кодов с 128 по 255, включая псевдографику
static const TCHAR koi8tbl[128] =
{
	//{200..237} этих символов на бк нету.
	_T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
	_T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
	_T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
	_T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '), _T(' '),
	//{240..277}
	0xb6, 0x2534, 0x2665, 0x2510, 0x2561, 0x251c, 0x2514, 0x2550,
	0x2564, 0x2660, 0x250c, 0x252c, 0x2568, 0x2193, 0x253c, 0x2551,
	0x2524, 0x2190, 0x256c, 0x2191, 0x2663, 0x2500, 0x256b, 0x2502,
	0x2666, 0x2518, 0x256a, 0x2565, 0x2567, 0x255e, 0x2192, 0x2593,
	//{300..337}
	_T('ю'), _T('а'), _T('б'), _T('ц'), _T('д'), _T('е'), _T('ф'), _T('г'),
	_T('х'), _T('и'), _T('й'), _T('к'), _T('л'), _T('м'), _T('н'), _T('о'),
	_T('п'), _T('я'), _T('р'), _T('с'), _T('т'), _T('у'), _T('ж'), _T('в'),
	_T('ь'), _T('ы'), _T('з'), _T('ш'), _T('э'), _T('щ'), _T('ч'), _T('ъ'),
	//{340..377}
	_T('Ю'), _T('А'), _T('Б'), _T('Ц'), _T('Д'), _T('Е'), _T('Ф'), _T('Г'),
	_T('Х'), _T('И'), _T('Й'), _T('К'), _T('Л'), _T('М'), _T('Н'), _T('О'),
	_T('П'), _T('Я'), _T('Р'), _T('С'), _T('Т'), _T('У'), _T('Ж'), _T('В'),
	_T('Ь'), _T('Ы'), _T('З'), _T('Ш'), _T('Э'), _T('Щ'), _T('Ч'), _T('Ъ')
};

struct DISPLAY_MODE_PARAM
{
	DUMP_DISPLAY_MODE mode;
	LPTSTR name;
};
constexpr auto NUMBER_DISPLAY_MODE = 2;

// диалоговое окно CVM1CPPDlg
class CVM1CPPDlg : public CDialog
{
// Создание
	public:
		CVM1CPPDlg(CWnd *pParent = nullptr);   // стандартный конструктор

// Данные диалогового окна
		enum { IDD = IDD_VM1CPP_DIALOG };

		uint16_t GetDebugMemDumpWord(uint16_t dumpAddress);
		uint8_t GetDebugMemDumpByte(uint16_t dumpAddress);

	protected:
		virtual void DoDataExchange(CDataExchange *pDX) override;    // поддержка DDX/DDV


// Реализация
	protected:
		HICON m_hIcon;
		BOOL        m_bPause;           //флаг нажатия кнопки "пауза"
		bool        m_bFirstStep;       //для потактовой отладки, флаг первичного шага.
		bool        m_bStepPhase;       //фаза полутактовой отладки
		CFont       hFont;

		CDumpListCtrl        m_listMemory;
		CEnterEdit           m_AddrEdit;
		int                 m_currentddm; //индекс текущего режима
		static DISPLAY_MODE_PARAM m_dmarray[NUMBER_DISPLAY_MODE]; //в этом массиве

		tboard      m_Board;
		CDebugger   m_Debugger;

		LockVarType m_lockStarting;   //событие, означающее, что поток работает
		LockVarType m_lockStop;       //событие, что пора завершить работу потока

		//поток, в котором выполняется полезный код
		static UINT AFX_CDECL WorkerThreadWrapper(LPVOID lpParam);
		UINT            WorkerThreadFunc();        //собственно функция
		CWinThread     *m_pWorkerThread;
		void            StopWorkerThread();
		bool            StartWorkerThread();
		void            CleanPause();
		void            DebugOut();
		void            DebugInPLMInterpretator(uint16_t ir, uint16_t mr, CString &strOut);
		void            DebugPLMInterpretator();
		void            DebugPLIInterpretator();
		void            DebugMiscOut();

		// Созданные функции схемы сообщений
		virtual BOOL OnInitDialog() override;
		LRESULT OnDumpAddressChange(WPARAM wParam, LPARAM lParam);
		afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
		afx_msg void OnPaint();
		afx_msg HCURSOR OnQueryDragIcon();
		afx_msg void OnBnClickedButtonStart();
		afx_msg void OnBnClickedButtonStop();
		afx_msg void OnBnClickedCheckPause();
		afx_msg void OnBnClickedButtonClockstep();
		afx_msg void OnBnClickedButtonHalfstep();
		afx_msg void OnDestroy();
		afx_msg LRESULT OnWorkedThreadStopped(WPARAM wParam, LPARAM lParam);
		afx_msg void OnLvnItemchangedMdMemory(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void OnBnClickedButtonDumpMode();
		DECLARE_MESSAGE_MAP()
};
