// BK001001.h: interface for the CBK001001 class.
//

#pragma once

#include "BKMPIDevice.h"

constexpr auto BRD_10_MON10_BNK     = 4;
constexpr auto BRD_10_BASIC10_1_BNK = 5;
constexpr auto BRD_10_BASIC10_2_BNK = 6;
constexpr auto BRD_10_BASIC10_3_BNK = 7;
constexpr auto BK1001RomListSize   = 4;

class CBK001001 : public CBKMPIDevice
{
		DECLARE_DYNAMIC(CBK001001)

	public:
		// регистры, публичные, т.к. лень на каждый регистр писать функцию, хотя и можно.
		volatile uint16_t   m_reg177660;
		volatile uint16_t   m_reg177662in;
		volatile uint16_t   m_reg177662out;
		volatile uint16_t   m_reg177664;
		volatile uint16_t   m_reg177714in;
		volatile uint16_t   m_reg177714out;
		volatile uint16_t   m_reg177716in;
		volatile uint16_t   m_reg177716out_tap;
		volatile uint16_t   m_reg177716out_mem;

	protected:
		uint16_t            m_nStartAddr;       // адрес запуска материнской платы
		virtual void        MemoryManager() override;
		virtual bool        OnInitDevice() override;

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

		virtual BK_DEV_MPI GetBoardModel() const override
		{
			return BK_DEV_MPI::BK001001;
		}

		virtual bool        Interception(const uint16_t nPC) const; // Вызывается после каждой команды, для перехвата функций

		virtual void        StopInterrupt() const;
		virtual void        UnStopInterrupt() const;
		virtual int         GetScreenPage() const;    // получение номера страницы экрана
		virtual void        ChangePalette() const {}
		virtual bool        InitDevice(const uint16_t addrStart) override;
		virtual void        ResetCold(const uint16_t addrMask);

		// Виртуальные методы, вызываемые из команды reset
		virtual void        OnReset() override;

		// Методы Set/Get byte/word - выход: false - надо делать throw
		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        SetSystemRegister(const uint16_t addr, uint16_t src, UINT dwFlags = 0) override;
		virtual bool        GetSystemRegister(const uint16_t addr, void *pDst, UINT dwFlags = 0) override;

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

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

		virtual void        SetMemPages(const int pg0, const int pg1) {}
		virtual void        RestoreMemPages() {}
};

/*
    Организация массива памяти
    32кб: ОЗУ
    000000--банк 0 ---страница 0 --- ОЗУ
    020000--банк 1 ---страница 1 --- ОЗУ
    040000--банк 2 ---страница 2 --- ОЗУ
    060000--банк 3 ---страница 3 --- ОЗУ
    32кб: ПЗУ
    100000--банк 4 ---страница 4 --- монитор MONIT10.ROM
    120000--банк 5 ---страница 5---- бейсик Basic10_1.rom
    140000--банк 6 ---страница 6 --- бейсик Basic10_2.rom
    160000--банк 7 ---страница 7---- бейсик и регистры

    ничего никуда не ремапится
*/
