// BK0011M.h: interface for the CBK0011M class.
//

#pragma once

#include "BK001001.h"

constexpr auto BRD_11_BASIC2_BNK = 16;
constexpr auto BRD_11_BASIC3_BNK = 17;
constexpr auto BRD_11_BASIC1_BNK = 18;
constexpr auto BRD_11_EXT_BNK    = 19;
constexpr auto BRD_11_PG12_1_BNK = 20;
constexpr auto BRD_11_PG12_2_BNK = 21;
constexpr auto BRD_11_PG13_1_BNK = 22;
constexpr auto BRD_11_PG13_2_BNK = 23;
constexpr auto BRD_11_BOS_BNK    = 24;


class CBK0011M : public CBK001001
{
		struct CustomData_t
		{
			bool                bBlockStop; //блокировка кнопки стоп на бк11м, на бк0010 всегда false
			bool                bWnd1Off;   //флаг выключения окна 1 контроллером альтпро
			DWORD               nROMPresent;
		};

	protected:
		CustomData_t        m_sCustom;
		// Initialize memory
		virtual void        MemoryManager() override;

		virtual bool        SetSystemRegister(uint16_t addr, uint16_t src, bool bByteOperation = false) override;

		virtual bool        Interception() override; // Called after each command

		virtual int         GetScreenPage() override;

		virtual bool        InitMemoryModules() override;
		bool                LoadRomModule11(int iniRomNameIndex, int bank);   //загрузка нужного модуля ПЗУ по заданному адресу

	public:
		CBK0011M();
		virtual ~CBK0011M() override;
		virtual BK_BOARD_MODEL  GetBoardModel() override;

		inline void         SetBlockStop(bool status);
		inline bool         GetBlockStop();

		virtual void        StopInterrupt() override;
		virtual void        UnStopInterrupt() override;
		virtual void        ChangePalette() override;
		virtual void        OnReset() override;

		virtual void        Set177716RegMem(uint16_t w) override; //изменение подключённых страниц на БК11
		virtual void        Set177716RegTap(uint16_t w) override; //изменение данных регистра вывода на магнитофон
		virtual void        BasicRomOFF(bool off) override {}   //включение/выключение ПЗУ бейсика БК10
		virtual void        Mon10RomOFF(bool off) override {}   //включение/выключение ПЗУ монитора БК10
		virtual void        BOS11RomOFF(bool off) override;     //включение/выключение ПЗУ БОС БК11(М)
		virtual void        RAM11Wn1OFF(bool off) override;     //включение/выключение ОЗУ окна 1 БК11(М)

		// Методы для загрузки и сохранения состояния эмулятора
		virtual bool        RestoreRegisters(DWORD id, CMSFManager *pMsf) override;
		virtual bool        RestoreCustomData(DWORD id, CMSFManager *pMsf) override;
};

/*
    Организация массива памяти (делается один большой массив, чтобы преобразовывать
    адрес из диапазона 64к, в зависимости от того, какие страницы подключены в окна)
    128кб: ОЗУ
    000000--банк 0 ----страница 0 ---
    020000--банк 1
    040000--банк 2 ----страница 1 ---
    060000--банк 3
    100000--банк 4 ----страница 2 ---
    120000--банк 5
    140000--банк 6 ----страница 3 ---
    160000--банк 7
    200000--банк 8 ----страница 4 ---
    220000--банк 9
    240000--банк 10 ---страница 5 --- экран 0
    260000--банк 11
    300000--банк 12 ---страница 6 --- экран 1
    320000--банк 13
    340000--банк 14 ---страница 7 ---
    360000--банк 15
    80кб: ПЗУ
    400000--банк 16 ---страница 8 --- Бейсик bk11m_328_basic2.rom
    420000--банк 17 ----------------- бейсик bk11m_329_basic3.rom
    440000--банк 18 ---страница 9 --- бейсик bk11m_327_basic1.rom
    460000--банк 19 ----------------- расширение БОС bk11m_325_ext.rom
    500000--банк 20 ---страница 10 -- страница ПЗУ3.1 (по умолчанию - пусто, обращение вызывает прерывание по вектору 4)
    520000--банк 21 ----------------- страница ПЗУ3.2 (по умолчанию - пусто, обращение вызывает прерывание по вектору 4)
    540000--банк 22 ---страница 11 -- страница ПЗУ4.1 (по умолчанию - пусто, обращение вызывает прерывание по вектору 4)
    560000--банк 23 ----------------- страница ПЗУ4.2 (по умолчанию - пусто, обращение вызывает прерывание по вектору 4)
    600000--банк 24 ---страница 12 -- основной БОС bk11m_324_bos.rom
    620000--банк 25 ----------------- пусто (для выравнивания по границе страницы БК11 - 40000)
    640000           ---- конец

    стр 10 - две пустые колодки, куда можно вставить 2 пзушки по 8 кб, в корпусе БК,
            а так же сигнал ПЗУ3 на МПИ
    стр 11 - выбирается внешнее ПЗУ в блоках расширения, сигнал ПЗУ4 на МПИ,
            а так же сигнал для отключения ОКНА1 на БК11


    не стоит забывать, что логический номер страницы и реальный номер (маска) не совпадают.
    страница    маска
    -----------------
    0           6
    1           0
    2           2
    3           3
    4           4
    5           1
    6           7
    7           5

    как делается ремап
    000000 --- банк 0 - страница 0 ------ нет ремапа
    020000 --- банк 1 - страница 0
    040000 --- банк 2 - страница 0..7 --- номер стр. окна 0 * 040000
    060000 --- банк 3 - страница 0..7
    100000 --- банк 4 - страница 0..7 --- номер стр. окна 1 * 040000, или пзу в зависимости от битов
    120000 --- банк 5 - страница 0..7
    140000 --- банк 6 - БОС ------------- банк 24
    160000 --- банк 7 - пусто

    Чтобы не путаться в страницах, страница ОЗУ 8КБ названа банком, а страница - это страница памяти БК11 16кб.
*/
