#pragma once

/////////////////////////////////////////////////////////////////////////////////
// область определений

/////////////////////////////////////////////////////////////////////////////////
// перечисление всех регистров

// регистры DMA
constexpr auto REG_DMA_CSR      = 0177160; // регистр управления DMA
constexpr auto REG_DMA_MEM      = 0177162; // регистр адреса страницы с которой будем читать с дискретностью 10000 (4кБ)
constexpr auto REG_DMA_LEN_HI   = 0177164; // старшая часть длины - 8бит
constexpr auto REG_DMA_LEN_LO   = 0177166; // младшая часть длины - 16бит
constexpr auto REG_DMA_PGNUM    = 0177170; // номер текущей страницы воспроизведения
// регистры AY
constexpr auto REG_AY_ADR1      = 0177172; // адрес AY1
constexpr auto REG_AY_DAT1      = 0177173; // данные AY1
constexpr auto REG_AY_ADR2      = 0177174; // адрес AY2
constexpr auto REG_AY_DAT2      = 0177175; // данные AY2
// регистры COVOX
constexpr auto REG_CVX_L16      = 0177200; // 16bit левый канал COVOX
constexpr auto REG_CVX_R16      = 0177202; // 16bit правый канал COVOX
constexpr auto REG_CVX_M16      = 0177204; // 16bit моно COVOX, иначе говоря, запись в этот регистр приводит к фактической одновременной записи в регистры 177200 и 177202
constexpr auto REG_CVX_LR8      = 0177206; // 8bit стерео / mono COVOX, иначе говоря, запись в этот регистр приводит к фактической одновременной записи в регистры 177200 и 177202 - в старший байт
constexpr auto REG_CVX_CSR      = 0177212; // регистр управления звуком COVOX
// регистры STM, управление контроллером
constexpr auto REG_CSR          = 0177220;
constexpr auto REG_DR           = 0177222;
constexpr auto REG_BR1          = 0177224;
constexpr auto REG_BR2          = 0177226;
// регистры экрана
constexpr auto REG_SCR_CSR      = 0177230; // регистр управления режимами экрана
constexpr auto REG_SCR_PGNUM    = 0177232; // регистр номера страницы начала отображения экрана (верхний слой)
constexpr auto REG_SCR_SPR_PGNUM= 0177240; // регистр номера страницы начала отображения экрана (средний слой)
constexpr auto REG_SCR_BGF_PGNUM= 0177242; // регистр номера страницы начала отображения экрана (нижний слой)
constexpr auto REG_SCR_FRMTRP	= 0177244; // регистр управления кадровыми прерываниями
constexpr auto REG_SCR_VSCRL	= 0177250; // регистр вертикального скроллинга (дублирует 177664)
// регистры палитры
constexpr auto REG_PAL_CELL     = 0177234; // адрес ячейки палитры [9бит]
constexpr auto REG_PAL_VAL      = 0177236; // значение палитры [15бит]

// регистры маппера памяти
constexpr auto REG_MMU_PG00     = 0177300; // 000000     16 регистров маппера.На каждый сегмент по 4 Кб
constexpr auto REG_MMU_PG01     = 0177302; // 010000
constexpr auto REG_MMU_PG02     = 0177304; // 020000
constexpr auto REG_MMU_PG03     = 0177306; // 030000
constexpr auto REG_MMU_PG04     = 0177310; // 040000
constexpr auto REG_MMU_PG05     = 0177312; // 050000
constexpr auto REG_MMU_PG06     = 0177314; // 060000
constexpr auto REG_MMU_PG07     = 0177316; // 070000
constexpr auto REG_MMU_PG08     = 0177320; // 100000
constexpr auto REG_MMU_PG09     = 0177322; // 110000
constexpr auto REG_MMU_PG10     = 0177324; // 120000
constexpr auto REG_MMU_PG11     = 0177326; // 130000
constexpr auto REG_MMU_PG12     = 0177330; // 140000
constexpr auto REG_MMU_PG13     = 0177332; // 150000
constexpr auto REG_MMU_PG14     = 0177334; // 160000
constexpr auto REG_MMU_PG15     = 0177336; // 170000
constexpr auto REG_MMU_MNT      = 0177340; // регистр маски окон маппера(вкл. / выкл.).
constexpr auto REG_MMU_ACS      = 0177342; // регистр - маска режима доступа к окну(1 - ro / 0 - rw).
constexpr auto REG_MMU_SHADOW   = 0177344; // регистр управления shadow режимом 177344 R/W
constexpr auto REG_MMU_CSR      = 0177346; // регистр управления контроллером памяти
											// TODO: полностью переделать
// Регистры-копии данных, доступны только по чтению
constexpr auto REG_MMU_AZ_130   = 0177350; //R/O - регистр копия по записи 177130 в режиме записи управления памятью в SMK
constexpr auto REG_MMU_AZ_716   = 0177352; //R/O - регистр копия по записи 177716 в режиме записи управления памятью в БК11М

// непонятный регистр
constexpr auto REG_VERS         = 0177370; // регистр версии контроллера / прошивки контроллера
// регистр RND
constexpr auto REG_RND          = 0177550; // регистр RND
// регистры UART
constexpr auto REG_TKS          = 0177560; // UART : регистр статуса приёмника
constexpr auto REG_TKB          = 0177562; // UART : регистр управления + регистр принятых данных
constexpr auto REG_TPS          = 0177564; // UART : регистр статуса передатчика
constexpr auto REG_TPB          = 0177566; // UART : регистр данных на передачу

/////////////////////////////////////////////////////////////////////////////////
// флаги регистра 177346
constexpr uint16_t AZ_MMU_SMK_WND1_ENA = (1 << 15); // бит 15 - R/W - =1 отключение окна 1 в БК11М, транслируется из эмуляции SMK
													// и в зависимости от типа доработки будет подаваться как сигнал на А22 или как переключение окон 11М
constexpr uint16_t AZ_MMU_WND1_REVTYPE = (1 << 14); // бит 14 - R/O - тип доработки, результат автоопределения в ПЛИС
													// = 0 доработка окна 1 или нет доработки
													// = 1 доработка с управлением 037й
constexpr uint16_t AZ_MMU_SMK_WND1_REV = (1 << 13); // бит 13 - R/W - наличие работоспособной доработки окна1
													// = 1 - работает отключение окна 1 традиционным методом через оттягивание выхода TM9 на землю
													// = 0 - доработки нет
													// проверяется и устанавливается программно
													// но сбрасывается в 0 при установке бита 14 - см выше
constexpr uint16_t AZ_MMU_BRDTYPE	   = (1 << 12); // бит 12 - R/W - тип БКшки =0 это 11М, дефолтное состояние  =1 это 10ка
													// проверяется и устанавливается программно стартовым ПЗУ
constexpr uint16_t AZ_MMU_BK11EMU_ENA  = (1 << 11); // бит 11 - R/W - включение эмуляции БК11М = 1 включено
													// эта опция может быть активирована только при наличии = 1 в бите 12
													// (при = 0 в бите 12 - игнорируется)
constexpr uint16_t AZ_MMU_014_OFF	   = (1 << 10);	// бит 10 - R/W - ответ на 177660 - 663 строб 014й = 1 отключение
													// а именно эмуляцию 014й
													// те уже пойдет RPLY от AZ на адресах 177660 - 663
													// при 14 бите = 0 опция не работает
constexpr uint16_t AZ_MMU_037_OFF	   = (1 << 9);	// бит 9 - R/W - RAM окно памяти с 0 до 77777 (технически это и окно 100000 до 137777)
													// в отключенном режиме(= 1) на 037ую не проходят запросы с адресов с 0 до 77777
													// соответственно и 037ая никак не отвечает и не принимает данные на запись
													// соответственно эта опция включает RPLY на маппере БК11М, а также возможность
													// читать из маппера !!!при 14 бите = 0 опция не работает
constexpr uint16_t AZ_MMU_BK11ROM_EMU  = (1 << 5);	// бит 5 - управление эмуляцией ПЗУ в БК11М =1 включить
constexpr uint16_t AZ_MMU_V100_ON	   = (1 << 3);	// бит 3 - =1 включить таймер 100й вектор
constexpr uint16_t AZ_MMU_50HZ_TIMER   = (1 << 2);	// бит 2 - =1 50Hz =0 60Hz кадровый таймер

