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

#pragma once

//#include <afxtempl.h>

#include "Device.h"
#include "BKMPIDevice.h"

#define BRD_10_MON10_BNK     4
#define BRD_10_BASIC10_1_BNK 5
#define BRD_10_BASIC10_2_BNK 6
#define BRD_10_BASIC10_3_BNK 7

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

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

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

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

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

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

		// Методы Set/Get byte/word - выход: false - надо делать throw
		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;

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

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

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

/*
    Организация массива памяти
    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---- бейсик и регистры

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