/*************************************************
*           BK Emulator v3.8 for Windows         *
*************************************************/

/*
File: Defines.h
Version: 1.0.0
Written by: Yuriy Kalmykov <kalmykov@stoik.com>
    Copyright (c) 2002-2004 Yuriy Kalmykov

    BK Emulator is a program emulated hardware environment for running
code for BK 0010(01) in different configurations.

    This code may be used in compiled form in any way you desire.
This file or it's parts can't be redistributed without the authors
written consent, but can be modified for your private needs.
    Providing that this notice and the authors name and all copyright
notices remains intact.

    Please, an email me to know how you are using it and where. You can
ask me for any information about this below code or any attendant
knowledge.

    This file is provided "as is" with no expressed or implied warranty.
The author accepts no liability for any damage or loss of business that
this product may cause.
*/


#pragma once

//#define WM_BREAKPOINT         (WM_USER + 100)
#define WM_DEBUG_ADDRESS_UPDATE   (WM_USER + 101)
#define WM_ENTEREDIT_VALUE_UPDATE (WM_USER + 102)
#define WM_RECEIVE_CMD_STRING   (WM_USER + 103)
#define WM_TAPE_FILE_LOAD       (WM_USER + 104)
#define WM_CPU_DEBUGBREAK       (WM_USER + 105)
#define WM_MEMDUMP_NEED_UPDATE  (WM_USER + 106)
//TapeManagerDlg
#define WM_BUFFER_READY         (WM_USER + 107)
#define WM_INFO_READY           (WM_USER + 108)
//Карта памяти
#define WM_MEMMAP_CLOSE         (WM_USER + 109)
//Droptarget
#define WM_DROP_TARGET          (WM_USER + 110)
//Виртуальная клавиатура
#define WM_VKBD_DOWN            (WM_USER + 111)
#define WM_VKBD_UP              (WM_USER + 112)

// Timers
#define BKTIMER_UI_REFRESH      1
#define BKTIMER_SET_TITLE       2

//сколько фреймов в секунду. оказалось, что 25 всё же лучше, чем 50.
#define CPU_FRAMES_PER_SECOND   25

//тактовая частота
#define CPU_SPEED_BK11          4000000
#define CPU_SPEED_BK10          3000000

#define SCRIPT_START_DELAY      5.0

//адрес с которого начинаются порты, если к МПИ ничего не подключено
#define BK_PURE_PORTSIO_AREA    0177600
//адрес с которого начинаются порты, если к МПИ что-нибудь подключено
#define BK_PORTSIO_AREA         0177000

//определения для звука
typedef short SAMPLE_TYPE;
#define BUFFER_CHANNELS 2
#define SAMPLE_LENGTH (BUFFER_CHANNELS * (int)sizeof(SAMPLE_TYPE))
#define BUFFER_BPS (8 * sizeof(SAMPLE_TYPE))
#define FLOAT_BASE 65536.0
#define FLOAT_BASE_HALF 32768.0
enum    {MIN_SAMPLE = 0, AVG_SAMPLE = 0x4000, MAX_SAMPLE = 0x7fff};


/*
цвета               R G B
по таблице Kisser'a, по его сведениям, красный это 100%, тёмно-красный - 33% красного, красно-коричневый - 66% красного
красный             ff0000
зелёный             00ff00
синий               0000ff
сиреневый           ff00ff - magenta
жёлтый              ffff00
голубой             00ffff - cyan
белый               ffffff
тёмно-красный       550000
красно-коричневый   aa0000
салатовый           55ff00
светло-зелёный      aaff00
фиолетовый          5500ff
фиолетово-синий     aa00ff
это цвета, которые имеют цифровое значение исходя из своей логики.
т.е. красно-коричневый на самом деле светлее тёмно-красного. Но на БК11 с палитрами 06-10
какая-то неразбериха. Цвета 01 и 10 поменяны местами, поэтому в дефинициях ниже значения тоже поменяны местами.
фиолетовый  5500ff выглядит слишком синим, поэтому ему задано значение 7000ff.
тёмно-красный 550000 слишком тёмный, поэтому ему задано значение 700000
*/

#define Color_Black         0x000000
#define Color_Red           0xff0000
#define Color_Green         0x00ff00
#define Color_Blue          0x0000ff
#define Color_Yellow        0xffff00
#define Color_Cyan          0x00ffff
#define Color_Magenta       0xff00ff
#define Color_DarkRed       0xaa0000
#define Color_RedBrown      0x700000
#define Color_Violet        0xaa00ff
#define Color_VioletBlue    0x7000ff
#define Color_LightGreen    0x55ff00
#define Color_Salatovyi     0xaaff00
#define Color_White         0xffffff


static const DWORD  g_pColorPalettes[16][4] =
{
	//                                                            Palette#     01           10          11
	Color_Black, Color_Blue, Color_Green, Color_Red,                // 00    синий   |   зеленый  |  красный
	Color_Black, Color_Yellow, Color_Magenta, Color_Red,            // 01   желтый   |  сиреневый |  красный
	Color_Black, Color_Cyan, Color_Blue, Color_Magenta,             // 02   голубой  |    синий   | сиреневый
	Color_Black, Color_Green, Color_Cyan, Color_Yellow,             // 03   зеленый  |   голубой  |  желтый
	Color_Black, Color_Magenta, Color_Cyan, Color_White,            // 04  сиреневый |   голубой  |   белый
	Color_Black, Color_White, Color_White, Color_White,             // 05    белый   |    белый   |   белый
	Color_Black, Color_DarkRed, Color_RedBrown, Color_Red,          // 06  темн-красн| красн-корич|  красный    !
	Color_Black, Color_Salatovyi, Color_LightGreen, Color_Yellow,   // 07  салатовый | светл-зелен|  желтый     !
	Color_Black, Color_Violet, Color_VioletBlue, Color_Magenta,     // 08  фиолетовый| фиол-синий | сиреневый   !
	Color_Black, Color_LightGreen, Color_VioletBlue, Color_RedBrown,// 09 светл-зелен| фиол-синий |красн-корич  !
	Color_Black, Color_Salatovyi, Color_Violet, Color_DarkRed,      // 10  салатовый | фиолетовый |темн-красный !
	Color_Black, Color_Cyan, Color_Yellow, Color_Red,               // 11   голубой  |   желтый   |  красный
	Color_Black, Color_Red, Color_Green, Color_Cyan,                // 12   красный  |   зеленый  |  голубой
	Color_Black, Color_Cyan, Color_Yellow, Color_White,             // 13   голубой  |   желтый   |   белый
	Color_Black, Color_Yellow, Color_Green, Color_White,            // 14   желтый   |   зеленый  |   белый
	Color_Black, Color_Cyan, Color_Green, Color_White               // 15   голубой  |   зеленый  |   белый
};

//0,1,2,3
static const DWORD  g_pMonochromePalette[2][4] =
{
	Color_Black, Color_White, Color_Black, Color_White,
	Color_Black, Color_Black, Color_White, Color_White
};

static const DWORD  g_pAdaptMonochromePalette[2][4] =
{
	Color_Black, 0x555555, 0xa9a9a9, Color_White,
	Color_Black, 0x555555, 0xa9a9a9, Color_White
};

// Interrups
#define NO_INTERRUPT    0000
#define INTERRUPT_4     0004
#define INTERRUPT_10    0010
#define INTERRUPT_14    0014
#define INTERRUPT_20    0020
#define INTERRUPT_24    0024
#define INTERRUPT_30    0030
#define INTERRUPT_34    0034
#define INTERRUPT_60    0060
#define INTERRUPT_100   0100
#define INTERRUPT_270   0270
#define INTERRUPT_274   0274

// Commands

// No fields
#define PI_HALT         0000000
#define PI_WAIT         0000001
#define PI_RTI          0000002
#define PI_BPT          0000003
#define PI_IOT          0000004
#define PI_RESET        0000005
#define PI_RTT          0000006
#define PI_MFPT         0000007
#define PI_START10      0000010
#define PI_START11      0000011
#define PI_START12      0000012
#define PI_START13      0000013
#define PI_STEP14       0000014
#define PI_STEP15       0000015
#define PI_STEP16       0000016
#define PI_STEP17       0000017
#define PI_NOP          0000240
#define PI_CLC          0000241
#define PI_CLV          0000242
#define PI_CLVC         0000243
#define PI_CLZ          0000244
#define PI_CLZC         0000245
#define PI_CLZV         0000246
#define PI_CLZVC        0000247
#define PI_CLN          0000250
#define PI_CLNC         0000251
#define PI_CLNV         0000252
#define PI_CLNVC        0000253
#define PI_CLNZ         0000254
#define PI_CLNZC        0000255
#define PI_CLNZV        0000256
#define PI_CCC          0000257
#define PI_NOP260       0000260
#define PI_SEC          0000261
#define PI_SEV          0000262
#define PI_SEVC         0000263
#define PI_SEZ          0000264
#define PI_SEZC         0000265
#define PI_SEZV         0000266
#define PI_SEZVC        0000267
#define PI_SEN          0000270
#define PI_SENC         0000271
#define PI_SENV         0000272
#define PI_SENVC        0000273
#define PI_SENZ         0000274
#define PI_SENZC        0000275
#define PI_SENZV        0000276
#define PI_SCC          0000277

// One field
#define PI_RTS          0000200
#define PI_FADD         0075000
#define PI_FSUB         0075010
#define PI_FMUL         0075020
#define PI_FDIV         0075030

// Two fields
#define PI_JMP          0000100
#define PI_SWAB         0000300
#define PI_CLR          0005000
#define PI_COM          0005100
#define PI_INC          0005200
#define PI_DEC          0005300
#define PI_NEG          0005400
#define PI_ADC          0005500
#define PI_SBC          0005600
#define PI_TST          0005700
#define PI_ROR          0006000
#define PI_ROL          0006100
#define PI_ASR          0006200
#define PI_ASL          0006300
#define PI_MARK         0006400
#define PI_MFPI         0006500
#define PI_MTPI         0006600
#define PI_SXT          0006700
#define PI_MTPS         0106400
#define PI_MFPD         0106500
#define PI_MTPD         0106600
#define PI_MFPS         0106700
// Branchs & interrupts
#define PI_BR           0000400
#define PI_BNE          0001000
#define PI_BEQ          0001400
#define PI_BGE          0002000
#define PI_BLT          0002400
#define PI_BGT          0003000
#define PI_BLE          0003400
#define PI_BPL          0100000
#define PI_BMI          0100400
#define PI_BHI          0101000
#define PI_BLOS         0101400
#define PI_BVC          0102000
#define PI_BVS          0102400
#define PI_BHIS         0103000
#define PI_BLO          0103400

#define PI_EMT          0104000
#define PI_TRAP         0104400

// Three fields
#define PI_JSR          0004000
#define PI_XOR          0074000
#define PI_SOB          0077000
#define PI_MUL          0070000
#define PI_DIV          0071000
#define PI_ASH          0072000
#define PI_ASHC         0073000

// Four fields
#define PI_MOV          0010000
#define PI_CMP          0020000
#define PI_BIT          0030000
#define PI_BIC          0040000
#define PI_BIS          0050000
#define PI_ADD          0060000
#define PI_SUB          0160000

// BK Key codes
#define BKKEY_SHAG      0000000
#define BKKEY_POVT      0000001
#define BKKEY_INDSU     0000002
#define BKKEY_KT        0000003
#define BKKEY_BLOKRED   0000004
#define BKKEY_GRAF      0000005
#define BKKEY_ZAP       0000006
#define BKKEY_STIR      0000007
#define BKKEY_L_ARROW   0000010
#define BKKEY_TAB       0000011
#define BKKEY_ENTER     0000012
#define BKKEY_RGTDEL    0000013
#define BKKEY_SBR       0000014
#define BKKEY_USTTAB    0000015
#define BKKEY_RUS       0000016
#define BKKEY_LAT       0000017
#define BKKEY_SBRTAB    0000020
#define BKKEY_VS        0000023
#define BKKEY_GT        0000024
#define BKKEY_SDVIG     0000026
#define BKKEY_RAZDVIG   0000027
#define BKKEY_ZAB       0000030
#define BKKEY_R_ARROW   0000031
#define BKKEY_U_ARROW   0000032
#define BKKEY_D_ARROW   0000033
#define BKKEY_PROBEL    0000040

//определения для типа дисковода и типа бкшки
typedef enum BK_FDD_MODEL {DEV_FDD_NONE = -1, DEV_FDD_STD = 0, DEV_FDD_A16M, DEV_FDD_SMK512};
typedef enum BK_MODEL {BK_0010 = 10, BK_0011, BK_0011M};

//макросы
#ifndef SAFE_DELETE
#define SAFE_DELETE(p)       { if (p) { delete (p);     (p)=NULL; } }
#endif
#ifndef SAFE_DELETE_ARRAY
#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p);   (p)=NULL; } }
#endif
#ifndef SAFE_DELETE_OBJECT
#define SAFE_DELETE_OBJECT(p)   { if (p) { DeleteObject(p); (p)=NULL; } }
#endif
#ifndef SAFE_RELEASE
#define SAFE_RELEASE(p)      { if (p) { (p)->Release(); (p)=NULL; } }
#endif
#ifndef SAFE_RELEASE_C
#define SAFE_RELEASE_C(p)      { if (p) { (p).Release(); } }
#endif



