#pragma once
#include "FDD_A16M.h"
#include "HDD.h"

constexpr auto ALTPRO_SMK_SYS_MODE   = 0160;
constexpr auto ALTPRO_SMK_STD10_MODE = 060;
constexpr auto ALTPRO_SMK_OZU10_MODE = 0120;
constexpr auto ALTPRO_SMK_ALL_MODE   = 020;
constexpr auto ALTPRO_SMK_STD11_MODE = 0140;
constexpr auto ALTPRO_SMK_OZU11_MODE = 040;
constexpr auto ALTPRO_SMK_HLT10_MODE = 0100;
constexpr auto ALTPRO_SMK_HLT11_MODE = 0;

constexpr auto ALTPRO_SMK_FDDROM_BNK = 128;


class CFDD_SMK512 :
	public CFDD_A16M
{
	protected:
		CATA_IDE            m_ATA_IDE;
		BKMEMBank_t         m_IOSegment;    // тут будет задаваться статус участка памяти 177000-177777

		virtual bool        InitMemoryModules(const BoardRomList_t arrBoardRomList[], int size) override;

		void                SetBank(int nModeNumber, int nBaseSegment);
		virtual void        OnLoadRomModule(int nSize, int nBank) override;
		virtual void        MemoryManager() override;
		virtual bool        OnInitDevice() override;

	public:
		CFDD_SMK512();
		virtual ~CFDD_SMK512() override;
		virtual BK_DEV_MPI  GetBoardModel() override;

		// Virtual method called after reset command
		virtual void        OnReset() override;

		// Методы, эмулирующие поведение регистров
		virtual bool        GetSystemRegister(register uint16_t addr, register void *pDst, register bool bByteOperation = false) override;
		virtual bool        SetSystemRegister(register uint16_t addr, register uint16_t value, register bool bByteOperation = false) override;

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

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


/*
Распределение памяти.
512кБ банков по 4кБ + 8кб ПЗУ

0000000--банк 0  ---страница  0, сегмент 0 ОЗУ
0010000--банк 1  ---страница  0, сегмент 1 ОЗУ
0020000--банк 2  ---страница  0, сегмент 2 ОЗУ
0030000--банк 3  ---страница  0, сегмент 3 ОЗУ
0040000--банк 4  ---страница  0, сегмент 4 ОЗУ
0050000--банк 5  ---страница  0, сегмент 5 ОЗУ
0060000--банк 6  ---страница  0, сегмент 6 ОЗУ
0070000--банк 7  ---страница  0, сегмент 7 ОЗУ
0100000 -банк 8  ---страница  1, сегмент 0 ОЗУ
0200000 -банк 16 ---страница  2, сегмент 0 ОЗУ
0300000 -банк 24 ---страница  3, сегмент 0 ОЗУ
0400000 -банк 32 ---страница  4, сегмент 0 ОЗУ
0500000 -банк 40 ---страница  5, сегмент 0 ОЗУ
0600000 -банк 48 ---страница  6, сегмент 0 ОЗУ
0700000 -банк 56 ---страница  7, сегмент 0 ОЗУ
1000000--банк 64 ---страница  8, сегмент 0 ОЗУ
1100000 -банк 72 ---страница  9, сегмент 0 ОЗУ
1200000 -банк 80 ---страница 10, сегмент 0 ОЗУ
1300000 -банк 88 ---страница 11, сегмент 0 ОЗУ
1400000 -банк 96 ---страница 12, сегмент 0 ОЗУ
1500000 -банк 104---страница 13, сегмент 0 ОЗУ
1600000 -банк 112---страница 14, сегмент 0 ОЗУ
1700000 -банк 120---страница 15, сегмент 0 ОЗУ
2000000--банк 128------ПЗУ ----------
2010000--банк 129---резерв на случай 8КБ ПЗУ
2020000--конец

*/
