#pragma once

#include "FDDStd326Mem.h"

#include "HDD.h"

class CFDD_Samara : public CFDDStd326Mem
{
		DECLARE_DYNAMIC(CFDD_Samara)
		struct CustomData_t
		{
			bool b10; // флаг, что подключено к БК10
		};

		CATA_IDE        m_ATA_IDE;
		CustomData_t    m_sCustom;

	protected:
		virtual void        MemoryManager() override;
		virtual bool        OnInitDevice() override;

	public:
		CFDD_Samara();
		virtual ~CFDD_Samara() override;
		virtual bool        InitialSetDevice() override;

		virtual BK_DEV_MPI GetBoardModel() const override
		{
			return BK_DEV_MPI::SAMARA;
		}
		virtual CString  GetBoardName() const override
		{
			return _T("КНГМД Самара");
		}

		// Virtual method called after reset command
		virtual void        OnReset() override;
		// Методы, эмулирующие поведение регистров
		virtual bool        GetSystemRegister(const uint16_t addr, void *pDst, UINT dwFlags = 0) override;
		virtual bool        SetSystemRegister(const uint16_t addr, uint16_t value, UINT dwFlags = 0) override;

		// Methods for Set/Get byte/word
		virtual bool        GetByteT(const uint16_t addr, uint8_t *pValue, int &nTC) override;
		virtual bool        GetWordT(const uint16_t addr, uint16_t *pValue, int &nTC) override;
		virtual bool        SetByteT(const uint16_t addr, uint8_t value, int &nTC) override;
		virtual bool        SetWordT(const uint16_t addr, uint16_t value, int &nTC) override;
		virtual bool        GetByteTInternal(const uint16_t addr, uint8_t *pValue, int &nTC) override;
		virtual bool        GetWordTInternal(const uint16_t addr, uint16_t *pValue, int &nTC) override;
		virtual bool        SetByteTInternal(const uint16_t addr, uint8_t value, int &nTC) override;
		virtual bool        SetWordTInternal(const uint16_t addr, uint16_t value, int &nTC) override;

		virtual bool        RestoreCustomData(DWORD id, CMSFManager *pMsf) override;

		virtual void        DetachDrives() override;
		virtual void        AttachDrives() override;

		bool                WriteHDDRegisters(uint16_t num, uint16_t data);     // запись в регистры HDD
		bool                ReadHDDRegisters(uint16_t num, uint16_t &data);     // чтение из регистров HDD
		bool                ReadHDDRegistersInternal(const uint16_t num, uint16_t &data) const;     // чтение из регистров HDD
		uint16_t            ReadDebugHDDRegisters(const int nDrive, const HDD_REGISTER num, const bool bReadMode) const; // отладочное чтение из регистров HDD
};

