#pragma once

#include "RegDumpDocPaneDlgViewHelper.h"

constexpr auto CUSTOMVIEW_REGS_NUM = 2;
namespace CUSTOMVIEW_MODE
{
	enum CUSTOMVIEW_MODE : int
	{
		DEC = 0,
		HEX
	};
}

struct CUSTOMVIEW_MODE_PARAM
{
	CUSTOMVIEW_MODE::CUSTOMVIEW_MODE mode;
	UINT strID;
};



// номера колонок для listCPU
namespace LISTCPU_C
{
	enum LISTCPU_C : int
	{
		NAME = 0,
		VALUE,
		CUSTOM
	};
}

// номера строк для listCPU
namespace LISTCPU_L
{
	enum LISTCPU_L : int
	{
		R0 = 0,
		R1,
		R2,
		R3,
		R4,
		R5,
		SP,
		PC,
		PSW,
		NUM
	};
}

// номера колонок для listSys
namespace LISTSYS_C
{
	enum LISTSYS_C : int
	{
		NAME1 = 0,
		VALUE1,
		NAME2,
		VALUE2
	};
}

// номера строк для listSys, колонки 0,1
namespace LISTSYS_L1
{
	enum LISTSYS_L1 : int
	{
		REG177660 = 0,
		REG177662IN,
		REG177662OUT,
		REG177664,
		REG177714IN,
		REG177714OUT,
		REG177716IN,
		REG177716OUT_TAP,
		REG177716OUT_MEM,
		NUM
	};
}

// номера строк для listSys, колонки 2,3
namespace LISTSYS_L2
{
	enum LISTSYS_L2 : int
	{
		REG177700 = 0,
		REG177702,
		REG177704,
		REG177706,
		REG177710,
		REG177712
	};
}

class CRegDumpViewCPU : public CRegDumpDocPaneDlgViewHelper
{
		DECLARE_DYNAMIC(CRegDumpViewCPU)


		CMultiEditListCtrl  m_listCPU;
		CMultiEditListCtrl  m_listSys;

		static const int m_pListSysRegs[2][LISTSYS_L1::NUM];

		int             m_nCurrentCVM; // индекс текущего режима
		static CUSTOMVIEW_MODE_PARAM m_cvArray[CUSTOMVIEW_REGS_NUM]; // в этом массиве

		int             m_nCurrCPUFreq;
		CSpinButtonCtrl m_spinCPUFreq;

	public:
		enum { IDD = IDD_REGDUMP_CPU_DLG };
		CRegDumpViewCPU();
		virtual ~CRegDumpViewCPU() override;

		void            SetFreqParam();
		void            UpdateFreq();
		void            DisplayRegDump();

	protected:
		void            DisplayPortRegs();
		void            DisplayRegisters();
		void            SetPSW(const uint16_t value);
		uint16_t        GetPSW(CString &strPSW);
		CString         FormatPSW(const uint16_t value);
		CString         WordToCustom(const uint16_t value);
		uint16_t        CustomToWord(const CString &str);

		// Generated message map functions
		virtual void    DoDataExchange(CDataExchange *pDX) override;    // DDX/DDV support

		afx_msg LRESULT HandleInitDialog(WPARAM wp, LPARAM lp);
		afx_msg void    OnLvnItemchangedMdCpuRegisters(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void    OnLvnItemchangedMdSysRegisters(NMHDR *pNMHDR, LRESULT *pResult);
		afx_msg void    OnEnChangeEditDbg1Cpufreq();
		afx_msg void    OnBnClickedButtonDbg1CpufreqDec();
		afx_msg void    OnBnClickedButtonDbg1CpufreqInc();
		afx_msg void    OnBnClickedButtonDbg1CpufreqBaseset();
		afx_msg void    OnBnClickedButtonDbg1CpufreqMaxset();
		afx_msg void    OnBnClickedRegdumpCvmode();
		afx_msg void    OnUpdateButtonDbg1CpufreqDec(CCmdUI *pCmdUI);
		afx_msg void    OnUpdateButtonDbg1CpufreqInc(CCmdUI *pCmdUI);
		afx_msg void    OnUpdateButtonDbg1CpufreqMaxset(CCmdUI *pCmdUI);
		afx_msg void    OnUpdateButtonDbg1CpufreqBaseset(CCmdUI *pCmdUI);
		afx_msg void    OnUpdateRegdumpCvmode(CCmdUI *pCmdUI);
		DECLARE_MESSAGE_MAP()
};

