Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. #include "std.h"
  2.  
  3. #include "emul.h"
  4. #include "vars.h"
  5. #include "debug.h"
  6. #include "memory.h"
  7. #include "gsz80.h"
  8. #include "z80.h"
  9. #include "util.h"
  10. #include "sndrender/sndcounter.h"
  11. #include "sound.h"
  12.  
  13. //=============================================================================
  14. namespace z80fast
  15. {
  16. #include "z80_main.h"
  17. }
  18. //=============================================================================
  19. int fmsoundon0 = 4;     //Alone Coder
  20. int tfmstatuson0 = 2;   //Alone Coder
  21. char pressedit = 0;     //Alone Coder
  22. //=============================================================================
  23. void __fastcall wmdbg( u32 addr, u8 val);
  24. u8 __fastcall rmdbg( u32 addr);
  25. u8 *__fastcall MemDbg( u32 addr);
  26. void __cdecl BankNames( int i, char *Name);
  27. //=============================================================================
  28. namespace z80dbg
  29. {
  30.     void Z80FAST step();
  31.     __int64 __cdecl delta();
  32.     void __cdecl SetLastT();
  33. }
  34. //=============================================================================
  35. #pragma pack(8)
  36.  
  37. void out( unsigned port, unsigned char val);
  38. unsigned char in( unsigned port);
  39.  
  40. //=============================================================================
  41. Z80INLINE unsigned char m1_cycle( Z80 *cpu)
  42. {
  43. //  cpu->r_low++; cpu->t += 4;          //0.39.0
  44. //  return cpu->MemIf->xm(cpu->pc++);
  45.  
  46.     unsigned char temp_op_code;         //NEDOREPO
  47.     cpu->r_low++;
  48.     cpu->t += 4;
  49.     temp_op_code = cpu->MemIf->xm( cpu->pc++);
  50.     //-------------------------------------------------------------------------
  51.     if ((conf.mem_model == MM_ATM3) && (comp.pBE) && cpu->nmi_in_progress)
  52.     {
  53.         if (comp.pBE == 1)
  54.         {
  55.             if (trdos_in_nmi)
  56.             {
  57.                 comp.flags |= CF_SETDOSROM | CF_TRDOS;
  58.             }
  59.             cpu->nmi_in_progress = false;
  60.             set_banks();
  61.         }
  62.         comp.pBE--;
  63.     }
  64.     //-------------------------------------------------------------------------
  65.     return temp_op_code;                //NEDOREPO
  66. }
  67. //=============================================================================
  68. /*
  69. unsigned char TMainZ80::rm(unsigned addr)
  70. {
  71.     return z80fast::rm(addr);
  72. }
  73. unsigned char TMainZ80::dbgrm(unsigned addr)
  74. {
  75.     return ::rmdbg(addr);
  76. }
  77. void TMainZ80::wm(unsigned addr, unsigned char val)
  78. {
  79.     z80fast::wm(addr, val);
  80. }
  81. void TMainZ80::dbgwm(unsigned addr, unsigned char val)
  82. {
  83.     ::wmdbg(addr, val);
  84. }
  85. */
  86. //=============================================================================
  87. u8 *TMainZ80::DirectMem(unsigned addr) const
  88. {
  89.     return am_r(addr);
  90. }
  91. //=============================================================================
  92. unsigned char TMainZ80::m1_cycle()
  93. {
  94.     return ::m1_cycle(this);
  95. }
  96. //=============================================================================
  97. unsigned char TMainZ80::in(unsigned port)
  98. {
  99.     return ::in(port);
  100. }
  101. //=============================================================================
  102. void TMainZ80::out(unsigned port, unsigned char val)
  103. {
  104.     ::out(port, val);
  105. }
  106. //=============================================================================
  107. u8 TMainZ80::IntVec()
  108. {
  109.     return (comp.flags & CF_Z80FBUS)  ? u8(rdtsc() & 0xFF) :
  110.                                         0xFF;
  111. }
  112. //=============================================================================
  113. void TMainZ80::CheckNextFrame()
  114. {
  115.     if (t >= conf.frame)
  116.     {
  117.         comp.t_states += conf.frame;
  118.         t -= conf.frame;
  119.         eipos -= conf.frame;
  120.         comp.frame_counter++;
  121.         int_pend = true;
  122.     }
  123. }
  124. //=============================================================================
  125. void TMainZ80::retn()
  126. {
  127. //  nmi_in_progress = false;    //╟└╩╬╠┼═╥╚╦╚ ┬ NEDOREPO
  128. //  set_banks();                //┼╤╥▄ ┬ 0.39.0
  129. }
  130. //=============================================================================
  131. static const TMemIf FastMemIf =
  132. {
  133.     Xm,
  134.     Rm,
  135.     Wm
  136. };
  137. //=============================================================================
  138. static const TMemIf DbgMemIf =
  139. {
  140.     DbgXm,
  141.     DbgRm,
  142.     DbgWm
  143. };
  144. //=============================================================================
  145.  
  146. TMainZ80 cpu(   0,
  147.                 BankNames,
  148.                 z80dbg::step,
  149.                 z80dbg::delta,
  150.                 z80dbg::SetLastT,
  151.                   membits,
  152.                   io_bits,              // [NS]
  153.                   bp_disable_bits,      // [NS]
  154.                 &FastMemIf,
  155.                 &DbgMemIf
  156.         );
  157.  
  158. //=============================================================================
  159.  
  160.  
  161. //=============================================================================
  162. #ifdef MOD_GSZ80
  163.     //-------------------------------------------------------------------------
  164.     namespace z80gs
  165.     {
  166.         //---------------------------------------------------------------------
  167.         u8 __fastcall dbgrm(u32 addr);
  168.         void __fastcall dbgwm(u32 addr, u8 val);
  169.         u8 *__fastcall MemDbg(u32 addr);
  170.         void __cdecl BankNames(int i, char *Name);
  171.         void Z80FAST step();
  172.         __int64 __cdecl delta();
  173.         void __cdecl SetLastT();
  174.         //---------------------------------------------------------------------
  175.           u8 membits[ 0x10000];
  176.           u8 io_bits[ 0x10000];         // [NS]
  177.           u8 bp_disable_bits[ 0x10000]; // [NS]
  178.  
  179.         SNDRENDER sound;
  180.         //---------------------------------------------------------------------
  181.         static const TMemIf FastMemIf =
  182.         {
  183.             z80gs::Xm,
  184.             z80gs::Rm,
  185.             z80gs::Wm
  186.         };
  187.         //---------------------------------------------------------------------
  188.         static const TMemIf DbgMemIf =
  189.         {
  190.             z80gs::DbgXm,
  191.             z80gs::DbgRm,
  192.             z80gs::DbgWm
  193.         };
  194.         //---------------------------------------------------------------------
  195.     } //namespace z80gs
  196.     //-------------------------------------------------------------------------
  197.     u8 TGsZ80::IntVec()
  198.     {
  199.         return 0xFF;
  200.     }
  201.     //-------------------------------------------------------------------------
  202.     void TGsZ80::CheckNextFrame()
  203.     {
  204.         if (t >= z80gs::GSCPUINT)
  205.         {
  206.             t -= z80gs::GSCPUINT;
  207.             eipos -= z80gs::GSCPUINT;
  208.             z80gs::gs_t_states += z80gs::GSCPUINT;
  209.             int_pend = true;
  210.         }
  211.     }
  212.     //-------------------------------------------------------------------------
  213.     TGsZ80 gscpu(      
  214.         1,
  215.         z80gs::BankNames,
  216.         z80gs::step,
  217.         z80gs::delta,
  218.         z80gs::SetLastT,
  219.           z80gs::membits,              
  220.           z80gs::io_bits,               // [NS]
  221.           z80gs::bp_disable_bits,       // [NS]
  222.         &z80gs::FastMemIf,
  223.         &z80gs::DbgMemIf
  224.     );
  225.     //-------------------------------------------------------------------------
  226. #endif
  227. //=============================================================================
  228.  
  229.  
  230. //=============================================================================
  231. TCpuMgr CpuMgr;
  232. //=============================================================================
  233. void TCpuMgr::SwitchCpu()
  234. {
  235.     CurrentCpu++;
  236.     CurrentCpu %= Count;
  237. }
  238. //=============================================================================
  239. Z80 *TCpuMgr::Cpus[] =
  240. {
  241. //-----------------------------------------------------------------------------
  242.     &cpu,
  243. //-----------------------------------------------------------------------------
  244. #ifdef MOD_GSZ80
  245.     &gscpu
  246. #endif
  247. //-----------------------------------------------------------------------------
  248. };
  249. //=============================================================================
  250.  
  251. const unsigned TCpuMgr::Count = _countof( Cpus);
  252. TZ80State TCpuMgr::PrevCpus[ TCpuMgr::Count];
  253. unsigned TCpuMgr::CurrentCpu = 0;
  254.  
  255. //=============================================================================
  256. #ifdef MOD_GSBASS
  257.     GSHLE gs;
  258. #endif
  259. //=============================================================================
  260. unsigned char dbgbreak = 0;
  261. //=============================================================================
  262. CONFIG conf;
  263. COMPUTER comp;
  264. TEMP temp;
  265. ATA_PORT hdd;   // not in `comp' - not cleared in reset()
  266. K_INPUT input;
  267. ISA_MODEM modem;
  268. //=============================================================================
  269. SNDRENDER sound;
  270. SNDCHIP ay[ 2];
  271. SNDCOUNTER sndcounter;
  272. //=============================================================================
  273.  
  274. unsigned char *base_sos_rom;
  275. unsigned char *base_dos_rom;
  276. unsigned char *base_128_rom;
  277. unsigned char *base_sys_rom;
  278.  
  279. //=============================================================================
  280. #ifdef CACHE_ALIGNED
  281.     ATTR_ALIGN( 4096)
  282.     unsigned char memory[ PAGE * MAX_PAGES];
  283. #else // __declspec(align) not available, force QWORD align with old method
  284.     __int64 memory__[PAGE * MAX_PAGES / sizeof( __int64)];
  285.     unsigned char * const memory = (unsigned char*) memory__;
  286. #endif
  287. //=============================================================================
  288. #ifdef MOD_VID_VD
  289.     CACHE_ALIGNED unsigned char vdmem[4][0x2000];
  290. #endif
  291. //=============================================================================
  292. unsigned char membits[ 0x10000];                // фы  сЁ ъют ш ьхьюЁш схэфр
  293. //      MEMBITS_R = 0x01
  294. //      MEMBITS_W = 0x02
  295. //      MEMBITS_X = 0x04
  296. //      MEMBITS_BPR = 0x10
  297. //      MEMBITS_BPW = 0x20
  298. //      MEMBITS_BPX = 0x40
  299. //              2 FREE
  300. //
  301. // Єъ Ёрё°шЁшЄ№ °шЁшэє membits-ют эхёъюы№ъю яЁюсыхьрЄшўэю ё Єюўъш чЁхэш  яюфтюфэ√ї уЁрсыхщ
  302. // Єю фы  эхфюёЄр■∙хую ЇєэъЎшюэрыр х∙х сєЇхЁр
  303. unsigned char io_bits[ 0x10000];                // фы  IO [NS]
  304. //      IO_BITS_IN
  305. //      IO_BITS_OUT
  306. //      IO_BITS_BP_IN
  307. //      IO_BITS_BP_OUT
  308. //              4 FREE
  309.  
  310. unsigned char bp_disable_bits[ 0x10000];        // фы  юЄъы■ўхэш  сЁ ъют [NS]
  311. //      BP_DISABLE_BPR
  312. //      BP_DISABLE_BPW
  313. //      BP_DISABLE_BPX
  314. //
  315. //      BP_DISABLE_BP_IN
  316. //      BP_DISABLE_BP_OUT
  317. //              3 FREE
  318.  
  319. unsigned char *bankr[ 4];
  320. unsigned char *bankw[ 4];
  321. unsigned char cmos[ 0x100];
  322. unsigned char nvram[ 0x800];
  323. //=============================================================================
  324. unsigned sndplaybuf[ PLAYBUFSIZE];
  325. unsigned spbsize;
  326. //=============================================================================
  327. FILE *savesnd;
  328. unsigned char savesndtype;      // 0-none,
  329.                                 // 1-wave,
  330.                                 // 2-vtx
  331. unsigned char *vtxbuf;
  332. unsigned vtxbufsize;
  333. unsigned vtxbuffilled;
  334. //=============================================================================
  335. unsigned char trdos_load;       // for leds
  336. unsigned char trdos_save;
  337. unsigned char trdos_format;
  338. unsigned char trdos_seek;
  339. //=============================================================================
  340. unsigned char needclr;                  // clear screenbuffer before rendering (фы  фхсрухЁр)
  341. //=============================================================================
  342. HWND wnd;
  343. HINSTANCE hIn;
  344. //=============================================================================
  345. char droppedFile[ 512];
  346. //=============================================================================
  347. const TMemModel mem_model[ N_MM_MODELS] =
  348. {
  349.     { "PENTAGON",               "PENTAGON",     MM_PENTAGON,    128,    RAM_128 | RAM_256 | RAM_512 | RAM_1024 },
  350.     { "ZS SCORPION",            "SCORPION",     MM_SCORP,       256,    RAM_256 | RAM_1024 },
  351.     { "ZS SCORPION + PROF ROM", "PROFSCORP",    MM_PROFSCORP,   256,    RAM_256 | RAM_1024 },
  352.     { "PROFI",                  "PROFI",        MM_PROFI,       1024,   RAM_1024 },
  353.     { "ATM-TURBO v4.50",        "ATM450",       MM_ATM450,      512,    RAM_512 | RAM_1024 },
  354.     { "ATM-TURBO 2+ v7.10",     "ATM710",       MM_ATM710,      1024,   RAM_128 | RAM_256 | RAM_512 | RAM_1024 },
  355. //  { "ATM-TURBO 3",            "ATM3",         MM_ATM3,        4096,   RAM_4096 },
  356. //  { "ZX-EVO",                 "ATM3",         MM_ATM3,        4096,   RAM_4096 },     // NEDOREPO
  357. //  { "PENTEVO",                "PENTEVO",      MM_ATM3,        4096,   RAM_4096 },     // [NS]
  358. //  { "ZX-Evolution",           "ZX_EVO",       MM_ATM3,        4096,   RAM_4096 },     // [NS] r0111
  359.     { "ZX-EVO",                 "ZX_EVO",       MM_ATM3,        4096,   RAM_4096 },     // [NS] r0111
  360.     { "Nemo's KAY",             "KAY",          MM_KAY,         256,    RAM_256 | RAM_1024 },
  361. //  { "KAY",                    "KAY",          MM_KAY,         256,    RAM_256 | RAM_1024 },
  362. //  { "ZX-Spectrum +3",         "PLUS3",        MM_PLUS3,       128,    RAM_128 },
  363.     { "ZX-SPECTRUM +3",         "PLUS3",        MM_PLUS3,       128,    RAM_128 },
  364.     { "QUORUM",                 "QUORUM",       MM_QUORUM,      1024,   RAM_128 | RAM_1024 },
  365. };
  366. //=============================================================================
  367. unsigned char kbdpc[ VK_MAX];                   // add cells for mouse & joystick
  368. unsigned char kbdpc_prev[ VK_MAX]; // static    // thims zxevo_ps/2 NEDOREPO
  369. unsigned char kbdpcEX[ 6];                      // Dexus
  370. keyports inports[ VK_MAX];
  371. //=============================================================================
  372. char statusline[ 128];
  373. unsigned statcnt;
  374. //=============================================================================
  375. char arcbuffer[ 0x2000];        // extensions and command lines for archivers
  376. char skiparc[ 0x400];           // ignore this files in archive
  377. //=============================================================================
  378. unsigned char exitflag = 0;     // avoid call exit() twice
  379. //=============================================================================
  380. // beta128 vars
  381. unsigned trd_toload = 0;        // drive to load
  382. unsigned DefaultDrive = -1U;    // ─шёъютюф яю єьюыўрэш■ т ъюЄюЁ√щ уЁєч Єё  юсЁрч√ фшёъют яЁш ёЄрЁЄх
  383.  
  384. char trd_loaded[ 4];            // used to get first free drive with no account of autoloaded images
  385. char ininame[ 0x200];
  386. char helpname[ 0x200];
  387. unsigned snapsize;
  388. //=============================================================================
  389. // conditional breakpoints support
  390. unsigned brk_port_in;
  391. unsigned brk_port_out;
  392. unsigned char brk_port_val;
  393. //=============================================================================
  394. virtkeyt pckeys[] =
  395. {
  396.     { "ESC",    DIK_ESCAPE },
  397.     { "F1",     DIK_F1 },
  398.     { "F2",     DIK_F2 },
  399.     { "F3",     DIK_F3 },
  400.     { "F4",     DIK_F4 },
  401.     { "F5",     DIK_F5 },
  402.     { "F6",     DIK_F6 },
  403.     { "F7",     DIK_F7 },
  404.     { "F8",     DIK_F8 },
  405.     { "F9",     DIK_F9 },
  406.     { "F10",    DIK_F10 },
  407.     { "F11",    DIK_F11 },
  408.     { "F12",    DIK_F12 },
  409.     { "PRSCR",  DIK_SYSRQ },
  410.     { "SCLOCK", DIK_SCROLL },
  411.     { "PAUSE",  DIK_PAUSE },
  412.  
  413.     { "1",      DIK_1 },
  414.     { "2",      DIK_2 },
  415.     { "3",      DIK_3 },
  416.     { "4",      DIK_4 },
  417.     { "5",      DIK_5 },
  418.     { "6",      DIK_6 },
  419.     { "7",      DIK_7 },
  420.     { "8",      DIK_8 },
  421.     { "9",      DIK_9 },
  422.     { "0",      DIK_0 },
  423.    
  424.     { "Q",      DIK_Q },
  425.     { "W",      DIK_W },
  426.     { "E",      DIK_E },
  427.     { "R",      DIK_R },
  428.     { "T",      DIK_T },
  429.     { "Y",      DIK_Y },
  430.     { "U",      DIK_U },
  431.     { "I",      DIK_I },
  432.     { "O",      DIK_O },
  433.     { "P",      DIK_P },
  434.    
  435.     { "A",      DIK_A },
  436.     { "S",      DIK_S },
  437.     { "D",      DIK_D },
  438.     { "F",      DIK_F },
  439.     { "G",      DIK_G },
  440.     { "H",      DIK_H },
  441.     { "J",      DIK_J },
  442.     { "K",      DIK_K },
  443.     { "L",      DIK_L },
  444.    
  445.     { "Z",      DIK_Z },
  446.     { "X",      DIK_X },
  447.     { "C",      DIK_C },
  448.     { "V",      DIK_V },
  449.     { "B",      DIK_B },
  450.     { "N",      DIK_N },
  451.     { "M",      DIK_M },
  452.  
  453.     { "MINUS",  DIK_MINUS },
  454.     { "PLUS",   DIK_EQUALS },
  455.     { "BACK",   DIK_BACK },
  456.     { "TAB",    DIK_TAB },
  457.     { "LB",     DIK_LBRACKET },
  458.     { "RB",     DIK_RBRACKET },
  459.     { "CAPS",   DIK_CAPITAL },
  460.     { "TIL",    DIK_GRAVE },
  461.     { "SPACE",  DIK_SPACE },
  462.     { "COL",    DIK_SEMICOLON },
  463.     { "QUOTE",  DIK_APOSTROPHE },
  464.     { "ENTER",  DIK_RETURN },
  465.     { "COMMA",  DIK_COMMA },
  466.     { "POINT",  DIK_PERIOD },
  467.     { "SLASH",  DIK_SLASH },
  468.     { "BACKSL", DIK_BACKSLASH },
  469.    
  470.     { "SHIFT",          DIK_SHIFT },
  471.     { "ALT",            DIK_MENU },
  472.     { "CONTROL",        DIK_CONTROL },
  473.     { "LSHIFT",         DIK_LSHIFT },
  474.     { "LALT",           DIK_LMENU },
  475.     { "LCONTROL",       DIK_LCONTROL },
  476.     { "RSHIFT",         DIK_RSHIFT },
  477.     { "RALT",           DIK_RMENU },
  478.     { "RCONTROL",       DIK_RCONTROL },
  479.  
  480.     { "INS",    DIK_INSERT },
  481.     { "HOME",   DIK_HOME },
  482.     { "PGUP",   DIK_PRIOR },
  483.     { "DEL",    DIK_DELETE },
  484.     { "END",    DIK_END },
  485.     { "PGDN",   DIK_NEXT },
  486.  
  487.     { "UP",     DIK_UP },
  488.     { "DOWN",   DIK_DOWN },
  489.     { "LEFT",   DIK_LEFT },
  490.     { "RIGHT",  DIK_RIGHT },
  491.  
  492.     { "NUMLOCK",        DIK_NUMLOCK },
  493.     { "GRDIV",          DIK_DIVIDE },
  494.     { "GRMUL",          DIK_MULTIPLY },
  495.     { "GRSUB",          DIK_SUBTRACT },
  496.     { "GRADD",          DIK_ADD },
  497.     { "GRENTER",        DIK_NUMPADENTER },
  498.  
  499.     { "N0",     DIK_NUMPAD0 },
  500.     { "N1",     DIK_NUMPAD1 },
  501.     { "N2",     DIK_NUMPAD2 },
  502.     { "N3",     DIK_NUMPAD3 },
  503.     { "N4",     DIK_NUMPAD4 },
  504.     { "N5",     DIK_NUMPAD5 },
  505.     { "N6",     DIK_NUMPAD6 },
  506.     { "N7",     DIK_NUMPAD7 },
  507.     { "N8",     DIK_NUMPAD8 },
  508.     { "N9",     DIK_NUMPAD9 },
  509.     { "NP",     DIK_DECIMAL },
  510.  
  511.     { "LMB",    VK_LMB },
  512.     { "RMB",    VK_RMB },
  513.     { "MMB",    VK_MMB },
  514.     { "MWU",    VK_MWU },
  515.     { "MWD",    VK_MWD },
  516.  
  517.     { "JLEFT",  VK_JLEFT },
  518.     { "JRIGHT", VK_JRIGHT },
  519.     { "JUP",    VK_JUP },
  520.     { "JDOWN",  VK_JDOWN },
  521.     { "JFIRE",  VK_JFIRE },
  522.     { "JB0",    VK_JB0 },
  523.     { "JB1",    VK_JB1 },
  524.     { "JB2",    VK_JB2 },
  525.     { "JB3",    VK_JB3 },
  526.     { "JB4",    VK_JB4 },
  527.     { "JB5",    VK_JB5 },
  528.     { "JB6",    VK_JB6 },
  529.     { "JB7",    VK_JB7 },
  530.     { "JB8",    VK_JB8 },
  531.     { "JB9",    VK_JB9 },
  532.     { "JB10",   VK_JB10 },
  533.     { "JB11",   VK_JB11 },
  534.     { "JB12",   VK_JB12 },
  535.     { "JB13",   VK_JB13 },
  536.     { "JB14",   VK_JB14 },
  537.     { "JB15",   VK_JB15 },
  538.     { "JB16",   VK_JB16 },
  539.     { "JB17",   VK_JB17 },
  540.     { "JB18",   VK_JB18 },
  541.     { "JB19",   VK_JB19 },
  542.     { "JB20",   VK_JB20 },
  543.     { "JB21",   VK_JB21 },
  544.     { "JB22",   VK_JB22 },
  545.     { "JB23",   VK_JB23 },
  546.     { "JB24",   VK_JB24 },
  547.     { "JB25",   VK_JB25 },
  548.     { "JB26",   VK_JB26 },
  549.     { "JB27",   VK_JB27 },
  550.     { "JB28",   VK_JB28 },
  551.     { "JB29",   VK_JB29 },
  552.     { "JB30",   VK_JB30 },
  553.     { "JB31",   VK_JB31 },
  554. };
  555. const size_t pckeys_count = _countof( pckeys);
  556. //=============================================================================
  557.  
  558. //=============================================================================
  559. static zxkey zxk_default[] =
  560. {
  561.     { "KRIGHT", &input.kjoy,    u8( ~1U)        },
  562.     { "KLEFT"&input.kjoy,    u8( ~2U)        },
  563.     { "KDOWN"&input.kjoy,    u8( ~4U)        },
  564.     { "KUP",    &input.kjoy,    u8( ~8U)        },
  565.     { "KFIRE"&input.kjoy,    u8( ~16U)       },
  566.     { "KFIRE1", &input.kjoy,    u8( ~16U)       },
  567.     { "KFIRE2", &input.kjoy,    u8( ~32U)       },
  568.     { "KFIRE3", &input.kjoy,    u8( ~64U)       },
  569.  
  570.     // fuller joystick
  571.     { "FRIGHT", &input.fjoy,    u8( ~8U)        },
  572.     { "FLEFT"&input.fjoy,    u8( ~4U)        },
  573.     { "FDOWN"&input.fjoy,    u8( ~2U)        },
  574.     { "FUP",    &input.fjoy,    u8( ~1U)        },
  575.     { "FFIRE"&input.fjoy,    u8( ~128U)      },
  576.     { "FFIRE1", &input.fjoy,    u8( ~128U)      },
  577.     { "FFIRE2", &input.fjoy,    u8( ~64U)       },
  578.     { "FFIRE3", &input.fjoy,    u8( ~32U)       },
  579.  
  580.     { "ENT",    input.kbd + 6,  u8( ~0x01U)     },
  581.     { "SPC",    input.kbd + 7,  u8( ~0x01U)     },
  582.     { "SYM",    input.kbd + 7,  u8( ~0x02U)     },
  583.  
  584.     { "CAP",    input.kbd + 0,  u8( ~0x01U)     },
  585.     { "Z",      input.kbd + 0,  u8( ~0x02U)     },
  586.     { "X",      input.kbd + 0,  u8( ~0x04U)     },
  587.     { "C",      input.kbd + 0,  u8( ~0x08U)     },
  588.     { "V",      input.kbd + 0,  u8( ~0x10U)     },
  589.  
  590.     { "A",      input.kbd + 1,  u8( ~0x01U)     },
  591.     { "S",      input.kbd + 1,  u8( ~0x02U)     },
  592.     { "D",      input.kbd + 1,  u8( ~0x04U)     },
  593.     { "F",      input.kbd + 1,  u8( ~0x08U)     },
  594.     { "G",      input.kbd + 1,  u8( ~0x10U)     },
  595.  
  596.     { "Q",      input.kbd + 2,  u8( ~0x01U)     },
  597.     { "W",      input.kbd + 2,  u8( ~0x02U)     },
  598.     { "E",      input.kbd + 2,  u8( ~0x04U)     },
  599.     { "R",      input.kbd + 2,  u8( ~0x08U)     },
  600.     { "T",      input.kbd + 2,  u8( ~0x10U)     },
  601.  
  602.     { "1",      input.kbd + 3,  u8( ~0x01U)     },
  603.     { "2",      input.kbd + 3,  u8( ~0x02U)     },
  604.     { "3",      input.kbd + 3,  u8( ~0x04U)     },
  605.     { "4",      input.kbd + 3,  u8( ~0x08U)     },
  606.     { "5",      input.kbd + 3,  u8( ~0x10U)     },
  607.  
  608.     { "0",      input.kbd + 4,  u8( ~0x01U)     },
  609.     { "9",      input.kbd + 4,  u8( ~0x02U)     },
  610.     { "8",      input.kbd + 4,  u8( ~0x04U)     },
  611.     { "7",      input.kbd + 4,  u8( ~0x08U)     },
  612.     { "6",      input.kbd + 4,  u8( ~0x10U)     },
  613.  
  614.     { "P",      input.kbd + 5,  u8( ~0x01U)     },
  615.     { "O",      input.kbd + 5,  u8( ~0x02U)     },
  616.     { "I",      input.kbd + 5,  u8( ~0x04U)     },
  617.     { "U",      input.kbd + 5,  u8( ~0x08U)     },
  618.     { "Y",      input.kbd + 5,  u8( ~0x10U)     },
  619.  
  620.     { "L",      input.kbd + 6,  u8( ~0x02U)     },
  621.     { "K",      input.kbd + 6,  u8( ~0x04U)     },
  622.     { "J",      input.kbd + 6,  u8( ~0x08U)     },
  623.     { "H",      input.kbd + 6,  u8( ~0x10U)     },
  624.  
  625.     { "M",      input.kbd + 7,  u8( ~0x04U)     },
  626.     { "N",      input.kbd + 7,  u8( ~0x08U)     },
  627.     { "B",      input.kbd + 7,  u8( ~0x10U)     },
  628. };
  629. //=============================================================================
  630.  
  631.  
  632. //=============================================================================
  633. static zxkey zxk_bk08[] =
  634. {
  635.     { "KRIGHT", &input.kjoy,    u8(~1U)         },
  636.     { "KLEFT"&input.kjoy,    u8(~2U)         },
  637.     { "KDOWN"&input.kjoy,    u8(~4U)         },
  638.     { "KUP",    &input.kjoy,    u8(~8U)         },
  639.     { "KFIRE"&input.kjoy,    u8(~16U)        },
  640.     { "KFIRE1", &input.kjoy,    u8(~16U)        },
  641.     { "KFIRE2", &input.kjoy,    u8(~32U)        },
  642.     { "KFIRE3", &input.kjoy,    u8(~64U)        },
  643.  
  644.     // fuller joystick
  645.     { "FRIGHT", &input.fjoy,    u8(~8U)         },
  646.     { "FLEFT"&input.fjoy,    u8(~4U)         },
  647.     { "FDOWN"&input.fjoy,    u8(~2U)         },
  648.     { "FUP",    &input.fjoy,    u8(~1U)         },
  649.     { "FFIRE"&input.fjoy,    u8(~128U)       },
  650.     { "FFIRE1", &input.fjoy,    u8(~128U)       },
  651.     { "FFIRE2", &input.fjoy,    u8(~64U)        },
  652.     { "FFIRE3", &input.fjoy,    u8(~32U)        },
  653.  
  654.     { "ALT",    input.kbd + 0,  u8(~0x01U)      },
  655.     { "Z",      input.kbd + 0,  u8(~0x02U)      },
  656.     { "X",      input.kbd + 0,  u8(~0x04U)      },
  657.     { "C",      input.kbd + 0,  u8(~0x08U)      },
  658.     { "V",      input.kbd + 0,  u8(~0x10U)      },
  659.     { "RUS",    input.kbd + 0,  u8(~0x20U)      },
  660.     { "SHF",    input.kbd + 0,  u8( 0x7FU)      },
  661.    
  662.     { "A",      input.kbd + 1,  u8(~0x01U)      },
  663.     { "S",      input.kbd + 1,  u8(~0x02U)      },
  664.     { "D",      input.kbd + 1,  u8(~0x04U)      },
  665.     { "F",      input.kbd + 1,  u8(~0x08U)      },
  666.     { "G",      input.kbd + 1,  u8(~0x10U)      },
  667.     { "BSL",    input.kbd + 1,  u8(~0x20U)      },
  668.     { "SL",     input.kbd + 1,  u8( 0x7FU)      },
  669.  
  670.     { "Q",      input.kbd + 2,  u8(~0x01U)      },
  671.     { "W",      input.kbd + 2,  u8(~0x02U)      },
  672.     { "E",      input.kbd + 2,  u8(~0x04U)      },
  673.     { "R",      input.kbd + 2,  u8(~0x08U)      },
  674.     { "T",      input.kbd + 2,  u8(~0x10U)      },
  675.     { "CMA",    input.kbd + 2,  u8(~0x20U)      },
  676.     { "PNT",    input.kbd + 2,  u8( 0x7FU)      },
  677.    
  678.     { "1",      input.kbd + 3,  u8(~0x01U)      },
  679.     { "2",      input.kbd + 3,  u8(~0x02U)      },
  680.     { "3",      input.kbd + 3,  u8(~0x04U)      },
  681.     { "4",      input.kbd + 3,  u8(~0x08U)      },
  682.     { "5",      input.kbd + 3,  u8(~0x10U)      },
  683.     { "TIL",    input.kbd + 3,  u8(~0x20U)      },
  684.     { "TAB",    input.kbd + 3,  u8( 0x7FU)      },
  685.                                        
  686.     { "0",      input.kbd + 4,  u8(~0x01U)      },
  687.     { "9",      input.kbd + 4,  u8(~0x02U)      },
  688.     { "8",      input.kbd + 4,  u8(~0x04U)      },
  689.     { "7",      input.kbd + 4,  u8(~0x08U)      },
  690.     { "6",      input.kbd + 4,  u8(~0x10U)      },
  691.     { "MNS",    input.kbd + 4,  u8(~0x20U)      },
  692.     { "PLS",    input.kbd + 4,  u8( 0x7FU)      },
  693.    
  694.     { "P",      input.kbd + 5,  u8(~0x01U)      },
  695.     { "O",      input.kbd + 5,  u8(~0x02U)      },
  696.     { "I",      input.kbd + 5,  u8(~0x04U)      },
  697.     { "U",      input.kbd + 5,  u8(~0x08U)      },
  698.     { "Y",      input.kbd + 5,  u8(~0x10U)      },
  699.     { "LB",     input.kbd + 5,  u8(~0x20U)      },
  700.     { "RB",     input.kbd + 5,  u8( 0x7FU)      },
  701.                                        
  702.     { "ENT",    input.kbd + 6,  u8(~0x01U)      },
  703.     { "L",      input.kbd + 6,  u8(~0x02U)      },
  704.     { "K",      input.kbd + 6,  u8(~0x04U)      },
  705.     { "J",      input.kbd + 6,  u8(~0x08U)      },
  706.     { "H",      input.kbd + 6,  u8(~0x10U)      },
  707.     { "COL",    input.kbd + 6,  u8(~0x20U)      },
  708.     { "QUO",    input.kbd + 6,  u8( 0x7FU)      },
  709.    
  710.     { "SPC",    input.kbd + 7,  u8(~0x01U)      },
  711.     { "CTL",    input.kbd + 7,  u8(~0x02U)      },
  712.     { "M",      input.kbd + 7,  u8(~0x04U)      },
  713.     { "N",      input.kbd + 7,  u8(~0x08U)      },
  714.     { "B",      input.kbd + 7,  u8(~0x10U)      },
  715.     { "R/A",    input.kbd + 7,  u8(~0x20U)      },
  716.     { "CPS",    input.kbd + 7,  u8( 0x7FU)      }
  717. };
  718. //=============================================================================
  719.  
  720.  
  721. //=============================================================================
  722. static zxkey zxk_quorum[] =
  723. {
  724.     { "KRIGHT", &input.kjoy,    u8(~1U)         },
  725.     { "KLEFT"&input.kjoy,    u8(~2U)         },
  726.     { "KDOWN"&input.kjoy,    u8(~4U)         },
  727.     { "KUP",    &input.kjoy,    u8(~8U)         },
  728.     { "KFIRE"&input.kjoy,    u8(~16U)        },
  729.     { "KFIRE1", &input.kjoy,    u8(~16U)        },
  730.     { "KFIRE2", &input.kjoy,    u8(~32U)        },
  731.     { "KFIRE3", &input.kjoy,    u8(~64U)        },
  732.  
  733.     // fuller joystick
  734.     { "FRIGHT", &input.fjoy,    u8(~8U)         },
  735.     { "FLEFT"&input.fjoy,    u8(~4U)         },
  736.     { "FDOWN"&input.fjoy,    u8(~2U)         },
  737.     { "FUP",    &input.fjoy,    u8(~1U)         },
  738.     { "FFIRE"&input.fjoy,    u8(~128U)       },
  739.     { "FFIRE1", &input.fjoy,    u8(~128U)       },
  740.     { "FFIRE2", &input.fjoy,    u8(~64U)        },
  741.     { "FFIRE3", &input.fjoy,    u8(~32U)        },
  742.  
  743.  
  744.     { "ENT",    input.kbd + 6,  u8(~0x01U)      },
  745.     { "SPC",    input.kbd + 7,  u8(~0x01U)      },
  746.     { "SYM",    input.kbd + 7,  u8(~0x02U)      },
  747.  
  748.     { "CAP",    input.kbd + 0,  u8(~0x01U)      },
  749.     { "Z",      input.kbd + 0,  u8(~0x02U)      },
  750.     { "X",      input.kbd + 0,  u8(~0x04U)      },
  751.     { "C",      input.kbd + 0,  u8(~0x08U)      },
  752.     { "V",      input.kbd + 0,  u8(~0x10U)      },
  753.                                        
  754.     { "A",      input.kbd + 1,  u8(~0x01U)      },
  755.     { "S",      input.kbd + 1,  u8(~0x02U)      },
  756.     { "D",      input.kbd + 1,  u8(~0x04U)      },
  757.     { "F",      input.kbd + 1,  u8(~0x08U)      },
  758.     { "G",      input.kbd + 1,  u8(~0x10U)      },
  759.                                        
  760.     { "Q",      input.kbd + 2,  u8(~0x01U)      },
  761.     { "W",      input.kbd + 2,  u8(~0x02U)      },
  762.     { "E",      input.kbd + 2,  u8(~0x04U)      },
  763.     { "R",      input.kbd + 2,  u8(~0x08U)      },
  764.     { "T",      input.kbd + 2,  u8(~0x10U)      },
  765.        
  766.     { "1",      input.kbd + 3,  u8(~0x01U)      },
  767.     { "2",      input.kbd + 3,  u8(~0x02U)      },
  768.     { "3",      input.kbd + 3,  u8(~0x04U)      },
  769.     { "4",      input.kbd + 3,  u8(~0x08U)      },
  770.     { "5",      input.kbd + 3,  u8(~0x10U)      },
  771.                                        
  772.     { "0",      input.kbd + 4,  u8(~0x01U)      },
  773.     { "9",      input.kbd + 4,  u8(~0x02U)      },
  774.     { "8",      input.kbd + 4,  u8(~0x04U)      },
  775.     { "7",      input.kbd + 4,  u8(~0x08U)      },
  776.     { "6",      input.kbd + 4,  u8(~0x10U)      },
  777.                                        
  778.     { "P",      input.kbd + 5,  u8(~0x01U)      },
  779.     { "O",      input.kbd + 5,  u8(~0x02U)      },
  780.     { "I",      input.kbd + 5,  u8(~0x04U)      },
  781.     { "U",      input.kbd + 5,  u8(~0x08U)      },
  782.     { "Y",      input.kbd + 5,  u8(~0x10U)      },
  783.    
  784.     { "L",      input.kbd + 6,  u8(~0x02U)      },
  785.     { "K",      input.kbd + 6,  u8(~0x04U)      },
  786.     { "J",      input.kbd + 6,  u8(~0x08U)      },
  787.     { "H",      input.kbd + 6,  u8(~0x10U)      },
  788.                                        
  789.     { "M",      input.kbd + 7,  u8(~0x04U)      },
  790.     { "N",      input.kbd + 7,  u8(~0x08U)      },
  791.     { "B",      input.kbd + 7,  u8(~0x10U)      },
  792.  
  793.     // quorum additional keys
  794.     { "RUS",    input.kbd + 8,  u8(~0x01U)      },
  795.     { "LAT",    input.kbd + 8,  u8(~0x02U)      },
  796.     { "N1",     input.kbd + 8,  u8(~0x08U)      },
  797.     { "N2",     input.kbd + 8,  u8(~0x10U)      },
  798.     { ".",      input.kbd + 8,  u8(~0x20U)      },
  799.                                        
  800.     { "CAPS",   input.kbd + 9,  u8(~0x01U)      },
  801.     { "F2",     input.kbd + 9,  u8(~0x02U)      },
  802.     { "TILDA",  input.kbd + 9,  u8(~0x04U)      },
  803.     { "N4",     input.kbd + 9,  u8(~0x08U)      },
  804.     { "QUOTE",  input.kbd + 9,  u8(~0x10U)      },
  805.     { "N6",     input.kbd + 9,  u8(~0x20U)      },
  806.                            
  807.     { "TAB",    input.kbd + 10, u8(~0x01U)      },
  808.     { "F4",     input.kbd + 10, u8(~0x02U)      },
  809.     { "N7",     input.kbd + 10, u8(~0x08U)      },
  810.     { "N5",     input.kbd + 10, u8(~0x10U)      },
  811.     { "N9",     input.kbd + 10, u8(~0x20U)      },
  812.    
  813.     { "EBOX",   input.kbd + 11, u8(~0x01U)      },
  814.     { "F5",     input.kbd + 11, u8(~0x02U)      },
  815.     { "BS",     input.kbd + 11, u8(~0x04U)      },
  816.     { "NSLASH", input.kbd + 11, u8(~0x08U)      },
  817.     { "N8",     input.kbd + 11, u8(~0x10U)      },
  818.     { "NMINUS", input.kbd + 11, u8(~0x20U)      },
  819.  
  820.     { "-",      input.kbd + 12, u8(~0x01U)      },
  821.     { "+",      input.kbd + 12, u8(~0x04U)      },
  822.     { "DEL",    input.kbd + 12, u8(~0x08U)      },
  823.     { "NSTAR",  input.kbd + 12, u8(~0x10U)      },
  824.     { "GBOX",   input.kbd + 12, u8(~0x20U)      },
  825.                            
  826.     { "COLON",  input.kbd + 13, u8(~0x01U)      },
  827.     { "F3",     input.kbd + 13, u8(~0x02U)      },
  828.     { "\\",     input.kbd + 13, u8(~0x04U)      },
  829.     { "]",      input.kbd + 13, u8(~0x10U)      },
  830.     { "[",      input.kbd + 13, u8(~0x20U)      },
  831.  
  832.     { ",",      input.kbd + 14, u8(~0x01U)      },
  833.     { "/",      input.kbd + 14, u8(~0x10U)      },
  834.     { "N3",     input.kbd + 14, u8(~0x20U)      },
  835.                            
  836.     { "F1",     input.kbd + 15, u8(~0x02U)      },
  837.     { "N0",     input.kbd + 15, u8(~0x08U)      },
  838.     { "NPOINT", input.kbd + 15, u8(~0x10U)      },
  839.     { "NPLUS",  input.kbd + 15, u8(~0x20U)      },
  840. };
  841. //=============================================================================
  842.  
  843.  
  844. //=============================================================================
  845. zxkeymap zxk_maps[] =
  846. {
  847.     { "default",        zxk_default,    _countof(zxk_default)   },
  848.     { "BK08",           zxk_bk08,       _countof(zxk_bk08)      },
  849.     { "quorum",         zxk_quorum,     _countof(zxk_quorum)    },
  850. };
  851. //=============================================================================
  852.  
  853. //=============================================================================
  854. const size_t zxk_maps_count = _countof(zxk_maps);
  855. //=============================================================================
  856.  
  857. PALETTEENTRY syspalette[0x100];
  858.  
  859. //=============================================================================
  860. GDIBMP gdibmp =
  861. { { {  
  862.         sizeof(BITMAPINFOHEADER),
  863.         320,
  864.         -240,
  865.         1,
  866.         8,
  867.         BI_RGB,
  868.         0
  869. } } };
  870. //-----------------------------------------------------------------------------
  871. // юЄфхы№э√щ фы  фхсрухЁр                                               // [NS]
  872. GDIBMP gdi_dbg_bmp =
  873. { { {
  874.         sizeof(BITMAPINFOHEADER),
  875.         320,
  876.         -240,
  877.         1,
  878.         8,
  879.         BI_RGB,
  880.         0
  881. } } };
  882. //=============================================================================
  883. PALETTE_OPTIONS pals[32] =
  884. {{
  885.         "default",
  886.         0x00,
  887.         0x80,
  888.         0xC0,
  889.         0xE0,
  890.         0xFF,
  891.         0xC8,
  892.         0xFF,
  893.         0x00,
  894.         0x00,
  895.         0x00,
  896.         0xFF,
  897.         0x00,
  898.         0x00,
  899.         0x00,
  900.         0xFF
  901. }};
  902. //=============================================================================
  903. #pragma pack()
  904.  
  905. unsigned char snbuf[ 4 * 1048576];      //4MB   // large temporary buffer (for reading snapshots)
  906. //-----------------------------------------------------------------------------
  907. unsigned char gdibuf[ 2 * 1048576];     //2MB
  908. //ётющ сєЇхЁ фы  фхсрухЁр
  909. unsigned char gdi_dbg_buf[ 2 * 1048576]; //2MB  // [NS]
  910. //-----------------------------------------------------------------------------
  911. // on-screen watches block
  912. uintptr_t watch_script[4][64];
  913. unsigned char watch_enabled[4];
  914. unsigned char used_banks[ MAX_PAGES];
  915. unsigned char trace_rom=1, trace_ram=1;
  916. //-----------------------------------------------------------------------------
  917. DWORD WinVerMajor;
  918. DWORD WinVerMinor;
  919. HWND dlg;               // used in setcheck/getcheck: gui settings, monitor dialogs
  920. //-----------------------------------------------------------------------------
  921. HBITMAP hbm;            // bitmap for repaint background
  922. DWORD bm_dx;
  923. DWORD bm_dy;
  924. //-----------------------------------------------------------------------------
  925. DWORD mousepos;         // left-clicked point in monitor
  926.                         // 0x80000000 шёяюы№чєхЄёю ъръшьш Єю є°ыхяърьш
  927.                         // ъръ right click Їыру
  928.                         // эєцэю чрьхэшЄ№ эр debug_mouse_keys тхчфх
  929.                         // шыш эр 32╩ ьюэшЄюЁх сєфхЄ ╬щ
  930.  
  931. DWORD debug_mouse_keys;
  932.  
  933. //#define DEBUG_MOUSE_LEFT_RES  0xFFFFFFF0      //     
  934. //#define DEBUG_MOUSE_LEFT_ON   0x00000001      // left on              [NS]
  935. //#define DEBUG_MOUSE_LEFT_DBL  0x00000002      // left double
  936. //#define DEBUG_MOUSE_LEFT_OFF  0x00000004      // left off
  937. //                              0x00000008      //      
  938. //#define DEBUG_MOUSE_RIGHT_RES 0xFFFFFF0F      //     
  939. //#define DEBUG_MOUSE_RIGHT_ON  0x00000010      // right on
  940. //#define DEBUG_MOUSE_RIGHT_DBL 0x00000020      // right double
  941. //#define DEBUG_MOUSE_RIGHT_OFF 0x00000040      // right off
  942. //                              0x00000080      //
  943. //#define DEBUG_MOUSE_MIDDLE_RES 0xFFFFF0FF     //     
  944. //#define DEBUG_MOUSE_MIDDLE_ON  0x00000100     // middle on
  945. //#define DEBUG_MOUSE_MIDDLE_DBL 0x00000200     // middle double
  946. //#define DEBUG_MOUSE_MIDDLE_OFF 0x00000400     // middle off
  947. //                               0x00000800
  948.  
  949. //-----------------------------------------------------------------------------
  950. unsigned nowait;        // don't close console window after error if started from GUI
  951. bool normal_exit = false; // true on correct exit, false on failure exit
  952. //-----------------------------------------------------------------------------
  953. char *ayvols[64];
  954. unsigned num_ayvols;
  955. //-----------------------------------------------------------------------------
  956. char *aystereo[64];
  957. unsigned num_aystereo;
  958. //-----------------------------------------------------------------------------
  959. char *ulapreset[64];
  960. unsigned num_ula;
  961. //-----------------------------------------------------------------------------
  962. static char presetbuf[0x4000];
  963. char *setptr = presetbuf;
  964. //-----------------------------------------------------------------------------
  965. /*
  966. #include "fontdata.cpp"
  967. #include "font8.cpp"
  968. #include "font14.cpp"
  969. #include "font16.cpp"
  970. #include "fontatm2.cpp"
  971. */
  972. //=============================================================================
  973. // ╧юЁ фюъ ёЄЁюъ т ¤Єюь ьрёёштх фюыцхэ ёююЄтхЄёЄтютрЄ№ enum AY_SCHEME
  974. const char * const ay_schemes[] =
  975. {
  976.     "no soundchip",
  977.     "fuller box",
  978.     "single chip",
  979.     "pseudo-turbo",
  980.     "quadro-AY",
  981.     "turbo-AY // POS",
  982.     "turbo-sound // NedoPC"
  983. };
  984. //=============================================================================
  985.  
  986. int trdos_in_nmi = 0;           //NEDOREPO
  987.  
  988. //=============================================================================
  989.  
  990.